From 66e7ee00c296947668a4a43e0dda3da349c56b76 Mon Sep 17 00:00:00 2001 From: Omar Vides Date: Mon, 16 Mar 2015 21:28:38 -0600 Subject: [PATCH 1/5] First assignement --- lib/index.js | 23 + node_modules/hapi/.npmignore | 15 + node_modules/hapi/.travis.yml | 6 + node_modules/hapi/API.md | 3423 ++++++ node_modules/hapi/CHANGELOG.md | 1105 ++ node_modules/hapi/CONTRIBUTING.md | 14 + node_modules/hapi/LICENSE | 31 + node_modules/hapi/Makefile | 10 + node_modules/hapi/README.md | 15 + node_modules/hapi/images/hapi.png | Bin 0 -> 42010 bytes node_modules/hapi/index.js | 1 + node_modules/hapi/lib/auth.js | 394 + node_modules/hapi/lib/connection.js | 404 + node_modules/hapi/lib/defaults.js | 106 + node_modules/hapi/lib/handler.js | 315 + node_modules/hapi/lib/index.js | 11 + node_modules/hapi/lib/methods.js | 201 + node_modules/hapi/lib/plugin.js | 451 + node_modules/hapi/lib/protect.js | 64 + node_modules/hapi/lib/reply.js | 165 + node_modules/hapi/lib/request.js | 516 + node_modules/hapi/lib/response.js | 586 + node_modules/hapi/lib/route.js | 448 + node_modules/hapi/lib/schema.js | 281 + node_modules/hapi/lib/server.js | 226 + node_modules/hapi/lib/transmit.js | 554 + node_modules/hapi/lib/validation.js | 220 + .../hapi/node_modules/accept/.npmignore | 18 + .../hapi/node_modules/accept/.travis.yml | 5 + .../hapi/node_modules/accept/CONTRIBUTING.md | 16 + node_modules/hapi/node_modules/accept/LICENSE | 30 + .../hapi/node_modules/accept/Makefile | 8 + .../hapi/node_modules/accept/README.md | 7 + .../hapi/node_modules/accept/index.js | 1 + .../hapi/node_modules/accept/lib/index.js | 147 + .../hapi/node_modules/accept/package.json | 46 + .../hapi/node_modules/accept/test/index.js | 166 + .../hapi/node_modules/ammo/.npmignore | 18 + .../hapi/node_modules/ammo/.travis.yml | 5 + .../hapi/node_modules/ammo/CONTRIBUTING.md | 16 + node_modules/hapi/node_modules/ammo/LICENSE | 28 + node_modules/hapi/node_modules/ammo/Makefile | 8 + node_modules/hapi/node_modules/ammo/README.md | 7 + node_modules/hapi/node_modules/ammo/index.js | 1 + .../hapi/node_modules/ammo/lib/index.js | 121 + .../hapi/node_modules/ammo/package.json | 47 + .../hapi/node_modules/ammo/test/index.js | 145 + .../hapi/node_modules/boom/.npmignore | 18 + .../hapi/node_modules/boom/.travis.yml | 5 + .../hapi/node_modules/boom/CONTRIBUTING.md | 1 + node_modules/hapi/node_modules/boom/LICENSE | 28 + node_modules/hapi/node_modules/boom/Makefile | 9 + node_modules/hapi/node_modules/boom/README.md | 575 + .../hapi/node_modules/boom/images/boom.png | Bin 0 -> 29479 bytes node_modules/hapi/node_modules/boom/index.js | 1 + .../hapi/node_modules/boom/lib/index.js | 292 + .../hapi/node_modules/boom/package.json | 44 + .../hapi/node_modules/boom/test/index.js | 592 + .../hapi/node_modules/call/.npmignore | 18 + .../hapi/node_modules/call/.travis.yml | 5 + .../hapi/node_modules/call/CONTRIBUTING.md | 16 + node_modules/hapi/node_modules/call/LICENSE | 28 + node_modules/hapi/node_modules/call/Makefile | 8 + node_modules/hapi/node_modules/call/README.md | 7 + node_modules/hapi/node_modules/call/index.js | 1 + .../hapi/node_modules/call/lib/index.js | 360 + .../hapi/node_modules/call/lib/regex.js | 50 + .../hapi/node_modules/call/lib/segment.js | 247 + .../hapi/node_modules/call/package.json | 45 + .../hapi/node_modules/call/test/index.js | 814 ++ .../hapi/node_modules/call/test/regex.js | 102 + .../node_modules/catbox-memory/.npmignore | 18 + .../node_modules/catbox-memory/.travis.yml | 4 + .../catbox-memory/CONTRIBUTING.md | 1 + .../hapi/node_modules/catbox-memory/LICENSE | 28 + .../hapi/node_modules/catbox-memory/Makefile | 9 + .../hapi/node_modules/catbox-memory/README.md | 20 + .../hapi/node_modules/catbox-memory/index.js | 1 + .../node_modules/catbox-memory/lib/index.js | 226 + .../node_modules/catbox-memory/package.json | 46 + .../node_modules/catbox-memory/test/index.js | 776 ++ .../hapi/node_modules/catbox/.npmignore | 18 + .../hapi/node_modules/catbox/.travis.yml | 6 + .../hapi/node_modules/catbox/CONTRIBUTING.md | 1 + node_modules/hapi/node_modules/catbox/LICENSE | 28 + .../hapi/node_modules/catbox/Makefile | 9 + .../hapi/node_modules/catbox/README.md | 136 + .../node_modules/catbox/examples/policy.js | 64 + .../node_modules/catbox/images/catbox.png | Bin 0 -> 48752 bytes .../hapi/node_modules/catbox/index.js | 1 + .../hapi/node_modules/catbox/lib/client.js | 147 + .../hapi/node_modules/catbox/lib/index.js | 13 + .../hapi/node_modules/catbox/lib/policy.js | 352 + .../hapi/node_modules/catbox/package.json | 45 + .../hapi/node_modules/catbox/test/client.js | 393 + .../hapi/node_modules/catbox/test/import.js | 151 + .../hapi/node_modules/catbox/test/index.js | 308 + .../hapi/node_modules/catbox/test/policy.js | 1861 ++++ .../hapi/node_modules/cryptiles/.npmignore | 18 + .../hapi/node_modules/cryptiles/.travis.yml | 5 + .../hapi/node_modules/cryptiles/LICENSE | 28 + .../hapi/node_modules/cryptiles/Makefile | 9 + .../hapi/node_modules/cryptiles/README.md | 14 + .../hapi/node_modules/cryptiles/index.js | 1 + .../hapi/node_modules/cryptiles/lib/index.js | 68 + .../hapi/node_modules/cryptiles/package.json | 50 + .../hapi/node_modules/cryptiles/test/index.js | 108 + .../hapi/node_modules/h2o2/.npmignore | 18 + .../hapi/node_modules/h2o2/.travis.yml | 5 + .../hapi/node_modules/h2o2/CONTRIBUTING.md | 16 + node_modules/hapi/node_modules/h2o2/LICENSE | 28 + node_modules/hapi/node_modules/h2o2/Makefile | 8 + node_modules/hapi/node_modules/h2o2/README.md | 7 + node_modules/hapi/node_modules/h2o2/index.js | 1 + .../hapi/node_modules/h2o2/lib/index.js | 243 + .../h2o2/node_modules/joi/.npmignore | 20 + .../h2o2/node_modules/joi/.travis.yml | 22 + .../h2o2/node_modules/joi/CONTRIBUTING.md | 14 + .../h2o2/node_modules/joi/LICENSE | 28 + .../h2o2/node_modules/joi/README.md | 1240 +++ .../joi/examples/conditionalRequire.js | 43 + .../joi/examples/customMessage.js | 22 + .../node_modules/joi/examples/multipleWhen.js | 17 + .../h2o2/node_modules/joi/images/joi.png | Bin 0 -> 30662 bytes .../node_modules/joi/images/validation.png | Bin 0 -> 117266 bytes .../h2o2/node_modules/joi/index.js | 1 + .../h2o2/node_modules/joi/lib/alternatives.js | 145 + .../h2o2/node_modules/joi/lib/any.js | 704 ++ .../h2o2/node_modules/joi/lib/array.js | 288 + .../h2o2/node_modules/joi/lib/binary.js | 98 + .../h2o2/node_modules/joi/lib/boolean.js | 41 + .../h2o2/node_modules/joi/lib/cast.js | 74 + .../h2o2/node_modules/joi/lib/date.js | 168 + .../h2o2/node_modules/joi/lib/errors.js | 159 + .../h2o2/node_modules/joi/lib/function.js | 31 + .../h2o2/node_modules/joi/lib/index.js | 129 + .../h2o2/node_modules/joi/lib/language.js | 106 + .../h2o2/node_modules/joi/lib/number.js | 170 + .../h2o2/node_modules/joi/lib/object.js | 685 ++ .../h2o2/node_modules/joi/lib/ref.js | 51 + .../h2o2/node_modules/joi/lib/string.js | 282 + .../joi/node_modules/isemail/.npmignore | 2 + .../joi/node_modules/isemail/.travis.yml | 8 + .../joi/node_modules/isemail/LICENSE | 11 + .../joi/node_modules/isemail/Makefile | 4 + .../joi/node_modules/isemail/README.md | 92 + .../joi/node_modules/isemail/dns-no-mx.js | 80 + .../joi/node_modules/isemail/index.js | 1 + .../joi/node_modules/isemail/lib/isemail.js | 1279 +++ .../joi/node_modules/isemail/package.json | 52 + .../joi/node_modules/isemail/test/isemail.js | 279 + .../joi/node_modules/isemail/test/mocha.opts | 2 + .../joi/node_modules/moment/LICENSE | 22 + .../joi/node_modules/moment/README.md | 39 + .../joi/node_modules/moment/ender.js | 1 + .../joi/node_modules/moment/locale/af.js | 71 + .../joi/node_modules/moment/locale/ar-ma.js | 57 + .../joi/node_modules/moment/locale/ar-sa.js | 101 + .../joi/node_modules/moment/locale/ar-tn.js | 55 + .../joi/node_modules/moment/locale/ar.js | 134 + .../joi/node_modules/moment/locale/az.js | 107 + .../joi/node_modules/moment/locale/be.js | 154 + .../joi/node_modules/moment/locale/bg.js | 88 + .../joi/node_modules/moment/locale/bn.js | 111 + .../joi/node_modules/moment/locale/bo.js | 108 + .../joi/node_modules/moment/locale/br.js | 109 + .../joi/node_modules/moment/locale/bs.js | 140 + .../joi/node_modules/moment/locale/ca.js | 77 + .../joi/node_modules/moment/locale/cs.js | 157 + .../joi/node_modules/moment/locale/cv.js | 61 + .../joi/node_modules/moment/locale/cy.js | 79 + .../joi/node_modules/moment/locale/da.js | 58 + .../joi/node_modules/moment/locale/de-at.js | 74 + .../joi/node_modules/moment/locale/de.js | 73 + .../joi/node_modules/moment/locale/el.js | 94 + .../joi/node_modules/moment/locale/en-au.js | 64 + .../joi/node_modules/moment/locale/en-ca.js | 61 + .../joi/node_modules/moment/locale/en-gb.js | 65 + .../joi/node_modules/moment/locale/eo.js | 71 + .../joi/node_modules/moment/locale/es.js | 77 + .../joi/node_modules/moment/locale/et.js | 78 + .../joi/node_modules/moment/locale/eu.js | 62 + .../joi/node_modules/moment/locale/fa.js | 103 + .../joi/node_modules/moment/locale/fi.js | 107 + .../joi/node_modules/moment/locale/fo.js | 58 + .../joi/node_modules/moment/locale/fr-ca.js | 56 + .../joi/node_modules/moment/locale/fr.js | 60 + .../joi/node_modules/moment/locale/fy.js | 69 + .../joi/node_modules/moment/locale/gl.js | 73 + .../joi/node_modules/moment/locale/he.js | 80 + .../joi/node_modules/moment/locale/hi.js | 121 + .../joi/node_modules/moment/locale/hr.js | 141 + .../joi/node_modules/moment/locale/hu.js | 111 + .../joi/node_modules/moment/locale/hy-am.js | 118 + .../joi/node_modules/moment/locale/id.js | 81 + .../joi/node_modules/moment/locale/is.js | 126 + .../joi/node_modules/moment/locale/it.js | 68 + .../joi/node_modules/moment/locale/ja.js | 63 + .../joi/node_modules/moment/locale/ka.js | 109 + .../joi/node_modules/moment/locale/km.js | 56 + .../joi/node_modules/moment/locale/ko.js | 65 + .../joi/node_modules/moment/locale/lb.js | 139 + .../joi/node_modules/moment/locale/lt.js | 120 + .../joi/node_modules/moment/locale/lv.js | 79 + .../joi/node_modules/moment/locale/mk.js | 88 + .../joi/node_modules/moment/locale/ml.js | 69 + .../joi/node_modules/moment/locale/mr.js | 120 + .../joi/node_modules/moment/locale/ms-my.js | 80 + .../joi/node_modules/moment/locale/my.js | 89 + .../joi/node_modules/moment/locale/nb.js | 59 + .../joi/node_modules/moment/locale/ne.js | 121 + .../joi/node_modules/moment/locale/nl.js | 69 + .../joi/node_modules/moment/locale/nn.js | 58 + .../joi/node_modules/moment/locale/pl.js | 100 + .../joi/node_modules/moment/locale/pt-br.js | 58 + .../joi/node_modules/moment/locale/pt.js | 62 + .../joi/node_modules/moment/locale/ro.js | 73 + .../joi/node_modules/moment/locale/ru.js | 176 + .../joi/node_modules/moment/locale/sk.js | 158 + .../joi/node_modules/moment/locale/sl.js | 146 + .../joi/node_modules/moment/locale/sq.js | 67 + .../joi/node_modules/moment/locale/sr-cyrl.js | 107 + .../joi/node_modules/moment/locale/sr.js | 107 + .../joi/node_modules/moment/locale/sv.js | 65 + .../joi/node_modules/moment/locale/ta.js | 130 + .../joi/node_modules/moment/locale/th.js | 63 + .../joi/node_modules/moment/locale/tl-ph.js | 60 + .../joi/node_modules/moment/locale/tr.js | 94 + .../node_modules/moment/locale/tzm-latn.js | 56 + .../joi/node_modules/moment/locale/tzm.js | 56 + .../joi/node_modules/moment/locale/uk.js | 163 + .../joi/node_modules/moment/locale/uz.js | 56 + .../joi/node_modules/moment/locale/vi.js | 64 + .../joi/node_modules/moment/locale/zh-cn.js | 125 + .../joi/node_modules/moment/locale/zh-tw.js | 99 + .../joi/node_modules/moment/min/locales.js | 7306 ++++++++++++ .../node_modules/moment/min/locales.min.js | 4 + .../moment/min/moment-with-locales.js | 9792 +++++++++++++++++ .../moment/min/moment-with-locales.min.js | 10 + .../joi/node_modules/moment/min/moment.min.js | 7 + .../joi/node_modules/moment/moment.js | 3043 +++++ .../joi/node_modules/moment/package.js | 11 + .../joi/node_modules/moment/package.json | 121 + .../h2o2/node_modules/joi/package.json | 44 + .../node_modules/joi/test/alternatives.js | 454 + .../h2o2/node_modules/joi/test/any.js | 960 ++ .../h2o2/node_modules/joi/test/array.js | 593 + .../h2o2/node_modules/joi/test/binary.js | 194 + .../h2o2/node_modules/joi/test/boolean.js | 132 + .../h2o2/node_modules/joi/test/date.js | 291 + .../h2o2/node_modules/joi/test/errors.js | 270 + .../h2o2/node_modules/joi/test/function.js | 34 + .../h2o2/node_modules/joi/test/helper.js | 70 + .../h2o2/node_modules/joi/test/index.js | 1472 +++ .../h2o2/node_modules/joi/test/number.js | 589 + .../h2o2/node_modules/joi/test/object.js | 1058 ++ .../h2o2/node_modules/joi/test/ref.js | 389 + .../h2o2/node_modules/joi/test/string.js | 1797 +++ .../hapi/node_modules/h2o2/package.json | 51 + .../hapi/node_modules/h2o2/test/index.js | 1573 +++ .../hapi/node_modules/heavy/.npmignore | 18 + .../hapi/node_modules/heavy/.travis.yml | 5 + .../hapi/node_modules/heavy/CONTRIBUTING.md | 16 + node_modules/hapi/node_modules/heavy/LICENSE | 28 + node_modules/hapi/node_modules/heavy/Makefile | 8 + .../hapi/node_modules/heavy/README.md | 7 + node_modules/hapi/node_modules/heavy/index.js | 1 + .../hapi/node_modules/heavy/lib/index.js | 144 + .../heavy/node_modules/joi/.npmignore | 20 + .../heavy/node_modules/joi/.travis.yml | 22 + .../heavy/node_modules/joi/CONTRIBUTING.md | 14 + .../heavy/node_modules/joi/LICENSE | 28 + .../heavy/node_modules/joi/README.md | 1240 +++ .../joi/examples/conditionalRequire.js | 43 + .../joi/examples/customMessage.js | 22 + .../node_modules/joi/examples/multipleWhen.js | 17 + .../heavy/node_modules/joi/images/joi.png | Bin 0 -> 30662 bytes .../node_modules/joi/images/validation.png | Bin 0 -> 117266 bytes .../heavy/node_modules/joi/index.js | 1 + .../node_modules/joi/lib/alternatives.js | 145 + .../heavy/node_modules/joi/lib/any.js | 704 ++ .../heavy/node_modules/joi/lib/array.js | 288 + .../heavy/node_modules/joi/lib/binary.js | 98 + .../heavy/node_modules/joi/lib/boolean.js | 41 + .../heavy/node_modules/joi/lib/cast.js | 74 + .../heavy/node_modules/joi/lib/date.js | 168 + .../heavy/node_modules/joi/lib/errors.js | 159 + .../heavy/node_modules/joi/lib/function.js | 31 + .../heavy/node_modules/joi/lib/index.js | 129 + .../heavy/node_modules/joi/lib/language.js | 106 + .../heavy/node_modules/joi/lib/number.js | 170 + .../heavy/node_modules/joi/lib/object.js | 685 ++ .../heavy/node_modules/joi/lib/ref.js | 51 + .../heavy/node_modules/joi/lib/string.js | 282 + .../joi/node_modules/isemail/.npmignore | 2 + .../joi/node_modules/isemail/.travis.yml | 8 + .../joi/node_modules/isemail/LICENSE | 11 + .../joi/node_modules/isemail/Makefile | 4 + .../joi/node_modules/isemail/README.md | 92 + .../joi/node_modules/isemail/dns-no-mx.js | 80 + .../joi/node_modules/isemail/index.js | 1 + .../joi/node_modules/isemail/lib/isemail.js | 1279 +++ .../joi/node_modules/isemail/package.json | 52 + .../joi/node_modules/isemail/test/isemail.js | 279 + .../joi/node_modules/isemail/test/mocha.opts | 2 + .../joi/node_modules/moment/LICENSE | 22 + .../joi/node_modules/moment/README.md | 39 + .../joi/node_modules/moment/ender.js | 1 + .../joi/node_modules/moment/locale/af.js | 71 + .../joi/node_modules/moment/locale/ar-ma.js | 57 + .../joi/node_modules/moment/locale/ar-sa.js | 101 + .../joi/node_modules/moment/locale/ar-tn.js | 55 + .../joi/node_modules/moment/locale/ar.js | 134 + .../joi/node_modules/moment/locale/az.js | 107 + .../joi/node_modules/moment/locale/be.js | 154 + .../joi/node_modules/moment/locale/bg.js | 88 + .../joi/node_modules/moment/locale/bn.js | 111 + .../joi/node_modules/moment/locale/bo.js | 108 + .../joi/node_modules/moment/locale/br.js | 109 + .../joi/node_modules/moment/locale/bs.js | 140 + .../joi/node_modules/moment/locale/ca.js | 77 + .../joi/node_modules/moment/locale/cs.js | 157 + .../joi/node_modules/moment/locale/cv.js | 61 + .../joi/node_modules/moment/locale/cy.js | 79 + .../joi/node_modules/moment/locale/da.js | 58 + .../joi/node_modules/moment/locale/de-at.js | 74 + .../joi/node_modules/moment/locale/de.js | 73 + .../joi/node_modules/moment/locale/el.js | 94 + .../joi/node_modules/moment/locale/en-au.js | 64 + .../joi/node_modules/moment/locale/en-ca.js | 61 + .../joi/node_modules/moment/locale/en-gb.js | 65 + .../joi/node_modules/moment/locale/eo.js | 71 + .../joi/node_modules/moment/locale/es.js | 77 + .../joi/node_modules/moment/locale/et.js | 78 + .../joi/node_modules/moment/locale/eu.js | 62 + .../joi/node_modules/moment/locale/fa.js | 103 + .../joi/node_modules/moment/locale/fi.js | 107 + .../joi/node_modules/moment/locale/fo.js | 58 + .../joi/node_modules/moment/locale/fr-ca.js | 56 + .../joi/node_modules/moment/locale/fr.js | 60 + .../joi/node_modules/moment/locale/fy.js | 69 + .../joi/node_modules/moment/locale/gl.js | 73 + .../joi/node_modules/moment/locale/he.js | 80 + .../joi/node_modules/moment/locale/hi.js | 121 + .../joi/node_modules/moment/locale/hr.js | 141 + .../joi/node_modules/moment/locale/hu.js | 111 + .../joi/node_modules/moment/locale/hy-am.js | 118 + .../joi/node_modules/moment/locale/id.js | 81 + .../joi/node_modules/moment/locale/is.js | 126 + .../joi/node_modules/moment/locale/it.js | 68 + .../joi/node_modules/moment/locale/ja.js | 63 + .../joi/node_modules/moment/locale/ka.js | 109 + .../joi/node_modules/moment/locale/km.js | 56 + .../joi/node_modules/moment/locale/ko.js | 65 + .../joi/node_modules/moment/locale/lb.js | 139 + .../joi/node_modules/moment/locale/lt.js | 120 + .../joi/node_modules/moment/locale/lv.js | 79 + .../joi/node_modules/moment/locale/mk.js | 88 + .../joi/node_modules/moment/locale/ml.js | 69 + .../joi/node_modules/moment/locale/mr.js | 120 + .../joi/node_modules/moment/locale/ms-my.js | 80 + .../joi/node_modules/moment/locale/my.js | 89 + .../joi/node_modules/moment/locale/nb.js | 59 + .../joi/node_modules/moment/locale/ne.js | 121 + .../joi/node_modules/moment/locale/nl.js | 69 + .../joi/node_modules/moment/locale/nn.js | 58 + .../joi/node_modules/moment/locale/pl.js | 100 + .../joi/node_modules/moment/locale/pt-br.js | 58 + .../joi/node_modules/moment/locale/pt.js | 62 + .../joi/node_modules/moment/locale/ro.js | 73 + .../joi/node_modules/moment/locale/ru.js | 176 + .../joi/node_modules/moment/locale/sk.js | 158 + .../joi/node_modules/moment/locale/sl.js | 146 + .../joi/node_modules/moment/locale/sq.js | 67 + .../joi/node_modules/moment/locale/sr-cyrl.js | 107 + .../joi/node_modules/moment/locale/sr.js | 107 + .../joi/node_modules/moment/locale/sv.js | 65 + .../joi/node_modules/moment/locale/ta.js | 130 + .../joi/node_modules/moment/locale/th.js | 63 + .../joi/node_modules/moment/locale/tl-ph.js | 60 + .../joi/node_modules/moment/locale/tr.js | 94 + .../node_modules/moment/locale/tzm-latn.js | 56 + .../joi/node_modules/moment/locale/tzm.js | 56 + .../joi/node_modules/moment/locale/uk.js | 163 + .../joi/node_modules/moment/locale/uz.js | 56 + .../joi/node_modules/moment/locale/vi.js | 64 + .../joi/node_modules/moment/locale/zh-cn.js | 125 + .../joi/node_modules/moment/locale/zh-tw.js | 99 + .../joi/node_modules/moment/min/locales.js | 7306 ++++++++++++ .../node_modules/moment/min/locales.min.js | 4 + .../moment/min/moment-with-locales.js | 9792 +++++++++++++++++ .../moment/min/moment-with-locales.min.js | 10 + .../joi/node_modules/moment/min/moment.min.js | 7 + .../joi/node_modules/moment/moment.js | 3043 +++++ .../joi/node_modules/moment/package.js | 11 + .../joi/node_modules/moment/package.json | 121 + .../heavy/node_modules/joi/package.json | 44 + .../node_modules/joi/test/alternatives.js | 454 + .../heavy/node_modules/joi/test/any.js | 960 ++ .../heavy/node_modules/joi/test/array.js | 593 + .../heavy/node_modules/joi/test/binary.js | 194 + .../heavy/node_modules/joi/test/boolean.js | 132 + .../heavy/node_modules/joi/test/date.js | 291 + .../heavy/node_modules/joi/test/errors.js | 270 + .../heavy/node_modules/joi/test/function.js | 34 + .../heavy/node_modules/joi/test/helper.js | 70 + .../heavy/node_modules/joi/test/index.js | 1472 +++ .../heavy/node_modules/joi/test/number.js | 589 + .../heavy/node_modules/joi/test/object.js | 1058 ++ .../heavy/node_modules/joi/test/ref.js | 389 + .../heavy/node_modules/joi/test/string.js | 1797 +++ .../hapi/node_modules/heavy/package.json | 49 + .../hapi/node_modules/heavy/test/index.js | 184 + .../hapi/node_modules/hoek/.npmignore | 18 + .../hapi/node_modules/hoek/.travis.yml | 7 + .../hapi/node_modules/hoek/CONTRIBUTING.md | 1 + node_modules/hapi/node_modules/hoek/LICENSE | 31 + node_modules/hapi/node_modules/hoek/Makefile | 8 + node_modules/hapi/node_modules/hoek/README.md | 543 + .../hapi/node_modules/hoek/images/hoek.png | Bin 0 -> 37939 bytes node_modules/hapi/node_modules/hoek/index.js | 1 + .../hapi/node_modules/hoek/lib/escape.js | 132 + .../hapi/node_modules/hoek/lib/index.js | 932 ++ .../hapi/node_modules/hoek/package.json | 41 + .../hapi/node_modules/hoek/test/escaper.js | 88 + .../hapi/node_modules/hoek/test/index.js | 2278 ++++ .../node_modules/hoek/test/modules/ignore.txt | 0 .../node_modules/hoek/test/modules/test1.js | 1 + .../node_modules/hoek/test/modules/test2.js | 1 + .../node_modules/hoek/test/modules/test3.js | 1 + .../hapi/node_modules/inert/.npmignore | 18 + .../hapi/node_modules/inert/.travis.yml | 6 + .../hapi/node_modules/inert/CONTRIBUTING.md | 16 + node_modules/hapi/node_modules/inert/LICENSE | 28 + node_modules/hapi/node_modules/inert/Makefile | 8 + .../hapi/node_modules/inert/README.md | 7 + node_modules/hapi/node_modules/inert/index.js | 1 + .../hapi/node_modules/inert/lib/directory.js | 242 + .../hapi/node_modules/inert/lib/file.js | 246 + .../hapi/node_modules/inert/lib/index.js | 29 + .../inert/node_modules/lru-cache/.npmignore | 1 + .../inert/node_modules/lru-cache/CONTRIBUTORS | 14 + .../inert/node_modules/lru-cache/LICENSE | 23 + .../inert/node_modules/lru-cache/README.md | 97 + .../node_modules/lru-cache/lib/lru-cache.js | 252 + .../inert/node_modules/lru-cache/package.json | 36 + .../node_modules/lru-cache/test/basic.js | 369 + .../node_modules/lru-cache/test/foreach.js | 52 + .../lru-cache/test/memory-leak.js | 50 + .../hapi/node_modules/inert/package.json | 54 + .../hapi/node_modules/inert/test/.hidden | 1 + .../hapi/node_modules/inert/test/directory.js | 817 ++ .../inert/test/directory/.dot/index.html | 1 + .../inert/test/directory/index.html | 1 + .../inert/test/directory/index.js | 1 + .../invalid/index.html/do-not-delete | 0 .../test/directory/invalid/misc/do-not-delete | 0 .../subdir/sub subdir=/subsubsubdir/test.txt | 1 + .../directory/subdir/sub subdir=/test$.json | 1 + .../directory/subdir/subsubdir/placeholder | 0 .../inert/test/directory/subdir/test.txt | 0 .../hapi/node_modules/inert/test/file.js | 1240 +++ .../node_modules/inert/test/file/image.jpg | Bin 0 -> 180452 bytes .../node_modules/inert/test/file/image.png | Bin 0 -> 42010 bytes .../node_modules/inert/test/file/image.png.gz | Bin 0 -> 41936 bytes .../node_modules/inert/test/file/note.txt | 1 + .../hapi/node_modules/iron/.npmignore | 18 + .../hapi/node_modules/iron/.travis.yml | 6 + node_modules/hapi/node_modules/iron/LICENSE | 28 + node_modules/hapi/node_modules/iron/Makefile | 9 + node_modules/hapi/node_modules/iron/README.md | 175 + .../hapi/node_modules/iron/images/iron.png | Bin 0 -> 5973 bytes .../hapi/node_modules/iron/images/logo.png | Bin 0 -> 28956 bytes node_modules/hapi/node_modules/iron/index.js | 1 + .../hapi/node_modules/iron/lib/index.js | 412 + .../hapi/node_modules/iron/package.json | 52 + .../hapi/node_modules/iron/test/index.js | 521 + .../hapi/node_modules/items/.npmignore | 18 + .../hapi/node_modules/items/.travis.yml | 5 + .../hapi/node_modules/items/CONTRIBUTING.md | 16 + node_modules/hapi/node_modules/items/LICENSE | 31 + node_modules/hapi/node_modules/items/Makefile | 8 + .../hapi/node_modules/items/README.md | 8 + node_modules/hapi/node_modules/items/index.js | 1 + .../hapi/node_modules/items/lib/index.js | 117 + .../hapi/node_modules/items/package.json | 42 + .../hapi/node_modules/items/test/index.js | 293 + .../hapi/node_modules/joi/.eslintignore | 1 + node_modules/hapi/node_modules/joi/.npmignore | 20 + .../hapi/node_modules/joi/.travis.yml | 24 + .../hapi/node_modules/joi/CONTRIBUTING.md | 14 + node_modules/hapi/node_modules/joi/LICENSE | 28 + node_modules/hapi/node_modules/joi/README.md | 1330 +++ .../joi/examples/conditionalRequire.js | 43 + .../joi/examples/customMessage.js | 22 + .../node_modules/joi/examples/multipleWhen.js | 17 + .../node_modules/joi/generate-readme-toc.js | 17 + .../hapi/node_modules/joi/images/joi.png | Bin 0 -> 30662 bytes .../node_modules/joi/images/validation.png | Bin 0 -> 117266 bytes node_modules/hapi/node_modules/joi/index.js | 1 + .../hapi/node_modules/joi/lib/alternatives.js | 145 + node_modules/hapi/node_modules/joi/lib/any.js | 826 ++ .../hapi/node_modules/joi/lib/array.js | 402 + .../hapi/node_modules/joi/lib/binary.js | 98 + .../hapi/node_modules/joi/lib/boolean.js | 41 + .../hapi/node_modules/joi/lib/cast.js | 74 + .../hapi/node_modules/joi/lib/date.js | 168 + .../hapi/node_modules/joi/lib/errors.js | 270 + .../hapi/node_modules/joi/lib/function.js | 31 + .../hapi/node_modules/joi/lib/index.js | 129 + .../hapi/node_modules/joi/lib/language.js | 119 + .../hapi/node_modules/joi/lib/number.js | 186 + .../hapi/node_modules/joi/lib/object.js | 697 ++ node_modules/hapi/node_modules/joi/lib/ref.js | 51 + .../hapi/node_modules/joi/lib/string.js | 541 + .../joi/node_modules/isemail/.npmignore | 2 + .../joi/node_modules/isemail/.travis.yml | 8 + .../joi/node_modules/isemail/LICENSE | 11 + .../joi/node_modules/isemail/Makefile | 4 + .../joi/node_modules/isemail/README.md | 92 + .../joi/node_modules/isemail/dns-no-mx.js | 80 + .../joi/node_modules/isemail/index.js | 1 + .../joi/node_modules/isemail/lib/isemail.js | 1279 +++ .../joi/node_modules/isemail/package.json | 52 + .../joi/node_modules/isemail/test/isemail.js | 279 + .../joi/node_modules/isemail/test/mocha.opts | 2 + .../joi/node_modules/moment/LICENSE | 22 + .../joi/node_modules/moment/README.md | 39 + .../joi/node_modules/moment/ender.js | 1 + .../joi/node_modules/moment/locale/af.js | 71 + .../joi/node_modules/moment/locale/ar-ma.js | 57 + .../joi/node_modules/moment/locale/ar-sa.js | 101 + .../joi/node_modules/moment/locale/ar-tn.js | 55 + .../joi/node_modules/moment/locale/ar.js | 134 + .../joi/node_modules/moment/locale/az.js | 107 + .../joi/node_modules/moment/locale/be.js | 154 + .../joi/node_modules/moment/locale/bg.js | 88 + .../joi/node_modules/moment/locale/bn.js | 111 + .../joi/node_modules/moment/locale/bo.js | 108 + .../joi/node_modules/moment/locale/br.js | 109 + .../joi/node_modules/moment/locale/bs.js | 140 + .../joi/node_modules/moment/locale/ca.js | 77 + .../joi/node_modules/moment/locale/cs.js | 157 + .../joi/node_modules/moment/locale/cv.js | 61 + .../joi/node_modules/moment/locale/cy.js | 79 + .../joi/node_modules/moment/locale/da.js | 58 + .../joi/node_modules/moment/locale/de-at.js | 74 + .../joi/node_modules/moment/locale/de.js | 73 + .../joi/node_modules/moment/locale/el.js | 94 + .../joi/node_modules/moment/locale/en-au.js | 64 + .../joi/node_modules/moment/locale/en-ca.js | 61 + .../joi/node_modules/moment/locale/en-gb.js | 65 + .../joi/node_modules/moment/locale/eo.js | 71 + .../joi/node_modules/moment/locale/es.js | 77 + .../joi/node_modules/moment/locale/et.js | 78 + .../joi/node_modules/moment/locale/eu.js | 62 + .../joi/node_modules/moment/locale/fa.js | 103 + .../joi/node_modules/moment/locale/fi.js | 107 + .../joi/node_modules/moment/locale/fo.js | 58 + .../joi/node_modules/moment/locale/fr-ca.js | 56 + .../joi/node_modules/moment/locale/fr.js | 60 + .../joi/node_modules/moment/locale/fy.js | 69 + .../joi/node_modules/moment/locale/gl.js | 73 + .../joi/node_modules/moment/locale/he.js | 80 + .../joi/node_modules/moment/locale/hi.js | 121 + .../joi/node_modules/moment/locale/hr.js | 141 + .../joi/node_modules/moment/locale/hu.js | 111 + .../joi/node_modules/moment/locale/hy-am.js | 118 + .../joi/node_modules/moment/locale/id.js | 81 + .../joi/node_modules/moment/locale/is.js | 126 + .../joi/node_modules/moment/locale/it.js | 68 + .../joi/node_modules/moment/locale/ja.js | 63 + .../joi/node_modules/moment/locale/ka.js | 109 + .../joi/node_modules/moment/locale/km.js | 56 + .../joi/node_modules/moment/locale/ko.js | 65 + .../joi/node_modules/moment/locale/lb.js | 139 + .../joi/node_modules/moment/locale/lt.js | 120 + .../joi/node_modules/moment/locale/lv.js | 79 + .../joi/node_modules/moment/locale/mk.js | 88 + .../joi/node_modules/moment/locale/ml.js | 69 + .../joi/node_modules/moment/locale/mr.js | 120 + .../joi/node_modules/moment/locale/ms-my.js | 80 + .../joi/node_modules/moment/locale/my.js | 89 + .../joi/node_modules/moment/locale/nb.js | 59 + .../joi/node_modules/moment/locale/ne.js | 121 + .../joi/node_modules/moment/locale/nl.js | 69 + .../joi/node_modules/moment/locale/nn.js | 58 + .../joi/node_modules/moment/locale/pl.js | 100 + .../joi/node_modules/moment/locale/pt-br.js | 58 + .../joi/node_modules/moment/locale/pt.js | 62 + .../joi/node_modules/moment/locale/ro.js | 73 + .../joi/node_modules/moment/locale/ru.js | 176 + .../joi/node_modules/moment/locale/sk.js | 158 + .../joi/node_modules/moment/locale/sl.js | 146 + .../joi/node_modules/moment/locale/sq.js | 67 + .../joi/node_modules/moment/locale/sr-cyrl.js | 107 + .../joi/node_modules/moment/locale/sr.js | 107 + .../joi/node_modules/moment/locale/sv.js | 65 + .../joi/node_modules/moment/locale/ta.js | 130 + .../joi/node_modules/moment/locale/th.js | 63 + .../joi/node_modules/moment/locale/tl-ph.js | 60 + .../joi/node_modules/moment/locale/tr.js | 94 + .../node_modules/moment/locale/tzm-latn.js | 56 + .../joi/node_modules/moment/locale/tzm.js | 56 + .../joi/node_modules/moment/locale/uk.js | 163 + .../joi/node_modules/moment/locale/uz.js | 56 + .../joi/node_modules/moment/locale/vi.js | 64 + .../joi/node_modules/moment/locale/zh-cn.js | 125 + .../joi/node_modules/moment/locale/zh-tw.js | 99 + .../joi/node_modules/moment/min/locales.js | 7306 ++++++++++++ .../node_modules/moment/min/locales.min.js | 4 + .../moment/min/moment-with-locales.js | 9792 +++++++++++++++++ .../moment/min/moment-with-locales.min.js | 10 + .../joi/node_modules/moment/min/moment.min.js | 7 + .../joi/node_modules/moment/moment.js | 3043 +++++ .../joi/node_modules/moment/package.js | 11 + .../joi/node_modules/moment/package.json | 121 + .../hapi/node_modules/joi/package.json | 50 + .../node_modules/joi/test/alternatives.js | 471 + .../hapi/node_modules/joi/test/any.js | 1279 +++ .../hapi/node_modules/joi/test/array.js | 785 ++ .../hapi/node_modules/joi/test/binary.js | 194 + .../hapi/node_modules/joi/test/boolean.js | 131 + .../hapi/node_modules/joi/test/date.js | 291 + .../hapi/node_modules/joi/test/errors.js | 352 + .../hapi/node_modules/joi/test/function.js | 33 + .../hapi/node_modules/joi/test/helper.js | 69 + .../hapi/node_modules/joi/test/index.js | 1594 +++ .../hapi/node_modules/joi/test/number.js | 624 ++ .../hapi/node_modules/joi/test/object.js | 1130 ++ .../hapi/node_modules/joi/test/ref.js | 389 + .../hapi/node_modules/joi/test/string.js | 2226 ++++ .../hapi/node_modules/kilt/.npmignore | 18 + .../hapi/node_modules/kilt/.travis.yml | 5 + node_modules/hapi/node_modules/kilt/AUTHORS | 1 + .../hapi/node_modules/kilt/CONTRIBUTING.md | 16 + node_modules/hapi/node_modules/kilt/LICENSE | 28 + node_modules/hapi/node_modules/kilt/Makefile | 8 + node_modules/hapi/node_modules/kilt/README.md | 7 + node_modules/hapi/node_modules/kilt/index.js | 1 + .../hapi/node_modules/kilt/lib/index.js | 108 + .../hapi/node_modules/kilt/package.json | 51 + .../hapi/node_modules/kilt/test/index.js | 348 + .../hapi/node_modules/mimos/.npmignore | 18 + .../hapi/node_modules/mimos/.travis.yml | 5 + .../hapi/node_modules/mimos/CONTRIBUTING.md | 16 + node_modules/hapi/node_modules/mimos/LICENSE | 28 + node_modules/hapi/node_modules/mimos/Makefile | 8 + .../hapi/node_modules/mimos/README.md | 7 + node_modules/hapi/node_modules/mimos/index.js | 1 + .../hapi/node_modules/mimos/lib/index.js | 96 + .../mimos/node_modules/mime-db/HISTORY.md | 166 + .../mimos/node_modules/mime-db/LICENSE | 22 + .../mimos/node_modules/mime-db/README.md | 76 + .../mimos/node_modules/mime-db/db.json | 6299 +++++++++++ .../mimos/node_modules/mime-db/index.js | 11 + .../mimos/node_modules/mime-db/package.json | 74 + .../hapi/node_modules/mimos/package.json | 46 + .../hapi/node_modules/mimos/test/index.js | 193 + .../hapi/node_modules/peekaboo/.npmignore | 18 + .../hapi/node_modules/peekaboo/.travis.yml | 5 + .../node_modules/peekaboo/CONTRIBUTING.md | 16 + .../hapi/node_modules/peekaboo/LICENSE | 28 + .../hapi/node_modules/peekaboo/Makefile | 9 + .../hapi/node_modules/peekaboo/README.md | 7 + .../hapi/node_modules/peekaboo/index.js | 1 + .../hapi/node_modules/peekaboo/lib/index.js | 30 + .../hapi/node_modules/peekaboo/package.json | 43 + .../hapi/node_modules/peekaboo/test/index.js | 91 + .../hapi/node_modules/qs/.jshintignore | 1 + node_modules/hapi/node_modules/qs/.jshintrc | 10 + node_modules/hapi/node_modules/qs/.npmignore | 18 + node_modules/hapi/node_modules/qs/.travis.yml | 6 + .../hapi/node_modules/qs/CHANGELOG.md | 68 + .../hapi/node_modules/qs/CONTRIBUTING.md | 1 + node_modules/hapi/node_modules/qs/LICENSE | 28 + node_modules/hapi/node_modules/qs/Makefile | 8 + node_modules/hapi/node_modules/qs/README.md | 222 + node_modules/hapi/node_modules/qs/index.js | 1 + .../hapi/node_modules/qs/lib/index.js | 15 + .../hapi/node_modules/qs/lib/parse.js | 157 + .../hapi/node_modules/qs/lib/stringify.js | 97 + .../hapi/node_modules/qs/lib/utils.js | 132 + .../hapi/node_modules/qs/package.json | 40 + .../hapi/node_modules/qs/test/parse.js | 413 + .../hapi/node_modules/qs/test/stringify.js | 209 + .../hapi/node_modules/shot/.npmignore | 18 + .../hapi/node_modules/shot/.travis.yml | 6 + .../hapi/node_modules/shot/CONTRIBUTING.md | 1 + node_modules/hapi/node_modules/shot/LICENSE | 28 + node_modules/hapi/node_modules/shot/README.md | 45 + .../hapi/node_modules/shot/examples/http.js | 32 + .../hapi/node_modules/shot/images/shot.png | Bin 0 -> 39211 bytes node_modules/hapi/node_modules/shot/index.js | 1 + .../hapi/node_modules/shot/lib/index.js | 272 + .../hapi/node_modules/shot/package.json | 48 + .../hapi/node_modules/shot/test/index.js | 567 + .../hapi/node_modules/statehood/.npmignore | 18 + .../hapi/node_modules/statehood/.travis.yml | 5 + .../node_modules/statehood/CONTRIBUTING.md | 16 + .../hapi/node_modules/statehood/LICENSE | 28 + .../hapi/node_modules/statehood/Makefile | 8 + .../hapi/node_modules/statehood/README.md | 7 + .../hapi/node_modules/statehood/index.js | 1 + .../hapi/node_modules/statehood/lib/index.js | 561 + .../statehood/node_modules/joi/.npmignore | 20 + .../statehood/node_modules/joi/.travis.yml | 22 + .../node_modules/joi/CONTRIBUTING.md | 14 + .../statehood/node_modules/joi/LICENSE | 28 + .../statehood/node_modules/joi/README.md | 1240 +++ .../joi/examples/conditionalRequire.js | 43 + .../joi/examples/customMessage.js | 22 + .../node_modules/joi/examples/multipleWhen.js | 17 + .../statehood/node_modules/joi/images/joi.png | Bin 0 -> 30662 bytes .../node_modules/joi/images/validation.png | Bin 0 -> 117266 bytes .../statehood/node_modules/joi/index.js | 1 + .../node_modules/joi/lib/alternatives.js | 145 + .../statehood/node_modules/joi/lib/any.js | 704 ++ .../statehood/node_modules/joi/lib/array.js | 288 + .../statehood/node_modules/joi/lib/binary.js | 98 + .../statehood/node_modules/joi/lib/boolean.js | 41 + .../statehood/node_modules/joi/lib/cast.js | 74 + .../statehood/node_modules/joi/lib/date.js | 168 + .../statehood/node_modules/joi/lib/errors.js | 159 + .../node_modules/joi/lib/function.js | 31 + .../statehood/node_modules/joi/lib/index.js | 129 + .../node_modules/joi/lib/language.js | 106 + .../statehood/node_modules/joi/lib/number.js | 170 + .../statehood/node_modules/joi/lib/object.js | 685 ++ .../statehood/node_modules/joi/lib/ref.js | 51 + .../statehood/node_modules/joi/lib/string.js | 282 + .../joi/node_modules/isemail/.npmignore | 2 + .../joi/node_modules/isemail/.travis.yml | 8 + .../joi/node_modules/isemail/LICENSE | 11 + .../joi/node_modules/isemail/Makefile | 4 + .../joi/node_modules/isemail/README.md | 92 + .../joi/node_modules/isemail/dns-no-mx.js | 80 + .../joi/node_modules/isemail/index.js | 1 + .../joi/node_modules/isemail/lib/isemail.js | 1279 +++ .../joi/node_modules/isemail/package.json | 52 + .../joi/node_modules/isemail/test/isemail.js | 279 + .../joi/node_modules/isemail/test/mocha.opts | 2 + .../joi/node_modules/moment/LICENSE | 22 + .../joi/node_modules/moment/README.md | 39 + .../joi/node_modules/moment/ender.js | 1 + .../joi/node_modules/moment/locale/af.js | 71 + .../joi/node_modules/moment/locale/ar-ma.js | 57 + .../joi/node_modules/moment/locale/ar-sa.js | 101 + .../joi/node_modules/moment/locale/ar-tn.js | 55 + .../joi/node_modules/moment/locale/ar.js | 134 + .../joi/node_modules/moment/locale/az.js | 107 + .../joi/node_modules/moment/locale/be.js | 154 + .../joi/node_modules/moment/locale/bg.js | 88 + .../joi/node_modules/moment/locale/bn.js | 111 + .../joi/node_modules/moment/locale/bo.js | 108 + .../joi/node_modules/moment/locale/br.js | 109 + .../joi/node_modules/moment/locale/bs.js | 140 + .../joi/node_modules/moment/locale/ca.js | 77 + .../joi/node_modules/moment/locale/cs.js | 157 + .../joi/node_modules/moment/locale/cv.js | 61 + .../joi/node_modules/moment/locale/cy.js | 79 + .../joi/node_modules/moment/locale/da.js | 58 + .../joi/node_modules/moment/locale/de-at.js | 74 + .../joi/node_modules/moment/locale/de.js | 73 + .../joi/node_modules/moment/locale/el.js | 94 + .../joi/node_modules/moment/locale/en-au.js | 64 + .../joi/node_modules/moment/locale/en-ca.js | 61 + .../joi/node_modules/moment/locale/en-gb.js | 65 + .../joi/node_modules/moment/locale/eo.js | 71 + .../joi/node_modules/moment/locale/es.js | 77 + .../joi/node_modules/moment/locale/et.js | 78 + .../joi/node_modules/moment/locale/eu.js | 62 + .../joi/node_modules/moment/locale/fa.js | 103 + .../joi/node_modules/moment/locale/fi.js | 107 + .../joi/node_modules/moment/locale/fo.js | 58 + .../joi/node_modules/moment/locale/fr-ca.js | 56 + .../joi/node_modules/moment/locale/fr.js | 60 + .../joi/node_modules/moment/locale/fy.js | 69 + .../joi/node_modules/moment/locale/gl.js | 73 + .../joi/node_modules/moment/locale/he.js | 80 + .../joi/node_modules/moment/locale/hi.js | 121 + .../joi/node_modules/moment/locale/hr.js | 141 + .../joi/node_modules/moment/locale/hu.js | 111 + .../joi/node_modules/moment/locale/hy-am.js | 118 + .../joi/node_modules/moment/locale/id.js | 81 + .../joi/node_modules/moment/locale/is.js | 126 + .../joi/node_modules/moment/locale/it.js | 68 + .../joi/node_modules/moment/locale/ja.js | 63 + .../joi/node_modules/moment/locale/ka.js | 109 + .../joi/node_modules/moment/locale/km.js | 56 + .../joi/node_modules/moment/locale/ko.js | 65 + .../joi/node_modules/moment/locale/lb.js | 139 + .../joi/node_modules/moment/locale/lt.js | 120 + .../joi/node_modules/moment/locale/lv.js | 79 + .../joi/node_modules/moment/locale/mk.js | 88 + .../joi/node_modules/moment/locale/ml.js | 69 + .../joi/node_modules/moment/locale/mr.js | 120 + .../joi/node_modules/moment/locale/ms-my.js | 80 + .../joi/node_modules/moment/locale/my.js | 89 + .../joi/node_modules/moment/locale/nb.js | 59 + .../joi/node_modules/moment/locale/ne.js | 121 + .../joi/node_modules/moment/locale/nl.js | 69 + .../joi/node_modules/moment/locale/nn.js | 58 + .../joi/node_modules/moment/locale/pl.js | 100 + .../joi/node_modules/moment/locale/pt-br.js | 58 + .../joi/node_modules/moment/locale/pt.js | 62 + .../joi/node_modules/moment/locale/ro.js | 73 + .../joi/node_modules/moment/locale/ru.js | 176 + .../joi/node_modules/moment/locale/sk.js | 158 + .../joi/node_modules/moment/locale/sl.js | 146 + .../joi/node_modules/moment/locale/sq.js | 67 + .../joi/node_modules/moment/locale/sr-cyrl.js | 107 + .../joi/node_modules/moment/locale/sr.js | 107 + .../joi/node_modules/moment/locale/sv.js | 65 + .../joi/node_modules/moment/locale/ta.js | 130 + .../joi/node_modules/moment/locale/th.js | 63 + .../joi/node_modules/moment/locale/tl-ph.js | 60 + .../joi/node_modules/moment/locale/tr.js | 94 + .../node_modules/moment/locale/tzm-latn.js | 56 + .../joi/node_modules/moment/locale/tzm.js | 56 + .../joi/node_modules/moment/locale/uk.js | 163 + .../joi/node_modules/moment/locale/uz.js | 56 + .../joi/node_modules/moment/locale/vi.js | 64 + .../joi/node_modules/moment/locale/zh-cn.js | 125 + .../joi/node_modules/moment/locale/zh-tw.js | 99 + .../joi/node_modules/moment/min/locales.js | 7306 ++++++++++++ .../node_modules/moment/min/locales.min.js | 4 + .../moment/min/moment-with-locales.js | 9792 +++++++++++++++++ .../moment/min/moment-with-locales.min.js | 10 + .../joi/node_modules/moment/min/moment.min.js | 7 + .../joi/node_modules/moment/moment.js | 3043 +++++ .../joi/node_modules/moment/package.js | 11 + .../joi/node_modules/moment/package.json | 121 + .../statehood/node_modules/joi/package.json | 44 + .../node_modules/joi/test/alternatives.js | 454 + .../statehood/node_modules/joi/test/any.js | 960 ++ .../statehood/node_modules/joi/test/array.js | 593 + .../statehood/node_modules/joi/test/binary.js | 194 + .../node_modules/joi/test/boolean.js | 132 + .../statehood/node_modules/joi/test/date.js | 291 + .../statehood/node_modules/joi/test/errors.js | 270 + .../node_modules/joi/test/function.js | 34 + .../statehood/node_modules/joi/test/helper.js | 70 + .../statehood/node_modules/joi/test/index.js | 1472 +++ .../statehood/node_modules/joi/test/number.js | 589 + .../statehood/node_modules/joi/test/object.js | 1058 ++ .../statehood/node_modules/joi/test/ref.js | 389 + .../statehood/node_modules/joi/test/string.js | 1797 +++ .../hapi/node_modules/statehood/package.json | 51 + .../hapi/node_modules/statehood/test/index.js | 1205 ++ .../hapi/node_modules/subtext/.npmignore | 18 + .../hapi/node_modules/subtext/.travis.yml | 5 + .../hapi/node_modules/subtext/CONTRIBUTING.md | 16 + .../hapi/node_modules/subtext/LICENSE | 28 + .../hapi/node_modules/subtext/Makefile | 8 + .../hapi/node_modules/subtext/README.md | 7 + .../hapi/node_modules/subtext/index.js | 1 + .../hapi/node_modules/subtext/lib/index.js | 483 + .../subtext/node_modules/content/.npmignore | 18 + .../subtext/node_modules/content/.travis.yml | 5 + .../node_modules/content/CONTRIBUTING.md | 16 + .../subtext/node_modules/content/LICENSE | 30 + .../subtext/node_modules/content/Makefile | 8 + .../subtext/node_modules/content/README.md | 7 + .../subtext/node_modules/content/index.js | 1 + .../subtext/node_modules/content/lib/index.js | 113 + .../subtext/node_modules/content/package.json | 47 + .../node_modules/content/test/index.js | 152 + .../subtext/node_modules/pez/.npmignore | 18 + .../subtext/node_modules/pez/.travis.yml | 5 + .../subtext/node_modules/pez/CONTRIBUTING.md | 16 + .../subtext/node_modules/pez/LICENSE | 36 + .../subtext/node_modules/pez/Makefile | 8 + .../subtext/node_modules/pez/README.md | 7 + .../subtext/node_modules/pez/index.js | 1 + .../subtext/node_modules/pez/lib/index.js | 368 + .../pez/node_modules/b64/.npmignore | 18 + .../pez/node_modules/b64/.travis.yml | 5 + .../pez/node_modules/b64/CONTRIBUTING.md | 16 + .../node_modules/pez/node_modules/b64/LICENSE | 29 + .../pez/node_modules/b64/Makefile | 8 + .../pez/node_modules/b64/README.md | 7 + .../pez/node_modules/b64/index.js | 1 + .../pez/node_modules/b64/lib/index.js | 171 + .../pez/node_modules/b64/package.json | 47 + .../pez/node_modules/b64/test/index.js | 185 + .../pez/node_modules/nigel/.npmignore | 18 + .../pez/node_modules/nigel/.travis.yml | 5 + .../pez/node_modules/nigel/CONTRIBUTING.md | 16 + .../pez/node_modules/nigel/LICENSE | 28 + .../pez/node_modules/nigel/Makefile | 8 + .../pez/node_modules/nigel/README.md | 7 + .../pez/node_modules/nigel/index.js | 1 + .../pez/node_modules/nigel/lib/index.js | 195 + .../nigel/node_modules/vise/.npmignore | 18 + .../nigel/node_modules/vise/.travis.yml | 5 + .../nigel/node_modules/vise/CONTRIBUTING.md | 16 + .../nigel/node_modules/vise/LICENSE | 28 + .../nigel/node_modules/vise/Makefile | 8 + .../nigel/node_modules/vise/README.md | 7 + .../nigel/node_modules/vise/index.js | 1 + .../nigel/node_modules/vise/lib/index.js | 168 + .../nigel/node_modules/vise/package.json | 45 + .../nigel/node_modules/vise/test/index.js | 260 + .../pez/node_modules/nigel/package.json | 47 + .../pez/node_modules/nigel/test/index.js | 504 + .../subtext/node_modules/pez/package.json | 51 + .../node_modules/pez/test/files/blank.gif | Bin 0 -> 49 bytes .../node_modules/pez/test/files/file1.txt | 1 + .../node_modules/pez/test/files/image.png | Bin 0 -> 16387 bytes .../node_modules/pez/test/files/large.png | Bin 0 -> 768323 bytes .../subtext/node_modules/pez/test/index.js | 1015 ++ .../hapi/node_modules/subtext/package.json | 53 + .../node_modules/subtext/test/file/image.jpg | Bin 0 -> 180452 bytes .../hapi/node_modules/subtext/test/index.js | 1114 ++ .../hapi/node_modules/topo/.npmignore | 18 + .../hapi/node_modules/topo/.travis.yml | 5 + .../hapi/node_modules/topo/CONTRIBUTING.md | 16 + node_modules/hapi/node_modules/topo/LICENSE | 28 + node_modules/hapi/node_modules/topo/Makefile | 8 + node_modules/hapi/node_modules/topo/README.md | 7 + node_modules/hapi/node_modules/topo/index.js | 1 + .../hapi/node_modules/topo/lib/index.js | 193 + .../hapi/node_modules/topo/package.json | 45 + .../hapi/node_modules/topo/test/index.js | 114 + .../hapi/node_modules/vision/.npmignore | 18 + .../hapi/node_modules/vision/.travis.yml | 5 + .../hapi/node_modules/vision/CONTRIBUTING.md | 16 + node_modules/hapi/node_modules/vision/LICENSE | 28 + .../hapi/node_modules/vision/Makefile | 8 + .../hapi/node_modules/vision/README.md | 7 + .../vision/examples/cms/_pages/.placeholder | 0 .../vision/examples/cms/_pages/Test | 1 + .../node_modules/vision/examples/cms/pages.js | 65 + .../vision/examples/cms/server.js | 76 + .../vision/examples/cms/views/create.html | 25 + .../vision/examples/cms/views/edit.html | 25 + .../vision/examples/cms/views/index.html | 34 + .../vision/examples/cms/views/layout.html | 25 + .../vision/examples/cms/views/page.html | 4 + .../examples/cms/views/partials/footer.html | 1 + .../examples/cms/views/partials/nav.html | 21 + .../vision/examples/handlebars/basic.js | 35 + .../vision/examples/handlebars/layout.js | 36 + .../vision/examples/handlebars/partials.js | 36 + .../handlebars/templates/basic/index.html | 11 + .../examples/handlebars/templates/layout.html | 11 + .../templates/withLayout/index.html | 3 + .../templates/withPartials/footer.html | 3 + .../templates/withPartials/header.html | 3 + .../templates/withPartials/index.html | 13 + .../vision/examples/jade/index.js | 47 + .../vision/examples/jade/templates/about.jade | 5 + .../jade/templates/includes/foot.jade | 2 + .../jade/templates/includes/head.jade | 2 + .../vision/examples/jade/templates/index.jade | 5 + .../examples/jade/templates/layout.jade | 5 + .../vision/examples/mixed/index.js | 46 + .../examples/mixed/templates/handlebars.html | 7 + .../examples/mixed/templates/index.jade | 4 + .../hapi/node_modules/vision/index.js | 1 + .../hapi/node_modules/vision/lib/index.js | 106 + .../hapi/node_modules/vision/lib/manager.js | 504 + .../vision/node_modules/joi/.npmignore | 20 + .../vision/node_modules/joi/.travis.yml | 22 + .../vision/node_modules/joi/CONTRIBUTING.md | 14 + .../vision/node_modules/joi/LICENSE | 28 + .../vision/node_modules/joi/README.md | 1240 +++ .../joi/examples/conditionalRequire.js | 43 + .../joi/examples/customMessage.js | 22 + .../node_modules/joi/examples/multipleWhen.js | 17 + .../vision/node_modules/joi/images/joi.png | Bin 0 -> 30662 bytes .../node_modules/joi/images/validation.png | Bin 0 -> 117266 bytes .../vision/node_modules/joi/index.js | 1 + .../node_modules/joi/lib/alternatives.js | 145 + .../vision/node_modules/joi/lib/any.js | 704 ++ .../vision/node_modules/joi/lib/array.js | 288 + .../vision/node_modules/joi/lib/binary.js | 98 + .../vision/node_modules/joi/lib/boolean.js | 41 + .../vision/node_modules/joi/lib/cast.js | 74 + .../vision/node_modules/joi/lib/date.js | 168 + .../vision/node_modules/joi/lib/errors.js | 159 + .../vision/node_modules/joi/lib/function.js | 31 + .../vision/node_modules/joi/lib/index.js | 129 + .../vision/node_modules/joi/lib/language.js | 106 + .../vision/node_modules/joi/lib/number.js | 170 + .../vision/node_modules/joi/lib/object.js | 685 ++ .../vision/node_modules/joi/lib/ref.js | 51 + .../vision/node_modules/joi/lib/string.js | 282 + .../joi/node_modules/isemail/.npmignore | 2 + .../joi/node_modules/isemail/.travis.yml | 8 + .../joi/node_modules/isemail/LICENSE | 11 + .../joi/node_modules/isemail/Makefile | 4 + .../joi/node_modules/isemail/README.md | 92 + .../joi/node_modules/isemail/dns-no-mx.js | 80 + .../joi/node_modules/isemail/index.js | 1 + .../joi/node_modules/isemail/lib/isemail.js | 1279 +++ .../joi/node_modules/isemail/package.json | 52 + .../joi/node_modules/isemail/test/isemail.js | 279 + .../joi/node_modules/isemail/test/mocha.opts | 2 + .../joi/node_modules/moment/LICENSE | 22 + .../joi/node_modules/moment/README.md | 39 + .../joi/node_modules/moment/ender.js | 1 + .../joi/node_modules/moment/locale/af.js | 71 + .../joi/node_modules/moment/locale/ar-ma.js | 57 + .../joi/node_modules/moment/locale/ar-sa.js | 101 + .../joi/node_modules/moment/locale/ar-tn.js | 55 + .../joi/node_modules/moment/locale/ar.js | 134 + .../joi/node_modules/moment/locale/az.js | 107 + .../joi/node_modules/moment/locale/be.js | 154 + .../joi/node_modules/moment/locale/bg.js | 88 + .../joi/node_modules/moment/locale/bn.js | 111 + .../joi/node_modules/moment/locale/bo.js | 108 + .../joi/node_modules/moment/locale/br.js | 109 + .../joi/node_modules/moment/locale/bs.js | 140 + .../joi/node_modules/moment/locale/ca.js | 77 + .../joi/node_modules/moment/locale/cs.js | 157 + .../joi/node_modules/moment/locale/cv.js | 61 + .../joi/node_modules/moment/locale/cy.js | 79 + .../joi/node_modules/moment/locale/da.js | 58 + .../joi/node_modules/moment/locale/de-at.js | 74 + .../joi/node_modules/moment/locale/de.js | 73 + .../joi/node_modules/moment/locale/el.js | 94 + .../joi/node_modules/moment/locale/en-au.js | 64 + .../joi/node_modules/moment/locale/en-ca.js | 61 + .../joi/node_modules/moment/locale/en-gb.js | 65 + .../joi/node_modules/moment/locale/eo.js | 71 + .../joi/node_modules/moment/locale/es.js | 77 + .../joi/node_modules/moment/locale/et.js | 78 + .../joi/node_modules/moment/locale/eu.js | 62 + .../joi/node_modules/moment/locale/fa.js | 103 + .../joi/node_modules/moment/locale/fi.js | 107 + .../joi/node_modules/moment/locale/fo.js | 58 + .../joi/node_modules/moment/locale/fr-ca.js | 56 + .../joi/node_modules/moment/locale/fr.js | 60 + .../joi/node_modules/moment/locale/fy.js | 69 + .../joi/node_modules/moment/locale/gl.js | 73 + .../joi/node_modules/moment/locale/he.js | 80 + .../joi/node_modules/moment/locale/hi.js | 121 + .../joi/node_modules/moment/locale/hr.js | 141 + .../joi/node_modules/moment/locale/hu.js | 111 + .../joi/node_modules/moment/locale/hy-am.js | 118 + .../joi/node_modules/moment/locale/id.js | 81 + .../joi/node_modules/moment/locale/is.js | 126 + .../joi/node_modules/moment/locale/it.js | 68 + .../joi/node_modules/moment/locale/ja.js | 63 + .../joi/node_modules/moment/locale/ka.js | 109 + .../joi/node_modules/moment/locale/km.js | 56 + .../joi/node_modules/moment/locale/ko.js | 65 + .../joi/node_modules/moment/locale/lb.js | 139 + .../joi/node_modules/moment/locale/lt.js | 120 + .../joi/node_modules/moment/locale/lv.js | 79 + .../joi/node_modules/moment/locale/mk.js | 88 + .../joi/node_modules/moment/locale/ml.js | 69 + .../joi/node_modules/moment/locale/mr.js | 120 + .../joi/node_modules/moment/locale/ms-my.js | 80 + .../joi/node_modules/moment/locale/my.js | 89 + .../joi/node_modules/moment/locale/nb.js | 59 + .../joi/node_modules/moment/locale/ne.js | 121 + .../joi/node_modules/moment/locale/nl.js | 69 + .../joi/node_modules/moment/locale/nn.js | 58 + .../joi/node_modules/moment/locale/pl.js | 100 + .../joi/node_modules/moment/locale/pt-br.js | 58 + .../joi/node_modules/moment/locale/pt.js | 62 + .../joi/node_modules/moment/locale/ro.js | 73 + .../joi/node_modules/moment/locale/ru.js | 176 + .../joi/node_modules/moment/locale/sk.js | 158 + .../joi/node_modules/moment/locale/sl.js | 146 + .../joi/node_modules/moment/locale/sq.js | 67 + .../joi/node_modules/moment/locale/sr-cyrl.js | 107 + .../joi/node_modules/moment/locale/sr.js | 107 + .../joi/node_modules/moment/locale/sv.js | 65 + .../joi/node_modules/moment/locale/ta.js | 130 + .../joi/node_modules/moment/locale/th.js | 63 + .../joi/node_modules/moment/locale/tl-ph.js | 60 + .../joi/node_modules/moment/locale/tr.js | 94 + .../node_modules/moment/locale/tzm-latn.js | 56 + .../joi/node_modules/moment/locale/tzm.js | 56 + .../joi/node_modules/moment/locale/uk.js | 163 + .../joi/node_modules/moment/locale/uz.js | 56 + .../joi/node_modules/moment/locale/vi.js | 64 + .../joi/node_modules/moment/locale/zh-cn.js | 125 + .../joi/node_modules/moment/locale/zh-tw.js | 99 + .../joi/node_modules/moment/min/locales.js | 7306 ++++++++++++ .../node_modules/moment/min/locales.min.js | 4 + .../moment/min/moment-with-locales.js | 9792 +++++++++++++++++ .../moment/min/moment-with-locales.min.js | 10 + .../joi/node_modules/moment/min/moment.min.js | 7 + .../joi/node_modules/moment/moment.js | 3043 +++++ .../joi/node_modules/moment/package.js | 11 + .../joi/node_modules/moment/package.json | 121 + .../vision/node_modules/joi/package.json | 44 + .../node_modules/joi/test/alternatives.js | 454 + .../vision/node_modules/joi/test/any.js | 960 ++ .../vision/node_modules/joi/test/array.js | 593 + .../vision/node_modules/joi/test/binary.js | 194 + .../vision/node_modules/joi/test/boolean.js | 132 + .../vision/node_modules/joi/test/date.js | 291 + .../vision/node_modules/joi/test/errors.js | 270 + .../vision/node_modules/joi/test/function.js | 34 + .../vision/node_modules/joi/test/helper.js | 70 + .../vision/node_modules/joi/test/index.js | 1472 +++ .../vision/node_modules/joi/test/number.js | 589 + .../vision/node_modules/joi/test/object.js | 1058 ++ .../vision/node_modules/joi/test/ref.js | 389 + .../vision/node_modules/joi/test/string.js | 1797 +++ .../hapi/node_modules/vision/package.json | 52 + .../hapi/node_modules/vision/test/index.js | 586 + .../hapi/node_modules/vision/test/manager.js | 1524 +++ .../vision/test/templates/badlayout.html | 1 + .../test/templates/invalid/badmustache.html | 2 + .../vision/test/templates/invalid/layout.html | 1 + .../vision/test/templates/invalid/test.html | 3 + .../vision/test/templates/layout.html | 9 + .../test/templates/layout/elsewhere.html | 1 + .../vision/test/templates/otherLayout.html | 1 + .../vision/test/templates/plugin/test.html | 1 + .../vision/test/templates/valid/handler.html | 12 + .../test/templates/valid/helpers/.hidden.js | 1 + .../test/templates/valid/helpers/ignore.js | 1 + .../valid/helpers/tools/lowercase.js | 4 + .../test/templates/valid/helpers/uppercase.js | 4 + .../vision/test/templates/valid/index.jade | 4 + .../vision/test/templates/valid/layout.jade | 4 + .../vision/test/templates/valid/options.html | 1 + .../templates/valid/partials/.ignore.html | 0 .../test/templates/valid/partials/nav.html | 1 + .../valid/partials/nested/deep/nav.html | 1 + .../templates/valid/partials/nested/nav.html | 1 + .../vision/test/templates/valid/test.html | 3 + .../vision/test/templates/valid/test.jade | 1 + .../test/templates/valid/testContext.html | 4 + .../test/templates/valid/testHelpers.html | 1 + .../test/templates/valid/testMulti.jade | 4 + .../test/templates/valid/testPartials.html | 1 + .../templates/valid/testPartialsName.html | 1 + .../hapi/node_modules/wreck/.npmignore | 18 + .../hapi/node_modules/wreck/.travis.yml | 5 + .../hapi/node_modules/wreck/CONTRIBUTING.md | 14 + node_modules/hapi/node_modules/wreck/LICENSE | 28 + node_modules/hapi/node_modules/wreck/Makefile | 9 + .../hapi/node_modules/wreck/README.md | 197 + .../hapi/node_modules/wreck/images/wreck.png | Bin 0 -> 30090 bytes node_modules/hapi/node_modules/wreck/index.js | 1 + .../hapi/node_modules/wreck/lib/index.js | 404 + .../hapi/node_modules/wreck/lib/payload.js | 42 + .../hapi/node_modules/wreck/lib/recorder.js | 44 + .../hapi/node_modules/wreck/lib/tap.js | 33 + .../hapi/node_modules/wreck/package.json | 46 + .../hapi/node_modules/wreck/test/index.js | 1499 +++ node_modules/hapi/npm-shrinkwrap.json | 117 + node_modules/hapi/package.json | 69 + node_modules/hapi/test/.hidden | 1 + node_modules/hapi/test/auth.js | 1353 +++ node_modules/hapi/test/connection.js | 1306 +++ node_modules/hapi/test/file/image.jpg | Bin 0 -> 180452 bytes node_modules/hapi/test/file/image.png | Bin 0 -> 42010 bytes node_modules/hapi/test/file/image.png.gz | Bin 0 -> 41936 bytes node_modules/hapi/test/file/note.txt | 1 + node_modules/hapi/test/handler.js | 1179 ++ node_modules/hapi/test/methods.js | 1044 ++ node_modules/hapi/test/payload.js | 649 ++ node_modules/hapi/test/plugin.js | 2574 +++++ node_modules/hapi/test/protect.js | 156 + node_modules/hapi/test/reply.js | 590 + node_modules/hapi/test/request.js | 1368 +++ node_modules/hapi/test/response.js | 982 ++ node_modules/hapi/test/route.js | 338 + node_modules/hapi/test/security.js | 281 + node_modules/hapi/test/server.js | 299 + node_modules/hapi/test/state.js | 228 + .../hapi/test/templates/plugin/test.html | 1 + node_modules/hapi/test/templates/test.html | 3 + node_modules/hapi/test/transmit.js | 2890 +++++ node_modules/hapi/test/validation.js | 1392 +++ node_modules/hoek/.npmignore | 18 + node_modules/hoek/.travis.yml | 7 + node_modules/hoek/CONTRIBUTING.md | 1 + node_modules/hoek/LICENSE | 31 + node_modules/hoek/Makefile | 8 + node_modules/hoek/README.md | 543 + node_modules/hoek/images/hoek.png | Bin 0 -> 37939 bytes node_modules/hoek/index.js | 1 + node_modules/hoek/lib/escape.js | 132 + node_modules/hoek/lib/index.js | 932 ++ node_modules/hoek/package.json | 37 + node_modules/hoek/test/escaper.js | 88 + node_modules/hoek/test/index.js | 2278 ++++ node_modules/hoek/test/modules/ignore.txt | 0 node_modules/hoek/test/modules/test1.js | 1 + node_modules/hoek/test/modules/test2.js | 1 + node_modules/hoek/test/modules/test3.js | 1 + package.json | 26 + 1193 files changed, 288891 insertions(+) create mode 100644 lib/index.js create mode 100644 node_modules/hapi/.npmignore create mode 100755 node_modules/hapi/.travis.yml create mode 100755 node_modules/hapi/API.md create mode 100755 node_modules/hapi/CHANGELOG.md create mode 100755 node_modules/hapi/CONTRIBUTING.md create mode 100755 node_modules/hapi/LICENSE create mode 100755 node_modules/hapi/Makefile create mode 100755 node_modules/hapi/README.md create mode 100755 node_modules/hapi/images/hapi.png create mode 100755 node_modules/hapi/index.js create mode 100755 node_modules/hapi/lib/auth.js create mode 100755 node_modules/hapi/lib/connection.js create mode 100755 node_modules/hapi/lib/defaults.js create mode 100755 node_modules/hapi/lib/handler.js create mode 100755 node_modules/hapi/lib/index.js create mode 100755 node_modules/hapi/lib/methods.js create mode 100755 node_modules/hapi/lib/plugin.js create mode 100755 node_modules/hapi/lib/protect.js create mode 100755 node_modules/hapi/lib/reply.js create mode 100755 node_modules/hapi/lib/request.js create mode 100755 node_modules/hapi/lib/response.js create mode 100755 node_modules/hapi/lib/route.js create mode 100755 node_modules/hapi/lib/schema.js create mode 100755 node_modules/hapi/lib/server.js create mode 100755 node_modules/hapi/lib/transmit.js create mode 100755 node_modules/hapi/lib/validation.js create mode 100644 node_modules/hapi/node_modules/accept/.npmignore create mode 100755 node_modules/hapi/node_modules/accept/.travis.yml create mode 100755 node_modules/hapi/node_modules/accept/CONTRIBUTING.md create mode 100755 node_modules/hapi/node_modules/accept/LICENSE create mode 100755 node_modules/hapi/node_modules/accept/Makefile create mode 100644 node_modules/hapi/node_modules/accept/README.md create mode 100755 node_modules/hapi/node_modules/accept/index.js create mode 100755 node_modules/hapi/node_modules/accept/lib/index.js create mode 100755 node_modules/hapi/node_modules/accept/package.json create mode 100755 node_modules/hapi/node_modules/accept/test/index.js create mode 100644 node_modules/hapi/node_modules/ammo/.npmignore create mode 100755 node_modules/hapi/node_modules/ammo/.travis.yml create mode 100755 node_modules/hapi/node_modules/ammo/CONTRIBUTING.md create mode 100755 node_modules/hapi/node_modules/ammo/LICENSE create mode 100755 node_modules/hapi/node_modules/ammo/Makefile create mode 100644 node_modules/hapi/node_modules/ammo/README.md create mode 100755 node_modules/hapi/node_modules/ammo/index.js create mode 100755 node_modules/hapi/node_modules/ammo/lib/index.js create mode 100755 node_modules/hapi/node_modules/ammo/package.json create mode 100755 node_modules/hapi/node_modules/ammo/test/index.js create mode 100644 node_modules/hapi/node_modules/boom/.npmignore create mode 100755 node_modules/hapi/node_modules/boom/.travis.yml create mode 100644 node_modules/hapi/node_modules/boom/CONTRIBUTING.md create mode 100755 node_modules/hapi/node_modules/boom/LICENSE create mode 100755 node_modules/hapi/node_modules/boom/Makefile create mode 100755 node_modules/hapi/node_modules/boom/README.md create mode 100755 node_modules/hapi/node_modules/boom/images/boom.png create mode 100755 node_modules/hapi/node_modules/boom/index.js create mode 100755 node_modules/hapi/node_modules/boom/lib/index.js create mode 100755 node_modules/hapi/node_modules/boom/package.json create mode 100755 node_modules/hapi/node_modules/boom/test/index.js create mode 100644 node_modules/hapi/node_modules/call/.npmignore create mode 100755 node_modules/hapi/node_modules/call/.travis.yml create mode 100755 node_modules/hapi/node_modules/call/CONTRIBUTING.md create mode 100755 node_modules/hapi/node_modules/call/LICENSE create mode 100755 node_modules/hapi/node_modules/call/Makefile create mode 100644 node_modules/hapi/node_modules/call/README.md create mode 100755 node_modules/hapi/node_modules/call/index.js create mode 100755 node_modules/hapi/node_modules/call/lib/index.js create mode 100755 node_modules/hapi/node_modules/call/lib/regex.js create mode 100755 node_modules/hapi/node_modules/call/lib/segment.js create mode 100755 node_modules/hapi/node_modules/call/package.json create mode 100755 node_modules/hapi/node_modules/call/test/index.js create mode 100755 node_modules/hapi/node_modules/call/test/regex.js create mode 100644 node_modules/hapi/node_modules/catbox-memory/.npmignore create mode 100755 node_modules/hapi/node_modules/catbox-memory/.travis.yml create mode 100644 node_modules/hapi/node_modules/catbox-memory/CONTRIBUTING.md create mode 100755 node_modules/hapi/node_modules/catbox-memory/LICENSE create mode 100755 node_modules/hapi/node_modules/catbox-memory/Makefile create mode 100644 node_modules/hapi/node_modules/catbox-memory/README.md create mode 100755 node_modules/hapi/node_modules/catbox-memory/index.js create mode 100755 node_modules/hapi/node_modules/catbox-memory/lib/index.js create mode 100755 node_modules/hapi/node_modules/catbox-memory/package.json create mode 100755 node_modules/hapi/node_modules/catbox-memory/test/index.js create mode 100644 node_modules/hapi/node_modules/catbox/.npmignore create mode 100755 node_modules/hapi/node_modules/catbox/.travis.yml create mode 100644 node_modules/hapi/node_modules/catbox/CONTRIBUTING.md create mode 100755 node_modules/hapi/node_modules/catbox/LICENSE create mode 100755 node_modules/hapi/node_modules/catbox/Makefile create mode 100755 node_modules/hapi/node_modules/catbox/README.md create mode 100755 node_modules/hapi/node_modules/catbox/examples/policy.js create mode 100755 node_modules/hapi/node_modules/catbox/images/catbox.png create mode 100755 node_modules/hapi/node_modules/catbox/index.js create mode 100755 node_modules/hapi/node_modules/catbox/lib/client.js create mode 100755 node_modules/hapi/node_modules/catbox/lib/index.js create mode 100755 node_modules/hapi/node_modules/catbox/lib/policy.js create mode 100755 node_modules/hapi/node_modules/catbox/package.json create mode 100755 node_modules/hapi/node_modules/catbox/test/client.js create mode 100755 node_modules/hapi/node_modules/catbox/test/import.js create mode 100755 node_modules/hapi/node_modules/catbox/test/index.js create mode 100755 node_modules/hapi/node_modules/catbox/test/policy.js create mode 100644 node_modules/hapi/node_modules/cryptiles/.npmignore create mode 100755 node_modules/hapi/node_modules/cryptiles/.travis.yml create mode 100755 node_modules/hapi/node_modules/cryptiles/LICENSE create mode 100755 node_modules/hapi/node_modules/cryptiles/Makefile create mode 100644 node_modules/hapi/node_modules/cryptiles/README.md create mode 100755 node_modules/hapi/node_modules/cryptiles/index.js create mode 100755 node_modules/hapi/node_modules/cryptiles/lib/index.js create mode 100755 node_modules/hapi/node_modules/cryptiles/package.json create mode 100755 node_modules/hapi/node_modules/cryptiles/test/index.js create mode 100644 node_modules/hapi/node_modules/h2o2/.npmignore create mode 100755 node_modules/hapi/node_modules/h2o2/.travis.yml create mode 100755 node_modules/hapi/node_modules/h2o2/CONTRIBUTING.md create mode 100755 node_modules/hapi/node_modules/h2o2/LICENSE create mode 100755 node_modules/hapi/node_modules/h2o2/Makefile create mode 100644 node_modules/hapi/node_modules/h2o2/README.md create mode 100755 node_modules/hapi/node_modules/h2o2/index.js create mode 100755 node_modules/hapi/node_modules/h2o2/lib/index.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/.npmignore create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/.travis.yml create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/CONTRIBUTING.md create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/LICENSE create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/README.md create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/examples/conditionalRequire.js create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/examples/customMessage.js create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/examples/multipleWhen.js create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/images/joi.png create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/images/validation.png create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/index.js create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/alternatives.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/any.js create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/array.js create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/binary.js create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/boolean.js create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/cast.js create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/date.js create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/errors.js create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/function.js create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/index.js create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/language.js create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/number.js create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/object.js create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/ref.js create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/string.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/.npmignore create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/.travis.yml create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/LICENSE create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/Makefile create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/README.md create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/dns-no-mx.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/index.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/lib/isemail.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/package.json create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/test/isemail.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/test/mocha.opts create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/LICENSE create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/README.md create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/ender.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/af.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ar-ma.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ar-sa.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ar-tn.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ar.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/az.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/be.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/bg.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/bn.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/bo.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/br.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/bs.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ca.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/cs.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/cv.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/cy.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/da.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/de-at.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/de.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/el.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/en-au.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/en-ca.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/en-gb.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/eo.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/es.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/et.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/eu.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/fa.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/fi.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/fo.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/fr-ca.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/fr.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/fy.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/gl.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/he.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/hi.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/hr.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/hu.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/hy-am.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/id.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/is.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/it.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ja.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ka.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/km.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ko.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/lb.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/lt.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/lv.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/mk.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ml.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/mr.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ms-my.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/my.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/nb.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ne.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/nl.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/nn.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/pl.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/pt-br.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/pt.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ro.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ru.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/sk.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/sl.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/sq.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/sr-cyrl.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/sr.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/sv.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ta.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/th.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/tl-ph.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/tr.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/tzm-latn.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/tzm.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/uk.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/uz.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/vi.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/zh-cn.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/zh-tw.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/min/locales.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/min/locales.min.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/min/moment-with-locales.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/min/moment-with-locales.min.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/min/moment.min.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/moment.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/package.js create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/package.json create mode 100644 node_modules/hapi/node_modules/h2o2/node_modules/joi/package.json create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/test/alternatives.js create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/test/any.js create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/test/array.js create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/test/binary.js create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/test/boolean.js create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/test/date.js create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/test/errors.js create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/test/function.js create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/test/helper.js create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/test/index.js create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/test/number.js create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/test/object.js create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/test/ref.js create mode 100755 node_modules/hapi/node_modules/h2o2/node_modules/joi/test/string.js create mode 100755 node_modules/hapi/node_modules/h2o2/package.json create mode 100755 node_modules/hapi/node_modules/h2o2/test/index.js create mode 100644 node_modules/hapi/node_modules/heavy/.npmignore create mode 100755 node_modules/hapi/node_modules/heavy/.travis.yml create mode 100755 node_modules/hapi/node_modules/heavy/CONTRIBUTING.md create mode 100755 node_modules/hapi/node_modules/heavy/LICENSE create mode 100755 node_modules/hapi/node_modules/heavy/Makefile create mode 100644 node_modules/hapi/node_modules/heavy/README.md create mode 100755 node_modules/hapi/node_modules/heavy/index.js create mode 100755 node_modules/hapi/node_modules/heavy/lib/index.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/.npmignore create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/.travis.yml create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/CONTRIBUTING.md create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/LICENSE create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/README.md create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/examples/conditionalRequire.js create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/examples/customMessage.js create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/examples/multipleWhen.js create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/images/joi.png create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/images/validation.png create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/index.js create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/lib/alternatives.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/lib/any.js create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/lib/array.js create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/lib/binary.js create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/lib/boolean.js create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/lib/cast.js create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/lib/date.js create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/lib/errors.js create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/lib/function.js create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/lib/index.js create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/lib/language.js create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/lib/number.js create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/lib/object.js create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/lib/ref.js create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/lib/string.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/.npmignore create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/.travis.yml create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/LICENSE create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/Makefile create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/README.md create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/dns-no-mx.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/index.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/lib/isemail.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/package.json create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/test/isemail.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/test/mocha.opts create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/LICENSE create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/README.md create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/ender.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/af.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ar-ma.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ar-sa.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ar-tn.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ar.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/az.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/be.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/bg.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/bn.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/bo.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/br.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/bs.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ca.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/cs.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/cv.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/cy.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/da.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/de-at.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/de.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/el.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/en-au.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/en-ca.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/en-gb.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/eo.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/es.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/et.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/eu.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/fa.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/fi.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/fo.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/fr-ca.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/fr.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/fy.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/gl.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/he.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/hi.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/hr.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/hu.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/hy-am.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/id.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/is.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/it.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ja.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ka.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/km.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ko.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/lb.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/lt.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/lv.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/mk.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ml.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/mr.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ms-my.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/my.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/nb.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ne.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/nl.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/nn.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/pl.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/pt-br.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/pt.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ro.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ru.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/sk.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/sl.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/sq.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/sr-cyrl.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/sr.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/sv.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ta.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/th.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/tl-ph.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/tr.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/tzm-latn.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/tzm.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/uk.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/uz.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/vi.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/zh-cn.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/zh-tw.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/min/locales.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/min/locales.min.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/min/moment-with-locales.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/min/moment-with-locales.min.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/min/moment.min.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/moment.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/package.js create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/package.json create mode 100644 node_modules/hapi/node_modules/heavy/node_modules/joi/package.json create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/test/alternatives.js create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/test/any.js create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/test/array.js create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/test/binary.js create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/test/boolean.js create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/test/date.js create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/test/errors.js create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/test/function.js create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/test/helper.js create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/test/index.js create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/test/number.js create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/test/object.js create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/test/ref.js create mode 100755 node_modules/hapi/node_modules/heavy/node_modules/joi/test/string.js create mode 100755 node_modules/hapi/node_modules/heavy/package.json create mode 100755 node_modules/hapi/node_modules/heavy/test/index.js create mode 100644 node_modules/hapi/node_modules/hoek/.npmignore create mode 100755 node_modules/hapi/node_modules/hoek/.travis.yml create mode 100644 node_modules/hapi/node_modules/hoek/CONTRIBUTING.md create mode 100755 node_modules/hapi/node_modules/hoek/LICENSE create mode 100755 node_modules/hapi/node_modules/hoek/Makefile create mode 100755 node_modules/hapi/node_modules/hoek/README.md create mode 100755 node_modules/hapi/node_modules/hoek/images/hoek.png create mode 100755 node_modules/hapi/node_modules/hoek/index.js create mode 100755 node_modules/hapi/node_modules/hoek/lib/escape.js create mode 100755 node_modules/hapi/node_modules/hoek/lib/index.js create mode 100644 node_modules/hapi/node_modules/hoek/package.json create mode 100755 node_modules/hapi/node_modules/hoek/test/escaper.js create mode 100755 node_modules/hapi/node_modules/hoek/test/index.js create mode 100644 node_modules/hapi/node_modules/hoek/test/modules/ignore.txt create mode 100755 node_modules/hapi/node_modules/hoek/test/modules/test1.js create mode 100755 node_modules/hapi/node_modules/hoek/test/modules/test2.js create mode 100755 node_modules/hapi/node_modules/hoek/test/modules/test3.js create mode 100644 node_modules/hapi/node_modules/inert/.npmignore create mode 100755 node_modules/hapi/node_modules/inert/.travis.yml create mode 100755 node_modules/hapi/node_modules/inert/CONTRIBUTING.md create mode 100755 node_modules/hapi/node_modules/inert/LICENSE create mode 100755 node_modules/hapi/node_modules/inert/Makefile create mode 100644 node_modules/hapi/node_modules/inert/README.md create mode 100755 node_modules/hapi/node_modules/inert/index.js create mode 100755 node_modules/hapi/node_modules/inert/lib/directory.js create mode 100755 node_modules/hapi/node_modules/inert/lib/file.js create mode 100755 node_modules/hapi/node_modules/inert/lib/index.js create mode 100644 node_modules/hapi/node_modules/inert/node_modules/lru-cache/.npmignore create mode 100644 node_modules/hapi/node_modules/inert/node_modules/lru-cache/CONTRIBUTORS create mode 100644 node_modules/hapi/node_modules/inert/node_modules/lru-cache/LICENSE create mode 100644 node_modules/hapi/node_modules/inert/node_modules/lru-cache/README.md create mode 100644 node_modules/hapi/node_modules/inert/node_modules/lru-cache/lib/lru-cache.js create mode 100644 node_modules/hapi/node_modules/inert/node_modules/lru-cache/package.json create mode 100644 node_modules/hapi/node_modules/inert/node_modules/lru-cache/test/basic.js create mode 100644 node_modules/hapi/node_modules/inert/node_modules/lru-cache/test/foreach.js create mode 100644 node_modules/hapi/node_modules/inert/node_modules/lru-cache/test/memory-leak.js create mode 100644 node_modules/hapi/node_modules/inert/package.json create mode 100755 node_modules/hapi/node_modules/inert/test/.hidden create mode 100755 node_modules/hapi/node_modules/inert/test/directory.js create mode 100755 node_modules/hapi/node_modules/inert/test/directory/.dot/index.html create mode 100755 node_modules/hapi/node_modules/inert/test/directory/index.html create mode 100644 node_modules/hapi/node_modules/inert/test/directory/index.js create mode 100755 node_modules/hapi/node_modules/inert/test/directory/invalid/index.html/do-not-delete create mode 100644 node_modules/hapi/node_modules/inert/test/directory/invalid/misc/do-not-delete create mode 100644 node_modules/hapi/node_modules/inert/test/directory/subdir/sub subdir=/subsubsubdir/test.txt create mode 100644 node_modules/hapi/node_modules/inert/test/directory/subdir/sub subdir=/test$.json create mode 100755 node_modules/hapi/node_modules/inert/test/directory/subdir/subsubdir/placeholder create mode 100755 node_modules/hapi/node_modules/inert/test/directory/subdir/test.txt create mode 100755 node_modules/hapi/node_modules/inert/test/file.js create mode 100755 node_modules/hapi/node_modules/inert/test/file/image.jpg create mode 100755 node_modules/hapi/node_modules/inert/test/file/image.png create mode 100755 node_modules/hapi/node_modules/inert/test/file/image.png.gz create mode 100644 node_modules/hapi/node_modules/inert/test/file/note.txt create mode 100644 node_modules/hapi/node_modules/iron/.npmignore create mode 100755 node_modules/hapi/node_modules/iron/.travis.yml create mode 100755 node_modules/hapi/node_modules/iron/LICENSE create mode 100755 node_modules/hapi/node_modules/iron/Makefile create mode 100755 node_modules/hapi/node_modules/iron/README.md create mode 100755 node_modules/hapi/node_modules/iron/images/iron.png create mode 100755 node_modules/hapi/node_modules/iron/images/logo.png create mode 100755 node_modules/hapi/node_modules/iron/index.js create mode 100755 node_modules/hapi/node_modules/iron/lib/index.js create mode 100755 node_modules/hapi/node_modules/iron/package.json create mode 100755 node_modules/hapi/node_modules/iron/test/index.js create mode 100644 node_modules/hapi/node_modules/items/.npmignore create mode 100755 node_modules/hapi/node_modules/items/.travis.yml create mode 100755 node_modules/hapi/node_modules/items/CONTRIBUTING.md create mode 100755 node_modules/hapi/node_modules/items/LICENSE create mode 100755 node_modules/hapi/node_modules/items/Makefile create mode 100755 node_modules/hapi/node_modules/items/README.md create mode 100755 node_modules/hapi/node_modules/items/index.js create mode 100755 node_modules/hapi/node_modules/items/lib/index.js create mode 100755 node_modules/hapi/node_modules/items/package.json create mode 100755 node_modules/hapi/node_modules/items/test/index.js create mode 100644 node_modules/hapi/node_modules/joi/.eslintignore create mode 100644 node_modules/hapi/node_modules/joi/.npmignore create mode 100755 node_modules/hapi/node_modules/joi/.travis.yml create mode 100755 node_modules/hapi/node_modules/joi/CONTRIBUTING.md create mode 100755 node_modules/hapi/node_modules/joi/LICENSE create mode 100755 node_modules/hapi/node_modules/joi/README.md create mode 100644 node_modules/hapi/node_modules/joi/examples/conditionalRequire.js create mode 100755 node_modules/hapi/node_modules/joi/examples/customMessage.js create mode 100755 node_modules/hapi/node_modules/joi/examples/multipleWhen.js create mode 100644 node_modules/hapi/node_modules/joi/generate-readme-toc.js create mode 100755 node_modules/hapi/node_modules/joi/images/joi.png create mode 100755 node_modules/hapi/node_modules/joi/images/validation.png create mode 100755 node_modules/hapi/node_modules/joi/index.js create mode 100755 node_modules/hapi/node_modules/joi/lib/alternatives.js create mode 100644 node_modules/hapi/node_modules/joi/lib/any.js create mode 100755 node_modules/hapi/node_modules/joi/lib/array.js create mode 100755 node_modules/hapi/node_modules/joi/lib/binary.js create mode 100755 node_modules/hapi/node_modules/joi/lib/boolean.js create mode 100755 node_modules/hapi/node_modules/joi/lib/cast.js create mode 100755 node_modules/hapi/node_modules/joi/lib/date.js create mode 100755 node_modules/hapi/node_modules/joi/lib/errors.js create mode 100755 node_modules/hapi/node_modules/joi/lib/function.js create mode 100755 node_modules/hapi/node_modules/joi/lib/index.js create mode 100755 node_modules/hapi/node_modules/joi/lib/language.js create mode 100755 node_modules/hapi/node_modules/joi/lib/number.js create mode 100755 node_modules/hapi/node_modules/joi/lib/object.js create mode 100755 node_modules/hapi/node_modules/joi/lib/ref.js create mode 100755 node_modules/hapi/node_modules/joi/lib/string.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/isemail/.npmignore create mode 100644 node_modules/hapi/node_modules/joi/node_modules/isemail/.travis.yml create mode 100644 node_modules/hapi/node_modules/joi/node_modules/isemail/LICENSE create mode 100644 node_modules/hapi/node_modules/joi/node_modules/isemail/Makefile create mode 100644 node_modules/hapi/node_modules/joi/node_modules/isemail/README.md create mode 100755 node_modules/hapi/node_modules/joi/node_modules/isemail/dns-no-mx.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/isemail/index.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/isemail/lib/isemail.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/isemail/package.json create mode 100644 node_modules/hapi/node_modules/joi/node_modules/isemail/test/isemail.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/isemail/test/mocha.opts create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/LICENSE create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/README.md create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/ender.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/af.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/ar-ma.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/ar-sa.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/ar-tn.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/ar.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/az.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/be.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/bg.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/bn.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/bo.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/br.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/bs.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/ca.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/cs.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/cv.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/cy.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/da.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/de-at.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/de.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/el.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/en-au.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/en-ca.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/en-gb.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/eo.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/es.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/et.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/eu.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/fa.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/fi.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/fo.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/fr-ca.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/fr.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/fy.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/gl.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/he.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/hi.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/hr.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/hu.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/hy-am.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/id.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/is.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/it.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/ja.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/ka.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/km.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/ko.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/lb.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/lt.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/lv.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/mk.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/ml.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/mr.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/ms-my.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/my.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/nb.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/ne.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/nl.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/nn.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/pl.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/pt-br.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/pt.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/ro.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/ru.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/sk.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/sl.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/sq.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/sr-cyrl.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/sr.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/sv.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/ta.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/th.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/tl-ph.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/tr.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/tzm-latn.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/tzm.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/uk.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/uz.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/vi.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/zh-cn.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/locale/zh-tw.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/min/locales.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/min/locales.min.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/min/moment-with-locales.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/min/moment-with-locales.min.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/min/moment.min.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/moment.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/package.js create mode 100644 node_modules/hapi/node_modules/joi/node_modules/moment/package.json create mode 100644 node_modules/hapi/node_modules/joi/package.json create mode 100755 node_modules/hapi/node_modules/joi/test/alternatives.js create mode 100755 node_modules/hapi/node_modules/joi/test/any.js create mode 100755 node_modules/hapi/node_modules/joi/test/array.js create mode 100755 node_modules/hapi/node_modules/joi/test/binary.js create mode 100755 node_modules/hapi/node_modules/joi/test/boolean.js create mode 100755 node_modules/hapi/node_modules/joi/test/date.js create mode 100755 node_modules/hapi/node_modules/joi/test/errors.js create mode 100755 node_modules/hapi/node_modules/joi/test/function.js create mode 100755 node_modules/hapi/node_modules/joi/test/helper.js create mode 100755 node_modules/hapi/node_modules/joi/test/index.js create mode 100755 node_modules/hapi/node_modules/joi/test/number.js create mode 100755 node_modules/hapi/node_modules/joi/test/object.js create mode 100755 node_modules/hapi/node_modules/joi/test/ref.js create mode 100755 node_modules/hapi/node_modules/joi/test/string.js create mode 100644 node_modules/hapi/node_modules/kilt/.npmignore create mode 100755 node_modules/hapi/node_modules/kilt/.travis.yml create mode 100755 node_modules/hapi/node_modules/kilt/AUTHORS create mode 100755 node_modules/hapi/node_modules/kilt/CONTRIBUTING.md create mode 100755 node_modules/hapi/node_modules/kilt/LICENSE create mode 100755 node_modules/hapi/node_modules/kilt/Makefile create mode 100755 node_modules/hapi/node_modules/kilt/README.md create mode 100755 node_modules/hapi/node_modules/kilt/index.js create mode 100755 node_modules/hapi/node_modules/kilt/lib/index.js create mode 100755 node_modules/hapi/node_modules/kilt/package.json create mode 100755 node_modules/hapi/node_modules/kilt/test/index.js create mode 100644 node_modules/hapi/node_modules/mimos/.npmignore create mode 100755 node_modules/hapi/node_modules/mimos/.travis.yml create mode 100755 node_modules/hapi/node_modules/mimos/CONTRIBUTING.md create mode 100755 node_modules/hapi/node_modules/mimos/LICENSE create mode 100755 node_modules/hapi/node_modules/mimos/Makefile create mode 100644 node_modules/hapi/node_modules/mimos/README.md create mode 100755 node_modules/hapi/node_modules/mimos/index.js create mode 100755 node_modules/hapi/node_modules/mimos/lib/index.js create mode 100644 node_modules/hapi/node_modules/mimos/node_modules/mime-db/HISTORY.md create mode 100644 node_modules/hapi/node_modules/mimos/node_modules/mime-db/LICENSE create mode 100644 node_modules/hapi/node_modules/mimos/node_modules/mime-db/README.md create mode 100644 node_modules/hapi/node_modules/mimos/node_modules/mime-db/db.json create mode 100644 node_modules/hapi/node_modules/mimos/node_modules/mime-db/index.js create mode 100644 node_modules/hapi/node_modules/mimos/node_modules/mime-db/package.json create mode 100755 node_modules/hapi/node_modules/mimos/package.json create mode 100755 node_modules/hapi/node_modules/mimos/test/index.js create mode 100644 node_modules/hapi/node_modules/peekaboo/.npmignore create mode 100755 node_modules/hapi/node_modules/peekaboo/.travis.yml create mode 100755 node_modules/hapi/node_modules/peekaboo/CONTRIBUTING.md create mode 100755 node_modules/hapi/node_modules/peekaboo/LICENSE create mode 100755 node_modules/hapi/node_modules/peekaboo/Makefile create mode 100644 node_modules/hapi/node_modules/peekaboo/README.md create mode 100755 node_modules/hapi/node_modules/peekaboo/index.js create mode 100755 node_modules/hapi/node_modules/peekaboo/lib/index.js create mode 100755 node_modules/hapi/node_modules/peekaboo/package.json create mode 100755 node_modules/hapi/node_modules/peekaboo/test/index.js create mode 100644 node_modules/hapi/node_modules/qs/.jshintignore create mode 100644 node_modules/hapi/node_modules/qs/.jshintrc create mode 100644 node_modules/hapi/node_modules/qs/.npmignore create mode 100644 node_modules/hapi/node_modules/qs/.travis.yml create mode 100644 node_modules/hapi/node_modules/qs/CHANGELOG.md create mode 100644 node_modules/hapi/node_modules/qs/CONTRIBUTING.md create mode 100755 node_modules/hapi/node_modules/qs/LICENSE create mode 100644 node_modules/hapi/node_modules/qs/Makefile create mode 100755 node_modules/hapi/node_modules/qs/README.md create mode 100644 node_modules/hapi/node_modules/qs/index.js create mode 100755 node_modules/hapi/node_modules/qs/lib/index.js create mode 100755 node_modules/hapi/node_modules/qs/lib/parse.js create mode 100755 node_modules/hapi/node_modules/qs/lib/stringify.js create mode 100755 node_modules/hapi/node_modules/qs/lib/utils.js create mode 100644 node_modules/hapi/node_modules/qs/package.json create mode 100755 node_modules/hapi/node_modules/qs/test/parse.js create mode 100755 node_modules/hapi/node_modules/qs/test/stringify.js create mode 100644 node_modules/hapi/node_modules/shot/.npmignore create mode 100755 node_modules/hapi/node_modules/shot/.travis.yml create mode 100644 node_modules/hapi/node_modules/shot/CONTRIBUTING.md create mode 100755 node_modules/hapi/node_modules/shot/LICENSE create mode 100755 node_modules/hapi/node_modules/shot/README.md create mode 100755 node_modules/hapi/node_modules/shot/examples/http.js create mode 100755 node_modules/hapi/node_modules/shot/images/shot.png create mode 100755 node_modules/hapi/node_modules/shot/index.js create mode 100755 node_modules/hapi/node_modules/shot/lib/index.js create mode 100644 node_modules/hapi/node_modules/shot/package.json create mode 100755 node_modules/hapi/node_modules/shot/test/index.js create mode 100644 node_modules/hapi/node_modules/statehood/.npmignore create mode 100755 node_modules/hapi/node_modules/statehood/.travis.yml create mode 100755 node_modules/hapi/node_modules/statehood/CONTRIBUTING.md create mode 100755 node_modules/hapi/node_modules/statehood/LICENSE create mode 100755 node_modules/hapi/node_modules/statehood/Makefile create mode 100644 node_modules/hapi/node_modules/statehood/README.md create mode 100755 node_modules/hapi/node_modules/statehood/index.js create mode 100755 node_modules/hapi/node_modules/statehood/lib/index.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/.npmignore create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/.travis.yml create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/CONTRIBUTING.md create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/LICENSE create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/README.md create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/examples/conditionalRequire.js create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/examples/customMessage.js create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/examples/multipleWhen.js create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/images/joi.png create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/images/validation.png create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/index.js create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/lib/alternatives.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/lib/any.js create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/lib/array.js create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/lib/binary.js create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/lib/boolean.js create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/lib/cast.js create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/lib/date.js create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/lib/errors.js create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/lib/function.js create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/lib/index.js create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/lib/language.js create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/lib/number.js create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/lib/object.js create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/lib/ref.js create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/lib/string.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/isemail/.npmignore create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/isemail/.travis.yml create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/isemail/LICENSE create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/isemail/Makefile create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/isemail/README.md create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/isemail/dns-no-mx.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/isemail/index.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/isemail/lib/isemail.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/isemail/package.json create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/isemail/test/isemail.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/isemail/test/mocha.opts create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/LICENSE create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/README.md create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/ender.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/af.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/ar-ma.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/ar-sa.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/ar-tn.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/ar.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/az.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/be.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/bg.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/bn.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/bo.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/br.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/bs.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/ca.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/cs.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/cv.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/cy.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/da.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/de-at.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/de.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/el.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/en-au.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/en-ca.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/en-gb.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/eo.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/es.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/et.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/eu.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/fa.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/fi.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/fo.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/fr-ca.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/fr.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/fy.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/gl.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/he.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/hi.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/hr.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/hu.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/hy-am.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/id.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/is.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/it.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/ja.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/ka.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/km.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/ko.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/lb.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/lt.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/lv.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/mk.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/ml.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/mr.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/ms-my.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/my.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/nb.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/ne.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/nl.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/nn.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/pl.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/pt-br.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/pt.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/ro.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/ru.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/sk.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/sl.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/sq.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/sr-cyrl.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/sr.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/sv.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/ta.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/th.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/tl-ph.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/tr.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/tzm-latn.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/tzm.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/uk.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/uz.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/vi.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/zh-cn.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/locale/zh-tw.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/min/locales.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/min/locales.min.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/min/moment-with-locales.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/min/moment-with-locales.min.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/min/moment.min.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/moment.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/package.js create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/node_modules/moment/package.json create mode 100644 node_modules/hapi/node_modules/statehood/node_modules/joi/package.json create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/test/alternatives.js create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/test/any.js create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/test/array.js create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/test/binary.js create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/test/boolean.js create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/test/date.js create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/test/errors.js create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/test/function.js create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/test/helper.js create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/test/index.js create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/test/number.js create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/test/object.js create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/test/ref.js create mode 100755 node_modules/hapi/node_modules/statehood/node_modules/joi/test/string.js create mode 100755 node_modules/hapi/node_modules/statehood/package.json create mode 100755 node_modules/hapi/node_modules/statehood/test/index.js create mode 100644 node_modules/hapi/node_modules/subtext/.npmignore create mode 100755 node_modules/hapi/node_modules/subtext/.travis.yml create mode 100755 node_modules/hapi/node_modules/subtext/CONTRIBUTING.md create mode 100644 node_modules/hapi/node_modules/subtext/LICENSE create mode 100755 node_modules/hapi/node_modules/subtext/Makefile create mode 100644 node_modules/hapi/node_modules/subtext/README.md create mode 100644 node_modules/hapi/node_modules/subtext/index.js create mode 100755 node_modules/hapi/node_modules/subtext/lib/index.js create mode 100644 node_modules/hapi/node_modules/subtext/node_modules/content/.npmignore create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/content/.travis.yml create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/content/CONTRIBUTING.md create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/content/LICENSE create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/content/Makefile create mode 100644 node_modules/hapi/node_modules/subtext/node_modules/content/README.md create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/content/index.js create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/content/lib/index.js create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/content/package.json create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/content/test/index.js create mode 100644 node_modules/hapi/node_modules/subtext/node_modules/pez/.npmignore create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/pez/.travis.yml create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/pez/CONTRIBUTING.md create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/pez/LICENSE create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/pez/Makefile create mode 100644 node_modules/hapi/node_modules/subtext/node_modules/pez/README.md create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/pez/index.js create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/pez/lib/index.js create mode 100644 node_modules/hapi/node_modules/subtext/node_modules/pez/node_modules/b64/.npmignore create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/pez/node_modules/b64/.travis.yml create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/pez/node_modules/b64/CONTRIBUTING.md create mode 100644 node_modules/hapi/node_modules/subtext/node_modules/pez/node_modules/b64/LICENSE create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/pez/node_modules/b64/Makefile create mode 100644 node_modules/hapi/node_modules/subtext/node_modules/pez/node_modules/b64/README.md create mode 100644 node_modules/hapi/node_modules/subtext/node_modules/pez/node_modules/b64/index.js create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/pez/node_modules/b64/lib/index.js create mode 100644 node_modules/hapi/node_modules/subtext/node_modules/pez/node_modules/b64/package.json create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/pez/node_modules/b64/test/index.js create mode 100644 node_modules/hapi/node_modules/subtext/node_modules/pez/node_modules/nigel/.npmignore create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/pez/node_modules/nigel/.travis.yml create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/pez/node_modules/nigel/CONTRIBUTING.md create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/pez/node_modules/nigel/LICENSE create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/pez/node_modules/nigel/Makefile create mode 100644 node_modules/hapi/node_modules/subtext/node_modules/pez/node_modules/nigel/README.md create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/pez/node_modules/nigel/index.js create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/pez/node_modules/nigel/lib/index.js create mode 100644 node_modules/hapi/node_modules/subtext/node_modules/pez/node_modules/nigel/node_modules/vise/.npmignore create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/pez/node_modules/nigel/node_modules/vise/.travis.yml create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/pez/node_modules/nigel/node_modules/vise/CONTRIBUTING.md create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/pez/node_modules/nigel/node_modules/vise/LICENSE create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/pez/node_modules/nigel/node_modules/vise/Makefile create mode 100644 node_modules/hapi/node_modules/subtext/node_modules/pez/node_modules/nigel/node_modules/vise/README.md create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/pez/node_modules/nigel/node_modules/vise/index.js create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/pez/node_modules/nigel/node_modules/vise/lib/index.js create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/pez/node_modules/nigel/node_modules/vise/package.json create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/pez/node_modules/nigel/node_modules/vise/test/index.js create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/pez/node_modules/nigel/package.json create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/pez/node_modules/nigel/test/index.js create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/pez/package.json create mode 100644 node_modules/hapi/node_modules/subtext/node_modules/pez/test/files/blank.gif create mode 100644 node_modules/hapi/node_modules/subtext/node_modules/pez/test/files/file1.txt create mode 100644 node_modules/hapi/node_modules/subtext/node_modules/pez/test/files/image.png create mode 100644 node_modules/hapi/node_modules/subtext/node_modules/pez/test/files/large.png create mode 100755 node_modules/hapi/node_modules/subtext/node_modules/pez/test/index.js create mode 100644 node_modules/hapi/node_modules/subtext/package.json create mode 100755 node_modules/hapi/node_modules/subtext/test/file/image.jpg create mode 100755 node_modules/hapi/node_modules/subtext/test/index.js create mode 100644 node_modules/hapi/node_modules/topo/.npmignore create mode 100755 node_modules/hapi/node_modules/topo/.travis.yml create mode 100755 node_modules/hapi/node_modules/topo/CONTRIBUTING.md create mode 100755 node_modules/hapi/node_modules/topo/LICENSE create mode 100755 node_modules/hapi/node_modules/topo/Makefile create mode 100755 node_modules/hapi/node_modules/topo/README.md create mode 100755 node_modules/hapi/node_modules/topo/index.js create mode 100755 node_modules/hapi/node_modules/topo/lib/index.js create mode 100755 node_modules/hapi/node_modules/topo/package.json create mode 100755 node_modules/hapi/node_modules/topo/test/index.js create mode 100644 node_modules/hapi/node_modules/vision/.npmignore create mode 100755 node_modules/hapi/node_modules/vision/.travis.yml create mode 100755 node_modules/hapi/node_modules/vision/CONTRIBUTING.md create mode 100755 node_modules/hapi/node_modules/vision/LICENSE create mode 100755 node_modules/hapi/node_modules/vision/Makefile create mode 100644 node_modules/hapi/node_modules/vision/README.md create mode 100755 node_modules/hapi/node_modules/vision/examples/cms/_pages/.placeholder create mode 100644 node_modules/hapi/node_modules/vision/examples/cms/_pages/Test create mode 100755 node_modules/hapi/node_modules/vision/examples/cms/pages.js create mode 100755 node_modules/hapi/node_modules/vision/examples/cms/server.js create mode 100755 node_modules/hapi/node_modules/vision/examples/cms/views/create.html create mode 100755 node_modules/hapi/node_modules/vision/examples/cms/views/edit.html create mode 100755 node_modules/hapi/node_modules/vision/examples/cms/views/index.html create mode 100755 node_modules/hapi/node_modules/vision/examples/cms/views/layout.html create mode 100755 node_modules/hapi/node_modules/vision/examples/cms/views/page.html create mode 100755 node_modules/hapi/node_modules/vision/examples/cms/views/partials/footer.html create mode 100755 node_modules/hapi/node_modules/vision/examples/cms/views/partials/nav.html create mode 100755 node_modules/hapi/node_modules/vision/examples/handlebars/basic.js create mode 100755 node_modules/hapi/node_modules/vision/examples/handlebars/layout.js create mode 100755 node_modules/hapi/node_modules/vision/examples/handlebars/partials.js create mode 100755 node_modules/hapi/node_modules/vision/examples/handlebars/templates/basic/index.html create mode 100755 node_modules/hapi/node_modules/vision/examples/handlebars/templates/layout.html create mode 100755 node_modules/hapi/node_modules/vision/examples/handlebars/templates/withLayout/index.html create mode 100755 node_modules/hapi/node_modules/vision/examples/handlebars/templates/withPartials/footer.html create mode 100755 node_modules/hapi/node_modules/vision/examples/handlebars/templates/withPartials/header.html create mode 100755 node_modules/hapi/node_modules/vision/examples/handlebars/templates/withPartials/index.html create mode 100755 node_modules/hapi/node_modules/vision/examples/jade/index.js create mode 100755 node_modules/hapi/node_modules/vision/examples/jade/templates/about.jade create mode 100755 node_modules/hapi/node_modules/vision/examples/jade/templates/includes/foot.jade create mode 100755 node_modules/hapi/node_modules/vision/examples/jade/templates/includes/head.jade create mode 100755 node_modules/hapi/node_modules/vision/examples/jade/templates/index.jade create mode 100755 node_modules/hapi/node_modules/vision/examples/jade/templates/layout.jade create mode 100755 node_modules/hapi/node_modules/vision/examples/mixed/index.js create mode 100755 node_modules/hapi/node_modules/vision/examples/mixed/templates/handlebars.html create mode 100755 node_modules/hapi/node_modules/vision/examples/mixed/templates/index.jade create mode 100755 node_modules/hapi/node_modules/vision/index.js create mode 100755 node_modules/hapi/node_modules/vision/lib/index.js create mode 100755 node_modules/hapi/node_modules/vision/lib/manager.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/.npmignore create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/.travis.yml create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/CONTRIBUTING.md create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/LICENSE create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/README.md create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/examples/conditionalRequire.js create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/examples/customMessage.js create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/examples/multipleWhen.js create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/images/joi.png create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/images/validation.png create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/index.js create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/lib/alternatives.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/lib/any.js create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/lib/array.js create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/lib/binary.js create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/lib/boolean.js create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/lib/cast.js create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/lib/date.js create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/lib/errors.js create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/lib/function.js create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/lib/index.js create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/lib/language.js create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/lib/number.js create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/lib/object.js create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/lib/ref.js create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/lib/string.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/.npmignore create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/.travis.yml create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/LICENSE create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/Makefile create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/README.md create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/dns-no-mx.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/index.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/lib/isemail.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/package.json create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/test/isemail.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/test/mocha.opts create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/LICENSE create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/README.md create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/ender.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/af.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ar-ma.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ar-sa.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ar-tn.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ar.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/az.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/be.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/bg.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/bn.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/bo.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/br.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/bs.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ca.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/cs.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/cv.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/cy.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/da.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/de-at.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/de.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/el.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/en-au.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/en-ca.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/en-gb.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/eo.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/es.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/et.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/eu.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fa.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fi.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fo.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fr-ca.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fr.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fy.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/gl.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/he.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/hi.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/hr.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/hu.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/hy-am.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/id.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/is.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/it.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ja.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ka.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/km.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ko.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/lb.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/lt.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/lv.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/mk.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ml.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/mr.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ms-my.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/my.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/nb.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ne.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/nl.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/nn.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/pl.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/pt-br.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/pt.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ro.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ru.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sk.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sl.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sq.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sr-cyrl.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sr.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sv.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ta.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/th.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/tl-ph.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/tr.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/tzm-latn.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/tzm.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/uk.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/uz.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/vi.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/zh-cn.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/zh-tw.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/locales.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/locales.min.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/moment-with-locales.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/moment-with-locales.min.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/moment.min.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/moment.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/package.js create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/package.json create mode 100644 node_modules/hapi/node_modules/vision/node_modules/joi/package.json create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/test/alternatives.js create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/test/any.js create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/test/array.js create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/test/binary.js create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/test/boolean.js create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/test/date.js create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/test/errors.js create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/test/function.js create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/test/helper.js create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/test/index.js create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/test/number.js create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/test/object.js create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/test/ref.js create mode 100755 node_modules/hapi/node_modules/vision/node_modules/joi/test/string.js create mode 100755 node_modules/hapi/node_modules/vision/package.json create mode 100755 node_modules/hapi/node_modules/vision/test/index.js create mode 100755 node_modules/hapi/node_modules/vision/test/manager.js create mode 100755 node_modules/hapi/node_modules/vision/test/templates/badlayout.html create mode 100755 node_modules/hapi/node_modules/vision/test/templates/invalid/badmustache.html create mode 100755 node_modules/hapi/node_modules/vision/test/templates/invalid/layout.html create mode 100755 node_modules/hapi/node_modules/vision/test/templates/invalid/test.html create mode 100755 node_modules/hapi/node_modules/vision/test/templates/layout.html create mode 100755 node_modules/hapi/node_modules/vision/test/templates/layout/elsewhere.html create mode 100755 node_modules/hapi/node_modules/vision/test/templates/otherLayout.html create mode 100755 node_modules/hapi/node_modules/vision/test/templates/plugin/test.html create mode 100755 node_modules/hapi/node_modules/vision/test/templates/valid/handler.html create mode 100755 node_modules/hapi/node_modules/vision/test/templates/valid/helpers/.hidden.js create mode 100755 node_modules/hapi/node_modules/vision/test/templates/valid/helpers/ignore.js create mode 100755 node_modules/hapi/node_modules/vision/test/templates/valid/helpers/tools/lowercase.js create mode 100755 node_modules/hapi/node_modules/vision/test/templates/valid/helpers/uppercase.js create mode 100644 node_modules/hapi/node_modules/vision/test/templates/valid/index.jade create mode 100644 node_modules/hapi/node_modules/vision/test/templates/valid/layout.jade create mode 100644 node_modules/hapi/node_modules/vision/test/templates/valid/options.html create mode 100644 node_modules/hapi/node_modules/vision/test/templates/valid/partials/.ignore.html create mode 100755 node_modules/hapi/node_modules/vision/test/templates/valid/partials/nav.html create mode 100755 node_modules/hapi/node_modules/vision/test/templates/valid/partials/nested/deep/nav.html create mode 100755 node_modules/hapi/node_modules/vision/test/templates/valid/partials/nested/nav.html create mode 100755 node_modules/hapi/node_modules/vision/test/templates/valid/test.html create mode 100644 node_modules/hapi/node_modules/vision/test/templates/valid/test.jade create mode 100755 node_modules/hapi/node_modules/vision/test/templates/valid/testContext.html create mode 100755 node_modules/hapi/node_modules/vision/test/templates/valid/testHelpers.html create mode 100755 node_modules/hapi/node_modules/vision/test/templates/valid/testMulti.jade create mode 100755 node_modules/hapi/node_modules/vision/test/templates/valid/testPartials.html create mode 100755 node_modules/hapi/node_modules/vision/test/templates/valid/testPartialsName.html create mode 100644 node_modules/hapi/node_modules/wreck/.npmignore create mode 100755 node_modules/hapi/node_modules/wreck/.travis.yml create mode 100644 node_modules/hapi/node_modules/wreck/CONTRIBUTING.md create mode 100755 node_modules/hapi/node_modules/wreck/LICENSE create mode 100755 node_modules/hapi/node_modules/wreck/Makefile create mode 100755 node_modules/hapi/node_modules/wreck/README.md create mode 100755 node_modules/hapi/node_modules/wreck/images/wreck.png create mode 100755 node_modules/hapi/node_modules/wreck/index.js create mode 100755 node_modules/hapi/node_modules/wreck/lib/index.js create mode 100644 node_modules/hapi/node_modules/wreck/lib/payload.js create mode 100644 node_modules/hapi/node_modules/wreck/lib/recorder.js create mode 100644 node_modules/hapi/node_modules/wreck/lib/tap.js create mode 100644 node_modules/hapi/node_modules/wreck/package.json create mode 100755 node_modules/hapi/node_modules/wreck/test/index.js create mode 100755 node_modules/hapi/npm-shrinkwrap.json create mode 100755 node_modules/hapi/package.json create mode 100755 node_modules/hapi/test/.hidden create mode 100755 node_modules/hapi/test/auth.js create mode 100755 node_modules/hapi/test/connection.js create mode 100755 node_modules/hapi/test/file/image.jpg create mode 100755 node_modules/hapi/test/file/image.png create mode 100755 node_modules/hapi/test/file/image.png.gz create mode 100644 node_modules/hapi/test/file/note.txt create mode 100755 node_modules/hapi/test/handler.js create mode 100755 node_modules/hapi/test/methods.js create mode 100755 node_modules/hapi/test/payload.js create mode 100755 node_modules/hapi/test/plugin.js create mode 100755 node_modules/hapi/test/protect.js create mode 100755 node_modules/hapi/test/reply.js create mode 100755 node_modules/hapi/test/request.js create mode 100755 node_modules/hapi/test/response.js create mode 100755 node_modules/hapi/test/route.js create mode 100755 node_modules/hapi/test/security.js create mode 100755 node_modules/hapi/test/server.js create mode 100755 node_modules/hapi/test/state.js create mode 100755 node_modules/hapi/test/templates/plugin/test.html create mode 100755 node_modules/hapi/test/templates/test.html create mode 100755 node_modules/hapi/test/transmit.js create mode 100755 node_modules/hapi/test/validation.js create mode 100644 node_modules/hoek/.npmignore create mode 100755 node_modules/hoek/.travis.yml create mode 100644 node_modules/hoek/CONTRIBUTING.md create mode 100755 node_modules/hoek/LICENSE create mode 100755 node_modules/hoek/Makefile create mode 100755 node_modules/hoek/README.md create mode 100755 node_modules/hoek/images/hoek.png create mode 100755 node_modules/hoek/index.js create mode 100755 node_modules/hoek/lib/escape.js create mode 100755 node_modules/hoek/lib/index.js create mode 100644 node_modules/hoek/package.json create mode 100755 node_modules/hoek/test/escaper.js create mode 100755 node_modules/hoek/test/index.js create mode 100644 node_modules/hoek/test/modules/ignore.txt create mode 100755 node_modules/hoek/test/modules/test1.js create mode 100755 node_modules/hoek/test/modules/test2.js create mode 100755 node_modules/hoek/test/modules/test3.js create mode 100644 package.json diff --git a/lib/index.js b/lib/index.js new file mode 100644 index 0000000..bd26d1f --- /dev/null +++ b/lib/index.js @@ -0,0 +1,23 @@ +var Hapi = require('hapi'); +var Hoek = require('hoek'); +var internals = require('../package.json'); + +var server = new Hapi.Server(); + +server.connection({ port: 8000 }); + +server.route({ + method: 'GET', + path: '/version', + handler: function (request, reply) { + response = { + version: internals.version, + } + reply(response); + } +}); + +server.start(function (err) { + Hoek.assert(!err, err); + console.log('Hapi server started!', server.info.uri); +}); \ No newline at end of file diff --git a/node_modules/hapi/.npmignore b/node_modules/hapi/.npmignore new file mode 100644 index 0000000..12db069 --- /dev/null +++ b/node_modules/hapi/.npmignore @@ -0,0 +1,15 @@ +.idea +*.iml +npm-debug.log +dump.rdb +node_modules +results.tap +results.xml +config.json +.DS_Store +*/.DS_Store +*/*/.DS_Store +._* +*/._* +*/*/._* +coverage.* diff --git a/node_modules/hapi/.travis.yml b/node_modules/hapi/.travis.yml new file mode 100755 index 0000000..f502178 --- /dev/null +++ b/node_modules/hapi/.travis.yml @@ -0,0 +1,6 @@ +language: node_js + +node_js: + - 0.10 + - 0.12 + - iojs diff --git a/node_modules/hapi/API.md b/node_modules/hapi/API.md new file mode 100755 index 0000000..fc935c8 --- /dev/null +++ b/node_modules/hapi/API.md @@ -0,0 +1,3423 @@ +# 8.4.x API Reference + +- [Server](#server) + - [`new Server([options])`](#new-serveroptions) + - [Server properties](#server-properties) + - [`server.app`](#serverapp) + - [`server.connections`](#serverconnections) + - [`server.info`](#serverinfo) + - [`server.load`](#serverload) + - [`server.listener`](#serverlistener) + - [`server.methods`](#servermethods) + - [`server.mime`](#servermime) + - [`server.plugins`](#serverplugins) + - [`server.realm`](#serverrealm) + - [`server.root`](#serverroot) + - [`server.settings`](#serversettings) + - [`server.version`](#serverversion) + - [`server.after(method, [dependencies])`](#serveraftermethod-dependencies) + - [`server.auth.default(options)`](#serverauthdefaultoptions) + - [`server.auth.scheme(name, scheme)`](#serverauthschemename-scheme) + - [`server.auth.strategy(name, scheme, [mode], [options])`](#serverauthstrategyname-scheme-mode-options) + - [`server.auth.test(strategy, request, next)`](#serverauthteststrategy-request-next) + - [`server.bind(context)`](#serverbindcontext) + - [`server.cache(options)`](#servercacheoptions) + - [`server.connection([options])`](#serverconnectionoptions) + - [`server.decorate(type, property, method)`](#serverdecoratetype-property-method) + - [`server.dependency(dependencies, [after])`](#serverdependencydependencies-after) + - [`server.expose(key, value)`](#serverexposekey-value) + - [`server.expose(obj)`](#serverexposeobj) + - [`server.ext(event, method, [options])`](#serverextevent-method-options) + - [`server.handler(name, method)`](#serverhandlername-method) + - [`server.inject(options, callback)`](#serverinjectoptions-callback) + - [`server.log(tags, [data, [timestamp]])`](#serverlogtags-data-timestamp) + - [`server.lookup(id)`](#serverlookupid) + - [`server.match(method, path, [host])`](#servermatchmethod-path-host) + - [`server.method(name, method, [options])`](#servermethodname-method-options) + - [`server.method(methods)`](#servermethodmethods) + - [`server.path(relativeTo)`](#serverpathrelativeto) + - [`server.register(plugins, [options], callback)`](#serverregisterplugins-options-callback) + - [`server.render(template, context, [options], callback)`](#serverrendertemplate-context-options-callback) + - [`server.route(options)`](#serverrouteoptions) + - [`server.select(labels)`](#serverselectlabels) + - [`server.start([callback])`](#serverstartcallback) + - [`server.state(name, [options])`](#serverstatename-options) + - [`server.stop([options], [callback])`](#serverstopoptions-callback) + - [`server.table([host])`](#servertablehost) + - [`server.views(options)`](#serverviewsoptions) + - [Server events](#server-events) + - [Internal events](#internal-events) + - [Request logs](#request-logs) + - [Server logs](#server-logs) +- [Plugins](#plugins) +- [Requests](#requests) + - [Request lifecycle](#request-lifecycle) + - [Route configuration](#route-configuration) + - [Route options](#route-options) + - [Route public interface](#route-public-interface) + - [Path parameters](#path-parameters) + - [Path matching order](#path-matching-order) + - [Catch all route](#catch-all-route) + - [Route handler](#route-handler) + - [Built-in handlers](#built-in-handlers) + - [Route prerequisites](#route-prerequisites) + - [Request object](#request-object) + - [Request properties](#request-properties) + - [`request.setUrl(url)`](#requestseturlurl) + - [`request.setMethod(method)`](#requestsetmethodmethod) + - [`request.log(tags, [data, [timestamp]])`](#requestlogtags-data-timestamp) + - [`request.getLog([tags], [internal])`](#requestgetlogtags-internal) + - [`request.tail([name])`](#requesttailname) + - [Request events](#request-events) +- [Reply interface](#reply-interface) + - [`reply([err], [result])`](#replyerr-result) + - [Response object](#response-object) + - [Response Object Redirect Methods](#response-object-redirect-methods) + - [Response events](#response-events) + - [Error response](#error-response) + - [Error transformation](#error-transformation) + - [Flow control](#flow-control) + - [`reply.continue([data])`](#replycontinuedata) + - [`reply.file(path, [options])`](#replyfilepath-options) + - [`reply.view(template, [context, [options]])`](#replyviewtemplate-context-options) + - [`reply.close([options])`](#replycloseoptions) + - [`reply.proxy(options)`](#replyproxyoptions) + - [`reply.redirect(uri)`](#replyredirecturi) + +## Server + +The `Server` object is the main application container. The server manages all incoming connections +along with all the facilities provided by the framework. A server can contain more than one +connection (e.g. listen to port `80` and `8080`). + +### `new Server([options])` + +Creates a new `Server` object where: +- `options` - optional configuration: + - `app` - application-specific configuration which can later be accessed via + `server.settings.app`. Note the difference between `server.settings.app` which is + used to store static configuration values and [`server.app`](#serverapp) which is meant for + storing run-time state. Defaults to `{}`. + + - `cache` - sets up server-side caching. Every server + includes a default cache for storing application state. By default, a simple memory-based + cache is created which has limited capacity and capabilities. **hapi** uses + [**catbox**](https://github.com/hapijs/catbox) for its cache which includes support for + common storage solutions (e.g. Redis, MongoDB, Memcached, and Riak). Caching is only utilized + if methods and [plugins](#plugins) explicitly store their state in the cache. The server + cache configuration only defines the storage container itself. `cache` can be assigned: + - a prototype function (usually obtained by calling `require()` on a **catbox** strategy + such as `require('catbox-redis')`). + - a configuration object with the following options: + - `engine` - a prototype function or **catbox** engine object. + - `name` - an identifier used later when provisioning or configuring caching for + [server methods](#servermethodname-method-options) or [plugins](#plugins). Each cache + name must be unique. A single item may omit the `name` option which defines the + default cache. If every cache includes a `name`, a default memory cache is provisions + as well. + - `shared` - if `true`, allows multiple cache users to share the same segment (e.g. + multiple methods using the same cache storage container). Default to `false`. + - other options passed to the **catbox** strategy used. + - an array of the above object for configuring multiple cache instances, each with a unique + name. When an array of objects is provided, multiple cache connections are established + and each array item (except one) must include a `name`. + + - `connections` - sets the default connections + configuration which can be overridden by each connection where: + + - `app` - application-specific connection configuration which can be accessed via + `connection.settings.app`. Provides a safe place to store application configuration + without potential conflicts with the framework internals. Should not be used to configure + [plugins](#plugins) which should use `plugins[name]`. Note the difference between + `connection.settings.app` which is used to store configuration values and + `connection.app` which is meant for storing run-time state. + + - `load` - connection load limits configuration where: + - `maxHeapUsedBytes` - maximum V8 heap size over which incoming requests are rejected + with an HTTP Server Timeout (503) response. Defaults to `0` (no limit). + - `maxRssBytes` - maximum process RSS size over which incoming requests are rejected + with an HTTP Server Timeout (503) response. Defaults to `0` (no limit). + - `maxEventLoopDelay` - maximum event loop delay duration in milliseconds over which + incoming requests are rejected with an HTTP Server Timeout (503) response. Defaults + to `0` (no limit). + + - `plugins` - plugin-specific configuration which can later be accessed via + `connection.settings.plugins`. Provides a place to store and pass connection-specific + plugin configuration. `plugins` is an object where each key is a plugin name and the + value is the configuration. Note the difference between `connection.settings.plugins` + which is used to store configuration values and `connection.plugins` which is meant for + storing run-time state. + + - `router` - controls how incoming request URIs are + matched against the routing table: + - `isCaseSensitive` - determines whether the paths '/example' and '/EXAMPLE' are + considered different resources. Defaults to `true`. + - `stripTrailingSlash` - removes trailing slashes on incoming paths. Defaults to + `false`. + + - `routes` - a [route options](#route-options) object used to set the default configuration + for every route. + + - `state` - sets the default configuration for every state (cookie) set explicitly via + [`server.state()`](#serverstatename-options) or implicitly (without definition) using + the [state configuration](#serverstatename-options) object. + + - `debug` - determines which logged events are sent to the console (this should only be used + for development and does not affect which events are actually logged internally and + recorded). Set to `false` to disable all console logging, or to an object with: + - `log` - a string array of server log tags to be displayed via `console.error()` when + the events are logged via [`server.log()`](#serverlogtags-data-timestamp) as well as + internally generated [server logs](#server-logs). For example, to display all errors, + set the option to `['error']`. To turn off all console debug messages set it to `false`. + Defaults to uncaught errors thrown in external code (these errors are handled + automatically and result in an Internal Server Error response) or runtime errors due to + developer error. + - `request` - a string array of request log tags to be displayed via `console.error()` when + the events are logged via [`request.log()`](#requestlogtags-data-timestamp) as well as + internally generated [request logs](#request-logs). For example, to display all errors, + set the option to `['error']`. To turn off all console debug messages set it to `false`. + Defaults to uncaught errors thrown in external code (these errors are handled + automatically and result in an Internal Server Error response) or runtime errors due to + developer error. + + - `files` - file system related settings: + - `etagsCacheMaxSize` - sets the maximum number of file etag hash values stored in the + etags cache. Defaults to `10000`. + + - `load` - process load monitoring where: + - `sampleInterval` - the frequency of sampling in milliseconds. Defaults to `0` (no + sampling). + + - `mime` - options passed to the [**mimos**](https://github.com/hapijs/mimos) module when + generating the mime database used by the server and accessed via + [`server.mime`](#servermime). + + - `minimal` - if `true`, does not load the [**inert**](https://github.com/hapijs/inert) (file + and directory support), [**h2o2**](https://github.com/hapijs/h2o2) (proxy support), and + [**vision**](https://github.com/hapijs/vision) (views support) plugins automatically. The + plugins can be loaded manually after construction. Defaults to `false` (plugins loaded). + + - `plugins` - plugin-specific configuration which can later be accessed via + `server.settings.plugins`. `plugins` is an object where each key is a plugin name and the + value is the configuration. Note the difference between `server.settings.plugins` which is + used to store static configuration values and [`server.plugins`](#serverplugins) which is + meant for storing run-time state. Defaults to `{}`. + +Note that the `options` object is deeply cloned and cannot contain any values that are unsafe to +perform deep copy on. + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server({ + cache: require('catbox-redis'), + load: { + sampleInterval: 1000 + } +}); +``` + +### Server properties + +#### `server.app` + +Provides a safe place to store server-specific run-time application data without potential +conflicts with the framework internals. The data can be accessed whenever the server is +accessible. Initialized with an empty object. + +```js +var Hapi = require('hapi'); +server = new Hapi.Server(); +server.app.key = 'value'; + +var handler = function (request, reply) { + + return reply(request.server.app.key); +}; +``` + +#### `server.connections` + +An array containing the server's connections. When the server object is returned from +[`server.select()`](#serverselectlabels), the `connections` array only includes the connections +matching the selection criteria. + +```js +var server = new Hapi.Server(); +server.connection({ port: 80, labels: 'a' }); +server.connection({ port: 8080, labels: 'b' }); + +// server.connections.length === 2 + +var a = server.select('a'); + +// a.connections.length === 1 +``` + +#### `server.info` + +When the server contains exactly one connection, `info` is an object containing information about +the sole connection where: +- `id` - a unique connection identifier (using the format '{hostname}:{pid}:{now base36}'). +- `created` - the connection creation timestamp. +- `started` - the connection start timestamp (`0` when stopped). +- `port` - the connection port based on the following rules: + - the configured port value before the server has been started. + - the actual port assigned when no port is configured or set to `0` after the server has been + started. +- `host` - the host name the connection was configured to. Defaults to the operating system + hostname when available, otherwise `'localhost'`. +- `address` - the active IP address the connection was bound to after starting. Set to `undefined` + until the server has been started or when using a non TCP port (e.g. UNIX domain socket). +- `protocol` - the protocol used: + - `'http'` - HTTP. + - `'https'` - HTTPS. + - `'socket'` - UNIX domain socket or Windows named pipe. +- `uri` - a string representing the connection (e.g. 'http://example.com:8080' or + 'socket:/unix/domain/socket/path'). Contains the `uri` setting if provided, otherwise constructed + from the available settings. If no `port` is available or set to `0`, the `uri` will not include + a port component. + +When the server contains more than one connection, each [`server.connections`](#serverconnections) +array member provides its own `connection.info`. + +```js +var server = new Hapi.Server(); +server.connection({ port: 80 }); + +// server.info.port === 80 + +server.connection({ port: 8080 }); + +// server.info === null +// server.connections[1].info.port === 8080 +``` + +#### `server.load` + +An object containing the process load metrics (when `load.sampleInterval` is enabled): +- `eventLoopDelay` - event loop delay milliseconds. +- `heapUsed` - V8 heap usage. +- `rss` - RSS memory usage. + + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server({ load: { sampleInterval: 1000 } }); + +console.log(server.load.rss); +``` + +#### `server.listener` + +When the server contains exactly one connection, `listener` is the node HTTP server object of the +sole connection. + +When the server contains more than one connection, each [`server.connections`](#serverconnections) +array member provides its own `connection.listener`. + +```js +var Hapi = require('hapi'); +var SocketIO = require('socket.io'); + +var server = new Hapi.Server(); +server.connection({ port: 80 }); + +var io = SocketIO.listen(server.listener); +io.sockets.on('connection', function(socket) { + + socket.emit({ msg: 'welcome' }); +}); +``` + +#### `server.methods` + +An object providing access to the [server methods](#servermethodname-method-options) where each +server method name is an object property. + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); + +server.method('add', function (a, b, next) { + + return next(null, a + b); +}); + +server.methods.add(1, 2, function (err, result) { + + // result === 3 +}); +``` + +#### `server.mime` + +Provides access to the server MIME database used for setting content-type information. The object +must not be modified directly but only through the `mime` server setting. + +```js +var Hapi = require('hapi'); + +var options = { + mime: { + override: { + 'node/module': { + source: 'steve', + compressible: false, + extensions: ['node', 'module', 'npm'], + type: 'node/module' + } + } + } +}; + +var server = new Hapi.Server(options); +// server.mime.path('code.js').type === 'application/javascript' +// server.mime.path('file.npm').type === 'node/module' +``` + +#### `server.plugins` + +An object containing the values exposed by each plugin registered where each key is a plugin name +and the values are the exposed properties by each plugin using +[`server.expose()`](#serverexposekey-value). Plugins may set the value of the +`server.plugins[name]` object directly or via the `server.expose()` method. + +```js +exports.register = function (server, options, next) { + + server.expose('key', 'value'); + // server.plugins.example.key === 'value' + return next(); +}; + +exports.register.attributes = { + name: 'example' +}; +``` + +#### `server.realm` + +The realm object contains server-wide or plugin-specific state that can be shared across various +methods. For example, when calling [`server.bind()`](#serverbindcontext), the active realm +`settings.bind` property is set which is then used by routes and extensions added at the same level +(server root or plugin). Realms are a limited version of a sandbox where plugins can maintain state +used by the framework when adding routes, extensions, and other properties. + +- `modifiers` - when the server object is provided as an argument to the plugin `register()` + method, `modifiers` provides the registration preferences passed the + [`server.register()`](#serverregisterplugins-options-callback) method and includes: + - `route` - routes preferences: + - `prefix` - the route path prefix used by any calls to [`server.route()`](#serverrouteoptions) + from the server. + - `vhost` - the route virtual host settings used by any calls to + [`server.route()`](#serverrouteoptions) from the server. +- `plugin` - the active plugin name (empty string if at the server root). +- `plugins` - plugin-specific state to be shared only among activities sharing the same active + state. `plugins` is an object where each key is a plugin name and the value is the plugin state. +- `settings` - settings overrides: + - `files.relativeTo` + - `bind` + +The `server.realm` object should be considered read-only and must not be changed directly except +for the `plugins` property can be directly manipulated by the plugins (each setting its own under +`plugins[name]`). + +```js +exports.register = function (server, options, next) { + + console.log(server.realm.modifiers.route.prefix); + return next(); +}; +``` + +#### `server.root` + +The root server object containing all the connections and the root server methods (e.g. `start()`, +`stop()`, `connection()`). + +#### `server.settings` + +The server configuration object after defaults applied. + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server({ + app: { + key: 'value' + } +}); + +// server.settings.app === { key: 'value' } +``` + +#### `server.version` + +The **hapi** module version number. + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); +// server.version === '8.0.0' +``` + +### `server.after(method, [dependencies])` + +Adds a method to be called after all the plugin dependencies have been registered and before the +server starts (only called if the server is started) where: +- `method` - the method with signature `function(server, next)` where: + - `server` - server object the `after()` method was called on. + - `next` - the callback function the method must call to return control over to the application + and complete the registration process. The function signature is `function(err)` where: + - `err` - internal error which is returned back via the + [`server.start()`](#serverstartcallback) callback. +- `dependencies` - a string or array of string with the plugin names to call this method after + their `after()` methods. There is no requirement for the other [plugins](#plugins) to be + registered. Setting dependencies only arranges the after methods in the specified order. + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ port: 80 }); + +server.after(function () { + + // Perform some pre-start logic +}); + +server.start(function (err) { + + // After method already executed +}); +``` + +### `server.auth.default(options)` + +Sets a default strategy which is applied to every route where: +- `options` - a string with the default strategy name or an object with a specified strategy or + strategies using the same format as the [route `auth` handler options](#route.config.auth). + +The default does not apply when the route config specifies `auth` as `false`, or has an +authentication strategy configured. Otherwise, the route authentication config is applied to the +defaults. + +Note that if the route has authentication config, the default only applies at the time of adding +the route, not at runtime. This means that calling `default()` after adding a route with some +authentication config will have no impact on the routes added prior. However, the default will +apply to routes added before `default()` is called if those routes lack any authentication config. + +The default auth strategy configuration can be accessed via `connection.auth.settings.default`. + +```js +var server = new Hapi.Server(); +server.connection({ port: 80 }); + +server.auth.scheme('custom', scheme); +server.auth.strategy('default', 'custom'); +server.auth.default('default'); + +server.route({ + method: 'GET', + path: '/', + handler: function (request, reply) { + + return reply(request.auth.credentials.user); + } +}); +``` + +### `server.auth.scheme(name, scheme)` + +Registers an authentication scheme where: +- `name` - the scheme name. +- `scheme` - the method implementing the scheme with signature `function(server, options)` where: + - `server` - a reference to the server object the scheme is added to. + - `options` - optional scheme settings used to instantiate a strategy. + +The `scheme` method must return an object with the following keys: +- `authenticate(request, reply)` - required function called on each incoming request configured + with the authentication scheme where: + - `request` - the [request object](#request-object). + - `reply` - the [reply interface](#reply-interface) the authentication method must call when + done authenticating the request where: + - `reply(err, response, result)` - is called if authentication failed where: + - `err` - any authentication error. + - `response` - any authentication response action such as redirection. Ignored if `err` + is present, otherwise required. + - `result` - an object containing: + - `credentials` - the authenticated credentials. + - `artifacts` - optional authentication artifacts. + - `reply.continue(result)` - is called if authentication succeeded where: + - `result` - same object as `result` above. +- `payload(request, reply)` - optional function called to authenticate the request payload where: + - `request` - the [request object](#request-object). + - `reply(err, response)` - is called if authentication failed where: + - `err` - any authentication error. + - `response` - any authentication response action such as redirection. Ignored if `err` + is present, otherwise required. + - `reply.continue()` - is called if payload authentication succeeded. +- `response(request, reply)` - optional function called to decorate the response with + authentication headers before the response headers or payload is written where: + - `request` - the [request object](#request-object). + - `reply(err, response)` - is called if an error occurred where: + - `err` - any authentication error. + - `response` - any authentication response to send instead of the current response. Ignored + if `err` is present, otherwise required. + - `reply.continue()` - is called if the operation succeeded. +- `options` - an optional object with the following keys: + - `payload` - if `true`, requires payload validation as part of the scheme and forbids routes + from disabling payload auth validation. Defaults to `false`. + +When the scheme `authenticate()` method implementation calls `reply()` with an error condition, +the specifics of the error affect whether additional authentication strategies will be attempted +if configured for the route. If the `err` returned by the `reply()` method includes a message, no +additional strategies will be attempted. If the `err` does not include a message but does include +a scheme name (e.g. `Boom.unauthorized(null, 'Custom')`), additional strategies will be attempted +in order of preference. + +When the scheme `payload()` method returns an error with a message, it means payload validation +failed due to bad payload. If the error has no message but includes a scheme name (e.g. +`Boom.unauthorized(null, 'Custom')`), authentication may still be successful if the route +`auth.payload` configuration is set to `'optional'`. + +```js +var server = new Hapi.Server(); +server.connection({ port: 80 }); + +var scheme = function (server, options) { + + return { + authenticate: function (request, reply) { + + var req = request.raw.req; + var authorization = req.headers.authorization; + if (!authorization) { + return reply(Boom.unauthorized(null, 'Custom')); + } + + return reply.continue({ credentials: { user: 'john' } }); + } + }; +}; + +server.auth.scheme('custom', scheme); +``` + +### `server.auth.strategy(name, scheme, [mode], [options])` + +Registers an authentication strategy where: +- `name` - the strategy name. +- `scheme` - the scheme name (must be previously registered using + [`server.auth.scheme()`](#serverauthschemename-scheme)). +- `mode` - if `true`, the scheme is automatically assigned as a required strategy to any route + without an `auth` config. Can only be assigned to a single server strategy. Value must be `true` + (which is the same as `'required'`) or a valid authentication mode (`'required'`, `'optional'`, + `'try'`). Defaults to `false`. +- `options` - scheme options based on the scheme requirements. + +```js +var server = new Hapi.Server(); +server.connection({ port: 80 }); + +server.auth.scheme('custom', scheme); +server.auth.strategy('default', 'custom'); + +server.route({ + method: 'GET', + path: '/', + config: { + auth: 'default', + handler: function (request, reply) { + + return reply(request.auth.credentials.user); + } + } +}); +``` + +### `server.auth.test(strategy, request, next)` + +Tests a request against an authentication strategy where: +- `strategy` - the strategy name registered with + [`server.auth.strategy()`](#serverauthstrategyname-scheme-mode-options). +- `request` - the [request object](#request-object). +- `next` - the callback function with signature `function(err, credentials)` where: + - `err` - the error if authentication failed. + - `credentials` - the authentication credentials object if authentication was successful. + +Note that the `test()` method does not take into account the route authentication configuration. It +also does not perform payload authentication. It is limited to the basic strategy authentication +execution. It does not include verifying scope, entity, or other route properties. + +```js +var server = new Hapi.Server(); +server.connection({ port: 80 }); + +server.auth.scheme('custom', scheme); +server.auth.strategy('default', 'custom'); + +server.route({ + method: 'GET', + path: '/', + handler: function (request, reply) { + + request.server.auth.test('default', request, function (err, credentials) { + + if (err) { + return reply({ status: false }); + } + + return reply({ status: true, user: credentials.name }); + }); + } +}); +``` + +### `server.bind(context)` + +Sets a global context used as the default bind object when adding a route or an extension where: +- `context` - the object used to bind `this` in handler and + [extension methods](#serverextevent-method-options). + +When setting context inside a plugin, the context is applied only to methods set up by the plugin. +Note that the context applies only to routes and extensions added after it has been set. + +```js +var handler = function (request, reply) { + + return reply(this.message); +}; + +exports.register = function (server, options, next) { + + var bind = { + message: 'hello' + }; + + server.bind(bind); + server.route({ method: 'GET', path: '/', handler: handler }); + return next(); +}; +``` + +### `server.cache(options)` + +Provisions a cache segment within the server cache facility where: +- `options` - [**catbox** policy](https://github.com/hapijs/catbox#policy) configuration where: + - `expiresIn` - relative expiration expressed in the number of milliseconds since the item was + saved in the cache. Cannot be used together with `expiresAt`. + - `expiresAt` - time of day expressed in 24h notation using the 'HH:MM' format, at which point + all cache records expire. Uses local time. Cannot be used together with `expiresIn`. + - `generateFunc` - a function used to generate a new cache item if one is not found in the + cache when calling `get()`. The method's signature is `function(id, next)` where: + - `id` - the `id` string or object provided to the `get()` method. + - `next` - the method called when the new item is returned with the signature + `function(err, value, ttl)` where: + - `err` - an error condition. + - `value` - the new value generated. + - `ttl` - the cache ttl value in milliseconds. Set to `0` to skip storing in the + cache. Defaults to the cache global policy. + - `staleIn` - number of milliseconds to mark an item stored in cache as stale and attempt to + regenerate it when `generateFunc` is provided. Must be less than `expiresIn`. + - `staleTimeout` - number of milliseconds to wait before checking if an item is stale. + - `generateTimeout` - number of milliseconds to wait before returning a timeout error when the + `generateFunc` function takes too long to return a value. When the value is eventually + returned, it is stored in the cache for future requests. + - `cache` - the cache name configured in ['server.cache`](#server.config.cache). Defaults to + the default cache. + - `segment` - string segment name, used to isolate cached items within the cache partition. + When called within a plugin, defaults to '!name' where 'name' is the plugin name. Required + when called outside of a plugin. + - `shared` - if `true`, allows multiple cache provisions to share the same segment. Default to + `false`. + +```js +var server = new Hapi.Server(); +server.connection({ port: 80 }); + +var cache = server.cache({ segment: 'countries', expiresIn: 60 * 60 * 1000 }); +cache.set('norway', { capital: 'oslo' }, null, function (err) { + + cache.get('norway', function (err, value, cached, log) { + + // value === { capital: 'oslo' }; + }); +}); +``` + +### `server.connection([options])` + +Adds an incoming server connection where: +- `host` - the public hostname or IP address. Used only to set `server.info.host` and + `server.info.uri`. If not configured, defaults to the operating system hostname and if not + available, to `'localhost'`. +- `address` - sets the host name or IP address the connection will listen on. If not configured, + defaults to `host` if present, otherwise to all available network interfaces (i.e. `'0.0.0.0'`). + Set to `127.0.0.1` or `localhost` to restrict connection to only those coming from the same + machine. +- `port` - the TCP port the connection will listen to. Defaults to an ephemeral port (`0`) which + uses an available port when the server is started (and assigned to `server.info.port`). If `port` + is a string containing a '/' character, it is used as a UNIX domain socket path and if it starts + with '\\.\pipe' as a Windows named pipe. +- `uri` - the full public URI without the path (e.g. 'http://example.com:8080'). If present, used + as the connection `info.uri` otherwise constructed from the connection settings. +- `listener` - optional node.js HTTP (or HTTPS) + [`http.Server`](http://nodejs.org/api/http.html#http_class_http_server) object or any compatible + object. If the `listener` needs to be manually started, set `autoListen` to `false`. If the + `listener` uses TLS, set `tls` to `true`. +- `autoListen` - indicates that the `connection.listener` will be started manually outside the + framework. Cannot be specified with a `port` setting. Defaults to `true`. +- `cache` - caching headers configuration: + - `statuses` - an array of HTTP response status codes (e.g. `200`) which are allowed to include + a valid caching directive. Defaults to `[200]`. +- `labels` - a string or string array of labels used to [`server.select()`](#serverselectlabels) + specific connections matching the specified labels. Defaults to an empty array `[]` (no labels). +- `tls` - used to create an HTTPS connection. The `tls` object is passed unchanged as options to + the node.js HTTPS server as described in the + [node.js HTTPS documentation](http://nodejs.org/api/https.html#https_https_createserver_options_requestlistener). + Set to `true` when passing a `listener` object that has been configured to use TLS directly. +- Any [connections configuration server defaults](#server.config.connections) can be included to + override and customize the individual connection. + +Returns a server object with the new connection selected. + +Must be called before any other server method that modifies connections is called for it to apply +to the new connection (e.g. [`server.state()`](#serverstatename-options)). + +Note that the `options` object is deeply cloned (with the exception of `listener` which is +shallowly copied) and cannot contain any values that are unsafe to perform deep copy on. + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); + +var web = server.connection({ port: 8000, host: 'example.com', labels: ['web'] }); +var admin = server.connection({ port: 8001, host: 'example.com', labels: ['admin'] }); + +// server.connections.length === 2 +// web.connections.length === 1 +// admin.connections.length === 1 +``` + +### `server.decorate(type, property, method)` + +Extends various framework interfaces with custom methods where: +- `type` - the interface being decorated. Supported types: + - `'reply'` - adds methods to the [reply interface](#reply-interface). + - `'server'` - adds methods to the [Server](#server) object. +- `property` - the object decoration key name. +- `method` - the extension function. + +Note that decorations apply to the entire server and all its connections regardless of current +selection. + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ port: 80 }); + +server.decorate('reply', 'success', function () { + + return this.response({ status: 'ok' }); +}); + +server.route({ + method: 'GET', + path: '/', + handler: function (request, reply) { + + return reply.success(); + } +}); +``` + +### `server.dependency(dependencies, [after])` + +Used within a plugin to declares a required dependency on other [plugins](#plugins) where: +- `dependencies` - a single string or array of plugin name strings which must be registered in + order for this plugin to operate. Plugins listed must be registered before the server is started. + Does not provide version dependency which should be implemented using + [npm peer dependencies](http://blog.nodejs.org/2013/02/07/peer-dependencies/). +- `after` - an optional function called after all the specified dependencies have been registered + and before the server starts. The function is only called if the server is started. If a circular + dependency is detected, an exception is thrown (e.g. two plugins each has an `after` function + to be called after the other). The function signature is `function(server, next)` where: + - `server` - the server the `dependency()` method was called on. + - `next` - the callback function the method must call to return control over to the application + and complete the registration process. The function signature is `function(err)` where: + - `err` - internal error condition, which is returned back via the + [`server.start()`](#serverstartcallback) callback. + +```js +exports.register = function (server, options, next) { + + server.dependency('yar', after); + return next(); +}; + +var after = function (server, next) { + + // Additional plugin registration logic + return next(); +}; +``` + +Dependencies can also be set via the register `attributes` property (does not support setting +`after`): + +```js +exports.register = function (server, options, next) { + + return next(); +}; + +register.attributes = { + name: 'test', + version: '1.0.0', + dependency: 'yar' +}; +``` + +### `server.expose(key, value)` + +Used within a plugin to expose a property via `server.plugins[name]` where: +- `key` - the key assigned (`server.plugins[name][key]`). +- `value` - the value assigned. + +```js +exports.register = function (server, options, next) { + + server.expose('util', function () { console.log('something'); }); + return next(); +}; +``` + +### `server.expose(obj)` + +Merges a deep copy of an object into to the existing content of `server.plugins[name]` where: +- `obj` - the object merged into the exposed properties container. + +```js +exports.register = function (server, options, next) { + + server.expose({ util: function () { console.log('something'); } }); + return next(); +}; +``` + +### `server.ext(event, method, [options])` + +Registers an extension function in one of the available [extension points](#request-lifecycle) +where: +- `event` - the event name. +- `method` - a function or an array of functions to be executed at a specified point during request + processing. The required extension function signature is `function(request, reply)` where: + - `request` - the [request object](#request-object). + - `reply` - the [reply interface](#reply-interface) which is used to return control back to the + framework. To continue normal execution of the [request lifecycle](#request-lifecycle), + `reply.continue()` must be called. To abort processing and return a response to the client, + call `reply(value)` where value is an error or any other valid response. + - `this` - the object provided via `options.bind` or the current active context set with + [`server.bind()`](#serverbindcontext). +- `options` - an optional object with the following: + - `before` - a string or array of strings of plugin names this method must execute before (on + the same event). Otherwise, extension methods are executed in the order added. + - `after` - a string or array of strings of plugin names this method must execute after (on the + same event). Otherwise, extension methods are executed in the order added. + - `bind` - a context object passed back to the provided method (via `this`) when called. + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ port: 80 }); + +server.ext('onRequest', function (request, reply) { + + // Change all requests to '/test' + request.setUrl('/test'); + return reply.continue(); +}); + +var handler = function (request, reply) { + + return reply({ status: 'ok' }); +}; + +server.route({ method: 'GET', path: '/test', handler: handler }); +server.start(); + +// All requests will get routed to '/test' +``` + +### `server.handler(name, method)` + +Registers a new handler type to be used in routes where: +- `name` - string name for the handler being registered. Cannot override the built-in handler + types (`directory`, `file`, `proxy`, and `view`) or any previously registered type. +- `method` - the function used to generate the route handler using the signature + `function(route, options)` where: + - `route` - the [route public interface](#route-public-interface) object. + - `options` - the configuration object provided in the handler config. + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ host: 'localhost', port: 8000 }); + +// Defines new handler for routes on this server +server.handler('test', function (route, options) { + + return function (request, reply) { + + return reply('new handler: ' + options.msg); + } +}); + +server.route({ + method: 'GET', + path: '/', + handler: { test: { msg: 'test' } } +}); + +server.start(); +``` + +The `method` function can have a `defaults` object or function property. If the property is set to +an object, that object is used as the default route config for routes using this handler. If the +property is set to a function, the function uses the signature `function(method)` and returns the +route default configuration. + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ host: 'localhost', port: 8000 }); + +var handler = function (route, options) { + + return function (request, reply) { + + return reply('new handler: ' + options.msg); + } +}; + +// Change the default payload processing for this handler +handler.defaults = { + payload: { + output: 'stream', + parse: false + } +}; + +server.handler('test', handler); +``` + +### `server.inject(options, callback)` + +When the server contains exactly one connection, injects a request into the sole connection +simulating an incoming HTTP request without making an actual socket connection. Injection is useful +for testing purposes as well as for invoking routing logic internally without the overhead or +limitations of the network stack. Utilizes the [**shot**](https://github.com/hapijs/shot) module +for performing injections, with some additional options and response properties: +- `options` - can be assign a string with the requested URI, or an object with: + - `method` - the request HTTP method (e.g. `'POST'`). Defaults to `'GET'`. + - `url` - the request URL. If the URI includes an authority (e.g. `'example.com:8080'`), it is + used to automatically set an HTTP 'Host' header, unless one was specified in `headers`. + - `headers` - an object with optional request headers where each key is the header name and the + value is the header content. Defaults to no additions to the default Shot headers. + - `payload` - an optional string or buffer containing the request payload (object must be + manually converted to a string first). Defaults to no payload. Note that payload processing + defaults to `'application/json'` if no 'Content-Type' header provided. + - `credentials` - an optional credentials object containing authentication information. The + `credentials` are used to bypass the default authentication strategies, and are validated + directly as if they were received via an authentication scheme. Defaults to no credentials. + - `simulate` - an object with options used to simulate client request stream conditions for + testing: + - `error` - if `true`, emits an `'error'` event after payload transmission (if any). + Defaults to `false`. + - `close` - if `true`, emits a `'close'` event after payload transmission (if any). + Defaults to `false`. + - `end` - if `false`, does not end the stream. Defaults to `true`. +- `callback` - the callback function with signature `function(res)` where: + - `res` - the response object where: + - `statusCode` - the HTTP status code. + - `headers` - an object containing the headers set. + - `payload` - the response payload string. + - `rawPayload` - the raw response payload buffer. + - `raw` - an object with the injection request and response objects: + - `req` - the simulated node request object. + - `res` - the simulated node response object. + - `result` - the raw handler response (e.g. when not a stream or a view) before it is + serialized for transmission. If not available, the value is set to `payload`. Useful for + inspection and reuse of the internal objects returned (instead of parsing the response + string). + - `request` - the [request object](#request-object). + +When the server contains more than one connection, each [`server.connections`](#serverconnections) +array member provides its own `connection.inject()`. + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ port: 80 }); + +var handler = function (request, reply) { + + return reply('Success!'); +}; + +server.route({ method: 'GET', path: '/', handler: handler }); + +server.inject('/', function (res) { + + console.log(res.result); +}); +``` + +### `server.log(tags, [data, [timestamp]])` + +Logs server events that cannot be associated with a specific request. When called the server emits +a `'log'` event which can be used by other listeners or [plugins](#plugins) to record the +information or output to the console. The arguments are: +- `tags` - a string or an array of strings (e.g. `['error', 'database', 'read']`) used to identify + the event. Tags are used instead of log levels and provide a much more expressive mechanism for + describing and filtering events. Any logs generated by the server internally include the `'hapi'` + tag along with event-specific information. +- `data` - an optional message string or object with the application data being logged. +- `timestamp` - an optional timestamp expressed in milliseconds. Defaults to `Date.now()` (now). + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ port: 80 }); + +server.on('log', function (event, tags) { + + if (tags.error) { + console.log(event); + } +}); + +server.log(['test', 'error'], 'Test event'); +``` + +### `server.lookup(id)` + +When the server contains exactly one connection, looks up a route configuration where: +- `id` - the route identifier as set in the [route options](#route-options). + +returns the [route public interface](#route-public-interface) object if found, otherwise `null`. + +```js +var server = new Hapi.Server(); +server.connection(); +server.route({ + method: 'GET', + path: '/', + config: { + handler: function (request, reply) { return reply(); }, + id: 'root' + } +}); + +var route = server.lookup('root'); +``` + +When the server contains more than one connection, each [`server.connections`](#serverconnections) +array member provides its own `connection.lookup()` method. + +### `server.match(method, path, [host])` + +When the server contains exactly one connection, looks up a route configuration where: +- `method` - the HTTP method (e.g. 'GET', 'POST'). +- `path` - the requested path (must begin with '/'). +- `host` - optional hostname (to match against routes with `vhost`). + +returns the [route public interface](#route-public-interface) object if found, otherwise `null`. + +```js +var server = new Hapi.Server(); +server.connection(); +server.route({ + method: 'GET', + path: '/', + config: { + handler: function (request, reply) { return reply(); }, + id: 'root' + } +}); + +var route = server.match('get', '/'); +``` + +When the server contains more than one connection, each [`server.connections`](#serverconnections) +array member provides its own `connection.match()` method. + +### `server.method(name, method, [options])` + +Registers a server method. Server methods are functions registered with the server and used +throughout the application as a common utility. Their advantage is in the ability to configure them +to use the built-in cache and share across multiple request handlers without having to create a +common module. + +Methods are registered via `server.method(name, method, [options])` where: +- `name` - a unique method name used to invoke the method via `server.methods[name]`. When + configured with caching enabled, `server.methods[name].cache.drop(arg1, arg2, ..., argn, callback)` + can be used to clear the cache for a given key. Supports using nested names such as + `utils.users.get` which will automatically create the missing path under + [`server.methods`](#servermethods) and can be accessed for the previous example via + `server.methods.utils.users.get`. +- `method` - the method function with the signature is one of: + - `function(arg1, arg2, ..., argn, next)` where: + - `arg1`, `arg2`, etc. - the method function arguments. + - `next` - the function called when the method is done with the signature + `function(err, result, ttl)` where: + - `err` - error response if the method failed. + - `result` - the return value. + - `ttl` - `0` if result is valid but cannot be cached. Defaults to cache policy. + - `function(arg1, arg2, ..., argn)` where: + - `arg1`, `arg2`, etc. - the method function arguments. + - the `callback` option is set to `false`. + - the method must returns a value (result, `Error`, or a promise) or throw an `Error`. +- `options` - optional configuration: + - `bind` - a context object passed back to the method function (via `this`) when called. + Defaults to active context (set via [`server.bind()`](#serverbindcontext) when the method is + registered. + - `cache` - the same cache configuration used in [`server.cache()`](#servercacheoptions). + - `callback` - if `false`, expects the `method` to be a synchronous function. Note that using a + synchronous function with caching will convert the method interface to require a callback as + an additional argument with the signature `function(err, result, cached, report)` since the + cache interface cannot return values synchronously. Defaults to `true`. + - `generateKey` - a function used to generate a unique key (for caching) from the arguments + passed to the method function (the callback argument is not passed as input). The server + will automatically generate a unique key if the function's arguments are all of types + `'string'`, `'number'`, or `'boolean'`. However if the method uses other types of arguments, + a key generation function must be provided which takes the same arguments as the function and + returns a unique string (or `null` if no key can be generated). + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ port: 80 }); + +// Simple arguments + +var add = function (a, b, next) { + + return next(null, a + b); +}; + +server.method('sum', add, { cache: { expiresIn: 2000 } }); + +server.methods.sum(4, 5, function (err, result) { + + console.log(result); +}); + +// Object argument + +var addArray = function (array, next) { + + var sum = 0; + array.forEach(function (item) { + + sum += item; + }); + + return next(null, sum); +}; + +server.method('sumObj', addArray, { + cache: { expiresIn: 2000 }, + generateKey: function (array) { + + return array.join(','); + } +}); + +server.methods.sumObj([5, 6], function (err, result) { + + console.log(result); +}); + +// Synchronous method with cache + +var addSync = function (a, b) { + + return a + b; +}; + +server.method('sumSync', addSync, { cache: { expiresIn: 2000 }, callback: false }); + +server.methods.sumSync(4, 5, function (err, result) { + + console.log(result); +}); +``` + +### `server.method(methods)` + +Registers a server method function as described in +[`server.method()`](#servermethodname-method-options) using a configuration object +where: +- `methods` - an object or an array of objects where each one contains: + - `name` - the method name. + - `method` - the method function. + - `options` - optional settings. + +```js +var add = function (a, b, next) { + + next(null, a + b); +}; + +server.method({ + name: 'sum', + method: add, + options: { + cache: { + expiresIn: 2000 + } + } +}); +``` + +### `server.path(relativeTo)` + +Sets the path prefix used to locate static resources (files and view templates) when relative paths +are used where: +- `relativeTo` - the path prefix added to any relative file path starting with `'.'`. + +Note that setting a path within a plugin only applies to resources accessed by plugin methods. +If no path is set, the connection `files.relativeTo` configuration is used. The path only applies +to routes added after it has been set. + +```js +exports.register = function (server, options, next) { + + server.path(__dirname + '../static'); + server.route({ path: '/file', method: 'GET', handler: { file: './test.html' } }); + next(); +}; +``` + +### `server.register(plugins, [options], callback)` + +Registers a plugin where: +- `plugins` - an object or array of objects where each one is either: + - a plugin registration function. + - an object with the following: + - `register` - the plugin registration function. + - `options` - optional options passed to the registration function when called. +- `options` - optional registration options (different from the options passed to the registration + function): + - `select` - a string or array of string labels used to pre-select connections for plugin + registration. + - `routes` - modifiers applied to each route added by the plugin: + - `prefix` - string added as prefix to any route path (must begin with `'/'`). If a plugin + registers a child plugin the `prefix` is passed on to the child or is added in front of + the child-specific prefix. + - `vhost` - virtual host string (or array of strings) applied to every route. The + outer-most `vhost` overrides the any nested configuration. +- `callback` - the callback function with signature `function(err)` where: + - `err` - an error returned from the registration function. Note that exceptions thrown by the + registration function are not handled by the framework. + +```js +server.register({ + register: require('plugin_name'), + options: { + message: 'hello' + } + }, function (err) { + + if (err) { + console.log('Failed loading plugin'); + } + }); +``` + +### `server.render(template, context, [options], callback)` + +Utilizes the server views manager to render a template where: +- `template` - the template filename and path, relative to the views manager templates path (`path` + or `relativeTo`). +- `context` - optional object used by the template to render context-specific result. Defaults to + no context (`{}`). +- `options` - optional object used to override the views manager configuration. +- `callback` - the callback function with signature `function (err, rendered, config)` where: + - `err` - the rendering error if any. + - `rendered` - the result view string. + - `config` - the configuration used to render the template. + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ port: 80 }); +server.views({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates' +}); + +var context = { + title: 'Views Example', + message: 'Hello, World' +}; + +server.render('hello', context, function (err, rendered, config) { + + console.log(rendered); +}); +``` + +### `server.route(options)` + +Adds a connection route where: +- `options` - a [route configuration object](#route-configuration) or an array of configuration + objects. + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ port: 80 }); + +server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok'); } }); +server.route([ + { method: 'GET', path: '/1', handler: function (request, reply) { return reply('ok'); } }, + { method: 'GET', path: '/2', handler: function (request, reply) { return reply('ok'); } } +]); +``` + +### `server.select(labels)` + +Selects a subset of the server's connections where: +- `labels` - a single string or array of strings of labels used as a logical OR statement to select + all the connections with matching labels in their configuration. + +Returns a server object with `connections` set to the requested subset. Selecting again on a +selection operates as a logic AND statement between the individual selections. + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ port: 80, labels: ['a', 'b'] }); +server.connection({ port: 8080, labels: ['a', 'c'] }); +server.connection({ port: 8081, labels: ['b', 'c'] }); + +var a = server.select('a'); // 80, 8080 +var ac = a.select('c'); // 8080 +``` + +### `server.start([callback])` + +Starts the server connections by listening for incoming requests on the configured port of each +listener (unless the connection was configured with `autoListen` set to `false`), where: +- `callback` - optional callback when server startup is completed or failed with the signature + `function(err)` where: + - `err` - any startup error condition. + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ port: 80 }); + +server.start(function (err) { + + console.log('Server started at: ' + server.info.uri); +}); +``` + +### `server.state(name, [options])` + +[HTTP state management](http://tools.ietf.org/html/rfc6265) uses client cookies to persist a state +across multiple requests. Registers a cookie definitions where: +- `name` - the cookie name string. +- `options` - are the optional cookie settings: + - `ttl` - time-to-live in milliseconds. Defaults to `null` (session time-life - cookies are + deleted when the browser is closed). + - `isSecure` - sets the 'Secure' flag. Defaults to `false`. + - `isHttpOnly` - sets the 'HttpOnly' flag. Defaults to `false`. + - `path` - the path scope. Defaults to `null` (no path). + - `domain` - the domain scope. Defaults to `null` (no domain). + - `autoValue` - if present and the cookie was not received from the client or explicitly set by + the route handler, the cookie is automatically added to the response with the provided value. + The value can be a function with signature `function(request, next)` where: + - `request` - the [request object](#request-object). + - `next` - the continuation function using the `function(err, value)` signature. + - `encoding` - encoding performs on the provided value before serialization. Options are: + - `'none'` - no encoding. When used, the cookie value must be a string. This is the default + value. + - `'base64'` - string value is encoded using Base64. + - `'base64json'` - object value is JSON-stringified than encoded using Base64. + - `'form'` - object value is encoded using the _x-www-form-urlencoded_ method. + - `'iron'` - Encrypts and sign the value using + [**iron**](https://github.com/hueniverse/iron). + - `sign` - an object used to calculate an HMAC for cookie integrity validation. This does not + provide privacy, only a mean to verify that the cookie value was generated by the server. + Redundant when `'iron'` encoding is used. Options are: + - `integrity` - algorithm options. Defaults to + [`require('iron').defaults.integrity`](https://github.com/hueniverse/iron#options). + - `password` - password used for HMAC key generation. + - `password` - password used for `'iron'` encoding. + - `iron` - options for `'iron'` encoding. Defaults to + [`require('iron').defaults`](https://github.com/hueniverse/iron#options). + - `ignoreErrors` - if `false`, errors are ignored and treated as missing cookies. + - `clearInvalid` - if `true`, automatically instruct the client to remove invalid + cookies. Defaults to `false`. + - `strictHeader` - if `false`, allows any cookie value including values in + violation of [RFC 6265](https://tools.ietf.org/html/rfc6265). Defaults to `true`. + - `passThrough` - overrides the default proxy `localStatePassThrough` setting. + +State defaults can be modified via the server `connections.routes.state` configuration option. + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ port: 80 }); + +// Set cookie definition + +server.state('session', { + ttl: 24 * 60 * 60 * 1000, // One day + isSecure: true, + path: '/', + encoding: 'base64json' +}); + +// Set state in route handler + +var handler = function (request, reply) { + + var session = request.state.session; + if (!session) { + session = { user: 'joe' }; + } + + session.last = Date.now(); + + return reply('Success').state('session', session); +}; +``` + +Registered cookies are automatically parsed when received. Parsing rules depends on the route +[`state.parse`](#route.config.state) configuration. If an incoming registered cookie fails parsing, +it is not included in `request.state`, regardless of the `state.failAction` setting. When +`state.failAction` is set to `'log'` and an invalid cookie value is received, the server will emit +a `'request-internal'` event. To capture these errors subscribe to the `'request-internal'` events +and filter on `'error'` and `'state'` tags: + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ port: 80 }); + +server.on('request-internal', function (request, event, tags) { + + if (tags.error && tags.state) { + console.error(event); + } +}); +``` + +### `server.stop([options], [callback])` + +Stops the server's connections by refusing to accept any new connections or requests (existing +connections will continue until closed or timeout), where: +- `options` - optional object with: + - `timeout` - overrides the timeout in millisecond before forcefully terminating a connection. + Defaults to `5000` (5 seconds). +- `callback` - optional callback method with signature `function()` which is called once all the + connections have ended and it is safe to exit the process. + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ port: 80 }); + +server.stop({ timeout: 60 * 1000 }, function () { + + console.log('Server stopped'); +}); +``` + +### `server.table([host])` + +Returns a copy of the routing table where: +- `host` - optional host to filter routes matching a specific virtual host. Defaults to all virtual + hosts. + +The return value is an array where each item is an object containing: +- `info` - the `connection.info` the connection the table was generated for. +- `labels` - the connection labels. +- `table` - an array of routes where each route contains: + - `settings` - the route config with defaults applied. + - `method` - the HTTP method in lower case. + - `path` - the route path. + +Note that if the server has not been started and multiple connections use port `0`, the table items +will override each other and will produce an incomplete result. + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ port: 80, host: 'example.com' }); +server.route({ method: 'GET', path: '/example', handler: function (request, reply) { return reply(); } }); + +var table = server.table(); +``` + +When calling `connection.table()` directly on each connection, the return value is the same as the +array `table` item value of an individual connection: + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ port: 80, host: 'example.com' }); +server.route({ method: 'GET', path: '/example', handler: function (request, reply) { return reply(); } }); + +var table = server.connections[0].table(); + +/* + [ + { + method: 'get', + path: '/example', + settings: { ... } + } + ] +*/ +``` + +### `server.views(options)` + +Initializes the server views manager where: +- `options` - a configuration object with the following: + - `engines` - required object where each key is a file extension (e.g. 'html', 'hbr'), mapped + to the npm module used for rendering the templates. Alternatively, the extension can be + mapped to an object with the following options: + - `module` - the npm module used for rendering the templates. The module object must + contain: + - `compile()` - the rendering function. The required function signature depends on the + `compileMode` settings. If the `compileMode` is `'sync'`, the signature is + `compile(template, options)`, the return value is a function with signature + `function(context, options)`, and the method is allowed to throw errors. If the + `compileMode` is `'async'`, the signature is `compile(template, options, callback)` + where `callback` has the signature `function(err, compiled)` where `compiled` is a + function with signature `function(context, options, callback)` and `callback` has the + signature `function(err, rendered)`. + - any of the `views` options listed below (except `defaultExtension`) to override the + defaults for a specific engine. + - `defaultExtension` - defines the default filename extension to append to template names when + multiple engines are configured and not explicit extension is provided for a given template. + No default value. + - `path` - the root file path used to resolve and load the templates identified when calling + [`reply.view()`](#replyviewtemplate-context-options). Defaults to current working directory. + - `partialsPath` - the root file path where partials are located. Partials are small segments + of template code that can be nested and reused throughout other templates. Defaults to no + partials support (empty path). + - `helpersPath` - the directory path where helpers are located. Helpers are functions used + within templates to perform transformations and other data manipulations using the template + context or other inputs. Each '.js' file in the helpers directory is loaded and the file name + is used as the helper name. The files must export a single method with the signature + `function(context)` and return a string. Sub-folders are not supported and are ignored. + Defaults to no helpers support (empty path). Note that jade does not support loading helpers + this way. + - `relativeTo` - a base path used as prefix for `path` and `partialsPath`. No default. + - `layout` - if set to `true` or a layout filename, layout support is enabled. A layout is a + single template file used as the parent template for other view templates in the same engine. + If `true`, the layout template name must be 'layout.ext' where 'ext' is the engine's + extension. Otherwise, the provided filename is suffixed with the engine's extension and + loaded. Disable `layout` when using Jade as it will handle including any layout files + independently. Defaults to `false`. + - `layoutPath` - the root file path where layout templates are located (using the `relativeTo` + prefix if present). Defaults to `path`. + - `layoutKeyword` - the key used by the template engine to denote where primary template + content should go. Defaults to `'content'`. + - `encoding` - the text encoding used by the templates when reading the files and outputting + the result. Defaults to `'utf8'`. + - `isCached` - if set to `false`, templates will not be cached (thus will be read from file on + every use). Defaults to `true`. + - `allowAbsolutePaths` - if set to `true`, allows absolute template paths passed to + [`reply.view()`](#replyviewtemplate-context-options). Defaults to `false`. + - `allowInsecureAccess` - if set to `true`, allows template paths passed to + [`reply.view()`](#replyviewtemplate-context-options) to contain '../'. Defaults to `false`. + - `compileOptions` - options object passed to the engine's compile function. Defaults to empty + options `{}`. + - `runtimeOptions` - options object passed to the returned function from the compile operation. + Defaults to empty options `{}`. + - `contentType` - the content type of the engine results. Defaults to `'text/html'`. + - `compileMode` - specify whether the engine `compile()` method is `'sync'` or `'async'`. + Defaults to `'sync'`. + - `context` - a global context used with all templates. The global context option can be either + an object or a function that takes no arguments and returns a context object. When rendering + views, the global context will be merged with any context object specified on the handler or + using [`reply.view()`](#replyviewtemplate-context-options). When multiple context objects are + used, values from the global context always have lowest precedence. + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); + +server.views({ + engines: { + html: require('handlebars'), + jade: require('jade') + }, + path: '/static/templates' +}); +``` + +When [`server.views()`](#serverviewsoptions) is called within a plugin, the views manager is only +available to [plugins](#plugins) methods. + +### Server events + +The server object inherits from `Events.EventEmitter` and emits the following events: + +- `'log'` - events logged with [`server.log()`](#serverlogtags-data-timestamp) and + [server events](#server-logs) generated internally by the framework. +- `'start'` - emitted when the server is started using [`server.start()`](#serverstartcallback). +- `'stop'` - emitted when the server is stopped using [`server.stop()`](#serverstopoptions-callback). +- `'request'` - events generated by [`request.log()`](#requestlogtags-data-timestamp). Does not + include any internally generated events. +- `'request-internal'` - [request events](#request-logs) generated internally by the framework + (multiple events per request). +- `'request-error'` - emitted whenever an Internal Server Error (500) error response is sent. + Single event per request. +- `'response'` - emitted after the response is sent back to the client (or when the client + connection closed and no response sent, in which case `request.response` is `null`). Single event + per request. +- `'tail'` - emitted when a request finished processing, including any registered tails. Single + event per request. + +Note that the server object should not be used to emit application events as its internal +implementation is designed to fan events out to the various plugin selections and not for +application events. + +When provided (as listed below) the `event` object includes: + +- `timestamp` - the event timestamp. +- `request` - if the event relates to a request, the `request id`. +- `server` - if the event relates to a server, the `server.info.uri`. +- `tags` - an array of tags (e.g. `['error', 'http']`). +- `data` - optional event-specific information. +- `internal` - `true` if the event was generated internally by the framework. + +The `'log'` event includes the `event` object and a `tags` object (where each tag is a key with the +value `true`): + +```js +server.on('log', function (event, tags) { + + if (tags.error) { + console.log('Server error: ' + (event.data || 'unspecified')); + } +}); +``` + +The `'request'` and `'request-internal'` events include the [request object](#request-object), the +`event` object, and a `tags` object (where each tag is a key with the value `true`): + +```js +server.on('request', function (request, event, tags) { + + if (tags.received) { + console.log('New request: ' + request.id); + } +}); +``` + +The `'request-error'` event includes the [request object](#request-object) and the causing error +`err` object: + +```js +server.on('request-error', function (request, err) { + + console.log('Error response (500) sent for request: ' + request.id + ' because: ' + err.message); +}); +``` + +The `'response'` and `'tail'` events include the [request object](#request-object): + +```js +server.on('response', function (request) { + + console.log('Response sent for request: ' + request.id); +}); +``` + +#### Internal events + +The following logs are generated automatically by the framework. Each event can be identified by +the combination of tags used. + +##### Request logs + +Emitted by the server `'request-internal'` event: +- `received` - a new request received. Includes information about the request. +- `auth` `{strategy}` - the request successfully authenticated with the listed strategy. +- `auth` `unauthenticated` - no authentication scheme included with the request. +- `auth` `unauthenticated` `response` `{strategy}` - the authentication strategy listed returned a + non-error response (e.g. a redirect to a login page). +- `auth` `unauthenticated` `error` `{strategy}` - the request failed to pass the listed + authentication strategy. +- `auth` `unauthenticated` `try` `{strategy}` - the request failed to pass the listed + authentication strategy in `'try'` mode and will continue. +- `auth` `scope` `error` `{strategy}` - the request authenticated but failed to meet the scope + requirements. +- `auth` `entity` `user` `error` `{strategy}` - the request authenticated but included an + application entity when a user entity was required. +- `auth` `entity` `app` `error` `{strategy}` - the request authenticated but included a user + entity when an application entity was required. +- `handler` - the route handler executed. Includes the execution duration. +- `handler` `error` - the route handler returned an error. Includes the execution duration and the + error message. +- `handler` `method` {method} - a string-shortcut handler method was executed (when cache enabled). + Includes information about the execution including cache performance. +- `pre` `method` {method} - a string-shortcut pre method was executed (when cache enabled). + Includes information about the execution including cache performance. +- `pre` - a pre method was executed. Includes the execution duration and assignment key. +- `pre` `error` - a pre method was executed and returned an error. Includes the execution duration, + assignment key, and error. +- `internal` `error` - an HTTP 500 error response was assigned to the request. +- `internal` `implementation` `error` - a function provided by the user failed with an exception + during request execution. +- `request` `closed` `error` - the request closed prematurely. +- `request` `error` - the request stream emitted an error. Includes the error. +- `request` `server` `timeout` `error` - the request took too long to process by the server. + Includes the timeout configuration value and the duration. +- `tail` `add` - a request tail was added. Includes the tail name and id. +- `tail` `remove` - a request tail was removed. Includes the tail name and id. +- `tail` `remove` `last` - the last request tail was removed. Includes the tail name and id. +- `tail` `remove` `error` - failed to remove a request tail (already removed). Includes the tail + name and id. +- `state` `error` - the request included an invalid cookie or cookies. Includes the cookies and + error details. +- `state` `response` `error` - the response included an invalid cookie which prevented generating a + valid header. Includes the error. +- `payload` `error` - failed processing the request payload. Includes the error. +- `response` - the response was sent successfully. +- `response` `error` - failed writing the response to the client. Includes the error. +- `response` `error` `close` - failed writing the response to the client due to prematurely closed + connection. +- `response` `error` `aborted` - failed writing the response to the client due to prematurely + aborted connection. +- `validation` `error` `{input}` - input (i.e. payload, query, params, headers) validation failed. + Includes the error. +- `validation` `response` `error` - response validation failed. Includes the error message. + +##### Server logs + +Emitted by the server `'log'` event: +- `load` - logs the current server load measurements when the server rejects a request due to high + load. The event data contains the metrics. +- `internal` `implementation` `error` - a function provided by the user failed with an exception + during request execution. The log appears under the server logs when the exception cannot be + associated with the request that generated it. + +## Plugins + +Plugins provide a way to organize the application code by splitting the server logic into smaller +components. Each plugin can manipulate the server and its connections through the standard server +interface, but with the added ability to sandbox certain properties (such as the views manager +and relative file paths). + +A plugin is a function with the signature `function(server, options, next)` where: +- `server` - the server object the plugin is being registered to. +- `options` - an options object passed to the plugin during registration. +- `next` - a callback method the function must call to return control back to the framework to + complete the registration process with signature `function(err)` where: + - `err` - any plugin registration error. + +The plugin function must include an `attributes` function property with the following: +- `name` - required plugin name string. The name is used as a unique key. Published + [plugins](#plugins) should use the same name as the name field in the 'package.json' file. Names + must be unique within each application. +- `version` - optional plugin version. The version is only used informatively to enable other + [plugins](#plugins) to find out the versions loaded. The version should be the same as the one + specified in the plugin's 'package.json' file. +- `multiple` - if `true`, allows the plugin to be registered multiple times with the same server. + Defaults to `false`. +- `dependencies` - optional string or array of string indicating a plugin dependency. Same as + setting dependencies via [`server.dependency()`](#serverdependencydependencies-after). + +```js +var register = function (server, options, next) { + + server.route({ + method: 'GET', + path: '/test', + handler: function (request, reply) { + + return reply('ok'); + } + }); + + return next(); +}; + +register.attributes = { + name: 'test', + version: '1.0.0' +}; +``` + +Alternatively, the `name` and `version` can be included via the `pkg` attribute containing the +'package.json' file for the module which already has the name and version included: + +```js +register.attributes = { + pkg: require('./package.json') +}; +``` + +## Requests + +Incoming requests are handled by the server via routes. Each route describes an HTTP endpoint with +a path, method, and other properties. The route logic is divided between static configuration, +prerequisite functions and a route handler function. Routes are added via the +[`server.route()`](#serverrouteoptions) method. + +### Request lifecycle + +Each incoming request passes through a pre-defined list of steps, along with optional +[extensions](#serverextevent-method-options): + +- **`'onRequest'`** extension point + - always called + - the [request object](#request-object) passed to the extension functions is decorated with the + [`request.setUrl()`](#requestseturlurl) and [`request.setMethod()`](#requestsetmethodmethod) + methods. Calls to these methods will impact how the request is routed and can be used for + rewrite rules. + - `request.route` is not yet populated at this point. + - JSONP configuration is ignored for any response returned from the extension point since no + route is matched yet and the JSONP configuration is unavailable. +- Lookup route using request path +- Parse cookies +- **`'onPreAuth'`** extension point +- Authenticate request +- Read and parse payload +- Authenticate request payload +- **`'onPostAuth'`** extension point +- Validate path parameters +- Process query extensions (e.g. JSONP) +- Validate query +- Validate payload +- **`'onPreHandler'`** extension point +- [Route prerequisites](#route-prerequisites) +- Route handler +- **`'onPostHandler'`** extension point + - The response object contained in `request.response` may be modified (but not assigned a new + value). To return a different response type (for example, replace an error with an HTML + response), return a new response via `reply(response)`. +- Validate response payload +- **`'onPreResponse'`** extension point + - always called (except when [`reply.close()`](#replycloseoptions) is called or the client + terminates the connection prematurely). + - The response contained in `request.response` may be modified (but not assigned a new value). + To return a different response type (for example, replace an error with an HTML response), + return a new response via `reply(response)`. Note that any errors generated after + `reply(response)` is called will not be passed back to the `'onPreResponse'` extension method + to prevent an infinite loop. +- Send response (may emit `'request-error'` event) +- Emits `'response'` event +- Wait for tails +- Emits `'tail'` event + +### Route configuration + +The route configuration object supports the following options: +- `path` - (required) the absolute path used to match incoming requests (must begin with '/'). + Incoming requests are compared to the configured paths based on the connection + [`router`](#connection.config.router) configuration option. The path can include named parameters + enclosed in `{}` which will be matched against literal values in the request as described in + [Path parameters](#path-parameters). + +- `method` - (required) the HTTP method. Typically one of 'GET', 'POST', 'PUT', 'PATCH', 'DELETE', + or 'OPTIONS'. Any HTTP method is allowed, except for 'HEAD'. Use `'*'` to match against any HTTP + method (only when an exact match was not found, and any match with a specific method will be + given a higher priority over a wildcard match). Can be assigned an array of methods which has the + same result as adding the same route with different methods manually. + +- `vhost` - an optional domain string or an array of domain strings for limiting the route to only + requests with a matching host header field. Matching is done against the hostname part of the + header only (excluding the port). Defaults to all hosts. + +- `handler` - (required) the function called to generate the response after successful + authentication and validation. The handler function is described in + [Route handler](#route-handler). If set to a string, the value is parsed the same way a + prerequisite server method string shortcut is processed. Alternatively, `handler` can be assigned + an object with a single key using the name of a registered handler type and value with the + options passed to the registered handler. + +- `config` - additional [route options](#route-options). + +Note that the `options` object is deeply cloned (with the exception of `bind` which is shallowly +copied) and cannot contain any values that are unsafe to perform deep copy on. + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ port: 80 }); + +// Handler in top level + +var status = function (request, reply) { + + return reply('ok'); +}; + +server.route({ method: 'GET', path: '/status', handler: status }); + +// Handler in config + +var user = { + cache: { expiresIn: 5000 }, + handler: function (request, reply) { + + return reply({ name: 'John' }); + } +}; + +server.route({ method: 'GET', path: '/user', config: user }); +``` + +#### Route options + +Each route can be customized to change the default behavior of the request lifecycle using the +following options: +- `app` - application-specific configuration. Should not be used by [plugins](#plugins) which + should use `plugins[name]` instead. + +- `auth` - authentication configuration. Value can be: + - `false` to disable authentication if a default strategy is set. + - a string with the name of an authentication strategy registered with + [`server.auth.strategy()`](#serverauthstrategyname-scheme-mode-options). + - an object with: + - `mode` - the authentication mode. Defaults to `'required'` if a server authentication + strategy is configured, otherwise defaults to no authentication. Available values: + - `'required'` - authentication is required. + - `'optional'` - authentication is optional (must be valid if present). + - `'try'` - same as `'optional'` but allows for invalid authentication. + - `strategies` - a string array of strategy names in order they should be attempted. If + only one strategy is used, `strategy` can be used instead with the single string + value. Defaults to the default authentication strategy which is available only when a + single strategy is configured. + - `payload` - if set, the payload (in requests other than 'GET' and 'HEAD') is + authenticated after it is processed. Requires a strategy with payload authentication + support (e.g. [Hawk](#https://github.com/hueniverse/hawk)). Cannot be set to a value + other than `'required'` when the scheme sets the `options.payload` to `true`. + Available values: + - `false` - no payload authentication. This is the default value. + - `'required'` - payload authentication required. This is the default value when + the scheme sets `options.payload` to `true`. + - `'optional'` - payload authentication performed only when the client includes + payload authentication information (e.g. `hash` attribute in Hawk). + - `scope` - the application scope required to access the route. Value can be a scope + string or an array of scope strings. The authenticated credentials object `scope` + property must contain at least one of the scopes defined to access the route. + Set to `false` to remove scope requirements. Defaults to no scope required. + - `entity` - the required authenticated entity type. If set, must match the `entity` + value of the authentication credentials. Available values: + - `any` - the authentication can be on behalf of a user or application. This is the + default value. + - `user` - the authentication must be on behalf of a user. + - `app` - the authentication must be on behalf of an application. + +- `bind` - an object passed back to the provided `handler` (via `this`) when called. + +- `cache` - if the route method is 'GET', the route can be configured to include caching + directives in the response using the following options: + - `privacy` - determines the privacy flag included in client-side caching using the + 'Cache-Control' header. Values are: + - `'default'` - no privacy flag. This is the default setting. + - `'public'` - mark the response as suitable for public caching. + - `'private'` - mark the response as suitable only for private caching. + - `expiresIn` - relative expiration expressed in the number of milliseconds since the + item was saved in the cache. Cannot be used together with `expiresAt`. + - `expiresAt` - time of day expressed in 24h notation using the 'HH:MM' format, at which + point all cache records for the route expire. Cannot be used together with `expiresIn`. + +- `cors` - the [Cross-Origin Resource Sharing](http://www.w3.org/TR/cors/) protocol allows + browsers to make cross-origin API calls. CORS is required by web applications running + inside a browser which are loaded from a different domain than the API server. CORS + headers are disabled by default. To enable, set `cors` to `true`, or to an object with + the following options: + - `origin` - a strings array of allowed origin servers ('Access-Control-Allow-Origin'). + The array can contain any combination of fully qualified origins along with origin + strings containing a wildcard '*' character, or a single `'*'` origin string. Defaults + to any origin `['*']`. + - `matchOrigin` - if `true`, matches the value of the incoming 'Origin' header to the + list of `origin` values ('*' matches anything) and if a match is found, uses that as + the value of the 'Access-Control-Allow-Origin' response header. When false, the + `origin` config is returned as-is. Defaults to `true`. + - `isOriginExposed` - if `false`, prevents the connection from returning the full list + of non-wildcard `origin` values if the incoming origin header does not match any of + the values. Has no impact if `matchOrigin` is set to `false`. Defaults to `true`. + - `maxAge` - number of seconds the browser should cache the CORS response + ('Access-Control-Max-Age'). The greater the value, the longer it will take before the + browser checks for changes in policy. Defaults to `86400` (one day). + - `headers` - a strings array of allowed headers ('Access-Control-Allow-Headers'). + Defaults to `['Authorization', 'Content-Type', 'If-None-Match']`. + - `additionalHeaders` - a strings array of additional headers to `headers`. Use this to + keep the default headers in place. + - `methods` - a strings array of allowed HTTP methods ('Access-Control-Allow-Methods'). + Defaults to `['GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'OPTIONS']`. + - `additionalMethods` - a strings array of additional methods to `methods`. Use this to + keep the default methods in place. + - `exposedHeaders` - a strings array of exposed headers + ('Access-Control-Expose-Headers'). Defaults to + `['WWW-Authenticate', 'Server-Authorization']`. + - `additionalExposedHeaders` - a strings array of additional headers to + `exposedHeaders`. Use this to keep the default headers in place. + - `credentials` - if `true`, allows user credentials to be sent + ('Access-Control-Allow-Credentials'). Defaults to `false`. + - `override` - if `false`, preserves existing CORS headers set manually before the + response is sent. Defaults to `true`. + +- `files` - defines the behavior for serving static + resources using the built-in route handlers for files and directories: + - `relativeTo` - determines the folder relative paths are resolved against when using + the file and directory handlers. + +- `handler` - an alternative location for the route `handler` option. + +- `id` - an optional unique identifier used to look up the route using + [`server.lookup()`](#serverlookupid). + +- `json` - optional arguments passed to `JSON.stringify()` when converting an object or + error response to a string payload. Supports the following: + - `replacer` - the replacer function or array. Defaults to no action. + - `space` - number of spaces to indent nested object keys. Defaults to no indentation. + - `suffix` - string suffix added after conversion to JSON string. Defaults to no suffix. + +- `jsonp` - enables JSONP support by setting the value to the query parameter name containing + the function name used to wrap the response payload. For example, if the value is + `'callback'`, a request comes in with `'callback=me'`, and the JSON response is + `'{ "a":"b" }'`, the payload will be `'me({ "a":"b" });'`. Does not work with stream + responses. + +- `payload` - determines how the request payload is processed: + - `output` - the type of payload representation requested. The value must be one of: + - `'data'` - the incoming payload is read fully into memory. If `parse` is `true`, the + payload is parsed (JSON, form-decoded, multipart) based on the 'Content-Type' header. + If `parse` is false, the raw `Buffer` is returned. This is the default value except + when a proxy handler is used. + - `'stream'` - the incoming payload is made available via a `Stream.Readable` + interface. If the payload is 'multipart/form-data' and `parse` is `true`, fields + values are presented as text while files are provided as streams. File streams from a + 'multipart/form-data' upload will also have a property `hapi` containing `filename` + and `headers` properties. + - `'file'` - the incoming payload in written to temporary file in the directory + specified by the server's `payload.uploads` settings. If the payload is + 'multipart/form-data' and `parse` is `true`, fields values are presented as text + while files are saved. Note that it is the sole responsibility of the application to + clean up the files generated by the framework. This can be done by keeping track + of which files are used (e.g. using the `request.app` object), and listening to + the server `'response'` event to perform any needed cleaup. + - `parse` - can be `true`, `false`, or `gunzip`; determines if the incoming payload is + processed or presented raw. `true` and `gunzip` includes gunzipping when the appropriate + 'Content-Encoding' is specified on the received request. If parsing is enabled and the + 'Content-Type' is known (for the whole payload as well as parts), the payload is + converted into an object when possible. If the format is unknown, a Bad Request (400) + error response is sent. Defaults to `true`, except when a proxy handler is used. The + supported mime types are: + - 'application/json' + - 'application/x-www-form-urlencoded' + - 'application/octet-stream' + - 'text/*' + - 'multipart/form-data' + - `allow` - a string or an array of strings with the allowed mime types for the endpoint. + Defaults to any of the supported mime types listed above. Note that allowing other mime + types not listed will not enable them to be parsed, and that if parsing mode is + `'parse'`, the request will result in an error response. + - `override` - a mime type string overriding the 'Content-Type' header value received. + Defaults to no override. + - `maxBytes` - limits the size of incoming payloads to the specified byte count. + Allowing very large payloads may cause the server to run out of memory. Defaults to + `1048576` (1MB). + - `timeout` - payload reception timeout in milliseconds. Sets the maximum time allowed for the + client to transmit the request payload (body) before giving up and responding with a Request Timeout (408) error response. Set to `false` to disable. Defaults to `10000` (10 seconds). + - `uploads` - the directory used for writing file uploads. Defaults to `os.tmpDir()`. + - `failAction` - determines how to handle payload parsing errors. Allowed values are: + - `'error'` - return a Bad Request (400) error response. This is the default value. + - `'log'` - report the error but continue processing the request. + - `'ignore'` - take no action and continue processing the request. + +- `plugins` - plugin-specific configuration. `plugins` is an object where each key is a plugin + name and the value is the plugin configuration. + +- `pre` - an array with [route prerequisites](#route-prerequisites) methods which are executed + in serial or in parallel before the handler is called. + +- `response` - validation rules for the outgoing response payload (response body). Can only + validate object response: + - `schema` - the default response object validation rules (for all non-error responses) + expressed as one of: + - `true` - any payload allowed (no validation performed). This is the default. + - `false` - no payload allowed. + - a [Joi](http://github.com/hapijs/joi) validation object. This will receive the request's headers, params, query, payload, and auth credentials and isAuthenticated flags as context. + - a validation function using the signature `function(value, options, next)` where: + - `value` - the object containing the response object. + - `options` - the server validation options, merged with an object containing the request's headers, params, payload, and auth credentials object and isAuthenticated flag. + - `next(err)` - the callback function called when validation is completed. + - `status` - HTTP status-code-specific validation rules. The `status` key is set to an + object where each key is a 3 digit HTTP status code and the value has the same + definition as `schema`. If a response status code is not present in the `status` object, + the `schema` definition is used, expect for errors which are not validated by default. + - `sample` - the percent of responses validated (0 - 100). Set to `0` to disable all + validation. Defaults to `100` (all responses). + - `failAction` - defines what to do when a response fails validation. Options are: + - `error` - return an Internal Server Error (500) error response. This is the default + value. + - `log` - log the error but send the response. + - `modify` - if `true`, applies the validation rule changes to the response. Defaults to + `false`. + - `options` - options to pass to [Joi](http://github.com/hapijs/joi). Useful to set + global options such as `stripUnknown` or `abortEarly` (the complete list is available + [here](https://github.com/hapijs/joi#validatevalue-schema-options-callback)). Defaults to + no options. + +- `security` - sets common security headers (disabled by default). To enable set `security` to + `true` or to an object with the following options: + - `hsts` - controls the 'Strict-Transport-Security' header. If set to `true` the header + will be set to `max-age=15768000`, if specified as a number the maxAge parameter will + be set to that number. Defaults to `true`. You may also specify an object with the + following fields: + - `maxAge` - the max-age portion of the header, as a number. Default is `15768000`. + - `includeSubdomains` - a boolean specifying whether to add the `includeSubdomains` + flag to the header. + - `xframe` - controls the 'X-Frame-Options' header. When set to `true` the header will + be set to `DENY`, you may also specify a string value of 'deny' or 'sameorigin'. To + use the 'allow-from' rule, you must set this to an object with the following fields: + - `rule` - either 'deny', 'sameorigin', or 'allow-from' + - `source` - when `rule` is 'allow-from' this is used to form the rest of the + header, otherwise this field is ignored. If `rule` is 'allow-from' but `source` + is unset, the rule will be automatically changed to 'sameorigin'. + - `xss` - boolean that controls the 'X-XSS-PROTECTION' header for IE. Defaults to + `true` which sets the header to equal '1; mode=block'. NOTE: This setting can create + a security vulnerability in versions of IE below 8, as well as unpatched versions of + IE8. See [here](http://hackademix.net/2009/11/21/ies-xss-filter-creates-xss-vulnerabilities/) + and [here](https://technet.microsoft.com/library/security/ms10-002) for more + information. If you actively support old versions of IE, it may be wise to explicitly + set this flag to `false`. + - `noOpen` - boolean controlling the 'X-Download-Options' header for IE, preventing + downloads from executing in your context. Defaults to `true` setting the header to + 'noopen'. + - `noSniff` - boolean controlling the 'X-Content-Type-Options' header. Defaults to + `true` setting the header to its only and default option, 'nosniff'. + +- `state` - HTTP state management (cookies) allows + the server to store information on the client which is sent back to the server with every + request (as defined in [RFC 6265](https://tools.ietf.org/html/rfc6265)). `state` supports + the following options: + - `parse` - determines if incoming 'Cookie' headers are parsed and stored in the + `request.state` object. Defaults to `true`. + - `failAction` - determines how to handle cookie parsing errors. Allowed values are: + - `'error'` - return a Bad Request (400) error response. This is the default value. + - `'log'` - report the error but continue processing the request. + - `'ignore'` - take no action. + +- `validate` - request input validation rules for various request components. When using a + [Joi](http://github.com/hapijs/joi) validation object, the values of the other inputs (i.e. + `headers`, `query`, `params`, `payload`, and `auth`) are made available under the validation + context (accessible in rules as `Joi.ref('$query.key')`). Note that validation is performed in + order (i.e. headers, params, query, payload) and if type casting is used (converting a string to + number), the value of inputs not yet validated will reflect the raw, unvalidated and unmodified + values. The `validate` object supports: + + - `headers` - validation rules for incoming request headers. Values allowed: + - `true` - any headers allowed (no validation performed). This is the default. + - `false` - no headers allowed (this will cause all valid HTTP requests to fail). + - a [Joi](http://github.com/hapijs/joi) validation object. + - a validation function using the signature `function(value, options, next)` where: + - `value` - the object containing the request headers. + - `options` - the server validation options. + - `next(err, value)` - the callback function called when validation is completed. + + - `params` - validation rules for incoming request path parameters, after matching the path + against the route and extracting any parameters then stored in `request.params`. Values + allowed: + - `true` - any path parameters allowed (no validation performed). This is the default. + - `false` - no path variables allowed. + - a [Joi](http://github.com/hapijs/joi) validation object. + - a validation function using the signature `function(value, options, next)` where: + - `value` - the object containing the path parameters. + - `options` - the server validation options. + - `next(err, value)` - the callback function called when validation is completed. + + - `query` - validation rules for an incoming request URI query component (the key-value + part of the URI between '?' and '#'). The query is parsed into its individual key-value + pairs (using the [**qs** module](https://github.com/hapijs/qs)) and stored in + `request.query` prior to validation. Values allowed: + - `true` - any query parameters allowed (no validation performed). This is the default. + - `false` - no query parameters allowed. + - a [Joi](http://github.com/hapijs/joi) validation object. + - a validation function using the signature `function(value, options, next)` where: + - `value` - the object containing the query parameters. + - `options` - the server validation options. + - `next(err, value)` - the callback function called when validation is completed. + + - `payload` - validation rules for an incoming request payload (request body). Values + allowed: + - `true` - any payload allowed (no validation performed). This is the default. + - `false` - no payload allowed. + - a [Joi](http://github.com/hapijs/joi) validation object. + - a validation function using the signature `function(value, options, next)` where: + - `value` - the object containing the payload object. + - `options` - the server validation options. + - `next(err, value)` - the callback function called when validation is completed. + + - `errorFields` - an optional object with error fields copied into every validation error + response. + + - `failAction` - determines how to handle invalid requests. Allowed values are: + - `'error'` - return a Bad Request (400) error response. This is the default value. + - `'log'` - log the error but continue processing the request. + - `'ignore'` - take no action. + - a custom error handler function with the signature + 'function(request, reply, source, error)` where: + - `request` - the [request object](#request-object). + - `reply` - the continuation [reply interface](#reply-interface). + - `source` - the source of the invalid field (e.g. `'path'`, `'query'`, + `'payload'`). + - `error` - the error object prepared for the client response (including the + validation function error under `error.data`). + + - `options` - options to pass to [Joi](http://github.com/hapijs/joi). Useful to set + global options such as `stripUnknown` or `abortEarly` (the complete list is available + [here](https://github.com/hapijs/joi#validatevalue-schema-options-callback)). Defaults to + no options. + +- `timeout` - define timeouts for processing durations: + - `server` - response timeout in milliseconds. Sets the maximum time allowed for the + server to respond to an incoming client request before giving up and responding with + a Service Unavailable (503) error response. Disabled by default (`false`). + - `socket` - by default, node sockets automatically timeout after 2 minutes. Use this + option to override this behavior. Defaults to `undefined` which leaves the node + default unchanged. Set to `false` to disable socket timeouts. + +The following documentation options are also available when adding new routes (they are not +available when setting defaults): +- `description` - route description used for generating documentation (string). +- `notes` - route notes used for generating documentation (string or array of strings). +- `tags` - route tags used for generating documentation (array of strings). + +#### Route public interface + +When route information is returned or made available as a property, it is an object with the +following: +- `method` - the route HTTP method. +- `path` - the route path. +- `vhost` - the route vhost option if configured. +- `realm` - the [active realm](#serverrealm) associated with the route. +- `settings` - the [route options](#route-options) object with all defaults applied. + +### Path parameters + +Parameterized paths are processed by matching the named parameters to the content of the incoming +request path at that path segment. For example, '/book/{id}/cover' will match '/book/123/cover' and +`request.params.id` will be set to `'123'`. Each path segment (everything between the opening '/' +and the closing '/' unless it is the end of the path) can only include one named parameter. A +parameter can cover the entire segment ('/{param}') or part of the segment ('/file.{ext}'). + +An optional '?' suffix following the parameter name indicates an optional parameter (only allowed +if the parameter is at the ends of the path or only covers part of the segment as in +'/a{param?}/b'). For example, the route '/book/{id?}' matches '/book/' with the value of +`request.params.id` set to an empty string `''`. + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ port: 80 }); + +var getAlbum = function (request, reply) { + + return reply('You asked for ' + + (request.params.song ? request.params.song + ' from ' : '') + + request.params.album); +}; + +server.route({ + path: '/{album}/{song?}', + method: 'GET', + handler: getAlbum +}); +``` + +In addition to the optional `?` suffix, a parameter name can also specify the number of matching +segments using the `*` suffix, followed by a number greater than 1. If the number of expected parts +can be anything, then use `*` without a number (matching any number of segments can only be used in +the last path segment). + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ port: 80 }); + +var getPerson = function (request, reply) { + + var nameParts = request.params.name.split('/'); + return reply({ first: nameParts[0], last: nameParts[1] }); +}; + +server.route({ + path: '/person/{name*2}', // Matches '/person/john/doe' + method: 'GET', + handler: getPerson +}); +``` + +### Path matching order + +The router iterates through the routing table on each incoming request and executes the first (and +only the first) matching route. Route matching is done based on the combination of the request path +and the HTTP verb (e.g. 'GET, 'POST'). The query is excluded from the routing logic. Requests are +matched in a deterministic order where the order in which routes are added does not matter. + +Routes are matched based on the specificity of the route which is evaluated at each segment of the +incoming request path. Each request path is split into its segment (the parts separated by `'/'`). +The segments are compared to the routing table one at a time and are matched against the most +specific path until a match is found. If no match is found, the next match is tried. + +When matching routes, string literals (no path parameter) have the highest priority, followed by +mixed parameters (`'/a{p}b'`), parameters (`'/{p}'`), and then wildcard (`/{p*}`). + +Note that mixed parameters are slower to compare as they cannot be hashed and require an array +iteration over all the regular expressions representing the various mixed parameter at each +routing table node. + +#### Catch all route + +If the application needs to override the default Not Found (404) error response, it can add a +catch-all route for a specific method or all methods. Only one catch-all route can be defined per +server connection. + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ port: 80 }); + +var handler = function (request, reply) { + + return reply('The page was not found').code(404); +}; + +server.route({ method: '*', path: '/{p*}', handler: handler }); +``` + +### Route handler + +The route handler function uses the signature `function(request, reply)` where: +- `request` - is the incoming [request object](#request-object) (this is not the node.js request + object). +- `reply` - the [reply interface](#reply-interface) the handler must call to set a response and + return control back to the framework. + +```js +var handler = function (request, reply) { + + return reply('success'); +}; +``` + +#### Built-in handlers + +The framework comes with a few built-in handler types available by setting the route `handler` +config to an object containing one of these keys: + +- `file` - generates a static file endpoint for serving a single file. `file` can be set to: + - a relative or absolute file path string (relative paths are resolved based on the + route [`files`](#route.config.files) configuration). + - a function with the signature `function(request)` which returns the relative or absolute + file path. + - an object with the following options: + - `path` - a path string or function as described above. + - `filename` - an optional filename to specify if sending a 'Content-Disposition' + header, defaults to the basename of `path` + - `mode` - specifies whether to include the 'Content-Disposition' header with the + response. Available values: + - `false` - header is not included. This is the default value. + - `'attachment'` + - `'inline'` + - `lookupCompressed` - if `true`, looks for the same filename with the '.gz' suffix + for a pre-compressed version of the file to serve if the request supports content + encoding. Defaults to `false`. + +- `directory` - generates a directory endpoint for serving static content from a directory. + Routes using the directory handler must include a path parameter at the end of the path + string (e.g. `/path/to/somewhere/{param}` where the parameter name does not matter). The + path parameter can use any of the parameter options (e.g. `{param}` for one level files + only, `{param?}` for one level files or the directory root, `{param*}` for any level, or + `{param*3}` for a specific level). If additional path parameters are present, they are + ignored for the purpose of selecting the file system resource. The directory handler is an + object with the following options: + - `path` - (required) the directory root path (relative paths are resolved based on the + route [`files`](#route.config.files) configuration). Value can be: + - a single path string used as the prefix for any resources requested by appending the + request path parameter to the provided string. + - an array of path strings. Each path will be attempted in order until a match is + found (by following the same process as the single path string). + - a function with the signature `function(request)` which returns the path string or + an array of path strings. If the function returns an error, the error is passed back + to the client in the response. + - `index` - optional boolean|string|string[], determines if an index file will be served if found in the + folder when requesting a directory. The given string or strings specify the name(s) of the index file to look for. If `true`, looks for 'index.html'. Any falsy value disables index file lookup. Defaults to `true`. + - `listing` - optional boolean, determines if directory listing is generated when a + directory is requested without an index document. + Defaults to `false`. + - `showHidden` - optional boolean, determines if hidden files will be shown and served. + Defaults to `false`. + - `redirectToSlash` - optional boolean, determines if requests for a directory without a + trailing slash are redirected to the same path with the missing slash. Useful for + ensuring relative links inside the response are resolved correctly. Disabled when the + server config `router.stripTrailingSlash` is `true. `Defaults to `false`. + - `lookupCompressed` - optional boolean, instructs the file processor to look for the same + filename with the '.gz' suffix for a pre-compressed version of the file to serve if the + request supports content encoding. Defaults to `false`. + - `defaultExtension` - optional string, appended to file requests if the requested file is + not found. Defaults to no extension. + +- `proxy` - generates a reverse proxy handler with the + following options: + - `host` - the upstream service host to proxy requests to. The same path on the client + request will be used as the path on the host. + - `port` - the upstream service port. + - `protocol` - The protocol to use when making a request to the proxied host: + - `'http'` + - `'https'` + - `uri` - an absolute URI used instead of the incoming host, port, protocol, path, and + query. Cannot be used with `host`, `port`, `protocol`, or `mapUri`. + - `passThrough` - if `true`, forwards the headers sent from the client to the upstream + service being proxied to, headers sent from the upstream service will also be forwarded + to the client. Defaults to `false`. + - `localStatePassThrough` - if `false`, any locally defined state is removed from incoming + requests before being passed upstream. This is a security feature to prevent local state + (e.g. authentication cookies) from leaking upstream to other servers along with the + cookies intended for those servers. This value can be overridden on a per state basis via + the [`server.state()`](#serverstatename-options) `passThrough` option. + Defaults to `false`. + - `acceptEncoding` - if `false`, does not pass-through the 'Accept-Encoding' HTTP header + which is useful when using an `onResponse` post-processing to avoid receiving an encoded + response (e.g. gzipped). Can only be used together with `passThrough`. Defaults to `true` + (passing header). + - `rejectUnauthorized` - sets the `rejectUnauthorized` property on the https + [agent](http://nodejs.org/api/https.html#https_https_request_options_callback) + making the request. This value is only used when the proxied server uses TLS/SSL. When + set it will override the node.js `rejectUnauthorized` property. If `false` then ssl + errors will be ignored. When `true` the server certificate is verified and an 500 + response will be sent when verification fails. This shouldn't be used alongside the + `agent` setting as the `agent` will be used instead. Defaults to the https agent default + value of `true`. + - `xforward` - if `true`, sets the 'X-Forwarded-For', 'X-Forwarded-Port', + 'X-Forwarded-Proto' headers when making a request to the proxied upstream endpoint. + Defaults to `false`. + - `redirects` - the maximum number of HTTP redirections allowed, to be followed + automatically by the handler. Set to `false` or `0` to disable all redirections (the + response will contain the redirection received from the upstream service). If + redirections are enabled, no redirections (301, 302, 307, 308) will be passed along to + the client, and reaching the maximum allowed redirections will return an error response. + Defaults to `false`. + - `timeout` - number of milliseconds before aborting the upstream request. Defaults to + `180000` (3 minutes). + - `mapUri` - a function used to map the request URI to the proxied URI. Cannot be used + together with `host`, `port`, `protocol`, or `uri`. The function signature is + `function(request, callback)` where: + - `request` - is the incoming [request object](#request-object). + - `callback` - is `function(err, uri, headers)` where: + - `err` - internal error condition. + - `uri` - the absolute proxy URI. + - `headers` - optional object where each key is an HTTP request header and the + value is the header content. + - `onResponse` - a custom function for processing the response from the upstream service + before sending to the client. Useful for custom error handling of responses from the + proxied endpoint or other payload manipulation. Function signature is + `function(err, res, request, reply, settings, ttl)` where: + - `err` - internal or upstream error returned from attempting to contact the upstream + proxy. + - `res` - the node response object received from the upstream service. `res` is a + readable stream (use the [**wreck**](https://github.com/hapijs/wreck) module `read` + method to easily convert it to a Buffer or string). + - `request` - is the incoming [request object](#request-object). + - `reply` - the [reply interface](#reply-interface) function. + - `settings` - the proxy handler configuration. + - `ttl` - the upstream TTL in milliseconds if `proxy.ttl` it set to `'upstream'` and + the upstream response included a valid 'Cache-Control' header with 'max-age'. + - `ttl` - if set to `'upstream'`, applies the upstream response caching policy to the + response using the `response.ttl()` method (or passed as an argument to the `onResponse` + method if provided). + - `agent` - a node [http(s) agent](http://nodejs.org/api/http.html#http_class_http_agent) + to be used for connections to upstream server. + - `maxSockets` - sets the maximum number of sockets available per outgoing proxy host + connection. `false` means use the **wreck** module default value (Infinity). Does not + affect non-proxy outgoing client connections. Defaults to `Infinity`. + +- `view` - generates a template-based response. The `view` option can be set to one of: + - a string with the template file name. + - an object with the following keys: + - `template` - a string with the template file name. + - `context` - an optional template context object. Defaults to an object with the + following key: + - `payload` - maps to `request.payload`. + - `params` - maps to `request.params`. + - `query` - maps to `request.query`. + - `pre` - maps to `request.pre`. + - `options` - optional object used to override the server's views manager + configuration. + +### Route prerequisites + +It is often necessary to perform prerequisite actions before the handler is called (e.g. load +required reference data from a database). The route `pre` option allows defining such pre-handler +methods. The methods are called in order. If the `pre` array contains another array, those methods +are called in parallel. `pre` can be assigned a mixed array of: +- arrays containing the elements listed below, which are executed in parallel. +- objects with: + - `method` - the function to call (or short-hand method string as described below). the + function signature is identical to a route handler as describer in + [Route handler](#route-handler). + - `assign` - key name to assign the result of the function to within `request.pre`. + - `failAction` - determines how to handle errors returned by the method. Allowed values are: + - `'error'` - returns the error response back to the client. This is the default value. + - `'log'` - logs the error but continues processing the request. If `assign` is used, the + error will be assigned. + - `'ignore'` - takes no special action. If `assign` is used, the error will be assigned. +- functions - same as including an object with a single `method` key. +- strings - special short-hand notation for registered + [server methods](#servermethodname-method-options) using the format 'name(args)' (e.g. + `'user(params.id)'`) where: + - 'name' - the method name. The name is also used as the default value of `assign`. + - 'args' - the method arguments (excluding `next`) where each argument is a property of + the [request object](#request-object). + +Note that prerequisites do not follow the same rules of the normal +[reply interface](#reply-interface). In all other cases, calling `reply()` with or without a value +will use the result as the response sent back to the client. In a prerequisite method, calling +`reply()` will assign the returned value to the provided `assign` key. If the returned value is an +error, the `failAction` setting determines the behavior. To force the return value as the response +and ends the request lifecycle, use the `reply().takeover()` method. + +The reason for the difference in the reply interface behavior is to allow reusing handlers and +prerequisites methods interchangeably. By default, the desired behavior for a prerequisite is to +retain the result value and pass it on to the next step. Errors end the lifecycle by default. While +less consistent, this allows easier code reusability. + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ port: 80 }); + +var pre1 = function (request, reply) { + + return reply('Hello'); +}; + +var pre2 = function (request, reply) { + + return reply('World'); +}; + +var pre3 = function (request, reply) { + + return reply(request.pre.m1 + ' ' + request.pre.m2); +}; + +server.route({ + method: 'GET', + path: '/', + config: { + pre: [ + [ + // m1 and m2 executed in parallel + { method: pre1, assign: 'm1' }, + { method: pre2, assign: 'm2' } + ], + { method: pre3, assign: 'm3' }, + ], + handler: function (request, reply) { + + return reply(request.pre.m3 + '\n'); + } + } +}); +``` + +### Request object + +The request object is created internally for each incoming request. It is **different** from the +node.js request object received from the HTTP server callback (which is available in +`request.raw.req`). The request object methods and properties change throughout the +[request lifecycle](#request-lifecycle). + +#### Request properties + +Each request object includes the following properties: + +- `app` - application-specific state. Provides a safe place to store application data without + potential conflicts with the framework. Should not be used by [plugins](#plugins) which should use + `plugins[name]`. +- `auth` - authentication information: + - `isAuthenticated` - `true` is the request has been successfully authenticated, otherwise + `false`. + - `credentials` - the `credential` object received during the authentication process. The + presence of an object does not mean successful authentication. + - `artifacts` - an artifact object received from the authentication strategy and used in + authentication-related actions. + - `mode` - the route authentication mode. + - `error` - the authentication error is failed and mode set to `'try'`. + - `session` - an object used by the + [`'cookie'` authentication scheme](https://github.com/hapijs/hapi-auth-cookie). +- `domain` - the node domain object used to protect against exceptions thrown in extensions, + handlers and [route prerequisites](#route-prerequisites). Can be used to manually bind callback + functions otherwise bound to other domains. +- `headers` - the raw request headers (references `request.raw.headers`). +- `id` - a unique request identifier (using the format '{now}:{connection.info.id}:{5 digits counter}'). +- `info` - request information: + - `received` - request reception timestamp. + - `responded` - request response timestamp (`0` is not responded yet). + - `remoteAddress` - remote client IP address. + - `remotePort` - remote client port. + - `referrer` - content of the HTTP 'Referrer' (or 'Referer') header. + - `host` - content of the HTTP 'Host' header (e.g. 'example.com:8080'). + - `hostname` - the hostname part of the 'Host' header (e.g. 'example.com'). +- `method` - the request method in lower case (e.g. `'get'`, `'post'`). +- `mime` - the parsed content-type header. Only available when payload parsing enabled and no + payload error occurred. +- `orig` - an object containing the values of `params`, `query`, and `payload` before any + validation modifications made. Only set when input validation is performed. +- `params` - an object where each key is a path parameter name with matching value as described in + [Path parameters](#path-parameters). +- `paramsArray` - an array containing all the path `params` values in the order they appeared in + the path. +- `path` - the request URI's path component. +- `payload` - the request payload based on the route `payload.output` and `payload.parse` settings. +- `plugins` - plugin-specific state. Provides a place to store and pass request-level plugin data. + The `plugins` is an object where each key is a plugin name and the value is the state. +- `pre` - an object where each key is the name assigned by a + [route prerequisites](#route-prerequisites) function. The values are the raw values provided to + the continuation function as argument. For the wrapped response object, use `responses`. +- `response` - the response object when set. The object can be modified but must not be assigned + another object. To replace the response with another from within an + [extension point](#serverextevent-method-options), use `reply(response)` to override with a + different response. Contains `null` when no response has been set (e.g. when a request terminates + prematurely when the client disconnects). +- `preResponses` - same as `pre` but represented as the response object created by the pre method. +- `query` - an object containing the query parameters. +- `raw` - an object containing the Node HTTP server objects. **Direct interaction with these raw + objects is not recommended.** + - `req` - the node.js request object. + - `res` - the node.js response object. +- `route` - the [route public interface](#route-public-interface). +- `server` - the server object. +- `session` - Special key reserved for [plugins](#plugins) implementing session support. Plugins + utilizing this key must check for `null` value to ensure there is no conflict with another + similar server. +- `state` - an object containing parsed HTTP state information (cookies) where each key is the + cookie name and value is the matching cookie content after processing using any registered cookie + definition. +- `url` - the parsed request URI. + +#### `request.setUrl(url)` + +_Available only in `'onRequest'` extension methods._ + +Changes the request URI before the router begins processing the request where: + - `url` - the new request path value. + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ port: 80 }); + +server.ext('onRequest', function (request, reply) { + + // Change all requests to '/test' + request.setUrl('/test'); + return reply.continue(); +}); +``` + +#### `request.setMethod(method)` + +_Available only in `'onRequest'` extension methods._ + +Changes the request method before the router begins processing the request where: +- `method` - is the request HTTP method (e.g. `'GET'`). + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ port: 80 }); + +server.ext('onRequest', function (request, reply) { + + // Change all requests to 'GET' + request.setMethod('GET'); + return reply.continue(); +}); +``` + +#### `request.log(tags, [data, [timestamp]])` + +_Always available._ + +Logs request-specific events. When called, the server emits a `'request'` event which can be used +by other listeners or [plugins](#plugins). The arguments are: +- `tags` - a string or an array of strings (e.g. `['error', 'database', 'read']`) used to identify + the event. Tags are used instead of log levels and provide a much more expressive mechanism for + describing and filtering events. +- `data` - an optional message string or object with the application data being logged. +- `timestamp` - an optional timestamp expressed in milliseconds. Defaults to `Date.now()` (now). + +Any logs generated by the server internally will be emitted only on the `'request-internal'` +channel and will include the `event.internal` flag set to `true`. + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ port: 80 }); + +server.on('request', function (request, event, tags) { + + if (tags.error) { + console.log(event); + } +}); + +var handler = function (request, reply) { + + request.log(['test', 'error'], 'Test event'); + return reply(); +}; +``` + +#### `request.getLog([tags], [internal])` + +_Always available._ + +Returns an array containing the events matching any of the tags specified (logical OR) where: +- `tags` - is a single tag string or array of tag strings. If no `tags` specified, returns all + events. +- `internal` - filters the events to only those with a matching `event.internal` value. If `true`, + only internal logs are included. If `false`, only user event are included. Defaults to all events + (`undefined`). + +```js +request.getLog(); +request.getLog('error'); +request.getLog(['error', 'auth']); +request.getLog(['error'], true); +request.getLog(false); +``` + +#### `request.tail([name])` + +_Available until immediately after the `'response'` event is emitted._ + +Adds a request tail which has to complete before the [request lifecycle](#request-lifecycle) is +complete where: +- `name` - an optional tail name used for logging purposes. + +Returns a tail function which must be called when the tail activity is completed. + +Tails are actions performed throughout the [request lifecycle](#request-lifecycle), but which may +end after a response is sent back to the client. For example, a request may trigger a database +update which should not delay sending back a response. However, it is still desirable to associate +the activity with the request when logging it (or an error associated with it). + +When all tails completed, the server emits a `'tail'` event. + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ port: 80 }); + +var get = function (request, reply) { + + var dbTail = request.tail('write to database'); + + db.save('key', 'value', function () { + + dbTail(); + }); + + return reply('Success!'); +}; + +server.route({ method: 'GET', path: '/', handler: get }); + +server.on('tail', function (request) { + + console.log('Request completed including db activity'); +}); +``` + +#### Request events + +The [request object](#request-object) supports the following events: + +- `'peek'` - emitted for each chunk of payload data read from the client connection. The event + method signature is `function(chunk, encoding)`. +- `'finish'` - emitted when the request payload finished reading. The event method signature is + `function ()`. +- `'disconnect'` - emitted when a request errors or aborts unexpectedly. + +```js +var Crypto = require('crypto'); +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ port: 80 }); + +server.ext('onRequest', function (request, reply) { + + var hash = Crypto.createHash('sha1'); + request.on('peek', function (chunk) { + + hash.update(chunk); + }); + + request.once('finish', function () { + + console.log(hash.digest('hex')); + }); + + request.once('disconnect', function () { + + console.error('request aborted'); + }); + + return reply.continue(); +}); +``` + +## Reply interface + +The various [request lifecycle](#request-lifecycle) events (e.g. extensions, authentication, +[route prerequisites](#route-prerequisites), handlers) provide a reply interface as one of the +function arguments. The reply interface acts as both a callback interface to return control to the +framework and a response generator. + +When `reply()` is called with an error or result response, that value is used as the response sent +to the client. When `reply()` is called within a prerequisite, the value is saves for future use +and is not used as the response. In all other places except for the handler, calling `reply()` will +be considered an error and will abort the [request lifecycle](#request-lifecycle), jumping directly +to the `'onPreResponse'` event. + +To return control to the framework within an [extension](#serverextevent-method-options) or other +places other than the handler, without setting a response, the method +[`reply.continue()`](#replycontinuedata) must be called. + +### `reply([err], [result])` + +Concludes the handler activity by setting a response and returning control over to the framework +where: +- `err` - an optional error response. +- `result` - an optional response payload. + +Since an request can only have one response regardless if it is an error or success, the `reply()` +method can only result in a single response value. This means that passing both an `err` and +`result` will only use the `err`. There is no requirement for either `err` or `result` to be (or +not) an `Error` object. The framework will simply use the first argument if present, otherwise the +second. The method supports two arguments to be compatible with the common callback pattern of +error first. + +Both `err` and `result` can be set to: +- `null` +- `undefined` +- string +- number +- boolean +- `Buffer` object +- `Error` object +- `Stream` object (**Note** - any `Stream` object must be compatible with the "streams2" API and not be in `objectMode`) +- Promise object +- any other object or array + +```js +var handler = function (request, reply) { + + return reply('success'); +}; +``` + +If the input is not an `Error` object, the method returns a [`response`](#response-object) object +which provides a set of methods to customize the response (e.g. HTTP status code, custom headers, +etc.). If the input is an `Error` object, the method returns back the error wrapped in a +[`Boom`](https://github.com/hapijs/boom) object. + +Note that when used to return both an error and credentials in the authentication methods, +`reply()` must be called with three arguments `function(err, null, data)` where `data` is the +additional authentication information. + +The [response flow control rules](#flow-control) apply. + +```js +// Detailed notation + +var handler = function (request, reply) { + + var response = reply('success'); + response.type('text/plain'); + response.header('X-Custom', 'some-value'); +}; + +// Chained notation + +var handler = function (request, reply) { + + return reply('success') + .type('text/plain') + .header('X-Custom', 'some-value'); +}; +``` + +Note that if `result` is a `Stream` with a `statusCode` property, that status code will be used as +the default response code. + +Any value provided to `reply()` (including no value) will be used as the response sent back to the +client. This means calling `reply()` with a value in an +[extension methods](#serverextevent-method-options) or authentication function will be considered +an error and will terminate the [request lifecycle](#request-lifecycle). With the exception of the +handler function, all other methods provide the `reply.continue()` method which instructs the +framework to continue processing the request without setting a response. + +#### Response object + +Every response includes the following properties: +- `statusCode` - the HTTP response status code. Defaults to `200` (except for errors). +- `headers` - an object containing the response headers where each key is a header field name. Note + that this is an incomplete list of headers to be included with the response. Additional headers + will be added once the response is prepare for transmission. +- `source` - the value provided using the [reply interface](#reply-interface). +- `variety` - a string indicating the type of `source` with available values: + - `'plain'` - a plain response such as string, number, `null`, or simple object (e.g. not a + `Stream`, `Buffer`, or view). + - `'buffer'` - a `Buffer`. + - `'view'` - a view generated with [`reply.view()`](#replyviewtemplate-context-options). + - `'file'` - a file generated with [`reply.file()`](#replyfilepath-options) of via the + directory handler. + - `'stream'` - a `Stream`. + - `'promise'` - a Promise object. +- `app` - application-specific state. Provides a safe place to store application data without + potential conflicts with the framework. Should not be used by [plugins](#plugins) which should + use `plugins[name]`. +- `plugins` - plugin-specific state. Provides a place to store and pass request-level plugin data. + The `plugins` is an object where each key is a plugin name and the value is the state. +- `settings` - response handling flags: + - `charset` - the 'Content-Type' HTTP header 'charset' property. Defaults to `'utf-8'`. + - `encoding` - the string encoding scheme used to serial data into the HTTP payload when + `source` is a string or marshals into a string. + Defaults to `'utf8'`. + - `passThrough` - if `true` and `source` is a `Stream`, copies the `statusCode` and `headers` + of the stream to the outbound response. Defaults to `true`. + - `stringify` - options used for `source` value requiring stringification. Defaults to no + replacer and no space padding. + - `ttl` - if set, overrides the route cache expiration milliseconds value set in the route + config. Defaults to no override. + - `varyEtag` - if `true`, a suffix will be automatically added to the 'ETag' header at + transmission time (separated by a `'-'` character) when the HTTP 'Vary' header is present. + +The response object provides the following methods: +- `bytes(length)` - sets the HTTP 'Content-Length' header (to avoid chunked transfer encoding) + where: + - `length` - the header value. Must match the actual payload size. +- `charset(charset)` - sets the 'Content-Type' HTTP header 'charset' property where: + `charset` - the charset property value. +- `code(statusCode)` - sets the HTTP status code where: + - `statusCode` - the HTTP status code. +- `created(uri)` - sets the HTTP status code to Created (201) and the HTTP 'Location' header where: + `uri` - an absolute or relative URI used as the 'Location' header value. +- `encoding(encoding)` - sets the string encoding scheme used to serial data into the HTTP payload + where: + `encoding` - the encoding property value (see + [node Buffer encoding](http://nodejs.org/api/buffer.html#buffer_buffer)). +- `etag(tag, options)` - sets the representation + [entity tag](http://tools.ietf.org/html/rfc7232#section-2.3) where: + - `tag` - the entity tag string without the double-quote. + - `options` - optional settings where: + - `weak` - if `true`, the tag will be prefixed with the `'W/'` weak signifier. Weak tags + will fail to match identical tags for the purpose of determining 304 response status. + Defaults to `false`. + - `vary` - if `true` and content encoding is set or applied to the response (e.g 'gzip' or + 'deflate'), the encoding name will be automatically added to the tag at transmission time + (separated by a `'-'` character). Ignored when `weak` is `true`. Defaults to `true`. +- `header(name, value, options)` - sets an HTTP header where: + - `name` - the header name. + - `value` - the header value. + - `options` - optional settings where: + - `append` - if `true`, the value is appended to any existing header value using + `separator`. Defaults to `false`. + - `separator` - string used as separator when appending to an exiting value. Defaults to + `','`. + - `override` - if `false`, the header value is not set if an existing value present. + Defaults to `true`. +- `location(uri)` - sets the HTTP 'Location' header where: + - `uri` - an absolute or relative URI used as the 'Location' header value. +- `redirect(uri)` - sets an HTTP redirection response (302) and decorates the response with + additional methods listed below, where: + - `uri` - an absolute or relative URI used to redirect the client to another resource. +- `replacer(method)` - sets the `JSON.stringify()` `replacer` argument where: + - `method` - the replacer function or array. Defaults to none. +- `spaces(count)` - sets the `JSON.stringify()` `space` argument where: + - `count` - the number of spaces to indent nested object keys. Defaults to no indentation. +- `state(name, value, [options])` - sets an HTTP cookie where: + - `name` - the cookie name. + - `value` - the cookie value. If no `encoding` is defined, must be a string. + - `options` - optional configuration. If the state was previously registered with the server + using [`server.state()`](#serverstatename-options), + the specified keys in `options` override those same keys in the server definition (but not + others). +- `suffix(suffix)` - sets a string suffix when the response is process via `JSON.stringify()`. +- `ttl(msec)` - overrides the default route cache expiration rule for this response instance where: + - `msec` - the time-to-live value in milliseconds. +- `type(mimeType)` - sets the HTTP 'Content-Type' header where: + - `value` - is the mime type. Should only be used to override the built-in default for each + response type. +- `unstate(name, [options])` - clears the HTTP cookie by setting an expired value where: + - `name` - the cookie name. + - `options` - optional configuration for expiring cookie. If the state was previously + registered with the server using [`server.state()`](#serverstatename-options), the specified + keys in `options` override those same keys in the server definition (but not others). +- `vary(header)` - adds the provided header to the list of inputs affected the response generation + via the HTTP 'Vary' header where: + - `header` - the HTTP request header name. + +##### Response Object Redirect Methods + +When using the `redirect()` method, the response object provides these additional methods: + +- `temporary(isTemporary)` - sets the status code to `302` or `307` (based on the `rewritable()` + setting) where: + - `isTemporary` - if `false`, sets status to permanent. Defaults to `true`. +- `permanent(isPermanent)` - sets the status code to `301` or `308` (based on the `rewritable()` + setting) where: + - `isPermanent` - if `true`, sets status to temporary. Defaults to `false`. +- `rewritable(isRewritable)` - sets the status code to `301`/`302` for rewritable (allows changing + the request method from 'POST' to 'GET') or `307`/`308` for non-rewritable (does not allow + changing the request method from 'POST' to 'GET'). Exact code based on the `temporary()` or + `permanent()` setting. Arguments: + - `isRewritable` - if `false`, sets to non-rewritable. Defaults to `true`. + +| | Permanent | Temporary | +| -------------- | ---------- | --------- | +| Rewritable | 301 | **302**(1)| +| Non-rewritable | 308(2) | 307 | + +Notes: +1. Default value. +2. [Proposed code](http://tools.ietf.org/id/draft-reschke-http-status-308-07.txt), not supported by + all clients. + +##### Response events + +The response object supports the following events: + +- `'peek'` - emitted for each chunk of data written back to the client connection. The event method + signature is `function(chunk, encoding)`. +- `'finish'` - emitted when the response finished writing but before the client response connection + is ended. The event method signature is `function ()`. + +```js +var Crypto = require('crypto'); +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ port: 80 }); + +server.ext('onPreResponse', function (request, reply) { + + var response = request.response; + if (response.isBoom) { + return reply(); + } + + var hash = Crypto.createHash('sha1'); + response.on('peek', function (chunk) { + + hash.update(chunk); + }); + + response.once('finish', function () { + + console.log(hash.digest('hex')); + }); + + return reply.continue(); +}); +``` + +#### Error response + +**hapi** uses the [**boom**](https://github.com/hapijs/boom) error library for all its internal +error generation. **boom** provides an expressive interface to return HTTP errors. Any error +returned via the [reply interface](#reply-interface) is converted to a **boom** object and defaults +to status code `500` if the error is not a **boom** object. + +When the error is sent back to the client, the responses contains a JSON object with the +`statusCode`, `error`, and `message` keys. + +```js +var Hapi = require('hapi'); +var Boom = require('boom'); + +var server = new Hapi.Server(); + +server.route({ + method: 'GET', + path: '/badRequest', + handler: function (request, reply) { + + return reply(Boom.badRequest('Unsupported parameter')); + } +}); + +server.route({ + method: 'GET', + path: '/internal', + handler: function (request, reply) { + + return reply(new Error('unexpect error')); + } +}); +``` + +##### Error transformation + +Errors can be customized by changing their `output` content. The **boom** error object includes the +following properties: +- `isBoom` - if `true`, indicates this is a `Boom` object instance. +- `message` - the error message. +- `output` - the formatted response. Can be directly manipulated after object construction to + return a custom error response. Allowed root keys: + - `statusCode` - the HTTP status code (typically 4xx or 5xx). + - `headers` - an object containing any HTTP headers where each key is a header name and value + is the header content. + - `payload` - the formatted object used as the response payload (stringified). Can be directly + manipulated but any changes will be lost + if `reformat()` is called. Any content allowed and by default includes the following content: + - `statusCode` - the HTTP status code, derived from `error.output.statusCode`. + - `error` - the HTTP status message (e.g. 'Bad Request', 'Internal Server Error') derived + from `statusCode`. + - `message` - the error message derived from `error.message`. +- inherited `Error` properties. + +It also supports the following method: +- `reformat()` - rebuilds `error.output` using the other object properties. + +```js +var Boom = require('boom'); + +var handler = function (request, reply) { + + var error = Boom.badRequest('Cannot feed after midnight'); + error.output.statusCode = 499; // Assign a custom error code + error.reformat(); + + error.output.payload.custom = 'abc_123'; // Add custom key + + return reply(error); +}); +``` + +When a different error representation is desired, such as an HTML page or a different payload +format, the `'onPreResponse'` extension point may be used to identify errors and replace them with +a different response object. + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ port: 80 }); +server.views({ + engines: { + html: require('handlebars') + } +}); + +server.ext('onPreResponse', function (request, reply) { + + var response = request.response; + if (!response.isBoom) { + return reply.continue(); + } + + // Replace error with friendly HTML + + var error = response; + var ctx = { + message: (error.output.statusCode === 404 ? 'page not found' : 'something went wrong') + }; + + return reply.view('error', ctx); +}); +``` + +#### Flow control + +When calling `reply()`, the framework waits until `process.nextTick()` to continue processing the +request and transmit the response. This enables making changes to the returned +[response object](#response-object) before the response is sent. This means the framework +will resume as soon as the handler method exits. To suspend this behavior, the returned +`response` object supports the following methods: +- `hold()` - puts the response on hold until `response.send()` is called. Available only after + `reply()` is called and until `response.hold()` is invoked once. +- `send()` - resume the response which will be transmitted in the next tick. Available only after + `response.hold()` is called and until `response.send()` is invoked once. + +```js +var handler = function (request, reply) { + + var response = reply('success').hold(); + + setTimeout(function () { + + response.send(); + }, 1000); +}; +``` + +### `reply.continue([data])` + +Returns control back to the framework without setting a response. If called in the handler, the +response defaults to an empty payload with status code `200`. The `data` argument is only used for +passing back authentication data and is ignored elsewhere. + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ port: 80 }); + +server.ext('onRequest', function (request, reply) { + + // Change all requests to '/test' + request.setUrl('/test'); + return reply.continue(); +}); +``` + +### `reply.file(path, [options])` + +Transmits a file from the file system. The 'Content-Type' header defaults to the matching mime type +based on filename extension.: + +- `path` - the file path. +- `options` - optional settings: + - `filename` - an optional filename to specify if sending a 'Content-Disposition' header, + defaults to the basename of `path` + - `mode` - specifies whether to include the 'Content-Disposition' header with the response. + Available values: + - `false` - header is not included. This is the default value. + - `'attachment'` + - `'inline'` + - `lookupCompressed` - if `true`, looks for the same filename with the '.gz' suffix for a + pre-compressed version of the file to serve if the request supports content encoding. + Defaults to `false`. + +No return value. + +The [response flow control rules](#flow-control) **do not** apply. + +```js +var handler = function (request, reply) { + + return reply.file('./hello.txt'); +}; +``` + +### `reply.view(template, [context, [options]])` + +Concludes the handler activity by returning control over to the router with a templatized view +response where: + +- `template` - the template filename and path, relative to the templates path configured via the + server views manager. +- `context` - optional object used by the template to render context-specific result. Defaults to + no context `{}`. +- `options` - optional object used to override the server's views manager configuration for this + response. Cannot override `isCached`, `partialsPath`, or `helpersPath` which are only loaded at + initialization. + +Returns a [response object](#response-object). + +The [response flow control rules](#flow-control) apply. + +```js +var Hapi = require('hapi'); +var server = new Hapi.Server(); +server.connection({ port: 80 }); +server.views({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates' +}); + +var handler = function (request, reply) { + + var context = { + title: 'Views Example', + message: 'Hello, World' + }; + + return reply.view('hello', context); +}; + +server.route({ method: 'GET', path: '/', handler: handler }); +``` + +**templates/hello.html** + +```html + + + + {{title}} + + +
+

{{message}}

+
+ + +``` + +### `reply.close([options])` + +Concludes the handler activity by returning control over to the router and informing the router +that a response has already been sent back directly via `request.raw.res` and that no further +response action is needed. Supports the following optional options: +- `end` - if `false`, the router will not call `request.raw.res.end())` to ensure the response was + ended. Defaults to `true`. + +No return value. + +The [response flow control rules](#flow-control) **do not** apply. + +### `reply.proxy(options)` + +Proxies the request to an upstream endpoint where: +- `options` - an object including the same keys and restrictions defined by the + [route `proxy` handler options](#route.config.proxy). + +No return value. + +The [response flow control rules](#flow-control) **do not** apply. + +```js +var handler = function (request, reply) { + + return reply.proxy({ host: 'example.com', port: 80, protocol: 'http' }); +}; +``` + +### `reply.redirect(uri)` + +Redirects the client to the specified uri. Same as calling `reply().redirect(uri)`. + +Returns a [response object](#response-object). + +The [response flow control rules](#flow-control) apply. + +```js +var handler = function (request, reply) { + + return reply.redirect('http://example.com'); +}; +``` + +Changing to a permanent or non-rewritable redirect is also available see +[response object redirect](#response-object-redirect) for more information. diff --git a/node_modules/hapi/CHANGELOG.md b/node_modules/hapi/CHANGELOG.md new file mode 100755 index 0000000..4ed58a4 --- /dev/null +++ b/node_modules/hapi/CHANGELOG.md @@ -0,0 +1,1105 @@ +## [**8.2.0**](https://github.com/hapijs/hapi/issues?milestone=135&state=closed) +- [**#2396**](https://github.com/hapijs/hapi/issues/2396) Inert 2.1.3 update +- [**#2397**](https://github.com/hapijs/hapi/issues/2397) throw when attaching route handlers without a connection +- [**#2374**](https://github.com/hapijs/hapi/issues/2374) Server methods context not available in route prerequisites +- [**#2392**](https://github.com/hapijs/hapi/issues/2392) No Payload Validation +- [**#2395**](https://github.com/hapijs/hapi/issues/2395) Update jshttp/mime-db to 1.6.1 from 1.5.0 +- [**#2370**](https://github.com/hapijs/hapi/issues/2370) Add xss protection to validation response +- [**#2362**](https://github.com/hapijs/hapi/issues/2362) Don't respond to connections until listening is started +- [**#2363**](https://github.com/hapijs/hapi/issues/2363) Refuse to handle incoming request after server is stopped +- [**#2347**](https://github.com/hapijs/hapi/issues/2347) Improve error message when validation.payload is set but type is GET +- [**#2309**](https://github.com/hapijs/hapi/issues/2309) Fixes #2308 by logging boom error object instead of just message +- [**#2308**](https://github.com/hapijs/hapi/issues/2308) Logging boom errors from handlers should send boom error to log not just message +- [**#2372**](https://github.com/hapijs/hapi/issues/2372) inert 2.1.2 +- [**#2359**](https://github.com/hapijs/hapi/issues/2359) Remove '{}' payload from cors OPTIONS response +- [**#2354**](https://github.com/hapijs/hapi/issues/2354) Update API.md for inert 2.1.0 +- [**#2366**](https://github.com/hapijs/hapi/issues/2366) Update hapijs/catbox to 4.2.1 from 4.2.0 + - **hapijs/catbox 4.2.1** + - [**#116**](https://github.com/hapijs/catbox/issues/116) Prefix keys with a `'+'` when using object as a hash +- [**#2355**](https://github.com/hapijs/hapi/issues/2355) Fix table labels + +## [**8.1.0**](https://github.com/hapijs/hapi/issues?milestone=133&state=closed) +- [**#2335**](https://github.com/hapijs/hapi/issues/2335) Expose the request object in inject() +- [**#2277**](https://github.com/hapijs/hapi/issues/2277) Fix invalid response for empty reply() (v8.x regression) +- [**#2316**](https://github.com/hapijs/hapi/issues/2316) Update jshttp/mime-db to 1.5.0 from 1.3.1 +- [**#2302**](https://github.com/hapijs/hapi/issues/2302) allow replying with a stream as returned by node core http client methods +- [**#2301**](https://github.com/hapijs/hapi/issues/2301) can't reply with stream returned by node core http client methods +- [**#2291**](https://github.com/hapijs/hapi/issues/2291) external listener protocol issue +- [**#2331**](https://github.com/hapijs/hapi/issues/2331) Revise range tests to not depend on the inert module +- [**#2324**](https://github.com/hapijs/hapi/issues/2324) Remove catch call for promise replies +- [**#2323**](https://github.com/hapijs/hapi/issues/2323) Promise support +- [**#2300**](https://github.com/hapijs/hapi/issues/2300) Bumped mime-db version + +## [**8.0.0**](https://github.com/hapijs/hapi/issues?milestone=127&state=closed) +- [**#2271**](https://github.com/hapijs/hapi/issues/2271) Update jshttp/mime-db to 1.3.0 from 1.2.0 +- [**#2270**](https://github.com/hapijs/hapi/issues/2270) Update hapijs/boom to 2.6.1 from 2.6.0 + - **hapijs/boom 2.6.1** + - [**#40**](https://github.com/hapijs/boom/issues/40) Lab 5.0, code 1.0 +- [**#2269**](https://github.com/hapijs/hapi/issues/2269) Update hapijs/shot to 1.4.0 from 1.3.5 + - **hapijs/shot 1.4.0** + - [**#19**](https://github.com/hapijs/shot/issues/19) optionally accept an object as the `url` +- [**#2268**](https://github.com/hapijs/hapi/issues/2268) Update hapijs/joi to 5.0.2 from 5.0.0 + - **hapijs/joi 5.0.2** + - [**#505**](https://github.com/hapijs/joi/issues/505) Convert date regex to date before comparison. Closes #503. + - [**#503**](https://github.com/hapijs/joi/issues/503) Joi.date().iso() throws error when required() is used. + - **hapijs/joi 5.0.1** + - [**#502**](https://github.com/hapijs/joi/issues/502) Joi.array() modifies original array +- [**#2262**](https://github.com/hapijs/hapi/issues/2262) Change server.table() result from object to array +- [**#2255**](https://github.com/hapijs/hapi/issues/2255) Throw when calling reply() with objectMode stream +- [**#2249**](https://github.com/hapijs/hapi/issues/2249) Add 'uri' connection option +- [**#2247**](https://github.com/hapijs/hapi/issues/2247) Split debug settings per event type +- [**#2246**](https://github.com/hapijs/hapi/issues/2246) plugin dependencies error message changed +- [**#2234**](https://github.com/hapijs/hapi/issues/2234) Support views in auth schemes +- [**#2243**](https://github.com/hapijs/hapi/issues/2243) Fix reply.continue() in prerequisite. +- [**#2244**](https://github.com/hapijs/hapi/issues/2244) Fix reply.continue() in prerequisite. Closes #2243 +- [**#2242**](https://github.com/hapijs/hapi/issues/2242) Uncaught error: Cannot read property 'isBoom' of null in hapi/lib/handler.js +- [**#2241**](https://github.com/hapijs/hapi/issues/2241) Remove string notation method logging when cache not setup +- [**#2226**](https://github.com/hapijs/hapi/issues/2226) When using string shorthand in pre it does not provide reply interface +- [**#2240**](https://github.com/hapijs/hapi/issues/2240) Cached method in string notation bypasses cache +- [**#2238**](https://github.com/hapijs/hapi/issues/2238) Conditional Validation Rules based on Auth +- [**#2233**](https://github.com/hapijs/hapi/issues/2233) Populate connection.info.uri before start when port 0 +- [**#2237**](https://github.com/hapijs/hapi/issues/2237) Support bare server (no files, proxy, views) +- [**#1971**](https://github.com/hapijs/hapi/issues/1971) Allow plugins to extend Server +- [**#2231**](https://github.com/hapijs/hapi/issues/2231) Change request.route to a wrapper object containing settings +- [**#2235**](https://github.com/hapijs/hapi/issues/2235) Expose realm as public interface +- [**#2230**](https://github.com/hapijs/hapi/issues/2230) Replace server.config with server.realm.modifiers +- [**#2229**](https://github.com/hapijs/hapi/issues/2229) plugin.expose() only sets server.plugins, not connection.plugins +- [**#2190**](https://github.com/hapijs/hapi/issues/2190) Log heavy load reason when check() is false +- [**#2220**](https://github.com/hapijs/hapi/issues/2220) A method to test a string against the routes table +- [**#2228**](https://github.com/hapijs/hapi/issues/2228) Update hapijs/joi to 5.0.0 from 4.9.0 + - **hapijs/joi 5.0.0** + - [**#498**](https://github.com/hapijs/joi/issues/498) array().single() + - [**#497**](https://github.com/hapijs/joi/issues/497) array.unique doesn't validate duplicate dates + - [**#494**](https://github.com/hapijs/joi/issues/494) Joi.number allows Infinity + - [**#462**](https://github.com/hapijs/joi/issues/462) Return context with errors. + - [**#486**](https://github.com/hapijs/joi/issues/486) array().includes() should not allow undefined + - [**#485**](https://github.com/hapijs/joi/issues/485) Round number.precision if options.convert + - [**#489**](https://github.com/hapijs/joi/issues/489) add missing semicolon +- [**#2227**](https://github.com/hapijs/hapi/issues/2227) Update moment to 2.8.4 +- [**#2224**](https://github.com/hapijs/hapi/issues/2224) Cleanup connection.info settings and introduce 'address' config +- [**#2219**](https://github.com/hapijs/hapi/issues/2219) Update hapijs/hoek to 2.10.0 from 2.9.0 + - **hapijs/hoek 2.10.0** + - [**#109**](https://github.com/hapijs/hoek/issues/109) Enhance shallow clone methods to support nested keys + - [**#110**](https://github.com/hapijs/hoek/issues/110) enhance withShallow methods to support nested keys. Closes #109 + - **hapijs/hoek 2.9.1** + - [**#108**](https://github.com/hapijs/hoek/issues/108) Fix applyToDefaultsWithShallow default clone. Closes #107 + - [**#107**](https://github.com/hapijs/hoek/issues/107) applyToDefaultsWithShallow() fail to retain defaults shallow key +- [**#2216**](https://github.com/hapijs/hapi/issues/2216) Invalid deep cloning of bind context +- [**#2217**](https://github.com/hapijs/hapi/issues/2217) Disable scope checking on a route +- [**#2215**](https://github.com/hapijs/hapi/issues/2215) Revert change to trailing slash behavior +- [**#2209**](https://github.com/hapijs/hapi/issues/2209) Not possible to add route in plugins +- [**#2203**](https://github.com/hapijs/hapi/issues/2203) Move connection route config to route with connections defaults +- [**#2206**](https://github.com/hapijs/hapi/issues/2206) Change server.bind() and server.path() to apply only to routes that follow +- [**#2205**](https://github.com/hapijs/hapi/issues/2205) Rename plugin register() `route` option to `routes` +- [**#2201**](https://github.com/hapijs/hapi/issues/2201) Rename cacheControlStatus to cache.statuses +- [**#2200**](https://github.com/hapijs/hapi/issues/2200) Validation failAction and custom function are not protected +- [**#2199**](https://github.com/hapijs/hapi/issues/2199) add missing variety handler for promises returning a object +- [**#2198**](https://github.com/hapijs/hapi/issues/2198) Update hapijs/call to 2.0.1 from 1.0.0 + - **hapijs/call 2.0.0** + - [**#10**](https://github.com/hapijs/call/issues/10) Support route id + - [**#3**](https://github.com/hapijs/call/issues/3) Support for flexible routes + - [**#9**](https://github.com/hapijs/call/issues/9) /a/{p}/{p*} conflicts with /a/{p*} (which is not reachable) + - [**#8**](https://github.com/hapijs/call/issues/8) '/a/b/{p*}' is more specific than '/{p*5}' + - [**#7**](https://github.com/hapijs/call/issues/7) /a/b/{p*} is more specific than /a/{b}/{c} + - [**#6**](https://github.com/hapijs/call/issues/6) '/a/{b*}' is less specific than '/a/{b}/{c*}' + - [**#2**](https://github.com/hapijs/call/issues/2) Match case-insensitive paths with no params +- [**#1939**](https://github.com/hapijs/hapi/issues/1939) Reverse Routing a URL +- [**#2185**](https://github.com/hapijs/hapi/issues/2185) Update hapijs/catbox to 4.2.0 from 4.1.0 + - **hapijs/catbox 4.2.0** + - [**#109**](https://github.com/hapijs/catbox/issues/109) Return cached on error when dropOnError is false + - [**#105**](https://github.com/hapijs/catbox/issues/105) StaleIn can be function. + - [**#113**](https://github.com/hapijs/catbox/issues/113) Allow empty keys +- [**#2181**](https://github.com/hapijs/hapi/issues/2181) Remove server method cache key 'h' prefix +- [**#2179**](https://github.com/hapijs/hapi/issues/2179) server.register() doesn't work with direct require of plugins (-rc1) +- [**#2156**](https://github.com/hapijs/hapi/issues/2156) Rewrite reply() interface section +- [**#1945**](https://github.com/hapijs/hapi/issues/1945) IE <=8 doesn't accept application/javascript as a mimetype +- [**#2178**](https://github.com/hapijs/hapi/issues/2178) Update hapijs/mimos to 2.0.2 from 1.0.1 + - **hapijs/mimos 2.0.2** + - [**#8**](https://github.com/hapijs/mimos/issues/8) Change source from hapi to mimos + - **hapijs/mimos 2.0.1** + - [**#7**](https://github.com/hapijs/mimos/issues/7) Improve performance for testing + - **hapijs/mimos 2.0.0** + - [**#6**](https://github.com/hapijs/mimos/issues/6) Added ability to override entries in the mime database. +- [**#2157**](https://github.com/hapijs/hapi/issues/2157) Link mentions of methods to their reference +- [**#2177**](https://github.com/hapijs/hapi/issues/2177) Return select() on server.connection() +- [**#2155**](https://github.com/hapijs/hapi/issues/2155) Cleanup and document all internal request logs +- [**#2175**](https://github.com/hapijs/hapi/issues/2175) Update jshttp/mime-db to 1.2.0 from 1.1.2 +- [**#2174**](https://github.com/hapijs/hapi/issues/2174) Update hapijs/qs to 2.3.3 from 2.3.2 + - **hapijs/qs 2.3.3** + - [**#59**](https://github.com/hapijs/qs/issues/59) make sure array indexes are >= 0, closes #57 + - [**#58**](https://github.com/hapijs/qs/issues/58) make qs usable for browser loader +- [**#2173**](https://github.com/hapijs/hapi/issues/2173) Update hapijs/catbox-memory to 1.1.1 from 1.1.0 +- [**#2172**](https://github.com/hapijs/hapi/issues/2172) Update hapijs/boom to 2.6.0 from 2.5.1 + - **hapijs/boom 2.6.0** + - [**#33**](https://github.com/hapijs/boom/issues/33) Added status code 429 Too Many Requests. +- [**#2170**](https://github.com/hapijs/hapi/issues/2170) Spin off range header parser +- [**#2066**](https://github.com/hapijs/hapi/issues/2066) Configure auth scheme to require payload validation +- [**#2111**](https://github.com/hapijs/hapi/issues/2111) CORS matchOrigin should echo origin when config doesn't specify +- [**#2158**](https://github.com/hapijs/hapi/issues/2158) How to get default auth strategy from server object? +- [**#1994**](https://github.com/hapijs/hapi/issues/1994) Pass meta data from a joi object to a failAction +- [**#2167**](https://github.com/hapijs/hapi/issues/2167) Add response 'close' processor +- [**#2166**](https://github.com/hapijs/hapi/issues/2166) ETag vary modification not applied to content-encoding set elsewhere +- [**#2165**](https://github.com/hapijs/hapi/issues/2165) Expose request.paramsArray +- [**#2164**](https://github.com/hapijs/hapi/issues/2164) Bypass compression on empty payload +- [**#2163**](https://github.com/hapijs/hapi/issues/2163) ETag vary modification is incorrect +- [**#2099**](https://github.com/hapijs/hapi/issues/2099) ETags never match with varyEtag setting +- [**#2160**](https://github.com/hapijs/hapi/issues/2160) Add cors.override setting +- [**#2154**](https://github.com/hapijs/hapi/issues/2154) Rename response object option marshall to marshal +- [**#2153**](https://github.com/hapijs/hapi/issues/2153) Change etag based on vary header by default +- [**#2093**](https://github.com/hapijs/hapi/issues/2093) Include ETag and Last-Modified in 304 response +- [**#2152**](https://github.com/hapijs/hapi/issues/2152) Change server method generateKey() to only take the arguments +- [**#2148**](https://github.com/hapijs/hapi/issues/2148) Optimize use of arguments +- [**#2150**](https://github.com/hapijs/hapi/issues/2150) argument Object Optimizations +- [**#2129**](https://github.com/hapijs/hapi/issues/2129) Support promises in server.method() +- [**#2149**](https://github.com/hapijs/hapi/issues/2149) Support server methods without callback +- [**#2122**](https://github.com/hapijs/hapi/issues/2122) Pass the reply() interface everywhere a response can be returned +- [**#2146**](https://github.com/hapijs/hapi/issues/2146) Deep copy app and plugins configurations +- [**#2124**](https://github.com/hapijs/hapi/issues/2124) Server-level connection defaults +- [**#2145**](https://github.com/hapijs/hapi/issues/2145) Split request log events into request and request-internal +- [**#2048**](https://github.com/hapijs/hapi/issues/2048) New Event for request.log +- [**#2144**](https://github.com/hapijs/hapi/issues/2144) Rename server event internalError to `request-error` +- [**#2143**](https://github.com/hapijs/hapi/issues/2143) Replace log 'hapi' tag with event.internal flag +- [**#2142**](https://github.com/hapijs/hapi/issues/2142) Rename request.responses to request.preResponses +- [**#2104**](https://github.com/hapijs/hapi/issues/2104) Apply `reply.continue()` to auth interfaces +- [**#2137**](https://github.com/hapijs/hapi/issues/2137) Remove auth authenticate() `log` option in result +- [**#2136**](https://github.com/hapijs/hapi/issues/2136) Here comes 8 +- [**#2135**](https://github.com/hapijs/hapi/issues/2135) Remove Hapi.version +- [**#2131**](https://github.com/hapijs/hapi/issues/2131) Simplify server.register() to only accept register() or { register, options } +- [**#2128**](https://github.com/hapijs/hapi/issues/2128) Change server.method() object key from fn to method +- [**#2097**](https://github.com/hapijs/hapi/issues/2097) Support Promises in reply() interface +- [**#2126**](https://github.com/hapijs/hapi/issues/2126) Change server.cache() to take only options +- [**#2125**](https://github.com/hapijs/hapi/issues/2125) Remove .hapi references +- [**#2118**](https://github.com/hapijs/hapi/issues/2118) Cleanup register() to accept a plugin or { plugin, options } +- [**#2116**](https://github.com/hapijs/hapi/issues/2116) Move peek logic to Peekaboo +- [**#2040**](https://github.com/hapijs/hapi/issues/2040) Improve request ID generator to prevent collisions +- [**#2113**](https://github.com/hapijs/hapi/issues/2113) Missing host will default to hostname or 'localhost' instead of '0.0.0.0' pre start() +- [**#2112**](https://github.com/hapijs/hapi/issues/2112) Switch unix domain socket and windows named pipe to use options.port +- [**#1977**](https://github.com/hapijs/hapi/issues/1977) Throw when route() is called with multiple arguments +- [**#2003**](https://github.com/hapijs/hapi/issues/2003) Stop cache client when pack stops +- [**#1926**](https://github.com/hapijs/hapi/issues/1926) Remove special handling of the HTTP Location header +- [**#2109**](https://github.com/hapijs/hapi/issues/2109) Remove request aborted listener +- [**#1902**](https://github.com/hapijs/hapi/issues/1902) reply.redirect() and reply.file() not working in server extensions +- [**#2103**](https://github.com/hapijs/hapi/issues/2103) Change ext continuation method from `reply()` to `reply.continue()` +- [**#1965**](https://github.com/hapijs/hapi/issues/1965) Need to know when response was sent in `server.on(tail)` +- [**#2065**](https://github.com/hapijs/hapi/issues/2065) failing to generate a method key should generate an error somewhere +- [**#2089**](https://github.com/hapijs/hapi/issues/2089) Server method `generateKey` no longer supports returning null as valid no caching indicator +- [**#1963**](https://github.com/hapijs/hapi/issues/1963) Extensible reply() interface +- [**#1866**](https://github.com/hapijs/hapi/issues/1866) Throw error when trying to reply twice +- [**#1864**](https://github.com/hapijs/hapi/issues/1864) Feature Request: Validation of non-200/ok responses. +- [**#1723**](https://github.com/hapijs/hapi/issues/1723) Allow response object stripping according to schema +- [**#2096**](https://github.com/hapijs/hapi/issues/2096) Skip onPreResponse when connection closes prematurely +- [**#1686**](https://github.com/hapijs/hapi/issues/1686) Don't report request closed on redirect payload write +- [**#2086**](https://github.com/hapijs/hapi/issues/2086) Remove bin/hapi +- [**#2085**](https://github.com/hapijs/hapi/issues/2085) Remove server.compose() +- [**#1672**](https://github.com/hapijs/hapi/issues/1672) Enable starting the server listener externally +- [**#2095**](https://github.com/hapijs/hapi/issues/2095) Rework composer format +- [**#2092**](https://github.com/hapijs/hapi/issues/2092) Change default port to 0 +- [**#2090**](https://github.com/hapijs/hapi/issues/2090) Remove plugin.version +- [**#2084**](https://github.com/hapijs/hapi/issues/2084) Remove Hapi.state.prepareValue() +- [**#2083**](https://github.com/hapijs/hapi/issues/2083) Remove Hapi.error +- [**#2082**](https://github.com/hapijs/hapi/issues/2082) Remove Hapi.createServer() +- [**#2052**](https://github.com/hapijs/hapi/issues/2052) Remove plugin.length +- [**#2053**](https://github.com/hapijs/hapi/issues/2053) Change plugin.servers to plugin.connections +- [**#2071**](https://github.com/hapijs/hapi/issues/2071) Move proxy handler to use local maxSocket config +- [**#2072**](https://github.com/hapijs/hapi/issues/2072) Remove debug from server configuration +- [**#2073**](https://github.com/hapijs/hapi/issues/2073) Split process load from server load limits +- [**#2076**](https://github.com/hapijs/hapi/issues/2076) Move files.etagsCacheMaxSize to pack level +- [**#2080**](https://github.com/hapijs/hapi/issues/2080) app config no longer copied over to server.app or connection.app + +## [**7.5.2**](https://github.com/hapijs/hapi/issues?milestone=132&state=closed) +- [**#2123**](https://github.com/hapijs/hapi/issues/2123) Upgrade hoek to 2.9.0 + +## [**7.5.1**](https://github.com/hapijs/hapi/issues?milestone=131&state=closed) +- [**#2120**](https://github.com/hapijs/hapi/issues/2120) TypeError: Cannot read property 'get' of undefined + +## [**7.5.0**](https://github.com/hapijs/hapi/issues?milestone=130&state=closed) +- [**#2105**](https://github.com/hapijs/hapi/issues/2105) Added ability to pass option into unstate. +- [**#1916**](https://github.com/hapijs/hapi/issues/1916) Temp file is not deleted when request is aborted by client + +## [**7.4.0**](https://github.com/hapijs/hapi/issues?milestone=129&state=closed) +- [**#2100**](https://github.com/hapijs/hapi/issues/2100) Global view context. + +## [**7.3.0**](https://github.com/hapijs/hapi/issues?milestone=128&state=closed) +- [**#2098**](https://github.com/hapijs/hapi/issues/2098) Catbox 4.1 + +## [**7.2.0**](https://github.com/hapijs/hapi/issues?milestone=126&state=closed) +- [**#2069**](https://github.com/hapijs/hapi/issues/2069) Isolate server in its own pack +- [**#2061**](https://github.com/hapijs/hapi/issues/2061) Second phase of server/pack/plugin refactor +- [**#2057**](https://github.com/hapijs/hapi/issues/2057) Pack refactor + +## [**7.1.1**](https://github.com/hapijs/hapi/issues?milestone=125&state=closed) +- [**#2046**](https://github.com/hapijs/hapi/issues/2046) Fix shrinkwrap + +## [**7.1.0**](https://github.com/hapijs/hapi/issues?milestone=124&state=closed) +- [**#2039**](https://github.com/hapijs/hapi/issues/2039) Added npm-shrinkwrap + +## [**7.0.1**](https://github.com/hapijs/hapi/issues?milestone=123&state=closed) +- [**#2038**](https://github.com/hapijs/hapi/issues/2038) Move cli logic to rejoice +- [**#2036**](https://github.com/hapijs/hapi/issues/2036) Move lru-cache to inert +- [**#2034**](https://github.com/hapijs/hapi/issues/2034) Lab 5.0 +- [**#2035**](https://github.com/hapijs/hapi/issues/2035) lab 5.0 features. Closes #2034 +- [**#2028**](https://github.com/hapijs/hapi/issues/2028) Improve error message when auth scope is insufficient +- [**#2029**](https://github.com/hapijs/hapi/issues/2029) Fixes #2028. Updated error message for invalid scope to explain that any of the specified are sufficient +- [**#2024**](https://github.com/hapijs/hapi/issues/2024) Resolve undefined environment variables to the empty string in the cli. + +## [**7.0.0**](https://github.com/hapijs/hapi/issues?milestone=117&state=closed) +- [**#2022**](https://github.com/hapijs/hapi/issues/2022) Spin off file and directory to inert +- [**#1913**](https://github.com/hapijs/hapi/issues/1913) Change proxy localStatePassThrough setting default to false +- [**#2021**](https://github.com/hapijs/hapi/issues/2021) Override server files.relativeTo config per route +- [**#2020**](https://github.com/hapijs/hapi/issues/2020) h2o2 2.0 +- [**#1941**](https://github.com/hapijs/hapi/issues/1941) Remove route from handler registration arguments +- [**#2019**](https://github.com/hapijs/hapi/issues/2019) Catbox 4.0 +- [**#1954**](https://github.com/hapijs/hapi/issues/1954) Remove support for catbox getOrGenerate() +- [**#2017**](https://github.com/hapijs/hapi/issues/2017) Initial 7.0 changes +- [**#2016**](https://github.com/hapijs/hapi/issues/2016) Remove $env support from pack.compose() +- [**#1955**](https://github.com/hapijs/hapi/issues/1955) Use environment variables in CLI configuration json file +- [**#2011**](https://github.com/hapijs/hapi/issues/2011) Hapi should not override `cache-control` header if it's manually set by user's code +- [**#1960**](https://github.com/hapijs/hapi/issues/1960) Remove support for tos authentication setting +- [**#2007**](https://github.com/hapijs/hapi/issues/2007) Remove server views config + +## [**6.11.1**](https://github.com/hapijs/hapi/issues?milestone=122&state=closed) +- [**#2010**](https://github.com/hapijs/hapi/issues/2010) Heavy +- [**#2002**](https://github.com/hapijs/hapi/issues/2002) show route method in error message + +## [**6.11.0**](https://github.com/hapijs/hapi/issues?milestone=121&state=closed) +- [**#1984**](https://github.com/hapijs/hapi/issues/1984) All non 200 responses get cache-control=no-cache header +- [**#1995**](https://github.com/hapijs/hapi/issues/1995) Adding route with multiple methods overrides route config +- [**#2001**](https://github.com/hapijs/hapi/issues/2001) Keep the options of server.inject untouched #2000 +- [**#2005**](https://github.com/hapijs/hapi/issues/2005) Replace negotiator + +## [**6.10.0**](https://github.com/hapijs/hapi/issues?milestone=120&state=closed) +- [**#1998**](https://github.com/hapijs/hapi/issues/1998) Migrate payload parsing to subtext with multipart support via pez +- [**#1993**](https://github.com/hapijs/hapi/issues/1993) Replaced optimist with bossy +- [**#1928**](https://github.com/hapijs/hapi/issues/1928) Handle empty or falsy charset in response + +## [**6.9.0**](https://github.com/hapijs/hapi/issues?milestone=119&state=closed) +- [**#1968**](https://github.com/hapijs/hapi/issues/1968) Vision / Mimos +- [**#1959**](https://github.com/hapijs/hapi/issues/1959) Fix server/plugin ext views conflict +- [**#1958**](https://github.com/hapijs/hapi/issues/1958) Move proxy handler to h2o2 +- [**#1956**](https://github.com/hapijs/hapi/issues/1956) Fix Content-Type overriding +- [**#1944**](https://github.com/hapijs/hapi/issues/1944) Move router to Call +- [**#1934**](https://github.com/hapijs/hapi/issues/1934) Fix non-spec compliant Last-Modified header in response +- [**#1932**](https://github.com/hapijs/hapi/issues/1932) handle empty CORS expose-headers header response + +## [**6.8.1**](https://github.com/hapijs/hapi/issues?milestone=118&state=closed) +- [**#1922**](https://github.com/hapijs/hapi/issues/1922) Handle server methods without cache as special case + +## [**6.8.0**](https://github.com/hapijs/hapi/issues?milestone=116&state=closed) +- [**#1828**](https://github.com/hapijs/hapi/issues/1828) Disable compression on file types already compressed (png, jpg) +- [**#1905**](https://github.com/hapijs/hapi/issues/1905) Replaced mime-type with mime. +- [**#1889**](https://github.com/hapijs/hapi/issues/1889) Upgrade to wreck v5 +- [**#1919**](https://github.com/hapijs/hapi/issues/1919) Log method pre string notation +- [**#1915**](https://github.com/hapijs/hapi/issues/1915) Issue/1911 + +## [**6.7.1**](https://github.com/hapijs/hapi/issues?milestone=115&state=closed) +- [**#1885**](https://github.com/hapijs/hapi/issues/1885) Handler timeout with onPreResponse asserts on bad protect + +## [**6.7.0**](https://github.com/hapijs/hapi/issues?milestone=114&state=closed) +- [**#1884**](https://github.com/hapijs/hapi/issues/1884) Improve protect logging +- [**#1881**](https://github.com/hapijs/hapi/issues/1881) update qs dependency + +## [**6.6.0**](https://github.com/hapijs/hapi/issues?milestone=113&state=closed) +- [**#1863**](https://github.com/hapijs/hapi/issues/1863) Allow agent to be set on proxy options and passed into Nipple. +- [**#1878**](https://github.com/hapijs/hapi/issues/1878) Rename private route members +- [**#1877**](https://github.com/hapijs/hapi/issues/1877) Move state.js to statehood module +- [**#1875**](https://github.com/hapijs/hapi/issues/1875) Session scope does not match one to many auth.scope on route. +- [**#1871**](https://github.com/hapijs/hapi/issues/1871) Switch to wreck +- [**#1856**](https://github.com/hapijs/hapi/issues/1856) Allow view options override on handler object +- [**#1858**](https://github.com/hapijs/hapi/issues/1858) Fix typo in defaults.js + +## [**6.5.1**](https://github.com/hapijs/hapi/issues?milestone=112&state=closed) +- [**#1857**](https://github.com/hapijs/hapi/issues/1857) Manifest validation tests server config before defaults applies + +## [**6.5.0**](https://github.com/hapijs/hapi/issues?milestone=111&state=closed) +- [**#1851**](https://github.com/hapijs/hapi/issues/1851) Updated route documentation. +- [**#1844**](https://github.com/hapijs/hapi/issues/1844) Replace async +- [**#1842**](https://github.com/hapijs/hapi/issues/1842) Lab 4.00 +- [**#1840**](https://github.com/hapijs/hapi/issues/1840) No longer possible to load caches using CLI? +- [**#1835**](https://github.com/hapijs/hapi/issues/1835) server.state ttl must be a number +- [**#1795**](https://github.com/hapijs/hapi/issues/1795) request.server._views in plugin +- [**#1832**](https://github.com/hapijs/hapi/issues/1832) Replace mime with mime-type +- [**#1822**](https://github.com/hapijs/hapi/issues/1822) Added joi validation to manifest. + +## [**6.4.0**](https://github.com/hapijs/hapi/issues?milestone=110&state=closed) +- [**#1810**](https://github.com/hapijs/hapi/issues/1810) set X-Content-Type-Options to nosnif for jsonp responses + +## [**6.3.0**](https://github.com/hapijs/hapi/issues?milestone=109&state=closed) +- [**#1827**](https://github.com/hapijs/hapi/issues/1827) Cannot call setTimeout with non-integer msec value +- [**#1826**](https://github.com/hapijs/hapi/issues/1826) Support cache generateTimeout setting + +## [**6.2.2**](https://github.com/hapijs/hapi/issues?milestone=108&state=closed) +- [**#1820**](https://github.com/hapijs/hapi/issues/1820) Rename spumko to hapijs + +## [**6.2.1**](https://github.com/hapijs/hapi/issues?milestone=107&state=closed) +- [**#1801**](https://github.com/hapijs/hapi/issues/1801) Stale dependencies + +## [**6.2.0**](https://github.com/hapijs/hapi/issues?milestone=106&state=closed) +- [**#1767**](https://github.com/hapijs/hapi/issues/1767) plugin.location +- [**#1790**](https://github.com/hapijs/hapi/issues/1790) Expose authentication mode + +## [**6.1.0**](https://github.com/hapijs/hapi/issues?milestone=105&state=closed) +- [**#1769**](https://github.com/hapijs/hapi/issues/1769) Plugin X missing dependency Y in server if manifest.plugins key order not carefully managed +- [**#1754**](https://github.com/hapijs/hapi/issues/1754) File handler to handle 206 Partial Content? +- [**#1788**](https://github.com/hapijs/hapi/issues/1788) Last-Modified comparison needs to account for 1 second precision +- [**#1778**](https://github.com/hapijs/hapi/issues/1778) Do not create a duplicate Content-Type header on proxy passthrough +- [**#1774**](https://github.com/hapijs/hapi/issues/1774) Style fixes +- [**#1766**](https://github.com/hapijs/hapi/issues/1766) prepend jsonp callbacks with a comment to prevent the rosetta-flash vulnerability +- [**#1763**](https://github.com/hapijs/hapi/issues/1763) fixes #1755 - stripTrailingSlash doesn't work when query variables are used +- [**#1760**](https://github.com/hapijs/hapi/issues/1760) How can I set Content-Type header to the content generated from reply.view? +- [**#1762**](https://github.com/hapijs/hapi/issues/1762) fix content-type overriding issue #1760. +- [**#1733**](https://github.com/hapijs/hapi/issues/1733) log function should only emit once if _server object +- [**#1783**](https://github.com/hapijs/hapi/issues/1783) Change etag when content-encoding is used +- [**#1782**](https://github.com/hapijs/hapi/issues/1782) server.inject() res.result does not reflect actual payload sent on 304/204 +- [**#1781**](https://github.com/hapijs/hapi/issues/1781) Send empty payload on 204 +- [**#1756**](https://github.com/hapijs/hapi/issues/1756) Follow coding conventions concerning semicolons; Don't initialize variab... +- [**#1776**](https://github.com/hapijs/hapi/issues/1776) Proxy pass-through with onResponse fails to preserve vary header values +- [**#1773**](https://github.com/hapijs/hapi/issues/1773) Windows path fails on trailing slash on view helpers +- [**#1676**](https://github.com/hapijs/hapi/issues/1676) Problem serving precompressed files with directory handler +- [**#1772**](https://github.com/hapijs/hapi/issues/1772) HEAD requests should retail etag header +- [**#1771**](https://github.com/hapijs/hapi/issues/1771) Open open one file stream when using precompressed file +- [**#1407**](https://github.com/hapijs/hapi/issues/1407) Skip opening file or rendering view on head or 304 +- [**#1752**](https://github.com/hapijs/hapi/issues/1752) Adding helpful error message when pack.register is missing a callback +- [**#1745**](https://github.com/hapijs/hapi/issues/1745) Add joi validation of pack options +- [**#1728**](https://github.com/hapijs/hapi/issues/1728) 6.x breaks plugin modules exporting functions + +## [**6.0.2**](https://github.com/hapijs/hapi/issues?milestone=104&state=closed) +- [**#1720**](https://github.com/hapijs/hapi/issues/1720) No way to handle root routes with `route: {prefix: '...'}` +- [**#1719**](https://github.com/hapijs/hapi/issues/1719) Fixes undefined error in `plugin.dependency` + +## [**6.0.1**](https://github.com/hapijs/hapi/issues?milestone=103&state=closed) +- [**#1710**](https://github.com/hapijs/hapi/issues/1710) Buffer based passwords fail schema validation (6.0 regression) + +## [**6.0.0**](https://github.com/hapijs/hapi/issues?milestone=102&state=closed) +- [**#1708**](https://github.com/hapijs/hapi/issues/1708) Hapi 6.0 no longer invalidates auth strategy on registration of route +- [**#1703**](https://github.com/hapijs/hapi/issues/1703) Catbox 3.0 and drop internal require support +- [**#1700**](https://github.com/hapijs/hapi/issues/1700) Change the order of actions when starting a pack +- [**#1668**](https://github.com/hapijs/hapi/issues/1668) Delete 'Accept-Encoding' header on proxy requests +- [**#1696**](https://github.com/hapijs/hapi/issues/1696) Non-Error auth err responses are ignored in try mode +- [**#1695**](https://github.com/hapijs/hapi/issues/1695) Preserve auth error on try +- [**#1691**](https://github.com/hapijs/hapi/issues/1691) V6.0 +- [**#1693**](https://github.com/hapijs/hapi/issues/1693) Enhance setting authentication defaults +- [**#1692**](https://github.com/hapijs/hapi/issues/1692) Allow testing a request against any configured authentication strategy +- [**#1688**](https://github.com/hapijs/hapi/issues/1688) Bring back reply.redirect() +- [**#1687**](https://github.com/hapijs/hapi/issues/1687) Don't log auth non-error responses with 'error' tag +- [**#1679**](https://github.com/hapijs/hapi/issues/1679) Allow cookie-specific settings for failAction, strictHeader, and clearInvalid +- [**#1678**](https://github.com/hapijs/hapi/issues/1678) Expose the location header logic +- [**#1677**](https://github.com/hapijs/hapi/issues/1677) Enhance manifest format to support registration options (select, prefix, vhost) +- [**#1674**](https://github.com/hapijs/hapi/issues/1674) Make plugin register() and dependency() selectable +- [**#1675**](https://github.com/hapijs/hapi/issues/1675) Remove pack.list +- [**#1673**](https://github.com/hapijs/hapi/issues/1673) Make plugin.events selectable +- [**#1663**](https://github.com/hapijs/hapi/issues/1663) Allow register to pre-select servers +- [**#1662**](https://github.com/hapijs/hapi/issues/1662) Config clones bind, app, and plugins +- [**#1661**](https://github.com/hapijs/hapi/issues/1661) View manager clones engines including modules +- [**#1658**](https://github.com/hapijs/hapi/issues/1658) Set route path prefix when loading plugin +- [**#1659**](https://github.com/hapijs/hapi/issues/1659) plugin.view() modifies options' basePath +- [**#1656**](https://github.com/hapijs/hapi/issues/1656) Remove pack.require() and plugin.require() +- [**#1655**](https://github.com/hapijs/hapi/issues/1655) Remove support for string view engine config +- [**#1653**](https://github.com/hapijs/hapi/issues/1653) Move Composer into Pack.compose() +- [**#1652**](https://github.com/hapijs/hapi/issues/1652) Remove composer support for multiple packs +- [**#981**](https://github.com/hapijs/hapi/issues/981) Scope plugin routes to a virtual host + +## [**5.1.0**](https://github.com/hapijs/hapi/issues?milestone=101&state=closed) +- [**#1579**](https://github.com/hapijs/hapi/issues/1579) Add option to remove trailing slashes to router +- [**#1574**](https://github.com/hapijs/hapi/issues/1574) Document the best way to implement a 404 from the directory handler when using path callback +- [**#1573**](https://github.com/hapijs/hapi/issues/1573) Server throttling controls do not log execution +- [**#1508**](https://github.com/hapijs/hapi/issues/1508) Escaped error message with regex validation +- [**#1477**](https://github.com/hapijs/hapi/issues/1477) proxy xforward option will set bad headers in some cases +- [**#1581**](https://github.com/hapijs/hapi/issues/1581) Authentication throws are treated as valid reply() + +## [**5.0.0**](https://github.com/hapijs/hapi/issues?milestone=100&state=closed) +- [**#1644**](https://github.com/hapijs/hapi/issues/1644) request.params contains empty strings for missing optional params +- [**#1643**](https://github.com/hapijs/hapi/issues/1643) Expose cross inputs as validation context +- [**#1642**](https://github.com/hapijs/hapi/issues/1642) Cjihrig header validation +- [**#1641**](https://github.com/hapijs/hapi/issues/1641) Upgrade to joi 4.x +- [**#1622**](https://github.com/hapijs/hapi/issues/1622) Extend Hapi cli to enable loading a module before loading hapi + +## [**4.1.4**](https://github.com/hapijs/hapi/issues?milestone=99&state=closed) +- [**#1638**](https://github.com/hapijs/hapi/issues/1638) Unahndled Exception when a request is aborted + +## [**4.1.2**](https://github.com/hapijs/hapi/issues?milestone=97&state=closed) +- [**#1634**](https://github.com/hapijs/hapi/issues/1634) Request domain leaks request object +- [**#1635**](https://github.com/hapijs/hapi/issues/1635) Remove reference to request in domain. Closes #1634 + +## [**4.1.1**](https://github.com/hapijs/hapi/issues?milestone=96&state=closed) +- [**#1633**](https://github.com/hapijs/hapi/issues/1633) Rework domains to single entry +- [**#1632**](https://github.com/hapijs/hapi/issues/1632) Clean response objects for aborted requests + +## [**4.1.0**](https://github.com/hapijs/hapi/issues?milestone=93&state=closed) +- [**#1461**](https://github.com/hapijs/hapi/issues/1461) Security headers +- [**#1583**](https://github.com/hapijs/hapi/issues/1583) Support JSON-derived media types + +## [**4.0.3**](https://github.com/hapijs/hapi/issues?milestone=95&state=closed) +- [**#1604**](https://github.com/hapijs/hapi/issues/1604) response emitter fails to retain custom event listeners once sent +- [**#1597**](https://github.com/hapijs/hapi/issues/1597) Template helpers fail on relative paths + +## [**4.0.2**](https://github.com/hapijs/hapi/issues?milestone=94&state=closed) +- [**#1598**](https://github.com/hapijs/hapi/issues/1598) Throws when response does not have _close() + +## [**4.0.1**](https://github.com/hapijs/hapi/issues?milestone=92&state=closed) +- [**#1594**](https://github.com/hapijs/hapi/issues/1594) Can jsonp be optional? +- [**#1567**](https://github.com/hapijs/hapi/issues/1567) allow defaultExtension +- [**#1590**](https://github.com/hapijs/hapi/issues/1590) RSS leak occurs when request does not read entire stream response +- [**#1569**](https://github.com/hapijs/hapi/issues/1569) Move ext topo sort to its own module +- [**#1566**](https://github.com/hapijs/hapi/issues/1566) Precompile joi validation + +## [**4.0.0**](https://github.com/hapijs/hapi/issues?milestone=91&state=closed) +- [**#1548**](https://github.com/hapijs/hapi/issues/1548) wip: fix windows bugs +- [**#1560**](https://github.com/hapijs/hapi/issues/1560) 4.0.0 +- [**#1559**](https://github.com/hapijs/hapi/issues/1559) joi 3.0 +- [**#1558**](https://github.com/hapijs/hapi/issues/1558) Change Hapi.utils.version() to Hapi.version and remove Hoek alias +- [**#1547**](https://github.com/hapijs/hapi/issues/1547) Make certain that path is relative before joining it to relativeTo +- [**#1554**](https://github.com/hapijs/hapi/issues/1554) coverage, closes #1524 +- [**#1524**](https://github.com/hapijs/hapi/issues/1524) Coverage after lab partial condition result coverage +- [**#1521**](https://github.com/hapijs/hapi/issues/1521) Allow plugins to register handler types +- [**#1551**](https://github.com/hapijs/hapi/issues/1551) add an insecureAgent when maxSockets is set, closes #1512 + +## [**3.1.0**](https://github.com/hapijs/hapi/issues?milestone=90&state=closed) +- [**#1525**](https://github.com/hapijs/hapi/issues/1525) expose filename and headers for streams in a multipart form +- [**#1523**](https://github.com/hapijs/hapi/issues/1523) Question: How to validate payload with templated response properly ? +- [**#1541**](https://github.com/hapijs/hapi/issues/1541) Clarify that statusCode key of stream response passed in response +- [**#1540**](https://github.com/hapijs/hapi/issues/1540) Pre-gzipped source stream not properly tested for being the active source +- [**#1538**](https://github.com/hapijs/hapi/issues/1538) Passing Error objects can leak message in 500 response +- [**#1536**](https://github.com/hapijs/hapi/issues/1536) maxEventLoopDelay fails to catch when load is too high to reach next sample interval +- [**#1535**](https://github.com/hapijs/hapi/issues/1535) Cannot set maxSockets to node default +- [**#1533**](https://github.com/hapijs/hapi/issues/1533) Proxy without passThrough fails to set cache-control header +- [**#1532**](https://github.com/hapijs/hapi/issues/1532) Multipart payload to files with multiple files skips second file when large +- [**#1531**](https://github.com/hapijs/hapi/issues/1531) pack.log() doesn't retain server debug false setting +- [**#1530**](https://github.com/hapijs/hapi/issues/1530) plugin.method() should use method bind before plugin bind +- [**#1515**](https://github.com/hapijs/hapi/issues/1515) Coverage to 100% after lab logical statement support +- [**#1520**](https://github.com/hapijs/hapi/issues/1520) server.table() mis-documented, missing args, and route.table() is wrong +- [**#1518**](https://github.com/hapijs/hapi/issues/1518) Server timeout config allows invalid values +- [**#1517**](https://github.com/hapijs/hapi/issues/1517) Proxy handler payload config validation using incorrect variable +- [**#1514**](https://github.com/hapijs/hapi/issues/1514) Server allows duplicate lables +- [**#1513**](https://github.com/hapijs/hapi/issues/1513) Authentication userland code not protected by domain + +## [**3.0.2**](https://github.com/hapijs/hapi/issues?milestone=89&state=closed) +- [**#1507**](https://github.com/hapijs/hapi/issues/1507) request.setUrl('') throws + +## [**3.0.1**](https://github.com/hapijs/hapi/issues?milestone=88&state=closed) +- [**#1503**](https://github.com/hapijs/hapi/issues/1503) plugin.method(name, fn, [options]) fails + +## [**3.0.0**](https://github.com/hapijs/hapi/issues?milestone=86&state=closed) +- [**#1466**](https://github.com/hapijs/hapi/issues/1466) Drop support for server helpers +- [**#1458**](https://github.com/hapijs/hapi/issues/1458) Removed Http(s) globalAgent settings +- [**#1485**](https://github.com/hapijs/hapi/issues/1485) Bring coverage back to 100% after lab fix +- [**#1476**](https://github.com/hapijs/hapi/issues/1476) add PATCH to default cors methods, closes #1475 +- [**#1475**](https://github.com/hapijs/hapi/issues/1475) Include PATCH method in options/cors/methods default +- [**#1478**](https://github.com/hapijs/hapi/issues/1478) Use joi 2.8 alternatives() +- [**#1465**](https://github.com/hapijs/hapi/issues/1465) Migrate to catbox 2.0 +- [**#1473**](https://github.com/hapijs/hapi/issues/1473) Drop dtrace support + +## [**2.6.0**](https://github.com/hapijs/hapi/issues?milestone=85&state=closed) +- [**#1455**](https://github.com/hapijs/hapi/issues/1455) Print to console server logs based on debug config +- [**#1451**](https://github.com/hapijs/hapi/issues/1451) Objects created in plugin.dependency or plugin.after are monitored by the wrong domain +- [**#1452**](https://github.com/hapijs/hapi/issues/1452) Perhaps include `request.pre` in handler view context +- [**#1453**](https://github.com/hapijs/hapi/issues/1453) Include prerequisites in default view context. #1452 +- [**#1445**](https://github.com/hapijs/hapi/issues/1445) Server method bind option +- [**#1450**](https://github.com/hapijs/hapi/issues/1450) Enable handlers to use the prerequisite method string notation +- [**#1449**](https://github.com/hapijs/hapi/issues/1449) Allow server methods names to include '.' (nested) +- [**#1448**](https://github.com/hapijs/hapi/issues/1448) Prerequisite string notation parsing errors +- [**#1447**](https://github.com/hapijs/hapi/issues/1447) Allow prerequisites string notation to use method name without () +- [**#1446**](https://github.com/hapijs/hapi/issues/1446) Document server method callback 'isUncacheable' argument +- [**#1442**](https://github.com/hapijs/hapi/issues/1442) Response 304 + +## [**2.5.0**](https://github.com/hapijs/hapi/issues?milestone=84&state=closed) +- [**#1440**](https://github.com/hapijs/hapi/issues/1440) Redirecting from within an Auth.Scheme generates a Circular Reference +- [**#1439**](https://github.com/hapijs/hapi/issues/1439) proper etag formatting +- [**#1434**](https://github.com/hapijs/hapi/issues/1434) Allow overriding the filename in content-disposition headers +- [**#1432**](https://github.com/hapijs/hapi/issues/1432) Replace server helpers with server methods +- [**#1299**](https://github.com/hapijs/hapi/issues/1299) thrown errors inside server.inject does not propagate + +## [**2.4.0**](https://github.com/hapijs/hapi/issues?milestone=83&state=closed) +- [**#1430**](https://github.com/hapijs/hapi/issues/1430) Server fails to parse "" cookie value +- [**#1428**](https://github.com/hapijs/hapi/issues/1428) request.getLog() includes same event multiple times when using multiple tags +- [**#1424**](https://github.com/hapijs/hapi/issues/1424) Searching actual working SSE example (#1008 does not work for me) +- [**#1425**](https://github.com/hapijs/hapi/issues/1425) return a reference to the server when adding via pack.server +- [**#1419**](https://github.com/hapijs/hapi/issues/1419) Send newline \n after all responses + +## [**2.3.0**](https://github.com/hapijs/hapi/issues?milestone=82&state=closed) +- [**#1320**](https://github.com/hapijs/hapi/issues/1320) Add support for asynchronous view rendering + +## [**2.2.0**](https://github.com/hapijs/hapi/issues?milestone=81&state=closed) +- [**#1372**](https://github.com/hapijs/hapi/issues/1372) test that handler isn't called when a request is interrupted +- [**#1362**](https://github.com/hapijs/hapi/issues/1362) (cookies) TypeError: Cannot call method 'match' of undefined +- [**#1378**](https://github.com/hapijs/hapi/issues/1378) add failureResponse option to proxy handler +- [**#1354**](https://github.com/hapijs/hapi/issues/1354) Use configuration objects to register helpers +- [**#1380**](https://github.com/hapijs/hapi/issues/1380) Allow bind context for view handler +- [**#1382**](https://github.com/hapijs/hapi/issues/1382) Make joi optional for route validation +- [**#1404**](https://github.com/hapijs/hapi/issues/1404) Protect JSON.stringify from throwing. +- [**#1395**](https://github.com/hapijs/hapi/issues/1395) JSON circular structure error in authentication error logging +- [**#1405**](https://github.com/hapijs/hapi/issues/1405) Call parseInt() for Joi-validated integers +- [**#1414**](https://github.com/hapijs/hapi/issues/1414) Sending incorrect status code (200) when file fails to open before transmit +- [**#1413**](https://github.com/hapijs/hapi/issues/1413) File stream is opened before necessary (e.g. if replaced by another response in ext) +- [**#1412**](https://github.com/hapijs/hapi/issues/1412) Missing file (404) not captured by onPreResponse +- [**#1411**](https://github.com/hapijs/hapi/issues/1411) Wasteful encoder prep when response is 304 or head +- [**#1410**](https://github.com/hapijs/hapi/issues/1410) passThrough statusCode overrides manual code value +- [**#1409**](https://github.com/hapijs/hapi/issues/1409) Status code set from upstream without passThrough flag +- [**#1408**](https://github.com/hapijs/hapi/issues/1408) precompressed file handle not closed when using head or 304 +- [**#1387**](https://github.com/hapijs/hapi/issues/1387) EMFILE error when hapi serves static files over period of time in hapi 2.1.2 +- [**#1391**](https://github.com/hapijs/hapi/issues/1391) Disable autoparsing without losing gzip +- [**#1393**](https://github.com/hapijs/hapi/issues/1393) add `gunzip` as third option to `parse`; resolves #1391 +- [**#1400**](https://github.com/hapijs/hapi/issues/1400) Question: Can you get a log of requests that don't pass validation? +- [**#1401**](https://github.com/hapijs/hapi/issues/1401) route.payload.allow as Array never matches +- [**#1357**](https://github.com/hapijs/hapi/issues/1357) specify hoek minor version + +## [**2.1.2**](https://github.com/hapijs/hapi/issues?milestone=80&state=closed) +- [**#1359**](https://github.com/hapijs/hapi/issues/1359) Ext reply(null).state() race condition +- [**#1351**](https://github.com/hapijs/hapi/issues/1351) Prepare for node 0.12 + +## [**2.1.1**](https://github.com/hapijs/hapi/issues?milestone=79&state=closed) +- [**#1347**](https://github.com/hapijs/hapi/issues/1347) Views should not use basePath when path is absolute + +## [**2.1.0**](https://github.com/hapijs/hapi/issues?milestone=4&state=closed) +- [**#204**](https://github.com/hapijs/hapi/issues/204) Add postResponse method to proxy +- [**#200**](https://github.com/hapijs/hapi/issues/200) Fix tls config settings +- [**#hapijs/inert#17**](https://github.com/hapijs/inert/issues/17) Handle Range requests explicitly + +## [**2.1.0**](https://github.com/hapijs/hapi/issues?milestone=78&state=closed) +- [**#1344**](https://github.com/hapijs/hapi/issues/1344) Use the plugin loader when configured to load view engines +- [**#1245**](https://github.com/hapijs/hapi/issues/1245) Replace request with nipple in tests +- [**#1336**](https://github.com/hapijs/hapi/issues/1336) Allow custom view layout folder +- [**#1335**](https://github.com/hapijs/hapi/issues/1335) Allow view layout to contain a string and boolean + +## [**2.0.0**](https://github.com/hapijs/hapi/issues?milestone=69&state=closed) +- [**#1322**](https://github.com/hapijs/hapi/issues/1322) Does Hapi support multiple view templates? +- [**#1317**](https://github.com/hapijs/hapi/issues/1317) Cannot Parse form-encoded arrays +- [**#1331**](https://github.com/hapijs/hapi/issues/1331) Fix query(string) regression +- [**#1332**](https://github.com/hapijs/hapi/issues/1332) Payload always logging an error regardless of error state +- [**#1327**](https://github.com/hapijs/hapi/issues/1327) Better debug support for object data +- [**#1324**](https://github.com/hapijs/hapi/issues/1324) When no query params are sent, request.params is null instead of {}. +- [**#1301**](https://github.com/hapijs/hapi/issues/1301) `querystring` => `qs`, adds support for nested objects +- [**#1314**](https://github.com/hapijs/hapi/issues/1314) Replace old payload try mode with failAction +- [**#1313**](https://github.com/hapijs/hapi/issues/1313) Change redirectToSlash default value to true +- [**#1312**](https://github.com/hapijs/hapi/issues/1312) Remove special values for server config 'files.relativeTo' +- [**#1311**](https://github.com/hapijs/hapi/issues/1311) Implement saving payload to file when not using mutlipart +- [**#1304**](https://github.com/hapijs/hapi/issues/1304) Request 'peek' event +- [**#1300**](https://github.com/hapijs/hapi/issues/1300) Do not overwrite Access-Control-Allow-Origin +- [**#1297**](https://github.com/hapijs/hapi/issues/1297) Document validation option in settings +- [**#1295**](https://github.com/hapijs/hapi/issues/1295) Replace route payload.mode with payload.output and payload.parse +- [**#1292**](https://github.com/hapijs/hapi/issues/1292) Skip loading entire multipart to memory and stream directly to multiparty +- [**#1168**](https://github.com/hapijs/hapi/issues/1168) Save stream to file like {mode: 'file' ...} +- [**#1236**](https://github.com/hapijs/hapi/issues/1236) Review lru-cache settings +- [**#1239**](https://github.com/hapijs/hapi/issues/1239) Disable cache when Authorization header is included +- [**#1241**](https://github.com/hapijs/hapi/issues/1241) Add user/private flag to state variable +- [**#1282**](https://github.com/hapijs/hapi/issues/1282) Security tests using reply().setState() which throws +- [**#1264**](https://github.com/hapijs/hapi/issues/1264) requesting url that is not encoded correctly should return 400, not 404 +- [**#1291**](https://github.com/hapijs/hapi/issues/1291) Remove server config normalizeRequestPath and default to true +- [**#1290**](https://github.com/hapijs/hapi/issues/1290) Partial path param match /a{b}c does not apply isCaseSensitive +- [**#1288**](https://github.com/hapijs/hapi/issues/1288) Move auth schemes to plugins +- [**#1287**](https://github.com/hapijs/hapi/issues/1287) Split server.auth() into server.auth.scheme() and server.auth.strategy() +- [**#1286**](https://github.com/hapijs/hapi/issues/1286) Expose response preview as public API +- [**#1284**](https://github.com/hapijs/hapi/issues/1284) Expose request.response and change it to direct ref from func +- [**#1285**](https://github.com/hapijs/hapi/issues/1285) Change authenticate() callback to reply interface +- [**#1269**](https://github.com/hapijs/hapi/issues/1269) Manage state all in the request +- [**#1281**](https://github.com/hapijs/hapi/issues/1281) Change authenticate() callback signature +- [**#1280**](https://github.com/hapijs/hapi/issues/1280) Support node callback pattern (err, result) for reply() +- [**#1279**](https://github.com/hapijs/hapi/issues/1279) Convert ext method signature to handler +- [**#1270**](https://github.com/hapijs/hapi/issues/1270) Apply encoding to Response.Payload operations consistently +- [**#1272**](https://github.com/hapijs/hapi/issues/1272) Redo reply.close() +- [**#1277**](https://github.com/hapijs/hapi/issues/1277) Emit 'internalError' for every 500, not just the one sent back +- [**#1276**](https://github.com/hapijs/hapi/issues/1276) Retain headers in 304 response +- [**#1275**](https://github.com/hapijs/hapi/issues/1275) Boom 2.0 +- [**#1274**](https://github.com/hapijs/hapi/issues/1274) Fixed code example in README to comply with 2.0.x +- [**#1238**](https://github.com/hapijs/hapi/issues/1238) Special handling for '*' Vary response header +- [**#1059**](https://github.com/hapijs/hapi/issues/1059) Allow route prerequisites to takeover() and preempt handler +- [**#1222**](https://github.com/hapijs/hapi/issues/1222) Proxy passthrough does not allow for cookie domain modification +- [**#1247**](https://github.com/hapijs/hapi/issues/1247) Clean up postResponse in proxy config +- [**#1253**](https://github.com/hapijs/hapi/issues/1253) in directory, fix the listing of subdirs that reside in a subdirs that have spaces +- [**#1268**](https://github.com/hapijs/hapi/issues/1268) Expose more response properties +- [**#1267**](https://github.com/hapijs/hapi/issues/1267) Add 'app' and 'plugins' to response object +- [**#1266**](https://github.com/hapijs/hapi/issues/1266) Remove 'response.variety' support +- [**#1262**](https://github.com/hapijs/hapi/issues/1262) Remove response.getTtl() +- [**#1261**](https://github.com/hapijs/hapi/issues/1261) Rename response.uri() to response.location() +- [**#1258**](https://github.com/hapijs/hapi/issues/1258) Default Buffer responses to application/octet-stream +- [**#1256**](https://github.com/hapijs/hapi/issues/1256) Remove access to internal response types +- [**#1233**](https://github.com/hapijs/hapi/issues/1233) Clarify server app config usage +- [**#1246**](https://github.com/hapijs/hapi/issues/1246) Allow zero key helpers with cache +- [**#1249**](https://github.com/hapijs/hapi/issues/1249) Cleanup use of request._route.cache and request.route.cache +- [**#1248**](https://github.com/hapijs/hapi/issues/1248) Review proxy upstream ttl passing +- [**#1254**](https://github.com/hapijs/hapi/issues/1254) File response leaks fd if gzipped stream used instead and the other way. +- [**#1251**](https://github.com/hapijs/hapi/issues/1251) Replace File from response type to reply.file() helper +- [**#1252**](https://github.com/hapijs/hapi/issues/1252) Protect response payload stream wrapper from multiple replays +- [**#1242**](https://github.com/hapijs/hapi/issues/1242) Remove server-side route caching +- [**#1231**](https://github.com/hapijs/hapi/issues/1231) request.log() no longer adds 'error' tag if data is Error +- [**#1234**](https://github.com/hapijs/hapi/issues/1234) Move client out to separate module +- [**#1229**](https://github.com/hapijs/hapi/issues/1229) Add req.on('error'/'close') to request object processing +- [**#1189**](https://github.com/hapijs/hapi/issues/1189) Attaching a websocket to a server in a pack +- [**#1230**](https://github.com/hapijs/hapi/issues/1230) Remove plugin permissions +- [**#1219**](https://github.com/hapijs/hapi/issues/1219) `pack.require` doc is somewhat incorrect +- [**#1223**](https://github.com/hapijs/hapi/issues/1223) views.helpersPath requires .js files +- [**#1228**](https://github.com/hapijs/hapi/issues/1228) Client request timeout and downstream listener not set when payload is a stream +- [**#1183**](https://github.com/hapijs/hapi/issues/1183) Remove use of removeAllListeners() +- [**#1207**](https://github.com/hapijs/hapi/issues/1207) Accessing the response stream. +- [**#1216**](https://github.com/hapijs/hapi/issues/1216) Remove support for `notFound` handler string +- [**#1215**](https://github.com/hapijs/hapi/issues/1215) Content-type charset attribute not added to streams +- [**#1214**](https://github.com/hapijs/hapi/issues/1214) Allow specifying a list of method in route config +- [**#1208**](https://github.com/hapijs/hapi/issues/1208) Route error message does not include information about which route failed +- [**#1209**](https://github.com/hapijs/hapi/issues/1209) Duplicate parameter error is missing route information +- [**#1211**](https://github.com/hapijs/hapi/issues/1211) Move all response payload processing to _prepare +- [**#1205**](https://github.com/hapijs/hapi/issues/1205) Honor options.bind in ext +- [**#1204**](https://github.com/hapijs/hapi/issues/1204) Rename handler/ext context to bind +- [**#1202**](https://github.com/hapijs/hapi/issues/1202) Move handler and ext context to use this +- [**#1200**](https://github.com/hapijs/hapi/issues/1200) Removing confidence, alce from composer and CLI +- [**#1194**](https://github.com/hapijs/hapi/issues/1194) Remove support for decorating request with reply() +- [**#1191**](https://github.com/hapijs/hapi/issues/1191) Cannot use multiple parallel pre methods in handler mode +- [**#1195**](https://github.com/hapijs/hapi/issues/1195) Move request.context to request.reply.context +- [**#1192**](https://github.com/hapijs/hapi/issues/1192) Change pre type to always use handler mode +- [**#1190**](https://github.com/hapijs/hapi/issues/1190) Move Obj stringify step to _prepare +- [**#1187**](https://github.com/hapijs/hapi/issues/1187) Change pre to use nested arrays instead of mode (serial, parallel) +- [**#1049**](https://github.com/hapijs/hapi/issues/1049) Validate pre config schema +- [**#1155**](https://github.com/hapijs/hapi/issues/1155) 404 not being caught by onPreResponse function +- [**#1182**](https://github.com/hapijs/hapi/issues/1182) Error transformation does not work when serving static files +- [**#1185**](https://github.com/hapijs/hapi/issues/1185) be more careful about options in _provisionCache +- [**#1176**](https://github.com/hapijs/hapi/issues/1176) Unify stream and buffer responses + +## [**1.20.0**](https://github.com/hapijs/hapi/issues?milestone=77&state=closed) +- [**#1175**](https://github.com/hapijs/hapi/issues/1175) Allow disabling CORS for individual route +- [**#1174**](https://github.com/hapijs/hapi/issues/1174) Adjust CORS origin header options +- [**#1171**](https://github.com/hapijs/hapi/issues/1171) Only emit vary origin for CORS wildcard mode + +## [**1.19.5**](https://github.com/hapijs/hapi/issues?milestone=76&state=closed) +- [**#1169**](https://github.com/hapijs/hapi/issues/1169) Remove load samples and add protection against interval sample falling behind +- [**#1165**](https://github.com/hapijs/hapi/issues/1165) Switch benchmarks to use Hoek.Bench instead of Date.now() + +## [**1.19.4**](https://github.com/hapijs/hapi/issues?milestone=75&state=closed) +- [**#1163**](https://github.com/hapijs/hapi/issues/1163) CORS response doesn't set Vary header in all cases + +## [**1.19.3**](https://github.com/hapijs/hapi/issues?milestone=74&state=closed) +- [**#1161**](https://github.com/hapijs/hapi/issues/1161) Schema issues + +## [**1.19.0**](https://github.com/hapijs/hapi/issues?milestone=71&state=closed) +- [**#1157**](https://github.com/hapijs/hapi/issues/1157) route cache config does not allow specifying name +- [**#1156**](https://github.com/hapijs/hapi/issues/1156) Honor upstream ttl when proxying + +## [**1.18.0**](https://github.com/hapijs/hapi/issues?milestone=70&state=closed) +- [**#1152**](https://github.com/hapijs/hapi/issues/1152) Load sampling and limits +- [**#1150**](https://github.com/hapijs/hapi/issues/1150) Support multiple cache instances +- [**#1148**](https://github.com/hapijs/hapi/issues/1148) Return 401 when allowEmptyUsername is false and username missing + +## [**1.17.0**](https://github.com/hapijs/hapi/issues?milestone=68&state=closed) +- [**#1147**](https://github.com/hapijs/hapi/issues/1147) Add request.reply.proxy() +- [**#1146**](https://github.com/hapijs/hapi/issues/1146) Expose proxy functionality as a utility +- [**#1070**](https://github.com/hapijs/hapi/issues/1070) TypeError when validate.* is set to false +- [**#1102**](https://github.com/hapijs/hapi/issues/1102) How to exclude views from layout +- [**#1140**](https://github.com/hapijs/hapi/issues/1140) Not able to login after attempting without user name +- [**#1144**](https://github.com/hapijs/hapi/issues/1144) Support pre-compressed files +- [**#1142**](https://github.com/hapijs/hapi/issues/1142) Fix ext function plugin env binding +- [**#1137**](https://github.com/hapijs/hapi/issues/1137) generateView at 'onRequest' extension point + +## [**1.16.1**](https://github.com/hapijs/hapi/issues?milestone=67&state=closed) +- [**#1135**](https://github.com/hapijs/hapi/issues/1135) Formatting problem in Reference.md +- [**#1136**](https://github.com/hapijs/hapi/issues/1136) Handlebars 1.1.x uses prototype for registerPartials which breaks its use in Hapi + +## [**1.16.0**](https://github.com/hapijs/hapi/issues?milestone=66&state=closed) +- [**#1129**](https://github.com/hapijs/hapi/issues/1129) support for iisnode and windows named pipes +- [**#1123**](https://github.com/hapijs/hapi/issues/1123) add ability to listen on unix domain socket +- [**#1133**](https://github.com/hapijs/hapi/issues/1133) Joi 2.0 +- [**#1124**](https://github.com/hapijs/hapi/issues/1124) Use ALCE for manifest loading. + +## [**1.15.0**](https://github.com/hapijs/hapi/issues?milestone=65&state=closed) +- [**#1103**](https://github.com/hapijs/hapi/issues/1103) allow arrays of scopes on routes +- [**#1116**](https://github.com/hapijs/hapi/issues/1116) CORS origin bug fixes and enhancements +- [**#1091**](https://github.com/hapijs/hapi/issues/1091) Only set access-control-allow-origin if the origin header value matches (or '*' is allowed) +- [**#1113**](https://github.com/hapijs/hapi/issues/1113) updates plugin.views Reference.md entry to a clear and working example +- [**#1094**](https://github.com/hapijs/hapi/issues/1094) 404 not being caught by onPreResponse function +- [**#1112**](https://github.com/hapijs/hapi/issues/1112) Too strict cookie parsing? +- [**#1114**](https://github.com/hapijs/hapi/issues/1114) What is the best way to access request headers? + +## [**1.14.0**](https://github.com/hapijs/hapi/issues?milestone=64&state=closed) +- [**#1098**](https://github.com/hapijs/hapi/issues/1098) Add criteria support to CLI +- [**#1092**](https://github.com/hapijs/hapi/issues/1092) Empty path parameter should have empty string value, not undefined +- [**#1028**](https://github.com/hapijs/hapi/issues/1028) Expose requests content-type/mime & accept +- [**#1024**](https://github.com/hapijs/hapi/issues/1024) Hapi.Composer.compose() requires "plugins" but won't warn if it's not there +- [**#995**](https://github.com/hapijs/hapi/issues/995) Block response.created() from methods other than POST and PUT + +## [**1.13.0**](https://github.com/hapijs/hapi/issues?milestone=63&state=closed) +- [**#1090**](https://github.com/hapijs/hapi/issues/1090) Support partial path segment parameter +- [**#1061**](https://github.com/hapijs/hapi/issues/1061) POST requests with Content-Type=text/plain + +## [**1.12.0**](https://github.com/hapijs/hapi/issues?milestone=62&state=closed) +- [**#1004**](https://github.com/hapijs/hapi/issues/1004) validation fails when using Hapi.types.Object() at the root +- [**#1088**](https://github.com/hapijs/hapi/issues/1088) Plugin dependencies +- [**#1085**](https://github.com/hapijs/hapi/issues/1085) Validation options +- [**#1083**](https://github.com/hapijs/hapi/issues/1083) Normalize response headers to lowercase field name +- [**#1076**](https://github.com/hapijs/hapi/issues/1076) Test for both formats of Content-Encoding header +- [**#1081**](https://github.com/hapijs/hapi/issues/1081) Migrate to Iron 1.0 +- [**#1074**](https://github.com/hapijs/hapi/issues/1074) Route-specific validation error handler +- [**#1077**](https://github.com/hapijs/hapi/issues/1077) Add compileMode to schema.js + +## [**1.11.1**](https://github.com/hapijs/hapi/issues?milestone=61&state=closed) +- [**#1067**](https://github.com/hapijs/hapi/issues/1067) Bug fix for loading ext auth scheme into multiple servers + +## [**1.11.0**](https://github.com/hapijs/hapi/issues?milestone=60&state=closed) +- [**#1064**](https://github.com/hapijs/hapi/issues/1064) Helper cache drop interface + +## [**1.10.0**](https://github.com/hapijs/hapi/issues?milestone=59&state=closed) +- [**#1057**](https://github.com/hapijs/hapi/issues/1057) '/{p*}' is sorted ahead of '/{a}/b/{p*}' +- [**#1056**](https://github.com/hapijs/hapi/issues/1056) Allow directory paths to include multiple params and use last for resource selection +- [**#1058**](https://github.com/hapijs/hapi/issues/1058) Closes #1056 and #1057 +- [**#1054**](https://github.com/hapijs/hapi/issues/1054) Enhance prerequisites configuration options +- [**#1030**](https://github.com/hapijs/hapi/issues/1030) Problems with routes + +## [**1.9.7**](https://github.com/hapijs/hapi/issues?milestone=58&state=closed) +- [**#1044**](https://github.com/hapijs/hapi/issues/1044) Reverting changes to generic/stream responses + +## [**1.9.6**](https://github.com/hapijs/hapi/issues?milestone=57&state=closed) +- [**#1037**](https://github.com/hapijs/hapi/issues/1037) Stream responses emit response event + +## [**1.9.5**](https://github.com/hapijs/hapi/issues?milestone=56&state=closed) +- [**#1033**](https://github.com/hapijs/hapi/issues/1033) Node 0.11 bug fixes +- [**#1034**](https://github.com/hapijs/hapi/issues/1034) Upping shot dep version +- [**#1032**](https://github.com/hapijs/hapi/issues/1032) Updating boom version to 1.0.0 +- [**#1019**](https://github.com/hapijs/hapi/issues/1019) Depend on Joi v1.1.x + +## [**1.9.4**](https://github.com/hapijs/hapi/issues?milestone=55&state=closed) +- [**#1029**](https://github.com/hapijs/hapi/issues/1029) Using latest hoek and moved to AUTHORS file +- [**#1017**](https://github.com/hapijs/hapi/issues/1017) Overrides Cache-Control in proxy even when no local policy is defined + +## [**1.9.3**](https://github.com/hapijs/hapi/issues?milestone=54&state=closed) +- [**#1016**](https://github.com/hapijs/hapi/issues/1016) Adding helper with cache to pack with multiple server crash + +## [**1.9.2**](https://github.com/hapijs/hapi/issues?milestone=53&state=closed) +- [**#1015**](https://github.com/hapijs/hapi/issues/1015) Undo #1014 + +## [**1.9.1**](https://github.com/hapijs/hapi/issues?milestone=52&state=closed) +- [**#1014**](https://github.com/hapijs/hapi/issues/1014) plugin.helper should be selectable +- [**#1005**](https://github.com/hapijs/hapi/issues/1005) Improve server constructor argument validation error reporting +- [**#1001**](https://github.com/hapijs/hapi/issues/1001) Pack event handlers now support correct args + +## [**1.9.0**](https://github.com/hapijs/hapi/issues?milestone=51&state=closed) +- [**#998**](https://github.com/hapijs/hapi/issues/998) Adding dtrace probes +- [**#993**](https://github.com/hapijs/hapi/issues/993) Plugin context +- [**#996**](https://github.com/hapijs/hapi/issues/996) Remove Directory and View from cacheable responses +- [**#994**](https://github.com/hapijs/hapi/issues/994) Server level cache +- [**#959**](https://github.com/hapijs/hapi/issues/959) Adding foundation for dtrace probe support +- [**#980**](https://github.com/hapijs/hapi/issues/980) Add interface to register local `require` function with plugin api +- [**#979**](https://github.com/hapijs/hapi/issues/979) Confusing error message when configuring auth using default strategy when none configured +- [**#978**](https://github.com/hapijs/hapi/issues/978) Change plugin `ext` permission default to true +- [**#976**](https://github.com/hapijs/hapi/issues/976) plugin.require support +- [**#974**](https://github.com/hapijs/hapi/issues/974) Pack start/stop events + +## [**1.8.3**](https://github.com/hapijs/hapi/issues?milestone=50&state=closed) +- [**#971**](https://github.com/hapijs/hapi/issues/971) Use instanceof Error + isBoom to replace instanceof Boom +- [**#968**](https://github.com/hapijs/hapi/issues/968) Changes to `plugin.hapi` and the `cookie` scheme +- [**#970**](https://github.com/hapijs/hapi/issues/970) Removing complexity-report +- [**#967**](https://github.com/hapijs/hapi/issues/967) Authentication defaultMode allowed invalid values +- [**#966**](https://github.com/hapijs/hapi/issues/966) Expose the hapi module on the request object +- [**#963**](https://github.com/hapijs/hapi/issues/963) Question: should pack.register's register pack parameter should be renamed to plugin? +- [**#965**](https://github.com/hapijs/hapi/issues/965) Change parameter name pack to plugin to resolve #963 +- [**#962**](https://github.com/hapijs/hapi/issues/962) Server config schema does not allow single string labels +- [**#960**](https://github.com/hapijs/hapi/issues/960) Updates to case sensitive routing +- [**#958**](https://github.com/hapijs/hapi/issues/958) Path params are no longer lowercased in router +- [**#955**](https://github.com/hapijs/hapi/issues/955) Update Reference.md plugin.lenght to plugin.length +- [**#951**](https://github.com/hapijs/hapi/issues/951) use .isBoom instead of instanceof Boom +- [**#949**](https://github.com/hapijs/hapi/issues/949) Error when hawk payload validation is required but the request contains no hash +- [**#948**](https://github.com/hapijs/hapi/issues/948) reference multiparty instead of formidable +- [**#946**](https://github.com/hapijs/hapi/issues/946) Updating example to be clearer +- [**#944**](https://github.com/hapijs/hapi/issues/944) Found some small typos/formatting issues in Reference.md + +## [**1.8.2**](https://github.com/hapijs/hapi/issues?milestone=49&state=closed) +- [**#943**](https://github.com/hapijs/hapi/issues/943) Updating version +- [**#942**](https://github.com/hapijs/hapi/issues/942) Layouts work correctly in jade +- [**#941**](https://github.com/hapijs/hapi/issues/941) No longer destroying request socket +- [**#938**](https://github.com/hapijs/hapi/issues/938) Fixed the code example to get Hapi's version +- [**#936**](https://github.com/hapijs/hapi/issues/936) Allow omitting trailing slash when last segment is an optional parameter + +## [**1.8.1**](https://github.com/hapijs/hapi/issues?milestone=48&state=closed) +- [**#933**](https://github.com/hapijs/hapi/issues/933) Updating version to 1.8.1 +- [**#928**](https://github.com/hapijs/hapi/issues/928) Removing listeners on domain when exiting +- [**#927**](https://github.com/hapijs/hapi/issues/927) Removing global variable + +## [**1.8.0**](https://github.com/hapijs/hapi/issues?milestone=47&state=closed) +- [**#925**](https://github.com/hapijs/hapi/issues/925) Fixing edge case where bad path can cause issues with url.parse +- [**#924**](https://github.com/hapijs/hapi/issues/924) Issue/922 +- [**#922**](https://github.com/hapijs/hapi/issues/922) Handling directory routes that end both with and without a trailing slash +- [**#923**](https://github.com/hapijs/hapi/issues/923) remove connection event listeners when server stops + +## [**1.7.3**](https://github.com/hapijs/hapi/issues?milestone=46&state=closed) +- [**#920**](https://github.com/hapijs/hapi/issues/920) Upping version to 1.7.3 +- [**#919**](https://github.com/hapijs/hapi/issues/919) Client now handles downstreamRes close event + +## [**1.7.2**](https://github.com/hapijs/hapi/issues?milestone=45&state=closed) +- [**#915**](https://github.com/hapijs/hapi/issues/915) custom cache engine support + +## [**1.7.0**](https://github.com/hapijs/hapi/issues?milestone=43&state=closed) +- [**#912**](https://github.com/hapijs/hapi/issues/912) Fixing aborted causing duplicate res.ends issue with incoming request +- [**#911**](https://github.com/hapijs/hapi/issues/911) Allow client.request calls without a callback (ignoring response) +- [**#910**](https://github.com/hapijs/hapi/issues/910) Client does not destroy request on redirection error +- [**#907**](https://github.com/hapijs/hapi/issues/907) Adding test + +## [**1.6.2**](https://github.com/hapijs/hapi/issues?milestone=42&state=closed) +- [**#906**](https://github.com/hapijs/hapi/issues/906) Proxy requests are closed when server response already sent + +## [**1.6.1**](https://github.com/hapijs/hapi/issues?milestone=41&state=closed) +- [**#904**](https://github.com/hapijs/hapi/issues/904) Issue/902 +- [**#903**](https://github.com/hapijs/hapi/issues/903) Fixing issue where timeout occurs after socket close in client +- [**#901**](https://github.com/hapijs/hapi/issues/901) Performance tweaks +- [**#897**](https://github.com/hapijs/hapi/issues/897) Hapi node_modules_path now supports symlinks + +## [**1.6.0**](https://github.com/hapijs/hapi/issues?milestone=40&state=closed) +- [**#891**](https://github.com/hapijs/hapi/issues/891) Exposing rejectUnauthorized property on proxy + +## [**1.5.0**](https://github.com/hapijs/hapi/issues?milestone=39&state=closed) +- [**#889**](https://github.com/hapijs/hapi/issues/889) Plugin view engine required from hapi's module path, not plugin +- [**#887**](https://github.com/hapijs/hapi/issues/887) Default auth scheme only works when scheme is added with 'default' name + +## [**1.4.0**](https://github.com/hapijs/hapi/issues?milestone=38&state=closed) +- [**#868**](https://github.com/hapijs/hapi/issues/868) Potential leak when aborting reading a payload if max size reached +- [**#872**](https://github.com/hapijs/hapi/issues/872) Test for invalid incoming path without leading '/' +- [**#869**](https://github.com/hapijs/hapi/issues/869) Request._replyInterface called twice but does not share wasProcessed state +- [**#870**](https://github.com/hapijs/hapi/issues/870) Response treats objects as errors based on too trivial keys +- [**#885**](https://github.com/hapijs/hapi/issues/885) Fix plugin.path +- [**#883**](https://github.com/hapijs/hapi/issues/883) Cleanup pack requirePath + +## [**1.3.0**](https://github.com/hapijs/hapi/issues?milestone=37&state=closed) +- [**#871**](https://github.com/hapijs/hapi/issues/871) * allowed in path but used as special character in route fingerprint +- [**#880**](https://github.com/hapijs/hapi/issues/880) Performance and hawk options +- [**#879**](https://github.com/hapijs/hapi/issues/879) Support all Hawk and Bewit options +- [**#878**](https://github.com/hapijs/hapi/issues/878) Adding Client request socket timeout +- [**#863**](https://github.com/hapijs/hapi/issues/863) Absolute paths now work correctly with hapi command +- [**#860**](https://github.com/hapijs/hapi/issues/860) Adding hapi bin test and fixing issue with no plugins +- [**#862**](https://github.com/hapijs/hapi/issues/862) Minor performance tweaks +- [**#859**](https://github.com/hapijs/hapi/issues/859) Fixing test +- [**#858**](https://github.com/hapijs/hapi/issues/858) Added missing done() call in test +- [**#856**](https://github.com/hapijs/hapi/issues/856) Remove _log() wrapper + +## [**1.2.0**](https://github.com/hapijs/hapi/issues?milestone=36&state=closed) +- [**#846**](https://github.com/hapijs/hapi/issues/846) Request: View configuration to autoload helepers +- [**#854**](https://github.com/hapijs/hapi/issues/854) Move to use multiparty +- [**#853**](https://github.com/hapijs/hapi/issues/853) New internal proxy handler +- [**#850**](https://github.com/hapijs/hapi/issues/850) Increasing allowed sockets to 10 for client +- [**#848**](https://github.com/hapijs/hapi/issues/848) Template settings override fix +- [**#845**](https://github.com/hapijs/hapi/issues/845) Generic response fails to account for all possible res events +- [**#844**](https://github.com/hapijs/hapi/issues/844) Proxy to outside site fails due to request's old stream api and node 0.10 wrap() +- [**#843**](https://github.com/hapijs/hapi/issues/843) Allow setting custom headers via proxy mapUri + +## [**1.1.0**](https://github.com/hapijs/hapi/issues?milestone=32&state=closed) +- [**#839**](https://github.com/hapijs/hapi/issues/839) Cleanup listeners +- [**#838**](https://github.com/hapijs/hapi/issues/838) Issue/808 +- [**#837**](https://github.com/hapijs/hapi/issues/837) Issue/812 +- [**#834**](https://github.com/hapijs/hapi/issues/834) `Pack` throws an `AssertionError` if the `requirePath` is not absolute +- [**#835**](https://github.com/hapijs/hapi/issues/835) `Pack`: Automatically resolve the `requirePath` if provided +- [**#832**](https://github.com/hapijs/hapi/issues/832) Allow route.payload config to be an object with `mode` +- [**#833**](https://github.com/hapijs/hapi/issues/833) closes #832 +- [**#830**](https://github.com/hapijs/hapi/issues/830) Add payload 'try' parsing mode +- [**#831**](https://github.com/hapijs/hapi/issues/831) Closes #830 +- [**#828**](https://github.com/hapijs/hapi/issues/828) Add HttpOnly support to cookie auth +- [**#827**](https://github.com/hapijs/hapi/issues/827) request debug printout format and condition +- [**#820**](https://github.com/hapijs/hapi/issues/820) Clarified the format of payload in server.inject in the Reference doc +- [**#824**](https://github.com/hapijs/hapi/issues/824) Issue/821 + +## [**1.0.3**](https://github.com/hapijs/hapi/issues?milestone=35&state=closed) +- [**#823**](https://github.com/hapijs/hapi/issues/823) Issue/822 +- [**#822**](https://github.com/hapijs/hapi/issues/822) JSONP doesn't seem to be working +- [**#817**](https://github.com/hapijs/hapi/issues/817) Payload bugfix for PATCH method +- [**#818**](https://github.com/hapijs/hapi/issues/818) Tiny composer documentation fix +- [**#814**](https://github.com/hapijs/hapi/issues/814) Fixed jade compile issues and updated tests to verify fix. +- [**#804**](https://github.com/hapijs/hapi/issues/804) Remove restriction on params in path for static file handler + +## [**1.0.2**](https://github.com/hapijs/hapi/issues?milestone=34&state=closed) +- [**#813**](https://github.com/hapijs/hapi/issues/813) text/* content-type always echo back the received content + +## [**1.0.0**](https://github.com/hapijs/hapi/issues?milestone=26&state=closed) +- [**#796**](https://github.com/hapijs/hapi/issues/796) Allow unencoded double quote and backslash in the cookie value +- [**#793**](https://github.com/hapijs/hapi/issues/793) Use new assert with passed parameters instead of concat string +- [**#791**](https://github.com/hapijs/hapi/issues/791) Test fails: Auth Hawk includes authorization header in response when the response is a stream +- [**#789**](https://github.com/hapijs/hapi/issues/789) Streams not properly being closed for static files when browser gets cache hit +- [**#788**](https://github.com/hapijs/hapi/issues/788) Need more detailed documentation for "next" callback for event handlers +- [**#787**](https://github.com/hapijs/hapi/issues/787) Expose Plugin File Path +- [**#767**](https://github.com/hapijs/hapi/issues/767) Verify every example works with 1.0 +- [**#780**](https://github.com/hapijs/hapi/issues/780) Relative path redirection should have vhost support +- [**#768**](https://github.com/hapijs/hapi/issues/768) Directory handler example +- [**#784**](https://github.com/hapijs/hapi/issues/784) Change server helper options.generateKey to receive the same arguments as the helper method +- [**#782**](https://github.com/hapijs/hapi/issues/782) Payload parsing should be based on request method, not path method +- [**#781**](https://github.com/hapijs/hapi/issues/781) Do not set request.state[name] when value is invalid regardless of failAction +- [**#779**](https://github.com/hapijs/hapi/issues/779) Add server config `location` for Location header prefix +- [**#776**](https://github.com/hapijs/hapi/issues/776) Streamline request.reply() +- [**#771**](https://github.com/hapijs/hapi/issues/771) Multipart upload issue +- [**#765**](https://github.com/hapijs/hapi/issues/765) Refactor views manager configuration +- [**#752**](https://github.com/hapijs/hapi/issues/752) Shared config for plugins +- [**#751**](https://github.com/hapijs/hapi/issues/751) Cleanup Unmonitored error +- [**#759**](https://github.com/hapijs/hapi/issues/759) Feature/misc +- [**#758**](https://github.com/hapijs/hapi/issues/758) cookie authentication example fails with 1.0.0 +- [**#755**](https://github.com/hapijs/hapi/issues/755) Views now render without child path +- [**#745**](https://github.com/hapijs/hapi/issues/745) Basic Authentication callback with no username/password returns 500 +- [**#742**](https://github.com/hapijs/hapi/issues/742) Remove built-in Oz support +- [**#741**](https://github.com/hapijs/hapi/issues/741) Remove Raw response type +- [**#739**](https://github.com/hapijs/hapi/issues/739) Adding server.stop support for destroying connections after a timeout +- [**#738**](https://github.com/hapijs/hapi/issues/738) Support for Access-Control-Expose-Headers in the CORS options +- [**#736**](https://github.com/hapijs/hapi/issues/736) Node v0.10 + +## [**0.16.0**](https://github.com/hapijs/hapi/issues?milestone=24&state=closed) +- [**#656**](https://github.com/hapijs/hapi/issues/656) Support for virtual hosts +- [**#727**](https://github.com/hapijs/hapi/issues/727) Fix hawk response header edge cases +- [**#726**](https://github.com/hapijs/hapi/issues/726) Misc features +- [**#725**](https://github.com/hapijs/hapi/issues/725) Debug enhancements +- [**#714**](https://github.com/hapijs/hapi/issues/714) Adding remote address and referrer information to request.info +- [**#724**](https://github.com/hapijs/hapi/issues/724) Route validation is now using payload instead of schema +- [**#716**](https://github.com/hapijs/hapi/issues/716) Errors when preparing a response now emit internalError correctly +- [**#715**](https://github.com/hapijs/hapi/issues/715) Auth api refactor +- [**#700**](https://github.com/hapijs/hapi/issues/700) Adding security tests and fixing security bugs +- [**#686**](https://github.com/hapijs/hapi/issues/686) Pack auth api +- [**#683**](https://github.com/hapijs/hapi/issues/683) Pack and cache API refactor + +## [**0.15.8**](https://github.com/hapijs/hapi/issues?milestone=31&state=closed) +- [**#723**](https://github.com/hapijs/hapi/issues/723) Global autoValue cookie overwrites other cookies +- [**#722**](https://github.com/hapijs/hapi/issues/722) Proxy shares cookies across different sessions + +## [**0.15.7**](https://github.com/hapijs/hapi/issues?milestone=30&state=closed) +- [**#717**](https://github.com/hapijs/hapi/issues/717) Auto cookie value + +## [**0.15.4**](https://github.com/hapijs/hapi/issues?milestone=28&state=closed) +- [**#682**](https://github.com/hapijs/hapi/issues/682) Bypass node http bug in writeHead +- [**#678**](https://github.com/hapijs/hapi/issues/678) Updating tutorials and adding a plugins list doc +- [**#674**](https://github.com/hapijs/hapi/issues/674) Adding missing branch tests + +## [**0.15.3**](https://github.com/hapijs/hapi/issues?milestone=27&state=closed) +- [**#677**](https://github.com/hapijs/hapi/issues/677) Fix ext() with function array bug + +## [**0.15.2**](https://github.com/hapijs/hapi/issues?milestone=25&state=closed) +- [**#670**](https://github.com/hapijs/hapi/issues/670) internalError event +- [**#669**](https://github.com/hapijs/hapi/issues/669) Optimize prerequisites and protect + +## [**0.15.1**](https://github.com/hapijs/hapi/issues?milestone=23&state=closed) +- [**#663**](https://github.com/hapijs/hapi/issues/663) Full plugin deps +- [**#662**](https://github.com/hapijs/hapi/issues/662) Plugin deps +- [**#659**](https://github.com/hapijs/hapi/issues/659) handler interface api styles +- [**#653**](https://github.com/hapijs/hapi/issues/653) Add request defensive protection +- [**#642**](https://github.com/hapijs/hapi/issues/642) Adding hawk response auth header +- [**#649**](https://github.com/hapijs/hapi/issues/649) Migrate to lab (from mocha) + +## [**0.15.0**](https://github.com/hapijs/hapi/issues?milestone=22&state=closed) +- [**#638**](https://github.com/hapijs/hapi/issues/638) Event tags +- [**#632**](https://github.com/hapijs/hapi/issues/632) Adding example of cookie failAction +- [**#635**](https://github.com/hapijs/hapi/issues/635) Cleanup +- [**#634**](https://github.com/hapijs/hapi/issues/634) Domains +- [**#633**](https://github.com/hapijs/hapi/issues/633) pack interface cleanup +- [**#630**](https://github.com/hapijs/hapi/issues/630) shot 0.1.0, Buffer response type, encoding +- [**#619**](https://github.com/hapijs/hapi/issues/619) hawk 0.10, payload cleanup, text/* parse support +- [**#617**](https://github.com/hapijs/hapi/issues/617) Upgrade to Hawk 0.9.0 +- [**#615**](https://github.com/hapijs/hapi/issues/615) Using path.join where possible +- [**#616**](https://github.com/hapijs/hapi/issues/616) Cookie Max-Age is in seconds, not msec +- [**#613**](https://github.com/hapijs/hapi/issues/613) Fix proxy mapUri query bug, allow pack.api to specify key +- [**#612**](https://github.com/hapijs/hapi/issues/612) Remove monitor +- [**#611**](https://github.com/hapijs/hapi/issues/611) Adding vhost tests +- [**#609**](https://github.com/hapijs/hapi/issues/609) Virtual hosts support +- [**#610**](https://github.com/hapijs/hapi/issues/610) Cleaning up test and stream response +- [**#607**](https://github.com/hapijs/hapi/issues/607) Adding basic crumb CSRF information to reference guide +- [**#602**](https://github.com/hapijs/hapi/issues/602) Relative paths +- [**#595**](https://github.com/hapijs/hapi/issues/595) Fixing gzip stream test to use simple stream +- [**#596**](https://github.com/hapijs/hapi/issues/596) Adding request payload section +- [**#594**](https://github.com/hapijs/hapi/issues/594) Adding deflate support to stream response +- [**#593**](https://github.com/hapijs/hapi/issues/593) Adding graceful shutdown from QUIT signal event +- [**#592**](https://github.com/hapijs/hapi/issues/592) refactor router +- [**#591**](https://github.com/hapijs/hapi/issues/591) Fixing test to be isolated +- [**#589**](https://github.com/hapijs/hapi/issues/589) Sending a gzipped proxy response now works correctly +- [**#585**](https://github.com/hapijs/hapi/issues/585) Server.stop now stops gracefully + +## [**0.14.2**](https://github.com/hapijs/hapi/issues?milestone=21&state=closed) +- [**#587**](https://github.com/hapijs/hapi/issues/587) Composer config options +- [**#577**](https://github.com/hapijs/hapi/issues/577) Beef up file etag tests + +## [**0.14.0**](https://github.com/hapijs/hapi/issues?milestone=18&state=closed) +- [**#563**](https://github.com/hapijs/hapi/issues/563) Using memory instead of redis for test +- [**#561**](https://github.com/hapijs/hapi/issues/561) Composer +- [**#553**](https://github.com/hapijs/hapi/issues/553) Pack server event and socket timeout override +- [**#543**](https://github.com/hapijs/hapi/issues/543) Fix scoping bug when using multiple helper prerequisites +- [**#438**](https://github.com/hapijs/hapi/issues/438) Adding support for payload authentication validation +- [**#537**](https://github.com/hapijs/hapi/issues/537) Update docs/Reference.md +- [**#531**](https://github.com/hapijs/hapi/issues/531) JSONP +- [**#523**](https://github.com/hapijs/hapi/issues/523) Set CORS origin header to incoming request origin if allowed +- [**#522**](https://github.com/hapijs/hapi/issues/522) rename helmet to tv +- [**#512**](https://github.com/hapijs/hapi/issues/512) Direct use of Boom (0.3.0) +- [**#496**](https://github.com/hapijs/hapi/issues/496) Distributable cache for files +- [**#500**](https://github.com/hapijs/hapi/issues/500) Cookie parsing fails if encoding set to 'none' +- [**#501**](https://github.com/hapijs/hapi/issues/501) Response refactor, bug fixes +- [**#498**](https://github.com/hapijs/hapi/issues/498) Adding code coverage support using blanket +- [**#494**](https://github.com/hapijs/hapi/issues/494) fix typo from issue/491 +- [**#493**](https://github.com/hapijs/hapi/issues/493) Fixing test that would fail periodically +- [**#482**](https://github.com/hapijs/hapi/issues/482) Parse cookies before authentication +- [**#481**](https://github.com/hapijs/hapi/issues/481) Adding log tag filtering information to readme +- [**#480**](https://github.com/hapijs/hapi/issues/480) Cleaning up this. use +- [**#478**](https://github.com/hapijs/hapi/issues/478) Cleanup ext options and error handling +- [**#475**](https://github.com/hapijs/hapi/issues/475) Simplify path regex + +## [**0.13.2**](https://github.com/hapijs/hapi/issues?milestone=20&state=closed) +- [**#474**](https://github.com/hapijs/hapi/issues/474) 0.13.2 +- [**#466**](https://github.com/hapijs/hapi/issues/466) Directory listing at top level folders now link correctly +- [**#472**](https://github.com/hapijs/hapi/issues/472) Fix matching of wildcard path param with trailing / +- [**#463**](https://github.com/hapijs/hapi/issues/463) Typo: req.session.used -> req.session.user + +## [**0.13.0**](https://github.com/hapijs/hapi/issues?milestone=17&state=closed) +- [**#448**](https://github.com/hapijs/hapi/issues/448) Fixed typos + +## [**0.12.0**](https://github.com/hapijs/hapi/issues?milestone=14&state=closed) +- [**#435**](https://github.com/hapijs/hapi/issues/435) Prerequisite helper shortcut interface +- [**#434**](https://github.com/hapijs/hapi/issues/434) Bound handler to request, bump to 0.12.0 +- [**#427**](https://github.com/hapijs/hapi/issues/427) CORS cleanup and Monitor defaults +- [**#425**](https://github.com/hapijs/hapi/issues/425) Route sorting rewrite +- [**#373**](https://github.com/hapijs/hapi/issues/373) Add support for private cache-control flag +- [**#420**](https://github.com/hapijs/hapi/issues/420) Goodies +- [**#416**](https://github.com/hapijs/hapi/issues/416) Auth cleanup +- [**#407**](https://github.com/hapijs/hapi/issues/407) Adding support for basic auth password hashing +- [**#406**](https://github.com/hapijs/hapi/issues/406) Update auth dependencies +- [**#402**](https://github.com/hapijs/hapi/issues/402) Use fixed time password comparison + +## [**0.10.0**](https://github.com/hapijs/hapi/issues?milestone=9&state=closed) +- [**#329**](https://github.com/hapijs/hapi/issues/329) Add redirection response +- [**#314**](https://github.com/hapijs/hapi/issues/314) Multiple auth schemes +- [**#322**](https://github.com/hapijs/hapi/issues/322) Docs handler refactor + +## [**0.9.3**](https://github.com/hapijs/hapi/issues?milestone=12&state=closed) +- [**#317**](https://github.com/hapijs/hapi/issues/317) Test helpers, mongo auth test +- [**#312**](https://github.com/hapijs/hapi/issues/312) Misc cleanup + +## [**0.9.2**](https://github.com/hapijs/hapi/issues?milestone=10&state=closed) +- [**#301**](https://github.com/hapijs/hapi/issues/301) Merge, payload tests +- [**#305**](https://github.com/hapijs/hapi/issues/305) Hidden files can now optionally be served +- [**#299**](https://github.com/hapijs/hapi/issues/299) Fix issue with case-insensitive route conflic +- [**#298**](https://github.com/hapijs/hapi/issues/298) Prevent use of encoded non-reserved characters in path +- [**#297**](https://github.com/hapijs/hapi/issues/297) Refactor request path normalization +- [**#294**](https://github.com/hapijs/hapi/issues/294) Refactor responses, auth, payload + +## [**0.9.1**](https://github.com/hapijs/hapi/issues?milestone=8&state=closed) +- [**#277**](https://github.com/hapijs/hapi/issues/277) Changed matching rule of {param*}, Oz tests +- [**#275**](https://github.com/hapijs/hapi/issues/275) Prevent basic routes collision +- [**#268**](https://github.com/hapijs/hapi/issues/268) Tests, extension auth schemes +- [**#258**](https://github.com/hapijs/hapi/issues/258) Adding support for etag and last-modified headers +- [**#255**](https://github.com/hapijs/hapi/issues/255) Adding support for gzip responses +- [**#262**](https://github.com/hapijs/hapi/issues/262) Support /path/{param*} syntax + +## [**0.9.0**](https://github.com/hapijs/hapi/issues?milestone=3&state=closed) +- [**#250**](https://github.com/hapijs/hapi/issues/250) Direct response support +- [**#245**](https://github.com/hapijs/hapi/issues/245) Basic auth +- [**#237**](https://github.com/hapijs/hapi/issues/237) Response refactor +- [**#234**](https://github.com/hapijs/hapi/issues/234) Oz +- [**#229**](https://github.com/hapijs/hapi/issues/229) Initial 0.9.0 + +## [**0.8.4**](https://github.com/hapijs/hapi/issues?milestone=7&state=closed) +- [**#221**](https://github.com/hapijs/hapi/issues/221) Adding parsing of multipart form-data content-type + +## [**0.8.3**](https://github.com/hapijs/hapi/issues?milestone=6&state=closed) +- [**#212**](https://github.com/hapijs/hapi/issues/212) Adding proxy tests and doing a little refactoring +- [**#211**](https://github.com/hapijs/hapi/issues/211) Cache tests, Fix response processing header order + +## [**0.8.2**](https://github.com/hapijs/hapi/issues?milestone=5&state=closed) +- [**#210**](https://github.com/hapijs/hapi/issues/210) 0.8.2 +- [**#209**](https://github.com/hapijs/hapi/issues/209) Tests +- [**#207**](https://github.com/hapijs/hapi/issues/207) Error refactor, custom error support (passThrough) +- [**#206**](https://github.com/hapijs/hapi/issues/206) Fixing issue with error responses being cached + test + +## [**0.8.0**](https://github.com/hapijs/hapi/issues?milestone=2&state=closed) +- [**#183**](https://github.com/hapijs/hapi/issues/183) Cache segment validation +- [**#164**](https://github.com/hapijs/hapi/issues/164) Server helpers, initial response validation, Mongo support + +## [**0.6.0**](https://github.com/hapijs/hapi/issues?milestone=1&state=closed) +- [**#102**](https://github.com/hapijs/hapi/issues/102) v0.6.0 merge +- [**#101**](https://github.com/hapijs/hapi/issues/101) modified new validation fns to use Utils.assert +- [**#100**](https://github.com/hapijs/hapi/issues/100) New Query Validation Fns Added +- [**#99**](https://github.com/hapijs/hapi/issues/99) Simplified request log interface +- [**#63**](https://github.com/hapijs/hapi/issues/63) Added in SSL cert passphrase to https server creation from settings. +- [**#96**](https://github.com/hapijs/hapi/issues/96) Small utils +- [**#94**](https://github.com/hapijs/hapi/issues/94) debug interface, log interface +- [**#93**](https://github.com/hapijs/hapi/issues/93) fix error on subsequent url accesses for queryval +- [**#92**](https://github.com/hapijs/hapi/issues/92) Fix example +- [**#91**](https://github.com/hapijs/hapi/issues/91) QueryValidation fixes, add default behavior for unspecified params, added small tests \ No newline at end of file diff --git a/node_modules/hapi/CONTRIBUTING.md b/node_modules/hapi/CONTRIBUTING.md new file mode 100755 index 0000000..529d316 --- /dev/null +++ b/node_modules/hapi/CONTRIBUTING.md @@ -0,0 +1,14 @@ +# How to contribute +We welcome contributions from the community and are pleased to have them. Please follow this guide when logging issues or making code changes. + +## Logging Issues +All issues should be created using the [new issue form](https://github.com/hapijs/hapi/issues/new). Clearly describe the issue including steps to reproduce if there are any. Also, make sure to indicate the earliest version that has the issue being reported. + +## Patching Code +Code changes are welcome and should follow the guidelines below. + +* Fork the repository on GitHub. +* Fix the issue ensuring that your code follows the [style guide](https://github.com/hapijs/contrib/blob/master/Style.md). +* Add tests for your new code ensuring that you have 100% code coverage (we can help you reach 100% but will not merge without it). + * Run `make test-cov-html` to generate a report of test coverage +* [Pull requests](http://help.github.com/send-pull-requests/) should be made to the [master branch](https://github.com/hapijs/hapi/tree/master). diff --git a/node_modules/hapi/LICENSE b/node_modules/hapi/LICENSE new file mode 100755 index 0000000..5530904 --- /dev/null +++ b/node_modules/hapi/LICENSE @@ -0,0 +1,31 @@ +Copyright (c) 2011-2014, Walmart and other contributors. +Copyright (c) 2011, Yahoo Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/hapi/graphs/contributors +Portions of this project were initially based on the Yahoo! Inc. Postmile project, +published at https://github.com/yahoo/postmile. diff --git a/node_modules/hapi/Makefile b/node_modules/hapi/Makefile new file mode 100755 index 0000000..281eb1e --- /dev/null +++ b/node_modules/hapi/Makefile @@ -0,0 +1,10 @@ +test: + @node node_modules/lab/bin/lab -a code +test-cov: + @node node_modules/lab/bin/lab -a code -t 100 -L +test-cov-html: + @node node_modules/lab/bin/lab -a code -r html -o coverage.html +changelog: + @mdchangelog --no-prologue --no-orphan-issues --overwrite --order-milestones semver --order-issues closed_at --dependents --timeout 120000 + +.PHONY: test test-cov test-cov-html changelog diff --git a/node_modules/hapi/README.md b/node_modules/hapi/README.md new file mode 100755 index 0000000..18254d6 --- /dev/null +++ b/node_modules/hapi/README.md @@ -0,0 +1,15 @@ + + +### Web and services application framework + +Lead Maintainer: [Eran Hammer](https://github.com/hueniverse) + +**hapi** is a simple to use configuration-centric framework with built-in support for input validation, caching, +authentication, and other essential facilities for building web and services applications. **hapi** enables +developers to focus on writing reusable application in a highly modular and prescriptive approach. + +Development version: **8.4.x** ([release notes](https://github.com/hapijs/hapi/issues?labels=release+notes&page=1&state=closed)) +[![Build Status](https://secure.travis-ci.org/hapijs/hapi.svg)](http://travis-ci.org/hapijs/hapi) + +For the latest updates and release information visit [hapijs.com](http://hapijs.com) and follow [@hapijs](https://twitter.com/hapijs) on twitter. If you have questions, please open an issue in the +[discussion forum](https://github.com/hapijs/discuss). diff --git a/node_modules/hapi/images/hapi.png b/node_modules/hapi/images/hapi.png new file mode 100755 index 0000000000000000000000000000000000000000..92938ede712083289c7335d25fe5b1b229bbd467 GIT binary patch literal 42010 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 M^_5D!lI{Ed2bx`WTmS$7 literal 0 HcmV?d00001 diff --git a/node_modules/hapi/index.js b/node_modules/hapi/index.js new file mode 100755 index 0000000..bb0a047 --- /dev/null +++ b/node_modules/hapi/index.js @@ -0,0 +1 @@ +module.exports = require('./lib'); diff --git a/node_modules/hapi/lib/auth.js b/node_modules/hapi/lib/auth.js new file mode 100755 index 0000000..7617ab1 --- /dev/null +++ b/node_modules/hapi/lib/auth.js @@ -0,0 +1,394 @@ +// Load modules + +var Boom = require('boom'); +var Hoek = require('hoek'); +var Schema = require('./schema'); + + +// Declare internals + +var internals = {}; + + +exports = module.exports = internals.Auth = function (connection) { + + this.connection = connection; + this._schemes = {}; + this._strategies = {}; + this.settings = { + default: null // Strategy used as default if route has no auth settings + }; +}; + + +internals.Auth.prototype.scheme = function (name, scheme) { + + Hoek.assert(name, 'Authentication scheme must have a name'); + Hoek.assert(!this._schemes[name], 'Authentication scheme name already exists:', name); + Hoek.assert(typeof scheme === 'function', 'scheme must be a function:', name); + + this._schemes[name] = scheme; +}; + + +internals.Auth.prototype.strategy = function (name, scheme /*, mode, options */) { + + var hasMode = (typeof arguments[2] === 'string' || typeof arguments[2] === 'boolean'); + var mode = (hasMode ? arguments[2] : false); + var options = (hasMode ? arguments[3] : arguments[2]) || null; + + Hoek.assert(name, 'Authentication strategy must have a name'); + Hoek.assert(name !== 'bypass', 'Cannot use reserved strategy name: bypass'); + Hoek.assert(!this._strategies[name], 'Authentication strategy name already exists'); + Hoek.assert(scheme, 'Authentication strategy', name, 'missing scheme'); + Hoek.assert(this._schemes[scheme], 'Authentication strategy', name, 'uses unknown scheme:', scheme); + + var server = this.connection.server._clone([this.connection], ''); + var strategy = this._schemes[scheme](server, options); + + Hoek.assert(strategy.authenticate, 'Invalid scheme:', name, 'missing authenticate() method'); + Hoek.assert(typeof strategy.authenticate === 'function', 'Invalid scheme:', name, 'invalid authenticate() method'); + Hoek.assert(!strategy.payload || typeof strategy.payload === 'function', 'Invalid scheme:', name, 'invalid payload() method'); + Hoek.assert(!strategy.response || typeof strategy.response === 'function', 'Invalid scheme:', name, 'invalid response() method'); + strategy.options = strategy.options || {}; + Hoek.assert(strategy.payload || !strategy.options.payload, 'Cannot require payload validation without a payload method'); + + this._strategies[name] = { + methods: strategy, + realm: server.realm + }; + + if (mode) { + this.default({ strategies: [name], mode: mode === true ? 'required' : mode }); + } +}; + + +internals.Auth.prototype.default = function (options) { + + Schema.assert('auth', options, 'default strategy'); + Hoek.assert(!this.settings.default, 'Cannot set default strategy more than once'); + + var settings = Hoek.clone(options); // options can be reused + + if (typeof settings === 'string') { + settings = { + strategies: [settings], + mode: 'required' + }; + } + else if (settings.strategy) { + settings.strategies = [settings.strategy]; + delete settings.strategy; + } + + Hoek.assert(settings.strategies && settings.strategies.length, 'Default authentication strategy missing strategy name'); + + this.settings.default = settings; +}; + + +internals.Auth.prototype.test = function (name, request, next) { + + Hoek.assert(name, 'Missing authentication strategy name'); + var strategy = this._strategies[name]; + Hoek.assert(strategy, 'Unknown authentication strategy:', name); + + var transfer = function (response, data) { + + return next(response, data && data.credentials); + }; + + var reply = request.server._replier.interface(request, strategy.realm, transfer); + strategy.methods.authenticate(request, reply); +}; + + +internals.Auth.prototype._setupRoute = function (options, path) { + + var self = this; + + if (!options) { + return options; // Preseve the difference between undefined and false + } + + if (typeof options === 'string') { + options = { strategies: [options] }; + } + else if (options.strategy) { + options.strategies = [options.strategy]; + delete options.strategy; + } + + if (!options.strategies) { + Hoek.assert(this.settings.default, 'Route missing authentication strategy and no default defined:', path); + options = Hoek.applyToDefaults(this.settings.default, options); + } + + Hoek.assert(options.strategies.length, 'Route missing authentication strategy:', path); + + options.mode = options.mode || 'required'; + if (options.payload === true) { + options.payload = 'required'; + } + + var hasAuthenticatePayload = false; + options.strategies.forEach(function (name) { + + var strategy = self._strategies[name]; + Hoek.assert(strategy, 'Unknown authentication strategy:', name, 'in path:', path); + Hoek.assert(strategy.methods.payload || options.payload !== 'required', 'Payload validation can only be required when all strategies support it in path:', path); + hasAuthenticatePayload = hasAuthenticatePayload || strategy.methods.payload; + Hoek.assert(!strategy.methods.options.payload || options.payload === undefined || options.payload === 'required', 'Cannot set authentication payload to', options.payload, 'when a strategy requires payload validation', path); + }); + + Hoek.assert(!options.payload || hasAuthenticatePayload, 'Payload authentication requires at least one strategy with payload support in path:', path); + + return options; +}; + + +internals.Auth.prototype._routeConfig = function (request) { + + if (request.route.settings.auth === false) { + return false; + } + + return request.route.settings.auth || this.settings.default; +}; + + +internals.Auth.authenticate = function (request, next) { + + var auth = request.connection.auth; + return auth._authenticate(request, next); +}; + + +internals.Auth.prototype._authenticate = function (request, next) { + + var self = this; + + var config = this._routeConfig(request); + if (!config) { + return next(); + } + + request.auth.mode = config.mode; + + var authErrors = []; + var strategyPos = 0; + + var authenticate = function () { + + // Find next strategy + + if (strategyPos >= config.strategies.length) { + var err = Boom.unauthorized('Missing authentication', authErrors); + + if (config.mode === 'optional' || + config.mode === 'try') { + + request.auth.isAuthenticated = false; + request.auth.credentials = null; + request.auth.error = err; + request._log(['auth', 'unauthenticated']); + return next(); + } + + return next(err); + } + + var name = config.strategies[strategyPos]; + ++strategyPos; + + request._protect.run('auth:request:' + name, validate, function (exit) { + + var transfer = function (response, data) { + + exit(response, name, data); + }; + + var strategy = self._strategies[name]; + var reply = request.server._replier.interface(request, strategy.realm, transfer); + strategy.methods.authenticate(request, reply); + }); + }; + + var validate = function (err, name, result) { // err can be Boom, Error, or a valid response object + + if (!name) { + return next(err); + } + + result = result || {}; + + // Unauthenticated + + if (!err && + !result.credentials) { + + return next(Boom.badImplementation('Authentication response missing both error and credentials')); + } + + if (err) { + if (err instanceof Error === false) { + request._log(['auth', 'unauthenticated', 'response', name], err.statusCode); + return next(err); + } + + request._log(['auth', 'unauthenticated', 'error', name], err); + + if (err.isMissing) { + + // Try next name + + authErrors.push(err.output.headers['WWW-Authenticate']); + return authenticate(); + } + + if (config.mode === 'try') { + request.auth.isAuthenticated = false; + request.auth.strategy = name; + request.auth.credentials = result.credentials; + request.auth.artifacts = result.artifacts; + request.auth.error = err; + request._log(['auth', 'unauthenticated', 'try', name], err); + return next(); + } + + return next(err); + } + + // Authenticated + + var credentials = result.credentials; + request.auth.strategy = name; + request.auth.credentials = credentials; + request.auth.artifacts = result.artifacts; + + // Check scope + + if (config.scope) { + if (!credentials.scope || + (typeof config.scope === 'string' ? + (typeof credentials.scope === 'string' ? config.scope !== credentials.scope : credentials.scope.indexOf(config.scope) === -1) : + (typeof credentials.scope === 'string' ? config.scope.indexOf(credentials.scope) === -1 : !Hoek.intersect(config.scope, credentials.scope).length))) { + + request._log(['auth', 'scope', 'error', name], { got: credentials.scope, need: config.scope }); + return next(Boom.forbidden('Insufficient scope, expected any of: ' + config.scope)); + } + } + + // Check entity + + var entity = config.entity || 'any'; + + // Entity: 'any' + + if (entity === 'any') { + request._log(['auth', name]); + request.auth.isAuthenticated = true; + return next(); + } + + // Entity: 'user' + + if (entity === 'user') { + if (!credentials.user) { + request._log(['auth', 'entity', 'user', 'error', name]); + return next(Boom.forbidden('Application credentials cannot be used on a user endpoint')); + } + + request._log(['auth', name]); + request.auth.isAuthenticated = true; + return next(); + } + + // Entity: 'app' + + if (credentials.user) { + request._log(['auth', 'entity', 'app', 'error', name]); + return next(Boom.forbidden('User credentials cannot be used on an application endpoint')); + } + + request._log(['auth', name]); + request.auth.isAuthenticated = true; + return next(); + }; + + // Injection bypass + + if (request.auth.credentials) { + return validate(null, 'bypass', { credentials: request.auth.credentials }); + } + + // Authenticate + + authenticate(); +}; + + +internals.Auth.payload = function (request, next) { + + if (!request.auth.isAuthenticated || + request.auth.strategy === 'bypass') { + + return next(); + } + + var auth = request.connection.auth; + var strategy = auth._strategies[request.auth.strategy]; + + if (!strategy.methods.payload) { + return next(); + } + + var config = auth._routeConfig(request); + var setting = config.payload || (strategy.methods.options.payload ? 'required' : false); + if (!setting) { + return next(); + } + + var finalize = function (response) { + + if (response && + response.isBoom && + response.isMissing) { + + return next(setting === 'optional' ? null : Boom.unauthorized('Missing payload authentication')); + } + + return next(response); + }; + + request._protect.run('auth:payload:' + request.auth.strategy, finalize, function (exit) { + + var reply = request.server._replier.interface(request, strategy.realm, exit); + strategy.methods.payload(request, reply); + }); +}; + + +internals.Auth.response = function (request, next) { + + var auth = request.connection.auth; + var config = auth._routeConfig(request); + if (!config || + !request.auth.isAuthenticated || + request.auth.strategy === 'bypass') { + + return next(); + } + + var strategy = auth._strategies[request.auth.strategy]; + if (!strategy.methods.response) { + return next(); + } + + request._protect.run('auth:response:' + request.auth.strategy, next, function (exit) { + + var reply = request.server._replier.interface(request, strategy.realm, exit); + strategy.methods.response(request, reply); + }); +}; diff --git a/node_modules/hapi/lib/connection.js b/node_modules/hapi/lib/connection.js new file mode 100755 index 0000000..d5ad142 --- /dev/null +++ b/node_modules/hapi/lib/connection.js @@ -0,0 +1,404 @@ +// Load modules + +var Events = require('events'); +var Http = require('http'); +var Https = require('https'); +var Os = require('os'); +var Path = require('path'); +var Boom = require('boom'); +var Call = require('call'); +var Hoek = require('hoek'); +var Shot = require('shot'); +var Statehood = require('statehood'); +var Topo = require('topo'); +var Auth = require('./auth'); +var Request = require('./request'); +var Route = require('./route'); +var Schema = require('./schema'); + + +// Declare internals + +var internals = { + counter: { + min: 10000, + max: 99999 + } +}; + + +exports = module.exports = internals.Connection = function (server, options) { + + var now = Date.now(); + + Events.EventEmitter.call(this); + + this.settings = options; // options cloned in server.connection() + this.server = server; + + // Normalize settings + + this.settings.labels = Hoek.unique(this.settings.labels || []); // Remove duplicates + if (this.settings.port === undefined) { + this.settings.port = 0; + } + + this.type = (typeof this.settings.port === 'string' ? 'socket' : 'tcp'); + if (this.type === 'socket') { + this.settings.port = (this.settings.port.indexOf('/') !== -1 ? Path.resolve(this.settings.port) : this.settings.port.toLowerCase()); + } + + if (this.settings.autoListen === undefined) { + this.settings.autoListen = true; + } + + Hoek.assert(this.settings.autoListen || !this.settings.port, 'Cannot specify port when autoListen is false'); + Hoek.assert(this.settings.autoListen || !this.settings.address, 'Cannot specify address when autoListen is false'); + + // Connection facilities + + this._started = false; + this._connections = {}; + this._onConnection = null; // Used to remove event listener on stop + this._registrations = {}; // Tracks plugin for dependency validation + + this._extensions = { + onRequest: null, // New request, before handing over to the router (allows changes to the request method, url, etc.) + onPreAuth: null, // After cookie parse and before authentication (skipped if state error) + onPostAuth: null, // After authentication (and payload processing) and before validation (skipped if auth or payload error) + onPreHandler: null, // After validation and body parsing, before route handler (skipped if auth or validation error) + onPostHandler: null, // After route handler returns, before sending response (skipped if onPreHandler not called) + onPreResponse: null // Before response is sent (always called) + }; + + this._requestCounter = { value: internals.counter.min, min: internals.counter.min, max: internals.counter.max }; + this._load = server._heavy.policy(this.settings.load); + this.states = new Statehood.Definitions(this.settings.state); + this.auth = new Auth(this); + this._router = new Call.Router(this.settings.router); + this._defaultRoutes(); + + this.plugins = {}; // Registered plugin APIs by plugin name + this.app = {}; // Place for application-specific state without conflicts with hapi, should not be used by plugins + + // Create listener + + this.listener = this.settings.listener || (this.settings.tls ? Https.createServer(this.settings.tls) : Http.createServer()); + this.listener.on('request', this._dispatch()); + this._init(); + + // Connection information + + this.info = { + created: now, + started: 0, + host: this.settings.host || Os.hostname() || 'localhost', + port: this.settings.port, + protocol: this.type === 'tcp' ? (this.settings.tls ? 'https' : 'http') : this.type, + id: Os.hostname() + ':' + process.pid + ':' + now.toString(36) + }; + + this.info.uri = (this.settings.uri || (this.info.protocol + ':' + (this.type === 'tcp' ? '//' + this.info.host + (this.info.port ? ':' + this.info.port : '') : this.info.port))); +}; + +Hoek.inherits(internals.Connection, Events.EventEmitter); + + +internals.Connection.prototype._init = function () { + + var self = this; + + // Setup listener + + this.listener.once('listening', function () { + + // Update the address, port, and uri with active values + + if (self.type === 'tcp') { + var address = self.listener.address(); + self.info.address = address.address; + self.info.port = address.port; + self.info.uri = (self.settings.uri || (self.info.protocol + '://' + self.info.host + ':' + self.info.port)); + } + + self._onConnection = function _onConnection(connection) { + + var key = connection.remoteAddress + ':' + connection.remotePort; + self._connections[key] = connection; + + connection.once('close', function () { + + delete self._connections[key]; + }); + }; + + self.listener.on('connection', self._onConnection); + }); +}; + + +internals.Connection.prototype._start = function (callback) { + + if (this._started) { + return process.nextTick(callback); + } + + this._started = true; + this.info.started = Date.now(); + + if (!this.settings.autoListen) { + return process.nextTick(callback); + } + + if (this.type !== 'tcp') { + this.listener.listen(this.settings.port, callback); + } + else { + var address = this.settings.address || this.settings.host || '0.0.0.0'; + this.listener.listen(this.settings.port, address, callback); + } +}; + + +internals.Connection.prototype._stop = function (options, callback) { + + var self = this; + + options = options || {}; + options.timeout = options.timeout || 5000; // Default timeout to 5 seconds + + if (!this._started) { + return process.nextTick(callback); + } + + this._started = false; + this.info.started = 0; + + var timeoutId = setTimeout(function () { + + Object.keys(self._connections).forEach(function (key) { + + self._connections[key].destroy(); + }); + + + self._connections = {}; + }, options.timeout); + + this.listener.close(function () { + + self.listener.removeListener('connection', self._onConnection); + clearTimeout(timeoutId); + + self._init(); + return callback(); + }); +}; + + +internals.Connection.prototype._dispatch = function (options) { + + var self = this; + + options = options || {}; + + return function (req, res) { + + if (!self._started && + req.connection) { + + return req.connection.end(); + } + + // Create request + + var request = new Request(self, req, res, options); + + // Check load + + var overload = self._load.check(); + if (overload) { + self.server._log(['load'], self.server.load); + request._reply(overload); + } + else { + + // Execute request lifecycle + + request._protect.domain.run(function () { + + request._execute(); + }); + } + }; +}; + + +internals.Connection.prototype.inject = function (options, callback) { + + var settings = options; + if (settings.credentials) { + settings = Hoek.shallow(options); // options can be reused + delete settings.credentials; + } + + var needle = this._dispatch({ credentials: options.credentials }); + Shot.inject(needle, settings, function (res) { + + if (res.raw.res._hapi) { + res.result = res.raw.res._hapi.result; + res.request = res.raw.res._hapi.request; + delete res.raw.res._hapi; + } + + if (res.result === undefined) { + res.result = res.payload; + } + + return callback(res); + }); +}; + + +internals.Connection.prototype.table = function (host) { + + return this._router.table(host); +}; + + +internals.Connection.prototype.lookup = function (id) { + + Hoek.assert(id && typeof id === 'string', 'Invalid route id:', id); + + var record = this._router.ids[id]; + if (!record) { + return null; + } + + return record.route.public; +}; + + +internals.Connection.prototype.match = function (method, path, host) { + + Hoek.assert(method && typeof method === 'string', 'Invalid method:', method); + Hoek.assert(path && typeof path === 'string' && path[0] === '/', 'Invalid path:', path); + Hoek.assert(!host || typeof host === 'string', 'Invalid host:', host); + + var match = this._router.route(method.toLowerCase(), path, host); + if (match.route.method === 'notfound') { + return null; + } + + Hoek.assert(match.route.method !== 'badrequest', 'Invalid path:', path); + + return match.route.public; +}; + + +internals.Connection.prototype._ext = function (event, func, options, realm) { + + options = options || {}; + + Hoek.assert(this._extensions[event] !== undefined, 'Unknown event type', event); + + var settings = { + before: options.before, + after: options.after, + group: realm.plugin + }; + + var nodes = []; + ([].concat(func)).forEach(function (fn, i) { + + var node = { + func: fn, // function (request, next) { next(); } + realm: realm, + bind: options.bind + }; + + nodes.push(node); + }); + + this._extensions[event] = this._extensions[event] || new Topo(); + this._extensions[event].add(nodes, settings); +}; + + +internals.Connection.prototype._route = function (configs, realm) { + + configs = [].concat(configs); + for (var i = 0, il = configs.length; i < il; ++i) { + var config = configs[i]; + + if (Array.isArray(config.method)) { + for (var m = 0, ml = config.method.length; m < ml; ++m) { + var method = config.method[m]; + + var settings = Hoek.shallow(config); + settings.method = method; + this._addRoute(settings, realm); + } + } + else { + this._addRoute(config, realm); + } + } +}; + + +internals.Connection.prototype._addRoute = function (config, realm) { + + var route = new Route(config, this, realm); // Do no use config beyond this point, use route members + var vhosts = [].concat(route.settings.vhost || '*'); + + for (var i = 0, il = vhosts.length; i < il; ++i) { + var vhost = vhosts[i]; + var record = this._router.add({ method: route.method, path: route.path, vhost: vhost, analysis: route._analysis, id: route.settings.id }, route); + route.fingerprint = record.fingerprint; + route.params = record.params; + } +}; + + +internals.Connection.prototype._defaultRoutes = function () { + + this._router.special('notFound', new Route({ + method: 'notFound', + path: '/{p*}', + config: { + auth: false, // Override any defaults + handler: function (request, reply) { + + return reply(Boom.notFound()); + } + } + }, this, this.server.realm)); + + this._router.special('badRequest', new Route({ + method: 'badRequest', + path: '/{p*}', + config: { + auth: false, // Override any defaults + handler: function (request, reply) { + + return reply(Boom.badRequest()); + } + } + }, this, this.server.realm)); + + if (this.settings.routes.cors) { + this._router.special('options', new Route({ + path: '/{p*}', + method: 'options', + config: { + auth: false, // Override any defaults + cors: this.settings.routes.cors, + handler: function (request, reply) { + + return reply(); + } + } + }, this, this.server.realm)); + } +}; diff --git a/node_modules/hapi/lib/defaults.js b/node_modules/hapi/lib/defaults.js new file mode 100755 index 0000000..f7b3120 --- /dev/null +++ b/node_modules/hapi/lib/defaults.js @@ -0,0 +1,106 @@ +// Load modules + +var Os = require('os'); + + +// Declare internals + +exports.server = { + debug: { + request: ['implementation'], + log: ['implementation'] + }, + load: { + sampleInterval: 0 + }, + mime: null, // Mimos options + minimal: false, + files: { + etagsCacheMaxSize: 10000 // Maximum number of etags in the cache + } +}; + + +exports.connection = { + router: { + isCaseSensitive: true, // Case-sensitive paths + stripTrailingSlash: false // Remove trailing slash from incoming paths + }, + routes: { + cache: { + statuses: [200] // Array of HTTP status codes for which cache-control header is set + }, + cors: false, // CORS headers + files: { + relativeTo: '.' // Determines what file and directory handlers use to base relative paths off + }, + json: { + replacer: null, + space: null, + suffix: null + }, + payload: { + failAction: 'error', + maxBytes: 1024 * 1024, + output: 'data', + parse: true, + timeout: 10 * 1000, // Determines how long to wait for receiving client payload. Defaults to 10 seconds + uploads: Os.tmpDir() + }, + response: { + options: {} // Joi validation options + }, + security: false, // Security headers on responses: false -> null, true -> defaults, {} -> override defaults + state: { + parse: true, // Parse content of req.headers.cookie + failAction: 'error' // Action on bad cookie - 'error': return 400, 'log': log and continue, 'ignore': continue + }, + timeout: { + socket: undefined, // Determines how long before closing request socket. Defaults to node (2 minutes) + server: false // Determines how long to wait for server request processing. Disabled by default + }, + validate: { + options: {} // Joi validation options + } + } +}; + + +exports.security = { + hsts: 15768000, + xframe: 'deny', + xss: true, + noOpen: true, + noSniff: true +}; + + +exports.cors = { + origin: ['*'], + isOriginExposed: true, // Return the list of supported origins if incoming origin does not match + matchOrigin: true, // Attempt to match incoming origin against allowed values and return narrow response + maxAge: 86400, // One day + headers: [ + 'Authorization', + 'Content-Type', + 'If-None-Match' + ], + additionalHeaders: [], + methods: [ + 'GET', + 'HEAD', + 'POST', + 'PUT', + 'PATCH', + 'DELETE', + 'OPTIONS' + ], + additionalMethods: [], + exposedHeaders: [ + 'WWW-Authenticate', + 'Server-Authorization' + ], + additionalExposedHeaders: [], + credentials: false, + override: true +}; diff --git a/node_modules/hapi/lib/handler.js b/node_modules/hapi/lib/handler.js new file mode 100755 index 0000000..328d565 --- /dev/null +++ b/node_modules/hapi/lib/handler.js @@ -0,0 +1,315 @@ +// Load modules + +var Hoek = require('hoek'); +var Items = require('items'); +var Methods = require('./methods'); +var Response = require('./response'); + + +// Declare internals + +var internals = {}; + + +exports.execute = function (request, next) { + + var finalize = function (err, result) { + + request._setResponse(err || result); + return next(); // Must not include an argument + }; + + request._protect.run('handler', finalize, function (exit) { + + if (request._route._prerequisites) { + internals.prerequisites(request, Hoek.once(exit)); + } + else { + internals.handler(request, exit); + } + }); +}; + + +internals.prerequisites = function (request, callback) { + + Items.serial(request._route._prerequisites, function (set, nextSet) { + + Items.parallel(set, function (pre, next) { + + pre(request, function (err, result) { + + if (err) { + return next(err); + } + + if (!result._takeover) { + return next(); + } + + return callback(null, result); + }); + }, nextSet); + }, + function (err) { + + if (err) { + callback(err); + } + else { + return internals.handler(request, callback); + } + }); +}; + + +internals.handler = function (request, callback) { + + var timer = new Hoek.Bench(); + var finalize = function (response, data) { + + if (response === null) { // reply.continue() + response = Response.wrap(null, request); + return response._prepare(null, finalize); + } + + // Check for Error result + + if (response.isBoom) { + request._log(['handler', 'error'], { msec: timer.elapsed(), error: response.message, data: response }); + return callback(response); + } + + request._log(['handler'], { msec: timer.elapsed() }); + return callback(null, response); + }; + + // Decorate request + + var reply = request.server._replier.interface(request, request.route.realm, finalize); + var bind = request.route.settings.bind; + + // Execute handler + + request.route.settings.handler.call(bind, request, reply); +}; + + +exports.defaults = function (method, handler, server) { + + var defaults = null; + + if (typeof handler === 'object') { + var type = Object.keys(handler)[0]; + var serverHandler = server._handlers[type]; + + Hoek.assert(serverHandler, 'Unknown handler:', type); + + if (serverHandler.defaults) { + defaults = (typeof serverHandler.defaults === 'function' ? serverHandler.defaults(method) : serverHandler.defaults); + } + } + + return defaults || {}; +}; + + +exports.configure = function (handler, route) { + + if (typeof handler === 'object') { + var type = Object.keys(handler)[0]; + var serverHandler = route.server._handlers[type]; + + Hoek.assert(serverHandler, 'Unknown handler:', type); + + return serverHandler(route.public, handler[type]); + } + + if (typeof handler === 'string') { + var parsed = internals.fromString('handler', handler, route.server); + return parsed.method; + } + + return handler; +}; + + +exports.prerequisites = function (config, server) { + + if (!config) { + return null; + } + + /* + [ + [ + function (request, reply) { }, + { + method: function (request, reply) { } + assign: key1 + }, + { + method: function (request, reply) { }, + assign: key2 + } + ], + 'user(params.id)' + ] + */ + + var prerequisites = []; + + for (var i = 0, il = config.length; i < il; ++i) { + var pres = [].concat(config[i]); + + var set = []; + for (var p = 0, pl = pres.length; p < pl; ++p) { + var pre = pres[p]; + if (typeof pre !== 'object') { + pre = { method: pre }; + } + + var item = { + method: pre.method, + assign: pre.assign, + failAction: pre.failAction || 'error' + }; + + if (typeof item.method === 'string') { + var parsed = internals.fromString('pre', item.method, server); + item.method = parsed.method; + item.assign = item.assign || parsed.name; + } + + set.push(internals.pre(item)); + } + + prerequisites.push(set); + } + + return prerequisites.length ? prerequisites : null; +}; + + +internals.fromString = function (type, notation, server) { + + // 1:name 2:( 3:arguments + var methodParts = notation.match(/^([\w\.]+)(?:\s*)(?:(\()(?:\s*)(\w+(?:\.\w+)*(?:\s*\,\s*\w+(?:\.\w+)*)*)?(?:\s*)\))?$/); + Hoek.assert(methodParts, 'Invalid server method string notation:', notation); + + var name = methodParts[1]; + Hoek.assert(name.match(Methods.methodNameRx), 'Invalid server method name:', name); + + var method = server._methods._normalized[name]; + Hoek.assert(method, 'Unknown server method in string notation:', notation); + + var result = { name: name }; + var argsNotation = !!methodParts[2]; + var methodArgs = (argsNotation ? (methodParts[3] || '').split(/\s*\,\s*/) : null); + + result.method = function (request, reply) { + + if (!argsNotation) { + return method(request, reply); // Method is already bound to context + } + + var finalize = function (err, value, cached, report) { + + if (report) { + request._log([type, 'method', name], report); + } + + return reply(err, value); + }; + + var args = []; + for (var i = 0, il = methodArgs.length; i < il; ++i) { + var arg = methodArgs[i]; + if (arg) { + args.push(Hoek.reach(request, arg)); + } + } + + args.push(finalize); + method.apply(null, args); + }; + + return result; +}; + + +internals.pre = function (pre) { + + /* + { + method: function (request, next) { } + assign: 'key' + failAction: 'error'* | 'log' | 'ignore' + } + */ + + return function (request, next) { + + var timer = new Hoek.Bench(); + var finalize = function (response, data) { + + if (response === null) { // reply.continue() + response = Response.wrap(null, request); + return response._prepare(null, finalize); + } + + if (response instanceof Error) { + if (pre.failAction !== 'ignore') { + request._log(['pre', 'error'], { msec: timer.elapsed(), assign: pre.assign, error: response }); + } + + if (pre.failAction === 'error') { + return next(response); + } + } + else { + request._log(['pre'], { msec: timer.elapsed(), assign: pre.assign }); + } + + if (pre.assign) { + request.pre[pre.assign] = response.source; + request.preResponses[pre.assign] = response; + } + + return next(null, response); + }; + + // Setup environment + + var reply = request.server._replier.interface(request, request.route.realm, finalize); + var bind = request.route.settings.bind; + + // Execute handler + + pre.method.call(bind, request, reply); + }; +}; + + +exports.invoke = function (request, event, callback) { + + var exts = request.connection._extensions[event]; + if (!exts) { + return Hoek.nextTick(callback)(); + } + + if (event === 'onPreResponse') { + request._protect.reset(); + } + + request._protect.run('ext:' + event, callback, function (exit) { + + Items.serial(exts.nodes, function (ext, next) { + + var reply = request.server._replier.interface(request, ext.realm, next); + var bind = (ext.bind || ext.realm.settings.bind); + + ext.func.call(bind, request, reply); + }, exit); + }); +}; diff --git a/node_modules/hapi/lib/index.js b/node_modules/hapi/lib/index.js new file mode 100755 index 0000000..f6825e7 --- /dev/null +++ b/node_modules/hapi/lib/index.js @@ -0,0 +1,11 @@ +// Load modules + +var Server = require('./server'); + + +// Declare internals + +var internals = {}; + + +exports.Server = Server; diff --git a/node_modules/hapi/lib/methods.js b/node_modules/hapi/lib/methods.js new file mode 100755 index 0000000..024a112 --- /dev/null +++ b/node_modules/hapi/lib/methods.js @@ -0,0 +1,201 @@ +// Load modules + +var Boom = require('boom'); +var Catbox = require('catbox'); +var Hoek = require('hoek'); +var Schema = require('./schema'); + + +// Declare internals + +var internals = {}; + + +exports = module.exports = internals.Methods = function (server) { + + this.server = server; + this.methods = {}; + this._normalized = {}; +}; + + +internals.Methods.prototype.add = function (name, method, options, realm) { + + if (typeof name !== 'object') { + return this._add(name, method, options, realm); + } + + // {} or [{}, {}] + + var items = [].concat(name); + for (var i = 0, il = items.length; i < il; ++i) { + var item = items[i]; + this._add(item.name, item.method, item.options, realm); + } +}; + + +exports.methodNameRx = /^[_$a-zA-Z][$\w]*(?:\.[_$a-zA-Z][$\w]*)*$/; + + +internals.Methods.prototype._add = function (name, method, options, realm) { + + var self = this; + + Hoek.assert(typeof method === 'function', 'method must be a function'); + Hoek.assert(typeof name === 'string', 'name must be a string'); + Hoek.assert(name.match(exports.methodNameRx), 'Invalid name:', name); + Hoek.assert(!Hoek.reach(this.methods, name, { functions: false }), 'Server method function name already exists'); + + options = options || {}; + Schema.assert('method', options, name); + + var settings = Hoek.cloneWithShallow(options, ['bind']); + settings.generateKey = settings.generateKey || internals.generateKey; + var bind = settings.bind || realm.settings.bind || null; + var bound = bind ? function () { return method.apply(bind, arguments); } : method; + + // Normalize methods + + var normalized = bound; + if (settings.callback === false) { // Defaults to true + normalized = function (/* arg1, arg2, ..., argn, methodNext */) { + + var args = []; + for (var i = 0, il = arguments.length; i < il - 1; ++i) { + args.push(arguments[i]); + } + + var methodNext = arguments[il - 1]; + + var result = null; + var error = null; + + try { + result = method.apply(bind, args); + } + catch (err) { + error = err; + } + + if (result instanceof Error) { + error = result; + result = null; + } + + if (error || + typeof result !== 'object' || + typeof result.then !== 'function') { + + return methodNext(error, result); + } + + // Promise object + + var onFulfilled = function (result) { + + return methodNext(null, result); + }; + + var onRejected = function (err) { + + return methodNext(err); + }; + + result.then(onFulfilled, onRejected); + }; + } + + // Not cached + + if (!settings.cache) { + return this._assign(name, bound, normalized); + } + + // Cached + + Hoek.assert(!settings.cache.generateFunc, 'Cannot set generateFunc with method caching'); + + settings.cache.generateFunc = function (id, next) { + + id.args.push(next); // function (err, result, ttl) + normalized.apply(bind, id.args); + }; + + var cache = this.server.cache(settings.cache, '#' + name); + + var func = function (/* arguments, methodNext */) { + + var args = []; + for (var i = 0, il = arguments.length; i < il - 1; ++i) { + args.push(arguments[i]); + } + + var methodNext = arguments[il - 1]; + + var key = settings.generateKey.apply(bind, args); + if (key === null || // Value can be '' + typeof key !== 'string') { // When using custom generateKey + + return Hoek.nextTick(methodNext)(Boom.badImplementation('Invalid method key when invoking: ' + name, { name: name, args: args })); + } + + cache.get({ id: key, args: args }, methodNext); + }; + + func.cache = { + drop: function (/* arguments, callback */) { + + var args = []; + for (var i = 0, il = arguments.length; i < il - 1; ++i) { + args.push(arguments[i]); + } + + var methodNext = arguments[il - 1]; + + var key = settings.generateKey.apply(null, args); + if (key === null) { // Value can be '' + return Hoek.nextTick(methodNext)(Boom.badImplementation('Invalid method key')); + } + + return cache.drop(key, methodNext); + } + }; + + this._assign(name, func, func); +}; + + +internals.Methods.prototype._assign = function (name, method, normalized) { + + var path = name.split('.'); + var ref = this.methods; + for (var i = 0, il = path.length; i < il; ++i) { + if (!ref[path[i]]) { + ref[path[i]] = (i + 1 === il ? method : {}); + } + + ref = ref[path[i]]; + } + + this._normalized[name] = normalized; +}; + + +internals.generateKey = function () { + + var key = ''; + for (var i = 0, il = arguments.length; i < il; ++i) { + var arg = arguments[i]; + if (typeof arg !== 'string' && + typeof arg !== 'number' && + typeof arg !== 'boolean') { + + return null; + } + + key += (i ? ':' : '') + encodeURIComponent(arg.toString()); + } + + return key; +}; diff --git a/node_modules/hapi/lib/plugin.js b/node_modules/hapi/lib/plugin.js new file mode 100755 index 0000000..abcc21c --- /dev/null +++ b/node_modules/hapi/lib/plugin.js @@ -0,0 +1,451 @@ +// Load modules + +var Catbox = require('catbox'); +var Hoek = require('hoek'); +var Items = require('items'); +var Kilt = require('kilt'); +var Topo = require('topo'); +var Connection = require('./connection'); +var Package = require('../package.json'); +var Schema = require('./schema'); + + +// Declare internals + +var internals = {}; + + +exports = module.exports = internals.Plugin = function (server, connections, env, options) { // env can be a realm or plugin name + + var self = this; + + Kilt.call(this, connections, server._events); + + // Validate options + + options = options || {}; + Schema.assert('register', options); + + // Public interface + + this.root = server; + this.app = this.root._app; + this.connections = connections; + this.load = this.root._heavy.load; + this.methods = this.root._methods.methods; + this.mime = this.root._mime; + this.plugins = this.root._plugins; + this.settings = this.root._settings; + this.version = Package.version; + + this.realm = typeof env !== 'string' ? env : { + modifiers: { + route: { + prefix: options.routes && options.routes.prefix, + vhost: options.routes && options.routes.vhost + } + }, + plugin: env, + plugins: {}, + settings: { + files: { + relativeTo: undefined + }, + bind: undefined + } + }; + + this.auth = { + default: function (options) { self._applyChild('auth', 'default', [options]); }, + scheme: function (name, scheme) { self._applyChild('auth', 'scheme', [name, scheme]); }, + strategy: function (name, scheme, mode, options) { self._applyChild('auth', 'strategy', [name, scheme, mode, options]); }, + test: function (name, request, next) { return request.connection.auth.test(name, request, next); } + }; + + if (this.connections.length === 1) { + this._single(); + } + else { + this.info = null; + this.inject = null; + this.listener = null; + this.lookup = null; + this.match = null; + } + + // Decorations + + var methods = Object.keys(this.root._decorations); + for (var i = 0, il = methods.length; i < il; ++i) { + var method = methods[i]; + this[method] = this.root._decorations[method]; + } +}; + +Hoek.inherits(internals.Plugin, Kilt); + + +internals.Plugin.prototype._single = function () { + + this.info = this.connections[0].info; + this.inject = internals.inject; + this.listener = this.connections[0].listener; + this.lookup = internals.lookup; + this.match = internals.match; +}; + + +internals.Plugin.prototype.select = function (/* labels */) { + + var labels = []; + for (var i = 0, il = arguments.length; i < il; ++i) { + labels.push(arguments[i]); + } + + labels = Hoek.flatten(labels); + return this._select(labels); +}; + + +internals.Plugin.prototype._select = function (labels, plugin, options) { + + var connections = this.connections; + + if (labels && + labels.length) { // Captures both empty arrays and empty strings + + Hoek.assert(typeof labels === 'string' || Array.isArray(labels), 'Bad labels object type (undefined or array required)'); + labels = [].concat(labels); + + connections = []; + for (var i = 0, il = this.connections.length; i < il; ++i) { + var connection = this.connections[i]; + if (Hoek.intersect(connection.settings.labels, labels).length) { + connections.push(connection); + } + } + + if (!plugin && + connections.length === this.connections.length) { + + return this; + } + } + + var env = (plugin !== undefined ? plugin : this.realm); // Allow empty string + return new internals.Plugin(this.root, connections, env, options); +}; + + +internals.Plugin.prototype._clone = function (connections, plugin) { + + var env = (plugin !== undefined ? plugin : this.realm); // Allow empty string + return new internals.Plugin(this.root, connections, env); +}; + + +internals.Plugin.prototype.register = function (plugins /*, [options], callback */) { + + var self = this; + + var options = (typeof arguments[1] === 'object' ? arguments[1] : {}); + var callback = (typeof arguments[1] === 'object' ? arguments[2] : arguments[1]); + + Hoek.assert(typeof callback === 'function', 'A callback function is required to register a plugin'); + + if (this.realm.modifiers.route.prefix || + this.realm.modifiers.route.vhost) { + + options = Hoek.clone(options); + options.routes = options.routes || {}; + + options.routes.prefix = (this.realm.modifiers.route.prefix || '') + (options.routes.prefix || '') || undefined; + options.routes.vhost = this.realm.modifiers.route.vhost || options.routes.vhost; + } + + /* + var register = function (server, options, next) { return next(); }; + register.attributes = { + pkg: require('../package.json'), + name: 'plugin', + version: '1.1.1', + multiple: false + }; + + var item = { + register: register, + options: options // -optional-- + }; + + - OR - + + var item = function () {} + item.register = register; + item.options = options; + + var plugins = register, items, [register, item] + */ + + var registrations = []; + plugins = [].concat(plugins); + for (var i = 0, il = plugins.length; i < il; ++i) { + var plugin = plugins[i]; + var hint = (plugins.length > 1 ? '(' + i + ')' : ''); + + if (typeof plugin === 'function' && + !plugin.register) { + + plugin = { register: plugin }; + } + + if (plugin.register.register) { // Required plugin + plugin.register = plugin.register.register; + } + + Hoek.assert(typeof plugin.register === 'function', 'Invalid plugin object - invalid or missing register function ', hint); + var attributes = plugin.register.attributes; + Hoek.assert(typeof plugin.register.attributes === 'object', 'Invalid plugin object - invalid or missing register function attributes property', hint); + + var item = { + register: plugin.register, + name: attributes.name || (attributes.pkg && attributes.pkg.name), + version: attributes.version || (attributes.pkg && attributes.pkg.version) || '0.0.0', + multiple: attributes.multiple || false, + options: plugin.options, + dependencies: attributes.dependencies + }; + + Hoek.assert(item.name, 'Missing plugin name', hint); + Schema.assert('dependencies', item.dependencies, 'must be a string or an array of strings'); + + registrations.push(item); + } + + Items.serial(registrations, function (item, next) { + + var selection = self._select(options.select, item.name, options); + + // Protect against multiple registrations + + for (var i = 0, il = selection.connections.length; i < il; ++i) { + var connection = selection.connections[i]; + Hoek.assert(item.multiple || !connection._registrations[item.name], 'Plugin', item.name, 'already registered in:', connection.info.uri); + connection._registrations[item.name] = item; + } + + if (item.dependencies) { + selection.dependency(item.dependencies); + } + + // Register + + item.register(selection, item.options || {}, next); + }, callback); +}; + + +internals.Plugin.prototype.after = function (method, dependencies) { + + this.root._afters = this.root._afters || new Topo(); + this.root._afters.add({ func: method, plugin: this }, { after: dependencies, group: this.realm.plugin }); +}; + + +internals.Plugin.prototype.bind = function (context) { + + Hoek.assert(typeof context === 'object', 'bind must be an object'); + this.realm.settings.bind = context; +}; + + +internals.Plugin.prototype.cache = function (options, _segment) { + + Schema.assert('cachePolicy', options); + + var segment = options.segment || _segment || (this.realm.plugin ? '!' + this.realm.plugin : ''); + Hoek.assert(segment, 'Missing cache segment name'); + + var cacheName = options.cache || '_default'; + var cache = this.root._caches[cacheName]; + Hoek.assert(cache, 'Unknown cache', cacheName); + Hoek.assert(!cache.segments[segment] || cache.shared || options.shared, 'Cannot provision the same cache segment more than once'); + cache.segments[segment] = true; + + return new Catbox.Policy(options, cache.client, segment); +}; + + +internals.Plugin.prototype.decorate = function (type, property, method) { + + Hoek.assert(type === 'reply' || type === 'server', 'Unknown decoration type:', type); + Hoek.assert(property, 'Missing decoration property name'); + Hoek.assert(typeof property === 'string', 'Decoration property must be a string'); + Hoek.assert(property[0] !== '_', 'Property name cannot begin with an underscore:', property); + + // Reply + + if (type === 'reply') { + return this.root._replier.decorate(property, method); + } + + // Server + + Hoek.assert(!this.root._decorations[property], 'Server decoration already defined:', property); + Hoek.assert(this[property] === undefined && this.root[property] === undefined, 'Cannot override the built-in server interface method:', property); + + this.root._decorations[property] = method; + + this.root[property] = method; + this[property] = method; +}; + + +internals.Plugin.prototype.dependency = function (dependencies, after) { + + Hoek.assert(this.realm.plugin, 'Cannot call dependency() outside of a plugin'); + Hoek.assert(!after || typeof after === 'function', 'Invalid after method'); + + dependencies = [].concat(dependencies); + this.root._dependencies.push({ plugin: this.realm.plugin, connections: this.connections, deps: dependencies }); + + if (after) { + this.after(after, dependencies); + } +}; + + +internals.Plugin.prototype.expose = function (key, value) { + + Hoek.assert(this.realm.plugin, 'Cannot call expose() outside of a plugin'); + + var plugin = this.realm.plugin; + this.root.plugins[plugin] = this.root.plugins[plugin] || {}; + if (typeof key === 'string') { + this.root.plugins[plugin][key] = value; + } + else { + Hoek.merge(this.root.plugins[plugin], key); + } +}; + + +internals.Plugin.prototype.ext = function (event, func, options) { + + this._apply(Connection.prototype._ext, [event, func, options, this.realm]); +}; + + +internals.Plugin.prototype.handler = function (name, method) { + + Hoek.assert(typeof name === 'string', 'Invalid handler name'); + Hoek.assert(!this.root._handlers[name], 'Handler name already exists:', name); + Hoek.assert(typeof method === 'function', 'Handler must be a function:', name); + Hoek.assert(!method.defaults || typeof method.defaults === 'object' || typeof method.defaults === 'function', 'Handler defaults property must be an object or function'); + this.root._handlers[name] = method; +}; + + +internals.inject = function (options, callback) { + + return this.connections[0].inject(options, callback); +}; + + +internals.Plugin.prototype.log = function (tags, data, timestamp, _internal) { + + tags = (Array.isArray(tags) ? tags : [tags]); + var now = (timestamp ? (timestamp instanceof Date ? timestamp.getTime() : timestamp) : Date.now()); + + var event = { + timestamp: now, + tags: tags, + data: data, + internal: !!_internal + }; + + var tagsMap = Hoek.mapToObject(event.tags); + this.root._events.emit('log', event, tagsMap); + + if (this.root._settings.debug && + this.root._settings.debug.log && + Hoek.intersect(tagsMap, this.root._settings.debug.log, true)) { + + console.error('Debug:', event.tags.join(', '), (data ? '\n ' + (data.stack || (typeof data === 'object' ? Hoek.stringify(data) : data)) : '')); + } +}; + + +internals.Plugin.prototype._log = function (tags, data) { + + return this.log(tags, data, null, true); +}; + + +internals.lookup = function (id) { + + return this.connections[0].lookup(id); +}; + + +internals.match = function (method, path, host) { + + return this.connections[0].match(method, path, host); +}; + + +internals.Plugin.prototype.method = function (name, method, options) { + + return this.root._methods.add(name, method, options, this.realm); +}; + + +internals.Plugin.prototype.path = function (relativeTo) { + + Hoek.assert(relativeTo && typeof relativeTo === 'string', 'relativeTo must be a non-empty string'); + this.realm.settings.files.relativeTo = relativeTo; +}; + + +internals.Plugin.prototype.route = function (options) { + + Hoek.assert(arguments.length === 1, 'Method requires a single object argument or a single array of objects'); + Hoek.assert(typeof options === 'object', 'Invalid route options'); + Hoek.assert(this.connections.length, 'Cannot add a route without any connections'); + + this._apply(Connection.prototype._route, [options, this.realm]); +}; + + +internals.Plugin.prototype.state = function (name, options) { + + this._applyChild('states', 'add', [name, options]); +}; + + +internals.Plugin.prototype.table = function (host) { + + var table = []; + for (var i = 0, il = this.connections.length; i < il; ++i) { + var connection = this.connections[i]; + table.push({ info: connection.info, labels: connection.settings.labels, table: connection.table(host) }); + } + + return table; +}; + + +internals.Plugin.prototype._apply = function (func, args) { + + for (var i = 0, il = this.connections.length; i < il; ++i) { + func.apply(this.connections[i], args); + } +}; + + +internals.Plugin.prototype._applyChild = function (child, func, args) { + + for (var i = 0, il = this.connections.length; i < il; ++i) { + var obj = this.connections[i][child]; + obj[func].apply(obj, args); + } +}; diff --git a/node_modules/hapi/lib/protect.js b/node_modules/hapi/lib/protect.js new file mode 100755 index 0000000..c47b644 --- /dev/null +++ b/node_modules/hapi/lib/protect.js @@ -0,0 +1,64 @@ +// Load modules + +var Domain = require('domain'); +var Boom = require('boom'); +var Hoek = require('hoek'); + + +// Declare internals + +var internals = {}; + + +exports = module.exports = internals.Protect = function (request) { + + var self = this; + + this._error = null; + this._at = ''; + this.logger = request; // Replaced with server when request completes + + this.domain = Domain.create(); + this.domain.on('error', function (err) { + + var handler = self._error; + if (handler) { + self._error = null; + return handler(err); + } + + self.logger._log(['internal', 'implementation', 'error'], err); + }); +}; + + +internals.Protect.prototype.run = function (at, next, enter) { // enter: function (exit) + + var self = this; + + Hoek.assert(!this._error, 'Invalid nested use of protect.run() during: ' + this._at + ' while trying: ' + at); + + var finish = function (arg0, arg1, arg2) { + + self._error = null; + self._at = ''; + return next(arg0, arg1, arg2); + }; + + finish = Hoek.once(finish); + + this._at = at; + this._error = function (err) { + + return finish(Boom.badImplementation('Uncaught error', err)); + }; + + enter(finish); +}; + + +internals.Protect.prototype.reset = function () { + + this._error = null; + this._at = ''; +}; diff --git a/node_modules/hapi/lib/reply.js b/node_modules/hapi/lib/reply.js new file mode 100755 index 0000000..42fa983 --- /dev/null +++ b/node_modules/hapi/lib/reply.js @@ -0,0 +1,165 @@ +// Load modules + +var Hoek = require('hoek'); +var Response = require('./response'); + + +// Declare internals + +var internals = {}; + + +exports = module.exports = internals.Reply = function () { + + this._decorations = {}; +}; + + +internals.Reply.prototype.decorate = function (property, method) { + + Hoek.assert(!this._decorations[property], 'Reply interface decoration already defined:', property); + Hoek.assert(['request', 'response', 'close', 'state', 'unstate', 'redirect', 'continue'].indexOf(property) === -1, 'Cannot override built-in reply interface decoration:', property); + + this._decorations[property] = method; +}; + + +/* + var handler = function (request, reply) { + + reply(error, result, ignore); -> error || result (continue) + reply(...).takeover(); -> ... (continue) + + reply.continue(ignore); -> null (continue) + }; + + var ext = function (request, reply) { + + reply(error, result, ignore); -> error || result (respond) + reply(...).takeover(); -> ... (respond) + + reply.continue(ignore); -> (continue) + }; + + var pre = function (request, reply) { + + reply(error); -> error (respond) // failAction override + reply(null, result, ignore); -> result (continue) + reply(...).takeover(); -> ... (respond) + + reply.continue(ignore); -> null (continue) + }; + + var auth = function (request, reply) { + + reply(error, result, data); -> error || result (respond) + data + reply(...).takeover(); -> ... (respond) + data + + reply.continue(data); -> (continue) + data + }; +*/ + +internals.Reply.prototype.interface = function (request, realm, next) { // next(err || response, data); + + var reply = function (err, response, data) { + + reply._data = data; // Held for later + return reply.response(err !== null && err !== undefined ? err : response); + }; + + reply._replied = false; + reply._next = Hoek.once(next); + + reply.realm = realm; + reply.request = request; + + reply.response = internals.response; + reply.close = internals.close; + reply.state = internals.state; + reply.unstate = internals.unstate; + reply.redirect = internals.redirect; + reply.continue = internals.continue; + + var methods = Object.keys(this._decorations); + for (var i = 0, il = methods.length; i < il; ++i) { + var method = methods[i]; + reply[method] = this._decorations[method]; + } + + return reply; +}; + + +internals.close = function (options) { + + options = options || {}; + this._next({ closed: true, end: options.end !== false }); +}; + + +internals.continue = function (data) { + + this._next(null, data); + this._next = null; +}; + + +internals.state = function (name, value, options) { + + this.request._setState(name, value, options); +}; + + +internals.unstate = function (name) { + + this.request._clearState(name); +}; + + +internals.redirect = function (location) { + + return this.response('').redirect(location); +}; + + +internals.response = function (result) { + + var self = this; + + Hoek.assert(!this._replied, 'reply interface called twice'); + this._replied = true; + + var response = Response.wrap(result, this.request); + if (response.isBoom) { + this._next(response, this._data); + this._next = null; + return response; + } + + response.hold = function () { + + this.hold = undefined; + this.send = function () { + + this.send = undefined; + this._prepare(self._data, self._next); + this._next = null; + }; + + return this; + }; + + process.nextTick(function () { + + response.hold = undefined; + + if (!response.send && + self._next) { + + response._prepare(self._data, self._next); + self._next = null; + } + }); + + return response; +}; diff --git a/node_modules/hapi/lib/request.js b/node_modules/hapi/lib/request.js new file mode 100755 index 0000000..79f60af --- /dev/null +++ b/node_modules/hapi/lib/request.js @@ -0,0 +1,516 @@ +// Load modules + +var Events = require('events'); +var Stream = require('stream'); +var Url = require('url'); +var Accept = require('accept'); +var Boom = require('boom'); +var Hoek = require('hoek'); +var Items = require('items'); +var Peekaboo = require('peekaboo'); +var Qs = require('qs'); +var Handler = require('./handler'); +var Protect = require('./protect'); +var Response = require('./response'); +var Transmit = require('./transmit'); + + +// Declare internals + +var internals = {}; + + +exports = module.exports = internals.Request = function (connection, req, res, options) { + + var self = this; + + Events.EventEmitter.call(this); + + // Take measurement as soon as possible + + this._bench = new Hoek.Bench(); + var now = Date.now(); + + // Public members + + this.connection = connection; + this.server = connection.server; + + this.url = null; + this.query = null; + this.path = null; + this.method = null; + this.mime = null; // Set if payload is parsed + + this.setUrl = this._setUrl; // Decoration removed after 'onRequest' + this.setMethod = this._setMethod; + + this._setUrl(req.url, this.connection.settings.router.stripTrailingSlash); // Sets: this.url, this.path, this.query + this._setMethod(req.method); // Sets: this.method + this.headers = req.headers; + + this.id = now + ':' + connection.info.id + ':' + connection._requestCounter.value++; + if (connection._requestCounter.value > connection._requestCounter.max) { + connection._requestCounter.value = connection._requestCounter.min; + } + + this.app = {}; // Place for application-specific state without conflicts with hapi, should not be used by plugins + this.plugins = {}; // Place for plugins to store state without conflicts with hapi, should be namespaced using plugin name + + this._route = this.connection._router.specials.notFound.route; // Used prior to routing (only settings are used, not the handler) + this.route = this._route.public; + + this.auth = { + isAuthenticated: false, + credentials: null, // Special keys: 'app', 'user', 'scope' + artifacts: null, // Scheme-specific artifacts + session: null // Used by cookie auth { set(), clear() } + }; + + this.session = null; // Special key reserved for plugins implementing session support + + this.pre = {}; // Pre raw values + this.preResponses = {}; // Pre response values + + this.info = { + received: now, + responded: 0, + remoteAddress: req.connection ? req.connection.remoteAddress : '', + remotePort: req.connection ? req.connection.remotePort : '', + referrer: req.headers.referrer || req.headers.referer || '', + host: req.headers.host ? req.headers.host.replace(/\s/g, '') : '', + acceptEncoding: Accept.encoding(this.headers['accept-encoding'], ['identity', 'gzip', 'deflate']) + }; + + this.info.hostname = this.info.host.split(':')[0]; + + // Apply options + + if (options.credentials) { + this.auth.credentials = options.credentials; + } + + // Assigned elsewhere: + + this.orig = {}; + this.params = {}; + this.paramsArray = []; // Array of path parameters in path order + this.payload = null; + this.state = null; + this.jsonp = null; + this.response = null; + + // Semi-public members + + this.raw = { + req: req, + res: res + }; + + this.tail = this.addTail = this._addTail; // Removed once wagging + + // Private members + + this._states = {}; + this._logger = []; + this._isPayloadPending = true; // false when incoming payload fully processed + this._isBailed = false; // true when lifecycle should end + this._isReplied = false; // true when response processing started + this._isFinalized = false; // true when request completed (may be waiting on tails to complete) + this._tails = {}; // tail id -> name (tracks pending tails) + this._tailIds = 0; // Used to generate a unique tail id + this._protect = new Protect(this); + this.domain = this._protect.domain; + + // Listen to request state + + this._onEnd = function () { + + self._isPayloadPending = false; + }; + + this.raw.req.once('end', this._onEnd); + + this._onClose = function () { + + self._log(['request', 'closed', 'error']); + self._isPayloadPending = false; + self._isBailed = true; + }; + + this.raw.req.once('close', this._onClose); + + this._onError = function (err) { + + self._log(['request', 'error'], err); + self._isPayloadPending = false; + }; + + this.raw.req.once('error', this._onError); + + // Log request + + var about = { + id: this.id, + method: this.method, + url: this.url.href, + agent: this.raw.req.headers['user-agent'] + }; + + this._log(['received'], about, now); // Must be last for object to be fully constructed +}; + +Hoek.inherits(internals.Request, Events.EventEmitter); + + +internals.Request.prototype._setUrl = function (url, stripTrailingSlash) { + + this.url = Url.parse(url, false); + this.url.query = Qs.parse(this.url.query); // Override parsed value + this.query = this.url.query; + this.path = this.url.pathname || ''; // pathname excludes query + + if (stripTrailingSlash && + this.path.length > 1 && + this.path[this.path.length - 1] === '/') { + + this.path = this.path.slice(0, -1); + this.url.pathname = this.path; + } + + this.path = this.connection._router.normalize(this.path); +}; + + +internals.Request.prototype._setMethod = function (method) { + + Hoek.assert(method && typeof method === 'string', 'Missing method'); + this.method = method.toLowerCase(); +}; + + +internals.Request.prototype.log = function (tags, data, timestamp, _internal) { + + tags = (Array.isArray(tags) ? tags : [tags]); + var now = (timestamp ? (timestamp instanceof Date ? timestamp.getTime() : timestamp) : Date.now()); + + var event = { + request: this.id, + timestamp: now, + tags: tags, + data: data, + internal: !!_internal + }; + + var tagsMap = Hoek.mapToObject(event.tags); + + // Add to request array + + this._logger.push(event); + this.connection.emit(_internal ? 'request-internal' : 'request', this, event, tagsMap); + + if (this.server._settings.debug && + this.server._settings.debug.request && + Hoek.intersect(tagsMap, this.server._settings.debug.request, true)) { + + console.error('Debug:', event.tags.join(', '), (data ? '\n ' + (data.stack || (typeof data === 'object' ? Hoek.stringify(data) : data)) : '')); + } +}; + + +internals.Request.prototype._log = function (tags, data) { + + return this.log(tags, data, null, true); +}; + + +internals.Request.prototype.getLog = function (tags, internal) { + + if (typeof tags === 'boolean') { + internal = tags; + tags = []; + } + + tags = [].concat(tags || []); + if (!tags.length && + internal === undefined) { + + return this._logger; + } + + var filter = tags.length ? Hoek.mapToObject(tags) : null; + var result = []; + + for (var i = 0, il = this._logger.length; i < il; ++i) { + var event = this._logger[i]; + if (internal === undefined || event.internal === internal) { + if (filter) { + for (var t = 0, tl = event.tags.length; t < tl; ++t) { + var tag = event.tags[t]; + if (filter[tag]) { + result.push(event); + break; + } + } + } + else { + result.push(event); + } + } + } + + return result; +}; + + +internals.Request.prototype._execute = function () { + + var self = this; + + // Execute onRequest extensions (can change request method and url) + + Handler.invoke(this, 'onRequest', function (err) { + + // Undecorate request + + self.setUrl = undefined; + self.setMethod = undefined; + + if (err) { + return self._reply(err); + } + + if (!self.path || self.path[0] !== '/') { + return self._reply(Boom.badRequest('Invalid path')); + } + + // Lookup route + + var match = self.connection._router.route(self.method, self.path, self.info.hostname); + self._route = match.route; + self.route = self._route.public; + self.params = match.params; + self.paramsArray = match.paramsArray; + + // Setup timeout + + if (self.raw.req.socket && + self.route.settings.timeout.socket !== undefined) { + + self.raw.req.socket.setTimeout(self.route.settings.timeout.socket || 0); // Value can be false or positive + } + + var serverTimeout = self.route.settings.timeout.server; + if (serverTimeout) { + serverTimeout = Math.floor(serverTimeout - self._bench.elapsed()); // Calculate the timeout from when the request was constructed + var timeoutReply = function () { + + self._log(['request', 'server', 'timeout', 'error'], { timeout: serverTimeout, elapsed: self._bench.elapsed()}); + self._reply(Boom.serverTimeout()); + }; + + if (serverTimeout <= 0) { + return timeoutReply(); + } + + self._serverTimeoutId = setTimeout(timeoutReply, serverTimeout); + } + + Items.serial(self._route._cycle, function (func, next) { + + if (self._isReplied || + self._isBailed) { + + return next(Boom.internal('Already closed')); // Error is not used + } + + if (typeof func === 'string') { // Extension point + return Handler.invoke(self, func, next); + } + + func(self, next); + }, + function (err) { + + self._reply(err); + }); + }); +}; + + +internals.Request.prototype._reply = function (exit) { + + var self = this; + + if (this._isReplied) { // Prevent any future responses to this request + return; + } + + this._isReplied = true; + + clearTimeout(this._serverTimeoutId); + + if (this._isBailed) { + return this._finalize(); + } + + if (this.response && // Can be null if response coming from exit + this.response.closed) { + + if (this.response.end) { + this.raw.res.end(); // End the response in case it wasn't already closed + } + + return this._finalize(); + } + + if (exit) { + this._setResponse(Response.wrap(exit, this)); + } + + Handler.invoke(this, 'onPreResponse', function (err) { + + if (err) { // err can be valid response or error + self._setResponse(Response.wrap(err, self)); + } + + Transmit.send(self, function () { + + return self._finalize(); + }); + }); +}; + + +internals.Request.prototype._finalize = function () { + + this.info.responded = Date.now(); + + if (this.response && + this.response.statusCode === 500 && + this.response._error) { + + this.connection.emit('request-error', this, this.response._error); + this._log(this.response._error.isDeveloperError ? ['internal', 'implementation', 'error'] : ['internal', 'error'], this.response._error); + } + + this.connection.emit('response', this); + + this._isFinalized = true; + this.addTail = undefined; + this.tail = undefined; + + if (Object.keys(this._tails).length === 0) { + this.connection.emit('tail', this); + } + + // Cleanup + + this.raw.req.removeListener('end', this._onEnd); + this.raw.req.removeListener('close', this._onClose); + this.raw.req.removeListener('error', this._onError); + + if (this.response && + this.response._close) { + + this.response._close(); + } + + this._protect.logger = this.server; +}; + + +internals.Request.prototype._setResponse = function (response) { + + if (this.response && + !this.response.isBoom && + this.response !== response && + (response.isBoom || this.response.source !== response.source)) { + + this.response._close(); + } + + if (this._isFinalized) { + if (response._close) { + response._close(); + } + + return; + } + + this.response = response; +}; + + +internals.Request.prototype._addTail = function (name) { + + var self = this; + + name = name || 'unknown'; + var tailId = this._tailIds++; + this._tails[tailId] = name; + this._log(['tail', 'add'], { name: name, id: tailId }); + + var drop = function () { + + if (!self._tails[tailId]) { + self._log(['tail', 'remove', 'error'], { name: name, id: tailId }); // Already removed + return; + } + + delete self._tails[tailId]; + + if (Object.keys(self._tails).length === 0 && + self._isFinalized) { + + self._log(['tail', 'remove', 'last'], { name: name, id: tailId }); + self.connection.emit('tail', self); + } + else { + self._log(['tail', 'remove'], { name: name, id: tailId }); + } + }; + + return drop; +}; + + +internals.Request.prototype._setState = function (name, value, options) { // options: see Defaults.state + + var state = { + name: name, + value: value + }; + + if (options) { + Hoek.assert(!options.autoValue, 'Cannot set autoValue directly in a response'); + state.options = Hoek.clone(options); + } + + this._states[name] = state; +}; + + +internals.Request.prototype._clearState = function (name, options) { + + var state = { + name: name + }; + + state.options = Hoek.clone(options || {}); + state.options.ttl = 0; + + this._states[name] = state; +}; + + +internals.Request.prototype._tap = function () { + + return (this.listeners('finish').length || this.listeners('peek').length ? new Peekaboo(this) : null); +}; + + +internals.Request.prototype.generateResponse = function (source, options) { + + return new Response(source, this, options); +}; diff --git a/node_modules/hapi/lib/response.js b/node_modules/hapi/lib/response.js new file mode 100755 index 0000000..b7b49ca --- /dev/null +++ b/node_modules/hapi/lib/response.js @@ -0,0 +1,586 @@ +// Load modules + +var Crypto = require('crypto'); +var Stream = require('stream'); +var Events = require('events'); +var Boom = require('boom'); +var Hoek = require('hoek'); +var Peekaboo = require('peekaboo'); + + +// Declare internals + +var internals = {}; + + +exports = module.exports = internals.Response = function (source, request, options) { + + Events.EventEmitter.call(this); + + options = options || {}; + + this.request = request; + this.statusCode = null; + this.headers = {}; // Incomplete as some headers are stored in flags + this.variety = null; + this.app = {}; + this.plugins = {}; + this.send = null; // Set by reply() + this.hold = null; // Set by reply() + + this.settings = { + encoding: 'utf8', + charset: 'utf-8', // '-' required by IANA + ttl: null, + stringify: null, // JSON.stringify options + passThrough: true, + varyEtag: false + }; + + this._payload = null; // Readable stream + this._takeover = false; + this._contentEncoding = null; // Set during transmit + this._error = null; // The boom object when created from an error + + this._processors = { + marshal: options.marshal, + prepare: options.prepare, + close: options.close + }; + + this._setSource(source, options.variety); +}; + +Hoek.inherits(internals.Response, Events.EventEmitter); + + +internals.Response.wrap = function (result, request) { + + return (result instanceof Error ? Boom.wrap(result) + : (result instanceof internals.Response ? result + : new internals.Response(result, request))); +}; + + +internals.Response.prototype._setSource = function (source, variety) { + + // Method must not set any headers or other properties as source can change later + + this.variety = variety || 'plain'; + + if (source === null || + source === undefined || + source === '') { + + source = null; + } + else if (Buffer.isBuffer(source)) { + this.variety = 'buffer'; + } + else if (source instanceof Stream) { + this.variety = 'stream'; + } + else if (typeof source === 'object' && + typeof source.then === 'function') { // Promise object + + this.variety = 'promise'; + } + + this.source = source; +}; + + +internals.Response.prototype.code = function (statusCode) { + + Hoek.assert(Hoek.isInteger(statusCode), 'Status code must be an integer'); + + this.statusCode = statusCode; + return this; +}; + + +internals.Response.prototype.header = function (key, value, options) { + + key = key.toLowerCase(); + if (key === 'vary') { + return this.vary(value); + } + + return this._header(key, value, options); +}; + + +internals.Response.prototype._header = function (key, value, options) { + + options = options || {}; + options.append = options.append || false; + options.separator = options.separator || ','; + options.override = options.override !== false; + + if ((!options.append && options.override) || + !this.headers[key]) { + + this.headers[key] = value; + } + else if (options.override) { + if (key === 'set-cookie') { + this.headers[key] = [].concat(this.headers[key], value); + } + else { + this.headers[key] = this.headers[key] + options.separator + value; + } + } + + return this; +}; + + +internals.Response.prototype.vary = function (value) { + + if (value === '*') { + this.headers.vary = '*'; + } + else if (!this.headers.vary) { + this.headers.vary = value; + } + else if (this.headers.vary !== '*') { + this._header('vary', value, { append: true }); + } + + return this; +}; + + +internals.Response.prototype.etag = function (tag, options) { + + Hoek.assert(tag !== '*', 'ETag cannot be *'); + + options = options || {}; + this._header('etag', (options.weak ? 'W/' : '') + '"' + tag + '"'); + this.settings.varyEtag = options.vary !== false && !options.weak; // vary defaults to true + return this; +}; + + +internals.Response.prototype.type = function (type) { + + this._header('content-type', type); + return this; +}; + + +internals.Response.prototype.bytes = function (bytes) { + + this._header('content-length', bytes); + return this; +}; + + +internals.Response.prototype.location = function (uri) { + + this._header('location', uri); + return this; +}; + + +internals.Response.prototype.created = function (location) { + + Hoek.assert(this.request.method === 'post' || this.request.method === 'put', 'Cannot create resource on GET'); + + this.statusCode = 201; + this.location(location); + return this; +}; + + +internals.Response.prototype.replacer = function (method) { + + this.settings.stringify = this.settings.stringify || {}; + this.settings.stringify.replacer = method; + return this; +}; + + +internals.Response.prototype.spaces = function (count) { + + this.settings.stringify = this.settings.stringify || {}; + this.settings.stringify.space = count; + return this; +}; + + +internals.Response.prototype.suffix = function (suffix) { + + this.settings.stringify = this.settings.stringify || {}; + this.settings.stringify.suffix = suffix; + return this; +}; + + +internals.Response.prototype.passThrough = function (enabled) { + + this.settings.passThrough = (enabled !== false); // Defaults to true + return this; +}; + + +internals.Response.prototype.redirect = function (location) { + + this.statusCode = 302; + this.location(location); + this.temporary = this._temporary; + this.permanent = this._permanent; + this.rewritable = this._rewritable; + return this; +}; + + +internals.Response.prototype._temporary = function (isTemporary) { + + this._setTemporary(isTemporary !== false); // Defaults to true + return this; +}; + + +internals.Response.prototype._permanent = function (isPermanent) { + + this._setTemporary(isPermanent === false); // Defaults to true + return this; +}; + + +internals.Response.prototype._rewritable = function (isRewritable) { + + this._setRewritable(isRewritable !== false); // Defaults to true + return this; +}; + + +internals.Response.prototype._isTemporary = function () { + + return this.statusCode === 302 || this.statusCode === 307; +}; + + +internals.Response.prototype._isRewritable = function () { + + return this.statusCode === 301 || this.statusCode === 302; +}; + + +internals.Response.prototype._setTemporary = function (isTemporary) { + + if (isTemporary) { + if (this._isRewritable()) { + this.statusCode = 302; + } + else { + this.statusCode = 307; + } + } + else { + if (this._isRewritable()) { + this.statusCode = 301; + } + else { + this.statusCode = 308; + } + } +}; + + +internals.Response.prototype._setRewritable = function (isRewritable) { + + if (isRewritable) { + if (this._isTemporary()) { + this.statusCode = 302; + } + else { + this.statusCode = 301; + } + } + else { + if (this._isTemporary()) { + this.statusCode = 307; + } + else { + this.statusCode = 308; + } + } +}; + + +internals.Response.prototype.encoding = function (encoding) { + + this.settings.encoding = encoding; + return this; +}; + + +internals.Response.prototype.charset = function (charset) { + + this.settings.charset = charset || null; + return this; +}; + + +internals.Response.prototype.ttl = function (ttl) { + + this.settings.ttl = ttl; + return this; +}; + + +internals.Response.prototype.state = function (name, value, options) { // options: see Defaults.state + + this.request._setState(name, value, options); + return this; +}; + + +internals.Response.prototype.unstate = function (name, options) { + + this.request._clearState(name, options); + return this; +}; + + +internals.Response.prototype.takeover = function () { + + this._takeover = true; + return this; +}; + + +internals.Response.prototype._prepare = function (data, next) { + + var self = this; + + this._passThrough(); + + if (this.variety !== 'promise') { + return this._processPrepare(data, next); + } + + var onDone = function (source) { + + if (source instanceof Error) { + return next(Boom.wrap(source), data); + } + + self._setSource(source); + self._passThrough(); + self._processPrepare(data, next); + }; + + this.source.then(onDone, onDone); +}; + + +internals.Response.prototype._passThrough = function () { + + if (this.variety === 'stream' && + this.settings.passThrough) { + + if (this.source.statusCode && + !this.statusCode) { + + this.statusCode = this.source.statusCode; // Stream is an HTTP response + } + + if (this.source.headers) { + var headerKeys = Object.keys(this.source.headers); + + if (headerKeys.length) { + var localHeaders = this.headers; + this.headers = {}; + + for (var i = 0, il = headerKeys.length; i < il; ++i) { + var key = headerKeys[i]; + this.header(key.toLowerCase(), Hoek.clone(this.source.headers[key])); // Clone arrays + } + + headerKeys = Object.keys(localHeaders); + for (i = 0, il = headerKeys.length; i < il; ++i) { + key = headerKeys[i]; + this.header(key, localHeaders[key], { append: key === 'set-cookie' }); + } + } + } + } + + this.statusCode = this.statusCode || 200; +}; + + +internals.Response.prototype._processPrepare = function (data, next) { + + if (!this._processors.prepare) { + return next(this, data); + } + + this._processors.prepare(this, function (prepared) { + + return next(prepared, data); + }); +}; + + +internals.Response.prototype._marshal = function (next) { + + var self = this; + + if (!this._processors.marshal) { + return this._streamify(this.source, next); + } + + this._processors.marshal(this, function (err, source) { + + if (err) { + return next(err); + } + + return self._streamify(source, next); + }); +}; + + +internals.Response.prototype._streamify = function (source, next) { + + if (source instanceof Stream) { + if (typeof source._read !== 'function' || typeof source._readableState !== 'object') { + return next(Boom.badImplementation('Stream must have a streams2 readable interface')); + } + + if (source._readableState.objectMode) { + return next(Boom.badImplementation('Cannot reply with stream in object mode')); + } + + this._payload = source; + return next(); + } + + var payload = source; + if (this.variety === 'plain' && + source !== null && + typeof source !== 'string') { + + var options = this.settings.stringify || {}; + var space = options.space || this.request.route.settings.json.space; + var replacer = options.replacer || this.request.route.settings.json.replacer; + var suffix = options.suffix || this.request.route.settings.json.suffix || ''; + try { + payload = JSON.stringify(payload, replacer, space); + } + catch (err) { + return next(err); + } + + if (suffix) { + payload += suffix; + } + } + else if (this.settings.stringify) { + return next(Boom.badImplementation('Cannot set formatting options on non object response')); + } + + this._payload = new internals.Payload(payload, this.settings); + return next(); +}; + + +internals.Response.prototype._tap = function () { + + return (this.listeners('finish').length || this.listeners('peek').length ? new Peekaboo(this) : null); +}; + + +internals.Response.prototype._close = function () { + + if (this._processors.close) { + this._processors.close(this); + } + + var stream = this._payload || this.source; + if (stream instanceof Stream) { + if (stream.close) { + stream.close(); + } + else if (stream.destroy) { + stream.destroy(); + } + else { + var read = function () { + + stream.read(); + }; + + var end = function () { + + stream.removeListener('readable', read); + stream.removeListener('error', end); + stream.removeListener('end', end); + }; + + stream.on('readable', read); + stream.once('error', end); + stream.once('end', end); + } + } +}; + + +internals.Response.prototype._isPayloadSupported = function () { + + return (this.request.method !== 'head' && this.statusCode !== 304 && this.statusCode !== 204); +}; + + +internals.Response.Payload = internals.Payload = function (payload, options) { + + Stream.Readable.call(this); + this._data = payload; + this._prefix = null; + this._suffix = null; + this._sizeOffset = 0; + this._encoding = options.encoding; +}; + +Hoek.inherits(internals.Payload, Stream.Readable); + + +internals.Payload.prototype._read = function (/* size */) { + + if (this._prefix) { + this.push(this._prefix, this._encoding); + } + + if (this._data) { + this.push(this._data, this._encoding); + } + + if (this._suffix) { + this.push(this._suffix, this._encoding); + } + + this.push(null); +}; + + +internals.Payload.prototype.size = function () { + + if (!this._data) { + return this._sizeOffset; + } + + return (Buffer.isBuffer(this._data) ? this._data.length : Buffer.byteLength(this._data, this._encoding)) + this._sizeOffset; +}; + + +internals.Payload.prototype.jsonp = function (variable) { + + this._sizeOffset += variable.length + 7; + this._prefix = '/**/' + variable + '('; // '/**/' prefix prevents CVE-2014-4671 security exploit + this._data = Buffer.isBuffer(this._data) ? this._data : this._data.replace(/\u2028/g, '\\u2028').replace(/\u2029/g, '\\u2029'); + this._suffix = ');'; +}; diff --git a/node_modules/hapi/lib/route.js b/node_modules/hapi/lib/route.js new file mode 100755 index 0000000..2e1f3cc --- /dev/null +++ b/node_modules/hapi/lib/route.js @@ -0,0 +1,448 @@ +// Load modules + +var Boom = require('boom'); +var Catbox = require('catbox'); +var Hoek = require('hoek'); +var Joi = require('joi'); +var Subtext = require('subtext'); +var Auth = require('./auth'); +var Defaults = require('./defaults'); +var Handler = require('./handler'); +var Validation = require('./validation'); +var Schema = require('./schema'); + + +// Declare internals + +var internals = {}; + + +exports = module.exports = internals.Route = function (options, connection, realm) { + + // Apply plugin environment (before schema validation) + + if (realm.modifiers.route.vhost || + realm.modifiers.route.prefix) { + + options = Hoek.cloneWithShallow(options, ['config']); // config is left unchanged + options.path = (realm.modifiers.route.prefix ? realm.modifiers.route.prefix + (options.path !== '/' ? options.path : '') : options.path); + options.vhost = realm.modifiers.route.vhost || options.vhost; + } + + // Setup and validate route configuration + + Hoek.assert(options.path, 'Route missing path'); + Hoek.assert(options.handler || (options.config && options.config.handler), 'Missing or undefined handler:', options.method, options.path); + Hoek.assert(!!options.handler ^ !!(options.config && options.config.handler), 'Handler must only appear once:', options.method, options.path); // XOR + Hoek.assert(options.path === '/' || options.path[options.path.length - 1] !== '/' || !connection.settings.router.stripTrailingSlash, 'Path cannot end with a trailing slash when connection configured to strip:', options.method, options.path); + Hoek.assert(/^[a-zA-Z0-9!#\$%&'\*\+\-\.^_`\|~]+$/.test(options.method), 'Invalid method name:', options.method, options.path); + + Schema.assert('route', options, options.path); + + var handler = options.handler || options.config.handler; + var method = options.method.toLowerCase(); + Hoek.assert(method !== 'head', 'Method name not allowed:', options.method, options.path); + + // Apply settings in order: {connection} <- {handler} <- {realm} <- {route} + + var handlerDefaults = Handler.defaults(method, handler, connection.server); + var base = Hoek.applyToDefaultsWithShallow(connection.settings.routes, handlerDefaults, ['bind']); + base = Hoek.applyToDefaultsWithShallow(base, realm.settings, ['bind']); + this.settings = Hoek.applyToDefaultsWithShallow(base, options.config || {}, ['bind']); + this.settings.handler = handler; + + Schema.assert('routeConfig', this.settings, options.path); + + var socketTimeout = (this.settings.timeout.socket === undefined ? 2 * 60 * 1000 : this.settings.timeout.socket); + Hoek.assert(!this.settings.timeout.server || !socketTimeout || this.settings.timeout.server < socketTimeout, 'Server timeout must be shorter than socket timeout:', options.path); + Hoek.assert(!this.settings.payload.timeout || !socketTimeout || this.settings.payload.timeout < socketTimeout, 'Payload timeout must be shorter than socket timeout:', options.path); + + this.connection = connection; + this.server = connection.server; + this.path = options.path; + this.method = method; + + this.public = { + method: this.method, + path: this.path, + vhost: this.vhost, + realm: realm, + settings: this.settings + }; + + this.settings.vhost = options.vhost; + this.settings.plugins = this.settings.plugins || {}; // Route-specific plugins settings, namespaced using plugin name + this.settings.app = this.settings.app || {}; // Route-specific application settings + + // Path parsing + + this._analysis = this.connection._router.analyze(this.path); + this.params = this._analysis.params; + this.fingerprint = this._analysis.fingerprint; + + // Validation + + var validation = this.settings.validate; + if (this.method === 'get') { + + // Assert on config, not on merged settings + + Hoek.assert(!options.config || !options.config.payload, 'Cannot set payload settings on HEAD or GET request:', options.path); + Hoek.assert(!options.config || !options.config.validate || !options.config.validate.payload, 'Cannot validate HEAD or GET requests:', options.path); + + validation.payload = null; + } + + ['headers', 'params', 'query', 'payload'].forEach(function (type) { + + validation[type] = internals.compileRule(validation[type]); + }); + + if (this.settings.response.schema !== undefined || + this.settings.response.status) { + + var rule = this.settings.response.schema; + this.settings.response.status = this.settings.response.status || {}; + var statuses = Object.keys(this.settings.response.status); + + if ((rule === true && !statuses.length) || + this.settings.response.sample === 0) { + + this.settings.response = null; + } + else { + this.settings.response.schema = internals.compileRule(rule); + for (var i = 0, il = statuses.length; i < il; ++i) { + var code = statuses[i]; + this.settings.response.status[code] = internals.compileRule(this.settings.response.status[code]); + } + } + } + else { + this.settings.response = null; + } + + // Payload parsing + + if (this.method === 'get') { + + this.settings.payload = null; + } + else { + if (this.settings.payload.allow) { + this.settings.payload.allow = [].concat(this.settings.payload.allow); + } + } + + Hoek.assert(!this.settings.validate.payload || this.settings.payload.parse, 'Route payload must be set to \'parse\' when payload validation enabled:', options.method, options.path); + Hoek.assert(!this.settings.jsonp || typeof this.settings.jsonp === 'string', 'Bad route JSONP parameter name:', options.path); + + // Authentication configuration + + this.settings.auth = this.connection.auth._setupRoute(this.settings.auth, options.path); + + // Cache + + if (this.method === 'get' && + (this.settings.cache.expiresIn || this.settings.cache.expiresAt)) { + + this.settings.cache._statuses = Hoek.mapToObject(this.settings.cache.statuses); + this._cache = new Catbox.Policy({ expiresIn: this.settings.cache.expiresIn, expiresAt: this.settings.cache.expiresAt }); + } + + // CORS + + if (this.settings.cors) { + this.settings.cors = Hoek.applyToDefaults(Defaults.cors, this.settings.cors); + + var cors = this.settings.cors; + cors._headers = cors.headers.concat(cors.additionalHeaders).join(', '); + cors._methods = cors.methods.concat(cors.additionalMethods).join(', '); + cors._exposedHeaders = cors.exposedHeaders.concat(cors.additionalExposedHeaders).join(', '); + + if (cors.origin.length) { + cors._origin = { + any: false, + qualified: [], + qualifiedString: '', + wildcards: [] + }; + + if (cors.origin.indexOf('*') !== -1) { + Hoek.assert(cors.origin.length === 1, 'Cannot specify cors.origin * together with other values'); + cors._origin.any = true; + } + else { + for (var c = 0, cl = cors.origin.length; c < cl; ++c) { + var origin = cors.origin[c]; + if (origin.indexOf('*') !== -1) { + cors._origin.wildcards.push(new RegExp('^' + Hoek.escapeRegex(origin).replace(/\\\*/g, '.*').replace(/\\\?/g, '.') + '$')); + } + else { + cors._origin.qualified.push(origin); + } + } + + Hoek.assert(cors.matchOrigin || !cors._origin.wildcards.length, 'Cannot include wildcard origin values with matchOrigin disabled'); + cors._origin.qualifiedString = cors._origin.qualified.join(' '); + } + } + } + + // Security + + if (this.settings.security) { + this.settings.security = Hoek.applyToDefaults(Defaults.security, this.settings.security); + + var security = this.settings.security; + if (security.hsts) { + if (security.hsts === true) { + security._hsts = 'max-age=15768000'; + } + else if (typeof security.hsts === 'number') { + security._hsts = 'max-age=' + security.hsts; + } + else { + security._hsts = 'max-age=' + (security.hsts.maxAge || 15768000); + if (security.hsts.includeSubdomains) { + security._hsts += '; includeSubdomains'; + } + } + } + + if (security.xframe) { + if (security.xframe === true) { + security._xframe = 'DENY'; + } + else if (typeof security.xframe === 'string') { + security._xframe = security.xframe.toUpperCase(); + } + else if (security.xframe.rule === 'allow-from') { + if (!security.xframe.source) { + security._xframe = 'SAMEORIGIN'; + } + else { + security._xframe = 'ALLOW-FROM ' + security.xframe.source; + } + } + else { + security._xframe = security.xframe.rule.toUpperCase(); + } + } + } + + // Handler + + this.settings.handler = Handler.configure(this.settings.handler, this); + this._prerequisites = Handler.prerequisites(this.settings.pre, this.server); + + // Route lifecycle + + this._cycle = this.lifecycle(); +}; + + +internals.compileRule = function (rule) { + + // null, undefined, true - anything allowed + // false - nothing allowed + // {...} - ... allowed + + return (rule === false ? Joi.object({}).allow(null) + : typeof rule === 'function' ? rule + : !rule || rule === true ? null // false tested earlier + : Joi.compile(rule)); +}; + + +internals.Route.prototype.lifecycle = function () { + + var cycle = []; + + // 'onRequest' + + if (this.settings.jsonp) { + cycle.push(internals.parseJSONP); + } + + if (this.settings.state.parse) { + cycle.push(internals.state); + } + + cycle.push('onPreAuth'); + + var authenticate = (this.settings.auth !== false); // Anything other than 'false' can still require authentication + if (authenticate) { + cycle.push(Auth.authenticate); + } + + if (this.method !== 'get') { + + cycle.push(internals.payload); + + if (authenticate) { + cycle.push(Auth.payload); + } + } + + cycle.push('onPostAuth'); + + if (this.settings.validate.headers) { + cycle.push(Validation.headers); + } + + if (this.settings.validate.params) { + cycle.push(Validation.params); + } + + if (this.settings.jsonp) { + cycle.push(internals.cleanupJSONP); + } + + if (this.settings.validate.query) { + cycle.push(Validation.query); + } + + if (this.settings.validate.payload) { + cycle.push(Validation.payload); + } + + cycle.push('onPreHandler'); + cycle.push(Handler.execute); // Must not call next() with an Error + cycle.push('onPostHandler'); // An error from here on will override any result set in handler() + + if (this.settings.response) { + cycle.push(Validation.response); + } + + // 'onPreResponse' + + return cycle; +}; + + +internals.state = function (request, next) { + + request.state = {}; + + var req = request.raw.req; + var cookies = req.headers.cookie; + if (!cookies) { + return next(); + } + + request.connection.states.parse(cookies, function (err, state, failed) { + + request.state = state; + + // Clear cookies + + for (var i = 0, il = failed.length; i < il; ++i) { + var item = failed[i]; + + if (item.settings.clearInvalid) { + request._clearState(item.name); + } + } + + // failAction: 'error', 'log', 'ignore' + + if (!err || + request.route.settings.state.failAction === 'ignore') { + + return next(); + } + + request._log(['state', 'error'], { header: cookies, errors: err.data }); + return next(request.route.settings.state.failAction === 'error' ? err : null); + }); +}; + + +internals.payload = function (request, next) { + + if (request.method === 'get' || + request.method === 'head') { // When route.method is '*' + + return next(); + } + + var onParsed = function (err, parsed) { + + request.mime = parsed.mime; + request.payload = parsed.payload || null; + + if (!err) { + return next(); + } + + var failAction = request.route.settings.payload.failAction; // failAction: 'error', 'log', 'ignore' + if (failAction !== 'ignore') { + request._log(['payload', 'error'], err); + } + + if (failAction === 'error') { + return next(err); + } + + return next(); + }; + + Subtext.parse(request.raw.req, request._tap(), request.route.settings.payload, function (err, parsed) { + + if (!err || + !request._isPayloadPending) { + + request._isPayloadPending = false; + return onParsed(err, parsed); + } + + // Flush out any pending request payload not consumed due to errors + + var stream = request.raw.req; + + var read = function () { + + stream.read(); + }; + + var end = function () { + + stream.removeListener('readable', read); + stream.removeListener('error', end); + stream.removeListener('end', end); + + request._isPayloadPending = false; + return onParsed(err, parsed); + }; + + stream.on('readable', read); + stream.once('error', end); + stream.once('end', end); + }); +}; + + +internals.parseJSONP = function (request, next) { + + var jsonp = request.query[request.route.settings.jsonp]; + if (jsonp) { + if (/^[\w\$\[\]\.]+$/.test(jsonp) === false) { + return next(Boom.badRequest('Invalid JSONP parameter value')); + } + + request.jsonp = jsonp; + } + + return next(); +}; + + +internals.cleanupJSONP = function (request, next) { + + if (request.jsonp) { + delete request.query[request.route.settings.jsonp]; + } + + return next(); +}; diff --git a/node_modules/hapi/lib/schema.js b/node_modules/hapi/lib/schema.js new file mode 100755 index 0000000..5e1da61 --- /dev/null +++ b/node_modules/hapi/lib/schema.js @@ -0,0 +1,281 @@ +// Load modules + +var Joi = require('joi'); +var Hoek = require('hoek'); + + +// Declare internals + +var internals = {}; + + +exports.assert = function (type, options, message) { + + var result = Joi.validate(options, internals[type]); + Hoek.assert(!result.error, 'Invalid', type, 'options', message ? '(' + message + ')' : '', result.error && result.error.annotate()); + return result.value; +}; + + +internals.cache = Joi.object({ + name: Joi.string().invalid('_default'), + partition: Joi.string(), + shared: Joi.boolean(), + engine: Joi.alternatives([ + Joi.object(), + Joi.func() + ]) + .required() +}).unknown(); + + +internals.auth = Joi.alternatives([ + Joi.string(), + Joi.object({ + mode: Joi.string().valid('required', 'optional', 'try'), + scope: Joi.alternatives([ + Joi.string(), + Joi.array() + ]) + .allow(false), + entity: Joi.string().valid('user', 'app', 'any'), + strategy: Joi.string(), + strategies: Joi.array().min(1), + payload: [ + Joi.string().valid('required', 'optional'), + Joi.boolean() + ] + }) + .without('strategy', 'strategies') +]); + + +internals.routeBase = Joi.object({ + app: Joi.object().allow(null), + auth: internals.auth.allow(false), + bind: Joi.object().allow(null), + cache: Joi.object({ + expiresIn: Joi.number(), + expiresAt: Joi.string(), + privacy: Joi.string().valid('default', 'public', 'private'), + statuses: Joi.array().items(Joi.number().integer().min(200)).min(1) + }), + cors: Joi.object({ + origin: Joi.array(), + matchOrigin: Joi.boolean(), + isOriginExposed: Joi.boolean(), + maxAge: Joi.number(), + headers: Joi.array(), + additionalHeaders: Joi.array(), + methods: Joi.array(), + additionalMethods: Joi.array(), + exposedHeaders: Joi.array(), + additionalExposedHeaders: Joi.array(), + credentials: Joi.boolean(), + override: Joi.boolean() + }) + .allow(null, false, true), + files: Joi.object({ + relativeTo: Joi.string().regex(/^([\/\.])|([A-Za-z]:\\)|(\\\\)/).required() + }), + json: Joi.object({ + replacer: Joi.alternatives(Joi.func(), Joi.array()).allow(null), + space: Joi.number().allow(null), + suffix: Joi.string().allow(null) + }), + jsonp: Joi.string(), + payload: Joi.object({ + output: Joi.string().valid('data', 'stream', 'file'), + parse: Joi.boolean().allow('gunzip'), + allow: [ + Joi.string(), + Joi.array() + ], + override: Joi.string(), + maxBytes: Joi.number(), + uploads: Joi.string(), + failAction: Joi.string().valid('error', 'log', 'ignore'), + timeout: Joi.number().integer().positive().allow(false) + }), + plugins: Joi.object(), + response: Joi.object({ + schema: Joi.alternatives(Joi.object(), Joi.func()).allow(true, false), + status: Joi.object().pattern(/\d\d\d/, Joi.alternatives(Joi.object(), Joi.func()).allow(true, false)), + sample: Joi.number().min(0).max(100), + failAction: Joi.string().valid('error', 'log'), + modify: Joi.boolean(), + options: Joi.object() + }) + .without('modify', 'sample'), + security: Joi.object({ + hsts: [ + Joi.object({ + maxAge: Joi.number(), + includeSubdomains: Joi.boolean() + }), + Joi.boolean(), + Joi.number() + ], + xframe: [ + Joi.boolean(), + Joi.string().valid('sameorigin', 'deny'), + Joi.object({ + rule: Joi.string().valid('sameorigin', 'deny', 'allow-from'), + source: Joi.string() + }) + ], + xss: Joi.boolean(), + noOpen: Joi.boolean(), + noSniff: Joi.boolean() + }) + .allow(null, false, true), + state: Joi.object({ + parse: Joi.boolean(), + failAction: Joi.string().valid('error', 'log', 'ignore') + }), + timeout: Joi.object({ + socket: Joi.number().integer().positive().allow(false), + server: Joi.number().integer().positive().allow(false).required() + }), + validate: Joi.object({ + headers: Joi.alternatives(Joi.object(), Joi.func()).allow(null, false, true), + params: Joi.alternatives(Joi.object(), Joi.func()).allow(null, false, true), + query: Joi.alternatives(Joi.object(), Joi.func()).allow(null, false, true), + payload: Joi.alternatives(Joi.object(), Joi.func()).allow(null, false, true), + failAction: [ + Joi.string().valid('error', 'log', 'ignore'), + Joi.func() + ], + errorFields: Joi.object(), + options: Joi.object() + }) +}); + + +internals.connectionBase = Joi.object({ + app: Joi.object().allow(null), + load: Joi.object(), + plugins: Joi.object(), + router: Joi.object({ + isCaseSensitive: Joi.boolean(), + stripTrailingSlash: Joi.boolean() + }), + routes: internals.routeBase, + state: Joi.object() // Cookie defaults +}); + + +internals.server = Joi.object({ + app: Joi.object().allow(null), + cache: Joi.alternatives([ + Joi.func(), + internals.cache, + Joi.array().items(internals.cache).min(1) + ]).allow(null), + connections: internals.connectionBase, + debug: Joi.object({ + request: Joi.array().allow(false), + log: Joi.array().allow(false) + }).allow(false), + files: Joi.object({ + etagsCacheMaxSize: Joi.number().min(0) + }), + load: Joi.object(), + mime: Joi.object(), + minimal: Joi.boolean(), + plugins: Joi.object() +}); + + +internals.connection = internals.connectionBase.keys({ + autoListen: Joi.boolean(), + host: Joi.string().hostname(), + address: Joi.string().hostname(), + labels: Joi.array().items(Joi.string()).single(), + listener: Joi.any(), + port: Joi.alternatives([ + Joi.number().integer().min(0), // TCP port + Joi.string().regex(/\//), // Unix domain socket + Joi.string().regex(/^\\\\\.\\pipe\\/) // Windows named pipe + ]) + .allow(null), + tls: Joi.alternatives([ + Joi.object().allow(null), + Joi.boolean() + ]), + uri: Joi.string().regex(/[^/]$/) +}); + + +internals.vhost = Joi.alternatives([ + Joi.string().hostname(), + Joi.array().items(Joi.string().hostname()).min(1) +]); + + +internals.route = Joi.object({ + method: Joi.string().required(), + path: Joi.string().required(), + vhost: internals.vhost, + handler: Joi.any(), // Validated in route.config + config: Joi.object().allow(null) +}); + + +internals.pre = [ + Joi.string(), + Joi.func(), + Joi.object({ + method: Joi.alternatives(Joi.string(), Joi.func()).required(), + assign: Joi.string(), + mode: Joi.string().valid('serial', 'parallel'), + failAction: Joi.string().valid('error', 'log', 'ignore') + }) +]; + + +internals.routeConfig = internals.routeBase.keys({ + id: Joi.string(), + pre: Joi.array().items(internals.pre.concat(Joi.array().items(internals.pre).min(1))), + handler: [ + Joi.func(), + Joi.string(), + Joi.object().length(1) + ], + description: Joi.string(), + notes: [ + Joi.string(), + Joi.array().items(Joi.string()) + ], + tags: [ + Joi.string(), + Joi.array().items(Joi.string()) + ] +}); + + +internals.cachePolicy = Joi.object({ + cache: Joi.string().allow(null).allow(''), + segment: Joi.string(), + shared: Joi.boolean() +}) + .options({ allowUnknown: true }); // Catbox validates other keys + + +internals.method = Joi.object({ + bind: Joi.object().allow(null), + generateKey: Joi.func(), + cache: internals.cachePolicy, + callback: Joi.boolean() +}); + + +internals.register = Joi.object({ + routes: Joi.object({ + prefix: Joi.string().regex(/^\/.+/), + vhost: internals.vhost + }), + select: Joi.array().items(Joi.string()).single() +}); + +internals.dependencies = Joi.array().items(Joi.string()).single(); diff --git a/node_modules/hapi/lib/server.js b/node_modules/hapi/lib/server.js new file mode 100755 index 0000000..77d950a --- /dev/null +++ b/node_modules/hapi/lib/server.js @@ -0,0 +1,226 @@ +// Load modules + +var Events = require('events'); +var Path = require('path'); +var Catbox = require('catbox'); +var CatboxMemory = require('catbox-memory'); +var H2o2 = require('h2o2'); +var Heavy = require('heavy'); +var Hoek = require('hoek'); +var Inert = require('inert'); +var Items = require('items'); +var Mimos = require('mimos'); +var Vision = require('vision'); +var Connection = require('./connection'); +var Defaults = require('./defaults'); +var Handler = require('./handler'); +var Methods = require('./methods'); +var Plugin = require('./plugin'); +var Reply = require('./reply'); +var Schema = require('./schema'); + + +// Declare internals + +var internals = {}; + + +exports = module.exports = internals.Server = function (options) { + + Hoek.assert(this.constructor === internals.Server, 'Server must be instantiated using new'); + + options = Schema.assert('server', options || {}); + + this._settings = Hoek.applyToDefaultsWithShallow(Defaults.server, options, ['connections.routes.bind']); + this._settings.connections = Hoek.applyToDefaultsWithShallow(Defaults.connection, this._settings.connections || {}, ['routes.bind']); + this._settings.connections.routes.cors = Hoek.applyToDefaults(Defaults.cors, this._settings.connections.routes.cors); + this._settings.connections.routes.security = Hoek.applyToDefaults(Defaults.security, this._settings.connections.routes.security); + + this._caches = {}; // Cache clients + this._handlers = {}; // Registered handlers + this._methods = new Methods(this); // Server methods + + this._events = new Events.EventEmitter(); // Server-only events + this._dependencies = []; // Plugin dependencies + this._afters = null; // Plugin after() dependencies + this._heavy = new Heavy(this._settings.load); + this._mime = new Mimos(this._settings.mime); + this._replier = new Reply(); + this._decorations = {}; + this._plugins = {}; // Exposed plugin properties by name + this._app = {}; + + if (options.cache) { + var caches = [].concat(options.cache); + for (var i = 0, il = caches.length; i < il; ++i) { + this._createCache(caches[i]); + } + } + + if (!this._caches._default) { + this._createCache({ engine: CatboxMemory }); // Defaults to memory-based + } + + Plugin.call(this, this, [], ''); + + if (!this._settings.minimal) { + this.register([Vision, Inert, H2o2], Hoek.ignore); // Safe to ignore + } +}; + +Hoek.inherits(internals.Server, Plugin); + + +internals.Server.prototype._createCache = function (options) { + + if (typeof options === 'function') { + options = { engine: options }; + } + + var name = options.name || '_default'; + Hoek.assert(!this._caches[name], 'Cannot configure the same cache more than once: ', name === '_default' ? 'default cache' : name); + + var client = null; + if (typeof options.engine === 'object') { + client = new Catbox.Client(options.engine); + } + else { + var settings = Hoek.clone(options); + settings.partition = settings.partition || 'hapi-cache'; + delete settings.name; + delete settings.engine; + delete settings.shared; + + client = new Catbox.Client(options.engine, settings); + } + + this._caches[name] = { + client: client, + segments: {}, + shared: options.shared || false + }; +}; + + +internals.Server.prototype.connection = function (options) { + + var settings = Hoek.applyToDefaultsWithShallow(this._settings.connections, options || {}, ['listener', 'routes.bind']); + settings.routes.cors = Hoek.applyToDefaults(this._settings.connections.routes.cors || Defaults.cors, settings.routes.cors); + settings.routes.security = Hoek.applyToDefaults(this._settings.connections.routes.security || Defaults.security, settings.routes.security); + + settings = Schema.assert('connection', settings); // Applies validation changes (type cast) + + var connection = new Connection(this, settings); + this.connections.push(connection); + this.addEmitter(connection); + + if (this.connections.length === 1) { + this._single(); + } + + return this._clone([connection]); +}; + + +internals.Server.prototype.start = function (callback) { + + var self = this; + + callback = callback || Hoek.ignore; + + Hoek.assert(this.connections.length, 'No connections to start'); + + // Assert dependencies + + for (var i = 0, il = this._dependencies.length; i < il; ++i) { + var dependency = this._dependencies[i]; + for (var s = 0, sl = dependency.connections.length; s < sl; ++s) { + var connection = dependency.connections[s]; + for (var d = 0, dl = dependency.deps.length; d < dl; ++d) { + var dep = dependency.deps[d]; + Hoek.assert(connection._registrations[dep], 'Plugin', dependency.plugin, 'missing dependency', dep, 'in connection:', connection.info.uri); + } + } + } + + // Start cache + + var caches = Object.keys(self._caches); + Items.parallel(caches, function (cache, next) { + + self._caches[cache].client.start(next); + }, + function (err) { + + if (err) { + return callback(err); + } + + // After hooks + + var finalize = function (err) { + + if (err) { + return callback(err); + } + + // Load measurements + + self._heavy.start(); + + // Start connections + + Items.serial(self.connections, function (connection, next) { + + connection._start(next); + }, + function (err) { + + self._events.emit('start'); + return callback(err); + }); + }; + + var exts = self._afters; + if (!exts) { + return process.nextTick(finalize); + } + + Items.serial(exts.nodes, function (ext, next) { + + ext.func(ext.plugin, next); + }, + function (err) { + + return finalize(err); + }); + }); +}; + + +internals.Server.prototype.stop = function (/*[options], [callback]*/) { + + var self = this; + + var callback = (arguments.length === 1 ? (typeof arguments[0] === 'function' ? arguments[0] : null) : arguments[1]); + var options = (arguments.length === 1 ? (typeof arguments[0] === 'function' ? null : arguments[0]) : arguments[0]); + + Items.serial(this.connections, function (connection, next) { + + connection._stop(options, next); + }, + function (err) { + + var caches = Object.keys(self._caches); + for (var i = 0, il = caches.length; i < il; ++i) { + self._caches[caches[i]].client.stop(); + } + + self._events.emit('stop'); + self._heavy.stop(); + + if (callback) { + callback(err); + } + }); +}; diff --git a/node_modules/hapi/lib/transmit.js b/node_modules/hapi/lib/transmit.js new file mode 100755 index 0000000..9562fe2 --- /dev/null +++ b/node_modules/hapi/lib/transmit.js @@ -0,0 +1,554 @@ +// Load modules + +var Http = require('http'); +var Stream = require('stream'); +var Zlib = require('zlib'); +var Ammo = require('ammo'); +var Boom = require('boom'); +var Hoek = require('hoek'); +var Items = require('items'); +var Shot = require('shot'); +var Auth = require('./auth'); +var Response = require('./response'); + + +// Declare internals + +var internals = {}; + + +exports.send = function (request, callback) { + + var response = request.response; + if (response.isBoom) { + return internals.fail(request, response, callback); + } + + internals.marshal(request, function (err) { + + if (err) { + request._setResponse(err); + return internals.fail(request, err, callback); + } + + return internals.transmit(response, callback); + }); +}; + + +internals.marshal = function (request, next) { + + var response = request.response; + + internals.cors(response); + internals.content(response); + internals.security(response); + + if (response.statusCode !== 304 && + (request.method === 'get' || request.method === 'head')) { + + if (response.headers.etag && + request.headers['if-none-match']) { + + // Strong verifier + + var ifNoneMatch = request.headers['if-none-match'].split(/\s*,\s*/); + for (var i = 0, il = ifNoneMatch.length; i < il; ++i) { + var etag = ifNoneMatch[i]; + if (etag === response.headers.etag) { + response.code(304); + break; + } + else if (response.settings.varyEtag) { + var etagBase = response.headers.etag.slice(0, -1); + if (etag === etagBase + '-gzip"' || + etag === etagBase + '-deflate"') { + + response.headers.etag = etag; + response.code(304); + break; + } + } + } + } + else { + var ifModifiedSinceHeader = request.headers['if-modified-since']; + var lastModifiedHeader = response.headers['last-modified']; + + if (ifModifiedSinceHeader && + lastModifiedHeader) { + + // Weak verifier + + var ifModifiedSince = Date.parse(ifModifiedSinceHeader); + var lastModified = Date.parse(lastModifiedHeader); + + if (ifModifiedSince && + lastModified && + ifModifiedSince >= lastModified) { + + response.code(304); + } + } + } + } + + internals.state(response, function (err) { + + if (err) { + request._log(['state', 'response', 'error'], err); + request._states = {}; // Clear broken state + return next(err); + } + + internals.cache(response); + + if (!response._isPayloadSupported()) { + + // Close unused file streams + + response._close(); + + // Set empty stream + + response._payload = new internals.Empty(); + delete response.headers['content-length']; + return Auth.response(request, next); // Must be last in case requires access to headers + } + + response._marshal(function (err) { + + if (err) { + return next(Boom.wrap(err)); + } + + if (request.jsonp && + response._payload.jsonp) { + + response._header('content-type', 'text/javascript' + (response.settings.charset ? '; charset=' + response.settings.charset : '')); + response._header('x-content-type-options', 'nosniff'); + response._payload.jsonp(request.jsonp); + } + + if (response._payload.size && + typeof response._payload.size === 'function') { + + response._header('content-length', response._payload.size(), { override: false }); + } + + return Auth.response(request, next); // Must be last in case requires access to headers + }); + }); +}; + + +internals.fail = function (request, boom, callback) { + + var error = boom.output; + var response = new Response(error.payload, request); + response._error = boom; + response.code(error.statusCode); + response.headers = error.headers; + request.response = response; // Not using request._setResponse() to avoid double log + + internals.marshal(request, function (err) { + + if (err) { + + // Failed to marshal an error - replace with minimal representation of original error + + var minimal = { + statusCode: error.statusCode, + error: Http.STATUS_CODES[error.statusCode], + message: boom.message + }; + + response._payload = new Response.Payload(JSON.stringify(minimal), {}); + } + + return internals.transmit(response, callback); + }); +}; + + +internals.transmit = function (response, callback) { + + // Setup source + + var request = response.request; + var source = response._payload; + var length = response.headers['content-length'] ? parseInt(response.headers['content-length'], 10) : 0; // In case value is a string + + // Compression + + var mime = request.server.mime.type(response.headers['content-type'] || 'application/octet-stream'); + var encoding = (mime.compressible && !response.headers['content-encoding'] ? request.info.acceptEncoding : null); + encoding = (encoding === 'identity' ? null : encoding); + + // Range + + if (request.method === 'get' && + response.statusCode === 200 && + length && + !encoding) { + + if (request.headers.range) { + + // Check If-Range + + if (!request.headers['if-range'] || + request.headers['if-range'] === response.headers.etag) { // Ignoring last-modified date (weak) + + // Parse header + + var ranges = Ammo.header(request.headers.range, length); + if (!ranges) { + var error = Boom.rangeNotSatisfiable(); + error.output.headers['content-range'] = 'bytes */' + length; + return internals.fail(request, error, callback); + } + + // Prepare transform + + if (ranges.length === 1) { // Ignore requests for multiple ranges + var range = ranges[0]; + var ranger = new Ammo.Stream(range); + response.code(206); + response.bytes(range.to - range.from + 1); + response._header('content-range', 'bytes ' + range.from + '-' + range.to + '/' + length); + } + } + } + + response._header('accept-ranges', 'bytes'); + } + + // Content-Encoding + + if (encoding && + length && + response._isPayloadSupported()) { + + delete response.headers['content-length']; + response._header('content-encoding', encoding); + response.vary('accept-encoding'); + + var compressor = (encoding === 'gzip' ? Zlib.createGzip() : Zlib.createDeflate()); + } + + if (response.headers['content-encoding'] && + response.headers.etag && + response.settings.varyEtag) { + + response.headers.etag = response.headers.etag.slice(0, -1) + '-' + response.headers['content-encoding'] + '"'; + } + + // Write headers + + var headers = Object.keys(response.headers); + for (var h = 0, hl = headers.length; h < hl; ++h) { + var header = headers[h]; + request.raw.res.setHeader(header, response.headers[header]); + } + + request.raw.res.writeHead(response.statusCode); + + // Generate tap stream + + var tap = response._tap(); + + // Write payload + + var hasEnded = false; + var end = function (err, event) { + + if (!hasEnded) { + hasEnded = true; + + if (event !== 'aborted') { + request.raw.res.end(); + } + + source.removeListener('error', end); + + request.raw.req.removeListener('aborted', onAborted); + request.raw.req.removeListener('close', onClose); + + request.raw.res.removeListener('close', onClose); + request.raw.res.removeListener('error', end); + request.raw.res.removeListener('finish', end); + + var tags = (err ? ['response', 'error'] + : (event ? ['response', 'error', event] + : ['response'])); + + if (event || err) { + request.emit('disconnect'); + } + + request._log(tags, err); + callback(); + } + }; + + source.once('error', end); + + var onAborted = function () { + + end(null, 'aborted'); + }; + + var onClose = function () { + + end(null, 'close'); + }; + + request.raw.req.once('aborted', onAborted); + request.raw.req.once('close', onClose); + + request.raw.res.once('close', onClose); + request.raw.res.once('error', end); + request.raw.res.once('finish', end); + + var preview = (tap ? source.pipe(tap) : source); + var compressed = (compressor ? preview.pipe(compressor) : preview); + var ranged = (ranger ? compressed.pipe(ranger) : compressed); + ranged.pipe(request.raw.res); + + // Injection + + if (Shot.isInjection(request.raw.req)) { + request.raw.res._hapi = { + request: request + }; + + if (response.variety === 'plain') { + request.raw.res._hapi.result = response._isPayloadSupported() ? response.source : null; + } + } +}; + + +internals.Empty = function () { + + Stream.Readable.call(this); +}; + +Hoek.inherits(internals.Empty, Stream.Readable); + + +internals.Empty.prototype._read = function (/* size */) { + + this.push(null); +}; + + +internals.cors = function (response) { + + var request = response.request; + var cors = request.route.settings.cors; + if (cors) { + if (cors._origin && + (!response.headers['access-control-allow-origin'] || cors.override)) { + + if (cors.matchOrigin) { + response.vary('origin'); + if (internals.matchOrigin(request.headers.origin, cors)) { + response._header('access-control-allow-origin', request.headers.origin); + } + else if (cors.isOriginExposed) { + response._header('access-control-allow-origin', cors._origin.any ? '*' : cors._origin.qualifiedString); + } + } + else if (cors._origin.any) { + response._header('access-control-allow-origin', '*'); + } + else { + response._header('access-control-allow-origin', cors._origin.qualifiedString); + } + } + + response._header('access-control-max-age', cors.maxAge, { override: cors.override }); + response._header('access-control-allow-methods', cors._methods, { override: cors.override }); + response._header('access-control-allow-headers', cors._headers, { override: cors.override }); + + if (cors._exposedHeaders.length !== 0) { + response._header('access-control-expose-headers', cors._exposedHeaders, { override: cors.override }); + } + + if (cors.credentials) { + response._header('access-control-allow-credentials', 'true', { override: cors.override }); + } + } +}; + + +internals.matchOrigin = function (origin, cors) { + + if (!origin) { + return false; + } + + if (cors._origin.any) { + return true; + } + + if (cors._origin.qualified.indexOf(origin) !== -1) { + return true; + } + + for (var i = 0, il = cors._origin.wildcards.length; i < il; ++i) { + if (origin.match(cors._origin.wildcards[i])) { + return true; + } + } + + return false; +}; + + +internals.cache = function (response) { + + if (response.headers['cache-control']) { + return; + } + + var request = response.request; + if ((request._route._cache && request.route.settings.cache._statuses[response.statusCode]) || + response.settings.ttl) { + + var ttl = (response.settings.ttl !== null ? response.settings.ttl : request._route._cache.ttl()); + var privacy = (request.auth.isAuthenticated || response.headers['set-cookie'] ? 'private' : request.route.settings.cache.privacy || 'default'); + response._header('cache-control', 'max-age=' + Math.floor(ttl / 1000) + ', must-revalidate' + (privacy !== 'default' ? ', ' + privacy : '')); + } + else { + response._header('cache-control', 'no-cache'); + } +}; + + +internals.security = function (response) { + + var request = response.request; + + var security = request.route.settings.security; + if (security) { + if (security._hsts) { + response._header('strict-transport-security', security._hsts, { override: false }); + } + + if (security._xframe) { + response._header('x-frame-options', security._xframe, { override: false }); + } + + if (security.xss) { + response._header('x-xss-protection', '1; mode=block', { override: false }); + } + + if (security.noOpen) { + response._header('x-download-options', 'noopen', { override: false }); + } + + if (security.noSniff) { + response._header('x-content-type-options', 'nosniff', { override: false }); + } + } +}; + + +internals.content = function (response) { + + var type = response.headers['content-type']; + if (!type) { + var charset = (response.settings.charset ? '; charset=' + response.settings.charset : ''); + + if (typeof response.source === 'string') { + response.type('text/html' + charset); + } + else if (Buffer.isBuffer(response.source)) { + response.type('application/octet-stream'); + } + else if (response.variety === 'plain' && + response.source !== null) { + + response.type('application/json' + charset); + } + } + else if (response.settings.charset && + type.match(/^(?:text\/)|(?:application\/(?:json)|(?:javascript))/)) { + + var hasParams = (type.indexOf(';') !== -1); + if (!hasParams || + !type.match(/[; ]charset=/)) { + + response.type(type + (hasParams ? ', ' : '; ') + 'charset=' + (response.settings.charset)); + } + } +}; + + +internals.state = function (response, next) { + + var request = response.request; + + var names = {}; + var states = []; + + var keys = Object.keys(request._states); + for (var i = 0, il = keys.length; i < il; ++i) { + var name = keys[i]; + names[name] = true; + states.push(request._states[name]); + } + + keys = Object.keys(request.connection.states.cookies); + Items.parallel(keys, function (name, nextKey) { + + var autoValue = request.connection.states.cookies[name].autoValue; + if (!autoValue || names[name]) { + return nextKey(); + } + + names[name] = true; + + if (typeof autoValue !== 'function') { + states.push({ name: name, value: autoValue }); + return nextKey(); + } + + autoValue(request, function (err, value) { + + if (err) { + return nextKey(err); + } + + states.push({ name: name, value: value }); + return nextKey(); + }); + }, + function (err) { + + if (err) { + return next(Boom.wrap(err)); + } + + if (!states.length) { + return next(); + } + + request.connection.states.format(states, function (err, header) { + + if (err) { + return next(Boom.wrap(err)); + } + + var existing = response.headers['set-cookie']; + if (existing) { + header = (Array.isArray(existing) ? existing : [existing]).concat(header); + } + + response._header('set-cookie', header); + return next(); + }); + }); +}; diff --git a/node_modules/hapi/lib/validation.js b/node_modules/hapi/lib/validation.js new file mode 100755 index 0000000..de9d55c --- /dev/null +++ b/node_modules/hapi/lib/validation.js @@ -0,0 +1,220 @@ +// Load modules + +var Boom = require('boom'); +var Hoek = require('hoek'); +var Joi = require('joi'); + + +// Declare internals + +var internals = {}; + + +exports.query = function (request, next) { + + return internals.input('query', request, next); +}; + + +exports.payload = function (request, next) { + + if (request.method === 'get' || + request.method === 'head') { // When route.method is '*' + + return next(); + } + + return internals.input('payload', request, next); +}; + + +exports.params = function (request, next) { + + return internals.input('params', request, next); +}; + + +exports.headers = function (request, next) { + + return internals.input('headers', request, next); +}; + + +internals.input = function (source, request, next) { + + if (typeof request[source] !== 'object') { + return next(Boom.unsupportedMediaType(source + ' must represent an object')); + } + + var postValidate = function (err, value) { + + request.orig[source] = request[source]; + if (value !== undefined) { + request[source] = value; + } + + if (!err) { + return next(); + } + + if (err.isDeveloperError) { + return next(err); + } + + // failAction: 'error', 'log', 'ignore', function (source, err, next) + + if (request.route.settings.validate.failAction === 'ignore') { + return next(); + } + + // Prepare error + + var error = Boom.badRequest(err.message, err); + error.output.payload.validation = { source: source, keys: [] }; + if (err.details) { + for (var i = 0, il = err.details.length; i < il; ++i) { + error.output.payload.validation.keys.push(Hoek.escapeHtml(err.details[i].path)); + } + } + + if (request.route.settings.validate.errorFields) { + var fields = Object.keys(request.route.settings.validate.errorFields); + for (var f = 0, fl = fields.length; f < fl; ++f) { + var field = fields[f]; + error.output.payload[field] = request.route.settings.validate.errorFields[field]; + } + } + + request._log(['validation', 'error', source], error); + + // Log only + + if (request.route.settings.validate.failAction === 'log') { + return next(); + } + + // Return error + + if (typeof request.route.settings.validate.failAction !== 'function') { + return next(error); + } + + // Custom handler + + request._protect.run('validate:input:failAction', next, function (exit) { + + var reply = request.server._replier.interface(request, request.route.realm, exit); + request.route.settings.validate.failAction(request, reply, source, error); + }); + }; + + var localOptions = { + context: { + headers: request.headers, + params: request.params, + query: request.query, + payload: request.payload, + auth: { + isAuthenticated: request.auth.isAuthenticated, + credentials: request.auth.credentials + } + } + }; + + delete localOptions.context[source]; + Hoek.merge(localOptions, request.route.settings.validate.options); + + var schema = request.route.settings.validate[source]; + if (typeof schema !== 'function') { + return Joi.validate(request[source], schema, localOptions, postValidate); + } + + request._protect.run('validate:input', postValidate, function (exit) { + + return schema(request[source], localOptions, exit); + }); +}; + + +exports.response = function (request, next) { + + if (request.route.settings.response.sample) { + var currentSample = Math.ceil((Math.random() * 100)); + if (currentSample > request.route.settings.response.sample) { + return next(); + } + } + + var response = request.response; + var statusCode = response.isBoom ? response.output.statusCode : response.statusCode; + var source = response.isBoom ? response.output.payload : response.source; + + var statusSchema = request.route.settings.response.status[statusCode]; + if (statusCode >= 400 && + !statusSchema) { + + return next(); // Do not validate errors by default + } + + var schema = statusSchema || request.route.settings.response.schema; + if (schema === null) { + return next(); // No rules + } + + if ((!response.isBoom && request.response.variety !== 'plain') || + typeof source !== 'object') { + + return next(Boom.badImplementation('Cannot validate non-object response')); + } + + var postValidate = function (err, value) { + + if (!err) { + if (value !== undefined && + request.route.settings.response.modify) { + + if (response.isBoom) { + response.output.payload = value; + } + else { + response.source = value; + } + } + + return next(); + } + + // failAction: 'error', 'log' + + if (request.route.settings.response.failAction === 'log') { + request._log(['validation', 'response', 'error'], err.message); + return next(); + } + + return next(Boom.badImplementation(err.message)); + }; + + var localOptions = { + context: { + headers: request.headers, + params: request.params, + query: request.query, + payload: request.payload, + auth: { + isAuthenticated: request.auth.isAuthenticated, + credentials: request.auth.credentials + } + } + }; + + Hoek.merge(localOptions, request.route.settings.response.options); + + if (typeof schema !== 'function') { + return Joi.validate(source, schema, localOptions, postValidate); + } + + request._protect.run('validate:response', postValidate, function (exit) { + + return schema(source, localOptions, exit); + }); +}; diff --git a/node_modules/hapi/node_modules/accept/.npmignore b/node_modules/hapi/node_modules/accept/.npmignore new file mode 100644 index 0000000..7e1574d --- /dev/null +++ b/node_modules/hapi/node_modules/accept/.npmignore @@ -0,0 +1,18 @@ +.idea +*.iml +npm-debug.log +dump.rdb +node_modules +results.tap +results.xml +npm-shrinkwrap.json +config.json +.DS_Store +*/.DS_Store +*/*/.DS_Store +._* +*/._* +*/*/._* +coverage.* +lib-cov +complexity.md diff --git a/node_modules/hapi/node_modules/accept/.travis.yml b/node_modules/hapi/node_modules/accept/.travis.yml new file mode 100755 index 0000000..047f7e3 --- /dev/null +++ b/node_modules/hapi/node_modules/accept/.travis.yml @@ -0,0 +1,5 @@ +language: node_js + +node_js: + - 0.10 + diff --git a/node_modules/hapi/node_modules/accept/CONTRIBUTING.md b/node_modules/hapi/node_modules/accept/CONTRIBUTING.md new file mode 100755 index 0000000..850e413 --- /dev/null +++ b/node_modules/hapi/node_modules/accept/CONTRIBUTING.md @@ -0,0 +1,16 @@ +# How to contribute +We welcome contributions from the community and are pleased to have them. Please follow this guide when logging issues or making code changes. + +## Logging Issues +All issues should be created using the [new issue form](https://github.com/hapijs/accept/issues/new). Clearly describe the issue including steps +to reproduce if there are any. Also, make sure to indicate the earliest version that has the issue being reported. + +## Patching Code + +Code changes are welcome and should follow the guidelines below. + +* Fork the repository on GitHub. +* Fix the issue ensuring that your code follows the [style guide](https://github.com/hapijs/hapi/blob/master/docs/Style.md). +* Add tests for your new code ensuring that you have 100% code coverage (we can help you reach 100% but will not merge without it). + * Run `npm test` to generate a report of test coverage +* [Pull requests](http://help.github.com/send-pull-requests/) should be made to the [master branch](https://github.com/hapijs/accept/tree/master). diff --git a/node_modules/hapi/node_modules/accept/LICENSE b/node_modules/hapi/node_modules/accept/LICENSE new file mode 100755 index 0000000..170e2d6 --- /dev/null +++ b/node_modules/hapi/node_modules/accept/LICENSE @@ -0,0 +1,30 @@ +Copyright (c) 2014, Walmart and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/accept/graphs/contributors + + diff --git a/node_modules/hapi/node_modules/accept/Makefile b/node_modules/hapi/node_modules/accept/Makefile new file mode 100755 index 0000000..4cacebd --- /dev/null +++ b/node_modules/hapi/node_modules/accept/Makefile @@ -0,0 +1,8 @@ +test: + @node node_modules/lab/bin/lab +test-cov: + @node node_modules/lab/bin/lab -t 100 +test-cov-html: + @node node_modules/lab/bin/lab -r html -o coverage.html + +.PHONY: test test-cov test-cov-html diff --git a/node_modules/hapi/node_modules/accept/README.md b/node_modules/hapi/node_modules/accept/README.md new file mode 100644 index 0000000..529d9fb --- /dev/null +++ b/node_modules/hapi/node_modules/accept/README.md @@ -0,0 +1,7 @@ +#accept + +HTTP Accept-* headers parsing. + +[![Build Status](https://secure.travis-ci.org/hapijs/accept.png)](http://travis-ci.org/hapijs/accept) + +Lead Maintainer - [Eran Hammer](https://github.com/hueniverse) diff --git a/node_modules/hapi/node_modules/accept/index.js b/node_modules/hapi/node_modules/accept/index.js new file mode 100755 index 0000000..4cc88b3 --- /dev/null +++ b/node_modules/hapi/node_modules/accept/index.js @@ -0,0 +1 @@ +module.exports = require('./lib'); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/accept/lib/index.js b/node_modules/hapi/node_modules/accept/lib/index.js new file mode 100755 index 0000000..903c574 --- /dev/null +++ b/node_modules/hapi/node_modules/accept/lib/index.js @@ -0,0 +1,147 @@ +// Load modules + +var Boom = require('boom'); +var Hoek = require('hoek'); + + +// Declare internals + +var internals = {}; + +/* + RFC 7231 Section 5.3.4 (https://tools.ietf.org/html/rfc7231#section-5.3.4) + + Accept-Encoding = #( codings [ weight ] ) + codings = content-coding / "identity" / "*" + + Accept-Encoding: compress, gzip + Accept-Encoding: + Accept-Encoding: * + Accept-Encoding: compress;q=0.5, gzip;q=1.0 + Accept-Encoding: gzip;q=1.0, identity; q=0.5, *;q=0 +*/ + +exports.encoding = function (header, preferences) { + + var encodings = exports.encodings(header, preferences); + if (encodings.isBoom) { + return encodings; + } + + return encodings.length ? encodings[0] : ''; +}; + + +exports.encodings = function (header, preferences) { + + Hoek.assert(!preferences || Array.isArray(preferences), 'Preferences must be an array'); + + var scores = internals.parse(header, 'encoding'); + if (scores.isBoom) { + return scores; + } + + if (!preferences) { + preferences = Object.keys(scores.accept); + preferences.push('*'); + } + + return internals.map(preferences, scores); +}; + + +/* + RFC 7231 Section 5.3.1 (https://tools.ietf.org/html/rfc7231#section-5.3.1) + + The weight is normalized to a real number in the range 0 through 1, + where 0.001 is the least preferred and 1 is the most preferred; a + value of 0 means "not acceptable". If no "q" parameter is present, + the default weight is 1. + + weight = OWS ";" OWS "q=" qvalue + qvalue = ( "0" [ "." 0*3DIGIT ] ) / ( "1" [ "." 0*3("0") ] ) +*/ + +// 1: token 2: qvalue +internals.preferenceRegex = /\s*([^;\,]+)(?:\s*;\s*[qQ]\=([01](?:\.\d{0,3})?))?\s*(?:\,|$)/g; + + +internals.equivalents = { + encoding: { + 'x-compress': 'compress', + 'x-gzip': 'gzip' + } +}; + +internals.parse = function (header, type) { + + var scores = { + accept: {}, + reject: {}, + any: 0.0 + }; + + if (header) { + var leftovers = header.replace(internals.preferenceRegex, function ($0, $1, $2) { + + $1 = $1.toLowerCase(); + var key = internals.equivalents[type][$1] || $1; + var score = $2 ? parseFloat($2) : 1.0; + if (key === '*') { + scores.any = score; + } + else if (score > 0) { + scores.accept[key] = score; + } + else { + scores.reject[key] = true; + } + + return ''; + }); + + if (leftovers) { + return Boom.badRequest('Invalid accept-' + type + ' header'); + } + } + + // Add identity at the lowest score if not explicitly set + + if (!scores.reject.identity && + !scores.accept.identity) { + + scores.accept.identity = scores.any || 0.001; + } + + return scores; +}; + + +internals.map = function (preferences, scores) { + + var scored = []; + for (var i = 0, il = preferences.length; i < il; ++i) { + var key = preferences[i].toLowerCase(); + if (!scores.reject[key]) { + var score = scores.accept[key] || scores.any; + if (score > 0) { + scored.push({ key: key, score: score }); + } + } + } + + scored.sort(internals.sort); + + var result = []; + for (i = 0, il = scored.length; i < il; ++i) { + result.push(scored[i].key); + } + + return result; +}; + + +internals.sort = function (a, b) { + + return (a.score === b.score ? 0 : (a.score < b.score ? 1 : -1)); +}; diff --git a/node_modules/hapi/node_modules/accept/package.json b/node_modules/hapi/node_modules/accept/package.json new file mode 100755 index 0000000..31d6961 --- /dev/null +++ b/node_modules/hapi/node_modules/accept/package.json @@ -0,0 +1,46 @@ +{ + "name": "accept", + "description": "HTTP Accept-* headers parsing", + "version": "1.0.0", + "repository": { + "type": "git", + "url": "git://github.com/hapijs/accept" + }, + "main": "index", + "keywords": [ + "HTTP", + "header", + "accept", + "accept-encoding" + ], + "engines": { + "node": ">=0.10.32" + }, + "dependencies": { + "boom": "2.x.x", + "hoek": "2.x.x" + }, + "devDependencies": { + "lab": "4.x.x" + }, + "scripts": { + "test": "make test-cov" + }, + "licenses": [ + { + "type": "BSD", + "url": "http://github.com/hapijs/accept/raw/master/LICENSE" + } + ], + "readme": "#accept\n\nHTTP Accept-* headers parsing.\n\n[![Build Status](https://secure.travis-ci.org/hapijs/accept.png)](http://travis-ci.org/hapijs/accept)\n\nLead Maintainer - [Eran Hammer](https://github.com/hueniverse)\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/hapijs/accept/issues" + }, + "_id": "accept@1.0.0", + "dist": { + "shasum": "fc83fcd985a27b0d06d1519c2d92bf38d4653100" + }, + "_from": "accept@1.0.0", + "_resolved": "https://registry.npmjs.org/accept/-/accept-1.0.0.tgz" +} diff --git a/node_modules/hapi/node_modules/accept/test/index.js b/node_modules/hapi/node_modules/accept/test/index.js new file mode 100755 index 0000000..5d63421 --- /dev/null +++ b/node_modules/hapi/node_modules/accept/test/index.js @@ -0,0 +1,166 @@ +// Load modules + +var Accept = require('..'); +var Lab = require('lab'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var describe = lab.describe; +var it = lab.it; +var expect = Lab.expect; + +/* + Accept-Encoding: compress, gzip + Accept-Encoding: + Accept-Encoding: * + Accept-Encoding: compress;q=0.5, gzip;q=1.0 + Accept-Encoding: gzip;q=1.0, identity; q=0.5, *;q=0 +*/ + +describe('encoding()', function () { + + it('parses header', function (done) { + + var accept = Accept.encoding('gzip;q=1.0, identity; q=0.5, *;q=0'); + expect(accept.isBoom).to.not.exist; + expect(accept).to.deep.equal('gzip'); + done(); + }); + + it('parses header with preferences', function (done) { + + var accept = Accept.encoding('gzip;q=1.0, identity; q=0.5, *;q=0', ['identity', 'deflate', 'gzip']); + expect(accept.isBoom).to.not.exist; + expect(accept).to.deep.equal('gzip'); + done(); + }); + + it('parses header with preferences (case insensitive)', function (done) { + + var accept = Accept.encoding('GZIP;q=1.0, identity; q=0.5, *;q=0', ['identity', 'deflate', 'gZip']); + expect(accept.isBoom).to.not.exist; + expect(accept).to.deep.equal('gzip'); + done(); + }); + + it('parses header with preferences (x-)', function (done) { + + var accept = Accept.encoding('x-gzip;q=1.0, identity; q=0.5, *;q=0', ['identity', 'deflate', 'gzip']); + expect(accept.isBoom).to.not.exist; + expect(accept).to.deep.equal('gzip'); + done(); + }); + + it('parses header with preferences (secondary match)', function (done) { + + var accept = Accept.encoding('gzip;q=1.0, identity; q=0.5, *;q=0', ['identity', 'deflate']); + expect(accept.isBoom).to.not.exist; + expect(accept).to.deep.equal('identity'); + done(); + }); + + it('parses header with preferences (no match)', function (done) { + + var accept = Accept.encoding('gzip;q=1.0, identity; q=0.5, *;q=0', ['deflate']); + expect(accept.isBoom).to.not.exist; + expect(accept).to.equal(''); + done(); + }); + + it('returns top preference on *', function (done) { + + var accept = Accept.encoding('*', ['gzip', 'deflate']); + expect(accept.isBoom).to.not.exist; + expect(accept).to.deep.equal('gzip'); + done(); + }); + + it('returns top preference on * (identity)', function (done) { + + var accept = Accept.encoding('*', ['identity', 'gzip', 'deflate']); + expect(accept.isBoom).to.not.exist; + expect(accept).to.deep.equal('identity'); + done(); + }); + + it('returns identity on empty', function (done) { + + var accept = Accept.encoding(''); + expect(accept.isBoom).to.not.exist; + expect(accept).to.deep.equal('identity'); + done(); + }); + + it('returns none on empty with non identity preferences', function (done) { + + var accept = Accept.encoding('', ['gzip', 'deflate']); + expect(accept.isBoom).to.not.exist; + expect(accept).to.deep.equal(''); + done(); + }); + + it('returns identity on undefined', function (done) { + + var accept = Accept.encoding(); + expect(accept.isBoom).to.not.exist; + expect(accept).to.deep.equal('identity'); + done(); + }); + + it('excludes q=0', function (done) { + + var accept = Accept.encoding('compress;q=0.5, gzip;q=0.0', ['gzip', 'compress']); + expect(accept.isBoom).to.not.exist; + expect(accept).to.equal('compress'); + done(); + }); + + it('errors on invalid header', function (done) { + + var accept = Accept.encoding('a;b'); + expect(accept.isBoom).to.exist; + done(); + }); +}); + +describe('encodings()', function () { + + it('parses header', function (done) { + + var accept = Accept.encodings('gzip;q=1.0, identity; q=0.5, *;q=0'); + expect(accept.isBoom).to.not.exist; + expect(accept).to.deep.equal(['gzip', 'identity']); + done(); + }); + + it('parses header (reverse header)', function (done) { + + var accept = Accept.encodings('compress;q=0.5, gzip;q=1.0'); + expect(accept.isBoom).to.not.exist; + expect(accept).to.deep.equal(['gzip', 'compress', 'identity']); + done(); + }); + + it('parses header (exclude encoding)', function (done) { + + var accept = Accept.encodings('compress;q=0.5, gzip;q=0.0'); + expect(accept.isBoom).to.not.exist; + expect(accept).to.deep.equal(['compress', 'identity']); + done(); + }); + + it('parses header (exclude identity)', function (done) { + + var accept = Accept.encodings('compress;q=0.5, gzip;q=1.0, identity;q=0'); + expect(accept.isBoom).to.not.exist; + expect(accept).to.deep.equal(['gzip', 'compress']); + done(); + }); +}); diff --git a/node_modules/hapi/node_modules/ammo/.npmignore b/node_modules/hapi/node_modules/ammo/.npmignore new file mode 100644 index 0000000..7e1574d --- /dev/null +++ b/node_modules/hapi/node_modules/ammo/.npmignore @@ -0,0 +1,18 @@ +.idea +*.iml +npm-debug.log +dump.rdb +node_modules +results.tap +results.xml +npm-shrinkwrap.json +config.json +.DS_Store +*/.DS_Store +*/*/.DS_Store +._* +*/._* +*/*/._* +coverage.* +lib-cov +complexity.md diff --git a/node_modules/hapi/node_modules/ammo/.travis.yml b/node_modules/hapi/node_modules/ammo/.travis.yml new file mode 100755 index 0000000..047f7e3 --- /dev/null +++ b/node_modules/hapi/node_modules/ammo/.travis.yml @@ -0,0 +1,5 @@ +language: node_js + +node_js: + - 0.10 + diff --git a/node_modules/hapi/node_modules/ammo/CONTRIBUTING.md b/node_modules/hapi/node_modules/ammo/CONTRIBUTING.md new file mode 100755 index 0000000..6214c0d --- /dev/null +++ b/node_modules/hapi/node_modules/ammo/CONTRIBUTING.md @@ -0,0 +1,16 @@ +# How to contribute +We welcome contributions from the community and are pleased to have them. Please follow this guide when logging issues or making code changes. + +## Logging Issues +All issues should be created using the [new issue form](https://github.com/hapijs/ammo/issues/new). Clearly describe the issue including steps +to reproduce if there are any. Also, make sure to indicate the earliest version that has the issue being reported. + +## Patching Code + +Code changes are welcome and should follow the guidelines below. + +* Fork the repository on GitHub. +* Fix the issue ensuring that your code follows the [style guide](https://github.com/hapijs/hapi/blob/master/docs/Style.md). +* Add tests for your new code ensuring that you have 100% code coverage (we can help you reach 100% but will not merge without it). + * Run `npm test` to generate a report of test coverage +* [Pull requests](http://help.github.com/send-pull-requests/) should be made to the [master branch](https://github.com/hapijs/ammo/tree/master). diff --git a/node_modules/hapi/node_modules/ammo/LICENSE b/node_modules/hapi/node_modules/ammo/LICENSE new file mode 100755 index 0000000..793b39d --- /dev/null +++ b/node_modules/hapi/node_modules/ammo/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2014, Walmart and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/ammo/graphs/contributors diff --git a/node_modules/hapi/node_modules/ammo/Makefile b/node_modules/hapi/node_modules/ammo/Makefile new file mode 100755 index 0000000..83aaf0c --- /dev/null +++ b/node_modules/hapi/node_modules/ammo/Makefile @@ -0,0 +1,8 @@ +test: + @node node_modules/lab/bin/lab -a code +test-cov: + @node node_modules/lab/bin/lab -a code -t 100 -L +test-cov-html: + @node node_modules/lab/bin/lab -a code -r html -o coverage.html + +.PHONY: test test-cov test-cov-html diff --git a/node_modules/hapi/node_modules/ammo/README.md b/node_modules/hapi/node_modules/ammo/README.md new file mode 100644 index 0000000..0a1bfec --- /dev/null +++ b/node_modules/hapi/node_modules/ammo/README.md @@ -0,0 +1,7 @@ +#ammo + +HTTP Range processing utilities. + +[![Build Status](https://secure.travis-ci.org/hapijs/ammo.png)](http://travis-ci.org/hapijs/ammo) + +Lead Maintainer - [Eran Hammer](https://github.com/hueniverse) diff --git a/node_modules/hapi/node_modules/ammo/index.js b/node_modules/hapi/node_modules/ammo/index.js new file mode 100755 index 0000000..bb0a047 --- /dev/null +++ b/node_modules/hapi/node_modules/ammo/index.js @@ -0,0 +1 @@ +module.exports = require('./lib'); diff --git a/node_modules/hapi/node_modules/ammo/lib/index.js b/node_modules/hapi/node_modules/ammo/lib/index.js new file mode 100755 index 0000000..b5ce4ef --- /dev/null +++ b/node_modules/hapi/node_modules/ammo/lib/index.js @@ -0,0 +1,121 @@ +// Load modules + +var Stream = require('stream'); +var Hoek = require('hoek'); + + +// Declare internals + +var internals = {}; + + +exports.header = function (header, length) { + + // Parse header + + var parts = header.split('='); + if (parts.length !== 2 || + parts[0] !== 'bytes') { + + return null; + } + + var lastPos = length - 1; + + var result = []; + var ranges = parts[1].match(/\d*\-\d*/g); + for (var i = 0, il = ranges.length; i < il; ++i) { + var range = ranges[i]; + if (range.length === 1) { // '-' + return null; + } + + var set = {}; + range = range.split('-'); + if (range[0]) { + set.from = parseInt(range[0], 10); + } + + if (range[1]) { + set.to = parseInt(range[1], 10); + if (set.from !== undefined) { // Can be 0 + // From-To + if (set.to > lastPos) { + set.to = lastPos; + } + } + else { + // -To + set.from = length - set.to; + set.to = lastPos; + } + } + else { + // From- + set.to = lastPos; + } + + if (set.from > set.to) { + return null; + } + + result.push(set); + } + + if (result.length === 1) { + return result; + } + + // Sort and consolidate ranges + + result.sort(function (a, b) { + + return a.from - b.from; + }); + + var consolidated = []; + for (i = result.length - 1; i > 0; --i) { + var current = result[i]; + var before = result[i - 1]; + if (current.from <= before.to + 1) { + before.to = current.to; + } + else { + consolidated.unshift(current); + } + } + + consolidated.unshift(result[0]); + + return consolidated; +}; + + +exports.Stream = internals.Stream = function (range) { + + Stream.Transform.call(this); + + this._range = range; + this._next = 0; +}; + +Hoek.inherits(internals.Stream, Stream.Transform); + + +internals.Stream.prototype._transform = function (chunk, encoding, done) { + + var pos = this._next; + this._next += chunk.length; + + if (this._next <= this._range.from || // Before range + pos > this._range.to) { // After range + + return done(); + } + + var from = Math.max(0, this._range.from - pos); + var to = Math.min(chunk.length, this._range.to - pos + 1); + + this.push(chunk.slice(from, to)); + return done(); +}; diff --git a/node_modules/hapi/node_modules/ammo/package.json b/node_modules/hapi/node_modules/ammo/package.json new file mode 100755 index 0000000..8cdc74a --- /dev/null +++ b/node_modules/hapi/node_modules/ammo/package.json @@ -0,0 +1,47 @@ +{ + "name": "ammo", + "description": "HTTP Range processing utilities", + "version": "1.0.0", + "repository": { + "type": "git", + "url": "git://github.com/hapijs/ammo" + }, + "main": "index", + "keywords": [ + "http", + "range", + "utilities" + ], + "engines": { + "node": ">=0.10.32" + }, + "dependencies": { + "boom": "2.x.x", + "hoek": "2.x.x" + }, + "devDependencies": { + "code": "1.x.x", + "lab": "5.x.x", + "wreck": "5.x.x" + }, + "scripts": { + "test": "make test-cov" + }, + "licenses": [ + { + "type": "BSD", + "url": "http://github.com/hapijs/ammo/raw/master/LICENSE" + } + ], + "readme": "#ammo\n\nHTTP Range processing utilities.\n\n[![Build Status](https://secure.travis-ci.org/hapijs/ammo.png)](http://travis-ci.org/hapijs/ammo)\n\nLead Maintainer - [Eran Hammer](https://github.com/hueniverse)\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/hapijs/ammo/issues" + }, + "_id": "ammo@1.0.0", + "dist": { + "shasum": "a55ae39d5f2f078a0e0b65dd9d51f78809af8836" + }, + "_from": "ammo@1.0.0", + "_resolved": "https://registry.npmjs.org/ammo/-/ammo-1.0.0.tgz" +} diff --git a/node_modules/hapi/node_modules/ammo/test/index.js b/node_modules/hapi/node_modules/ammo/test/index.js new file mode 100755 index 0000000..b6de738 --- /dev/null +++ b/node_modules/hapi/node_modules/ammo/test/index.js @@ -0,0 +1,145 @@ +// Load modules + +var Stream = require('stream'); +var Ammo = require('..'); +var Code = require('code'); +var Hoek = require('hoek'); +var Lab = require('lab'); +var Wreck = require('wreck'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('header()', function () { + + it('parses header (start)', function (done) { + + expect(Ammo.header('bytes=0-4', 10)).to.deep.equal([{ from: 0, to: 4 }]); + done(); + }); + + it('parses header (middle)', function (done) { + + expect(Ammo.header('bytes=1-5', 10)).to.deep.equal([{ from: 1, to: 5 }]); + done(); + }); + + it('parses header (-to)', function (done) { + + expect(Ammo.header('bytes=-5', 10)).to.deep.equal([{ from: 5, to: 9 }]); + done(); + }); + + it('parses header (from-)', function (done) { + + expect(Ammo.header('bytes=5-', 45000)).to.deep.equal([{ from: 5, to: 44999 }]); + done(); + }); + + it('parses header (beyond end)', function (done) { + + expect(Ammo.header('bytes=10-20', 15)).to.deep.equal([{ from: 10, to: 14 }]); + done(); + }); + + it('parses header (wrong unit)', function (done) { + + expect(Ammo.header('horses=1-5', 10)).to.equal(null); + done(); + }); + + it('parses header (flipped)', function (done) { + + expect(Ammo.header('bytes=5-1', 10)).to.equal(null); + done(); + }); + + it('parses header (missing =)', function (done) { + + expect(Ammo.header('bytes 1-5', 10)).to.equal(null); + done(); + }); + + it('parses header (missing to and from)', function (done) { + + expect(Ammo.header('bytes=-', 10)).to.equal(null); + done(); + }); + + it('parses header (multiple ranges)', function (done) { + + expect(Ammo.header('bytes=1-5,7-10', 10)).to.deep.equal([{ from: 1, to: 5 }, { from: 7, to: 9 }]); + done(); + }); + + it('parses header (overlapping ranges)', function (done) { + + expect(Ammo.header('bytes=1-5,5-10', 10)).to.deep.equal([{ from: 1, to: 9 }]); + done(); + }); +}); + +describe('Stream', function () { + + it('returns a subset of a stream', function (done) { + + var random = new Buffer(5000); + var source = Wreck.toReadableStream(random); + var range = Ammo.header('bytes=1000-4000', 5000); + var stream = new Ammo.Stream(range[0]); + + Wreck.read(source.pipe(stream), {}, function (err, buffer) { + + expect(buffer.toString()).to.equal(random.slice(1000, 4001).toString()); + done(); + }); + }); + + it('processes multiple chunks', function (done) { + + var TestStream = function () { + + Stream.Readable.call(this); + this._count = -1; + }; + + Hoek.inherits(TestStream, Stream.Readable); + + TestStream.prototype._read = function (size) { + + this._count++; + + if (this._count > 10) { + return; + } + + if (this._count === 10) { + this.push(null); + return; + } + + this.push(this._count.toString()); + }; + + var range = Ammo.header('bytes=2-4', 10); + var stream = new Ammo.Stream(range[0]); + + var source = new TestStream(); + Wreck.read(source.pipe(stream), {}, function (err, buffer) { + + expect(buffer.toString()).to.equal('234'); + done(); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/boom/.npmignore b/node_modules/hapi/node_modules/boom/.npmignore new file mode 100644 index 0000000..77ba16c --- /dev/null +++ b/node_modules/hapi/node_modules/boom/.npmignore @@ -0,0 +1,18 @@ +.idea +*.iml +npm-debug.log +dump.rdb +node_modules +results.tap +results.xml +npm-shrinkwrap.json +config.json +.DS_Store +*/.DS_Store +*/*/.DS_Store +._* +*/._* +*/*/._* +coverage.* +lib-cov + diff --git a/node_modules/hapi/node_modules/boom/.travis.yml b/node_modules/hapi/node_modules/boom/.travis.yml new file mode 100755 index 0000000..047f7e3 --- /dev/null +++ b/node_modules/hapi/node_modules/boom/.travis.yml @@ -0,0 +1,5 @@ +language: node_js + +node_js: + - 0.10 + diff --git a/node_modules/hapi/node_modules/boom/CONTRIBUTING.md b/node_modules/hapi/node_modules/boom/CONTRIBUTING.md new file mode 100644 index 0000000..8928361 --- /dev/null +++ b/node_modules/hapi/node_modules/boom/CONTRIBUTING.md @@ -0,0 +1 @@ +Please view our [hapijs contributing guide](https://github.com/hapijs/hapi/blob/master/CONTRIBUTING.md). diff --git a/node_modules/hapi/node_modules/boom/LICENSE b/node_modules/hapi/node_modules/boom/LICENSE new file mode 100755 index 0000000..3946889 --- /dev/null +++ b/node_modules/hapi/node_modules/boom/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2012-2014, Walmart and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/boom/graphs/contributors \ No newline at end of file diff --git a/node_modules/hapi/node_modules/boom/Makefile b/node_modules/hapi/node_modules/boom/Makefile new file mode 100755 index 0000000..07a7f67 --- /dev/null +++ b/node_modules/hapi/node_modules/boom/Makefile @@ -0,0 +1,9 @@ +test: + @node node_modules/lab/bin/lab -a code +test-cov: + @node node_modules/lab/bin/lab -a code -t 100 +test-cov-html: + @node node_modules/lab/bin/lab -a code -r html -o coverage.html + +.PHONY: test test-cov test-cov-html + diff --git a/node_modules/hapi/node_modules/boom/README.md b/node_modules/hapi/node_modules/boom/README.md new file mode 100755 index 0000000..c6ada26 --- /dev/null +++ b/node_modules/hapi/node_modules/boom/README.md @@ -0,0 +1,575 @@ +![boom Logo](https://raw.github.com/hapijs/boom/master/images/boom.png) + +HTTP-friendly error objects + +[![Build Status](https://secure.travis-ci.org/hapijs/boom.png)](http://travis-ci.org/hapijs/boom) + +Lead Maintainer: [Adam Bretz](https://github.com/arb) + +**boom** provides a set of utilities for returning HTTP errors. Each utility returns a `Boom` error response +object (instance of `Error`) which includes the following properties: +- `isBoom` - if `true`, indicates this is a `Boom` object instance. +- `message` - the error message. +- `output` - the formatted response. Can be directly manipulated after object construction to return a custom + error response. Allowed root keys: + - `statusCode` - the HTTP status code (typically 4xx or 5xx). + - `headers` - an object containing any HTTP headers where each key is a header name and value is the header content. + - `payload` - the formatted object used as the response payload (stringified). Can be directly manipulated but any + changes will be lost + if `reformat()` is called. Any content allowed and by default includes the following content: + - `statusCode` - the HTTP status code, derived from `error.output.statusCode`. + - `error` - the HTTP status message (e.g. 'Bad Request', 'Internal Server Error') derived from `statusCode`. + - `message` - the error message derived from `error.message`. +- inherited `Error` properties. + +The `Boom` object also supports the following method: +- `reformat()` - rebuilds `error.output` using the other object properties. + +## Helper Methods + +### `wrap(error, [statusCode], [message])` + +Decorates an error with the **boom** properties where: +- `error` - the error object to wrap. If `error` is already a **boom** object, returns back the same object. +- `statusCode` - optional HTTP status code. Defaults to `500`. +- `message` - optional message string. If the error already has a message, it adds the message as a prefix. + Defaults to no message. + +```js +var error = new Error('Unexpected input'); +Boom.wrap(error, 400); +``` + +### `create(statusCode, [message], [data])` + +Generates an `Error` object with the **boom** decorations where: +- `statusCode` - an HTTP error code number. Must be greater or equal 400. +- `message` - optional message string. +- `data` - additional error data set to `error.data` property. + +```js +var error = Boom.create(400, 'Bad request', { timestamp: Date.now() }); +``` + +## HTTP 4xx Errors + +### `Boom.badRequest([message], [data])` + +Returns a 400 Bad Request error where: +- `message` - optional message. +- `data` - optional additional error data. + +```js +Boom.badRequest('invalid query'); +``` + +Generates the following response payload: + +```json +{ + "statusCode": 400, + "error": "Bad Request", + "message": "invalid query" +} +``` + +### `Boom.unauthorized([message], [scheme], [attributes])` + +Returns a 401 Unauthorized error where: +- `message` - optional message. +- `scheme` can be one of the following: + - an authentication scheme name + - an array of string values. These values will be separated by ', ' and set to the 'WWW-Authenticate' header. +- `attributes` - an object of values to use while setting the 'WWW-Authenticate' header. This value is only used when `schema` is a string, otherwise it is ignored. Every key/value pair will be included in the 'WWW-Authenticate' in the format of 'key="value"'. `null` and `undefined` will be replaced with an empty string. If `attributes` is set, `message` will be used as the 'error' segment of the 'WWW-Authenticate' header. If `message` is unset, the 'error' segment of the header will not be present and `isMissing` will be true on the error object. + +If either `scheme` or `attributes` are set, the resultant `Boom` object will have the 'WWW-Authenticate' header set for the response. + +```js +Boom.unauthorized('invalid password'); +``` + +Generates the following response: + +```json +"payload": { + "statusCode": 401, + "error": "Unauthorized", + "message": "invalid password" +}, +"headers" {} +``` + +```js +Boom.unauthorized('invalid password', 'sample'); +``` + +Generates the following response: + +```json +"payload": { + "statusCode": 401, + "error": "Unauthorized", + "message": "invalid password" +}, +"headers" { + "WWW-Authenticate": "sample error=\"invalid password\"" +} +``` + +```js +Boom.unauthorized('invalid password', 'sample', { ttl: 0, cache: null, foo: 'bar' }); +``` + +Generates the following response: + +```json +"payload": { + "statusCode": 401, + "error": "Unauthorized", + "message": "invalid password" +}, +"headers" { + "WWW-Authenticate": "sample ttl=\"0\", cache=\"\", foo=\"bar\", error=\"invalid password\"" +} +``` + +### `Boom.forbidden([message], [data])` + +Returns a 403 Forbidden error where: +- `message` - optional message. +- `data` - optional additional error data. + +```js +Boom.forbidden('try again some time'); +``` + +Generates the following response payload: + +```json +{ + "statusCode": 403, + "error": "Forbidden", + "message": "try again some time" +} +``` + +### `Boom.notFound([message], [data])` + +Returns a 404 Not Found error where: +- `message` - optional message. +- `data` - optional additional error data. + +```js +Boom.notFound('missing'); +``` + +Generates the following response payload: + +```json +{ + "statusCode": 404, + "error": "Not Found", + "message": "missing" +} +``` + +### `Boom.methodNotAllowed([message], [data])` + +Returns a 405 Method Not Allowed error where: +- `message` - optional message. +- `data` - optional additional error data. + +```js +Boom.methodNotAllowed('that method is not allowed'); +``` + +Generates the following response payload: + +```json +{ + "statusCode": 405, + "error": "Method Not Allowed", + "message": "that method is not allowed" +} +``` + +### `Boom.notAcceptable([message], [data])` + +Returns a 406 Not Acceptable error where: +- `message` - optional message. +- `data` - optional additional error data. + +```js +Boom.notAcceptable('unacceptable'); +``` + +Generates the following response payload: + +```json +{ + "statusCode": 406, + "error": "Not Acceptable", + "message": "unacceptable" +} +``` + +### `Boom.proxyAuthRequired([message], [data])` + +Returns a 407 Proxy Authentication Required error where: +- `message` - optional message. +- `data` - optional additional error data. + +```js +Boom.proxyAuthRequired('auth missing'); +``` + +Generates the following response payload: + +```json +{ + "statusCode": 407, + "error": "Proxy Authentication Required", + "message": "auth missing" +} +``` + +### `Boom.clientTimeout([message], [data])` + +Returns a 408 Request Time-out error where: +- `message` - optional message. +- `data` - optional additional error data. + +```js +Boom.clientTimeout('timed out'); +``` + +Generates the following response payload: + +```json +{ + "statusCode": 408, + "error": "Request Time-out", + "message": "timed out" +} +``` + +### `Boom.conflict([message], [data])` + +Returns a 409 Conflict error where: +- `message` - optional message. +- `data` - optional additional error data. + +```js +Boom.conflict('there was a conflict'); +``` + +Generates the following response payload: + +```json +{ + "statusCode": 409, + "error": "Conflict", + "message": "there was a conflict" +} +``` + +### `Boom.resourceGone([message], [data])` + +Returns a 410 Gone error where: +- `message` - optional message. +- `data` - optional additional error data. + +```js +Boom.resourceGone('it is gone'); +``` + +Generates the following response payload: + +```json +{ + "statusCode": 410, + "error": "Gone", + "message": "it is gone" +} +``` + +### `Boom.lengthRequired([message], [data])` + +Returns a 411 Length Required error where: +- `message` - optional message. +- `data` - optional additional error data. + +```js +Boom.lengthRequired('length needed'); +``` + +Generates the following response payload: + +```json +{ + "statusCode": 411, + "error": "Length Required", + "message": "length needed" +} +``` + +### `Boom.preconditionFailed([message], [data])` + +Returns a 412 Precondition Failed error where: +- `message` - optional message. +- `data` - optional additional error data. + +```js +Boom.preconditionFailed(); +``` + +Generates the following response payload: + +```json +{ + "statusCode": 412, + "error": "Precondition Failed" +} +``` + +### `Boom.entityTooLarge([message], [data])` + +Returns a 413 Request Entity Too Large error where: +- `message` - optional message. +- `data` - optional additional error data. + +```js +Boom.entityTooLarge('too big'); +``` + +Generates the following response payload: + +```json +{ + "statusCode": 413, + "error": "Request Entity Too Large", + "message": "too big" +} +``` + +### `Boom.uriTooLong([message], [data])` + +Returns a 414 Request-URI Too Large error where: +- `message` - optional message. +- `data` - optional additional error data. + +```js +Boom.uriTooLong('uri is too long'); +``` + +Generates the following response payload: + +```json +{ + "statusCode": 414, + "error": "Request-URI Too Large", + "message": "uri is too long" +} +``` + +### `Boom.unsupportedMediaType([message], [data])` + +Returns a 415 Unsupported Media Type error where: +- `message` - optional message. +- `data` - optional additional error data. + +```js +Boom.unsupportedMediaType('that media is not supported'); +``` + +Generates the following response payload: + +```json +{ + "statusCode": 415, + "error": "Unsupported Media Type", + "message": "that media is not supported" +} +``` + +### `Boom.rangeNotSatisfiable([message], [data])` + +Returns a 416 Requested Range Not Satisfiable error where: +- `message` - optional message. +- `data` - optional additional error data. + +```js +Boom.rangeNotSatisfiable(); +``` + +Generates the following response payload: + +```json +{ + "statusCode": 416, + "error": "Requested Range Not Satisfiable" +} +``` + +### `Boom.expectationFailed([message], [data])` + +Returns a 417 Expectation Failed error where: +- `message` - optional message. +- `data` - optional additional error data. + +```js +Boom.expectationFailed('expected this to work'); +``` + +Generates the following response payload: + +```json +{ + "statusCode": 417, + "error": "Expectation Failed", + "message": "expected this to work" +} +``` + +### `Boom.badData([message], [data])` + +Returns a 422 Unprocessable Entity error where: +- `message` - optional message. +- `data` - optional additional error data. + +```js +Boom.badData('your data is bad and you should feel bad'); +``` + +Generates the following response payload: + +```json +{ + "statusCode": 422, + "error": "Unprocessable Entity", + "message": "your data is bad and you should feel bad" +} +``` + +### `Boom.tooManyRequests([message], [data])` + +Returns a 422 Too Many Requests error where: +- `message` - optional message. +- `data` - optional additional error data. + +```js +Boom.tooManyRequests('you have exceeded your request limit'); +``` + +Generates the following response payload: + +```json +{ + "statusCode": 429, + "error": "Too Many Requests", + "message": "you have exceeded your request limit" +} +``` + +## HTTP 5xx Errors + +All 500 errors hide your message from the end user. Your message is recorded in the server log. + +### `Boom.notImplemented([message], [data])` + +Returns a 501 Not Implemented error where: +- `message` - optional message. +- `data` - optional additional error data. + +```js +Boom.notImplemented('method not implemented'); +``` + +Generates the following response payload: + +```json +{ + "statusCode": 501, + "error": "Not Implemented", + "message": "method not implemented" +} +``` + +### `Boom.badGateway([message], [data])` + +Returns a 502 Bad Gateway error where: +- `message` - optional message. +- `data` - optional additional error data. + +```js +Boom.badGateway('that is a bad gateway'); +``` + +Generates the following response payload: + +```json +{ + "statusCode": 502, + "error": "Bad Gateway", + "message": "that is a bad gateway" +} +``` + +### `Boom.serverTimeout([message], [data])` + +Returns a 503 Service Unavailable error where: +- `message` - optional message. +- `data` - optional additional error data. + +```js +Boom.serverTimeout('unavailable'); +``` + +Generates the following response payload: + +```json +{ + "statusCode": 503, + "error": "Service Unavailable", + "message": "unavailable" +} +``` + +### `Boom.gatewayTimeout([message], [data])` + +Returns a 504 Gateway Time-out error where: +- `message` - optional message. +- `data` - optional additional error data. + +```js +Boom.gatewayTimeout(); +``` + +Generates the following response payload: + +```json +{ + "statusCode": 504, + "error": "Gateway Time-out" +} +``` + +### `Boom.badImplementation([message], [data])` + +Returns a 500 Internal Server Error error where: +- `message` - optional message. +- `data` - optional additional error data. + +```js +Boom.badImplementation('terrible implementation'); +``` + +Generates the following response payload: + +```json +{ + "statusCode": 500, + "error": "Internal Server Error", + "message": "An internal server error occurred" +} +``` diff --git a/node_modules/hapi/node_modules/boom/images/boom.png b/node_modules/hapi/node_modules/boom/images/boom.png new file mode 100755 index 0000000000000000000000000000000000000000..373bc13455bc0a71a6a4538158aee59c6994b761 GIT binary patch literal 29479 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 400, 'First argument must be a number (400+):', statusCode); + + error.isBoom = true; + + if (!error.hasOwnProperty('data')) { + error.data = null; + } + + error.output = { + statusCode: statusCode, + payload: {}, + headers: {} + }; + + error.reformat = internals.reformat; + error.reformat(); + + if (!message && + !error.message) { + + message = error.output.payload.error; + } + + if (message) { + error.message = (message + (error.message ? ': ' + error.message : '')); + } + + return error; +}; + + +internals.reformat = function () { + + this.output.payload.statusCode = this.output.statusCode; + this.output.payload.error = Http.STATUS_CODES[this.output.statusCode] || 'Unknown'; + + if (this.output.statusCode === 500) { + this.output.payload.message = 'An internal server error occurred'; // Hide actual error from user + } + else if (this.message) { + this.output.payload.message = this.message; + } +}; + + +// 4xx Client Errors + +exports.badRequest = function (message, data) { + + return exports.create(400, message, data); +}; + + +exports.unauthorized = function (message, scheme, attributes) { // Or function (message, wwwAuthenticate[]) + + var err = exports.create(401, message); + + if (!scheme) { + return err; + } + + var wwwAuthenticate = ''; + var i = 0; + var il = 0; + + if (typeof scheme === 'string') { + + // function (message, scheme, attributes) + + wwwAuthenticate = scheme; + if (attributes) { + var names = Object.keys(attributes); + for (i = 0, il = names.length; i < il; ++i) { + if (i) { + wwwAuthenticate += ','; + } + + var value = attributes[names[i]]; + if (value === null || + value === undefined) { // Value can be zero + + value = ''; + } + wwwAuthenticate += ' ' + names[i] + '="' + Hoek.escapeHeaderAttribute(value.toString()) + '"'; + } + } + + if (message) { + if (attributes) { + wwwAuthenticate += ','; + } + wwwAuthenticate += ' error="' + Hoek.escapeHeaderAttribute(message) + '"'; + } + else { + err.isMissing = true; + } + } + else { + + // function (message, wwwAuthenticate[]) + + var wwwArray = scheme; + for (i = 0, il = wwwArray.length; i < il; ++i) { + if (i) { + wwwAuthenticate += ', '; + } + + wwwAuthenticate += wwwArray[i]; + } + } + + err.output.headers['WWW-Authenticate'] = wwwAuthenticate; + + return err; +}; + + +exports.forbidden = function (message, data) { + + return exports.create(403, message, data); +}; + + +exports.notFound = function (message, data) { + + return exports.create(404, message, data); +}; + + +exports.methodNotAllowed = function (message, data) { + + return exports.create(405, message, data); +}; + + +exports.notAcceptable = function (message, data) { + + return exports.create(406, message, data); +}; + + +exports.proxyAuthRequired = function (message, data) { + + return exports.create(407, message, data); +}; + + +exports.clientTimeout = function (message, data) { + + return exports.create(408, message, data); +}; + + +exports.conflict = function (message, data) { + + return exports.create(409, message, data); +}; + + +exports.resourceGone = function (message, data) { + + return exports.create(410, message, data); +}; + + +exports.lengthRequired = function (message, data) { + + return exports.create(411, message, data); +}; + + +exports.preconditionFailed = function (message, data) { + + return exports.create(412, message, data); +}; + + +exports.entityTooLarge = function (message, data) { + + return exports.create(413, message, data); +}; + + +exports.uriTooLong = function (message, data) { + + return exports.create(414, message, data); +}; + + +exports.unsupportedMediaType = function (message, data) { + + return exports.create(415, message, data); +}; + + +exports.rangeNotSatisfiable = function (message, data) { + + return exports.create(416, message, data); +}; + + +exports.expectationFailed = function (message, data) { + + return exports.create(417, message, data); +}; + +exports.badData = function (message, data) { + + return exports.create(422, message, data); +}; + + +exports.tooManyRequests = function (message, data) { + + return exports.create(429, message, data); +}; + + +// 5xx Server Errors + +exports.internal = function (message, data, statusCode) { + + var error = (data instanceof Error ? exports.wrap(data, statusCode, message) : exports.create(statusCode || 500, message)); + + if (data instanceof Error === false) { + error.data = data; + } + + return error; +}; + + +exports.notImplemented = function (message, data) { + + return exports.internal(message, data, 501); +}; + + +exports.badGateway = function (message, data) { + + return exports.internal(message, data, 502); +}; + + +exports.serverTimeout = function (message, data) { + + return exports.internal(message, data, 503); +}; + + +exports.gatewayTimeout = function (message, data) { + + return exports.internal(message, data, 504); +}; + + +exports.badImplementation = function (message, data) { + + var err = exports.internal(message, data, 500); + err.isDeveloperError = true; + return err; +}; + diff --git a/node_modules/hapi/node_modules/boom/package.json b/node_modules/hapi/node_modules/boom/package.json new file mode 100755 index 0000000..16e9f7a --- /dev/null +++ b/node_modules/hapi/node_modules/boom/package.json @@ -0,0 +1,44 @@ +{ + "name": "boom", + "description": "HTTP-friendly error objects", + "version": "2.6.1", + "repository": { + "type": "git", + "url": "git://github.com/hapijs/boom" + }, + "main": "index", + "keywords": [ + "error", + "http" + ], + "engines": { + "node": ">=0.8.0" + }, + "dependencies": { + "hoek": "2.x.x" + }, + "devDependencies": { + "code": "1.x.x", + "lab": "5.x.x" + }, + "scripts": { + "test": "make test-cov" + }, + "licenses": [ + { + "type": "BSD", + "url": "http://github.com/hapijs/boom/raw/master/LICENSE" + } + ], + "readme": "![boom Logo](https://raw.github.com/hapijs/boom/master/images/boom.png)\n\nHTTP-friendly error objects\n\n[![Build Status](https://secure.travis-ci.org/hapijs/boom.png)](http://travis-ci.org/hapijs/boom)\n\nLead Maintainer: [Adam Bretz](https://github.com/arb)\n\n**boom** provides a set of utilities for returning HTTP errors. Each utility returns a `Boom` error response\nobject (instance of `Error`) which includes the following properties:\n- `isBoom` - if `true`, indicates this is a `Boom` object instance.\n- `message` - the error message.\n- `output` - the formatted response. Can be directly manipulated after object construction to return a custom\n error response. Allowed root keys:\n - `statusCode` - the HTTP status code (typically 4xx or 5xx).\n - `headers` - an object containing any HTTP headers where each key is a header name and value is the header content.\n - `payload` - the formatted object used as the response payload (stringified). Can be directly manipulated but any\n changes will be lost\n if `reformat()` is called. Any content allowed and by default includes the following content:\n - `statusCode` - the HTTP status code, derived from `error.output.statusCode`.\n - `error` - the HTTP status message (e.g. 'Bad Request', 'Internal Server Error') derived from `statusCode`.\n - `message` - the error message derived from `error.message`.\n- inherited `Error` properties.\n\nThe `Boom` object also supports the following method:\n- `reformat()` - rebuilds `error.output` using the other object properties.\n\n## Helper Methods\n\n### `wrap(error, [statusCode], [message])`\n\nDecorates an error with the **boom** properties where:\n- `error` - the error object to wrap. If `error` is already a **boom** object, returns back the same object.\n- `statusCode` - optional HTTP status code. Defaults to `500`.\n- `message` - optional message string. If the error already has a message, it adds the message as a prefix.\n Defaults to no message.\n\n```js\nvar error = new Error('Unexpected input');\nBoom.wrap(error, 400);\n```\n\n### `create(statusCode, [message], [data])`\n\nGenerates an `Error` object with the **boom** decorations where:\n- `statusCode` - an HTTP error code number. Must be greater or equal 400.\n- `message` - optional message string.\n- `data` - additional error data set to `error.data` property.\n\n```js\nvar error = Boom.create(400, 'Bad request', { timestamp: Date.now() });\n```\n\n## HTTP 4xx Errors\n\n### `Boom.badRequest([message], [data])`\n\nReturns a 400 Bad Request error where:\n- `message` - optional message.\n- `data` - optional additional error data.\n\n```js\nBoom.badRequest('invalid query');\n```\n\nGenerates the following response payload:\n\n```json\n{\n \"statusCode\": 400,\n \"error\": \"Bad Request\",\n \"message\": \"invalid query\"\n}\n```\n\n### `Boom.unauthorized([message], [scheme], [attributes])`\n\nReturns a 401 Unauthorized error where:\n- `message` - optional message.\n- `scheme` can be one of the following:\n - an authentication scheme name\n - an array of string values. These values will be separated by ', ' and set to the 'WWW-Authenticate' header.\n- `attributes` - an object of values to use while setting the 'WWW-Authenticate' header. This value is only used when `schema` is a string, otherwise it is ignored. Every key/value pair will be included in the 'WWW-Authenticate' in the format of 'key=\"value\"'. `null` and `undefined` will be replaced with an empty string. If `attributes` is set, `message` will be used as the 'error' segment of the 'WWW-Authenticate' header. If `message` is unset, the 'error' segment of the header will not be present and `isMissing` will be true on the error object.\n\nIf either `scheme` or `attributes` are set, the resultant `Boom` object will have the 'WWW-Authenticate' header set for the response.\n\n```js\nBoom.unauthorized('invalid password');\n```\n\nGenerates the following response:\n\n```json\n\"payload\": {\n \"statusCode\": 401,\n \"error\": \"Unauthorized\",\n \"message\": \"invalid password\"\n},\n\"headers\" {}\n```\n\n```js\nBoom.unauthorized('invalid password', 'sample');\n```\n\nGenerates the following response:\n\n```json\n\"payload\": {\n \"statusCode\": 401,\n \"error\": \"Unauthorized\",\n \"message\": \"invalid password\"\n},\n\"headers\" {\n \"WWW-Authenticate\": \"sample error=\\\"invalid password\\\"\"\n}\n```\n\n```js\nBoom.unauthorized('invalid password', 'sample', { ttl: 0, cache: null, foo: 'bar' });\n```\n\nGenerates the following response:\n\n```json\n\"payload\": {\n \"statusCode\": 401,\n \"error\": \"Unauthorized\",\n \"message\": \"invalid password\"\n},\n\"headers\" {\n \"WWW-Authenticate\": \"sample ttl=\\\"0\\\", cache=\\\"\\\", foo=\\\"bar\\\", error=\\\"invalid password\\\"\"\n}\n```\n\n### `Boom.forbidden([message], [data])`\n\nReturns a 403 Forbidden error where:\n- `message` - optional message.\n- `data` - optional additional error data.\n\n```js\nBoom.forbidden('try again some time');\n```\n\nGenerates the following response payload:\n\n```json\n{\n \"statusCode\": 403,\n \"error\": \"Forbidden\",\n \"message\": \"try again some time\"\n}\n```\n\n### `Boom.notFound([message], [data])`\n\nReturns a 404 Not Found error where:\n- `message` - optional message.\n- `data` - optional additional error data.\n\n```js\nBoom.notFound('missing');\n```\n\nGenerates the following response payload:\n\n```json\n{\n \"statusCode\": 404,\n \"error\": \"Not Found\",\n \"message\": \"missing\"\n}\n```\n\n### `Boom.methodNotAllowed([message], [data])`\n\nReturns a 405 Method Not Allowed error where:\n- `message` - optional message.\n- `data` - optional additional error data.\n\n```js\nBoom.methodNotAllowed('that method is not allowed');\n```\n\nGenerates the following response payload:\n\n```json\n{\n \"statusCode\": 405,\n \"error\": \"Method Not Allowed\",\n \"message\": \"that method is not allowed\"\n}\n```\n\n### `Boom.notAcceptable([message], [data])`\n\nReturns a 406 Not Acceptable error where:\n- `message` - optional message.\n- `data` - optional additional error data.\n\n```js\nBoom.notAcceptable('unacceptable');\n```\n\nGenerates the following response payload:\n\n```json\n{\n \"statusCode\": 406,\n \"error\": \"Not Acceptable\",\n \"message\": \"unacceptable\"\n}\n```\n\n### `Boom.proxyAuthRequired([message], [data])`\n\nReturns a 407 Proxy Authentication Required error where:\n- `message` - optional message.\n- `data` - optional additional error data.\n\n```js\nBoom.proxyAuthRequired('auth missing');\n```\n\nGenerates the following response payload:\n\n```json\n{\n \"statusCode\": 407,\n \"error\": \"Proxy Authentication Required\",\n \"message\": \"auth missing\"\n}\n```\n\n### `Boom.clientTimeout([message], [data])`\n\nReturns a 408 Request Time-out error where:\n- `message` - optional message.\n- `data` - optional additional error data.\n\n```js\nBoom.clientTimeout('timed out');\n```\n\nGenerates the following response payload:\n\n```json\n{\n \"statusCode\": 408,\n \"error\": \"Request Time-out\",\n \"message\": \"timed out\"\n}\n```\n\n### `Boom.conflict([message], [data])`\n\nReturns a 409 Conflict error where:\n- `message` - optional message.\n- `data` - optional additional error data.\n\n```js\nBoom.conflict('there was a conflict');\n```\n\nGenerates the following response payload:\n\n```json\n{\n \"statusCode\": 409,\n \"error\": \"Conflict\",\n \"message\": \"there was a conflict\"\n}\n```\n\n### `Boom.resourceGone([message], [data])`\n\nReturns a 410 Gone error where:\n- `message` - optional message.\n- `data` - optional additional error data.\n\n```js\nBoom.resourceGone('it is gone');\n```\n\nGenerates the following response payload:\n\n```json\n{\n \"statusCode\": 410,\n \"error\": \"Gone\",\n \"message\": \"it is gone\"\n}\n```\n\n### `Boom.lengthRequired([message], [data])`\n\nReturns a 411 Length Required error where:\n- `message` - optional message.\n- `data` - optional additional error data.\n\n```js\nBoom.lengthRequired('length needed');\n```\n\nGenerates the following response payload:\n\n```json\n{\n \"statusCode\": 411,\n \"error\": \"Length Required\",\n \"message\": \"length needed\"\n}\n```\n\n### `Boom.preconditionFailed([message], [data])`\n\nReturns a 412 Precondition Failed error where:\n- `message` - optional message.\n- `data` - optional additional error data.\n\n```js\nBoom.preconditionFailed();\n```\n\nGenerates the following response payload:\n\n```json\n{\n \"statusCode\": 412,\n \"error\": \"Precondition Failed\"\n}\n```\n\n### `Boom.entityTooLarge([message], [data])`\n\nReturns a 413 Request Entity Too Large error where:\n- `message` - optional message.\n- `data` - optional additional error data.\n\n```js\nBoom.entityTooLarge('too big');\n```\n\nGenerates the following response payload:\n\n```json\n{\n \"statusCode\": 413,\n \"error\": \"Request Entity Too Large\",\n \"message\": \"too big\"\n}\n```\n\n### `Boom.uriTooLong([message], [data])`\n\nReturns a 414 Request-URI Too Large error where:\n- `message` - optional message.\n- `data` - optional additional error data.\n\n```js\nBoom.uriTooLong('uri is too long');\n```\n\nGenerates the following response payload:\n\n```json\n{\n \"statusCode\": 414,\n \"error\": \"Request-URI Too Large\",\n \"message\": \"uri is too long\"\n}\n```\n\n### `Boom.unsupportedMediaType([message], [data])`\n\nReturns a 415 Unsupported Media Type error where:\n- `message` - optional message.\n- `data` - optional additional error data.\n\n```js\nBoom.unsupportedMediaType('that media is not supported');\n```\n\nGenerates the following response payload:\n\n```json\n{\n \"statusCode\": 415,\n \"error\": \"Unsupported Media Type\",\n \"message\": \"that media is not supported\"\n}\n```\n\n### `Boom.rangeNotSatisfiable([message], [data])`\n\nReturns a 416 Requested Range Not Satisfiable error where:\n- `message` - optional message.\n- `data` - optional additional error data.\n\n```js\nBoom.rangeNotSatisfiable();\n```\n\nGenerates the following response payload:\n\n```json\n{\n \"statusCode\": 416,\n \"error\": \"Requested Range Not Satisfiable\"\n}\n```\n\n### `Boom.expectationFailed([message], [data])`\n\nReturns a 417 Expectation Failed error where:\n- `message` - optional message.\n- `data` - optional additional error data.\n\n```js\nBoom.expectationFailed('expected this to work');\n```\n\nGenerates the following response payload:\n\n```json\n{\n \"statusCode\": 417,\n \"error\": \"Expectation Failed\",\n \"message\": \"expected this to work\"\n}\n```\n\n### `Boom.badData([message], [data])`\n\nReturns a 422 Unprocessable Entity error where:\n- `message` - optional message.\n- `data` - optional additional error data.\n\n```js\nBoom.badData('your data is bad and you should feel bad');\n```\n\nGenerates the following response payload:\n\n```json\n{\n \"statusCode\": 422,\n \"error\": \"Unprocessable Entity\",\n \"message\": \"your data is bad and you should feel bad\"\n}\n```\n\n### `Boom.tooManyRequests([message], [data])`\n\nReturns a 422 Too Many Requests error where:\n- `message` - optional message.\n- `data` - optional additional error data.\n\n```js\nBoom.tooManyRequests('you have exceeded your request limit');\n```\n\nGenerates the following response payload:\n\n```json\n{\n \"statusCode\": 429,\n \"error\": \"Too Many Requests\",\n \"message\": \"you have exceeded your request limit\"\n}\n```\n\n## HTTP 5xx Errors\n\nAll 500 errors hide your message from the end user. Your message is recorded in the server log.\n\n### `Boom.notImplemented([message], [data])`\n\nReturns a 501 Not Implemented error where:\n- `message` - optional message.\n- `data` - optional additional error data.\n\n```js\nBoom.notImplemented('method not implemented');\n```\n\nGenerates the following response payload:\n\n```json\n{\n \"statusCode\": 501,\n \"error\": \"Not Implemented\",\n \"message\": \"method not implemented\"\n}\n```\n\n### `Boom.badGateway([message], [data])`\n\nReturns a 502 Bad Gateway error where:\n- `message` - optional message.\n- `data` - optional additional error data.\n\n```js\nBoom.badGateway('that is a bad gateway');\n```\n\nGenerates the following response payload:\n\n```json\n{\n \"statusCode\": 502,\n \"error\": \"Bad Gateway\",\n \"message\": \"that is a bad gateway\"\n}\n```\n\n### `Boom.serverTimeout([message], [data])`\n\nReturns a 503 Service Unavailable error where:\n- `message` - optional message.\n- `data` - optional additional error data.\n\n```js\nBoom.serverTimeout('unavailable');\n```\n\nGenerates the following response payload:\n\n```json\n{\n \"statusCode\": 503,\n \"error\": \"Service Unavailable\",\n \"message\": \"unavailable\"\n}\n```\n\n### `Boom.gatewayTimeout([message], [data])`\n\nReturns a 504 Gateway Time-out error where:\n- `message` - optional message.\n- `data` - optional additional error data.\n\n```js\nBoom.gatewayTimeout();\n```\n\nGenerates the following response payload:\n\n```json\n{\n \"statusCode\": 504,\n \"error\": \"Gateway Time-out\"\n}\n```\n\n### `Boom.badImplementation([message], [data])`\n\nReturns a 500 Internal Server Error error where:\n- `message` - optional message.\n- `data` - optional additional error data.\n\n```js\nBoom.badImplementation('terrible implementation');\n```\n\nGenerates the following response payload:\n\n```json\n{\n \"statusCode\": 500,\n \"error\": \"Internal Server Error\",\n \"message\": \"An internal server error occurred\"\n}\n```\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/hapijs/boom/issues" + }, + "_id": "boom@2.6.1", + "dist": { + "shasum": "8cc1ca35cb62957173f85a669a193e574fde2735" + }, + "_from": "boom@2.6.1", + "_resolved": "https://registry.npmjs.org/boom/-/boom-2.6.1.tgz" +} diff --git a/node_modules/hapi/node_modules/boom/test/index.js b/node_modules/hapi/node_modules/boom/test/index.js new file mode 100755 index 0000000..68ae417 --- /dev/null +++ b/node_modules/hapi/node_modules/boom/test/index.js @@ -0,0 +1,592 @@ +// Load modules + +var Util = require('util'); +var Code = require('code'); +var Boom = require('../lib'); +var Lab = require('lab'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +it('returns the same object when already boom', function (done) { + + var error = Boom.badRequest(); + var wrapped = Boom.wrap(error); + expect(error).to.equal(wrapped); + done(); +}); + +it('returns an error with info when constructed using another error', function (done) { + + var error = new Error('ka-boom'); + error.xyz = 123; + var err = Boom.wrap(error); + expect(err.xyz).to.equal(123); + expect(err.message).to.equal('ka-boom'); + expect(err.output).to.deep.equal({ + statusCode: 500, + payload: { + statusCode: 500, + error: 'Internal Server Error', + message: 'An internal server error occurred' + }, + headers: {} + }); + expect(err.data).to.equal(null); + done(); +}); + +it('does not override data when constructed using another error', function (done) { + + var error = new Error('ka-boom'); + error.data = { useful: 'data' }; + var err = Boom.wrap(error); + expect(err.data).to.equal(error.data); + done(); +}); + +it('sets new message when none exists', function (done) { + + var error = new Error(); + var wrapped = Boom.wrap(error, 400, 'something bad'); + expect(wrapped.message).to.equal('something bad'); + done(); +}); + +it('throws when statusCode is not a number', function (done) { + + expect(function () { + + Boom.create('x'); + }).to.throw('First argument must be a number (400+): x'); + done(); +}); + +it('throws when statusCode is not finite', function (done) { + + expect(function () { + + Boom.create(1 / 0); + }).to.throw('First argument must be a number (400+): null'); + done(); +}); + +it('sets error code to unknown', function (done) { + + var err = Boom.create(999); + expect(err.output.payload.error).to.equal('Unknown'); + done(); +}); + +describe('create()', function () { + + it('does not sets null message', function (done) { + + var error = Boom.unauthorized(null); + expect(error.output.payload.message).to.not.exist(); + done(); + }); + + it('sets message and data', function (done) { + + var error = Boom.badRequest('Missing data', { type: 'user' }); + expect(error.data.type).to.equal('user'); + expect(error.output.payload.message).to.equal('Missing data'); + done(); + }); +}); + +describe('isBoom()', function () { + + it('returns true for Boom object', function (done) { + + expect(Boom.badRequest().isBoom).to.equal(true); + done(); + }); + + it('returns false for Error object', function (done) { + + expect((new Error()).isBoom).to.not.exist(); + done(); + }); +}); + +describe('badRequest()', function () { + + it('returns a 400 error statusCode', function (done) { + + expect(Boom.badRequest().output.statusCode).to.equal(400); + done(); + }); + + it('sets the message with the passed in message', function (done) { + + expect(Boom.badRequest('my message').message).to.equal('my message'); + done(); + }); + + it('sets the message to HTTP status if none provided', function (done) { + + expect(Boom.badRequest().message).to.equal('Bad Request'); + done(); + }); +}); + +describe('unauthorized()', function () { + + it('returns a 401 error statusCode', function (done) { + + var err = Boom.unauthorized(); + expect(err.output.statusCode).to.equal(401); + expect(err.output.headers).to.deep.equal({}); + done(); + }); + + it('sets the message with the passed in message', function (done) { + + expect(Boom.unauthorized('my message').message).to.equal('my message'); + done(); + }); + + it('returns a WWW-Authenticate header when passed a scheme', function (done) { + + var err = Boom.unauthorized('boom', 'Test'); + expect(err.output.statusCode).to.equal(401); + expect(err.output.headers['WWW-Authenticate']).to.equal('Test error="boom"'); + done(); + }); + + it('returns a WWW-Authenticate header set to the schema array value', function (done) { + + var err = Boom.unauthorized(null, ['Test','one','two']); + expect(err.output.statusCode).to.equal(401); + expect(err.output.headers['WWW-Authenticate']).to.equal('Test, one, two'); + done(); + }); + + it('returns a WWW-Authenticate header when passed a scheme and attributes', function (done) { + + var err = Boom.unauthorized('boom', 'Test', { a: 1, b: 'something', c: null, d: 0 }); + expect(err.output.statusCode).to.equal(401); + expect(err.output.headers['WWW-Authenticate']).to.equal('Test a="1", b="something", c="", d="0", error="boom"'); + done(); + }); + + it('returns a WWW-Authenticate header when passed attributes, missing error', function (done) { + + var err = Boom.unauthorized(null, 'Test', { a: 1, b: 'something', c: null, d: 0 }); + expect(err.output.statusCode).to.equal(401); + expect(err.output.headers['WWW-Authenticate']).to.equal('Test a="1", b="something", c="", d="0"'); + expect(err.isMissing).to.equal(true); + done(); + }); + + it('sets the isMissing flag when error message is empty', function (done) { + + var err = Boom.unauthorized('', 'Basic'); + expect(err.isMissing).to.equal(true); + done(); + }); + + it('does not set the isMissing flag when error message is not empty', function (done) { + + var err = Boom.unauthorized('message', 'Basic'); + expect(err.isMissing).to.equal(undefined); + done(); + }); + + it('sets a WWW-Authenticate when passed as an array', function (done) { + + var err = Boom.unauthorized('message', ['Basic', 'Example e="1"', 'Another x="3", y="4"']); + expect(err.output.headers['WWW-Authenticate']).to.equal('Basic, Example e="1", Another x="3", y="4"'); + done(); + }); +}); + + +describe('methodNotAllowed()', function () { + + it('returns a 405 error statusCode', function (done) { + + expect(Boom.methodNotAllowed().output.statusCode).to.equal(405); + done(); + }); + + it('sets the message with the passed in message', function (done) { + + expect(Boom.methodNotAllowed('my message').message).to.equal('my message'); + done(); + }); +}); + + +describe('notAcceptable()', function () { + + it('returns a 406 error statusCode', function (done) { + + expect(Boom.notAcceptable().output.statusCode).to.equal(406); + done(); + }); + + it('sets the message with the passed in message', function (done) { + + expect(Boom.notAcceptable('my message').message).to.equal('my message'); + done(); + }); +}); + + +describe('proxyAuthRequired()', function () { + + it('returns a 407 error statusCode', function (done) { + + expect(Boom.proxyAuthRequired().output.statusCode).to.equal(407); + done(); + }); + + it('sets the message with the passed in message', function (done) { + + expect(Boom.proxyAuthRequired('my message').message).to.equal('my message'); + done(); + }); +}); + + +describe('clientTimeout()', function () { + + it('returns a 408 error statusCode', function (done) { + + expect(Boom.clientTimeout().output.statusCode).to.equal(408); + done(); + }); + + it('sets the message with the passed in message', function (done) { + + expect(Boom.clientTimeout('my message').message).to.equal('my message'); + done(); + }); +}); + + +describe('conflict()', function () { + + it('returns a 409 error statusCode', function (done) { + + expect(Boom.conflict().output.statusCode).to.equal(409); + done(); + }); + + it('sets the message with the passed in message', function (done) { + + expect(Boom.conflict('my message').message).to.equal('my message'); + done(); + }); +}); + + +describe('resourceGone()', function () { + + it('returns a 410 error statusCode', function (done) { + + expect(Boom.resourceGone().output.statusCode).to.equal(410); + done(); + }); + + it('sets the message with the passed in message', function (done) { + + expect(Boom.resourceGone('my message').message).to.equal('my message'); + done(); + }); +}); + + +describe('lengthRequired()', function () { + + it('returns a 411 error statusCode', function (done) { + + expect(Boom.lengthRequired().output.statusCode).to.equal(411); + done(); + }); + + it('sets the message with the passed in message', function (done) { + + expect(Boom.lengthRequired('my message').message).to.equal('my message'); + done(); + }); +}); + + +describe('preconditionFailed()', function () { + + it('returns a 412 error statusCode', function (done) { + + expect(Boom.preconditionFailed().output.statusCode).to.equal(412); + done(); + }); + + it('sets the message with the passed in message', function (done) { + + expect(Boom.preconditionFailed('my message').message).to.equal('my message'); + done(); + }); +}); + + +describe('entityTooLarge()', function () { + + it('returns a 413 error statusCode', function (done) { + + expect(Boom.entityTooLarge().output.statusCode).to.equal(413); + done(); + }); + + it('sets the message with the passed in message', function (done) { + + expect(Boom.entityTooLarge('my message').message).to.equal('my message'); + done(); + }); +}); + + +describe('uriTooLong()', function () { + + it('returns a 414 error statusCode', function (done) { + + expect(Boom.uriTooLong().output.statusCode).to.equal(414); + done(); + }); + + it('sets the message with the passed in message', function (done) { + + expect(Boom.uriTooLong('my message').message).to.equal('my message'); + done(); + }); +}); + + +describe('unsupportedMediaType()', function () { + + it('returns a 415 error statusCode', function (done) { + + expect(Boom.unsupportedMediaType().output.statusCode).to.equal(415); + done(); + }); + + it('sets the message with the passed in message', function (done) { + + expect(Boom.unsupportedMediaType('my message').message).to.equal('my message'); + done(); + }); +}); + + +describe('rangeNotSatisfiable()', function () { + + it('returns a 416 error statusCode', function (done) { + + expect(Boom.rangeNotSatisfiable().output.statusCode).to.equal(416); + done(); + }); + + it('sets the message with the passed in message', function (done) { + + expect(Boom.rangeNotSatisfiable('my message').message).to.equal('my message'); + done(); + }); +}); + + +describe('expectationFailed()', function () { + + it('returns a 417 error statusCode', function (done) { + + expect(Boom.expectationFailed().output.statusCode).to.equal(417); + done(); + }); + + it('sets the message with the passed in message', function (done) { + + expect(Boom.expectationFailed('my message').message).to.equal('my message'); + done(); + }); +}); + + +describe('badData()', function () { + + it('returns a 422 error statusCode', function (done) { + + expect(Boom.badData().output.statusCode).to.equal(422); + done(); + }); + + it('sets the message with the passed in message', function (done) { + + expect(Boom.badData('my message').message).to.equal('my message'); + done(); + }); +}); + + +describe('tooManyRequests()', function () { + + it('returns a 429 error statusCode', function (done) { + + expect(Boom.tooManyRequests().output.statusCode).to.equal(429); + done(); + }); + + it('sets the message with the passed-in message', function (done) { + + expect(Boom.tooManyRequests('my message').message).to.equal('my message'); + done(); + }); +}); + +describe('serverTimeout()', function () { + + it('returns a 503 error statusCode', function (done) { + + expect(Boom.serverTimeout().output.statusCode).to.equal(503); + done(); + }); + + it('sets the message with the passed in message', function (done) { + + expect(Boom.serverTimeout('my message').message).to.equal('my message'); + done(); + }); +}); + +describe('forbidden()', function () { + + it('returns a 403 error statusCode', function (done) { + + expect(Boom.forbidden().output.statusCode).to.equal(403); + done(); + }); + + it('sets the message with the passed in message', function (done) { + + expect(Boom.forbidden('my message').message).to.equal('my message'); + done(); + }); +}); + +describe('notFound()', function () { + + it('returns a 404 error statusCode', function (done) { + + expect(Boom.notFound().output.statusCode).to.equal(404); + done(); + }); + + it('sets the message with the passed in message', function (done) { + + expect(Boom.notFound('my message').message).to.equal('my message'); + done(); + }); +}); + +describe('internal()', function () { + + it('returns a 500 error statusCode', function (done) { + + expect(Boom.internal().output.statusCode).to.equal(500); + done(); + }); + + it('sets the message with the passed in message', function (done) { + + var err = Boom.internal('my message'); + expect(err.message).to.equal('my message'); + expect(err.output.payload.message).to.equal('An internal server error occurred'); + done(); + }); + + it('passes data on the callback if its passed in', function (done) { + + expect(Boom.internal('my message', { my: 'data' }).data.my).to.equal('data'); + done(); + }); + + it('returns an error with composite message', function (done) { + + try { + JSON.parse('{'); + } + catch (err) { + var boom = Boom.internal('Someting bad', err); + expect(boom.message).to.equal('Someting bad: Unexpected end of input'); + done(); + } + }); +}); + +describe('notImplemented()', function () { + + it('returns a 501 error statusCode', function (done) { + + expect(Boom.notImplemented().output.statusCode).to.equal(501); + done(); + }); + + it('sets the message with the passed in message', function (done) { + + expect(Boom.notImplemented('my message').message).to.equal('my message'); + done(); + }); +}); + + +describe('badGateway()', function () { + + it('returns a 502 error statusCode', function (done) { + + expect(Boom.badGateway().output.statusCode).to.equal(502); + done(); + }); + + it('sets the message with the passed in message', function (done) { + + expect(Boom.badGateway('my message').message).to.equal('my message'); + done(); + }); +}); + +describe('gatewayTimeout()', function () { + + it('returns a 504 error statusCode', function (done) { + + expect(Boom.gatewayTimeout().output.statusCode).to.equal(504); + done(); + }); + + it('sets the message with the passed in message', function (done) { + + expect(Boom.gatewayTimeout('my message').message).to.equal('my message'); + done(); + }); +}); + +describe('badImplementation()', function () { + + it('returns a 500 error statusCode', function (done) { + + var err = Boom.badImplementation(); + expect(err.output.statusCode).to.equal(500); + expect(err.isDeveloperError).to.equal(true); + done(); + }); +}); diff --git a/node_modules/hapi/node_modules/call/.npmignore b/node_modules/hapi/node_modules/call/.npmignore new file mode 100644 index 0000000..7e1574d --- /dev/null +++ b/node_modules/hapi/node_modules/call/.npmignore @@ -0,0 +1,18 @@ +.idea +*.iml +npm-debug.log +dump.rdb +node_modules +results.tap +results.xml +npm-shrinkwrap.json +config.json +.DS_Store +*/.DS_Store +*/*/.DS_Store +._* +*/._* +*/*/._* +coverage.* +lib-cov +complexity.md diff --git a/node_modules/hapi/node_modules/call/.travis.yml b/node_modules/hapi/node_modules/call/.travis.yml new file mode 100755 index 0000000..047f7e3 --- /dev/null +++ b/node_modules/hapi/node_modules/call/.travis.yml @@ -0,0 +1,5 @@ +language: node_js + +node_js: + - 0.10 + diff --git a/node_modules/hapi/node_modules/call/CONTRIBUTING.md b/node_modules/hapi/node_modules/call/CONTRIBUTING.md new file mode 100755 index 0000000..f75f211 --- /dev/null +++ b/node_modules/hapi/node_modules/call/CONTRIBUTING.md @@ -0,0 +1,16 @@ +# How to contribute +We welcome contributions from the community and are pleased to have them. Please follow this guide when logging issues or making code changes. + +## Logging Issues +All issues should be created using the [new issue form](https://github.com/hapijs/call/issues/new). Clearly describe the issue including steps +to reproduce if there are any. Also, make sure to indicate the earliest version that has the issue being reported. + +## Patching Code + +Code changes are welcome and should follow the guidelines below. + +* Fork the repository on GitHub. +* Fix the issue ensuring that your code follows the [style guide](https://github.com/hapijs/hapi/blob/master/docs/Style.md). +* Add tests for your new code ensuring that you have 100% code coverage (we can help you reach 100% but will not merge without it). + * Run `npm test` to generate a report of test coverage +* [Pull requests](http://help.github.com/send-pull-requests/) should be made to the [master branch](https://github.com/hapijs/call/tree/master). diff --git a/node_modules/hapi/node_modules/call/LICENSE b/node_modules/hapi/node_modules/call/LICENSE new file mode 100755 index 0000000..de45b31 --- /dev/null +++ b/node_modules/hapi/node_modules/call/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2014, Walmart and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/call/graphs/contributors diff --git a/node_modules/hapi/node_modules/call/Makefile b/node_modules/hapi/node_modules/call/Makefile new file mode 100755 index 0000000..ab0a367 --- /dev/null +++ b/node_modules/hapi/node_modules/call/Makefile @@ -0,0 +1,8 @@ +test: + @node node_modules/lab/bin/lab -a code +test-cov: + @node node_modules/lab/bin/lab -a code -t 100 +test-cov-html: + @node node_modules/lab/bin/lab -a code -r html -o coverage.html + +.PHONY: test test-cov test-cov-html diff --git a/node_modules/hapi/node_modules/call/README.md b/node_modules/hapi/node_modules/call/README.md new file mode 100644 index 0000000..726045a --- /dev/null +++ b/node_modules/hapi/node_modules/call/README.md @@ -0,0 +1,7 @@ +#call + +HTTP Router. + +[![Build Status](https://secure.travis-ci.org/hapijs/call.png)](http://travis-ci.org/hapijs/call) + +Lead Maintainer - [Eran Hammer](https://github.com/hueniverse) diff --git a/node_modules/hapi/node_modules/call/index.js b/node_modules/hapi/node_modules/call/index.js new file mode 100755 index 0000000..4cc88b3 --- /dev/null +++ b/node_modules/hapi/node_modules/call/index.js @@ -0,0 +1 @@ +module.exports = require('./lib'); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/call/lib/index.js b/node_modules/hapi/node_modules/call/lib/index.js new file mode 100755 index 0000000..45b2fcf --- /dev/null +++ b/node_modules/hapi/node_modules/call/lib/index.js @@ -0,0 +1,360 @@ +// Load modules + +var Hoek = require('hoek'); +var Boom = require('boom'); +var Regex = require('./regex'); +var Segment = require('./segment'); + + +// Declare internals + +var internals = { + pathRegex: Regex.generate(), + defaults: { + isCaseSensitive: true + } +}; + + +exports.Router = internals.Router = function (options) { + + this.settings = Hoek.applyToDefaults(internals.defaults, options || {}); + + this.routes = {}; // Key: HTTP method or * for catch-all, value: sorted array of routes + this.ids = {}; // Key: route id, value: record + this.vhosts = null; // {} where Key: hostname, value: see this.routes + + this.specials = { + badRequest: null, + notFound: null, + options: null + }; +}; + + +internals.Router.prototype.add = function (config, route) { + + var self = this; + + var method = config.method.toLowerCase(); + + var vhost = config.vhost || '*'; + if (vhost !== '*') { + self.vhosts = self.vhosts || {}; + self.vhosts[vhost] = self.vhosts[vhost] || {}; + } + + var table = (vhost === '*' ? self.routes : self.vhosts[vhost]); + table[method] = table[method] || { routes: [], router: new Segment() }; + + var analysis = config.analysis || this.analyze(config.path); + var record = { + path: config.path, + route: route || config.path, + segments: analysis.segments, + params: analysis.params, + fingerprint: analysis.fingerprint, + settings: this.settings + }; + + // Add route + + table[method].router.add(analysis.segments, record); + table[method].routes.push(record); + table[method].routes.sort(internals.sort); + + var last = record.segments[record.segments.length - 1]; + if (last.empty) { + table[method].router.add(analysis.segments.slice(0, -1), record); + } + + if (config.id) { + Hoek.assert(!this.ids[config.id], 'Route id', config.id, 'for path', config.path, 'conflicts with existing path', this.ids[config.id] && this.ids[config.id].path); + this.ids[config.id] = record; + } + + return record; +}; + + +internals.Router.prototype.special = function (type, route) { + + Hoek.assert(Object.keys(this.specials).indexOf(type) !== -1, 'Unknown special route type:', type); + + this.specials[type] = { route: route }; +}; + + +internals.Router.prototype.route = function (method, path, hostname) { + + var segments = path.split('/').slice(1); + + var vhost = (this.vhosts && hostname && this.vhosts[hostname]); + var route = (vhost && this._lookup(path, segments, vhost, method)) || + this._lookup(path, segments, this.routes, method) || + (method === 'head' && vhost && this._lookup(path, segments, vhost, 'get')) || + (method === 'head' && this._lookup(path, segments, this.routes, 'get')) || + (method === 'options' && this.specials.options) || + (vhost && this._lookup(path, segments, vhost, '*')) || + this._lookup(path, segments, this.routes, '*') || + this.specials.notFound || Boom.notFound(); + + return route; +}; + + +internals.Router.prototype._lookup = function (path, segments, table, method) { + + var set = table[method]; + if (!set) { + return null; + } + + var match = set.router.lookup(path, segments, this.settings); + if (!match) { + return null; + } + + var assignments = {}; + var array = []; + for (var i = 0, il = match.array.length; i < il; ++i) { + var name = match.record.params[i]; + var value = match.array[i]; + if (value) { + value = internals.decode(value); + if (value.isBoom) { + return this.specials.badRequest || value; + } + + if (assignments[name] !== undefined) { + assignments[name] += '/' + value; + } + else { + assignments[name] = value; + } + + if (i + 1 === il || + name !== match.record.params[i + 1]) { + + array.push(assignments[name]); + } + } + } + + return { params: assignments, paramsArray: array, route: match.record.route }; +}; + + +internals.decode = function (value) { + + try { + return decodeURIComponent(value); + } + catch (err) { + return Boom.badRequest('Invalid request path'); + } +}; + + +internals.Router.prototype.normalize = function (path) { + + if (path && + path.indexOf('%') !== -1) { + + // Uppercase %encoded values + + var uppercase = path.replace(/%[0-9a-fA-F][0-9a-fA-F]/g, function (encoded) { + + return encoded.toUpperCase(); + }); + + // Decode non-reserved path characters: a-z A-Z 0-9 _!$&'()*+,;=:@-.~ + // ! (%21) $ (%24) & (%26) ' (%27) ( (%28) ) (%29) * (%2A) + (%2B) , (%2C) - (%2D) . (%2E) + // 0-9 (%30-39) : (%3A) ; (%3B) = (%3D) + // @ (%40) A-Z (%41-5A) _ (%5F) a-z (%61-7A) ~ (%7E) + + var decoded = uppercase.replace(/%(?:2[146-9A-E]|3[\dABD]|4[\dA-F]|5[\dAF]|6[1-9A-F]|7[\dAE])/g, function (encoded) { + + return String.fromCharCode(parseInt(encoded.substring(1), 16)); + }); + + path = decoded; + } + + return path; +}; + + +internals.Router.prototype.analyze = function (path) { + + Hoek.assert(internals.pathRegex.validatePath.test(path), 'Invalid path:', path); + Hoek.assert(!internals.pathRegex.validatePathEncoded.test(path), 'Path cannot contain encoded non-reserved path characters:', path); + + var pathParts = path.split('/'); + var segments = []; + var params = []; + var fingers = []; + + for (var i = 1, il = pathParts.length; i < il; ++i) { // Skip first empty segment + var segment = pathParts[i]; + + // Literal + + if (segment.indexOf('{') === -1) { + segment = this.settings.isCaseSensitive ? segment : segment.toLowerCase(); + fingers.push(segment); + segments.push({ literal: segment }); + continue; + } + + // Parameter + + var parts = []; + segment.replace(internals.pathRegex.parseParam, function (match, literal, name, wilcard, count, empty) { + + if (literal) { + parts.push(literal); + } + else { + parts.push({ + name: name, + wilcard: !!wilcard, + count: count && parseInt(count, 10), + empty: !!empty + }); + } + + return ''; + }); + + if (parts.length === 1) { + + // Simple parameter + + var item = parts[0]; + Hoek.assert(params.indexOf(item.name) === -1, 'Cannot repeat the same parameter name:', item.name, 'in:', path); + params.push(item.name); + + if (item.wilcard) { + if (item.count) { + for (var m = 0; m < item.count; ++m) { + fingers.push('?'); + segments.push({}); + if (m) { + params.push(item.name); + } + } + } + else { + fingers.push('#'); + segments.push({ wildcard: true }); + } + } + else { + fingers.push('?'); + segments.push({ empty: item.empty }); + } + } + else { + + // Mixed parameter + + var seg = { + length: parts.length, + first: typeof parts[0] !== 'string', + segments: [], + }; + + var finger = ''; + var regex = '^'; + for (var p = 0, pl = parts.length; p < pl; ++p) { + var part = parts[p]; + if (typeof part === 'string') { + finger += part; + regex += Hoek.escapeRegex(part); + seg.segments.push(part); + } + else { + Hoek.assert(params.indexOf(part.name) === -1, 'Cannot repeat the same parameter name:', part.name, 'in:', path); + params.push(part.name); + + finger += '?'; + regex += '(.' + (part.empty ? '*' : '+') + ')'; + } + } + + seg.mixed = new RegExp(regex + '$', (!this.settings.isCaseSensitive ? 'i' : '')), + fingers.push(finger); + segments.push(seg); + } + } + + return { + segments: segments, + fingerprint: '/' + fingers.join('/'), + params: params + } +}; + + +internals.Router.prototype.table = function (host) { + + var result = []; + var collect = function (table) { + + if (!table) { + return; + } + + Object.keys(table).forEach(function (method) { + + table[method].routes.forEach(function (record) { + + result.push(record.route); + }); + }); + }; + + if (this.vhosts) { + var vhosts = host ? [].concat(host) : Object.keys(this.vhosts); + for (var i = 0, il = vhosts.length; i < il; ++i) { + collect(this.vhosts[vhosts[i]]); + } + } + + collect(this.routes); + + return result; +}; + + +internals.sort = function (a, b) { + + var aFirst = -1; + var bFirst = 1; + + var as = a.segments; + var bs = b.segments; + + if (as.length !== bs.length) { + return (as.length > bs.length ? bFirst : aFirst); + } + + for (var i = 0, il = as.length; ; ++i) { + if (as[i].literal) { + if (bs[i].literal) { + if (as[i].literal === bs[i].literal) { + continue; + } + + return (as[i].literal > bs[i].literal ? bFirst : aFirst); + } + return aFirst; + } + else if (bs[i].literal) { + return bFirst; + } + + return (as[i].wildcard ? bFirst : aFirst); + } +}; diff --git a/node_modules/hapi/node_modules/call/lib/regex.js b/node_modules/hapi/node_modules/call/lib/regex.js new file mode 100755 index 0000000..a74130f --- /dev/null +++ b/node_modules/hapi/node_modules/call/lib/regex.js @@ -0,0 +1,50 @@ +// Load modules + + +// Declare internals + +var internals = {}; + + +exports.generate = function () { + + /* + /path/{param}/path/{param?} + /path/{param*2}/path + /path/{param*2} + /path/x{param}x + /{param*} + */ + + var empty = '(?:^\\/$)'; + + var legalChars = '[\\w\\!\\$&\'\\(\\)\\*\\+\\,;\\=\\:@\\-\\.~]'; + var encoded = '%[A-F0-9]{2}'; + + var literalChar = '(?:' + legalChars + '|' + encoded + ')'; + var literal = literalChar + '+'; + var literalOptional = literalChar + '*'; + + var midParam = '(?:\\{\\w+(?:\\*[1-9]\\d*)?\\})'; // {p}, {p*2} + var endParam = '(?:\\/(?:\\{\\w+(?:(?:\\*(?:[1-9]\\d*)?)|(?:\\?))?\\})?)?'; // {p}, {p*2}, {p*}, {p?} + + var partialParam = '(?:\\{\\w+\\??\\})'; // {p}, {p?} + var mixedParam = '(?:(?:' + literal + partialParam + ')+' + literalOptional + ')|(?:' + partialParam + '(?:' + literal + partialParam + ')+' + literalOptional + ')|(?:' + partialParam + literal + ')'; + + var segmentContent = '(?:' + literal + '|' + midParam + '|' + mixedParam + ')'; + var segment = '\\/' + segmentContent; + var segments = '(?:' + segment + ')*'; + + var path = '(?:^' + segments + endParam + '$)'; + + // 1:literal 2:name 3:* 4:count 5:? + var parseParam = '(' + literal + ')|(?:\\{(\\w+)(?:(\\*)(\\d+)?)?(\\?)?\\})'; + + var expressions = { + parseParam: new RegExp(parseParam, 'g'), + validatePath: new RegExp(empty + '|' + path), + validatePathEncoded: /%(?:2[146-9A-E]|3[\dABD]|4[\dA-F]|5[\dAF]|6[1-9A-F]|7[\dAE])/g + }; + + return expressions; +}; diff --git a/node_modules/hapi/node_modules/call/lib/segment.js b/node_modules/hapi/node_modules/call/lib/segment.js new file mode 100755 index 0000000..0818b47 --- /dev/null +++ b/node_modules/hapi/node_modules/call/lib/segment.js @@ -0,0 +1,247 @@ +// Load modules + +var Hoek = require('hoek'); +var Boom = require('boom'); + + +// Declare internals + +var internals = {}; + + +exports = module.exports = internals.Segment = function () { + + this._edge = null; // { segment, record } + this._fulls = null; // { path: { segment, record } + this._literals = null; // { literal: { segment, } } + this._param = null; // + this._mixed = null; // [{ segment, }] + this._wildcard = null; // { segment, record } +}; + + +internals.Segment.prototype.add = function (segments, record) { + + /* + { literal: 'x' } -> x + { empty: false } -> {p} + { wildcard: true } -> {p*} + { mixed: /regex/ } -> a{p}b + */ + + var current = segments[0]; + var remaining = segments.slice(1); + var isEdge = !remaining.length; + + var literals = []; + for (var i = 0, il = segments.length, isLiteral = true; i < il && isLiteral; ++i) { + isLiteral = segments[i].literal !== undefined; + literals.push(segments[i].literal); + } + + if (isLiteral) { + this._fulls = this._fulls || {}; + var literal = '/' + literals.join('/'); + if (!record.settings.isCaseSensitive) { + literal = literal.toLowerCase(); + } + + Hoek.assert(!this._fulls[literal], 'New route', record.path, 'conflicts with existing', this._fulls[literal] && this._fulls[literal].record.path); + this._fulls[literal] = { segment: current, record: record }; + } + else if (current.literal !== undefined) { // Can be empty string + + // Literal + + this._literals = this._literals || {}; + var literal = (record.settings.isCaseSensitive ? current.literal : current.literal.toLowerCase()); + this._literals[literal] = this._literals[literal] || new internals.Segment(); + this._literals[literal].add(remaining, record); + } + else if (current.wildcard) { + + // Wildcard + + Hoek.assert(!this._wildcard, 'New route', record.path, 'conflicts with existing', this._wildcard && this._wildcard.record.path); + Hoek.assert(!this._param || !this._param._wildcard, 'New route', record.path, 'conflicts with existing', this._param && this._param._wildcard && this._param._wildcard.record.path) + this._wildcard = { segment: current, record: record }; + } + else if (current.mixed) { + + // Mixed + + this._mixed = this._mixed || []; + + var mixed = this._mixedLookup(current); + if (!mixed) { + mixed = { segment: current, node: new internals.Segment() }; + this._mixed.push(mixed); + this._mixed.sort(internals.mixed); + } + + if (isEdge) { + Hoek.assert(!mixed.node._edge, 'New route', record.path, 'conflicts with existing', mixed.node._edge && mixed.node._edge.record.path); + mixed.node._edge = { segment: current, record: record }; + } + else { + mixed.node.add(remaining, record); + } + } + else { + + // Parameter + + this._param = this._param || new internals.Segment(); + + if (isEdge) { + Hoek.assert(!this._param._edge, 'New route', record.path, 'conflicts with existing', this._param._edge && this._param._edge.record.path); + this._param._edge = { segment: current, record: record }; + } + else { + Hoek.assert(!this._wildcard || !remaining[0].wildcard, 'New route', record.path, 'conflicts with existing', this._wildcard && this._wildcard.record.path) + this._param.add(remaining, record); + } + } +}; + + +internals.Segment.prototype._mixedLookup = function (segment) { + + for (var i = 0, il = this._mixed.length; i < il; ++i) { + if (internals.mixed({ segment: segment }, this._mixed[i]) === 0) { + return this._mixed[i]; + } + } + + return null; +}; + + +internals.mixed = function (a, b) { + + var aFirst = -1; + var bFirst = 1; + + var as = a.segment; + var bs = b.segment; + + if (as.length !== bs.length) { + return (as.length > bs.length ? aFirst : bFirst); + } + + if (as.first !== bs.first) { + return (as.first ? bFirst : aFirst); + } + + for (var j = 0, jl = as.segments.length ; j < jl; ++j) { + var am = as.segments[j]; + var bm = bs.segments[j]; + + if (am === bm) { + continue; + } + + if (am.length === bm.length) { + return (am > bm ? bFirst : aFirst); + } + + return (am.length < bm.length ? bFirst : aFirst); + } + + return 0; +}; + + +internals.Segment.prototype.lookup = function (path, segments, options) { + + var match = null; + + // Literal edge + + if (this._fulls) { + match = this._fulls[options.isCaseSensitive ? path : path.toLowerCase()]; + if (match) { + return { record: match.record, array: [] }; + } + } + + // Literal node + + var current = segments[0]; + var nextPath = path.slice(current.length + 1) + var remainder = (segments.length > 1 ? segments.slice(1) : null); + + if (this._literals) { + match = this._literals[options.isCaseSensitive ? current : current.toLowerCase()]; + if (match) { + var record = internals.deeper(match, nextPath, remainder, [], options); + if (record) { + return record; + } + } + } + + // Mixed + + if (this._mixed) { + for (var i = 0, il = this._mixed.length; i < il; ++i) { + match = this._mixed[i]; + var params = current.match(match.segment.mixed); + if (params) { + var array = []; + for (var p = 1, pl = params.length; p < pl; ++p) { + array.push(params[p]); + } + + var record = internals.deeper(match.node, nextPath, remainder, array, options); + if (record) { + return record; + } + } + } + } + + // Param + + if (this._param) { + if (current || + !this._param._edge || + this._param._edge.segment.empty) { + + var record = internals.deeper(this._param, nextPath, remainder, [current], options); + if (record) { + return record; + } + } + } + + // Wildcard + + if (this._wildcard) { + return { record: this._wildcard.record, array: [path.slice(1)] }; + } + + return null; +}; + + +internals.deeper = function (match, path, segments, array, options) { + + if (!segments) { + if (match._edge) { + return { record: match._edge.record, array: array }; + } + + if (match._wildcard) { + return { record: match._wildcard.record, array: array } + } + } + else { + var result = match.lookup(path, segments, options); + if (result) { + return { record: result.record, array: array.concat(result.array) }; + } + } + + return null; +}; diff --git a/node_modules/hapi/node_modules/call/package.json b/node_modules/hapi/node_modules/call/package.json new file mode 100755 index 0000000..6ed1c77 --- /dev/null +++ b/node_modules/hapi/node_modules/call/package.json @@ -0,0 +1,45 @@ +{ + "name": "call", + "description": "HTTP Router", + "version": "2.0.1", + "repository": { + "type": "git", + "url": "git://github.com/hapijs/call" + }, + "main": "index", + "keywords": [ + "HTTP", + "router" + ], + "engines": { + "node": ">=0.10.32" + }, + "dependencies": { + "hoek": "2.x.x", + "boom": "2.x.x" + }, + "devDependencies": { + "code": "1.x.x", + "lab": "5.x.x" + }, + "scripts": { + "test": "make test-cov" + }, + "licenses": [ + { + "type": "BSD", + "url": "http://github.com/hapijs/call/raw/master/LICENSE" + } + ], + "readme": "#call\n\nHTTP Router.\n\n[![Build Status](https://secure.travis-ci.org/hapijs/call.png)](http://travis-ci.org/hapijs/call)\n\nLead Maintainer - [Eran Hammer](https://github.com/hueniverse)\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/hapijs/call/issues" + }, + "_id": "call@2.0.1", + "dist": { + "shasum": "6ef30d53ae0fd55069fbb48005cb156a285ef265" + }, + "_from": "call@2.0.1", + "_resolved": "https://registry.npmjs.org/call/-/call-2.0.1.tgz" +} diff --git a/node_modules/hapi/node_modules/call/test/index.js b/node_modules/hapi/node_modules/call/test/index.js new file mode 100755 index 0000000..c56209b --- /dev/null +++ b/node_modules/hapi/node_modules/call/test/index.js @@ -0,0 +1,814 @@ +// Load modules + +var Lab = require('lab'); +var Call = require('../'); +var Code = require('code'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('Router', function () { + + it('routes request', function (done) { + + var router = new Call.Router(); + router.add({ method: 'get', path: '/' }, '/'); + router.add({ method: 'get', path: '/a' }, '/a'); + router.add({ method: 'get', path: '/a{b?}c{d}' }, '/a{b?}c{d}'); + + expect(router.route('get', '/').route).to.equal('/'); + expect(router.route('get', '/a').route).to.equal('/a'); + expect(router.route('get', '/abcd').route).to.equal('/a{b?}c{d}'); + + done(); + }); + + it('routes request (pre-analyzed)', function (done) { + + var router = new Call.Router(); + router.add({ method: 'get', path: '/', analysis: router.analyze('/') }, '/'); + router.add({ method: 'get', path: '/a', analysis: router.analyze('/a') }, '/a'); + router.add({ method: 'get', path: '/b', analysis: router.analyze('/b') }, '/b'); + + expect(router.route('get', '/').route).to.equal('/'); + expect(router.route('get', '/a').route).to.equal('/a'); + expect(router.route('get', '/b').route).to.equal('/b'); + + done(); + }); + + describe('sort', function () { + + var paths = [ + '/', + '/a', + '/b', + '/ab', + '/a{p}b', + '/a{p}', + '/{p}b', + '/{p}', + '/a/b', + '/a/{p}', + '/b/', + '/a1{p}/a', + '/xx{p}/b', + '/x{p}/a', + '/x{p}/b', + '/y{p?}/b', + '/{p}xx/b', + '/{p}x/b', + '/{p}y/b', + '/a/b/c', + '/a/b/{p}', + '/a/d{p}c/b', + '/a/d{p}/b', + '/a/{p}d/b', + '/a/{p}/b', + '/a/{p}/c', + '/a/{p*2}', + '/a/b/c/d', + '/a/b/{p*2}', + '/a/{p}/b/{x}', + '/{p*5}', + '/a/b/{p*}', + '/{a}/b/{p*}', + '/{p*}', + '/m/n/{p*}', + '/m/{n}/{o}', + '/n/{p}/{o*}' + ]; + + var router = new Call.Router(); + for (var i = 0, il = paths.length; i < il; ++i) { + router.add({ method: 'get', path: paths[i] }, paths[i]); + } + + var requests = [ + ['/', '/'], + ['/a', '/a'], + ['/b', '/b'], + ['/ab', '/ab'], + ['/axb', '/a{p}b'], + ['/axc', '/a{p}'], + ['/bxb', '/{p}b'], + ['/c', '/{p}'], + ['/a/b', '/a/b'], + ['/a/c', '/a/{p}'], + ['/b/', '/b/'], + ['/a1larry/a', '/a1{p}/a'], + ['/xx1/b', '/xx{p}/b'], + ['/xx1/a', '/x{p}/a'], + ['/x1/b', '/x{p}/b'], + ['/y/b', '/y{p?}/b'], + ['/0xx/b', '/{p}xx/b'], + ['/0x/b', '/{p}x/b'], + ['/ay/b', '/{p}y/b'], + ['/a/b/c', '/a/b/c'], + ['/a/b/d', '/a/b/{p}'], + ['/a/doc/b', '/a/d{p}c/b'], + ['/a/dl/b', '/a/d{p}/b'], + ['/a/ld/b', '/a/{p}d/b'], + ['/a/a/b', '/a/{p}/b'], + ['/a/d/c', '/a/{p}/c'], + ['/a/d/d', '/a/{p*2}'], + ['/a/b/c/d', '/a/b/c/d'], + ['/a/b/c/e', '/a/b/{p*2}'], + ['/a/c/b/d', '/a/{p}/b/{x}'], + ['/a/b/c/d/e', '/a/b/{p*}'], + ['/a/b/c/d/e/f', '/a/b/{p*}'], + ['/x/b/c/d/e/f/g', '/{a}/b/{p*}'], + ['/x/y/c/d/e/f/g', '/{p*}'], + ['/m/n/o', '/m/n/{p*}'], + ['/m/o/p', '/m/{n}/{o}'], + ['/n/a/b/c', '/n/{p}/{o*}'], + ['/n/a', '/n/{p}/{o*}'] + ]; + + var test = function (path, route) { + + it('matches \'' + path + '\' to \'' + route + '\'', function (done) { + + expect(router.route('get', path).route).to.equal(route); + done(); + }); + }; + + for (i = 0, il = requests.length; i < il; ++i) { + test(requests[i][0], requests[i][1]); + } + }); + + describe('add()', function () { + + it('adds a route with id', function (done) { + + var router = new Call.Router(); + router.add({ method: 'get', path: '/a/b/{c}', id: 'a' }); + expect(router.ids.a.path).to.equal('/a/b/{c}'); + done(); + }); + + it('throws on duplicate route', function (done) { + + var router = new Call.Router(); + router.add({ method: 'get', path: '/a/b/{c}' }); + expect(function () { + + router.add({ method: 'get', path: '/a/b/{c}' }); + }).to.throw('New route /a/b/{c} conflicts with existing /a/b/{c}'); + + done(); + }); + + it('throws on duplicate route (id)', function (done) { + + var router = new Call.Router(); + router.add({ method: 'get', path: '/a/b', id: '1' }); + expect(function () { + + router.add({ method: 'get', path: '/b', id: '1' }); + }).to.throw('Route id 1 for path /b conflicts with existing path /a/b'); + + done(); + }); + + it('throws on duplicate route (optional param in first)', function (done) { + + var router = new Call.Router(); + router.add({ method: 'get', path: '/a/b/{c?}' }); + expect(function () { + + router.add({ method: 'get', path: '/a/b' }); + }).to.throw('New route /a/b conflicts with existing /a/b/{c?}'); + + done(); + }); + + it('throws on duplicate route (optional param in second)', function (done) { + + var router = new Call.Router(); + router.add({ method: 'get', path: '/a/b' }); + expect(function () { + + router.add({ method: 'get', path: '/a/b/{c?}' }); + }).to.throw('New route /a/b/{c?} conflicts with existing /a/b'); + + done(); + }); + + it('throws on duplicate route (same fingerprint)', function (done) { + + var router = new Call.Router(); + router.add({ method: 'get', path: '/test/{p1}/{p2}/end' }); + expect(function () { + + router.add({ method: 'get', path: '/test/{p*2}/end' }); + }).to.throw('New route /test/{p*2}/end conflicts with existing /test/{p1}/{p2}/end'); + + done(); + }); + + it('throws on duplicate route (case insensitive)', function (done) { + + var router = new Call.Router({ isCaseSensitive: false }); + router.add({ method: 'get', path: '/test/a' }); + expect(function () { + + router.add({ method: 'get', path: '/test/A' }); + }).to.throw('New route /test/A conflicts with existing /test/a'); + + done(); + }); + + it('throws on duplicate route (wildcards)', function (done) { + + var router = new Call.Router(); + router.add({ method: 'get', path: '/a/b/{c*}' }); + expect(function () { + + router.add({ method: 'get', path: '/a/b/{c*}' }); + }).to.throw('New route /a/b/{c*} conflicts with existing /a/b/{c*}'); + + done(); + }); + + it('throws on duplicate route (mixed)', function (done) { + + var router = new Call.Router(); + router.add({ method: 'get', path: '/a/b/a{c}' }); + expect(function () { + + router.add({ method: 'get', path: '/a/b/a{c}' }); + }).to.throw('New route /a/b/a{c} conflicts with existing /a/b/a{c}'); + + done(); + }); + + it('throws on duplicate route (/a/{p}/{q*}, /a/{p*})', function (done) { + + var router = new Call.Router(); + router.add({ method: 'get', path: '/a/{p}/{q*}' }); + expect(function () { + + router.add({ method: 'get', path: '/a/{p*}' }); + }).to.throw('New route /a/{p*} conflicts with existing /a/{p}/{q*}'); + + done(); + }); + + it('throws on duplicate route (/a/{p*}, /a/{p}/{q*})', function (done) { + + var router = new Call.Router(); + router.add({ method: 'get', path: '/a/{p*}' }); + expect(function () { + + router.add({ method: 'get', path: '/a/{p}/{q*}' }); + }).to.throw('New route /a/{p}/{q*} conflicts with existing /a/{p*}'); + + done(); + }); + + it('allows route to differ in just case', function (done) { + + var router = new Call.Router(); + router.add({ method: 'get', path: '/test/a' }); + expect(function () { + + router.add({ method: 'get', path: '/test/A' }); + }).to.not.throw(); + + done(); + }); + + it('throws on duplicate route (different param name)', function (done) { + + var router = new Call.Router(); + router.add({ method: 'get', path: '/test/{p}' }); + expect(function () { + + router.add({ method: 'get', path: '/test/{P}' }); + }).to.throw('New route /test/{P} conflicts with existing /test/{p}'); + + done(); + }); + + it('throws on duplicate parameter name', function (done) { + + var router = new Call.Router(); + expect(function () { + + router.add({ method: 'get', path: '/test/{p}/{p}' }); + }).to.throw('Cannot repeat the same parameter name: p in: /test/{p}/{p}'); + + done(); + }); + + it('throws on invalid path', function (done) { + + var router = new Call.Router(); + expect(function () { + + router.add({ method: 'get', path: '/%/%' }); + }).to.throw('Invalid path: /%/%'); + + done(); + }); + + it('throws on duplicate route (same vhost)', function (done) { + + var router = new Call.Router(); + router.add({ method: 'get', path: '/a/b/{c}', vhost: 'example.com' }); + expect(function () { + + router.add({ method: 'get', path: '/a/b/{c}', vhost: 'example.com' }); + }).to.throw('New route /a/b/{c} conflicts with existing /a/b/{c}'); + + done(); + }); + + it('allows duplicate route (different vhost)', function (done) { + + var router = new Call.Router(); + router.add({ method: 'get', path: '/a/b/{c}', vhost: 'one.example.com' }); + expect(function () { + + router.add({ method: 'get', path: '/a/b/{c}', vhost: 'two.example.com' }); + }).to.not.throw(); + + done(); + }); + }); + + describe('special()', function () { + + it('returns special not found route', function (done) { + + var router = new Call.Router(); + router.special('notFound', 'x'); + expect(router.route('get', '/').route).to.equal('x'); + done(); + }); + + it('returns special bad request route', function (done) { + + var router = new Call.Router(); + router.add({ method: 'get', path: '/{p}' }); + router.special('badRequest', 'x'); + expect(router.route('get', '/%p').route).to.equal('x'); + done(); + }); + + it('returns special options route', function (done) { + + var router = new Call.Router(); + router.special('options', 'x'); + expect(router.route('options', '/').route).to.equal('x'); + done(); + }); + }); + + describe('route()', function () { + + var paths = { + '/path/to/|false': { + '/path/to': false, + '/Path/to': false, + '/path/to/': true, + '/Path/to/': true + }, + '/path/to/|true': { + '/path/to': false, + '/Path/to': false, + '/path/to/': true, + '/Path/to/': false + }, + '/path/{param*2}/to': { + '/a/b/c/d': false, + '/path/a/b/to': { + param: 'a/b' + } + }, + '/path/{x*}': { + '/a/b/c/d': false, + '/path/a/b/to': { + x: 'a/b/to' + }, + '/path/': {}, + '/path': {} + }, + '/path/{p1}/{p2?}': { + '/path/a/c/d': false, + '/Path/a/c/d': false, + '/path/a/b': { + p1: 'a', + p2: 'b' + }, + '/path/a': { + p1: 'a' + }, + '/path/a/': { + p1: 'a' + } + }, + '/path/{p1}/{p2?}|false': { + '/path/a/c/d': false, + '/Path/a/c': { + p1: 'a', + p2: 'c' + }, + '/path/a': { + p1: 'a' + }, + '/path/a/': { + p1: 'a' + } + }, + '/mixedCase/|false': { + '/mixedcase/': true, + '/mixedCase/': true + }, + '/mixedCase/|true': { + '/mixedcase/': false, + '/mixedCase/': true + }, + '/{p*}': { + '/path/': { + p: 'path/' + } + }, + '/{a}/b/{p*}': { + '/a/b/path/': { + a: 'a', + p: 'path/' + } + }, + '/a{b?}c': { + '/abc': { + b: 'b' + }, + '/ac': {}, + '/abC': false, + '/Ac': false + }, + '/a{b?}c|false': { + '/abC': { + b: 'b' + }, + '/Ac': {} + }, + '/%0A': { + '/%0A': true, + '/%0a': true + }, + '/a/b/{c}': { + '/a/b/c': true, + '/a/b': false, + '/a/b/': false + }, + '/a/{b}/c|false': { + '/a/1/c': { + b: '1' + }, + '/A/1/c': { + b: '1' + } + }, + '/a/{B}/c|false': { + '/a/1/c': { + B: '1' + }, + '/A/1/c': { + B: '1' + } + }, + '/a/{b}/c|true': { + '/a/1/c': { + b: '1' + }, + '/A/1/c': false + }, + '/a/{B}/c|true': { + '/a/1/c': { + B: '1' + }, + '/A/1/c': false + }, + '/aB/{p}|true': { + '/aB/4': { + p: '4' + }, + '/ab/4': false + }, + '/aB/{p}|false': { + '/aB/4': { + p: '4' + }, + '/ab/4': { + p: '4' + } + }, + '/{a}b{c?}d{e}|true': { + '/abcde': { + a: 'a', + c: 'c', + e: 'e' + }, + '/abde': { + a: 'a', + e: 'e' + }, + '/abxyzde': { + a: 'a', + c: 'xyz', + e: 'e' + }, + '/aBcde': false, + '/bcde': false + }, + '/a/{p}/b': { + '/a/': false + } + }; + + var test = function (path, matches, isCaseSensitive) { + + var router = new Call.Router({ isCaseSensitive: isCaseSensitive }); + router.add({ path: path, method: 'get' }, path); + + var mkeys = Object.keys(matches); + for (var m = 0, ml = mkeys.length; m < ml; ++m) { + match(router, path, mkeys[m], matches[mkeys[m]]); + } + }; + + var match = function (router, path, match, result) { + + it((result ? 'matches' : 'unmatches') + ' the path \'' + path + '\' with ' + match + ' (' + (isCaseSensitive ? 'case-sensitive' : 'case-insensitive') + ')', function (done) { + + var output = router.route('get', router.normalize(match)); + var isMatch = !output.isBoom; + + expect(isMatch).to.equal(!!result); + if (typeof result === 'object') { + var ps = Object.keys(result); + expect(ps.length).to.equal(output.paramsArray.length); + + for (var p = 0, pl = ps.length; p < pl; ++p) { + expect(output.params[ps[p]]).to.equal(result[ps[p]]); + } + } + + done(); + }); + }; + + var keys = Object.keys(paths); + for (var i = 0, il = keys.length; i < il; ++i) { + var pathParts = keys[i].split('|'); + var isCaseSensitive = (pathParts[1] ? pathParts[1] === 'true' : true); + test(pathParts[0], paths[keys[i]], isCaseSensitive); + } + + it('matches head routes', function (done) { + + var router = new Call.Router(); + router.add({ method: 'get', path: '/a' }, 'a'); + router.add({ method: 'get', path: '/a', vhost: 'special.example.com' }, 'b'); + router.add({ method: 'get', path: '/b', vhost: 'special.example.com' }, 'c'); + router.add({ method: 'head', path: '/a' }, 'd'); + router.add({ method: 'head', path: '/a', vhost: 'special.example.com' }, 'e'); + router.add({ method: 'get', path: '/b', vhost: 'x.example.com' }, 'f'); + router.add({ method: 'get', path: '/c' }, 'g'); + + expect(router.route('get', '/a').route).to.equal('a'); + expect(router.route('get', '/a', 'special.example.com').route).to.equal('b'); + expect(router.route('head', '/a').route).to.equal('d'); + expect(router.route('head', '/a', 'special.example.com').route).to.equal('e'); + expect(router.route('head', '/b', 'special.example.com').route).to.equal('c'); + expect(router.route('head', '/c', 'x.example.com').route).to.equal('g'); + done(); + }); + + it('matches * routes', function (done) { + + var router = new Call.Router(); + router.add({ method: '*', path: '/a' }, 'a'); + router.add({ method: '*', path: '/a', vhost: 'special.example.com' }, 'b'); + + expect(router.route('get', '/a').route).to.equal('a'); + expect(router.route('get', '/a', 'special.example.com').route).to.equal('b'); + done(); + }); + + it('fails to match head request', function (done) { + + var router = new Call.Router(); + expect(router.route('head', '/').output.statusCode).to.equal(404); + done(); + }); + + it('fails to match options request', function (done) { + + var router = new Call.Router(); + expect(router.route('options', '/').output.statusCode).to.equal(404); + done(); + }); + + it('fails to match get request with vhost (table exists but not route)', function (done) { + + var router = new Call.Router(); + router.add({ method: 'get', path: '/', vhost: 'special.example.com' }); + expect(router.route('get', '/x', 'special.example.com').output.statusCode).to.equal(404); + done(); + }); + + it('fails to match head request with vhost (table exists but not route)', function (done) { + + var router = new Call.Router(); + router.add({ method: 'head', path: '/', vhost: 'special.example.com' }); + expect(router.route('head', '/x', 'special.example.com').output.statusCode).to.equal(404); + done(); + }); + + it('fails to match bad request', function (done) { + + var router = new Call.Router(); + router.add({ method: 'get', path: '/{p}' }); + expect(router.route('get', '/%p').output.statusCode).to.equal(400); + done(); + }); + + it('fails to match bad request (mixed)', function (done) { + + var router = new Call.Router(); + router.add({ method: 'get', path: '/a{p}' }); + expect(router.route('get', '/a%p').output.statusCode).to.equal(400); + done(); + }); + + it('fails to match bad request (wildcard)', function (done) { + + var router = new Call.Router(); + router.add({ method: 'get', path: '/{p*}' }); + expect(router.route('get', '/%p').output.statusCode).to.equal(400); + done(); + }); + + it('fails to match bad request (deep)', function (done) { + + var router = new Call.Router(); + router.add({ method: 'get', path: '/a/{p}' }); + expect(router.route('get', '/a/%p').output.statusCode).to.equal(400); + done(); + }); + }); + + describe('normalize()', function () { + + it('normalizes a path', function (done) { + + var rawPath = '/%0%1%2%3%4%5%6%7%8%9%a%b%c%d%e%f%10%11%12%13%14%15%16%17%18%19%1a%1b%1c%1d%1e%1f%20%21%22%23%24%25%26%27%28%29%2a%2b%2c%2d%2e%2f%30%31%32%33%34%35%36%37%38%39%3a%3b%3c%3d%3e%3f%40%41%42%43%44%45%46%47%48%49%4a%4b%4c%4d%4e%4f%50%51%52%53%54%55%56%57%58%59%5a%5b%5c%5d%5e%5f%60%61%62%63%64%65%66%67%68%69%6a%6b%6c%6d%6e%6f%70%71%72%73%74%75%76%77%78%79%7a%7b%7c%7d%7e%7f%80%81%82%83%84%85%86%87%88%89%8a%8b%8c%8d%8e%8f%90%91%92%93%94%95%96%97%98%99%9a%9b%9c%9d%9e%9f%a0%a1%a2%a3%a4%a5%a6%a7%a8%a9%aa%ab%ac%ad%ae%af%b0%b1%b2%b3%b4%b5%b6%b7%b8%b9%ba%bb%bc%bd%be%bf%c0%c1%c2%c3%c4%c5%c6%c7%c8%c9%ca%cb%cc%cd%ce%cf%d0%d1%d2%d3%d4%d5%d6%d7%d8%d9%da%db%dc%dd%de%df%e0%e1%e2%e3%e4%e5%e6%e7%e8%e9%ea%eb%ec%ed%ee%ef%f0%f1%f2%f3%f4%f5%f6%f7%f8%f9%fa%fb%fc%fd%fe%ff%0%1%2%3%4%5%6%7%8%9%A%B%C%D%E%F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20%21%22%23%24%25%26%27%28%29%2A%2B%2C%2D%2E%2F%30%31%32%33%34%35%36%37%38%39%3A%3B%3C%3D%3E%3F%40%41%42%43%44%45%46%47%48%49%4A%4B%4C%4D%4E%4F%50%51%52%53%54%55%56%57%58%59%5A%5B%5C%5D%5E%5F%60%61%62%63%64%65%66%67%68%69%6A%6B%6C%6D%6E%6F%70%71%72%73%74%75%76%77%78%79%7A%7B%7C%7D%7E%7F%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF'; + var normPath = '/%0%1%2%3%4%5%6%7%8%9%a%b%c%d%e%f%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20!%22%23$%25&\'()*+,-.%2F0123456789:;%3C=%3E%3F@ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~%7F%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF%0%1%2%3%4%5%6%7%8%9%A%B%C%D%E%F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20!%22%23$%25&\'()*+,-.%2F0123456789:;%3C=%3E%3F@ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~%7F%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF'; + + var router = new Call.Router(); + expect(router.normalize(rawPath)).to.equal(normPath); + done(); + }); + + it('returns empty path on empty', function (done) { + + var router = new Call.Router(); + expect(router.normalize('')).to.equal(''); + done(); + }); + }); + + describe('analyze()', function () { + + it('generates fingerprints', function (done) { + + var paths = { + '/': '/', + '/path': '/path', + '/path/': '/path/', + '/path/to/somewhere': '/path/to/somewhere', + '/{param}': '/?', + '/{param?}': '/?', + '/{param*}': '/#', + '/{param*5}': '/?/?/?/?/?', + '/path/{param}': '/path/?', + '/path/{param}/to': '/path/?/to', + '/path/{param?}': '/path/?', + '/path/{param}/to/{some}': '/path/?/to/?', + '/path/{param}/to/{some?}': '/path/?/to/?', + '/path/{param*2}/to': '/path/?/?/to', + '/path/{param*}': '/path/#', + '/path/{param*10}/to': '/path/?/?/?/?/?/?/?/?/?/?/to', + '/path/{param*2}': '/path/?/?', + '/%20path/': '/%20path/', + '/a{p}': '/a?', + '/{p}b': '/?b', + '/a{p}b': '/a?b', + '/a{p?}': '/a?', + '/{p?}b': '/?b', + '/a{p?}b': '/a?b' + }; + + var router = new Call.Router({ isCaseSensitive: true }); + var keys = Object.keys(paths); + for (var i = 0, il = keys.length; i < il; ++i) { + expect(router.analyze(keys[i]).fingerprint).to.equal(paths[keys[i]]); + } + + done(); + }); + }); + + describe('table()', function () { + + it('returns an array of the current routes', function (done) { + + var router = new Call.Router(); + router.add({ path: '/test/', method: 'get' }); + router.add({ path: '/test/{p}/end', method: 'get' }); + + var routes = router.table(); + + expect(routes.length).to.equal(2); + expect(routes[0]).to.equal('/test/'); + done(); + }); + + it('combines global and vhost routes', function (done) { + + var router = new Call.Router(); + + router.add({ path: '/test/', method: 'get' }); + router.add({ path: '/test/', vhost: 'one.example.com', method: 'get' }); + router.add({ path: '/test/', vhost: 'two.example.com', method: 'get' }); + router.add({ path: '/test/{p}/end', method: 'get' }); + + var routes = router.table(); + + expect(routes.length).to.equal(4); + done(); + }); + + it('combines global and vhost routes and filters based on host', function (done) { + + var router = new Call.Router(); + + router.add({ path: '/test/', method: 'get' }); + router.add({ path: '/test/', vhost: 'one.example.com', method: 'get' }); + router.add({ path: '/test/', vhost: 'two.example.com', method: 'get' }); + router.add({ path: '/test/{p}/end', method: 'get' }); + + var routes = router.table('one.example.com'); + + expect(routes.length).to.equal(3); + done(); + }); + + it('accepts a list of hosts', function (done) { + + var router = new Call.Router(); + + router.add({ path: '/test/', method: 'get' }); + router.add({ path: '/test/', vhost: 'one.example.com', method: 'get' }); + router.add({ path: '/test/', vhost: 'two.example.com', method: 'get' }); + router.add({ path: '/test/{p}/end', method: 'get' }); + + var routes = router.table(['one.example.com', 'two.example.com']); + + expect(routes.length).to.equal(4); + done(); + }); + + it('ignores unknown host', function (done) { + + var router = new Call.Router(); + + router.add({ path: '/test/', method: 'get' }); + router.add({ path: '/test/', vhost: 'one.example.com', method: 'get' }); + router.add({ path: '/test/', vhost: 'two.example.com', method: 'get' }); + router.add({ path: '/test/{p}/end', method: 'get' }); + + var routes = router.table('three.example.com'); + + expect(routes.length).to.equal(2); + done(); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/call/test/regex.js b/node_modules/hapi/node_modules/call/test/regex.js new file mode 100755 index 0000000..0c80b72 --- /dev/null +++ b/node_modules/hapi/node_modules/call/test/regex.js @@ -0,0 +1,102 @@ +// Load modules + +var Code = require('code'); +var Lab = require('lab'); +var Regex = require('../lib/regex'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('Call', function () { + + describe('Regex', function () { + + var pathRegex = Regex.generate(); + + describe('validatePath', function () { + + var testPaths = function () { + + var paths = { + '/': true, + '/path': true, + '/path/': true, + '/path/to/somewhere': true, + '/{param}': true, + '/{param?}': true, + '/{param*}': true, + '/{param*5}': true, + '/path/{param}': true, + '/path/{param}/to': true, + '/path/{param?}': true, + '/path/{param}/to/{some}': true, + '/path/{param}/to/{some?}': true, + '/path/{param*2}/to': true, + '/path/{param*27}/to': true, + '/path/{param*2}': true, + '/path/{param*27}': true, + '/%20path/': true, + 'path': false, + '/%path/': false, + '/path/{param*}/to': false, + '/path/{param*0}/to': false, + '/path/{param*0}': false, + '/path/{param*01}/to': false, + '/path/{param*01}': false, + '/{param?}/something': false, + '/{param*03}': false, + '/{param*3?}': false, + '/{param*?}': false, + '/{param*}/': false, + '/a{p}': true, + '/{p}b': true, + '/a{p}b': true, + '/d/a{p}': true, + '/d/{p}b': true, + '/d/a{p}b': true, + '/a{p}/d': true, + '/{p}b/d': true, + '/a{p}b/d': true, + '/d/a{p}/e': true, + '/d/{p}b/e': true, + '/d/a{p}b/e': true, + '/a{p}.{x}': true, + '/{p}{x}': false, + '/a{p}{x}': false, + '/a{p}{x}b': false, + '/{p}{x}b': false, + '/{p?}{x}b': false, + '/{a}b{c?}d{e}': true, + '/a{p?}': true, + '/{p*}d': false, + '/a{p*3}': false + }; + + var test = function (path, isValid) { + + it('validates the path \'' + path + '\' as ' + (isValid ? 'well-formed' : 'malformed'), function (done) { + + expect(!!(path.match(pathRegex.validatePath))).to.equal(isValid); + done(); + }); + }; + + var keys = Object.keys(paths); + for (var i = 0, il = keys.length; i < il; ++i) { + test(keys[i], paths[keys[i]]); + } + }(); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/catbox-memory/.npmignore b/node_modules/hapi/node_modules/catbox-memory/.npmignore new file mode 100644 index 0000000..77ba16c --- /dev/null +++ b/node_modules/hapi/node_modules/catbox-memory/.npmignore @@ -0,0 +1,18 @@ +.idea +*.iml +npm-debug.log +dump.rdb +node_modules +results.tap +results.xml +npm-shrinkwrap.json +config.json +.DS_Store +*/.DS_Store +*/*/.DS_Store +._* +*/._* +*/*/._* +coverage.* +lib-cov + diff --git a/node_modules/hapi/node_modules/catbox-memory/.travis.yml b/node_modules/hapi/node_modules/catbox-memory/.travis.yml new file mode 100755 index 0000000..77795c6 --- /dev/null +++ b/node_modules/hapi/node_modules/catbox-memory/.travis.yml @@ -0,0 +1,4 @@ +language: node_js + +node_js: + - 0.10 diff --git a/node_modules/hapi/node_modules/catbox-memory/CONTRIBUTING.md b/node_modules/hapi/node_modules/catbox-memory/CONTRIBUTING.md new file mode 100644 index 0000000..8928361 --- /dev/null +++ b/node_modules/hapi/node_modules/catbox-memory/CONTRIBUTING.md @@ -0,0 +1 @@ +Please view our [hapijs contributing guide](https://github.com/hapijs/hapi/blob/master/CONTRIBUTING.md). diff --git a/node_modules/hapi/node_modules/catbox-memory/LICENSE b/node_modules/hapi/node_modules/catbox-memory/LICENSE new file mode 100755 index 0000000..d4243b1 --- /dev/null +++ b/node_modules/hapi/node_modules/catbox-memory/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2012-2014, Walmart and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/catbox-memory/graphs/contributors \ No newline at end of file diff --git a/node_modules/hapi/node_modules/catbox-memory/Makefile b/node_modules/hapi/node_modules/catbox-memory/Makefile new file mode 100755 index 0000000..ca37fd8 --- /dev/null +++ b/node_modules/hapi/node_modules/catbox-memory/Makefile @@ -0,0 +1,9 @@ +test: + @node node_modules/lab/bin/lab +test-cov: + @node node_modules/lab/bin/lab -t 100 -v +test-cov-html: + @node node_modules/lab/bin/lab -r html -o coverage.html + +.PHONY: test test-cov test-cov-html + diff --git a/node_modules/hapi/node_modules/catbox-memory/README.md b/node_modules/hapi/node_modules/catbox-memory/README.md new file mode 100644 index 0000000..b2be3bc --- /dev/null +++ b/node_modules/hapi/node_modules/catbox-memory/README.md @@ -0,0 +1,20 @@ +catbox-memory +============= + +Memory adapter for catbox + +Lead Maintainer - [Colin Ihrig](https://github.com/cjihrig) + +Current version: [![Current Version](https://img.shields.io/npm/v/catbox-memory.svg)](https://www.npmjs.org/package/catbox-memory) [![Build Status](https://api.travis-ci.org/hapijs/catbox-memory.svg)](https://travis-ci.org/hapijs/catbox-memory) + +### Options + +- `maxByteSize` - sets an upper limit on the number of bytes that can be stored in the + cache. Once this limit is reached no additional items will be added to the cache + until some expire. The utilized memory calculation is a rough approximation and must + not be relied on. Defaults to `104857600` (100MB). +- `allowMixedContent` - by default, all data is cached as JSON strings, and converted + to an object using `JSON.parse()` on retrieval. By setting this option to `true`, + `Buffer` data can be stored alongside the stringified data. `Buffer`s are not + stringified, and are copied before storage to prevent the value from changing while + in the cache. Defaults to `false`. \ No newline at end of file diff --git a/node_modules/hapi/node_modules/catbox-memory/index.js b/node_modules/hapi/node_modules/catbox-memory/index.js new file mode 100755 index 0000000..4cc88b3 --- /dev/null +++ b/node_modules/hapi/node_modules/catbox-memory/index.js @@ -0,0 +1 @@ +module.exports = require('./lib'); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/catbox-memory/lib/index.js b/node_modules/hapi/node_modules/catbox-memory/lib/index.js new file mode 100755 index 0000000..6841c3d --- /dev/null +++ b/node_modules/hapi/node_modules/catbox-memory/lib/index.js @@ -0,0 +1,226 @@ +// Load modules + +var Hoek = require('hoek'); + + +// Declare internals + +var internals = {}; + + +internals.defaults = { + maxByteSize: 100 * 1024 * 1024, // 100MB + allowMixedContent: false +}; + +// Provides a named reference for memory debugging +internals.MemoryCacheSegment = function MemoryCacheSegment () { +}; + +internals.MemoryCacheEntry = function MemoryCacheEntry (key, value, ttl, allowMixedContent) { + + var valueByteSize = 0; + + if (allowMixedContent && Buffer.isBuffer(value)) { + this.item = new Buffer(value.length); + // copy buffer to prevent value from changing while in the cache + value.copy(this.item); + valueByteSize = this.item.length; + } + else { + // stringify() to prevent value from changing while in the cache + this.item = JSON.stringify(value); + valueByteSize = Buffer.byteLength(this.item); + } + + this.stored = Date.now(); + this.ttl = ttl; + + // Approximate cache entry size without value: 144 bytes + this.byteSize = 144 + valueByteSize + Buffer.byteLength(key.segment) + Buffer.byteLength(key.id); + + this.timeoutId = null; +}; + + +exports = module.exports = internals.Connection = function MemoryCache (options) { + + Hoek.assert(this.constructor === internals.Connection, 'Memory cache client must be instantiated using new'); + Hoek.assert(!options || options.maxByteSize === undefined || options.maxByteSize >= 0, 'Invalid cache maxByteSize value'); + Hoek.assert(!options || options.allowMixedContent === undefined || typeof options.allowMixedContent === 'boolean', 'Invalid allowMixedContent value'); + + this.settings = Hoek.applyToDefaults(internals.defaults, options || {}); + this.cache = null; +}; + + +internals.Connection.prototype.start = function (callback) { + + callback = Hoek.nextTick(callback); + + if (!this.cache) { + this.cache = {}; + this.byteSize = 0; + } + + return callback(); +}; + + +internals.Connection.prototype.stop = function () { + + this.cache = null; + this.byteSize = 0; + return; +}; + + +internals.Connection.prototype.isReady = function () { + + return (!!this.cache); +}; + + +internals.Connection.prototype.validateSegmentName = function (name) { + + if (!name) { + return new Error('Empty string'); + } + + if (name.indexOf('\0') !== -1) { + return new Error('Includes null character'); + } + + return null; +}; + + +internals.Connection.prototype.get = function (key, callback) { + + callback = Hoek.nextTick(callback); + + if (!this.cache) { + return callback(new Error('Connection not started')); + } + + var segment = this.cache[key.segment]; + if (!segment) { + return callback(null, null); + } + + var envelope = segment[key.id]; + if (!envelope) { + return callback(null, null); + } + + var value = null; + + if (Buffer.isBuffer(envelope.item)) { + value = envelope.item; + } + else { + value = internals.parseJSON(envelope.item); + + if (value instanceof Error) { + return callback(new Error('Bad value content')); + } + } + + var result = { + item: value, + stored: envelope.stored, + ttl: envelope.ttl + }; + + return callback(null, result); +}; + + +internals.Connection.prototype.set = function (key, value, ttl, callback) { + + var self = this; + + callback = Hoek.nextTick(callback); + + if (!this.cache) { + return callback(new Error('Connection not started')); + } + + if (ttl > 2147483647) { // Math.pow(2, 31) + return callback(new Error('Invalid ttl (greater than 2147483647)')); + } + + var envelope = null; + try { + envelope = new internals.MemoryCacheEntry(key, value, ttl, this.settings.allowMixedContent); + } catch (err) { + return callback(err); + } + + this.cache[key.segment] = this.cache[key.segment] || new internals.MemoryCacheSegment(); + var segment = this.cache[key.segment]; + + var cachedItem = segment[key.id]; + if (cachedItem && + cachedItem.timeoutId) { + + clearTimeout(cachedItem.timeoutId); + self.byteSize -= cachedItem.byteSize; // If the item existed, decrement the byteSize as the value could be different + } + + if (this.settings.maxByteSize) { + if (self.byteSize + envelope.byteSize > this.settings.maxByteSize) { + return callback(new Error('Cache size limit reached')); + } + } + + var timeoutId = setTimeout(function () { + + self.drop(key, function () { }); + }, ttl); + + envelope.timeoutId = timeoutId; + + segment[key.id] = envelope; + this.byteSize += envelope.byteSize; + + return callback(null); +}; + + +internals.Connection.prototype.drop = function (key, callback) { + + callback = Hoek.nextTick(callback); + + if (!this.cache) { + return callback(new Error('Connection not started')); + } + + var segment = this.cache[key.segment]; + if (segment) { + var item = segment[key.id]; + + if (item) { + this.byteSize -= item.byteSize; + } + + delete segment[key.id]; + } + + return callback(); +}; + + +internals.parseJSON = function (json) { + + var obj = null; + + try { + obj = JSON.parse(json); + } + catch (err) { + obj = err; + } + + return obj; +}; diff --git a/node_modules/hapi/node_modules/catbox-memory/package.json b/node_modules/hapi/node_modules/catbox-memory/package.json new file mode 100755 index 0000000..36b5897 --- /dev/null +++ b/node_modules/hapi/node_modules/catbox-memory/package.json @@ -0,0 +1,46 @@ +{ + "name": "catbox-memory", + "description": "Memory adapter for catbox", + "version": "1.1.1", + "repository": { + "type": "git", + "url": "git://github.com/hapijs/catbox-memory" + }, + "main": "index", + "keywords": [ + "cache", + "catbox", + "memory" + ], + "engines": { + "node": ">=0.10.30" + }, + "dependencies": { + "hoek": "2.x.x" + }, + "devDependencies": { + "catbox": "4.x.x", + "lab": "5.x.x", + "code": "1.x.x" + }, + "scripts": { + "test": "make test-cov" + }, + "licenses": [ + { + "type": "BSD", + "url": "http://github.com/hapijs/catbox-memory/raw/master/LICENSE" + } + ], + "readme": "catbox-memory\n=============\n\nMemory adapter for catbox\n\nLead Maintainer - [Colin Ihrig](https://github.com/cjihrig)\n\nCurrent version: [![Current Version](https://img.shields.io/npm/v/catbox-memory.svg)](https://www.npmjs.org/package/catbox-memory) [![Build Status](https://api.travis-ci.org/hapijs/catbox-memory.svg)](https://travis-ci.org/hapijs/catbox-memory)\n\n### Options\n\n- `maxByteSize` - sets an upper limit on the number of bytes that can be stored in the\n cache. Once this limit is reached no additional items will be added to the cache\n until some expire. The utilized memory calculation is a rough approximation and must\n not be relied on. Defaults to `104857600` (100MB).\n- `allowMixedContent` - by default, all data is cached as JSON strings, and converted\n to an object using `JSON.parse()` on retrieval. By setting this option to `true`,\n `Buffer` data can be stored alongside the stringified data. `Buffer`s are not \n stringified, and are copied before storage to prevent the value from changing while\n in the cache. Defaults to `false`.", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/hapijs/catbox-memory/issues" + }, + "_id": "catbox-memory@1.1.1", + "dist": { + "shasum": "f00764c6252960a1ea030cf8c857ca73e8332430" + }, + "_from": "catbox-memory@1.1.1", + "_resolved": "https://registry.npmjs.org/catbox-memory/-/catbox-memory-1.1.1.tgz" +} diff --git a/node_modules/hapi/node_modules/catbox-memory/test/index.js b/node_modules/hapi/node_modules/catbox-memory/test/index.js new file mode 100755 index 0000000..7e716c8 --- /dev/null +++ b/node_modules/hapi/node_modules/catbox-memory/test/index.js @@ -0,0 +1,776 @@ +// Load modules + +var Code = require('code'); +var Lab = require('lab'); +var Catbox = require('catbox'); +var Memory = require('..'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('Memory', function () { + + it('throws an error if not created with new', function (done) { + + var fn = function () { + + Memory(); + }; + + expect(fn).to.throw(Error); + done(); + }); + + it('creates a new connection', function (done) { + + var client = new Catbox.Client(Memory); + client.start(function (err) { + + expect(client.isReady()).to.equal(true); + done(); + }); + }); + + it('closes the connection', function (done) { + + var client = new Catbox.Client(Memory); + client.start(function (err) { + + expect(client.isReady()).to.equal(true); + client.stop(); + expect(client.isReady()).to.equal(false); + done(); + }); + }); + + it('gets an item after setting it', function (done) { + + var client = new Catbox.Client(Memory); + client.start(function (err) { + + var key = { id: 'x', segment: 'test' }; + client.set(key, '123', 500, function (err) { + + expect(err).to.not.exist(); + client.get(key, function (err, result) { + + expect(err).to.equal(null); + expect(result.item).to.equal('123'); + done(); + }); + }); + }); + }); + + it('buffers can be set and retrieved when allowMixedContent is true', function (done) { + + var buffer = new Buffer('string value'); + var client = new Catbox.Client(new Memory({ allowMixedContent: true })); + + client.start(function (err) { + + var key = { id: 'x', segment: 'test' }; + + client.set(key, buffer, 500, function (err) { + + expect(err).to.not.exist(); + client.get(key, function (err, result) { + + expect(err).to.not.exist(); + expect(result.item instanceof Buffer).to.equal(true); + expect(result.item).to.deep.equal(buffer); + done(); + }); + }); + }); + }); + + it('buffers are copied before storing when allowMixedContent is true', function (done) { + + var buffer = new Buffer('string value'); + var client = new Catbox.Client(new Memory({ allowMixedContent: true })); + + client.start(function (err) { + + var key = { id: 'x', segment: 'test' }; + + client.set(key, buffer, 500, function (err) { + + expect(err).to.not.exist(); + client.get(key, function (err, result) { + + expect(err).to.not.exist(); + expect(result.item).to.not.equal(buffer); + done(); + }); + }); + }); + }); + + it('buffers are stringified when allowMixedContent is not true', function (done) { + + var buffer = new Buffer('string value'); + var client = new Catbox.Client(new Memory()); + + client.start(function (err) { + + var key = { id: 'x', segment: 'test' }; + + client.set(key, buffer, 500, function (err) { + + expect(err).to.not.exist(); + client.get(key, function (err, result) { + + expect(err).to.not.exist(); + expect(result.item instanceof Buffer).to.equal(false); + expect(result.item).to.deep.equal(JSON.parse(JSON.stringify(buffer))); + done(); + }); + }); + }); + }); + + it('gets an item after setting it (no memory limit)', function (done) { + + var client = new Catbox.Client(new Memory({ maxByteSize: 0 })); + client.start(function (err) { + + var key = { id: 'x', segment: 'test' }; + client.set(key, '123', 500, function (err) { + + expect(err).to.not.exist(); + client.get(key, function (err, result) { + + expect(err).to.equal(null); + expect(result.item).to.equal('123'); + + client.set(key, '345', 500, function (err) { + + expect(err).to.not.exist(); + client.get(key, function (err, result) { + + expect(err).to.equal(null); + expect(result.item).to.equal('345'); + done(); + }); + }); + }); + }); + }); + }); + + it('fails setting an item circular references', function (done) { + + var client = new Catbox.Client(Memory); + client.start(function (err) { + + var key = { id: 'x', segment: 'test' }; + var value = { a: 1 }; + value.b = value; + client.set(key, value, 10, function (err) { + + expect(err.message).to.equal('Converting circular structure to JSON'); + done(); + }); + }); + }); + + it('fails setting an item with very long ttl', function (done) { + + var client = new Catbox.Client(Memory); + client.start(function (err) { + + var key = { id: 'x', segment: 'test' }; + client.set(key, '123', Math.pow(2, 31), function (err) { + + expect(err.message).to.equal('Invalid ttl (greater than 2147483647)'); + done(); + }); + }); + }); + + it('ignored starting a connection twice on same event', function (done) { + + var client = new Catbox.Client(Memory); + var x = 2; + var start = function () { + + client.start(function (err) { + + expect(client.isReady()).to.equal(true); + --x; + if (!x) { + done(); + } + }); + }; + + start(); + start(); + }); + + it('ignored starting a connection twice chained', function (done) { + + var client = new Catbox.Client(Memory); + client.start(function (err) { + + expect(err).to.not.exist(); + expect(client.isReady()).to.equal(true); + + client.start(function (err) { + + expect(err).to.not.exist(); + expect(client.isReady()).to.equal(true); + done(); + }); + }); + }); + + it('returns not found on get when using null key', function (done) { + + var client = new Catbox.Client(Memory); + client.start(function (err) { + + client.get(null, function (err, result) { + + expect(err).to.equal(null); + expect(result).to.equal(null); + done(); + }); + }); + }); + + it('returns not found on get when item expired', function (done) { + + var client = new Catbox.Client(Memory); + client.start(function (err) { + + var key = { id: 'x', segment: 'test' }; + client.set(key, 'x', 1, function (err) { + + expect(err).to.not.exist(); + setTimeout(function () { + + client.get(key, function (err, result) { + + expect(err).to.equal(null); + expect(result).to.equal(null); + done(); + }); + }, 2); + }); + }); + }); + + it('errors on set when using null key', function (done) { + + var client = new Catbox.Client(Memory); + client.start(function (err) { + + client.set(null, {}, 1000, function (err) { + + expect(err instanceof Error).to.equal(true); + done(); + }); + }); + }); + + it('errors on get when using invalid key', function (done) { + + var client = new Catbox.Client(Memory); + client.start(function (err) { + + client.get({}, function (err) { + + expect(err instanceof Error).to.equal(true); + done(); + }); + }); + }); + + it('errors on set when using invalid key', function (done) { + + var client = new Catbox.Client(Memory); + client.start(function (err) { + + client.set({}, {}, 1000, function (err) { + + expect(err instanceof Error).to.equal(true); + done(); + }); + }); + }); + + it('ignores set when using non-positive ttl value', function (done) { + + var client = new Catbox.Client(Memory); + client.start(function (err) { + + var key = { id: 'x', segment: 'test' }; + client.set(key, 'y', 0, function (err) { + + expect(err).to.not.exist(); + done(); + }); + }); + }); + + it('errors on get when stopped', function (done) { + + var client = new Catbox.Client(Memory); + client.stop(); + var key = { id: 'x', segment: 'test' }; + client.connection.get(key, function (err, result) { + + expect(err).to.exist(); + expect(result).to.not.exist(); + done(); + }); + }); + + it('errors on set when stopped', function (done) { + + var client = new Catbox.Client(Memory); + client.stop(); + var key = { id: 'x', segment: 'test' }; + client.connection.set(key, 'y', 1, function (err) { + + expect(err).to.exist(); + done(); + }); + }); + + it('errors on missing segment name', function (done) { + + var config = { + expiresIn: 50000 + }; + var fn = function () { + + var client = new Catbox.Client(Memory); + var cache = new Catbox.Policy(config, client, ''); + }; + expect(fn).to.throw(Error); + done(); + }); + + it('errors on bad segment name', function (done) { + + var config = { + expiresIn: 50000 + }; + var fn = function () { + + var client = new Catbox.Client(Memory); + var cache = new Catbox.Policy(config, client, 'a\0b'); + }; + expect(fn).to.throw(Error); + done(); + }); + + describe('start()', function () { + + it('creates an empty cache object', function (done) { + + var memory = new Memory(); + expect(memory.cache).to.not.exist(); + memory.start(function () { + + expect(memory.cache).to.exist(); + done(); + }); + }); + }); + + describe('stop()', function () { + + it('sets the cache object to null', function (done) { + + var memory = new Memory(); + expect(memory.cache).to.not.exist(); + memory.start(function () { + + expect(memory.cache).to.exist(); + memory.stop(); + expect(memory.cache).to.not.exist(); + done(); + }); + }); + }); + + describe('get()', function () { + + it('errors on invalid json in cache', function (done) { + + var key = { + segment: 'test', + id: 'test' + }; + + var memory = new Memory(); + expect(memory.cache).to.not.exist(); + + memory.start(function () { + + expect(memory.cache).to.exist(); + memory.set(key, 'myvalue', 10, function () { + + expect(memory.cache[key.segment][key.id].item).to.equal('"myvalue"'); + memory.cache[key.segment][key.id].item = '"myvalue'; + memory.get(key, function (err, result) { + + expect(err.message).to.equal('Bad value content'); + done(); + }); + }); + }); + }); + + it('returns not found on missing segment', function (done) { + + var key = { + segment: 'test', + id: 'test' + }; + + var memory = new Memory(); + expect(memory.cache).to.not.exist(); + + memory.start(function () { + + expect(memory.cache).to.exist(); + memory.get(key, function (err, result) { + + expect(err).to.not.exist(); + expect(result).to.not.exist(); + done(); + }); + }); + }); + }); + + describe('set()', function () { + + it('adds an item to the cache object', function (done) { + + var key = { + segment: 'test', + id: 'test' + }; + + var memory = new Memory(); + expect(memory.cache).to.not.exist(); + + memory.start(function () { + + expect(memory.cache).to.exist(); + memory.set(key, 'myvalue', 10, function () { + + expect(memory.cache[key.segment][key.id].item).to.equal('"myvalue"'); + done(); + }); + }); + }); + + it('removes an item from the cache object when it expires', function (done) { + + var key = { + segment: 'test', + id: 'test' + }; + + var memory = new Memory(); + expect(memory.cache).to.not.exist(); + + memory.start(function () { + + expect(memory.cache).to.exist(); + memory.set(key, 'myvalue', 10, function () { + + expect(memory.cache[key.segment][key.id].item).to.equal('"myvalue"'); + setTimeout(function () { + + expect(memory.cache[key.segment][key.id]).to.not.exist(); + done(); + }, 15); + }); + }); + }); + + it('errors when the maxByteSize has been reached', function (done) { + + var key = { + segment: 'test', + id: 'test' + }; + + var memory = new Memory({ maxByteSize: 4 }); + expect(memory.cache).to.not.exist(); + + memory.start(function () { + + expect(memory.cache).to.exist(); + memory.set(key, 'myvalue', 10, function (err) { + + expect(err).to.exist(); + expect(err).to.be.instanceOf(Error); + done(); + }); + }); + }); + + it('increments the byte size when an item is inserted and errors when the limit is reached', function (done) { + + var key1 = { + segment: 'test', + id: 'test' + }; + + var key2 = { + segment: 'test', + id: 'test2' + }; + + // maxByteSize is slightly larger than the first key so we are left with a small + // amount of free space, but not enough for the second key to be created. + var memory = new Memory({ maxByteSize: 200 }); + expect(memory.cache).to.not.exist(); + + memory.start(function () { + + expect(memory.cache).to.exist(); + memory.set(key1, 'my', 10, function (err) { + + expect(err).to.not.exist(); + expect(memory.cache[key1.segment][key1.id].item).to.equal('"my"'); + + memory.set(key2, 'myvalue', 10, function (err) { + + expect(err).to.exist(); + done(); + }); + }); + }); + }); + + it('increments the byte size when an object is inserted', function (done) { + + var key1 = { + segment: 'test', + id: 'test' + }; + var itemToStore = { + my: { + array: [1, 2, 3], + bool: true, + string: 'test' + } + }; + + var memory = new Memory({ maxByteSize: 2000 }); + expect(memory.cache).to.not.exist(); + + memory.start(function () { + + expect(memory.cache).to.exist(); + memory.set(key1, itemToStore, 10, function () { + + expect(memory.byteSize).to.equal(204); + expect(memory.cache[key1.segment][key1.id].byteSize).to.equal(204); + expect(memory.cache[key1.segment][key1.id].item).to.exist(); + done(); + }); + }); + }); + + it('leaves the byte size unchanged when an object overrides existing key with same size', function (done) { + + var key1 = { + segment: 'test', + id: 'test' + }; + var itemToStore = { + my: { + array: [1, 2, 3], + bool: true, + string: 'test', + undefined: undefined + } + }; + + var memory = new Memory({ maxByteSize: 2000 }); + expect(memory.cache).to.not.exist(); + + memory.start(function () { + + expect(memory.cache).to.exist(); + memory.set(key1, itemToStore, 10, function () { + + expect(memory.cache[key1.segment][key1.id].byteSize).to.equal(204); + expect(memory.cache[key1.segment][key1.id].item).to.exist(); + memory.set(key1, itemToStore, 10, function () { + + expect(memory.cache[key1.segment][key1.id].byteSize).to.equal(204); + expect(memory.cache[key1.segment][key1.id].item).to.exist(); + done(); + }); + }); + }); + }); + }); + + describe('drop()', function () { + + it('drops an existing item', function (done) { + + var client = new Catbox.Client(Memory); + client.start(function (err) { + + var key = { id: 'x', segment: 'test' }; + client.set(key, '123', 500, function (err) { + + expect(err).to.not.exist(); + client.get(key, function (err, result) { + + expect(err).to.equal(null); + expect(result.item).to.equal('123'); + client.drop(key, function (err) { + + expect(err).to.not.exist(); + done(); + }); + }); + }); + }); + }); + + it('drops an item from a missing segment', function (done) { + + var client = new Catbox.Client(Memory); + client.start(function (err) { + + var key = { id: 'x', segment: 'test' }; + client.drop(key, function (err) { + + expect(err).to.not.exist(); + done(); + }); + }); + }); + + it('drops a missing item', function (done) { + + var client = new Catbox.Client(Memory); + client.start(function (err) { + + var key = { id: 'x', segment: 'test' }; + client.set(key, '123', 500, function (err) { + + expect(err).to.not.exist(); + client.get(key, function (err, result) { + + expect(err).to.equal(null); + expect(result.item).to.equal('123'); + client.drop({ id: 'y', segment: 'test' }, function (err) { + + expect(err).to.not.exist(); + done(); + }); + }); + }); + }); + }); + + it('errors on drop when using invalid key', function (done) { + + var client = new Catbox.Client(Memory); + client.start(function (err) { + + client.drop({}, function (err) { + + expect(err instanceof Error).to.equal(true); + done(); + }); + }); + }); + + it('errors on drop when using null key', function (done) { + + var client = new Catbox.Client(Memory); + client.start(function (err) { + + client.drop(null, function (err) { + + expect(err instanceof Error).to.equal(true); + done(); + }); + }); + }); + + it('errors on drop when stopped', function (done) { + + var client = new Catbox.Client(Memory); + client.stop(); + var key = { id: 'x', segment: 'test' }; + client.connection.drop(key, function (err) { + + expect(err).to.exist(); + done(); + }); + }); + + it('errors when cache item dropped while stopped', function (done) { + + var client = new Catbox.Client(Memory); + client.stop(); + client.drop('a', function (err) { + + expect(err).to.exist(); + done(); + }); + }); + }); + + describe('validateSegmentName()', function () { + + it('errors when the name is empty', function (done) { + + var memory = new Memory(); + var result = memory.validateSegmentName(''); + + expect(result).to.be.instanceOf(Error); + expect(result.message).to.equal('Empty string'); + done(); + }); + + it('errors when the name has a null character', function (done) { + + var memory = new Memory(); + var result = memory.validateSegmentName('\0test'); + + expect(result).to.be.instanceOf(Error); + done(); + }); + + it('returns null when there are no errors', function (done) { + + var memory = new Memory(); + var result = memory.validateSegmentName('valid'); + + expect(result).to.not.be.instanceOf(Error); + expect(result).to.equal(null); + done(); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/catbox/.npmignore b/node_modules/hapi/node_modules/catbox/.npmignore new file mode 100644 index 0000000..77ba16c --- /dev/null +++ b/node_modules/hapi/node_modules/catbox/.npmignore @@ -0,0 +1,18 @@ +.idea +*.iml +npm-debug.log +dump.rdb +node_modules +results.tap +results.xml +npm-shrinkwrap.json +config.json +.DS_Store +*/.DS_Store +*/*/.DS_Store +._* +*/._* +*/*/._* +coverage.* +lib-cov + diff --git a/node_modules/hapi/node_modules/catbox/.travis.yml b/node_modules/hapi/node_modules/catbox/.travis.yml new file mode 100755 index 0000000..f502178 --- /dev/null +++ b/node_modules/hapi/node_modules/catbox/.travis.yml @@ -0,0 +1,6 @@ +language: node_js + +node_js: + - 0.10 + - 0.12 + - iojs diff --git a/node_modules/hapi/node_modules/catbox/CONTRIBUTING.md b/node_modules/hapi/node_modules/catbox/CONTRIBUTING.md new file mode 100644 index 0000000..8928361 --- /dev/null +++ b/node_modules/hapi/node_modules/catbox/CONTRIBUTING.md @@ -0,0 +1 @@ +Please view our [hapijs contributing guide](https://github.com/hapijs/hapi/blob/master/CONTRIBUTING.md). diff --git a/node_modules/hapi/node_modules/catbox/LICENSE b/node_modules/hapi/node_modules/catbox/LICENSE new file mode 100755 index 0000000..4a87d4e --- /dev/null +++ b/node_modules/hapi/node_modules/catbox/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2012-2014, Walmart and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/catbox/graphs/contributors \ No newline at end of file diff --git a/node_modules/hapi/node_modules/catbox/Makefile b/node_modules/hapi/node_modules/catbox/Makefile new file mode 100755 index 0000000..5404b23 --- /dev/null +++ b/node_modules/hapi/node_modules/catbox/Makefile @@ -0,0 +1,9 @@ +test: + @node node_modules/lab/bin/lab +test-cov: + @node node_modules/lab/bin/lab -t 100 +test-cov-html: + @node node_modules/lab/bin/lab -r html -o coverage.html + +.PHONY: test test-cov test-cov-html + diff --git a/node_modules/hapi/node_modules/catbox/README.md b/node_modules/hapi/node_modules/catbox/README.md new file mode 100755 index 0000000..a7aa95e --- /dev/null +++ b/node_modules/hapi/node_modules/catbox/README.md @@ -0,0 +1,136 @@ +![catbox Logo](https://raw.github.com/hapijs/catbox/master/images/catbox.png) + +Multi-strategy object caching service +Version: **4.x** + +[![Build Status](https://secure.travis-ci.org/hapijs/catbox.png)](http://travis-ci.org/hapijs/catbox) + +Lead Maintainer: [Ben Acker](https://github.com/nvcexploder) + +**catbox** is a multi-strategy key-value object store. It comes with extensions supporting a memory cache, +[Redis](http://redis.io/), [MongoDB](http://www.mongodb.org/), [Memcached](http://memcached.org/), [Riak](http://basho.com/riak/), [Amazon S3](http://aws.amazon.com/s3/), and [RethinkDB](http://rethinkdb.com). +**catbox** provides two interfaces: a low-level `Client` and a high-level `Policy`. + + +### Installation + +In order to reduce module dependencies, **catbox** does not includes the external caching strategies. To use other strategies, +each service must be manually installed via npm or package dependencies manually. The available strategies are: + +- [Memory](https://github.com/hapijs/catbox-memory) +- [Redis](https://github.com/hapijs/catbox-redis) +- [MongoDB](https://github.com/hapijs/catbox-mongodb) +- [Memcached](https://github.com/hapijs/catbox-memcached) +- [Riak](https://github.com/DanielBarnes/catbox-riak) +- [Amazon S3](https://github.com/fhemberger/catbox-s3) +- [RethinkDB](https://github.com/codedmart/catbox-rethinkdb) + + +### `Client` + +The `Client` object provides a low-level cache abstraction. The object is constructed using `new Client(engine, options)` where: + +- `engine` - is an object or a prototype function implementing the cache strategy: + - function - a prototype function with the signature `function(options)`. **catbox** will call `new func(options)`. + - object - a pre instantiated client implementation object. Does not support passing `options`. +- `options` - the strategy configuration object. Each strategy defines its own configuration options with the following common options: + - `partition` - the partition name used to isolate the cached results across multiple clients. The partition name is used + as the MongoDB database name, the Riak bucket, or as a key prefix in Redis and Memcached. To share the cache across multiple clients, + use the same partition name. + +Note that any implementation of client strategies must return deep copies of the stored data as the API assumes that the object returned +from a `get()` is owned by the called and can be safely modified without affecting the cache copy. + + +#### API + +The `Client` object provides the following methods: + +- `start(callback)` - creates a connection to the cache server. Must be called before any other method is available. + The `callback` signature is `function(err)`. +- `stop()` - terminates the connection to the cache server. +- `get(key, callback)` - retrieve an item from the cache engine if found where: + - `key` - a cache key object (see below). + - `callback` - a function with the signature `function(err, cached)`. If the item is not found, both `err` and `cached` are `null`. + If found, the `cached` object contains the following: + - `item` - the value stored in the cache using `set()`. + - `stored` - the timestamp when the item was stored in the cache (in milliseconds). + - `ttl` - the remaining time-to-live (not the original value used when storing the object). +- `set(key, value, ttl, callback)` - store an item in the cache for a specified length of time, where: + - `key` - a cache key object (see below). + - `value` - the string or object value to be stored. + - `ttl` - a time-to-live value in milliseconds after which the item is automatically removed from the cache (or is marked invalid). + - `callback` - a function with the signature `function(err)`. +- `drop(key, callback)` - remove an item from cache where: + - `key` - a cache key object (see below). + - `callback` - a function with the signature `function(err)`. + +Any method with a `key` argument takes an object with the following required properties: +- `segment` - a caching segment name string. Enables using a single cache server for storing different sets of items with overlapping ids. +- `id` - a unique item identifier string (per segment). Can be an empty string. + + +### `Policy` + +The `Policy` object provides a convenient cache interface by setting a global policy which is automatically applied to every storage action. +The object is constructed using `new Policy(options, [cache, segment])` where: + +- `options` - is an object with the following keys: + - `expiresIn` - relative expiration expressed in the number of milliseconds since the item was saved in the cache. Cannot be used + together with `expiresAt`. + - `expiresAt` - time of day expressed in 24h notation using the 'HH:MM' format, at which point all cache records for the route + expire. Uses local time. Cannot be used together with `expiresIn`. + - `generateFunc` - a function used to generate a new cache item if one is not found in the cache when calling `get()`. The method's + signature is `function(id, next)` where: + - `id` - the `id` string or object provided to the `get()` method. + - `next` - the method called when the new item is returned with the signature `function(err, value, ttl)` where: + - `err` - an error condition. + - `value` - the new value generated. + - `ttl` - the cache ttl value in milliseconds. Set to `0` to skip storing in the cache. Defaults to the cache global policy. + - `staleIn` - number of milliseconds to mark an item stored in cache as stale and attempt to regenerate it when `generateFunc` is + provided. Must be less than `expiresIn`. Alternatively function that returns staleIn value in miliseconds. The function signature is + `function(stored, ttl)` where: + - `stored` - the timestamp when the item was stored in the cache (in milliseconds). + - `ttl` - the remaining time-to-live (not the original value used when storing the object). + - `staleTimeout` - number of milliseconds to wait before checking if an item is stale. + - `generateTimeout` - number of milliseconds to wait before returning a timeout error when the `generateFunc` function + takes too long to return a value. When the value is eventually returned, it is stored in the cache for future requests. + - `dropOnError` - if `true`, an error or timeout in the `generateFunc` causes the stale value to be evicted from the cache. + Defaults to `true`. +- `cache` - a `Client` instance (which has already been started). +- `segment` - required when `cache` is provided. The segment name used to isolate cached items within the cache partition. + + +#### API + +The `Policy` object provides the following methods: + +- `get(id, callback)` - retrieve an item from the cache. If the item is not found and the `generateFunc` method was provided, a new value + is generated, stored in the cache, and returned. Multiple concurrent requests are queued and processed once. The method arguments are: + - `id` - the unique item identifier (within the policy segment). Can be a string or an object with the required 'id' key. + - `callback` - the return function. The function signature is `function(err, value, cached, report)` where: + - `err` - any errors encountered. + - `value` - the fetched or generated value. + - `cached` - `null` if a valid item was not found in the cache, or an object with the following keys: + - `item` - the cached `value`. + - `stored` - the timestamp when the item was stored in the cache. + - `ttl` - the cache ttl value for the record. + - `isStale` - `true` if the item is stale. + - `report` - an object with logging information about the generation operation containing the following keys (as relevant): + - `msec` - the cache lookup time in milliseconds. + - `stored` - the timestamp when the item was stored in the cache. + - `isStale` - `true` if the item is stale. + - `ttl` - the cache ttl value for the record. + - `error` - lookup error. +- `set(id, value, ttl, callback)` - store an item in the cache where: + - `id` - the unique item identifier (within the policy segment). + - `value` - the string or object value to be stored. + - `ttl` - a time-to-live **override** value in milliseconds after which the item is automatically removed from the cache (or is marked invalid). + This should be set to `0` in order to use the caching rules configured when creating the `Policy` object. + - `callback` - a function with the signature `function(err)`. +- `drop(id, callback)` - remove the item from cache where: + - `id` - the unique item identifier (within the policy segment). + - `callback` - a function with the signature `function(err)`. +- `ttl(created)` - given a `created` timestamp in milliseconds, returns the time-to-live left based on the configured rules. +- `rules(options) - changes the policy rules after construction (note that items already stored will not be affected) where: + - `options` - the same `options` as the `Policy` constructor. diff --git a/node_modules/hapi/node_modules/catbox/examples/policy.js b/node_modules/hapi/node_modules/catbox/examples/policy.js new file mode 100755 index 0000000..7f0adfb --- /dev/null +++ b/node_modules/hapi/node_modules/catbox/examples/policy.js @@ -0,0 +1,64 @@ +// After starting this example load http://localhost:8080 and hit refresh, you will notice that it loads the response from cache for the first 5 seconds and then reloads the cache. Look at the console to see it setting and getting items from cache. + +// Load modules + +var Catbox = require('../'); +var Http = require('http'); + + + +// Declare internals + +var internals = {}; + + +internals.handler = function (req, res) { + + internals.getResponse(function (item) { + + res.writeHead(200, {'Content-Type': 'text/plain'}); + res.end(item); + }); +}; + + +internals.getResponse = function (callback) { + + internals.policy.get('myExample', callback); +}; + + +internals.startCache = function (callback) { + + var clientOptions = { + partition: 'examples' // For redis this will store items under keys that start with examples: + }; + + var policyOptions = { + expiresIn: 5000, + generateFunc: function (id, next) { + + var item = 'example'; + console.log(item); + return next(null, item); + } + }; + + var client = new Catbox.Client(require('../test/import'), clientOptions); + client.start(function () { + + internals.policy = new Catbox.Policy(policyOptions, client, 'example'); + callback(); + }); +}; + + +internals.startServer = function () { + + var server = Http.createServer(internals.handler); + server.listen(8080); + console.log('Server started at http://localhost:8080/'); +}; + + +internals.startCache(internals.startServer); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/catbox/images/catbox.png b/node_modules/hapi/node_modules/catbox/images/catbox.png new file mode 100755 index 0000000000000000000000000000000000000000..cc1799f7e75fa901b506dcb5d1e18e15d8be889a GIT binary patch literal 48752 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 [callbacks] + this.rules(options); + + if (cache) { + var nameErr = cache.validateSegmentName(segment); + Hoek.assert(nameErr === null, 'Invalid segment name: ' + segment + (nameErr ? ' (' + nameErr.message + ')' : '')); + + this._segment = segment; + } +}; + + +internals.Policy.prototype.rules = function (options) { + + this.rule = internals.Policy.compile(options, !!this._cache); +}; + + +internals.Policy.prototype.get = function (key, callback) { // key: string or { id: 'id' } + + var self = this; + + // Check if request is already pending + + var id = (key && typeof key === 'object') ? key.id : key; + var pendingsId = '+' + id; // Prefix to avoid conflicts with JS internals (e.g. __proto__) + if (this._pendings[pendingsId]) { + this._pendings[pendingsId].push(callback); + return; + } + + this._pendings[pendingsId] = [callback]; + + // Lookup in cache + + var timer = new Hoek.Timer(); + this._get(id, function (err, cached) { + + // Prepare report + + var report = { + msec: timer.elapsed(), + error: err + }; + + if (cached) { + report.stored = cached.stored; + report.ttl = cached.ttl; + var staleIn = typeof self.rule.staleIn === 'function' ? self.rule.staleIn(cached.stored, cached.ttl) : self.rule.staleIn; + cached.isStale = (staleIn ? (Date.now() - cached.stored) >= staleIn : false); + report.isStale = cached.isStale; + } + + // No generate method + + if (!self.rule.generateFunc) { + return self._finalize(id, err, cached ? cached.item : null, cached, report); + } + + // Error / Not found + + if (err || + !cached) { + + return self._generate(id, key, null, report, callback); + } + + // Check if found and fresh + + if (!cached.isStale) { + return self._finalize(id, null, cached.item, cached, report); + } + + return self._generate(id, key, cached, report, callback); + }); +}; + + +internals.Policy.prototype._get = function (id, callback) { + + if (!this._cache) { + return Hoek.nextTick(callback)(null, null); + } + + this._cache.get({ segment: this._segment, id: id }, callback); +}; + + +internals.Policy.prototype._generate = function (id, key, cached, report, callback) { + + var self = this; + + var finalize = Hoek.once(function (id, err, value, cached, report) { + + return self._finalize(id, err, value, cached, report); + }); + + if (cached) { // Must be stale + + // Set stale timeout + + cached.ttl -= this.rule.staleTimeout; // Adjust TTL for when the timeout is invoked (staleTimeout must be valid if isStale is true) + if (cached.ttl > 0) { + setTimeout(function () { + + return finalize(id, null, cached.item, cached, report); + }, this.rule.staleTimeout); + } + } + else if (this.rule.generateTimeout) { + + // Set item generation timeout (when not in cache) + + setTimeout(function () { + + return finalize(id, Boom.serverTimeout(), null, null, report); + }, this.rule.generateTimeout); + } + + // Generate new value + + try { + this.rule.generateFunc.call(null, key, function (err, value, ttl) { + + // Error (if dropOnError is not set to false) or not cached + + if ((err && self.rule.dropOnError) || + ttl === 0) { // null or undefined means use policy + + self.drop(id); // Invalidate cache + } + else if (!err) { + self.set(id, value, ttl); // Lazy save (replaces stale cache copy with late-coming fresh copy) + } + + if (cached && + err && + !self.rule.dropOnError) { + + return finalize(id, err, cached.item, cached, report); + } + + return finalize(id, err, value, null, report); // Ignored if stale value already returned + }); + } + catch (err) { + return finalize(id, err, null, null, report); + } +}; + + +internals.Policy.prototype._finalize = function (id, err, value, cached, report) { + + id = '+' + id; + var pendings = this._pendings[id]; + delete this._pendings[id]; + + for (var i = 0, il = pendings.length; i < il; ++i) { + Hoek.nextTick(pendings[i])(err, value, cached, report); + } +}; + + +internals.Policy.prototype.set = function (key, value, ttl, callback) { + + callback = callback || Hoek.ignore; + + if (!this._cache) { + return callback(null); + } + + ttl = ttl || internals.Policy.ttl(this.rule); + var id = (key && typeof key === 'object') ? key.id : key; + this._cache.set({ segment: this._segment, id: id }, value, ttl, callback); +}; + + +internals.Policy.prototype.drop = function (id, callback) { + + callback = callback || Hoek.ignore; + + if (!this._cache) { + return callback(null); + } + + this._cache.drop({ segment: this._segment, id: id }, callback); +}; + + +internals.Policy.prototype.ttl = function (created) { + + return internals.Policy.ttl(this.rule, created); +}; + + +internals.schema = Joi.object({ + expiresIn: Joi.number().integer().min(1), + expiresAt: Joi.string().regex(/^\d\d?\:\d\d$/), + staleIn: [Joi.number().integer().min(1).max(86400000 - 1), Joi.func()], // One day - 1 (max is inclusive) + staleTimeout: Joi.number().integer().min(1), + generateFunc: Joi.func(), + generateTimeout: Joi.number().integer().min(1), + dropOnError: Joi.boolean(), + + // Ignored external keys (hapi) + + privacy: Joi.any(), + cache: Joi.any(), + segment: Joi.any(), + shared: Joi.any() +}) + .without('expiresIn', 'expiresAt') + .with('staleIn', 'generateFunc') + .with('generateTimeout', 'generateFunc') + .with('dropOnError', 'generateFunc') + .and('staleIn', 'staleTimeout'); + + +internals.Policy.compile = function (options, serverSide) { + + /* + { + expiresIn: 30000, + expiresAt: '13:00', + + generateFunc: function (id, next) { next(err, result, ttl); } + generateTimeout: 500, + staleIn: 20000, + staleTimeout: 500, + dropOnError: true + } + */ + + var rule = {}; + + if (!options || + !Object.keys(options).length) { + + return rule; + } + + // Validate rule + + Joi.assert(options, internals.schema, 'Invalid cache policy configuration'); + + var hasExpiresIn = options.expiresIn !== undefined && options.expiresIn !== null; + var hasExpiresAt = options.expiresAt !== undefined && options.expiresAt !== null; + + Hoek.assert(!hasExpiresAt || typeof options.expiresAt === 'string', 'expiresAt must be a string', options); + Hoek.assert(!hasExpiresIn || Hoek.isInteger(options.expiresIn), 'expiresIn must be an integer', options); + Hoek.assert(!hasExpiresIn || !options.staleIn || typeof options.staleIn === 'function' || options.staleIn < options.expiresIn, 'staleIn must be less than expiresIn'); + Hoek.assert(!options.staleIn || serverSide, 'Cannot use stale options without server-side caching'); + Hoek.assert(!options.staleTimeout || !hasExpiresIn || options.staleTimeout < options.expiresIn, 'staleTimeout must be less than expiresIn'); + Hoek.assert(!options.staleTimeout || !hasExpiresIn || typeof options.staleIn === 'function' || options.staleTimeout < (options.expiresIn - options.staleIn), 'staleTimeout must be less than the delta between expiresIn and staleIn'); + + // Expiration + + if (hasExpiresAt) { + + // expiresAt + + var time = /^(\d\d?):(\d\d)$/.exec(options.expiresAt); + rule.expiresAt = { + hours: parseInt(time[1], 10), + minutes: parseInt(time[2], 10) + }; + } + else { + + // expiresIn + + rule.expiresIn = options.expiresIn || 0; + } + + // generateTimeout + + if (options.generateFunc) { + rule.generateFunc = options.generateFunc; + rule.generateTimeout = options.generateTimeout; + + // Stale + + if (options.staleIn) { + rule.staleIn = options.staleIn; + rule.staleTimeout = options.staleTimeout; + } + + rule.dropOnError = options.dropOnError !== undefined ? options.dropOnError : true; // Defaults to true + } + + return rule; +}; + + +internals.Policy.ttl = function (rule, created, now) { + + now = now || Date.now(); + created = created || now; + var age = now - created; + + if (age < 0) { + return 0; // Created in the future, assume expired/bad + } + + if (rule.expiresIn) { + return Math.max(rule.expiresIn - age, 0); + } + + if (rule.expiresAt) { + if (age > internals.day) { // If the item was created more than a 24 hours ago + return 0; + } + + var expiresAt = new Date(created); // Compare expiration time on the same day + expiresAt.setHours(rule.expiresAt.hours); + expiresAt.setMinutes(rule.expiresAt.minutes); + expiresAt.setSeconds(0); + expiresAt.setMilliseconds(0); + var expires = expiresAt.getTime(); + + if (expires <= created) { + expires += internals.day; // Move to tomorrow + } + + if (now >= expires) { // Expired + return 0; + } + + return expires - now; + } + + return 0; // No rule +}; diff --git a/node_modules/hapi/node_modules/catbox/package.json b/node_modules/hapi/node_modules/catbox/package.json new file mode 100755 index 0000000..f1a34b3 --- /dev/null +++ b/node_modules/hapi/node_modules/catbox/package.json @@ -0,0 +1,45 @@ +{ + "name": "catbox", + "description": "Multi-strategy object caching service", + "version": "4.2.2", + "repository": { + "type": "git", + "url": "git://github.com/hapijs/catbox" + }, + "main": "index", + "keywords": [ + "cache" + ], + "engines": { + "node": ">=0.10.32" + }, + "dependencies": { + "boom": "2.x.x", + "hoek": "2.x.x", + "joi": "6.x.x" + }, + "devDependencies": { + "code": "1.x.x", + "lab": "5.x.x" + }, + "scripts": { + "test": "make test-cov" + }, + "licenses": [ + { + "type": "BSD", + "url": "http://github.com/hapijs/catbox/raw/master/LICENSE" + } + ], + "readme": "![catbox Logo](https://raw.github.com/hapijs/catbox/master/images/catbox.png)\n\nMulti-strategy object caching service\nVersion: **4.x**\n\n[![Build Status](https://secure.travis-ci.org/hapijs/catbox.png)](http://travis-ci.org/hapijs/catbox)\n\nLead Maintainer: [Ben Acker](https://github.com/nvcexploder)\n\n**catbox** is a multi-strategy key-value object store. It comes with extensions supporting a memory cache,\n[Redis](http://redis.io/), [MongoDB](http://www.mongodb.org/), [Memcached](http://memcached.org/), [Riak](http://basho.com/riak/), [Amazon S3](http://aws.amazon.com/s3/), and [RethinkDB](http://rethinkdb.com).\n**catbox** provides two interfaces: a low-level `Client` and a high-level `Policy`.\n\n\n### Installation\n\nIn order to reduce module dependencies, **catbox** does not includes the external caching strategies. To use other strategies,\neach service must be manually installed via npm or package dependencies manually. The available strategies are:\n\n- [Memory](https://github.com/hapijs/catbox-memory)\n- [Redis](https://github.com/hapijs/catbox-redis)\n- [MongoDB](https://github.com/hapijs/catbox-mongodb)\n- [Memcached](https://github.com/hapijs/catbox-memcached)\n- [Riak](https://github.com/DanielBarnes/catbox-riak)\n- [Amazon S3](https://github.com/fhemberger/catbox-s3)\n- [RethinkDB](https://github.com/codedmart/catbox-rethinkdb)\n\n\n### `Client`\n\nThe `Client` object provides a low-level cache abstraction. The object is constructed using `new Client(engine, options)` where:\n\n- `engine` - is an object or a prototype function implementing the cache strategy:\n - function - a prototype function with the signature `function(options)`. **catbox** will call `new func(options)`.\n - object - a pre instantiated client implementation object. Does not support passing `options`.\n- `options` - the strategy configuration object. Each strategy defines its own configuration options with the following common options:\n - `partition` - the partition name used to isolate the cached results across multiple clients. The partition name is used\n as the MongoDB database name, the Riak bucket, or as a key prefix in Redis and Memcached. To share the cache across multiple clients,\n use the same partition name.\n\nNote that any implementation of client strategies must return deep copies of the stored data as the API assumes that the object returned\nfrom a `get()` is owned by the called and can be safely modified without affecting the cache copy.\n\n\n#### API\n\nThe `Client` object provides the following methods:\n\n- `start(callback)` - creates a connection to the cache server. Must be called before any other method is available.\n The `callback` signature is `function(err)`.\n- `stop()` - terminates the connection to the cache server.\n- `get(key, callback)` - retrieve an item from the cache engine if found where:\n - `key` - a cache key object (see below).\n - `callback` - a function with the signature `function(err, cached)`. If the item is not found, both `err` and `cached` are `null`.\n If found, the `cached` object contains the following:\n - `item` - the value stored in the cache using `set()`.\n - `stored` - the timestamp when the item was stored in the cache (in milliseconds).\n - `ttl` - the remaining time-to-live (not the original value used when storing the object).\n- `set(key, value, ttl, callback)` - store an item in the cache for a specified length of time, where:\n - `key` - a cache key object (see below).\n - `value` - the string or object value to be stored.\n - `ttl` - a time-to-live value in milliseconds after which the item is automatically removed from the cache (or is marked invalid).\n - `callback` - a function with the signature `function(err)`.\n- `drop(key, callback)` - remove an item from cache where:\n - `key` - a cache key object (see below).\n - `callback` - a function with the signature `function(err)`.\n\nAny method with a `key` argument takes an object with the following required properties:\n- `segment` - a caching segment name string. Enables using a single cache server for storing different sets of items with overlapping ids.\n- `id` - a unique item identifier string (per segment). Can be an empty string.\n\n\n### `Policy`\n\nThe `Policy` object provides a convenient cache interface by setting a global policy which is automatically applied to every storage action.\nThe object is constructed using `new Policy(options, [cache, segment])` where:\n\n- `options` - is an object with the following keys:\n - `expiresIn` - relative expiration expressed in the number of milliseconds since the item was saved in the cache. Cannot be used\n together with `expiresAt`.\n - `expiresAt` - time of day expressed in 24h notation using the 'HH:MM' format, at which point all cache records for the route\n expire. Uses local time. Cannot be used together with `expiresIn`.\n - `generateFunc` - a function used to generate a new cache item if one is not found in the cache when calling `get()`. The method's\n signature is `function(id, next)` where:\n - `id` - the `id` string or object provided to the `get()` method.\n - `next` - the method called when the new item is returned with the signature `function(err, value, ttl)` where:\n - `err` - an error condition.\n - `value` - the new value generated.\n - `ttl` - the cache ttl value in milliseconds. Set to `0` to skip storing in the cache. Defaults to the cache global policy.\n - `staleIn` - number of milliseconds to mark an item stored in cache as stale and attempt to regenerate it when `generateFunc` is\n provided. Must be less than `expiresIn`. Alternatively function that returns staleIn value in miliseconds. The function signature is\n `function(stored, ttl)` where:\n - `stored` - the timestamp when the item was stored in the cache (in milliseconds).\n - `ttl` - the remaining time-to-live (not the original value used when storing the object).\n - `staleTimeout` - number of milliseconds to wait before checking if an item is stale.\n - `generateTimeout` - number of milliseconds to wait before returning a timeout error when the `generateFunc` function\n takes too long to return a value. When the value is eventually returned, it is stored in the cache for future requests.\n - `dropOnError` - if `true`, an error or timeout in the `generateFunc` causes the stale value to be evicted from the cache.\n Defaults to `true`.\n- `cache` - a `Client` instance (which has already been started).\n- `segment` - required when `cache` is provided. The segment name used to isolate cached items within the cache partition.\n\n\n#### API\n\nThe `Policy` object provides the following methods:\n\n- `get(id, callback)` - retrieve an item from the cache. If the item is not found and the `generateFunc` method was provided, a new value\n is generated, stored in the cache, and returned. Multiple concurrent requests are queued and processed once. The method arguments are:\n - `id` - the unique item identifier (within the policy segment). Can be a string or an object with the required 'id' key.\n - `callback` - the return function. The function signature is `function(err, value, cached, report)` where:\n - `err` - any errors encountered.\n - `value` - the fetched or generated value.\n - `cached` - `null` if a valid item was not found in the cache, or an object with the following keys:\n - `item` - the cached `value`.\n - `stored` - the timestamp when the item was stored in the cache.\n - `ttl` - the cache ttl value for the record.\n - `isStale` - `true` if the item is stale.\n - `report` - an object with logging information about the generation operation containing the following keys (as relevant):\n - `msec` - the cache lookup time in milliseconds.\n - `stored` - the timestamp when the item was stored in the cache.\n - `isStale` - `true` if the item is stale.\n - `ttl` - the cache ttl value for the record.\n - `error` - lookup error.\n- `set(id, value, ttl, callback)` - store an item in the cache where:\n - `id` - the unique item identifier (within the policy segment).\n - `value` - the string or object value to be stored.\n - `ttl` - a time-to-live **override** value in milliseconds after which the item is automatically removed from the cache (or is marked invalid).\n This should be set to `0` in order to use the caching rules configured when creating the `Policy` object.\n - `callback` - a function with the signature `function(err)`.\n- `drop(id, callback)` - remove the item from cache where:\n - `id` - the unique item identifier (within the policy segment).\n - `callback` - a function with the signature `function(err)`.\n- `ttl(created)` - given a `created` timestamp in milliseconds, returns the time-to-live left based on the configured rules.\n- `rules(options) - changes the policy rules after construction (note that items already stored will not be affected) where:\n - `options` - the same `options` as the `Policy` constructor.\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/hapijs/catbox/issues" + }, + "_id": "catbox@4.2.2", + "dist": { + "shasum": "ff3f5d15b8a7f8bdd21e2bebef5b701d4e1f74c0" + }, + "_from": "catbox@4.2.2", + "_resolved": "https://registry.npmjs.org/catbox/-/catbox-4.2.2.tgz" +} diff --git a/node_modules/hapi/node_modules/catbox/test/client.js b/node_modules/hapi/node_modules/catbox/test/client.js new file mode 100755 index 0000000..d6c93b0 --- /dev/null +++ b/node_modules/hapi/node_modules/catbox/test/client.js @@ -0,0 +1,393 @@ +// Load modules + +var Catbox = require('..'); +var Code = require('code'); +var Lab = require('lab'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var describe = lab.experiment; +var it = lab.test; +var expect = Code.expect; + + +describe('Client', function () { + + it('uses prototype engine', function (done) { + + var Obj = require('./import'); + var client = new Catbox.Client(Obj); + client.start(function (err) { + + expect(err).to.not.exist(); + + var key = { id: 'x', segment: 'test' }; + client.set(key, '123', 1000, function (err) { + + expect(err).to.not.exist(); + + client.get(key, function (err, result) { + + expect(err).to.not.exist(); + expect(result.item).to.equal('123'); + done(); + }); + }); + }); + }); + + it('supports empty keys', function (done) { + + var Obj = require('./import'); + var client = new Catbox.Client(Obj); + client.start(function (err) { + + expect(err).to.not.exist(); + + var key = { id: '', segment: 'test' }; + client.set(key, '123', 1000, function (err) { + + expect(err).to.not.exist(); + + client.get(key, function (err, result) { + + expect(err).to.not.exist(); + expect(result.item).to.equal('123'); + done(); + }); + }); + }); + }); + + it('uses object instance engine', function (done) { + + var Obj = require('./import'); + var client = new Catbox.Client(new Obj()); + client.start(function (err) { + + expect(err).to.not.exist(); + + var key = { id: 'x', segment: 'test' }; + client.set(key, '123', 1000, function (err) { + + expect(err).to.not.exist(); + + client.get(key, function (err, result) { + + expect(err).to.not.exist(); + expect(result.item).to.equal('123'); + done(); + }); + }); + }); + }); + + it('errors when calling get on a bad connection', function (done) { + + var errorEngine = { + start: function (callback) { callback(null); }, + stop: function () { }, + isReady: function () { return true; }, + validateSegmentName: function () { return null; }, + get: function (key, callback) { return callback(new Error('fail')); }, + set: function (key, value, ttl, callback) { return callback(new Error('fail')); }, + drop: function (key, callback) { return callback(new Error('fail')); } + }; + + var client = new Catbox.Client(errorEngine); + var key = { id: 'x', segment: 'test' }; + client.get(key, function (err, result) { + + expect(err).to.exist(); + expect(err.message).to.equal('fail'); + done(); + }); + }); + + describe('start()', function () { + + it('passes an error in the callback when one occurs', function (done) { + + var engine = { + start: function (callback) { + + callback(new Error()); + } + }; + + var client = new Catbox.Client(engine); + client.start(function (err) { + + expect(err).to.exist(); + done(); + }); + }); + }); + + describe('get()', function () { + + it('returns an error when the connection is not ready', function (done) { + + var engine = { + start: function (callback) { + + callback(); + }, + isReady: function () { + + return false; + } + }; + + var client = new Catbox.Client(engine); + client.get('test', function (err) { + + expect(err).to.be.instanceOf(Error); + expect(err.message).to.equal('Disconnected'); + done(); + }); + }); + + it('wraps the result with cached details', function (done) { + + var engine = { + start: function (callback) { + + callback(); + }, + isReady: function () { + + return true; + }, + get: function (key, callback) { + + var result = { + item: 'test1', + stored: 'test2' + }; + + callback(null, result); + } + }; + + var client = new Catbox.Client(engine); + client.get({ id: 'id', segment: 'segment' }, function (err, cached) { + + expect(cached.item).to.equal('test1'); + expect(cached.stored).to.equal('test2'); + expect(cached.ttl).to.exist(); + done(); + }); + }); + + it('returns nothing when item is not found', function (done) { + + var engine = { + start: function (callback) { + + callback(); + }, + isReady: function () { + + return true; + }, + get: function (key, callback) { + + callback(null, null); + } + }; + + var client = new Catbox.Client(engine); + client.get({ id: 'id', segment: 'segment' }, function (err, cached) { + + expect(err).to.equal(null); + expect(cached).to.equal(null); + done(); + }); + }); + + it('returns nothing when item is not found (undefined item)', function (done) { + + var engine = { + start: function (callback) { + + callback(); + }, + isReady: function () { + + return true; + }, + get: function (key, callback) { + + callback(null, { item: undefined }); + } + }; + + var client = new Catbox.Client(engine); + client.get({ id: 'id', segment: 'segment' }, function (err, cached) { + + expect(err).to.equal(null); + expect(cached).to.equal(null); + done(); + }); + }); + + it('returns falsey items', function (done) { + + var engine = { + start: function (callback) { + + callback(); + }, + isReady: function () { + + return true; + }, + get: function (key, callback) { + + callback(null, { + item: false, + stored: false + }); + } + }; + + var client = new Catbox.Client(engine); + client.get({ id: 'id', segment: 'segment' }, function (err, cached) { + + expect(err).to.equal(null); + expect(cached.item).to.equal(false); + done(); + }); + }); + + it('expires item', function (done) { + + var engine = { + start: function (callback) { + + callback(); + }, + isReady: function () { + + return true; + }, + get: function (key, callback) { + + var result = { + item: 'test1', + stored: Date.now() - 100, + ttl: 50 + }; + + callback(null, result); + } + }; + + var client = new Catbox.Client(engine); + client.get({ id: 'id', segment: 'segment' }, function (err, cached) { + + expect(err).to.equal(null); + expect(cached).to.equal(null); + done(); + }); + }); + + it('errors on empty key', function (done) { + + var client = new Catbox.Client(require('../test/import')); + client.start(function (err) { + + expect(err).to.not.exist(); + + client.get({}, function (err) { + + expect(err).to.exist(); + expect(err.message).to.equal('Invalid key'); + done(); + }); + }); + }); + }); + + describe('set()', function () { + + it('returns an error when the connection is not ready', function (done) { + + var engine = { + start: function (callback) { + + callback(); + }, + isReady: function () { + + return false; + } + }; + + var client = new Catbox.Client(engine); + client.set('test', 'test', 'test', function (err) { + + expect(err).to.be.instanceOf(Error); + expect(err.message).to.equal('Disconnected'); + done(); + }); + }); + }); + + describe('drop()', function () { + + it('calls the extension clients drop function', function (done) { + + var engine = { + start: function (callback) { + + callback(); + }, + isReady: function () { + + return true; + }, + drop: function (key, callback) { + + callback(null, 'success'); + } + }; + + var client = new Catbox.Client(engine); + client.drop({ id: 'id', segment: 'segment' }, function (err, result) { + + expect(result).to.equal('success'); + done(); + }); + }); + }); + + describe('validateKey()', function () { + + it('errors on missing segment', function (done) { + + var Obj = require('./import'); + var client = new Catbox.Client(Obj); + client.start(function (err) { + + expect(err).to.not.exist(); + + var key = { id: 'x' }; + client.set(key, '123', 1000, function (err) { + + expect(err).to.exist(); + expect(err.message).to.equal('Invalid key'); + done(); + }); + }); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/catbox/test/import.js b/node_modules/hapi/node_modules/catbox/test/import.js new file mode 100755 index 0000000..7248d11 --- /dev/null +++ b/node_modules/hapi/node_modules/catbox/test/import.js @@ -0,0 +1,151 @@ +// Load modules + +var Hoek = require('hoek'); + + +// Declare internals + +var internals = {}; + + +exports = module.exports = internals.Connection = function (options) { + + this.cache = null; +}; + + +internals.Connection.prototype.start = function (callback) { + + callback = Hoek.nextTick(callback); + + if (!this.cache) { + this.cache = {}; + } + + return callback(); +}; + + +internals.Connection.prototype.stop = function () { + + this.cache = null; + return; +}; + + +internals.Connection.prototype.isReady = function () { + + return (!!this.cache); +}; + + +internals.Connection.prototype.validateSegmentName = function (name) { + + if (!name) { + return new Error('Empty string'); + } + + if (name.indexOf('\0') !== -1) { + return new Error('Includes null character'); + } + + return null; +}; + + +internals.Connection.prototype.get = function (key, callback) { + + callback = Hoek.nextTick(callback); + + if (!this.cache) { + return callback(new Error('Connection not started')); + } + + var segment = this.cache[key.segment]; + if (!segment) { + return callback(null, null); + } + + var envelope = segment[key.id]; + if (!envelope) { + return callback(null, null); + } + + var value = null; + try { + value = JSON.parse(envelope.item); + } + catch (err) { + return callback(new Error('Bad value content')); + } + + var result = { + item: value, + stored: envelope.stored, + ttl: envelope.ttl + }; + + return callback(null, result); +}; + + +internals.Connection.prototype.set = function (key, value, ttl, callback) { + + var self = this; + + callback = Hoek.nextTick(callback); + + if (!this.cache) { + return callback(new Error('Connection not started')); + } + + var stringifiedValue = null; + try { + stringifiedValue = JSON.stringify(value); + } + catch (err) { + return callback(err); + } + + var envelope = { + item: stringifiedValue, + stored: Date.now(), + ttl: ttl + }; + + this.cache[key.segment] = this.cache[key.segment] || {}; + var segment = this.cache[key.segment]; + + var cachedItem = segment[key.id]; + if (cachedItem && cachedItem.timeoutId) { + clearTimeout(cachedItem.timeoutId); + } + + var timeoutId = setTimeout(function () { + + self.drop(key, function () { }); + }, ttl); + + envelope.timeoutId = timeoutId; + + segment[key.id] = envelope; + return callback(null); +}; + + +internals.Connection.prototype.drop = function (key, callback) { + + callback = Hoek.nextTick(callback); + + if (!this.cache) { + return callback(new Error('Connection not started')); + } + + var segment = this.cache[key.segment]; + if (segment) { + var item = segment[key.id]; + delete segment[key.id]; + } + + return callback(); +}; diff --git a/node_modules/hapi/node_modules/catbox/test/index.js b/node_modules/hapi/node_modules/catbox/test/index.js new file mode 100755 index 0000000..d4ad6c1 --- /dev/null +++ b/node_modules/hapi/node_modules/catbox/test/index.js @@ -0,0 +1,308 @@ +// Load modules + +var Catbox = require('..'); +var Code = require('code'); +var Lab = require('lab'); +var Import = require('./import'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var describe = lab.experiment; +var it = lab.test; +var expect = Code.expect; + + +describe('Catbox', function () { + + it('creates a new connection', function (done) { + + var client = new Catbox.Client(Import); + client.start(function (err) { + + expect(client.isReady()).to.equal(true); + done(); + }); + }); + + it('closes the connection', function (done) { + + var client = new Catbox.Client(Import); + client.start(function (err) { + + expect(client.isReady()).to.equal(true); + client.stop(); + expect(client.isReady()).to.equal(false); + done(); + }); + }); + + it('gets an item after setting it', function (done) { + + var client = new Catbox.Client(Import); + client.start(function (err) { + + var key = { id: 'x', segment: 'test' }; + client.set(key, '123', 500, function (err) { + + expect(err).to.not.exist(); + client.get(key, function (err, result) { + + expect(err).to.equal(null); + expect(result.item).to.equal('123'); + done(); + }); + }); + }); + }); + + it('fails setting an item circular references', function (done) { + + var client = new Catbox.Client(Import); + client.start(function (err) { + + var key = { id: 'x', segment: 'test' }; + var value = { a: 1 }; + value.b = value; + client.set(key, value, 10, function (err) { + + expect(err.message).to.equal('Converting circular structure to JSON'); + done(); + }); + }); + }); + + it('ignored starting a connection twice on same event', function (done) { + + var client = new Catbox.Client(Import); + var x = 2; + var start = function () { + + client.start(function (err) { + + expect(client.isReady()).to.equal(true); + --x; + if (!x) { + done(); + } + }); + }; + + start(); + start(); + }); + + it('ignored starting a connection twice chained', function (done) { + + var client = new Catbox.Client(Import); + client.start(function (err) { + + expect(err).to.not.exist(); + expect(client.isReady()).to.equal(true); + + client.start(function (err) { + + expect(err).to.not.exist(); + expect(client.isReady()).to.equal(true); + done(); + }); + }); + }); + + it('returns not found on get when using null key', function (done) { + + var client = new Catbox.Client(Import); + client.start(function (err) { + + client.get(null, function (err, result) { + + expect(err).to.equal(null); + expect(result).to.equal(null); + done(); + }); + }); + }); + + it('returns not found on get when item expired', function (done) { + + var client = new Catbox.Client(Import); + client.start(function (err) { + + var key = { id: 'x', segment: 'test' }; + client.set(key, 'x', 1, function (err) { + + expect(err).to.not.exist(); + setTimeout(function () { + + client.get(key, function (err, result) { + + expect(err).to.equal(null); + expect(result).to.equal(null); + done(); + }); + }, 2); + }); + }); + }); + + it('returns error on set when using null key', function (done) { + + var client = new Catbox.Client(Import); + client.start(function (err) { + + client.set(null, {}, 1000, function (err) { + + expect(err instanceof Error).to.equal(true); + done(); + }); + }); + }); + + it('returns error on get when using invalid key', function (done) { + + var client = new Catbox.Client(Import); + client.start(function (err) { + + client.get({}, function (err) { + + expect(err instanceof Error).to.equal(true); + done(); + }); + }); + }); + + it('returns error on drop when using invalid key', function (done) { + + var client = new Catbox.Client(Import); + client.start(function (err) { + + client.drop({}, function (err) { + + expect(err instanceof Error).to.equal(true); + done(); + }); + }); + }); + + it('returns error on set when using invalid key', function (done) { + + var client = new Catbox.Client(Import); + client.start(function (err) { + + client.set({}, {}, 1000, function (err) { + + expect(err instanceof Error).to.equal(true); + done(); + }); + }); + }); + + it('ignores set when using non-positive ttl value', function (done) { + + var client = new Catbox.Client(Import); + client.start(function (err) { + + var key = { id: 'x', segment: 'test' }; + client.set(key, 'y', 0, function (err) { + + expect(err).to.not.exist(); + done(); + }); + }); + }); + + it('returns error on drop when using null key', function (done) { + + var client = new Catbox.Client(Import); + client.start(function (err) { + + client.drop(null, function (err) { + + expect(err instanceof Error).to.equal(true); + done(); + }); + }); + }); + + it('returns error on get when stopped', function (done) { + + var client = new Catbox.Client(Import); + client.stop(); + var key = { id: 'x', segment: 'test' }; + client.connection.get(key, function (err, result) { + + expect(err).to.exist(); + expect(result).to.not.exist(); + done(); + }); + }); + + it('returns error on set when stopped', function (done) { + + var client = new Catbox.Client(Import); + client.stop(); + var key = { id: 'x', segment: 'test' }; + client.connection.set(key, 'y', 1, function (err) { + + expect(err).to.exist(); + done(); + }); + }); + + it('returns error on drop when stopped', function (done) { + + var client = new Catbox.Client(Import); + client.stop(); + var key = { id: 'x', segment: 'test' }; + client.connection.drop(key, function (err) { + + expect(err).to.exist(); + done(); + }); + }); + + it('returns error on missing segment name', function (done) { + + var config = { + expiresIn: 50000 + }; + var fn = function () { + + var client = new Catbox.Client(Import); + var cache = new Catbox.Policy(config, client, ''); + }; + expect(fn).to.throw(Error); + done(); + }); + + it('returns error on bad segment name', function (done) { + + var config = { + expiresIn: 50000 + }; + var fn = function () { + + var client = new Catbox.Client(Import); + var cache = new Catbox.Policy(config, client, 'a\0b'); + }; + expect(fn).to.throw(Error); + done(); + }); + + it('returns error when cache item dropped while stopped', function (done) { + + var client = new Catbox.Client(Import); + client.stop(); + client.drop('a', function (err) { + + expect(err).to.exist(); + done(); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/catbox/test/policy.js b/node_modules/hapi/node_modules/catbox/test/policy.js new file mode 100755 index 0000000..306d287 --- /dev/null +++ b/node_modules/hapi/node_modules/catbox/test/policy.js @@ -0,0 +1,1861 @@ +// Load modules + +var Catbox = require('..'); +var Code = require('code'); +var Lab = require('lab'); +var Import = require('./import'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var describe = lab.experiment; +var it = lab.test; +var expect = Code.expect; + + +describe('Policy', function () { + + it('returns cached item', function (done) { + + var client = new Catbox.Client(Import); + var policy = new Catbox.Policy({ expiresIn: 1000 }, client, 'test'); + + client.start(function (err) { + + expect(err).to.not.exist(); + + policy.set('x', '123', null, function (err) { + + expect(err).to.not.exist(); + + policy.get('x', function (err, value, cached, report) { + + expect(err).to.not.exist(); + expect(value).to.equal('123'); + done(); + }); + }); + }); + }); + + it('works with special property names', function (done) { + + var client = new Catbox.Client(Import); + var policy = new Catbox.Policy({ expiresIn: 1000 }, client, 'test'); + + client.start(function (err) { + + expect(err).to.not.exist(); + + policy.set('__proto__', '123', null, function (err) { + + expect(err).to.not.exist(); + + policy.get('__proto__', function (err, value, cached, report) { + + expect(err).to.not.exist(); + expect(value).to.equal('123'); + done(); + }); + }); + }); + }); + + it('finds nothing when using empty policy rules', function (done) { + + var client = new Catbox.Client(Import); + var policy = new Catbox.Policy({}, client, 'test'); + + client.start(function (err) { + + expect(err).to.not.exist(); + + policy.set('x', '123', null, function (err) { + expect(err).to.not.exist(); + + policy.get('x', function (err, value, cached, report) { + + expect(err).to.not.exist(); + expect(value).to.not.exist(); + done(); + }); + }); + }); + }); + + it('returns cached item with no global rules and manual ttl', function (done) { + + var client = new Catbox.Client(Import); + var policy = new Catbox.Policy({}, client, 'test'); + + client.start(function (err) { + + expect(err).to.not.exist(); + + policy.set('x', '123', 1000, function (err) { + expect(err).to.not.exist(); + + policy.get('x', function (err, value, cached, report) { + + expect(err).to.not.exist(); + expect(value).to.equal('123'); + done(); + }); + }); + }); + }); + + it('returns null on get when no cache client provided', function (done) { + + var policy = new Catbox.Policy({ expiresIn: 1 }); + + policy.get('x', function (err, value, cached, report) { + + expect(err).to.not.exist(); + expect(value).to.not.exist(); + done(); + }); + }); + + it('returns null on set when no cache client provided', function (done) { + + var policy = new Catbox.Policy({ expiresIn: 1 }); + + policy.set('x', 'y', 100, function (err) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('returns null on drop when no cache client provided', function (done) { + + var policy = new Catbox.Policy({ expiresIn: 1 }); + + policy.drop('x', function (err) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('returns null on get when item expired', function (done) { + + var client = new Catbox.Client(Import); + client.start(function () { + + var key = { id: 'x', segment: 'test' }; + client.set(key, 'y', 1, function (err) { + + setTimeout(function () { + + client.get(key, function (err, value, cached, report) { + + expect(err).to.not.exist(); + expect(value).to.not.exist(); + done(); + }); + }, 2); + }); + }); + }); + + it('throws an error when segment is missing', function (done) { + + var config = { + expiresIn: 50000 + }; + + var fn = function () { + + var client = new Catbox.Client(Import); + var policy = new Catbox.Policy(config, client); + }; + + expect(fn).to.throw('Invalid segment name: undefined (Empty string)'); + done(); + }); + + describe('get()', function () { + + it('returns cached item using object id', function (done) { + + var client = new Catbox.Client(Import); + var policy = new Catbox.Policy({ expiresIn: 1000 }, client, 'test'); + + client.start(function (err) { + + expect(err).to.not.exist(); + + policy.set({ id: 'x' }, '123', null, function (err) { + + expect(err).to.not.exist(); + + policy.get({ id: 'x' }, function (err, value, cached, report) { + + expect(err).to.not.exist(); + expect(value).to.equal('123'); + done(); + }); + }); + }); + }); + + it('returns error on null id', function (done) { + + var client = new Catbox.Client(Import); + var policy = new Catbox.Policy({ expiresIn: 1000 }, client, 'test'); + + client.start(function (err) { + + expect(err).to.not.exist(); + + policy.set(null, '123', null, function (err) { + + expect(err).to.exist(); + expect(err.message).to.equal('Invalid key'); + + policy.get(null, function (err, value, cached, report) { + + expect(err).to.exist(); + expect(err.message).to.equal('Invalid key'); + done(); + }); + }); + }); + }); + + it('passes an error to the callback when an error occurs getting the item', function (done) { + + var engine = { + start: function (callback) { + + callback(); + }, + isReady: function () { + + return true; + }, + get: function (key, callback) { + + callback(new Error()); + }, + validateSegmentName: function () { + + return null; + } + }; + var policyConfig = { + expiresIn: 50000 + }; + + var client = new Catbox.Client(engine); + var policy = new Catbox.Policy(policyConfig, client, 'test'); + + policy.get('test1', function (err, value, cached, report) { + + expect(err).to.be.instanceOf(Error); + expect(value).to.not.exist(); + done(); + }); + }); + + it('returns the cached result when no error occurs', function (done) { + + var engine = { + start: function (callback) { + + callback(); + }, + isReady: function () { + + return true; + }, + get: function (key, callback) { + + callback(null, { + stored: 'stored', + item: 'item' + }); + }, + validateSegmentName: function () { + + return null; + } + }; + var policyConfig = { + expiresIn: 50000 + }; + + var client = new Catbox.Client(engine); + var policy = new Catbox.Policy(policyConfig, client, 'test'); + + policy.get('test1', function (err, value, cached, report) { + + expect(value).to.equal('item'); + expect(cached.isStale).to.be.false; + done(); + }); + }); + + describe('generate', function () { + + it('returns falsey items', function (done) { + + var engine = { + start: function (callback) { + + callback(); + }, + isReady: function () { + + return true; + }, + get: function (key, callback) { + + callback(null, { + stored: false, + item: false + }); + }, + validateSegmentName: function () { + + return null; + } + }; + var policyConfig = { + expiresIn: 50000, + generateFunc: function (id, next) { + + return next(null, false); + } + }; + + var client = new Catbox.Client(engine); + var policy = new Catbox.Policy(policyConfig, client, 'test'); + + policy.get('test1', function (err, value, cached, report) { + + expect(err).to.equal(null); + expect(value).to.equal(false); + done(); + }); + }); + + it('bypasses cache when not configured', function (done) { + + var policy = new Catbox.Policy({ + expiresIn: 1, + generateFunc: function (id, next) { + + return next(null, 'new result'); + } + }); + + policy.get('test', function (err, value, cached, report) { + + expect(err).to.not.exist(); + expect(value).to.equal('new result'); + expect(cached).to.not.exist(); + done(); + }); + }); + + it('returns the processed cached item', function (done) { + + var rule = { + expiresIn: 100, + staleIn: 20, + staleTimeout: 5, + generateFunc: function (id, next) { + + return next(null, { gen: ++gen }); + } + }; + + var client = new Catbox.Client(Import, { partition: 'test-partition' }); + var policy = new Catbox.Policy(rule, client, 'test-segment'); + + var gen = 0; + + client.start(function () { + + policy.get('test', function (err, value, cached, report) { + + expect(value.gen).to.equal(1); + done(); + }); + }); + }); + + it('switches rules after construction', function (done) { + + var rule = { + expiresIn: 100, + staleIn: 20, + staleTimeout: 5, + generateFunc: function (id, next) { + + return next(null, { gen: ++gen }); + } + }; + + var client = new Catbox.Client(Import, { partition: 'test-partition' }); + var policy = new Catbox.Policy({ expiresIn: 100 }, client, 'test-segment'); + + var gen = 0; + + client.start(function () { + + policy.get('test', function (err, value, cached, report) { + + expect(value).to.not.exist(); + policy.rules(rule); + + policy.get('test', function (err, value, cached, report) { + + expect(value.gen).to.equal(1); + done(); + }); + }); + }); + }); + + it('returns the processed cached item after cache error', function (done) { + + var rule = { + expiresIn: 100, + staleIn: 20, + staleTimeout: 5, + generateFunc: function (id, next) { + + return next(null, { gen: ++gen }); + } + }; + + var client = new Catbox.Client(Import, { partition: 'test-partition' }); + client.get = function (key, callback) { callback(new Error('bad client')); }; + var policy = new Catbox.Policy(rule, client, 'test-segment'); + + var gen = 0; + + client.start(function () { + + policy.get('test', function (err, value, cached, report) { + + expect(value.gen).to.equal(1); + done(); + }); + }); + }); + + it('returns the processed cached item using manual ttl', function (done) { + + var rule = { + expiresIn: 26, + staleIn: 20, + staleTimeout: 5, + generateFunc: function (id, next) { + + setTimeout(function () { + + return next(null, { gen: ++gen }, 100); + }, 6); + } + }; + + var client = new Catbox.Client(Import, { partition: 'test-partition' }); + var policy = new Catbox.Policy(rule, client, 'test-segment'); + + var gen = 0; + + client.start(function () { + + policy.get('test', function (err, value1, cached, report) { + + expect(value1.gen).to.equal(1); // Fresh + setTimeout(function () { + + policy.get('test', function (err, value2, cached, report) { + + expect(value2.gen).to.equal(1); // Stale + done(); + }); + }, 27); + }); + }); + }); + + it('returns stale object then fresh object based on timing', function (done) { + + var rule = { + expiresIn: 100, + staleIn: 20, + staleTimeout: 5, + generateFunc: function (id, next) { + + setTimeout(function () { + + return next(null, { gen: ++gen }, 100); + }, 6); + } + }; + + var client = new Catbox.Client(Import, { partition: 'test-partition' }); + var policy = new Catbox.Policy(rule, client, 'test-segment'); + + var gen = 0; + + client.start(function () { + + policy.get('test', function (err, value1, cached, report) { + + expect(value1.gen).to.equal(1); // Fresh + setTimeout(function () { + + policy.get('test', function (err, value2, cached, report) { + + expect(value2.gen).to.equal(1); // Stale + setTimeout(function () { + + policy.get('test', function (err, value3, cached, report) { + + expect(value3.gen).to.equal(2); // Fresh + done(); + }); + }, 3); + }); + }, 21); + }); + }); + }); + + it('returns stale object then fresh object based on timing using staleIn function', function (done) { + + var staleIn = function (stored, ttl) { + + var expiresIn = (Date.now() - stored) + ttl; + expect(expiresIn).to.be.about(100, 5); + return expiresIn - 80; + }; + + var rule = { + expiresIn: 100, + staleIn: staleIn, + staleTimeout: 5, + generateFunc: function (id, next) { + + setTimeout(function () { + + return next(null, { gen: ++gen }, 100); + }, 6); + } + }; + + var client = new Catbox.Client(Import, { partition: 'test-partition' }); + var policy = new Catbox.Policy(rule, client, 'test-segment'); + + var gen = 0; + + client.start(function () { + + policy.get('test', function (err, value1, cached, report) { + + expect(value1.gen).to.equal(1); // Fresh + setTimeout(function () { + + policy.get('test', function (err, value2, cached, report) { + + expect(value2.gen).to.equal(1); // Stale + setTimeout(function () { + + policy.get('test', function (err, value3, cached, report) { + + expect(value3.gen).to.equal(2); // Fresh + done(); + }); + }, 3); + }); + }, 21); + }); + }); + }); + + it('returns stale object then invalidate cache on error', function (done) { + + var rule = { + expiresIn: 100, + staleIn: 20, + staleTimeout: 5, + generateFunc: function (id, next) { + + ++gen; + + setTimeout(function () { + + if (gen !== 2) { + return next(null, { gen: gen }); + } + + return next(new Error()); + }, 6); + } + }; + + var client = new Catbox.Client(Import, { partition: 'test-partition' }); + var policy = new Catbox.Policy(rule, client, 'test-segment'); + + var gen = 0; + + client.start(function () { + + policy.get('test', function (err, value1, cached, report) { + + expect(value1.gen).to.equal(1); // Fresh + setTimeout(function () { + + policy.get('test', function (err, value2, cached, report) { + + // Generates a new one in background which will produce Error and clear the cache + + expect(value2.gen).to.equal(1); // Stale + setTimeout(function () { + + policy.get('test', function (err, value3, cached, report) { + + expect(value3.gen).to.equal(3); // Fresh + done(); + }); + }, 3); + }); + }, 21); + }); + }); + }); + + it('returns stale object then invalidate cache on error when dropOnError is true', function (done) { + + var rule = { + expiresIn: 100, + staleIn: 20, + staleTimeout: 5, + dropOnError: true, + generateFunc: function (id, next) { + + ++gen; + + setTimeout(function () { + + if (gen === 1) { + return next(null, { gen: gen }); + } + + return next(new Error()); + }, 6); + } + }; + + var client = new Catbox.Client(Import, { partition: 'test-partition' }); + var policy = new Catbox.Policy(rule, client, 'test-segment'); + + var gen = 0; + + client.start(function () { + + policy.get('test', function (err, value1, cached, report) { + + expect(value1.gen).to.equal(1); // Fresh + setTimeout(function () { + + policy.get('test', function (err, value2, cached, report) { + + // Generates a new one in background which will produce Error and clear the cache + + expect(value2.gen).to.equal(1); // Stale + setTimeout(function () { + + policy.get('test', function (err, value3, cached, report) { + + expect(err).to.be.instanceof(Error); // Stale + done(); + }); + }, 3); + }); + }, 21); + }); + }); + }); + + it('returns stale object then invalidate cache on error when dropOnError is not set', function (done) { + + var rule = { + expiresIn: 100, + staleIn: 20, + staleTimeout: 5, + generateFunc: function (id, next) { + + ++gen; + + setTimeout(function () { + + if (gen === 1) { + return next(null, { gen: gen }); + } + + return next(new Error()); + }, 6); + } + }; + + var client = new Catbox.Client(Import, { partition: 'test-partition' }); + var policy = new Catbox.Policy(rule, client, 'test-segment'); + + var gen = 0; + + client.start(function () { + + policy.get('test', function (err, value1, cached, report) { + + expect(value1.gen).to.equal(1); // Fresh + setTimeout(function () { + + policy.get('test', function (err, value2, cached, report) { + + // Generates a new one in background which will produce Error and clear the cache + + expect(value2.gen).to.equal(1); // Stale + setTimeout(function () { + + policy.get('test', function (err, value3, cached, report) { + + expect(err).to.be.instanceof(Error); // Stale + done(); + }); + }, 3); + }); + }, 21); + }); + }); + }); + + it('returns stale object then does not invalidate cache on timeout if dropOnError is false', function (done) { + + var rule = { + expiresIn: 100, + staleIn: 20, + staleTimeout: 5, + dropOnError: false, + generateFunc: function (id, next) { + + ++gen; + + setTimeout(function () { + + if (gen === 1) { + return next(null, { gen: gen }); + } + + return next(new Error()); + }, 6); + } + }; + + var client = new Catbox.Client(Import, { partition: 'test-partition' }); + var policy = new Catbox.Policy(rule, client, 'test-segment'); + + var gen = 0; + + client.start(function () { + + policy.get('test', function (err, value1, cached, report) { + + expect(value1.gen).to.equal(1); // Fresh + setTimeout(function () { + + policy.get('test', function (err, value2, cached, report) { + + // Generates a new one in background which will produce Error, but not clear the cache + + expect(value2.gen).to.equal(1); // Stale + setTimeout(function () { + + policy.get('test', function (err, value3, cached, report) { + + expect(value3.gen).to.equal(1); // Stale + done(); + }); + }, 3); + }); + }, 21); + }); + }); + }); + + it('returns stale object then does not invalidate cache on error if dropOnError is false', function (done) { + + var rule = { + expiresIn: 100, + staleIn: 20, + staleTimeout: 5, + dropOnError: false, + generateFunc: function (id, next) { + + ++gen; + + if (gen === 1) { + return next(null, { gen: gen }); + } + + return next(new Error()); + } + }; + + var client = new Catbox.Client(Import, { partition: 'test-partition' }); + var policy = new Catbox.Policy(rule, client, 'test-segment'); + + var gen = 0; + + client.start(function () { + + policy.get('test', function (err, value1, cached) { + + expect(value1.gen).to.equal(1); // Fresh + setTimeout(function () { + policy.get('test', function (err, value2, cached) { + + // Generates a new one in background which will produce Error, but not clear the cache + + expect(value2.gen).to.equal(1); // Stale + + policy.get('test', function (err, value3, cached) { + + expect(value3.gen).to.equal(1); // Stale + done(); + }); + }); + }, 21); + }); + }); + }); + + it('returns stale object then invalidates cache on error if dropOnError is true', function (done) { + + var rule = { + expiresIn: 100, + staleIn: 20, + staleTimeout: 5, + dropOnError: true, + generateFunc: function (id, next) { + + ++gen; + + if (gen === 1) { + return next(null, { gen: gen }); + } + + return next(new Error()); + } + }; + + var client = new Catbox.Client(Import, { partition: 'test-partition' }); + var policy = new Catbox.Policy(rule, client, 'test-segment'); + + var gen = 0; + + client.start(function () { + + policy.get('test', function (err, value1, cached) { + + expect(value1.gen).to.equal(1); // Fresh + setTimeout(function () { + policy.get('test', function (err, value2, cached) { + + // Generates a new one in background which will produce Error, but not clear the cache + expect(err).to.be.instanceOf(Error); + expect(value2).to.be.undefined; // Stale + + policy.get('test', function (err, value3, cached) { + + expect(err).to.be.instanceOf(Error); + expect(value3).to.be.undefined; // Stale + done(); + }); + }); + }, 21); + }); + }); + }); + + + it('returns stale object then invalidates cache on error if dropOnError is not defined', function (done) { + + var rule = { + expiresIn: 100, + staleIn: 20, + staleTimeout: 5, + generateFunc: function (id, next) { + + ++gen; + + if (gen === 1) { + return next(null, { gen: gen }); + } + + return next(new Error()); + } + }; + + var client = new Catbox.Client(Import, { partition: 'test-partition' }); + var policy = new Catbox.Policy(rule, client, 'test-segment'); + + var gen = 0; + + client.start(function () { + + policy.get('test', function (err, value1, cached) { + + expect(value1.gen).to.equal(1); // Fresh + setTimeout(function () { + policy.get('test', function (err, value2, cached) { + + // Generates a new one in background which will produce Error, but not clear the cache + expect(err).to.be.instanceOf(Error); + expect(value2).to.be.undefined; // Stale + + policy.get('test', function (err, value3, cached) { + + expect(err).to.be.instanceOf(Error); + expect(value3).to.be.undefined; // Stale + done(); + }); + }); + }, 21); + }); + }); + }); + + + it('returns fresh objects', function (done) { + + var rule = { + expiresIn: 100, + staleIn: 20, + staleTimeout: 10, + generateFunc: function (id, next) { + + return next(null, { gen: ++gen }); + } + }; + + var client = new Catbox.Client(Import, { partition: 'test-partition' }); + var policy = new Catbox.Policy(rule, client, 'test-segment'); + + var gen = 0; + + client.start(function () { + + policy.get('test', function (err, value1, cached, report) { + + expect(value1.gen).to.equal(1); // Fresh + setTimeout(function () { + + policy.get('test', function (err, value2, cached, report) { + + expect(value2.gen).to.equal(2); // Fresh + + setTimeout(function () { + + policy.get('test', function (err, value3, cached, report) { + + expect(value3.gen).to.equal(2); // Fresh + done(); + }); + }, 1); + }); + }, 21); + }); + }); + }); + + it('returns error when generated within stale timeout', function (done) { + + var rule = { + expiresIn: 30, + staleIn: 20, + staleTimeout: 5, + generateFunc: function (id, next) { + + ++gen; + if (gen !== 2) { + return next(null, { gen: gen }); + } + + return next(new Error()); + } + }; + + var client = new Catbox.Client(Import, { partition: 'test-partition' }); + var policy = new Catbox.Policy(rule, client, 'test-segment'); + + var gen = 0; + + client.start(function () { + + policy.get('test', function (err, value1, cached, report) { + + expect(value1.gen).to.equal(1); // Fresh + setTimeout(function () { + + policy.get('test', function (err, value2, cached, report) { + + // Generates a new one which will produce Error + + expect(err).to.be.instanceof(Error); // Stale + done(); + }); + }, 21); + }); + }); + }); + + it('returns new object when stale has less than staleTimeout time left', function (done) { + + var rule = { + expiresIn: 31, + staleIn: 15, + staleTimeout: 15, + generateFunc: function (id, next) { + + return next(null, { gen: ++gen }); + } + }; + + var client = new Catbox.Client(Import, { partition: 'test-partition' }); + var policy = new Catbox.Policy(rule, client, 'test-segment'); + + var gen = 0; + + client.start(function () { + + policy.get('test', function (err, value1, cached, report) { + + expect(value1.gen).to.equal(1); // Fresh + setTimeout(function () { + + policy.get('test', function (err, value2, cached, report) { + + expect(value2.gen).to.equal(1); // Fresh + setTimeout(function () { + + policy.get('test', function (err, value3, cached, report) { + + expect(value3.gen).to.equal(2); // Fresh + done(); + }); + }, 11); + }); + }, 10); + }); + }); + }); + + it('invalidates cache on error without stale', function (done) { + + var rule = { + expiresIn: 20, + staleIn: 5, + staleTimeout: 5, + generateFunc: function (id, next) { + + ++gen; + + if (gen === 2) { + return next(new Error()); + } + + return next(null, { gen: gen }); + } + }; + + var client = new Catbox.Client(Import, { partition: 'test-partition' }); + var policy = new Catbox.Policy(rule, client, 'test-segment'); + + var gen = 0; + + client.start(function () { + + policy.get('test', function (err, value1, cached, report) { + + expect(value1.gen).to.equal(1); // Fresh + setTimeout(function () { + + policy.get('test', function (err, value2, cached, report) { + + expect(err).to.exist(); + + policy._get('test', function (err, value3) { + + expect(value3).to.equal(null); + done(); + }); + }); + }, 8); + }); + }); + }); + + it('returns timeout error when generate takes too long', function (done) { + + var rule = { + expiresIn: 10, + generateTimeout: 5, + generateFunc: function (id, next) { + + setTimeout(function () { + + return next(null, { gen: ++gen }); + }, 6); + } + }; + + var client = new Catbox.Client(Import, { partition: 'test-partition' }); + var policy = new Catbox.Policy(rule, client, 'test-segment'); + + var gen = 0; + + client.start(function () { + + policy.get('test', function (err, value1, cached, report) { + + expect(err.output.statusCode).to.equal(503); + setTimeout(function () { + + policy.get('test', function (err, value2, cached, report) { + + expect(value2.gen).to.equal(1); + setTimeout(function () { + + policy.get('test', function (err, value3, cached, report) { + + expect(err.output.statusCode).to.equal(503); + done(); + }); + }, 10); + }); + }, 2); + }); + }); + }); + + it('queues requests while pending', function (done) { + + var gen = 0; + var rule = { + expiresIn: 100, + generateFunc: function (id, next) { + + return next(null, { gen: ++gen }); + } + }; + + var client = new Catbox.Client(Import, { partition: 'test-partition' }); + var policy = new Catbox.Policy(rule, client, 'test-segment'); + + client.start(function () { + + var result = null; + var compare = function (err, value, cached, report) { + + if (!result) { + result = value; + return; + } + + expect(result).to.equal(value); + done(); + }; + + policy.get('test', compare); + policy.get('test', compare); + }); + }); + + it('catches errors thrown in generateFunc and passes to all pending requests', function (done) { + + var gen = 0; + var rule = { + expiresIn: 100, + generateFunc: function (id, next) { + + throw new Error('generate failed'); + } + }; + + var client = new Catbox.Client(Import, { partition: 'test-partition' }); + var policy = new Catbox.Policy(rule, client, 'test-segment'); + + client.start(function () { + + var result = null; + var compare = function (err, value, cached, report) { + + if (!result) { + result = err; + return; + } + + expect(result).to.equal(err); + expect(err.message).to.equal('generate failed'); + done(); + }; + + policy.get('test', compare); + policy.get('test', compare); + }); + }); + + it('does not return stale value from previous request timeout left behind', { parallel: false }, function (done) { + + var gen = 0; + + var rule = { + expiresIn: 100, + staleIn: 20, + staleTimeout: 10, + generateFunc: function (id, next) { + + setTimeout(function () { + + next(null, { gen: ++gen }); + }, 5) + } + }; + + var client = new Catbox.Client(Import, { partition: 'test-partition' }); + + var orig = client.connection.get; + client.connection.get = function (key, callback) { // Delayed get + + setTimeout(function () { + + orig.call(client.connection, key, callback) + }, 10) + }; + + var policy = new Catbox.Policy(rule, client, 'test-segment'); + + client.start(function () { + + policy.get('test', function (err, value1, cached, report) { // Cache lookup takes 10 + generate 5 + + expect(value1.gen).to.equal(1); // Fresh + setTimeout(function () { // Wait for stale + + policy.get('test', function (err, value2, cached, report) { // Cache lookup takes 10, generate comes back after 5 + + expect(value2.gen).to.equal(2); // Fresh + policy.get('test', function (err, value3, cached, report) { // Cache lookup takes 10 + + expect(value3.gen).to.equal(2); // Cached (10 left to stale) + + client.connection.get = orig; + done() + }) + }); + }, 21); + }); + }); + }); + }); + }); + + describe('drop()', function () { + + it('calls the extension clients drop function', function (done) { + + var engine = { + start: function (callback) { + + callback(); + }, + isReady: function () { + + return true; + }, + drop: function (key, callback) { + + callback(null, 'success'); + }, + validateSegmentName: function () { + + return null; + } + }; + + var policyConfig = { + expiresIn: 50000 + }; + + var client = new Catbox.Client(engine); + var policy = new Catbox.Policy(policyConfig, client, 'test'); + + policy.drop('test', function (err, result) { + + expect(result).to.equal('success'); + done(); + }); + }); + }); + + describe('ttl()', function () { + + it('returns the ttl factoring in the created time', function (done) { + + var engine = { + start: function (callback) { + + callback(); + }, + isReady: function () { + + return true; + }, + validateSegmentName: function () { + + return null; + } + }; + + var policyConfig = { + expiresIn: 50000 + }; + + var client = new Catbox.Client(engine); + var policy = new Catbox.Policy(policyConfig, client, 'test'); + + var result = policy.ttl(Date.now() - 10000); + expect(result).to.be.within(39999, 40001); // There can occasionally be a 1ms difference + done(); + }); + + it('returns expired when created in the future', function (done) { + + var config = { + expiresAt: '10:00' + }; + + var rules = new Catbox.Policy.compile(config); + + var created = new Date('Sat Sep 06 2014 13:00:00').getTime(); + var now = new Date('Sat Sep 06 2014 12:00:00').getTime(); + + var ttl = Catbox.Policy.ttl(rules, created, now); + expect(ttl).to.equal(0); + done(); + }); + + it('returns expired on c-e-n same day', function (done) { + + var config = { + expiresAt: '10:00' + }; + + var rules = new Catbox.Policy.compile(config); + + var created = new Date('Sat Sep 06 2014 9:00:00').getTime(); + var now = new Date('Sat Sep 06 2014 11:00:00').getTime(); + + var ttl = Catbox.Policy.ttl(rules, created, now); + expect(ttl).to.equal(0); + done(); + }); + + it('returns expired on c-(midnight)-e-n', function (done) { + + var config = { + expiresAt: '10:00' + }; + + var rules = new Catbox.Policy.compile(config); + + var created = new Date('Sat Sep 06 2014 11:00:00').getTime(); + var now = new Date('Sat Sep 07 2014 10:00:01').getTime(); + + var ttl = Catbox.Policy.ttl(rules, created, now); + expect(ttl).to.equal(0); + done(); + }); + + it('returns ttl on c-n-e same day', function (done) { + + var config = { + expiresAt: '10:00' + }; + + var rules = new Catbox.Policy.compile(config); + + var created = new Date('Sat Sep 06 2014 9:00:00').getTime(); + var now = new Date('Sat Sep 06 2014 9:30:00').getTime(); + + var ttl = Catbox.Policy.ttl(rules, created, now); + expect(ttl).to.equal(30 * 60 * 1000); + done(); + }); + + it('returns ttl on c-(midnight)-n-e', function (done) { + + var config = { + expiresAt: '10:00' + }; + + var rules = new Catbox.Policy.compile(config); + + var created = new Date('Sat Sep 06 2014 11:00:00').getTime(); + var now = new Date('Sat Sep 07 2014 9:00:00').getTime(); + + var ttl = Catbox.Policy.ttl(rules, created, now); + expect(ttl).to.equal(60 * 60 * 1000); + done(); + }); + }); + + describe('compile()', function () { + + it('does not try to compile a null config', function (done) { + + var rule = Catbox.policy.compile(null); + expect(rule).to.deep.equal({}); + done(); + }); + + it('compiles a single rule', function (done) { + + var config = { + expiresIn: 50000 + }; + + var rule = Catbox.policy.compile(config, false); + expect(rule.expiresIn).to.equal(config.expiresIn); + done(); + }); + + it('ignores external options', function (done) { + + var config = { + expiresIn: 50000, + cache: true + }; + + var rule = Catbox.policy.compile(config, false); + expect(rule.expiresIn).to.equal(config.expiresIn); + done(); + }); + + it('assigns the expiresIn when the rule is cached', function (done) { + + var config = { + expiresIn: 50000 + }; + + var rule = Catbox.policy.compile(config, false); + expect(rule.expiresIn).to.equal(config.expiresIn); + done(); + }); + + it('allows a rule with neither expiresAt or expiresIn', function (done) { + + var fn = function () { + + Catbox.policy.compile({ cache: 1 }, true); + }; + + expect(fn).to.not.throw(); + done(); + }); + + it('allows a rule with expiresAt and undefined expiresIn', function (done) { + + var fn = function () { + + Catbox.policy.compile({ expiresIn: undefined, expiresAt: '09:00' }, true); + }; + + expect(fn).to.not.throw(); + done(); + }); + + it('allows combination of expiresIn, staleTimeout and staleIn function', function (done) { + + var staleIn = function (stored, ttl) { + + return 1000; + }; + + var config = { + expiresIn: 500000, + staleIn: staleIn, + staleTimeout: 500, + generateFunc: function () { } + }; + + var fn = function () { + + Catbox.policy.compile(config, true); + }; + + expect(fn).to.not.throw(); + done(); + }); + + it('throws an error when staleIn is greater than expiresIn', function (done) { + + var config = { + expiresIn: 500000, + staleIn: 1000000, + staleTimeout: 500, + generateFunc: function () { } + }; + + var fn = function () { + + Catbox.policy.compile(config, true); + }; + + expect(fn).to.throw('staleIn must be less than expiresIn'); + done(); + }); + + it('throws an error when staleTimeout is greater than expiresIn', function (done) { + + var config = { + expiresIn: 500000, + staleIn: 100000, + staleTimeout: 500000, + generateFunc: function () { } + }; + + var fn = function () { + + Catbox.policy.compile(config, true); + }; + + expect(fn).to.throw('staleTimeout must be less than expiresIn'); + done(); + }); + + it('throws an error when staleTimeout is greater than expiresIn - staleIn', function (done) { + + var config = { + expiresIn: 30000, + staleIn: 20000, + staleTimeout: 10000, + generateFunc: function () { } + }; + + var fn = function () { + + Catbox.policy.compile(config, true); + }; + + expect(fn).to.throw('staleTimeout must be less than the delta between expiresIn and staleIn'); + done(); + }); + + it('throws an error when staleTimeout is used without server mode', function (done) { + + var config = { + expiresIn: 1000000, + staleIn: 500000, + staleTimeout: 500, + generateFunc: function () { } + }; + + var fn = function () { + + var policy = new Catbox.Policy(config); + }; + + expect(fn).to.throw('Cannot use stale options without server-side caching'); + done(); + }); + + it('returns rule when staleIn is less than expiresIn', function (done) { + + var config = { + expiresIn: 1000000, + staleIn: 500000, + staleTimeout: 500, + generateFunc: function () { } + }; + + var rule = Catbox.policy.compile(config, true); + expect(rule.staleIn).to.equal(500 * 1000); + expect(rule.expiresIn).to.equal(1000 * 1000); + done(); + }); + + it('returns rule when staleIn is less than 24 hours and using expiresAt', function (done) { + + var config = { + expiresAt: '03:00', + staleIn: 5000000, + staleTimeout: 500, + generateFunc: function () { } + }; + + var rule = Catbox.policy.compile(config, true); + expect(rule.staleIn).to.equal(5000 * 1000); + done(); + }); + + it('does not throw an error if has both staleTimeout and staleIn', function (done) { + + var config = { + staleIn: 30000, + staleTimeout: 300, + expiresIn: 60000, + generateFunc: function () { } + }; + + var fn = function () { + + Catbox.policy.compile(config, true); + }; + expect(fn).to.not.throw(); + done(); + }); + + it('throws an error if trying to use stale caching on the client', function (done) { + + var config = { + staleIn: 30000, + expiresIn: 60000, + staleTimeout: 300, + generateFunc: function () { } + }; + + var fn = function () { + + Catbox.policy.compile(config, false); + }; + + expect(fn).to.throw('Cannot use stale options without server-side caching'); + done(); + }); + + it('converts the stale time to ms', function (done) { + + var config = { + staleIn: 30000, + expiresIn: 60000, + staleTimeout: 300, + generateFunc: function () { } + }; + + var rule = Catbox.policy.compile(config, true); + + expect(rule.staleIn).to.equal(config.staleIn); + done(); + }); + + it('throws an error if staleTimeout is greater than expiresIn', function (done) { + + var config = { + staleIn: 2000, + expiresIn: 10000, + staleTimeout: 30000, + generateFunc: function () { } + }; + + var fn = function () { + + Catbox.policy.compile(config, true); + }; + + expect(fn).to.throw('staleTimeout must be less than expiresIn'); + done(); + }); + + it('throws an error if staleIn is greater than expiresIn', function (done) { + + var config = { + staleIn: 1000000, + expiresIn: 60000, + staleTimeout: 30, + generateFunc: function () { } + }; + + var fn = function () { + + Catbox.policy.compile(config, false); + }; + + expect(fn).to.throw('staleIn must be less than expiresIn'); + done(); + }); + }); + + describe('ttl()', function () { + + it('returns zero when a rule is expired', function (done) { + + var config = { + expiresIn: 50000 + }; + var rule = Catbox.policy.compile(config, false); + var created = new Date(Date.now()); + created = created.setMinutes(created.getMinutes() - 5); + + var ttl = Catbox.policy.ttl(rule, created); + expect(ttl).to.be.equal(0); + done(); + }); + + it('returns a positive number when a rule is not expired', function (done) { + + var config = { + expiresIn: 50000 + }; + var rule = Catbox.policy.compile(config, false); + var created = new Date(Date.now()); + + var ttl = Catbox.policy.ttl(rule, created); + expect(ttl).to.be.greaterThan(0); + done(); + }); + + it('returns the correct expires time when no created time is provided', function (done) { + + var config = { + expiresIn: 50000 + }; + var rule = Catbox.policy.compile(config, false); + + var ttl = Catbox.policy.ttl(rule); + expect(ttl).to.equal(50000); + done(); + }); + + it('returns 0 when created several days ago and expiresAt is used', function (done) { + + var config = { + expiresAt: '13:00' + }; + var created = Date.now() - 313200000; // 87 hours (3 days + 15 hours) + var rule = Catbox.policy.compile(config, false); + + var ttl = Catbox.policy.ttl(rule, created); + expect(ttl).to.equal(0); + done(); + }); + + it('returns 0 when created in the future', function (done) { + + var config = { + expiresIn: 100 + }; + var created = Date.now() + 1000; + var rule = Catbox.policy.compile(config, false); + + var ttl = Catbox.policy.ttl(rule, created); + expect(ttl).to.equal(0); + done(); + }); + + it('returns 0 for bad rule', function (done) { + + var created = Date.now() - 1000; + var ttl = Catbox.policy.ttl({}, created); + expect(ttl).to.equal(0); + done(); + }); + + it('returns 0 when created 60 hours ago and expiresAt is used with an hour before the created hour', function (done) { + + var config = { + expiresAt: '12:00' + }; + var created = Date.now() - 342000000; // 95 hours ago (3 days + 23 hours) + var rule = Catbox.policy.compile(config, false); + + var ttl = Catbox.policy.ttl(rule, created); + expect(ttl).to.equal(0); + done(); + }); + + it('returns a positive number when using a future expiresAt', function (done) { + + var hour = new Date(Date.now() + 60 * 60 * 1000).getHours(); + hour = hour === 0 ? 1 : hour; + + var config = { + expiresAt: hour + ':00' + }; + + var rule = Catbox.policy.compile(config, false); + + var ttl = Catbox.policy.ttl(rule); + expect(ttl).to.be.greaterThan(0); + done(); + }); + + it('returns the correct number when using a future expiresAt', function (done) { + + var twoHoursAgo = new Date(Date.now() - 2 * 60 * 60 * 1000); + var hours = twoHoursAgo.getHours(); + var minutes = '' + twoHoursAgo.getMinutes(); + var created = twoHoursAgo.getTime() + (60 * 60 * 1000); + minutes = minutes.length === 1 ? '0' + minutes : minutes; + + var config = { + expiresAt: hours + ':' + minutes + }; + + var rule = Catbox.policy.compile(config, false); + var ttl = Catbox.policy.ttl(rule, created); + + expect(ttl).to.be.about(22 * 60 * 60 * 1000, 60 * 1000); + done(); + }); + + it('returns correct number when using an expiresAt time tomorrow', function (done) { + + var hour = new Date(Date.now() - 60 * 60 * 1000).getHours(); + + var config = { + expiresAt: hour + ':00' + }; + + var rule = Catbox.policy.compile(config, false); + + var ttl = Catbox.policy.ttl(rule); + expect(ttl).to.be.about(23 * 60 * 60 * 1000, 60 * 60 * 1000); + done(); + }); + + it('returns correct number when using a created time from yesterday and expires in 2 hours', function (done) { + + var hour = new Date(Date.now() + 2 * 60 * 60 * 1000).getHours(); + + var config = { + expiresAt: hour + ':00' + }; + var created = new Date(Date.now()); + created.setHours(new Date(Date.now()).getHours() - 22); + + var rule = Catbox.policy.compile(config, false); + + var ttl = Catbox.policy.ttl(rule, created); + expect(ttl).to.be.about(60 * 60 * 1000, 60 * 60 * 1000); + done(); + }); + }); +}); + + diff --git a/node_modules/hapi/node_modules/cryptiles/.npmignore b/node_modules/hapi/node_modules/cryptiles/.npmignore new file mode 100644 index 0000000..77ba16c --- /dev/null +++ b/node_modules/hapi/node_modules/cryptiles/.npmignore @@ -0,0 +1,18 @@ +.idea +*.iml +npm-debug.log +dump.rdb +node_modules +results.tap +results.xml +npm-shrinkwrap.json +config.json +.DS_Store +*/.DS_Store +*/*/.DS_Store +._* +*/._* +*/*/._* +coverage.* +lib-cov + diff --git a/node_modules/hapi/node_modules/cryptiles/.travis.yml b/node_modules/hapi/node_modules/cryptiles/.travis.yml new file mode 100755 index 0000000..047f7e3 --- /dev/null +++ b/node_modules/hapi/node_modules/cryptiles/.travis.yml @@ -0,0 +1,5 @@ +language: node_js + +node_js: + - 0.10 + diff --git a/node_modules/hapi/node_modules/cryptiles/LICENSE b/node_modules/hapi/node_modules/cryptiles/LICENSE new file mode 100755 index 0000000..cda4473 --- /dev/null +++ b/node_modules/hapi/node_modules/cryptiles/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2014, Eran Hammer and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hueniverse/cryptiles/graphs/contributors diff --git a/node_modules/hapi/node_modules/cryptiles/Makefile b/node_modules/hapi/node_modules/cryptiles/Makefile new file mode 100755 index 0000000..3a89298 --- /dev/null +++ b/node_modules/hapi/node_modules/cryptiles/Makefile @@ -0,0 +1,9 @@ +test: + node node_modules/lab/bin/lab +test-cov: + node node_modules/lab/bin/lab -t 100 +test-cov-html: + node node_modules/lab/bin/lab -r html -o coverage.html + +.PHONY: test test-cov test-cov-html + diff --git a/node_modules/hapi/node_modules/cryptiles/README.md b/node_modules/hapi/node_modules/cryptiles/README.md new file mode 100644 index 0000000..be943f8 --- /dev/null +++ b/node_modules/hapi/node_modules/cryptiles/README.md @@ -0,0 +1,14 @@ +cryptiles +========= + +General purpose crypto utilities + +[![Build Status](https://secure.travis-ci.org/hapijs/cryptiles.png)](http://travis-ci.org/hapijs/cryptiles) + +## Methods + +### `randomString( size)` +Returns a cryptographically strong pseudo-random data string. Takes a size argument for the length of the string. + +### `fixedTimeComparison( a, b)` +Compare two strings using fixed time algorithm (to prevent time-based analysis of MAC digest match). Returns `true` if the strings match, `false` if they differ. diff --git a/node_modules/hapi/node_modules/cryptiles/index.js b/node_modules/hapi/node_modules/cryptiles/index.js new file mode 100755 index 0000000..4cc88b3 --- /dev/null +++ b/node_modules/hapi/node_modules/cryptiles/index.js @@ -0,0 +1 @@ +module.exports = require('./lib'); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/cryptiles/lib/index.js b/node_modules/hapi/node_modules/cryptiles/lib/index.js new file mode 100755 index 0000000..f385870 --- /dev/null +++ b/node_modules/hapi/node_modules/cryptiles/lib/index.js @@ -0,0 +1,68 @@ +// Load modules + +var Crypto = require('crypto'); +var Boom = require('boom'); + + +// Declare internals + +var internals = {}; + + +// Generate a cryptographically strong pseudo-random data + +exports.randomString = function (size) { + + var buffer = exports.randomBits((size + 1) * 6); + if (buffer instanceof Error) { + return buffer; + } + + var string = buffer.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/\=/g, ''); + return string.slice(0, size); +}; + + +exports.randomBits = function (bits) { + + if (!bits || + bits < 0) { + + return Boom.internal('Invalid random bits count'); + } + + var bytes = Math.ceil(bits / 8); + try { + return Crypto.randomBytes(bytes); + } + catch (err) { + return Boom.internal('Failed generating random bits: ' + err.message); + } +}; + + +// Compare two strings using fixed time algorithm (to prevent time-based analysis of MAC digest match) + +exports.fixedTimeComparison = function (a, b) { + + if (typeof a !== 'string' || + typeof b !== 'string') { + + return false; + } + + var mismatch = (a.length === b.length ? 0 : 1); + if (mismatch) { + b = a; + } + + for (var i = 0, il = a.length; i < il; ++i) { + var ac = a.charCodeAt(i); + var bc = b.charCodeAt(i); + mismatch |= (ac ^ bc); + } + + return (mismatch === 0); +}; + + diff --git a/node_modules/hapi/node_modules/cryptiles/package.json b/node_modules/hapi/node_modules/cryptiles/package.json new file mode 100755 index 0000000..a1e4739 --- /dev/null +++ b/node_modules/hapi/node_modules/cryptiles/package.json @@ -0,0 +1,50 @@ +{ + "name": "cryptiles", + "description": "General purpose crypto utilities", + "version": "2.0.4", + "author": { + "name": "Eran Hammer", + "email": "eran@hammer.io", + "url": "http://hueniverse.com" + }, + "contributors": [], + "repository": { + "type": "git", + "url": "git://github.com/hapijs/cryptiles" + }, + "main": "index", + "keywords": [ + "cryptography", + "security", + "utilites" + ], + "engines": { + "node": ">=0.8.0" + }, + "dependencies": { + "boom": "2.x.x" + }, + "devDependencies": { + "lab": "4.x.x" + }, + "scripts": { + "test": "make test-cov" + }, + "licenses": [ + { + "type": "BSD", + "url": "http://github.com/hapijs/cryptiles/raw/master/LICENSE" + } + ], + "readme": "cryptiles\n=========\n\nGeneral purpose crypto utilities\n\n[![Build Status](https://secure.travis-ci.org/hapijs/cryptiles.png)](http://travis-ci.org/hapijs/cryptiles)\n\n## Methods\n\n### `randomString( size)`\nReturns a cryptographically strong pseudo-random data string. Takes a size argument for the length of the string.\n\n### `fixedTimeComparison( a, b)`\nCompare two strings using fixed time algorithm (to prevent time-based analysis of MAC digest match). Returns `true` if the strings match, `false` if they differ.\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/hapijs/cryptiles/issues" + }, + "_id": "cryptiles@2.0.4", + "dist": { + "shasum": "cf3e82fb4fa4624231fde834f194836a00c100ad" + }, + "_from": "cryptiles@2.0.4", + "_resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.4.tgz" +} diff --git a/node_modules/hapi/node_modules/cryptiles/test/index.js b/node_modules/hapi/node_modules/cryptiles/test/index.js new file mode 100755 index 0000000..3340141 --- /dev/null +++ b/node_modules/hapi/node_modules/cryptiles/test/index.js @@ -0,0 +1,108 @@ +// Load modules + +var Lab = require('lab'); +var Cryptiles = require('../lib'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.experiment; +var it = lab.test; +var expect = Lab.expect; + + +describe('Cryptiles', function () { + + describe('#randomString', function () { + + it('should generate the right length string', function (done) { + + for (var i = 1; i <= 1000; ++i) { + expect(Cryptiles.randomString(i).length).to.equal(i); + } + + done(); + }); + + it('returns an error on invalid bits size', function (done) { + + expect(Cryptiles.randomString(99999999999999999999).message).to.equal('Failed generating random bits: Argument #1 must be number > 0'); + done(); + }); + }); + + describe('#randomBits', function () { + + it('returns an error on invalid input', function (done) { + + expect(Cryptiles.randomBits(0).message).to.equal('Invalid random bits count'); + done(); + }); + }); + + describe('#fixedTimeComparison', function () { + + var a = Cryptiles.randomString(50000); + var b = Cryptiles.randomString(150000); + + it('should take the same amount of time comparing different string sizes', function (done) { + + var now = Date.now(); + Cryptiles.fixedTimeComparison(b, a); + var t1 = Date.now() - now; + + now = Date.now(); + Cryptiles.fixedTimeComparison(b, b); + var t2 = Date.now() - now; + + expect(t2 - t1).to.be.within(-20, 20); + done(); + }); + + it('should return true for equal strings', function (done) { + + expect(Cryptiles.fixedTimeComparison(a, a)).to.equal(true); + done(); + }); + + it('should return false for different strings (size, a < b)', function (done) { + + expect(Cryptiles.fixedTimeComparison(a, a + 'x')).to.equal(false); + done(); + }); + + it('should return false for different strings (size, a > b)', function (done) { + + expect(Cryptiles.fixedTimeComparison(a + 'x', a)).to.equal(false); + done(); + }); + + it('should return false for different strings (size, a = b)', function (done) { + + expect(Cryptiles.fixedTimeComparison(a + 'x', a + 'y')).to.equal(false); + done(); + }); + + it('should return false when not a string', function (done) { + + expect(Cryptiles.fixedTimeComparison('x', null)).to.equal(false); + done(); + }); + + it('should return false when not a string (left)', function (done) { + + expect(Cryptiles.fixedTimeComparison(null, 'x')).to.equal(false); + done(); + }); + }); +}); + + diff --git a/node_modules/hapi/node_modules/h2o2/.npmignore b/node_modules/hapi/node_modules/h2o2/.npmignore new file mode 100644 index 0000000..7e1574d --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/.npmignore @@ -0,0 +1,18 @@ +.idea +*.iml +npm-debug.log +dump.rdb +node_modules +results.tap +results.xml +npm-shrinkwrap.json +config.json +.DS_Store +*/.DS_Store +*/*/.DS_Store +._* +*/._* +*/*/._* +coverage.* +lib-cov +complexity.md diff --git a/node_modules/hapi/node_modules/h2o2/.travis.yml b/node_modules/hapi/node_modules/h2o2/.travis.yml new file mode 100755 index 0000000..047f7e3 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/.travis.yml @@ -0,0 +1,5 @@ +language: node_js + +node_js: + - 0.10 + diff --git a/node_modules/hapi/node_modules/h2o2/CONTRIBUTING.md b/node_modules/hapi/node_modules/h2o2/CONTRIBUTING.md new file mode 100755 index 0000000..6518aa6 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/CONTRIBUTING.md @@ -0,0 +1,16 @@ +# How to contribute +We welcome contributions from the community and are pleased to have them. Please follow this guide when logging issues or making code changes. + +## Logging Issues +All issues should be created using the [new issue form](https://github.com/hapijs/h2o2/issues/new). Clearly describe the issue including steps +to reproduce if there are any. Also, make sure to indicate the earliest version that has the issue being reported. + +## Patching Code + +Code changes are welcome and should follow the guidelines below. + +* Fork the repository on GitHub. +* Fix the issue ensuring that your code follows the [style guide](https://github.com/hapijs/contrib/blob/master/Style.md). +* Add tests for your new code ensuring that you have 100% code coverage (we can help you reach 100% but will not merge without it). + * Run `npm test` to generate a report of test coverage +* [Pull requests](http://help.github.com/send-pull-requests/) should be made to the [master branch](https://github.com/hapijs/h2o2/tree/master). diff --git a/node_modules/hapi/node_modules/h2o2/LICENSE b/node_modules/hapi/node_modules/h2o2/LICENSE new file mode 100755 index 0000000..d5f6de6 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2012-2014, Walmart and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/h2o2/graphs/contributors diff --git a/node_modules/hapi/node_modules/h2o2/Makefile b/node_modules/hapi/node_modules/h2o2/Makefile new file mode 100755 index 0000000..83aaf0c --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/Makefile @@ -0,0 +1,8 @@ +test: + @node node_modules/lab/bin/lab -a code +test-cov: + @node node_modules/lab/bin/lab -a code -t 100 -L +test-cov-html: + @node node_modules/lab/bin/lab -a code -r html -o coverage.html + +.PHONY: test test-cov test-cov-html diff --git a/node_modules/hapi/node_modules/h2o2/README.md b/node_modules/hapi/node_modules/h2o2/README.md new file mode 100644 index 0000000..77a8cef --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/README.md @@ -0,0 +1,7 @@ +#h2o2 + +Proxy handler plugin for hapi.js. + +[![Build Status](https://secure.travis-ci.org/hapijs/h2o2.png)](http://travis-ci.org/hapijs/h2o2) + +Lead Maintainer - [Eran Hammer](https://github.com/hueniverse) diff --git a/node_modules/hapi/node_modules/h2o2/index.js b/node_modules/hapi/node_modules/h2o2/index.js new file mode 100755 index 0000000..bb0a047 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/index.js @@ -0,0 +1 @@ +module.exports = require('./lib'); diff --git a/node_modules/hapi/node_modules/h2o2/lib/index.js b/node_modules/hapi/node_modules/h2o2/lib/index.js new file mode 100755 index 0000000..77b7481 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/lib/index.js @@ -0,0 +1,243 @@ +// Load modules + +var Http = require('http'); +var Https = require('https'); +var Hoek = require('hoek'); +var Joi = require('joi'); +var Wreck = require('wreck'); + + +// Declare internals + +var internals = { + agents: {} // server.info.uri -> { http, https, insecure } +}; + + +internals.defaults = { + xforward: false, + passThrough: false, + redirects: false, + timeout: 1000 * 60 * 3, // Timeout request after 3 minutes + localStatePassThrough: false, // Pass cookies defined by the server upstream + maxSockets: Infinity +}; + + +internals.schema = Joi.object({ + host: Joi.string(), + port: Joi.number().integer(), + protocol: Joi.string().valid('http', 'https', 'http:', 'https:'), + uri: Joi.string(), + passThrough: Joi.boolean(), + localStatePassThrough: Joi.boolean(), + acceptEncoding: Joi.boolean().when('passThrough', { is: true, otherwise: Joi.forbidden() }), + rejectUnauthorized: Joi.boolean(), + xforward: Joi.boolean(), + redirects: Joi.number().min(0).integer().allow(false), + timeout: Joi.number().integer(), + mapUri: Joi.func(), + onResponse: Joi.func(), + agent: Joi.object(), + ttl: Joi.string().valid('upstream').allow(null), + maxSockets: Joi.number().positive().allow(false) +}) + .xor('host', 'mapUri', 'uri') + .without('mapUri', 'port', 'protocol') + .without('uri', 'port', 'protocol'); + + +exports.register = function (server, options, next) { + + server.handler('proxy', internals.handler); + + server.decorate('reply', 'proxy', function (options) { + + internals.handler(this.request.route, options)(this.request, this); + }); + + return next(); +}; + +exports.register.attributes = { + pkg: require('../package.json') +}; + + +internals.handler = function (route, options) { + + Joi.assert(options, internals.schema, 'Invalid proxy handler options (' + route.path + ')'); + Hoek.assert(!route.settings.payload || ((route.settings.payload.output === 'data' || route.settings.payload.output === 'stream') && !route.settings.payload.parse), 'Cannot proxy if payload is parsed or if output is not stream or data'); + var settings = Hoek.applyToDefaultsWithShallow(internals.defaults, options, ['agent']); + settings.mapUri = options.mapUri || internals.mapUri(options.protocol, options.host, options.port, options.uri); + + if (settings.ttl === 'upstream') { + settings._upstreamTtl = true; + } + + return function (request, reply) { + + settings.mapUri(request, function (err, uri, headers) { + + if (err) { + return reply(err); + } + + var protocol = uri.split(':', 1)[0]; + + var options = { + headers: {}, + payload: request.payload, + redirects: settings.redirects, + timeout: settings.timeout, + agent: internals.agent(protocol, settings, request.connection) + }; + + var bind = request.route.settings.bind; + + if (settings.passThrough) { + options.headers = Hoek.clone(request.headers); + delete options.headers.host; + + if (settings.acceptEncoding === false) { // Defaults to true + delete options.headers['accept-encoding']; + } + + if (options.headers.cookie) { + delete options.headers.cookie; + + var cookieHeader = request.connection.states.passThrough(request.headers.cookie, settings.localStatePassThrough); + if (cookieHeader) { + if (typeof cookieHeader !== 'string') { + return reply(cookieHeader); // Error + } + + options.headers.cookie = cookieHeader; + } + } + } + + if (headers) { + Hoek.merge(options.headers, headers); + } + + if (settings.xforward && + request.info.remoteAddress && + request.info.remotePort) { + + options.headers['x-forwarded-for'] = (options.headers['x-forwarded-for'] ? options.headers['x-forwarded-for'] + ',' : '') + request.info.remoteAddress; + options.headers['x-forwarded-port'] = (options.headers['x-forwarded-port'] ? options.headers['x-forwarded-port'] + ',' : '') + request.info.remotePort; + options.headers['x-forwarded-proto'] = (options.headers['x-forwarded-proto'] ? options.headers['x-forwarded-proto'] + ',' : '') + protocol; + } + + var contentType = request.headers['content-type']; + if (contentType) { + options.headers['content-type'] = contentType; + } + + // Send request + + Wreck.request(request.method, uri, options, function (err, res) { + + var ttl = null; + + if (err) { + if (settings.onResponse) { + return settings.onResponse.call(bind, err, res, request, reply, settings, ttl); + } + + return reply(err); + } + + if (settings._upstreamTtl) { + var cacheControlHeader = res.headers['cache-control']; + if (cacheControlHeader) { + var cacheControl = Wreck.parseCacheControl(cacheControlHeader); + if (cacheControl) { + ttl = cacheControl['max-age'] * 1000; + } + } + } + + if (settings.onResponse) { + return settings.onResponse.call(bind, null, res, request, reply, settings, ttl); + } + + var response = reply(res) + .ttl(ttl) + .code(res.statusCode) + .passThrough(!!settings.passThrough); // Default to false + }); + }); + }; +}; + + +internals.handler.defaults = function (method) { + + var payload = method !== 'get' && method !== 'head'; + return payload ? { + payload: { + output: 'stream', + parse: false + } + } : null; +}; + + +internals.mapUri = function (protocol, host, port, uri) { + + if (uri) { + return function (request, next) { + + if (uri.indexOf('{') === -1) { + return next(null, uri); + } + + var address = uri.replace(/{protocol}/g, request.connection.info.protocol) + .replace(/{host}/g, request.connection.info.host) + .replace(/{port}/g, request.connection.info.port) + .replace(/{path}/g, request.url.path); + + return next(null, address); + }; + } + + if (protocol && + protocol[protocol.length - 1] !== ':') { + + protocol += ':'; + } + + protocol = protocol || 'http:'; + port = port || (protocol === 'http:' ? 80 : 443); + var baseUrl = protocol + '//' + host + ':' + port; + + return function (request, next) { + + return next(null, baseUrl + request.path + (request.url.search || '')); + }; +}; + + +internals.agent = function (protocol, settings, connection) { + + if (settings.agent) { + return settings.agent; + } + + if (settings.maxSockets === false) { + return undefined; + } + + internals.agents[connection.info.uri] = internals.agents[connection.info.uri] || {}; + var agents = internals.agents[connection.info.uri]; + + var type = (protocol === 'http' ? 'http' : (settings.rejectUnauthorized === false ? 'insecure' : 'https')); + if (!agents[type]) { + agents[type] = (type === 'http' ? new Http.Agent() : (type === 'https' ? new Https.Agent() : new Https.Agent({ rejectUnauthorized: false }))); + agents[type].maxSockets = settings.maxSockets; + } + + return agents[type]; +}; diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/.npmignore b/node_modules/hapi/node_modules/h2o2/node_modules/joi/.npmignore new file mode 100644 index 0000000..2dfb3b9 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/.npmignore @@ -0,0 +1,20 @@ +.c9 +.idea +*.iml +npm-debug.log +dump.rdb +node_modules +results.tap +results.xml +npm-shrinkwrap.json +config.json +.DS_Store +*/.DS_Store +*/*/.DS_Store +._* +*/._* +*/*/._* +coverage.* +lib-cov +complexity.md +sandbox.js diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/.travis.yml b/node_modules/hapi/node_modules/h2o2/node_modules/joi/.travis.yml new file mode 100755 index 0000000..afcae46 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/.travis.yml @@ -0,0 +1,22 @@ +# Travis optimizations, see http://docs.travis-ci.com/user/workers/container-based-infrastructure/ +sudo: false +cache: + directories: + - node_modules + +language: node_js + +node_js: + - "0.10" + - "0.11" + +deploy: + provider: npm + email: marsup@gmail.com + api_key: + secure: IuIigctAboFy2AGAcv/jUgRaVEQr23FX8ao+MM5fvmVpRZ/isHNQdJ2y1AAnCu5mCU+FgjNaXw/sB37J3Le5emMKhZMivXMTwAuLIbusEiQI6lzXflE7/+QK59jEcf/e5o6guTCf3CLMKo/yCrROYc/5sBuZuUqX2yDS6acGmZs= + on: + branch: master + tags: true + repo: hapijs/joi + node: "0.10" diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/CONTRIBUTING.md b/node_modules/hapi/node_modules/h2o2/node_modules/joi/CONTRIBUTING.md new file mode 100755 index 0000000..713d376 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/CONTRIBUTING.md @@ -0,0 +1,14 @@ +# How to contribute +We welcome contributions from the community and are pleased to have them. Please follow this guide when logging issues or making code changes. + +## Logging Issues +All issues should be created using the [new issue form](https://github.com/hapijs/joi/issues/new). Clearly describe the issue including steps to reproduce if there are any. Also, make sure to indicate the earliest version that has the issue being reported. + +## Patching Code +Code changes are welcome and should follow the guidelines below. + +* Fork the repository on GitHub. +* Fix the issue ensuring that your code follows the [style guide](https://github.com/hapijs/contrib/blob/master/Style.md). +* Add tests for your new code ensuring that you have 100% code coverage (we can help you reach 100% but will not merge without it). + * Run `npm test` to generate a report of test coverage +* [Pull requests](http://help.github.com/send-pull-requests/) should be made to the [master branch](https://github.com/hapijs/joi/tree/master). diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/LICENSE b/node_modules/hapi/node_modules/h2o2/node_modules/joi/LICENSE new file mode 100755 index 0000000..03afbde --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2012-2014, Walmart and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/joi/graphs/contributors \ No newline at end of file diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/README.md b/node_modules/hapi/node_modules/h2o2/node_modules/joi/README.md new file mode 100755 index 0000000..de221ba --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/README.md @@ -0,0 +1,1240 @@ +![joi Logo](https://raw.github.com/hapijs/joi/master/images/joi.png) + +Object schema description language and validator for JavaScript objects. + +[![npm version](https://badge.fury.io/js/joi.svg)](http://badge.fury.io/js/joi) +[![Build Status](https://secure.travis-ci.org/hapijs/joi.svg)](http://travis-ci.org/hapijs/joi) +[![Dependencies Status](https://david-dm.org/hapijs/joi.svg)](https://david-dm.org/hapijs/joi) +[![DevDependencies Status](https://david-dm.org/hapijs/joi/dev-status.svg)](https://david-dm.org/hapijs/joi#info=devDependencies) + +Lead Maintainer: [Nicolas Morel](https://github.com/marsup) + +## Table of Contents + + +- [Example](#example) +- [Usage](#usage) + - [`validate(value, schema, [options], [callback])`](#validatevalue-schema-options-callback) + - [`compile(schema)`](#compileschema) + - [`assert(value, schema, [message])`](#assertvalue-schema-message) + - [`any`](#any) + - [`any.allow(value)`](#anyallowvalue) + - [`any.valid(value)`](#anyvalidvalue) + - [`any.invalid(value)`](#anyinvalidvalue) + - [`any.required()`](#anyrequired) + - [`any.optional()`](#anyoptional) + - [`any.forbidden()`](#anyforbidden) + - [`any.description(desc)`](#anydescriptiondesc) + - [`any.notes(notes)`](#anynotesnotes) + - [`any.tags(tags)`](#anytagstags) + - [`any.meta(meta)`](#anymetameta) + - [`any.example(value)`](#anyexamplevalue) + - [`any.unit(name)`](#anyunitname) + - [`any.options(options)`](#anyoptionsoptions) + - [`any.strict()`](#anystrict) + - [`any.default(value)`](#anydefaultvalue) + - [`any.concat(schema)`](#anyconcatschema) + - [`any.when(ref, options)`](#anywhenref-options) + - [`any.label(name)`](#anylabelname) + - [`any.raw(isRaw)`](#anyrawisraw) + - [`array`](#array) + - [`array.sparse(enabled)`](#arraysparseenabled) + - [`array.includes(type)`](#arrayincludestype) + - [`array.excludes(type)`](#arrayexcludestype) + - [`array.min(limit)`](#arrayminlimit) + - [`array.max(limit)`](#arraymaxlimit) + - [`array.length(limit)`](#arraylengthlimit) + - [`array.unique()`](#arrayunique) + - [`binary`](#binary) + - [`binary.encoding(encoding)`](#binaryencodingencoding) + - [`binary.min(limit)`](#binaryminlimit) + - [`binary.max(limit)`](#binarymaxlimit) + - [`binary.length(limit)`](#binarylengthlimit) + - [`boolean()`](#boolean) + - [`date`](#date) + - [`date.min(date)`](#datemindate) + - [`date.max(date)`](#datemaxdate) + - [`date.format(format)`](#dateformatformat) + - [`date.iso()`](#dateiso) + - [`func`](#func) + - [`number`](#number) + - [`number.min(limit)`](#numberminlimit) + - [`number.max(limit)`](#numbermaxlimit) + - [`number.greater(limit)`](#numbergreaterlimit) + - [`number.less(limit)`](#numberlesslimit) + - [`number.integer()`](#numberinteger) + - [`number.precision(limit)`](#numberprecisionlimit) + - [`object`](#object) + - [`object.keys([schema])`](#objectkeysschema) + - [`object.min(limit)`](#objectminlimit) + - [`object.max(limit)`](#objectmaxlimit) + - [`object.length(limit)`](#objectlengthlimit) + - [`object.pattern(regex, schema)`](#objectpatternregex-schema) + - [`object.and(peers)`](#objectandpeers) + - [`object.nand(peers)`](#objectnandpeers) + - [`object.or(peers)`](#objectorpeers) + - [`object.xor(peers)`](#objectxorpeers) + - [`object.with(key, peers)`](#objectwithkey-peers) + - [`object.without(key, peers)`](#objectwithoutkey-peers) + - [`object.rename(from, to, [options])`](#objectrenamefrom-to-options) + - [`object.assert(ref, schema, [message])`](#objectassertref-schema-message) + - [`object.unknown([allow])`](#objectunknownallow) + - [`object.type(constructor, [name])`](#objecttypeconstructorname) + - [`object.requiredKeys(children)`](#objectrequiredkeyschildren) + - [`object.optionalKeys(children)`](#objectoptionalkeyschildren) + - [`string`](#string) + - [`string.insensitive()`](#stringinsensitive) + - [`string.min(limit, [encoding])`](#stringminlimit-encoding) + - [`string.max(limit, [encoding])`](#stringmaxlimit-encoding) + - [`string.creditCard()`](#stringcreditCard) + - [`string.length(limit, [encoding])`](#stringlengthlimit-encoding) + - [`string.regex(pattern, [name])`](#stringregexpattern-name) + - [`string.alphanum()`](#stringalphanum) + - [`string.token()`](#stringtoken) + - [`string.email()`](#stringemail) + - [`string.guid()`](#stringguid) + - [`string.hostname()`](#stringhostname) + - [`string.lowercase()`](#stringlowercase) + - [`string.uppercase()`](#stringuppercase) + - [`string.trim()`](#stringtrim) + - [`alternatives`](#alternatives) + - [`alternatives.try(schemas)`](#alternativestryschemas) + - [`alternatives.when(ref, options)`](#alternativeswhenref-options) + - [`ref(key, [options])`](#refkey-options) + +# Example + +```javascript +var Joi = require('joi'); + +var schema = Joi.object().keys({ + username: Joi.string().alphanum().min(3).max(30).required(), + password: Joi.string().regex(/[a-zA-Z0-9]{3,30}/), + access_token: [Joi.string(), Joi.number()], + birthyear: Joi.number().integer().min(1900).max(2013), + email: Joi.string().email() +}).with('username', 'birthyear').without('password', 'access_token'); + +Joi.validate({ username: 'abc', birthyear: 1994 }, schema, function (err, value) { }); // err === null -> valid +``` + +The above schema defines the following constraints: +* `username` + * a required string + * must contain only alphanumeric characters + * at least 3 characters long but no more than 30 + * must be accompanied by `birthyear` +* `password` + * an optional string + * must satisfy the custom regex + * cannot appear together with `access_token` +* `access_token` + * an optional, unconstrained string or number +* `birthyear` + * an integer between 1900 and 2013 +* `email` + * a valid email address string + +# Usage + +Usage is a two steps process. First, a schema is constructed using the provided types and constraints: + +```javascript +var schema = { + a: Joi.string() +}; +``` + +Note that **joi** schema objects are immutable which means every additional rule added (e.g. `.min(5)`) will return a +new schema object. + +Then the value is validated against the schema: + +```javascript +Joi.validate({ a: 'a string' }, schema, function (err, value) { }); +``` + +If the value is valid, `null` is returned, otherwise an `Error` object. + +The schema can be a plain JavaScript object where every key is assigned a **joi** type, or it can be a **joi** type directly: + +```javascript +var schema = Joi.string().min(10); +``` + +If the schema is a **joi** type, the `schema.validate(value, callback)` can be called directly on the type. When passing a non-type schema object, +the module converts it internally to an object() type equivalent to: + +```javascript +var schema = Joi.object().keys({ + a: Joi.string() +}); +``` + +When validating a schema: +* Keys are optional by default. +* Strings are utf-8 encoded by default. +* Rules are defined in an additive fashion and evaluated in order after whitelist and blacklist checks. + +### `validate(value, schema, [options], [callback])` + +Validates a value using the given schema and options where: +- `value` - the value being validated. +- `schema` - the validation schema. Can be a **joi** type object or a plain object where every key is assigned a **joi** type object. +- `options` - an optional object with the following optional keys: + - `abortEarly` - when `true`, stops validation on the first error, otherwise returns all the errors found. Defaults to `true`. + - `convert` - when `true`, attempts to cast values to the required types (e.g. a string to a number). Defaults to `true`. + - `allowUnknown` - when `true`, allows object to contain unknown keys which are ignored. Defaults to `false`. + - `skipFunctions` - when `true`, ignores unknown keys with a function value. Defaults to `false`. + - `stripUnknown` - when `true`, unknown keys are deleted (only when value is an object). Defaults to `false`. + - `language` - overrides individual error messages, when `'label'` is set, it overrides the key name in the error message. Defaults to no override (`{}`). + - `presence` - sets the default presence requirements. Supported modes: `'optional'`, `'required'`, and `'forbidden'`. + Defaults to `'optional'`. + - `context` - provides an external data set to be used in [references](#refkey-options). Can only be set as an external option to + `validate()` and not using `any.options()`. +- `callback` - the optional synchronous callback method using the signature `function(err, value)` where: + - `err` - if validation failed, the error reason, otherwise `null`. + - `value` - the validated value with any type conversions and other modifiers applied (the input is left unchanged). `value` can be + incomplete if validation failed and `abortEarly` is `true`. If callback is not provided, then returns an object with error + and value properties. + +```javascript +var schema = { + a: Joi.number() +}; + +var value = { + a: '123' +}; + +Joi.validate(value, schema, function (err, value) { }); +// err -> null +// value.a -> 123 (number, not string) + +// or +var result = Joi.validate(value, schema); +// result.error -> null +// result.value -> { "a" : 123 } +``` + +### `compile(schema)` + +Converts literal schema definition to **joi** schema object (or returns the same back if already a **joi** schema object) where: +- `schema` - the schema definition to compile. + +```javascript +var definition = ['key', 5, { a: true, b: [/^a/, 'boom'] }]; +var schema = Joi.compile(definition); + +// Same as: + +var schema = Joi.alternatives().try([ + Joi.string().valid('key'), + Joi.number().valid(5), + Joi.object().keys({ + a: Joi.boolean().valid(true), + b: Joi.alternatives().try([ + Joi.string().regex(/^a/), + Joi.string().valid('boom') + ]) + }) +]); +``` + +### `assert(value, schema, [message])` + +Validates a value against a schema and throws if validation fails where: +- `value` - the value to validate. +- `schema` - the schema object. +- `message` - optional message sting prefix added in front of the error message. + +```javascript +Joi.assert('x', Joi.number()); +``` + +### `any` + +Generates a schema object that matches any data type. + +```javascript +var any = Joi.any(); +any.validate('a', function (err, value) { }); +``` + +#### `any.allow(value)` + +Whitelists a value where: +- `value` - the allowed value which can be of any type and will be matched against the validated value before applying any other rules. + `value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options). + +```javascript +var schema = { + a: Joi.any().allow('a'), + b: Joi.any().allow('b', 'B'), + c: Joi.any().allow(['c', 'C']) +}; +``` + +#### `any.valid(value)` + +Adds the provided values into the allowed whitelist and marks them as the only valid values allowed where: +- `value` - the allowed value which can be of any type and will be matched against the validated value before applying any other rules. + `value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options). + +```javascript +var schema = { + a: Joi.any().valid('a'), + b: Joi.any().valid('b', 'B'), + c: Joi.any().valid(['c', 'C']) +}; +``` + +#### `any.invalid(value)` + +Blacklists a value where: +- `value` - the forbidden value which can be of any type and will be matched against the validated value before applying any other rules. + `value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options). + +```javascript +var schema = { + a: Joi.any().invalid('a'), + b: Joi.any().invalid('b', 'B'), + c: Joi.any().invalid(['c', 'C']) +}; +``` + +#### `any.required()` + +Marks a key as required which will not allow `undefined` as value. All keys are optional by default. + +```javascript +var schema = Joi.any().required(); +``` + +#### `any.optional()` + +Marks a key as optional which will allow `undefined` as values. Used to annotate the schema for readability as all keys are optional by default. + +```javascript +var schema = Joi.any().optional(); +``` + +#### `any.forbidden()` + +Marks a key as forbidden which will not allow any value except `undefined`. Used to explicitly forbid keys. + +```javascript +var schema = { + a: Joi.any().forbidden() +}; +``` + +#### `any.description(desc)` + +Annotates the key where: +- `desc` - the description string. + +```javascript +var schema = Joi.any().description('this key will match anything you give it'); +``` + +#### `any.notes(notes)` + +Annotates the key where: +- `notes` - the notes string or array of strings. + +```javascript +var schema = Joi.any().notes(['this is special', 'this is important']); +``` + +#### `any.tags(tags)` + +Annotates the key where: +- `tags` - the tag string or array of strings. + +```javascript +var schema = Joi.any().tags(['api', 'user']); +``` + +#### `any.meta(meta)` + +Attaches metadata to the key where: +- `meta` - the meta object to attach. + +```javascript +var schema = Joi.any().meta({ index: true }); +``` + +#### `any.example(value)` + +Annotates the key where: +- `value` - an example value. + +If the example fails to pass validation, the function will throw. + +```javascript +var schema = Joi.string().min(4).example('abcd'); +``` + +#### `any.unit(name)` + +Annotates the key where: +- `name` - the unit name of the value. + +```javascript +var schema = Joi.number().unit('milliseconds'); +``` + +#### `any.options(options)` + +Overrides the global `validate()` options for the current key and any sub-key where: +- `options` - an object with the same optional keys as [`Joi.validate(value, schema, options, callback)`](#joivalidatevalue-schema-options-callback). + +```javascript +var schema = Joi.any().options({ convert: false }); +``` + +#### `any.strict()` + +Sets the `options.convert` options to `false` which prevent type casting for the current key and any child keys. + +```javascript +var schema = Joi.any().strict(); +``` + +#### `any.default(value)` + +Sets a default value if the original value is undefined where: +- `value` - the value. `value` supports [references](#refkey-options). + +Note that if `value` is an object, any changes to the object after `default()` is called will change the reference +and any future assignment. + +```javascript +var schema = { + username: Joi.string().default('new_user') +}; +Joi.validate({}, schema, function (err, value) { }); +// value === { username: "new_user" } +``` + +#### `any.concat(schema)` + +Returns a new type that is the result of adding the rules of one type to another where: +- `schema` - a **joi** type to merge into the current schema. Can only be of the same type as the context type or `any`. + +```javascript +var a = Joi.string().valid('a'); +var b = Joi.string().valid('b'); +var ab = a.concat(b); +``` + +#### `any.when(ref, options)` + +Converts the type into an [`alternatives`](#alternatives) type where the conditions are merged into the type definition where: +- `ref` - the key name or [reference](#refkey-options). +- `options` - an object with: + - `is` - the required condition **joi** type. + - `then` - the alternative schema type if the condition is true. Required if `otherwise` is missing. + - `otherwise` - the alternative schema type if the condition is false. Required if `then` is missing. + +```javascript +var schema = { + a: Joi.any().valid('x').when('b', { is: 5, then: Joi.valid('y'), otherwise: Joi.valid('z') }), + b: Joi.any() +}; +``` + +Alternatively, if you want to specify a specific type such as `string`, `array`, etc, you can do so like this: + +```javascript +var schema = { + a: Joi.valid('a', 'b', 'other'), + other: Joi.string() + .when('a', { is: 'other', then: Joi.required() }), +}; +``` + +#### `any.label(name)` + +Overrides the key name in error messages. +- `name` - the name of the key. + +```javascript +var schema = { + first_name: Joi.string().label('First Name') +}; +``` + +#### `any.raw(isRaw)` + +Outputs the original untouched value instead of the casted value. +- `isRaw` - whether to enable raw mode or not. Defaults to true. + +```javascript +var schema = { + timestamp: Joi.date().format('YYYYMMDD').raw() +}; +``` + +### `array` + +Generates a schema object that matches an array data type. Note that undefined values inside arrays are not allowed by default but can be by using `sparse()`. + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var array = Joi.array().includes(Joi.string().valid('a', 'b')); +array.validate(['a', 'b', 'a'], function (err, value) { }); +``` + +#### `array.sparse(enabled)` + +Allow this array to be sparse. `enabled` can be used with a falsy value to go back to the default behavior. + +```javascript +var schema = Joi.array().sparse(); // undefined values are now allowed +schema = schema.sparse(false); // undefined values are now denied +``` + +#### `array.single(enabled)` + +Allow single values to be checked against rules as if it were provided as an array. + +`enabled` can be used with a falsy value to go back to the default behavior. + +```javascript +var schema = Joi.array().includes(Joi.number()).single(); +schema.validate([4]); // returns `{ error: null, value: [ 4 ] }` +schema.validate(4); // returns `{ error: null, value: [ 4 ] }` +``` + +#### `array.includes(type)` + +List the types allowed for the array values where: +- `type` - a **joi** schema object to validate each array item against. `type` can be an array of values, or multiple values can be passed as individual arguments. + +```javascript +var schema = Joi.array().includes(Joi.string(), Joi.number()); +``` + +#### `array.excludes(type)` + +List the types forbidden for the array values where: +- `type` - a **joi** schema object to validate each array item against. `type` can be an array of values, or multiple values can be passed as individual arguments. + +```javascript +var schema = Joi.array().excludes(Joi.object()); +``` + +#### `array.min(limit)` + +Specifies the minimum number of items in the array where: +- `limit` - the lowest number of array items allowed. + +```javascript +var schema = Joi.array().min(2); +``` + +#### `array.max(limit)` + +Specifies the maximum number of items in the array where: +- `limit` - the highest number of array items allowed. + +```javascript +var schema = Joi.array().max(10); +``` + +#### `array.length(limit)` + +Specifies the exact number of items in the array where: +- `limit` - the number of array items allowed. + +```javascript +var schema = Joi.array().length(5); +``` + +#### `array.unique()` + +Requires the array values to be unique. + +Be aware that a deep equality is performed on elements of the array having a type of `object`, a performance penalty is to be expected for this kind of operation. + +```javascript +var schema = Joi.array().unique(); +``` + +### `boolean` + +Generates a schema object that matches a boolean data type (as well as the strings 'true', 'false', 'yes', and 'no'). Can also be called via `bool()`. + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var boolean = Joi.boolean(); +boolean.validate(true, function (err, value) { }); +``` + +### `binary` + +Generates a schema object that matches a Buffer data type (as well as the strings which will be converted to Buffers). + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var schema = Joi.binary(); +``` + +#### `binary.encoding(encoding)` + +Sets the string encoding format if a string input is converted to a buffer where: +- `encoding` - the encoding scheme. + +```javascript +var schema = Joi.binary().encoding('base64'); +``` + +#### `binary.min(limit)` + +Specifies the minimum length of the buffer where: +- `limit` - the lowest size of the buffer. + +```javascript +var schema = Joi.binary().min(2); +``` + +#### `binary.max(limit)` + +Specifies the maximum length of the buffer where: +- `limit` - the highest size of the buffer. + +```javascript +var schema = Joi.binary().max(10); +``` + +#### `binary.length(limit)` + +Specifies the exact length of the buffer: +- `limit` - the size of buffer allowed. + +```javascript +var schema = Joi.binary().length(5); +``` + +### `date` + +Generates a schema object that matches a date type (as well as a JavaScript date string or number of milliseconds). + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var date = Joi.date(); +date.validate('12-21-2012', function (err, value) { }); +``` + +#### `date.min(date)` + +Specifies the oldest date allowed where: +- `date` - the oldest date allowed. + +```javascript +var schema = Joi.date().min('1-1-1974'); +``` + +Notes: `'now'` can be passed in lieu of `date` so as to always compare relatively to the current date, allowing to explicitly ensure a date is either in the past or in the future. + +```javascript +var schema = Joi.date().min('now'); +``` + +It can also be a reference to another field. + +```javascript +var schema = Joi.object({ + from: Joi.date().required(), + to: Joi.date().min(Joi.ref('from')).required() +}); +``` + +#### `date.max(date)` + +Specifies the latest date allowed where: +- `date` - the latest date allowed. + +```javascript +var schema = Joi.date().max('12-31-2020'); +``` + +Notes: `'now'` can be passed in lieu of `date` so as to always compare relatively to the current date, allowing to explicitly ensure a date is either in the past or in the future. + +```javascript +var schema = Joi.date().max('now'); +``` + +It can also be a reference to another field. + +```javascript +var schema = Joi.object({ + from: Joi.date().max(Joi.ref('to')).required(), + to: Joi.date().required() +}); +``` + +#### `date.format(format)` + +Specifies the allowed date format: +- `format` - string or array of strings that follow the `moment.js` [format](http://momentjs.com/docs/#/parsing/string-format/). + +```javascript +var schema = Joi.date().format('YYYY/MM/DD'); +``` + +#### `date.iso()` + +Requires the string value to be in valid ISO 8601 date format. + +```javascript +var schema = Joi.date().iso(); +``` + +### `func` + +Generates a schema object that matches a function type. + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var func = Joi.func(); +func.validate(function () {}, function (err, value) { }); +``` + +### `number` + +Generates a schema object that matches a number data type (as well as strings that can be converted to numbers). + +`Infinity` and `-Infinity` are invalid by default, you can change that behavior by calling `allow(Infinity, -Infinity)`. + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var number = Joi.number(); +number.validate(5, function (err, value) { }); +``` + +#### `number.min(limit)` + +Specifies the minimum value where: +- `limit` - the minimum value allowed. + +```javascript +var schema = Joi.number().min(2); +``` + +#### `number.max(limit)` + +Specifies the maximum value where: +- `limit` - the maximum value allowed. + +```javascript +var schema = Joi.number().max(10); +``` + +#### `number.greater(limit)` + +Specifies that the value must be greater than `limit`. + +```javascript +var schema = Joi.number().greater(5); +``` + +#### `number.less(limit)` + +Specifies that the value must be less than `limit`. + +```javascript +var schema = Joi.number().less(10); +``` + +#### `number.integer()` + +Requires the number to be an integer (no floating point). + +```javascript +var schema = Joi.number().integer(); +``` + +#### `number.precision(limit)` + +Specifies the maximum number of decimal places where: +- `limit` - the maximum number of decimal places allowed. + +```javascript +var schema = Joi.number().precision(2); +``` + +### `object` + +Generates a schema object that matches an object data type (as well as JSON strings that parsed into objects). Defaults +to allowing any child key. + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var object = Joi.object().keys({ + a: Joi.number().min(1).max(10).integer(), + b: 'some string' +}); + +object.validate({ a: 5 }, function (err, value) { }); +``` + +#### `object.keys([schema])` + +Sets or extends the allowed object keys where: +- `schema` - optional object where each key is assigned a **joi** type object. If `schema` is `{}` no keys allowed. + If `schema` is `null` or `undefined`, any key allowed. If `schema` is an object with keys, the keys are added to any + previously defined keys (but narrows the selection if all keys previously allowed). Defaults to 'undefined' which + allows any child key. + +```javascript +var base = Joi.object().keys({ + a: Joi.number(), + b: Joi.string() +}); +// Validate keys a, b and c. +var extended = base.keys({ + c: Joi.boolean() +}); +``` + +#### `object.min(limit)` + +Specifies the minimum number of keys in the object where: +- `limit` - the lowest number of keys allowed. + +```javascript +var schema = Joi.object().min(2); +``` + +#### `object.max(limit)` + +Specifies the maximum number of keys in the object where: +- `limit` - the highest number of object keys allowed. + +```javascript +var schema = Joi.object().max(10); +``` + +#### `object.length(limit)` + +Specifies the exact number of keys in the object where: +- `limit` - the number of object keys allowed. + +```javascript +var schema = Joi.object().length(5); +``` + +#### `object.pattern(regex, schema)` + +Specify validation rules for unknown keys matching a pattern where: +- `regex` - a regular expression tested against the unknown key names. +- `schema` - the schema object matching keys much validate against. + +```javascrip +var schema = Joi.object({ + a: Joi.string() +}).pattern(/\w\d/, Joi.boolean()); +``` + +#### `object.and(peers)` + +Defines an all-or-nothing relationship between keys where if one of the peers is present, all of them are required as +well where: +- `peers` - the key names of which if one present, all are required. `peers` can be a single string value, an + array of string values, or each peer provided as an argument. + +```javascript +var schema = Joi.object().keys({ + a: Joi.any(), + b: Joi.any() +}).and('a', 'b'); +``` + +#### `object.nand(peers)` + +Defines a relationship between keys where not all peers can be present at the +same time where: +- `peers` - the key names of which if one present, the others may not all be present. `peers` can be a single string value, an + array of string values, or each peer provided as an argument. + +```javascript +var schema = Joi.object().keys({ + a: Joi.any(), + b: Joi.any() +}).nand('a', 'b'); +``` + +#### `object.or(peers)` + +Defines a relationship between keys where one of the peers is required (and more than one is allowed) where: +- `peers` - the key names of which at least one must appear. `peers` can be a single string value, an + array of string values, or each peer provided as an argument. + +```javascript +var schema = Joi.object().keys({ + a: Joi.any(), + b: Joi.any() +}).or('a', 'b'); +``` + +#### `object.xor(peers)` + +Defines an exclusive relationship between a set of keys where one of them is required but not at the same time where: +- `peers` - the exclusive key names that must not appear together but where one of them is required. `peers` can be a single string value, an + array of string values, or each peer provided as an argument. + +```javascript +var schema = Joi.object().keys({ + a: Joi.any(), + b: Joi.any() +}).xor('a', 'b'); +``` + +#### `object.with(key, peers)` + +Requires the presence of other keys whenever the specified key is present where: +- `key` - the reference key. +- `peers` - the required peer key names that must appear together with `key`. `peers` can be a single string value or an array of string values. + +Note that unlike [`object.and()`](#objectandpeers), `with()` creates a dependency only between the `key` and each of the `peers`, not +between the `peers` themselves. + +```javascript +var schema = Joi.object().keys({ + a: Joi.any(), + b: Joi.any() +}).with('a', 'b'); +``` + +#### `object.without(key, peers)` + +Forbids the presence of other keys whenever the specified is present where: +- `key` - the reference key. +- `peers` - the forbidden peer key names that must not appear together with `key`. `peers` can be a single string value or an array of string values. + +```javascript +var schema = Joi.object().keys({ + a: Joi.any(), + b: Joi.any() +}).without('a', ['b']); +``` + +#### `object.rename(from, to, [options])` + +Renames a key to another name (deletes the renamed key) where: +- `from` - the original key name. +- `to` - the new key name. +- `options` - an optional object with the following optional keys: + - `alias` - if `true`, does not delete the old key name, keeping both the new and old keys in place. Defaults to `false`. + - `multiple` - if `true`, allows renaming multiple keys to the same destination where the last rename wins. Defaults to `false`. + - `override` - if `true`, allows renaming a key over an existing key. Defaults to `false`. + +Keys are renamed before any other validation rules are applied. + +```javascript +var object = Joi.object().keys({ + a: Joi.number() +}).rename('b', 'a'); + +object.validate({ b: 5 }, function (err, value) { }); +``` + +#### `object.assert(ref, schema, [message])` + +Verifies an assertion where: +- `ref` - the key name or [reference](#refkey-options). +- `schema` - the validation rules required to satisfy the assertion. If the `schema` includes references, they are resolved against + the object value, not the value of the `ref` target. +- `message` - optional human-readable message used when the assertion fails. Defaults to 'failed to pass the assertion test'. + +```javascript +var schema = Joi.object().keys({ + a: { + b: Joi.string(), + c: Joi.number() + }, + d: { + e: Joi.any() + } +}).assert('d.e', Joi.ref('a.c'), 'equal to a.c'); +``` + +#### `object.unknown([allow])` + +Overrides the handling of unknown keys for the scope of the current object only (does not apply to children) where: +- `allow` - if `false`, unknown keys are not allowed, otherwise unknown keys are ignored. + +```javascript +var schema = Joi.object({ a: Joi.any() }).unknown(); +``` + +#### `object.type(constructor, [name])` + +Requires the object to be an instance of a given constructor where: +- `constructor` - the constructor function that the object must be an instance of. +- `name` - an alternate name to use in validation errors. This is useful when the constructor function does not have a name. + +```javascript +var schema = Joi.object().type(RegExp); +``` + +#### `object.requiredKeys(children)` + +Sets the specified children to required. +- `children` - can be a single string value, an array of string values, or each child provided as an argument. + +```javascript +var schema = Joi.object().keys({ a: { b: Joi.number() }, c: { d: Joi.string() } }); +var requiredSchema = schema.requiredKeys('', 'a.b', 'c', 'c.d'); +``` + +Note that in this example `''` means the current object, `a` is not required but `b` is, as well as `c` and `d`. + +#### `object.optionalKeys(children)` + +Sets the specified children to optional. +- `children` - can be a single string value, an array of string values, or each child provided as an argument. + +```javascript +var schema = Joi.object().keys({ a: { b: Joi.number().required() }, c: { d: Joi.string().required() } }); +var requiredSchema = schema.optionalKeys('a.b', 'c.d'); +``` + +The behavior is exactly the same as `requiredKeys`. + +### `string` + +Generates a schema object that matches a string data type. Note that empty strings are not allowed by default and must be enabled with `allow('')`. + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var schema = Joi.string().min(1).max(10); +schema.validate('12345', function (err, value) { }); +``` + +#### `string.insensitive()` + +Allows the value to match any whitelist of blacklist item in a case insensitive comparison. + +```javascript +var schema = Joi.string().valid('a').insensitive(); +``` + +#### `string.min(limit, [encoding])` + +Specifies the minimum number string characters where: +- `limit` - the minimum number of string characters required. +- `encoding` - is specified, the string length is calculated in bytes using the provided encoding. + +```javascript +var schema = Joi.string().min(2); +``` + +#### `string.max(limit, [encoding])` + +Specifies the maximum number of string characters where: +- `limit` - the maximum number of string characters allowed. +- `encoding` - is specified, the string length is calculated in bytes using the provided encoding. + +```javascript +var schema = Joi.string().max(10); +``` + +#### `string.creditCard()` + +Requires the number to be a credit card number (Using [Lunh +Algorithm](http://en.wikipedia.org/wiki/Luhn_algorithm)). + +```javascript +var schema = Joi.string().creditCard(); +``` + +#### `string.length(limit, [encoding])` + +Specifies the exact string length required where: +- `limit` - the required string length. +- `encoding` - is specified, the string length is calculated in bytes using the provided encoding. + +```javascript +var schema = Joi.string().length(5); +``` + +#### `string.regex(pattern, [name])` + +Defines a regular expression rule where: +- `pattern` - a regular expression object the string value must match against. +- `name` - optional name for patterns (useful with multiple patterns). Defaults to 'required'. + +```javascript +var schema = Joi.string().regex(/^[abc]+$/); +``` + +#### `string.alphanum()` + +Requires the string value to only contain a-z, A-Z, and 0-9. + +```javascript +var schema = Joi.string().alphanum(); +``` + +#### `string.token()` + +Requires the string value to only contain a-z, A-Z, 0-9, and underscore _. + +```javascript +var schema = Joi.string().token(); +``` + +#### `string.email()` + +Requires the string value to be a valid email address. + +```javascript +var schema = Joi.string().email(); +``` + +#### `string.guid()` + +Requires the string value to be a valid GUID. + +```javascript +var schema = Joi.string().guid(); +``` + +#### `string.hostname()` + +Requires the string value to be a valid hostname as per [RFC1123](http://tools.ietf.org/html/rfc1123). + +```javascript +var schema = Joi.string().hostname(); +``` + +#### `string.lowercase()` + +Requires the string value to be all lowercase. If the validation `convert` option is on (enabled by default), the string +will be forced to lowercase. + +```javascript +var schema = Joi.string().lowercase(); +``` + +#### `string.uppercase()` + +Requires the string value to be all uppercase. If the validation `convert` option is on (enabled by default), the string +will be forced to uppercase. + +```javascript +var schema = Joi.string().uppercase(); +``` + +#### `string.trim()` + +Requires the string value to contain no whitespace before or after. If the validation `convert` option is on (enabled by +default), the string will be trimmed. + +```javascript +var schema = Joi.string().trim(); +``` + +### `alternatives` + +Generates a type that will match one of the provided alternative schemas via the [`try()`](#alternativestryschemas) +method. If no schemas are added, the type will not match any value except for `undefined`. + +Supports the same methods of the [`any()`](#any) type. + +Alternatives can be expressed using the shorter `[]` notation. + +```javascript +var alt = Joi.alternatives().try(Joi.number(), Joi.string()); +// Same as [Joi.number(), Joi.string()] +``` + +#### `alternatives.try(schemas)` + +Adds an alternative schema type for attempting to match against the validated value where: +- `schema` - an array of alternative **joi** types. Also supports providing each type as a separate argument. + +```javascript +var alt = Joi.alternatives().try(Joi.number(), Joi.string()); +alt.validate('a', function (err, value) { }); +``` + +#### `alternatives.when(ref, options)` + +Adds a conditional alternative schema type based on another key (not the same as `any.when()`) value where: +- `ref` - the key name or [reference](#refkey-options). +- `options` - an object with: + - `is` - the required condition **joi** type. + - `then` - the alternative schema type to **try** if the condition is true. Required if `otherwise` is missing. + - `otherwise` - the alternative schema type to **try** if the condition is false. Required if `then` is missing. + +```javascript +var schema = { + a: Joi.alternatives().when('b', { is: 5, then: Joi.string(), otherwise: Joi.number() }), + b: Joi.any() +}; +``` + +Note that `when()` only adds additional alternatives to try and does not impact the overall type. Setting +a `required()` rule on a single alternative will not apply to the overall key. For example, +this definition of `a`: + +```javascript +var schema = { + a: Joi.alternatives().when('b', { is: true, then: Joi.required() }), + b: Joi.boolean() +}; +``` + +Does not turn `a` into a required key when `b` is `true`. Instead, it tells the validator to try and match the +value to anything that's not `undefined`. However, since `Joi.alternatives()` by itself allows `undefined`, the rule +does not accomplish turning `a` to a required value. This rule is the same as `Joi.alternatives([Joi.required()])` +when `b` is `true` which will allow any value including `undefined`. + +To accomplish the desired result above use: + +```javascript +var schema = { + a: Joi.when('b', { is: true, then: Joi.required() }), + b: Joi.boolean() +}; +``` + +### `ref(key, [options])` + +Generates a reference to the value of the named key. References are resolved at validation time and in order of dependency +so that if one key validation depends on another, the dependent key is validated second after the reference is validated. +References support the following arguments: +- `key` - the reference target. References cannot point up the object tree, only to sibling keys, but they can point to + their siblings' children (e.g. 'a.b.c') using the `.` separator. If a `key` starts with `$` is signifies a context reference + which is looked up in the `context` option object. +- `options` - optional settings: + - `separator` - overrides the default `.` hierarchy separator. + - `contextPrefix` - overrides the default `$` context prefix signifier. + +Note that references can only be used where explicitly supported such as in `valid()` or `invalid()` rules. If upwards +(parents) references are needed, use [`object.assert()`](#objectassertref-schema-message). + +```javascript +var schema = Joi.object().keys({ + a: Joi.ref('b.c'), + b: { + c: Joi.any() + }, + c: Joi.ref('$x') +}); + +Joi.validate({ a: 5, b: { c: 5 } }, schema, { context: { x: 5 } }, function (err, value) {}); +``` diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/examples/conditionalRequire.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/examples/conditionalRequire.js new file mode 100644 index 0000000..8ed0a6a --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/examples/conditionalRequire.js @@ -0,0 +1,43 @@ +// This is an example of a survey to obtain the reputation of Parisians +// It contains examples of how to conditionally require keys based on values of other keys + +var Joi = require("../"); + +// This is a valid value for integer rating 1 - 5 +var intRating = Joi.number().integer().min(1).max(5); + +var schema = Joi.object().keys({ + // Do you know any French people? yes or no (required) + q1: Joi.boolean().required(), + // Do you know any Parisians? yes or no (required if answered yes in q1) + q2: Joi.boolean() + .when('q1', { is: true, then: Joi.required() }), + // How many french in paris do you know? 1-6, 6-10, 11-50 or 50+ (required if answered yes in q2) + q3: Joi.string() + .when('q2', { is: true, then: Joi.valid('1-5', '6-10', '11-50', '50+').required() }), + // Rate 20% of most friendly Parisians, from how many people you know answered in q3, individually on 1-5 rating + q4: Joi.array() + .when('q3', {is: '1-5', then: Joi.array().min(0).max(1).includes(intRating).required() }) + .when('q3', {is: '6-10', then: Joi.array().min(1).max(2).includes(intRating).required() }) + .when('q3', {is: '11-50', then: Joi.array().min(2).max(10).includes(intRating).required() }) + .when('q3', {is: '50+' , then: Joi.array().min(10).includes(intRating).required() }), + // Rate remaining 80% of Parisians, from how many people you know answered in q3, individually on 1-5 rating + q5: Joi.array() + .when('q3', {is: '1-5', then: Joi.array().min(1).max(4).includes(intRating).required() }) + .when('q3', {is: '6-10', then: Joi.array().min(4).max(8).includes(intRating).required() }) + .when('q3', {is: '11-50', then: Joi.array().min(8).max(40).includes(intRating).required() }) + .when('q3', {is: '50+' , then: Joi.array().min(40).includes(intRating).required().required() }), + // Rate the reputation of Parisians in general, 1-5 rating + q6: intRating.required() +}); + +var response = { + q1: true, + q2: true, + q3: '1-5', + q4: [5], + q4: [1], + q6: 2 +}; + +Joi.assert(response, schema); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/examples/customMessage.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/examples/customMessage.js new file mode 100755 index 0000000..38cd28a --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/examples/customMessage.js @@ -0,0 +1,22 @@ +var Joi = require('../'); + + +var schema = Joi.object().options({ abortEarly: false }).keys({ + email: Joi.string().email().required().label('User Email'), + password: Joi.string().min(8).required(), + password_confirmation: Joi.any().valid(Joi.ref('password')).required().options({ language: { any: { allowOnly: 'must match password' }, label: 'Password Confirmation' } }).label('This label is not used because language.label takes precedence'), + first_name: Joi.string().required(), + last_name: Joi.string().required(), + company: Joi.string().optional() +}); + + +var data = { + email: 'not_a_valid_email_to_show_custom_label', + password: 'abcd1234', + password_confirmation: 'abc1', + first_name: 'Joe', + last_name: 'Doe' +}; + +Joi.assert(data, schema); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/examples/multipleWhen.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/examples/multipleWhen.js new file mode 100755 index 0000000..b13cba9 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/examples/multipleWhen.js @@ -0,0 +1,17 @@ +var Joi = require('../'); + + +var schema = { + type: Joi.string().required(), + subtype: Joi.alternatives() + .when('type', {is: 'video', then: Joi.valid('mp4', 'wav')}) + .when('type', {is: 'audio', then: Joi.valid('mp3')}) + .when('type', {is: 'image', then: Joi.valid('jpg', 'png')}) + .when('type', {is: 'pdf' , then: Joi.valid('document')}) +}; + + +Joi.assert({ type: 'video', subtype: 'mp4' }, schema); // Pass +Joi.assert({ type: 'video', subtype: 'wav' }, schema); // Pass +Joi.assert({ type: 'other', subtype: 'something' }, schema); // Fail +Joi.assert({ type: 'audio', subtype: 'mp4' }, schema); // Fail diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/images/joi.png b/node_modules/hapi/node_modules/h2o2/node_modules/joi/images/joi.png new file mode 100755 index 0000000000000000000000000000000000000000..d240833802bcd4e4e0becde614466a3f36f09480 GIT binary patch literal 30662 zcmX7vcQ~8x+s0GnYZJSrc8n5x?>%A`v8l$MReR6cilQirqE?Wau}AH__nt-7s=eaP z?|A=+=RZfD`@Zh$I`7YUCiab%3Lzdf9smF!gs3X&qMv`!pBkM1(0}C&nN!gZ+z+b8 z9smG7+5bMz09oH&004N}4hjly-q^c(x_a2VeqewoC@_3*ceQnJwgCWqmvZ#%pn3N!ilUX?!ae-WA4YG!xxzKVV#{v)4h_AE5w zS*K^Rs5(w4IY8DwQN9=;tNbi9=PRoo;5#PZ-LRGAHsB2x;2m4Y?`c42&P`^(Gl1zA zMv7ZmZrS23X(%@Inl2RRL8EfX*=>ehmPJ0Klsg z6Zsl|831@Uz|8Cmh{yzxEB`Z;JmW+F_c+iim02U%1QJsUGsWR@!!|VJrehz2P;rtA z!!Tf3vfN#MnJ@Xn1c^7!M*x8D$rR|fJ%98aBSMUg2`3_nEV%x3{P)CUX}OKs9WVbN z3jl0-22Y~EJhjxJ690v|pbA)yG40>tfA_kMx2++Ttp|KRSTa2S@V~WD%KzN7xVXEs zv!K=^ZwebS3_{s;S#%mcI^PCMK3rdJv~PjJ_|3yqFmE=xMlLjpUX7>VMp&-=PEvVj zz<+w6oo4ERST-4PkZKE3^FZ_ph!V&VIo-TQyJf3yvEBAM=E5ha3qeiP}Io|Qi z$kGaS>exr6ejwuR(r+Y^`apaK!^!={-WrCBDK~&a24h@`d1e`B#GHsjl^J=%_)8U& zG#+?*^i0N@XQh-y{g`w~{8BQ--%uh3K~ zLLH%8fIngF$(NNx`8|8Wy^dPylW_jtM7cfjQj)YnKX2#$3v7WNXI}2UZux3aFm9^V za5Yl}L3tl_l|jYxme@8_UMLrH{^Oyn!`k-9&1qD#pHy|TncKT<-}iz*A!rm5|z?5`bu z?t3G)@zz#L5(Ip8#5<(dPcfYxoWvixyoUiFyg2rr?^e2#rQsqNUmRv&5TXOE@=!a zXHRcYZ?y!kgi=#V{1U+pcPgUEZ&CE=cwch-HMjk3Xs(89$(mo=-rcJpo=51T%U#K( z3W3powFIF5mI=mQNcIZ3xk}RV^e><3D42K4Dip!eU>Tbc$xV}zg|o^D%EX@>`pmXL z+b(@BeTA(5u`;r%YyQzZ&eGLvDt=uop&_BsKRPm6Fglkhlr6iv`{JO^>M=yI?#g59Z$>ZaBOnj_*_%L^dGGIEG;bVv6=#{(?!MxYG#sVG_-2)06I=hoH_<3o(PU{uH z+6vlXcJ+JAJXSo(hL!VG4MjfiYuE{u^p&)G-nR6%q{tfonz6-*NN2-9!?1R@YpzA) zxSDpd$4}SS$T^Erhlx5tcVDWTWjTkM_FQ;-qj#A1`EdR)SSQ7F4x@f!X zn0O|ICu0^A%sA+@{;6_k`ltL&ZWZza^$HY$cbg*E%09Ph5NfPui|0~ic{8~1ONqDf zeN0LI>?RLq)J#R%{jvLP>pfgy6Ip}meIMVzLzjj<=v4c;0?U{S4=G=~4>e(*=fJM9 zvoW;o7>ykgOE1sm96cJT9a{b@^6ez=>4>z8bTb866s2y+MQilCt-?{PM$*l18E=~c zi!;jLzY595I3$P5taka4VFn_&jn!Y%DeUd9q3~bz&zuhN_3?HigAP~bkIc1=c#PNU zVRunEG}08YaR~Bdstk&d1@;x+U7Bdup^nUzFLh<*Jx$i*wo|qTzt^~OO^MRs8NV}# z-V-h^)e){6)E!-3DJ}D4jIuAcd_*cV6?RBAw%U{oj*UvlKz~3lpm$K=`^|J0wElr!XN2Dj`{;c^ws4UYHe-o56_ES5D4mvCygioj1 z{Tu(3la><{%zeA^Zn*#%uxB;4?nvx<(hT(6oKkv<-;-#S7&H6V==rZ^d6&$v(J&tb@)nIqF$Fbp-MIW}~%2w@GiwoH!xkZK5=vf(4)XKuiN{C~p&-e4m6_xA%B0r9! zk}s2p6|j;rlZK-RqYiULrNzXyWZWMQ9!eC(t;bn&sZa%|VFVQ=Pw>s`;r!U-*U9{h ze;KJAE`ddle>x9e{#@?s>Z5BP^cCQHdtq>Y^vh?(hxVj!omhJ(kRgQq$^N$bQg5Q< zKJ{g4>J#Skujda|0$j^zy~$vus;dbA__F{2p&tQ&+b8t%008jf1pxlM0|3Oo0svI5 zDHgrT0D$uuL{SdvyY#osC-Bv^-`-QMbS*6{gK9YDFAm)wJq2&MOp)8}i5~6hQhR^R zwglNScD6*D%#M9x^|%wsN63zln$r`6 z&zX}MGSy)F|78^yuyerSOgKzHQp{(t7w*!kDLof6AU=V(vUJErcAZMA-voZ#v#%ibC)l}6db$Mi0zF4=|SrhYt~;QGho^r z^MRV4nH_R-Df5xBon)KjcAH_b;0sZtmB+&lyQX0E=g;Nou}s4+n&mi>F*`3MU-kd; zb}^gpEi-tn&k+;);Et)q%J&H~t2iId5m&$vHzkG(hL9HN;w~diKPeW}>muIk3i+v@ zY;nurbdyJvQ(hv6%ME$TzYOml9~``#YJ&1*@+Y#U4qAnGes>XLo`pMLNo{4?2v)DPvBwpnsCG+hzu7XDZ~1~IgHab!M#524O?aNszU*wEb??E;Rk#RZf&K$yi@(UK;Cswt1;Pt@?r_ENI=eaU${XO+A>So*Ki? z8X~W+FKDhZ??uoZV`k4BhM32#fEgPMAuHFL9usMT4?~^?Pjo8vA*{?P8R`^f^U2~Z z;y_GZO&T5Yh1LO$-!HLg27`^!W`bVS(K z^ts~xo)=A)`JNdL+1f8+ci7*&=MH0iYZx)Q7eCuPh^4V4O&o?fYNDDd&MPsGXVhoR=&A z%#sT9!Yw_6)HAMzWNxQV4w{b=v)9}`Zx&3wPgX4aVg0###U`ge3#X4itiPygj>XmVD3PM4{n6QP_4(GuZ*XCXE*U5tH8Js@{n%hYuU<-}h z&z>148+8N=(fl;gE;Cwc+`ct0rw{qt^u*hE(#gEdR?^NjI7J-x$Klv-!AwxIH7a8C zw>xH7(%!8vB7V=WF_$WJOj%a;OHULQk%AU;l~KbF4{#L-@?#ppp9$625aqI7CdZGw zY-=+`a-UeJaS<_?tBtgY`Q~buLFLGm6m_f*k(zf)UYv$>GQ!RO&iZpv8-+=dElv+R zI~_6MH(bW)NutOEb`>lpk5yMWAa|+Jk66~XLNF&GG9{hQ6cqZ?44>j?1IObBmKmz! zj}}6K#*1G&Wi?cj9@^m*XZ7pyBu;_>U#NBelTSY2jUPCTZ~SNNbfODp;cc6X*^ z-sAfnnZUnybI5P|&1*K-VKYBXftc3D;lTf}iO(0ugGbk!g2qp-xsM+`mc7|C)WPP> zVky`&FwSzpF z%Sf4r-}4>w8ESSYXi5)RbG{z<%V}T|lw;ORQxhx+Gc`4FaB}J<#z2prirLax$FH*- zNE@r(Xm*?ua22V(>;XLPEn8K{9bMzGax^T4JuU+02Xr@G$jQ(K3j)GbG$YQ!h*3~^;7u>~NeB}K=D%nqouTaFSa!vxUDhn44_%1~pT76&tHO&X zQ-&v(mg4A7Mm45Cfj`v8*%&V*CfJz9$nVIDfUCfT{q_A`827o+d(Dlx(MQb#HJ;0z zo$k)lw)s|qa=;Xgmq6u!zfcajA`|Aufp4ylO~|9~rFb2u>N1?R{0DiD$E(DU&T-T9 zT@Wemt9}PWF)L+m71{PSdg2wZ+h--h_6aeZvXr@V@>w#NaTL%?P*V|w?~-ZDe7DT- zVMXyfJ0AS~_m|4#Gj6N7V~DHE;dHJ(uT`udy#n?WEgB6CErGxr(R!1FF@zSvr~|Jb z=~onBH}3@j5e6R^u4zl>J(XbxpYD7;^rt_tKRM-`wN0}k%LuJ%F5bG8&OO`^72eh5 z=xIV3C%JSR-f4Ct7j5vHc7yJrIdCg0xp zjvIX#>yW#?`>6igA;XicUaG4U7f6JYAu-O0@7{7Fs;?3!R~v}Qvsn8Uhhvu`jQ+H| z10@$lME^9AyNYe0YByyeEf!qUl$B-V+f_VWCR#}%c$M3}w;8~#KcBD5%@~7GQ=uqT zb@vLt;_wF$@LRl|{=}j9AH`ep_7helpO<1PxrNB=cg%ptz9Lw}{1l@8c z($Ti?Bx`)3^tyJQfWk(ZiDl#g&dbPTB$86Tv%*+3F`gYS0yYs7m^bV{@5maJf4;eX z=Q?PCa_zV$(VwM5K!>bGcV~L!75*F@#8!R>HuSwtkTx(*PyQ2B(H_0MFasAF+T}0O zja6&Xs5I%V24jpXkSckav*l=|Iyo@TFR8I+E9ulBE)NY*o6Bp#0okD8o7~|Q>Wy2^ zNF|+}^SpcNS;y1l(d?h7T3y(0fq4Inpn9VUBz|~{^*lnV?`qE*mrd)N^~KGLT{SG8 z(@DY{MgB1OfNyTdT9C_&C{OP?oe`?$sHjBxubDZEXDuDq0izVNJzXXX)~o?0p9ikZ zB3S_O8J z8=#K*e#p_E`0bsu_15k2al7^s(nYQ26WmcCrSviB<3|;;cz;vjIe2fqw$v>Maij+} znD9!l8P1q$aDF|%T9tr873~o+-L@wcm$mLzHk`GcNO?vx;N;~SH!k$ZlOc7vMXb%O zm7aal!@QCTobNqHe@`WYz%E%9fWs=CfP3&j3m1>nHEyaf%}TA^HT_E9VS3)}xXgKCPrSs{+P{VF zar$v<{-+Y%nt|WVJxXn>ZQE@9$2i>^9iw9!=H~|?cdZP7`Sr%jif8Eo zYa10Ci(6b=!cG~#kd6gBkSv<|QOjj*vNV81rjGqq{gGlHh3=7-J}UQwrbw5eQh3cq zFIKuut@|wAb(MNM7CcE579W`@Ph#Q4F+L-L`xDG|N6 zqK~#VJ5KnX{}s_VRmdE25w(Ti;(MG)%MSlnW2z?y{7jK~b_QuM0uvYv75zrl$40U_ zH<^KO0u^;+Q+nAg!4P)18k5%I3@(__a#q9E&Mx!oH)}`7IQe|wEWN^o$RPQFbE31l z1RPdj*5r8W_4s_a$p4*vJ}`>03>p`a|2iCaMYqslp{t*eOvb!u&F@tJlxzY&ydUOcO64T)M)t@=^|EbeW-4sJq^`*CF9`f zjU+Cb8a3HsEmZFu}|}3E4ih(5^74hksME>6^|RS(w?m z$hu0rGBO(5JUR&!Xz@OJIy2{?TVafw$}5GdsS9JrUde(o7tJOrZPS8-!Gsw zIc+p^cmIQR*Fv|`3hP1-O;6YRwVKRPQ{h_6cUZC3DS^`Co88f3A2tB}iL}gldA;Wa zT^O&C?cwZ9oOn^m45@0BJKeZ1n6IYAEC(Vt4f<=-RnS*Xtt#!9yd6AMTEK8%g{Kb~!p&UpsriKM^4Kc#!F! zsIxJV-+geEi0twbd9S4Nr4}!Le2lzQ-w8XlY^M~?F*-Zb(?!G5@AerKi$n^Gi;DxQ zT(Z@gZ6VJ9%_G z)_XdQ?2zGYe1Zo`hpaDo9cmpfwjKHeKd`MeAHzotbt~uIUR@G&zq>{}f~I3jY8Jt3 zHVezkJxL5O&NPmcSFu&IoRNw;4D%_4m2HGEacjf7{JrwYmem6@P*Ca5L;sJR%?J^k zzX9#(8ZVa(D&Hb(YK>XhN+_Ym1qjEptt+YES zn=ASNf$3=hLdZ;)b8>Hd%Wc9F>etnM`_rk))nB@Y&rYU`7PqJOm6glFe=QD4VvLWB z05P9s6(_3|y&?B& zuvjN`oQ*`V#bnJS(bMA&+nkfkdwFYXCf35b{lhy|roH;KzAd;9SDyT!G#wVW{*g%L zz>kXoEf)eodTJ_aO*Df*v(}Py>Ru(IYWcV5j6JCXUG&l@+33K8~i2)|t z1Fkup@(P8J#Cr>73^r2SsRO|RcDO|DGV1sc(b3GA%=_V$kKC$~l1}NYMsCRa>rcfc z$9m90XJb|va4VpFqh;+MgXdc7`$uZCd71L&%@vLc58P~(d&8V=?C94!_(`|z>-Ib7 zRls7aC>X$$0~*ILfIc}zm}3HEV+PAcSllXj`7%1a9@*xRBJUTGXIY#gZy9H4uzxd` z3K{}m+5h;Kg8PwHg2>JObU(G`yA;=f$=Bg}UNIr1A~WMZ3-vOM$9?6?8CRG55;=Jp z#G2F4zJ4}HNovyTIK>TY-^Atr*Z%?s8if<<=Z`l}+y9*ayPBoRfPKwcQ!gnSxk;FD z3am}*pH7QKEb>OI^}fWV8EVell>(P*NH9tC6IL!wMnTEEZv-RR=z`{^FLyGgGo4{N zt~{9UyLRL51csLm<7u#oV#nUtToAkFz^HitV4r&u7TAV^&vJ4YkL= zJ>+#fMbnR6U3iX~rs=iML2SylZtH%_)h%cQr zH^((jo_M3pTy=7vAl&R*>})%@m3w#+xa{K33@*=+vvvB5vHhXQ6=oXv zbi3y*IkPr-OKbdvn24CxT#PSyeC``pgq} zd`Kp;8rZLrL@RM+9}sX4Tb(HVf~T6|Syfw`69MCumevwZ68=46v$36-5%+uF zp>MxtUZY;7AIx3f4pO^VU_}wp{_<#3aTGeQ^E4#W1dGDF^jR<;7&?EpG{ItkV~nRS zYdx5_w)7~C^r6=J?Wmyy!wO0zlKwO9IFL!jitke!@ws;1-9M{_75Dp}uj6WDa02^l zz@%lM#BGK_ezc_c{MoX)6RlYxcKkDrLU)El6H9B#WoEC5X_v~WqY?$i-Qg)99S(g_ zH%n*vlpk{I_&}xne1b)EvmvZDD|?s8ntxKLM(SU&&%=o~K$;ICRb%SDA0=Xdy9VNgCc z5KG1|@dCd9PJQ4R>htWGl}Z6A>1)@#+Ld@FL$DR-vWoFM z0vOSl*kZZcS>rOC!IK7pIFr+TkL(utcpw}ve;luBB)TN!F zrzdi?(QA43oc|;8?P9oU_q8C4HdH%OoII{<_;X*YZ-~Sv;(;G5DASbJL-aeObapl-Czs zbSRqXaT%ZeR2ciyRgKN?)%e)hR{xgmyjcLD`RXdPTtA!_l&Sjt@IO7hR5bWoT3TXH zi~Cyql2ev_MuUu@qatL3_@w1}vWEU9q5A7j%5ZjGf6GsbUA~IIKRIf=7FbN0f^Ki| zP4gfuG0DB36>*JI0b!qc6aQ2Bh;Zg~Of5HkXPhpVLdMl}(bDkNL;uIw&OISICc)6t zUAnYn!k)(Io2$}f_Iuf9b-0?Dt;4YV*5~oxPt?+0e_x-OzTTNxgIp*Xo7RVo&Sy9n ziaJbbYK%Bcw}H96@sz29wl8UDx{*hs?8QLeNtEBwl2=O-t(2(eR?k9lk-Go*l9vac zT(w$}+Gt&|$+CMu;J9nd7*??C1jv~zBfN^M4G-~h%jj7yEroV#L}v;noRY*hv9-)) zx!~|t#N6jmUxdq|x?)m-8uMA1XI$qsi6V)9n&02ak}~MX;9g!3qolXz-(LCZiv;v- zyXj<4=4OoyaX7WO7`x}k{-vk%DBVkIwUeh6~s%xtjp{9 z>Q7tS(a{lm9RFi?zE$nCUM|EWAd+D1iGb>Z|YPfDodZ`MQSvXHN zU|k!yQ`j-SCv*MeyMelgluVC|j4-HAqV$27;^GovrMu%uaK%k2l*6Atb4fx>%qyF{ zwHfC(dopqD{5nj5%xk`F9WNtE;Km-=WmM_Ms%Zh=t(Y9mCceN_~fL;ZFDIuCM9(5 z{*|=g2%5ao`f7c+zM>6?5?EZZn|i%kzcT;MW2_4tz!lg@xJALcvc56-P(Q(#SWys5v_U*=W-T0VJyd};b0on z!5%Tgh))U4BA*aoiXd&L*;-^we5s4LaeZmDD)U*D1$_yKruYB0m$!QVxY^y0QkqXt zF)>;0SK=eLh7dh=vVwY$F5vRMAqq}=7YBtDP`Kz5Cnp}vECg+n1zi6vYHLeawaY|G|DS6YfHK@A}gbThs9!jZvGeP~vtgsGbQzYQAc& zw2XT-sxgi@+P6pZ+aALWN}8xK)MKh|?sX4F(5)+m^sAGQG4C+0&fhmTex1+SU#)Lm zi`;rZ_<$!0%X??vvctv!PiNoO-p)9X0&k?lPDIRLKpe>rBcYCKMWPOR->P1ZH!e`* zIWDfWwz?VzaAzk_uVRJG8di`ezM}VEuho{i)JwPdIqTJ?py$O$5c$bv(R>i9HZ7PS z?~tB;O!?)Fob2~E*_*L!bbAxO6n^kKnDw({kLqw|RCCclQdEnljEWNq25y2oe|^Mm zIy7DHsVV%P28YLZ{HrWr=a-P+^z!Dpt4#`d&`W0@o@sI77UwS+_>?Oe3mQ%uIj363 zUZF7^@p=2hw5Ts2f3>sUlBzsb{bNY3UCrDX8K2uYiF)iT3X4zot1oWYVd{`VSSR*8 zK`EtVv9Gy-2CAZ^Q6f1DqBoy@DdzSq zp#71y{a;atO~1#u-pC%!ZfXr!uMGMSdzLz`{SEwZCenUIJCzCjBGHaBbD3CDYzvPo zkQ7L=7~|@U@67r6Pm=UBptHe}RHVAf2xA2qx)-u6hMTQbq6+ea3h5?@a)y13>68O9 z01Jli^quArG9#UrWyGJL!WUe9oIo75gtDN)TCS!q}-rL2l=FEe#hM1b`;OU&l z5dm$eTG2 zCSzU_9={q3YhS+=mTH(~wW@TUol?k?MevCP@#^&gvv#T~3%BDF+>t|Iy7tR(8Wrk~ ztF(Dm3D2(DMu6;lx{iIHo?|yM{CEodKveJE#T9{q3LxC~A!_fo@qN&-(+*QK49Y{( z2PextxxTpYbbi~~Xqt{mlBeqTW|lnoxT7^mDuC$S99Udp`7|gGP0gaBliap$_=?$- z*GM%mJEWSQc3g{1Qf%SOk@_ESVp#W!$X-J=i$0HwD2M)-a(G~njoUQ}l&=2jfG?9pYX`eMcZ@Dis$wh1aXEi_dIDt7UBcgp*;PLGOQ zfj1bI`0Un`_>6oZh&6+=Ab+E|1amBDni|${%~pCd2x(IY=MSUTw`xk%G&GdywM^C! zR%c3n=jfhdvNCv{aXVkXK9}q2tI?JX~zG9@9N?k+bFV zlCFzaiGyXhXv8b4?nDy~EDEwVmYWuQ)t?XL*z}`YG$T^dIekvAGj*zgHX+cI*IBrK zl3B&brv-{?R5n=Lvj3Wa_lR37S#{^>wv z@P}T)?+1Z=2M#heHc{`L8~i3S?&8L_pQWC$82p~+bKXI z3qgj5k$4C*5#CixaBotpceFGXPCVKY<3>8vH`F(nRW~-M;9xwVBYH@eLK<;4m44&8 z#`?BOA*tE5x!ZSkD&x7CnJ>3*&bBMFiXqMKf&XpX%l#~1cj#7qQ=V03Sv^A+^&@2v zBnNyg0U#8S${rPb&%WpkCKHg-+_(p&KooW4zbGcsiIG|)MIsJg;C@7*P#qs=�bm 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

Hr1>gKd}HOXUrnp$Jk^n( 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 0, 'limit must be a positive integer'); + + return this._test('min', limit, function (value, state, options) { + + if (value.length >= limit) { + return null; + } + + return Errors.create('array.min', { limit: limit }, state, options); + }); +}; + + +internals.Array.prototype.max = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('max', limit, function (value, state, options) { + + if (value.length <= limit) { + return null; + } + + return Errors.create('array.max', { limit: limit }, state, options); + }); +}; + + +internals.Array.prototype.length = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('length', limit, function (value, state, options) { + + if (value.length === limit) { + return null; + } + + return Errors.create('array.length', { limit: limit }, state, options); + }); +}; + + +internals.Array.prototype.unique = function () { + + return this._test('unique', undefined, function (value, state, options) { + + var found = { + string: {}, + number: {}, + undefined: {}, + boolean: {}, + object: [], + function: [] + }; + + for (var i = 0, il = value.length; i < il; ++i) { + var item = value[i]; + var type = typeof item; + var records = found[type]; + + // All available types are supported, so it's not possible to reach 100% coverage without ignoring this line. + // I still want to keep the test for future js versions with new types (eg. Symbol). + if (/* $lab:coverage:off$ */ records /* $lab:coverage:on$ */) { + if (Array.isArray(records)) { + for (var r = 0, rl = records.length; r < rl; ++r) { + if (Hoek.deepEqual(records[r], item)) { + return Errors.create('array.unique', { pos: i }, state, options); + } + } + + records.push(item); + } + else { + if (records[item]) { + return Errors.create('array.unique', { pos: i }, state, options); + } + + records[item] = true; + } + } + } + }); +}; + + +internals.Array.prototype.sparse = function (enabled) { + + var obj = this.clone(); + obj._flags.sparse = enabled === undefined ? true : !!enabled; + return obj; +}; + + +internals.Array.prototype.single = function (enabled) { + + var obj = this.clone(); + obj._flags.single = enabled === undefined ? true : !!enabled; + return obj; +} + + +module.exports = new internals.Array(); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/binary.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/binary.js new file mode 100755 index 0000000..83715b8 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/binary.js @@ -0,0 +1,98 @@ +// Load modules + +var Any = require('./any'); +var Errors = require('./errors'); +var Hoek = require('hoek'); + + +// Declare internals + +var internals = {}; + + +internals.Binary = function () { + + Any.call(this); + this._type = 'binary'; +}; + +Hoek.inherits(internals.Binary, Any); + + +internals.Binary.prototype._base = function (value, state, options) { + + var result = { + value: value + }; + + if (typeof value === 'string' && + options.convert) { + + try { + var converted = new Buffer(value, this._flags.encoding); + result.value = converted; + } + catch (e) { } + } + + result.errors = Buffer.isBuffer(result.value) ? null : Errors.create('binary.base', null, state, options); + return result; +}; + + +internals.Binary.prototype.encoding = function (encoding) { + + Hoek.assert(Buffer.isEncoding(encoding), 'Invalid encoding:', encoding); + + var obj = this.clone(); + obj._flags.encoding = encoding; + return obj; +}; + + +internals.Binary.prototype.min = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('min', limit, function (value, state, options) { + + if (value.length >= limit) { + return null; + } + + return Errors.create('binary.min', { limit: limit }, state, options); + }); +}; + + +internals.Binary.prototype.max = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('max', limit, function (value, state, options) { + + if (value.length <= limit) { + return null; + } + + return Errors.create('binary.max', { limit: limit }, state, options); + }); +}; + + +internals.Binary.prototype.length = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('length', limit, function (value, state, options) { + + if (value.length === limit) { + return null; + } + + return Errors.create('binary.length', { limit: limit }, state, options); + }); +}; + + +module.exports = new internals.Binary(); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/boolean.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/boolean.js new file mode 100755 index 0000000..b182a01 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/boolean.js @@ -0,0 +1,41 @@ +// Load modules + +var Any = require('./any'); +var Errors = require('./errors'); +var Hoek = require('hoek'); + + +// Declare internals + +var internals = {}; + + +internals.Boolean = function () { + + Any.call(this); + this._type = 'boolean'; +}; + +Hoek.inherits(internals.Boolean, Any); + + +internals.Boolean.prototype._base = function (value, state, options) { + + var result = { + value: value + }; + + if (typeof value === 'string' && + options.convert) { + + var lower = value.toLowerCase(); + result.value = (lower === 'true' || lower === 'yes' || lower === 'on' ? true + : (lower === 'false' || lower === 'no' || lower === 'off' ? false : value)); + } + + result.errors = (typeof result.value === 'boolean') ? null : Errors.create('boolean.base', null, state, options); + return result; +}; + + +module.exports = new internals.Boolean(); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/cast.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/cast.js new file mode 100755 index 0000000..41fd99b --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/cast.js @@ -0,0 +1,74 @@ +// Load modules + +var Hoek = require('hoek'); +var Ref = require('./ref'); +// Type modules are delay-loaded to prevent circular dependencies + + +// Declare internals + +var internals = { + any: null, + date: require('./date'), + string: require('./string'), + number: require('./number'), + boolean: require('./boolean'), + alt: null, + object: null +}; + + +exports.schema = function (config) { + + internals.any = internals.any || new (require('./any'))(); + internals.alt = internals.alt || require('./alternatives'); + internals.object = internals.object || require('./object'); + + if (config && + typeof config === 'object') { + + if (config.isJoi) { + return config; + } + + if (Array.isArray(config)) { + return internals.alt.try(config); + } + + if (config instanceof RegExp) { + return internals.string.regex(config); + } + + if (config instanceof Date) { + return internals.date.valid(config); + } + + return internals.object.keys(config); + } + + if (typeof config === 'string') { + return internals.string.valid(config); + } + + if (typeof config === 'number') { + return internals.number.valid(config); + } + + if (typeof config === 'boolean') { + return internals.boolean.valid(config); + } + + if (Ref.isRef(config)) { + return internals.any.valid(config); + } + + Hoek.assert(config === null, 'Invalid schema content:', config); + + return internals.any.valid(null); +}; + + +exports.ref = function (id) { + + return Ref.isRef(id) ? id : Ref.create(id); +}; \ No newline at end of file diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/date.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/date.js new file mode 100755 index 0000000..1fa8f7b --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/date.js @@ -0,0 +1,168 @@ +// Load modules + +var Any = require('./any'); +var Errors = require('./errors'); +var Ref = require('./ref'); +var Hoek = require('hoek'); +var Moment = require('moment'); + + +// Declare internals + +var internals = {}; + +internals.isoDate = /^((\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\d))$/; +internals.invalidDate = new Date(''); +internals.isIsoDate = (function() { + + var isoString = internals.isoDate.toString(); + + return function (date) { + + return date && (date.toString() === isoString); + }; +})(); + +internals.Date = function () { + + Any.call(this); + this._type = 'date'; +}; + +Hoek.inherits(internals.Date, Any); + + +internals.Date.prototype._base = function (value, state, options) { + + var result = { + value: (options.convert && internals.toDate(value, this._flags.format)) || value + }; + + if (result.value instanceof Date && !isNaN(result.value.getTime())) { + result.errors = null; + } + else { + result.errors = Errors.create(internals.isIsoDate(this._flags.format) ? 'date.isoDate' : 'date.base', null, state, options); + } + + return result; +}; + + +internals.toDate = function (value, format) { + + if (value instanceof Date) { + return value; + } + + if (typeof value === 'string' || + Hoek.isInteger(value)) { + + if (typeof value === 'string' && + /^[+-]?\d+$/.test(value)) { + + value = parseInt(value, 10); + } + + var date; + if (format) { + if (internals.isIsoDate(format)) { + date = format.test(value) ? new Date(value) : internals.invalidDate; + } + else { + date = Moment(value, format, true); + date = date.isValid() ? date.toDate() : internals.invalidDate; + } + } + else { + date = new Date(value); + } + + if (!isNaN(date.getTime())) { + return date; + } + } + + return null; +}; + + +internals.compare = function (type, compare) { + + return function (date) { + + var isNow = date === 'now'; + var isRef = Ref.isRef(date); + + if (!isNow && !isRef) { + date = internals.toDate(date); + } + + Hoek.assert(date, 'Invalid date format'); + + return this._test(type, date, function (value, state, options) { + + var compareTo; + if (isNow) { + compareTo = Date.now(); + } + else if (isRef) { + compareTo = internals.toDate(date(state.parent)); + + if (!compareTo) { + return Errors.create('date.ref', { ref: date.key }, state, options); + } + + compareTo = compareTo.getTime(); + } + else { + compareTo = date.getTime(); + } + + if (compare(value.getTime(), compareTo)) { + return null; + } + + return Errors.create('date.' + type, { limit: new Date(compareTo) }, state, options); + }); + }; +}; + + +internals.Date.prototype.min = internals.compare('min', function (value, date) { + + return value >= date; +}); + + +internals.Date.prototype.max = internals.compare('max', function (value, date) { + + return value <= date; +}); + + +internals.Date.prototype.format = function (format) { + + Hoek.assert(typeof format === 'string' || (Array.isArray(format) && format.every(function (f) { + + return typeof f === 'string'; + })), 'Invalid format.'); + + var obj = this.clone(); + obj._flags.format = format; + return obj; +}; + +internals.Date.prototype.iso = function () { + + var obj = this.clone(); + obj._flags.format = internals.isoDate; + return obj; +}; + +internals.Date.prototype._isIsoDate = function (value) { + + return internals.isoDate.test(value); +}; + +module.exports = new internals.Date(); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/errors.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/errors.js new file mode 100755 index 0000000..034642a --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/errors.js @@ -0,0 +1,159 @@ +// Load modules + +var Hoek = require('hoek'); +var Language = require('./language'); + + +// Declare internals + +var internals = {}; + + +internals.Err = function (type, context, state, options) { + + this.type = type; + this.context = context || {}; + this.context.key = state.key; + this.path = state.path; + this.options = options; +}; + + +internals.Err.prototype.toString = function () { + + var self = this; + + var localized = this.options.language; + this.context.key = localized.label || this.context.key || localized.root || Language.errors.root; + + var format = Hoek.reach(localized, this.type) || Hoek.reach(Language.errors, this.type); + var hasKey = /\{\{\!?key\}\}/.test(format); + format = (hasKey ? format : '{{!key}} ' + format); + var message = format.replace(/\{\{(\!?)([^}]+)\}\}/g, function ($0, isSecure, name) { + + var value = Hoek.reach(self.context, name); + var normalized = Array.isArray(value) ? value.join(', ') : value.toString(); + return (isSecure ? Hoek.escapeHtml(normalized) : normalized); + }); + + return message; +}; + + +exports.create = function (type, context, state, options) { + + return new internals.Err(type, context, state, options); +}; + + +exports.process = function (errors, object) { + + if (!errors || !errors.length) { + return null; + } + + var details = []; + for (var i = 0, il = errors.length; i < il; ++i) { + var item = errors[i]; + details.push({ + message: item.toString(), + path: internals.getPath(item), + type: item.type, + context: item.context + }); + } + + // Construct error + + var message = ''; + details.forEach(function (error) { + + message += (message ? '. ' : '') + error.message; + }); + + var error = new Error(message); + error.name = 'ValidationError'; + error.details = details; + error._object = object; + error.annotate = internals.annotate; + return error; +}; + + +internals.getPath = function (item) { + + var recursePath = function (it) { + + var reachedItem = Hoek.reach(it, 'context.reason.0'); + if (reachedItem && reachedItem.context) { + return recursePath(reachedItem); + } + + return it.path; + }; + + return recursePath(item) || item.context.key; +}; + + +internals.annotate = function () { + + var obj = Hoek.clone(this._object || {}); + + var lookup = {}; + var el = this.details.length; + for (var e = el - 1; e >= 0; --e) { // Reverse order to process deepest child first + var pos = el - e; + var error = this.details[e]; + var path = error.path.split('.'); + var ref = obj; + for (var i = 0, il = path.length; i < il && ref; ++i) { + var seg = path[i]; + if (i + 1 < il) { + ref = ref[seg]; + } + else { + var value = ref[seg]; + if (value !== undefined) { + delete ref[seg]; + var label = seg + '_$key$_' + pos + '_$end$_'; + ref[label] = value; + lookup[error.path] = label; + } + else if (lookup[error.path]) { + var replacement = lookup[error.path]; + var appended = replacement.replace('_$end$_', ', ' + pos + '_$end$_'); + ref[appended] = ref[replacement]; + lookup[error.path] = appended; + delete ref[replacement]; + } + else { + ref['_$miss$_' + seg + '|' + pos + '_$end$_'] = '__missing__'; + } + } + } + } + + var annotated = JSON.stringify(obj, null, 2); + + annotated = annotated.replace(/_\$key\$_([, \d]+)_\$end\$_\"/g, function ($0, $1) { + + return '" \u001b[31m[' + $1 + ']\u001b[0m'; + }); + + var message = annotated.replace(/\"_\$miss\$_([^\|]+)\|(\d+)_\$end\$_\"\: \"__missing__\"/g, function ($0, $1, $2) { + + return '\u001b[41m"' + $1 + '"\u001b[0m\u001b[31m [' + $2 + ']: -- missing --\u001b[0m'; + }); + + message += '\n\u001b[31m'; + + for (e = 0; e < el; ++e) { + message += '\n[' + (e + 1) + '] ' + this.details[e].message; + } + + message += '\u001b[0m'; + + return message; +}; + diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/function.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/function.js new file mode 100755 index 0000000..a11f72c --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/function.js @@ -0,0 +1,31 @@ +// Load modules + +var Any = require('./any'); +var Errors = require('./errors'); +var Hoek = require('hoek'); + + +// Declare internals + +var internals = {}; + + +internals.Function = function () { + + Any.call(this); + this._type = 'func'; +}; + +Hoek.inherits(internals.Function, Any); + + +internals.Function.prototype._base = function (value, state, options) { + + return { + value: value, + errors: (typeof value === 'function') ? null : Errors.create('function.base', null, state, options) + }; +}; + + +module.exports = new internals.Function(); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/index.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/index.js new file mode 100755 index 0000000..2db8d5d --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/index.js @@ -0,0 +1,129 @@ +// Load modules + +var Hoek = require('hoek'); +var Any = require('./any'); +var Cast = require('./cast'); +var Ref = require('./ref'); + + +// Declare internals + +var internals = { + alternatives: require('./alternatives'), + array: require('./array'), + boolean: require('./boolean'), + binary: require('./binary'), + date: require('./date'), + func: require('./function'), + number: require('./number'), + object: require('./object'), + string: require('./string') +}; + + +internals.root = function () { + + var any = new Any(); + + var root = any.clone(); + root.any = function () { + + return any; + }; + + root.alternatives = root.alt = function () { + + return arguments.length ? internals.alternatives.try.apply(internals.alternatives, arguments) : internals.alternatives; + }; + + root.array = function () { + + return internals.array; + }; + + root.boolean = root.bool = function () { + + return internals.boolean; + }; + + root.binary = function () { + + return internals.binary; + }; + + root.date = function () { + + return internals.date; + }; + + root.func = function () { + + return internals.func; + }; + + root.number = function () { + + return internals.number; + }; + + root.object = function () { + + return arguments.length ? internals.object.keys.apply(internals.object, arguments) : internals.object; + }; + + root.string = function () { + + return internals.string; + }; + + root.ref = function () { + + return Ref.create.apply(null, arguments); + }; + + root.isRef = function (ref) { + + return Ref.isRef(ref); + }; + + root.validate = function (value /*, [schema], [options], callback */) { + + var last = arguments[arguments.length - 1]; + var callback = typeof last === 'function' ? last : null; + + var count = arguments.length - (callback ? 1 : 0); + if (count === 1) { + return any.validate(value, callback); + } + + var options = count === 3 ? arguments[2] : {}; + var schema = Cast.schema(arguments[1]); + + return schema._validateWithOptions(value, options, callback); + }; + + root.describe = function () { + + var schema = arguments.length ? Cast.schema(arguments[0]) : any; + return schema.describe(); + }; + + root.compile = function (schema) { + + return Cast.schema(schema); + }; + + root.assert = function (value, schema, message) { + + message = (message ? message + ' ' : ''); + var error = root.validate(value, schema).error; + if (error) { + throw new Error(message + error.annotate()); + } + }; + + return root; +}; + + +module.exports = internals.root(); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/language.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/language.js new file mode 100755 index 0000000..64246b2 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/language.js @@ -0,0 +1,106 @@ +// Load modules + + +// Declare internals + +var internals = {}; + + +exports.errors = { + root: 'value', + any: { + unknown: 'is not allowed', + invalid: 'contains an invalid value', + empty: 'is not allowed to be empty', + required: 'is required', + allowOnly: 'must be one of {{valids}}' + }, + alternatives: { + base: 'not matching any of the allowed alternatives' + }, + array: { + base: 'must be an array', + includes: 'at position {{pos}} does not match any of the allowed types', + includesSingle: 'single value of {{!key}} does not match any of the allowed types', + includesOne: 'at position {{pos}} fails because {{reason}}', + includesOneSingle: 'single value of {{!key}} fails because {{reason}}', + excludes: 'at position {{pos}} contains an excluded value', + excludesSingle: 'single value of {{!key}} contains an excluded value', + min: 'must contain at least {{limit}} items', + max: 'must contain less than or equal to {{limit}} items', + length: 'must contain {{limit}} items', + sparse: 'must not be a sparse array', + unique: 'position {{pos}} contains a duplicate value' + }, + boolean: { + base: 'must be a boolean' + }, + binary: { + base: 'must be a buffer or a string', + min: 'must be at least {{limit}} bytes', + max: 'must be less than or equal to {{limit}} bytes', + length: 'must be {{limit}} bytes' + }, + date: { + base: 'must be a number of milliseconds or valid date string', + min: 'must be larger than or equal to {{limit}}', + max: 'must be less than or equal to {{limit}}', + isoDate: 'must be a valid ISO 8601 date', + ref: 'references {{ref}} which is not a date' + }, + function: { + base: 'must be a Function' + }, + object: { + base: 'must be an object', + min: 'must have at least {{limit}} children', + max: 'must have less than or equal to {{limit}} children', + length: 'must have {{limit}} children', + allowUnknown: 'is not allowed', + with: 'missing required peer {{peer}}', + without: 'conflict with forbidden peer {{peer}}', + missing: 'must contain at least one of {{peers}}', + xor: 'contains a conflict between exclusive peers {{peers}}', + or: 'must contain at least one of {{peers}}', + and: 'contains {{present}} without its required peers {{missing}}', + nand: '{{main}} must not exist simultaneously with {{peers}}', + assert: 'validation failed because {{ref}} failed to {{message}}', + rename: { + multiple: 'cannot rename child {{from}} because multiple renames are disabled and another key was already renamed to {{to}}', + override: 'cannot rename child {{from}} because override is disabled and target {{to}} exists' + }, + type: 'must be an instance of {{type}}' + }, + number: { + base: 'must be a number', + min: 'must be larger than or equal to {{limit}}', + max: 'must be less than or equal to {{limit}}', + less: 'must be less than {{limit}}', + greater: 'must be greater than {{limit}}', + float: 'must be a float or double', + integer: 'must be an integer', + negative: 'must be a negative number', + positive: 'must be a positive number', + precision: 'must have no more than {{limit}} decimal places' + }, + string: { + base: 'must be a string', + min: 'length must be at least {{limit}} characters long', + max: 'length must be less than or equal to {{limit}} characters long', + length: 'length must be {{limit}} characters long', + alphanum: 'must only contain alpha-numeric characters', + token: 'must only contain alpha-numeric and underscore characters', + regex: { + base: 'fails to match the required pattern', + name: 'fails to match the {{name}} pattern' + }, + email: 'must be a valid email', + isoDate: 'must be a valid ISO 8601 date', + guid: 'must be a valid GUID', + hostname: 'must be a valid hostname', + lowercase: 'must only contain lowercase characters', + uppercase: 'must only contain uppercase characters', + trim: 'must not have leading or trailing whitespace', + creditCard: 'must be a credit card' + } +}; diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/number.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/number.js new file mode 100755 index 0000000..0d2f693 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/number.js @@ -0,0 +1,170 @@ +// Load modules + +var Any = require('./any'); +var Errors = require('./errors'); +var Hoek = require('hoek'); + + +// Declare internals + +var internals = {}; + + +internals.Number = function () { + + Any.call(this); + this._type = 'number'; + this._invalids.add(Infinity); + this._invalids.add(-Infinity); +}; + +Hoek.inherits(internals.Number, Any); + + +internals.Number.prototype._base = function (value, state, options) { + + var result = { + errors: null, + value: value + }; + + if (typeof value === 'string' && + options.convert) { + + var number = parseFloat(value); + result.value = (isNaN(number) || !isFinite(value)) ? NaN : number; + } + + var isNumber = typeof result.value === 'number' && !isNaN(result.value); + + if (options.convert && 'precision' in this._flags && isNumber) { + // This is conceptually equivalent to using toFixed but it should be much faster + var precision = Math.pow(10, this._flags.precision); + result.value = Math.round(result.value * precision) / precision; + } + + result.errors = isNumber ? null : Errors.create('number.base', null, state, options); + return result; +}; + + +internals.Number.prototype.min = function (limit) { + + Hoek.assert(Hoek.isInteger(limit), 'limit must be an integer'); + + return this._test('min', limit, function (value, state, options) { + + if (value >= limit) { + return null; + } + + return Errors.create('number.min', { limit: limit }, state, options); + }); +}; + + +internals.Number.prototype.max = function (limit) { + + Hoek.assert(Hoek.isInteger(limit), 'limit must be an integer'); + + return this._test('max', limit, function (value, state, options) { + + if (value <= limit) { + return null; + } + + return Errors.create('number.max', { limit: limit }, state, options); + }); +}; + + +internals.Number.prototype.greater = function (limit) { + + Hoek.assert(Hoek.isInteger(limit), 'limit must be an integer'); + + return this._test('greater', limit, function (value, state, options) { + + if (value > limit) { + return null; + } + + return Errors.create('number.greater', { limit: limit }, state, options); + }); +}; + + +internals.Number.prototype.less = function (limit) { + + Hoek.assert(Hoek.isInteger(limit), 'limit must be an integer'); + + return this._test('less', limit, function (value, state, options) { + + if (value < limit) { + return null; + } + + return Errors.create('number.less', { limit: limit }, state, options); + }); +}; + + +internals.Number.prototype.integer = function () { + + return this._test('integer', undefined, function (value, state, options) { + + return Hoek.isInteger(value) ? null : Errors.create('number.integer', null, state, options); + }); +}; + + +internals.Number.prototype.negative = function () { + + return this._test('negative', undefined, function (value, state, options) { + + if (value < 0) { + return null; + } + + return Errors.create('number.negative', null, state, options); + }); +}; + + +internals.Number.prototype.positive = function () { + + return this._test('positive', undefined, function (value, state, options) { + + if (value > 0) { + return null; + } + + return Errors.create('number.positive', null, state, options); + }); +}; + + +internals.precisionRx = /(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/; + + +internals.Number.prototype.precision = function (limit) { + + Hoek.assert(Hoek.isInteger(limit), 'limit must be an integer'); + Hoek.assert(!('precision' in this._flags), 'precision already set'); + + var obj = this._test('precision', limit, function (value, state, options){ + + var places = value.toString().match(internals.precisionRx); + var decimals = Math.max((places[1] ? places[1].length : 0) - (places[2] ? parseInt(places[2], 10) : 0), 0); + if (decimals <= limit) { + return null; + } + + return Errors.create('number.precision', {limit: limit}, state, options); + }); + + obj._flags.precision = limit; + return obj; +}; + + +module.exports = new internals.Number(); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/object.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/object.js new file mode 100755 index 0000000..99acacf --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/object.js @@ -0,0 +1,685 @@ +// Load modules + +var Hoek = require('hoek'); +var Topo = require('topo'); +var Any = require('./any'); +var Cast = require('./cast'); +var Errors = require('./errors'); + + +// Declare internals + +var internals = {}; + + +internals.Object = function () { + + Any.call(this); + this._type = 'object'; + this._inner.children = null; + this._inner.renames = []; + this._inner.dependencies = []; + this._inner.patterns = []; +}; + +Hoek.inherits(internals.Object, Any); + + +internals.Object.prototype._base = function (value, state, options) { + + var target = value; + var errors = []; + var finish = function () { + + return { + value: target, + errors: errors.length ? errors : null + }; + }; + + if (typeof value === 'string' && + options.convert) { + + try { + value = JSON.parse(value); + } + catch (err) { } + } + + if (!value || + typeof value !== 'object' || + Array.isArray(value)) { + + errors.push(Errors.create('object.base', null, state, options)); + return finish(); + } + + // Skip if there are no other rules to test + + if (!this._inner.renames.length && + !this._inner.dependencies.length && + !this._inner.children && // null allows any keys + !this._inner.patterns.length) { + + target = value; + return finish(); + } + + // Ensure target is a local copy (parsed) or shallow copy + + if (target === value) { + target = Object.create(Object.getPrototypeOf(value)); + var valueKeys = Object.keys(value); + for (var t = 0, tl = valueKeys.length; t < tl; ++t) { + target[valueKeys[t]] = value[valueKeys[t]]; + } + } + else { + target = value; + } + + // Rename keys + + var renamed = {}; + for (var r = 0, rl = this._inner.renames.length; r < rl; ++r) { + var item = this._inner.renames[r]; + + if (target[item.from] === undefined) { + continue; + } + + if (!item.options.multiple && + renamed[item.to]) { + + errors.push(Errors.create('object.rename.multiple', { from: item.from, to: item.to }, state, options)); + if (options.abortEarly) { + return finish(); + } + } + + if (target.hasOwnProperty(item.to) && + !item.options.override && + !renamed[item.to]) { + + errors.push(Errors.create('object.rename.override', { from: item.from, to: item.to }, state, options)); + if (options.abortEarly) { + return finish(); + } + } + + target[item.to] = target[item.from]; + renamed[item.to] = true; + + if (!item.options.alias) { + delete target[item.from]; + } + } + + // Validate dependencies + + for (var d = 0, dl = this._inner.dependencies.length; d < dl; ++d) { + var dep = this._inner.dependencies[d]; + var err = internals[dep.type](dep.key !== null && value[dep.key], dep.peers, target, { key: dep.key, path: (state.path ? state.path + '.' : '') + dep.key }, options); + if (err) { + errors.push(err); + if (options.abortEarly) { + return finish(); + } + } + } + + // Validate schema + + if (!this._inner.children && // null allows any keys + !this._inner.patterns.length) { + + return finish(); + } + + var unprocessed = Hoek.mapToObject(Object.keys(target)); + var key; + + if (this._inner.children) { + for (var i = 0, il = this._inner.children.length; i < il; ++i) { + var child = this._inner.children[i]; + var key = child.key; + var item = target[key]; + + delete unprocessed[key]; + + var localState = { key: key, path: (state.path ? state.path + '.' : '') + key, parent: target, reference: state.reference }; + var result = child.schema._validate(item, localState, options); + if (result.errors) { + errors = errors.concat(result.errors); + if (options.abortEarly) { + return finish(); + } + } + + if (result.value !== undefined) { + target[key] = result.value; + } + } + } + + // Unknown keys + + var unprocessedKeys = Object.keys(unprocessed); + if (unprocessedKeys.length && + this._inner.patterns.length) { + + for (i = 0, il = unprocessedKeys.length; i < il; ++i) { + var key = unprocessedKeys[i]; + + for (var p = 0, pl = this._inner.patterns.length; p < pl; ++p) { + var pattern = this._inner.patterns[p]; + + if (pattern.regex.test(key)) { + delete unprocessed[key]; + + var item = target[key]; + var localState = { key: key, path: (state.path ? state.path + '.' : '') + key, parent: target, reference: state.reference }; + var result = pattern.rule._validate(item, localState, options); + if (result.errors) { + errors = errors.concat(result.errors); + if (options.abortEarly) { + return finish(); + } + } + + if (result.value !== undefined) { + target[key] = result.value; + } + } + } + } + + unprocessedKeys = Object.keys(unprocessed); + } + + if (unprocessedKeys.length) { + if (options.stripUnknown || + options.skipFunctions) { + + var hasFunctions = false; + for (var k = 0, kl = unprocessedKeys.length; k < kl; ++k) { + key = unprocessedKeys[k]; + + if (options.stripUnknown) { + delete target[key]; + } + else if (typeof target[key] === 'function') { + delete unprocessed[key]; + hasFunctions = true; + } + } + + if (options.stripUnknown) { + return finish(); + } + + if (hasFunctions) { + unprocessedKeys = Object.keys(unprocessed); + } + } + + if (unprocessedKeys.length && + (this._flags.allowUnknown !== undefined ? !this._flags.allowUnknown : !options.allowUnknown)) { + + for (var e = 0, el = unprocessedKeys.length; e < el; ++e) { + errors.push(Errors.create('object.allowUnknown', null, { key: unprocessedKeys[e], path: state.path }, options)); + } + } + } + + return finish(); +}; + + +internals.Object.prototype.keys = function (schema) { + + Hoek.assert(schema === null || schema === undefined || typeof schema === 'object', 'Object schema must be a valid object'); + Hoek.assert(!schema || !schema.isJoi, 'Object schema cannot be a joi schema'); + + var obj = this.clone(); + + if (!schema) { + obj._inner.children = null; + return obj; + } + + var children = Object.keys(schema); + + if (!children.length) { + obj._inner.children = []; + return obj; + } + + var topo = new Topo(); + if (obj._inner.children) { + for (var i = 0, il = obj._inner.children.length; i < il; ++i) { + var child = obj._inner.children[i]; + topo.add(child, { after: child._refs, group: child.key }); + } + } + + for (var c = 0, cl = children.length; c < cl; ++c) { + var key = children[c]; + var child = schema[key]; + var cast = Cast.schema(child); + topo.add({ key: key, schema: cast }, { after: cast._refs, group: key }); + } + + obj._inner.children = topo.nodes; + + return obj; +}; + + +internals.Object.prototype.unknown = function (allow) { + + var obj = this.clone(); + obj._flags.allowUnknown = (allow !== false); + return obj; +}; + + +internals.Object.prototype.length = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('length', limit, function (value, state, options) { + + if (Object.keys(value).length === limit) { + return null; + } + + return Errors.create('object.length', { limit: limit }, state, options); + }); +}; + + +internals.Object.prototype.min = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('min', limit, function (value, state, options) { + + if (Object.keys(value).length >= limit) { + return null; + } + + return Errors.create('object.min', { limit: limit }, state, options); + }); +}; + + +internals.Object.prototype.max = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('max', limit, function (value, state, options) { + + if (Object.keys(value).length <= limit) { + return null; + } + + return Errors.create('object.max', { limit: limit }, state, options); + }); +}; + + +internals.Object.prototype.pattern = function (pattern, schema) { + + Hoek.assert(pattern instanceof RegExp, 'Invalid regular expression'); + Hoek.assert(schema !== undefined, 'Invalid rule'); + + pattern = new RegExp(pattern.source, pattern.ignoreCase ? 'i' : undefined); // Future version should break this and forbid unsupported regex flags + + var obj = this.clone(); + obj._inner.patterns.push({ regex: pattern, rule: Cast.schema(schema) }); + return obj; +}; + + +internals.Object.prototype.with = function (key, peers) { + + return this._dependency('with', key, peers); +}; + + +internals.Object.prototype.without = function (key, peers) { + + return this._dependency('without', key, peers); +}; + + +internals.Object.prototype.xor = function () { + + var peers = Hoek.flatten(Array.prototype.slice.call(arguments)); + return this._dependency('xor', null, peers); +}; + + +internals.Object.prototype.or = function () { + + var peers = Hoek.flatten(Array.prototype.slice.call(arguments)); + return this._dependency('or', null, peers); +}; + + +internals.Object.prototype.and = function () { + + var peers = Hoek.flatten(Array.prototype.slice.call(arguments)); + return this._dependency('and', null, peers); +}; + + +internals.Object.prototype.nand = function () { + + var peers = Hoek.flatten(Array.prototype.slice.call(arguments)); + return this._dependency('nand', null, peers); +}; + + +internals.Object.prototype.requiredKeys = function (children) { + + children = Hoek.flatten(Array.prototype.slice.call(arguments)); + return this.applyFunctionToChildren(children, 'required'); +}; + + +internals.Object.prototype.optionalKeys = function (children) { + + children = Hoek.flatten(Array.prototype.slice.call(arguments)); + return this.applyFunctionToChildren(children, 'optional'); +}; + + +internals.renameDefaults = { + alias: false, // Keep old value in place + multiple: false, // Allow renaming multiple keys into the same target + override: false // Overrides an existing key +}; + + +internals.Object.prototype.rename = function (from, to, options) { + + Hoek.assert(typeof from === 'string', 'Rename missing the from argument'); + Hoek.assert(typeof to === 'string', 'Rename missing the to argument'); + Hoek.assert(to !== from, 'Cannot rename key to same name:', from); + + for (var i = 0, il = this._inner.renames.length; i < il; ++i) { + Hoek.assert(this._inner.renames[i].from !== from, 'Cannot rename the same key multiple times'); + } + + var obj = this.clone(); + + obj._inner.renames.push({ + from: from, + to: to, + options: Hoek.applyToDefaults(internals.renameDefaults, options || {}) + }); + + return obj; +}; + + +internals.groupChildren = function (children) { + + children.sort(); + + var grouped = {}; + + for (var c = 0, lc = children.length; c < lc; c++) { + var child = children[c]; + Hoek.assert(typeof child === 'string', 'children must be strings'); + var group = child.split('.')[0]; + var childGroup = grouped[group] = (grouped[group] || []); + childGroup.push(child.substring(group.length + 1)); + } + + return grouped; +}; + + +internals.Object.prototype.applyFunctionToChildren = function (children, fn, args, root) { + + children = [].concat(children); + Hoek.assert(children.length > 0, 'expected at least one children'); + + var groupedChildren = internals.groupChildren(children); + var obj; + + if ('' in groupedChildren) { + obj = this[fn].apply(this, args); + delete groupedChildren['']; + } + else { + obj = this.clone(); + } + + if (obj._inner.children) { + root = root ? (root + '.') : ''; + + for (var i = 0, il = obj._inner.children.length; i < il; ++i) { + var child = obj._inner.children[i]; + var group = groupedChildren[child.key]; + + if (group) { + obj._inner.children[i] = { + key: child.key, + _refs: child._refs, + schema: child.schema.applyFunctionToChildren(group, fn, args, root + child.key) + }; + + delete groupedChildren[child.key]; + } + } + } + + var remaining = Object.keys(groupedChildren); + Hoek.assert(remaining.length === 0, 'unknown key(s)', remaining.join(', ')); + + return obj; +}; + + +internals.Object.prototype._dependency = function (type, key, peers) { + + peers = [].concat(peers); + for (var i = 0, li = peers.length; i < li; i++) { + Hoek.assert(typeof peers[i] === 'string', type, 'peers must be a string or array of strings'); + } + + var obj = this.clone(); + obj._inner.dependencies.push({ type: type, key: key, peers: peers }); + return obj; +}; + + +internals.with = function (value, peers, parent, state, options) { + + if (value === undefined) { + return null; + } + + for (var i = 0, il = peers.length; i < il; ++i) { + var peer = peers[i]; + if (!parent.hasOwnProperty(peer) || + parent[peer] === undefined) { + + return Errors.create('object.with', { peer: peer }, state, options); + } + } + + return null; +}; + + +internals.without = function (value, peers, parent, state, options) { + + if (value === undefined) { + return null; + } + + for (var i = 0, il = peers.length; i < il; ++i) { + var peer = peers[i]; + if (parent.hasOwnProperty(peer) && + parent[peer] !== undefined) { + + return Errors.create('object.without', { peer: peer }, state, options); + } + } + + return null; +}; + + +internals.xor = function (value, peers, parent, state, options) { + + var present = []; + for (var i = 0, il = peers.length; i < il; ++i) { + var peer = peers[i]; + if (parent.hasOwnProperty(peer) && + parent[peer] !== undefined) { + + present.push(peer); + } + } + + if (present.length === 1) { + return null; + } + + if (present.length === 0) { + return Errors.create('object.missing', { peers: peers }, state, options); + } + + return Errors.create('object.xor', { peers: peers }, state, options); +}; + + +internals.or = function (value, peers, parent, state, options) { + + for (var i = 0, il = peers.length; i < il; ++i) { + var peer = peers[i]; + if (parent.hasOwnProperty(peer) && + parent[peer] !== undefined) { + return null; + } + } + + return Errors.create('object.missing', { peers: peers }, state, options); +}; + + +internals.and = function (value, peers, parent, state, options) { + + var missing = []; + var present = []; + var count = peers.length; + for (var i = 0; i < count; ++i) { + var peer = peers[i]; + if (!parent.hasOwnProperty(peer) || + parent[peer] === undefined) { + + missing.push(peer); + } + else { + present.push(peer); + } + } + + var aon = (missing.length === count || present.length === count); + return !aon ? Errors.create('object.and', { present: present, missing: missing }, state, options) : null; +}; + + +internals.nand = function (value, peers, parent, state, options) { + + var present = []; + for (var i = 0, il = peers.length; i < il; ++i) { + var peer = peers[i]; + if (parent.hasOwnProperty(peer) && + parent[peer] !== undefined) { + + present.push(peer); + } + } + + var values = Hoek.clone(peers); + var main = values.splice(0,1); + var allPresent = (present.length === peers.length); + return allPresent ? Errors.create('object.nand', { main: main, peers: values }, state, options) : null; +}; + + +internals.Object.prototype.describe = function (shallow) { + + var description = Any.prototype.describe.call(this); + + if (this._inner.children && + !shallow) { + + description.children = {}; + for (var i = 0, il = this._inner.children.length; i < il; ++i) { + var child = this._inner.children[i]; + description.children[child.key] = child.schema.describe(); + } + } + + if (this._inner.dependencies.length) { + description.dependencies = Hoek.clone(this._inner.dependencies); + } + + if (this._inner.patterns.length) { + description.patterns = []; + + for (var p = 0, pl = this._inner.patterns.length; p < pl; ++p) { + var pattern = this._inner.patterns[p]; + description.patterns.push({ regex: pattern.regex.toString(), rule: pattern.rule.describe() }); + } + } + + return description; +}; + + +internals.Object.prototype.assert = function (ref, schema, message) { + + ref = Cast.ref(ref); + Hoek.assert(ref.isContext || ref.depth > 1, 'Cannot use assertions for root level references - use direct key rules instead'); + message = message || 'pass the assertion test'; + + var cast = Cast.schema(schema); + + return this._test('assert', { cast: cast, ref: ref }, function (value, state, options) { + + var result = cast._validate(ref(value), null, options, value); + if (!result.errors) { + return null; + } + + return Errors.create('object.assert', { ref: ref.path.join('.'), message: message }, state, options); + }); +}; + + +internals.Object.prototype.type = function (constructor, name) { + + Hoek.assert(typeof constructor === 'function', 'type must be a constructor function'); + name = name || constructor.name; + + return this._test('type', name, function (value, state, options) { + + if (value instanceof constructor) { + return null; + } + + return Errors.create('object.type', { type: name }, state, options); + }); +}; + + +module.exports = new internals.Object(); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/ref.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/ref.js new file mode 100755 index 0000000..7bc1842 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/ref.js @@ -0,0 +1,51 @@ +// Load modules + +var Hoek = require('hoek'); + + +// Declare internals + +var internals = {}; + + +exports.create = function (key, options) { + + Hoek.assert(typeof key === 'string', 'Invalid reference key:', key); + + var settings = Hoek.clone(options); // options can be reused and modified + + var ref = function (value, validationOptions) { + + return Hoek.reach(ref.isContext ? validationOptions.context : value, ref.key, settings); + }; + + ref.isContext = (key[0] === ((settings && settings.contextPrefix) || '$')); + ref.key = (ref.isContext ? key.slice(1) : key); + ref.path = ref.key.split((settings && settings.separator) || '.'); + ref.depth = ref.path.length; + ref.root = ref.path[0]; + ref.isJoi = true; + + ref.toString = function () { + + return (ref.isContext ? 'context:' : 'ref:') + ref.key; + }; + + return ref; +}; + + +exports.isRef = function (ref) { + + return typeof ref === 'function' && ref.isJoi; +}; + + +exports.push = function (array, ref) { + + if (exports.isRef(ref) && + !ref.isContext) { + + array.push(ref.root); + } +}; \ No newline at end of file diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/string.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/string.js new file mode 100755 index 0000000..1b22802 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/lib/string.js @@ -0,0 +1,282 @@ +// Load modules + +var Net = require('net'); +var Hoek = require('hoek'); +var Isemail = require('isemail'); +var Any = require('./any'); +var JoiDate = require('./date'); +var Errors = require('./errors'); + +// Declare internals + +var internals = {}; + + +internals.String = function () { + + Any.call(this); + this._type = 'string'; + this._invalids.add(''); +}; + +Hoek.inherits(internals.String, Any); + + +internals.String.prototype._base = function (value, state, options) { + + if (typeof value === 'string' && + options.convert) { + + if (this._flags.case) { + value = (this._flags.case === 'upper' ? value.toLocaleUpperCase() : value.toLocaleLowerCase()); + } + + if (this._flags.trim) { + value = value.trim(); + } + } + + return { + value: value, + errors: (typeof value === 'string') ? null : Errors.create('string.base', null, state, options) + }; +}; + + +internals.String.prototype.insensitive = function () { + + var obj = this.clone(); + obj._flags.insensitive = true; + return obj; +}; + + +internals.String.prototype.min = function (limit, encoding) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + Hoek.assert(!encoding || Buffer.isEncoding(encoding), 'Invalid encoding:', encoding); + + return this._test('min', limit, function (value, state, options) { + + var length = encoding ? Buffer.byteLength(value, encoding) : value.length; + if (length >= limit) { + return null; + } + + return Errors.create('string.min', { limit: limit }, state, options); + }); +}; + + +internals.String.prototype.max = function (limit, encoding) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + Hoek.assert(!encoding || Buffer.isEncoding(encoding), 'Invalid encoding:', encoding); + + return this._test('max', limit, function (value, state, options) { + + var length = encoding ? Buffer.byteLength(value, encoding) : value.length; + if (length <= limit) { + return null; + } + + return Errors.create('string.max', { limit: limit }, state, options); + }); +}; + + +internals.String.prototype.creditCard = function () { + + return this._test('creditCard', undefined, function (value, state, options) { + + var i = value.length; + var sum = 0; + var mul = 1; + var char; + + while (i--) { + char = value.charAt(i) * mul; + sum += char - (char > 9) * 9; + mul ^= 3; + } + + var check = (sum % 10 === 0) && (sum > 0); + return check ? null : Errors.create('string.creditCard', null, state, options); + }); +}; + + +internals.String.prototype.length = function (limit, encoding) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + Hoek.assert(!encoding || Buffer.isEncoding(encoding), 'Invalid encoding:', encoding); + + return this._test('length', limit, function (value, state, options) { + + var length = encoding ? Buffer.byteLength(value, encoding) : value.length; + if (length === limit) { + return null; + } + + return Errors.create('string.length', { limit: limit }, state, options); + }); +}; + + +internals.String.prototype.regex = function (pattern, name) { + + Hoek.assert(pattern instanceof RegExp, 'pattern must be a RegExp'); + + pattern = new RegExp(pattern.source, pattern.ignoreCase ? 'i' : undefined); // Future version should break this and forbid unsupported regex flags + + return this._test('regex', pattern, function (value, state, options) { + + if (pattern.test(value)) { + return null; + } + + return Errors.create((name ? 'string.regex.name' : 'string.regex.base'), { name: name }, state, options); + }); +}; + + +internals.String.prototype.alphanum = function () { + + return this._test('alphanum', undefined, function (value, state, options) { + + if (/^[a-zA-Z0-9]+$/.test(value)) { + return null; + } + + return Errors.create('string.alphanum', null, state, options); + }); +}; + + +internals.String.prototype.token = function () { + + return this._test('token', undefined, function (value, state, options) { + + if (/^\w+$/.test(value)) { + return null; + } + + return Errors.create('string.token', null, state, options); + }); +}; + + +internals.String.prototype.email = function () { + + return this._test('email', undefined, function (value, state, options) { + + if (Isemail(value)) { + return null; + } + + return Errors.create('string.email', null, state, options); + }); +}; + + +internals.String.prototype.isoDate = function () { + + return this._test('isoDate', undefined, function (value, state, options) { + + if (JoiDate._isIsoDate(value)) { + return null; + } + + return Errors.create('string.isoDate', null, state, options); + }); +}; + + +internals.String.prototype.guid = function () { + + var regex = /^[A-F0-9]{8}(?:-?[A-F0-9]{4}){3}-?[A-F0-9]{12}$/i; + var regex2 = /^\{[A-F0-9]{8}(?:-?[A-F0-9]{4}){3}-?[A-F0-9]{12}\}$/i; + + return this._test('guid', undefined, function (value, state, options) { + + if (regex.test(value) || regex2.test(value)) { + return null; + } + + return Errors.create('string.guid', null, state, options); + }); +}; + + +internals.String.prototype.hostname = function () { + + var regex = /^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$/; + + return this._test('hostname', undefined, function (value, state, options) { + + if ((value.length <= 255 && regex.test(value)) || + Net.isIPv6(value)) { + + return null; + } + + return Errors.create("string.hostname", null, state, options); + }); +}; + + +internals.String.prototype.lowercase = function () { + + var obj = this._test('lowercase', undefined, function (value, state, options) { + + if (options.convert || + value === value.toLocaleLowerCase()) { + + return null; + } + + return Errors.create('string.lowercase', null, state, options); + }); + + obj._flags.case = 'lower'; + return obj; +}; + + +internals.String.prototype.uppercase = function (options) { + + var obj = this._test('uppercase', undefined, function (value, state, options) { + + if (options.convert || + value === value.toLocaleUpperCase()) { + + return null; + } + + return Errors.create('string.uppercase', null, state, options); + }); + + obj._flags.case = 'upper'; + return obj; +}; + + +internals.String.prototype.trim = function () { + + var obj = this._test('trim', undefined, function (value, state, options) { + + if (options.convert || + value === value.trim()) { + + return null; + } + + return Errors.create('string.trim', null, state, options); + }); + + obj._flags.trim = true; + return obj; +}; + + +module.exports = new internals.String(); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/.npmignore b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/.npmignore new file mode 100644 index 0000000..5761e0a --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/.npmignore @@ -0,0 +1,2 @@ +isemail.sublime-* +node_modules diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/.travis.yml b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/.travis.yml new file mode 100644 index 0000000..1bc77fb --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/.travis.yml @@ -0,0 +1,8 @@ +language: node_js +node_js: + - "0.8" + - "0.10" +notifications: + hipchat: + rooms: + secure: lzNdJmq9QLPpKWKiFE+w1DNUhw+jp1OF1SIMlxSnT++H8M7NLVWchXzPIyoaE4enmy8n2JxMA9FGTaQvOER+G9UswuyOO2nUDjlt/I949SeN9DyVAf4XAwXnKbhXcmGuCho2odO7VeKPmrJXgoxbJYy3Ne0lS7zLU6rEkNJotIg= diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/LICENSE b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/LICENSE new file mode 100644 index 0000000..67e5251 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/LICENSE @@ -0,0 +1,11 @@ +Copyright © 2008-2011, Dominic Sayers +Copyright © 2013, GlobeSherpa +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +- Neither the name of Dominic Sayers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/Makefile b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/Makefile new file mode 100644 index 0000000..86b2d13 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/Makefile @@ -0,0 +1,4 @@ +test: + npm test + +.PHONY: test diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/README.md b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/README.md new file mode 100644 index 0000000..7e3f979 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/README.md @@ -0,0 +1,92 @@ +isemail +======= + +[![Build Status](https://travis-ci.org/globesherpa/node-isemail.png)](https://travis-ci.org/globesherpa/node-isemail) +[![Coverage Status](https://coveralls.io/repos/globesherpa/node-isemail/badge.png?branch=master)](https://coveralls.io/r/globesherpa/node-isemail?branch=master) + +This first version of `isemail` is a port of the PHP `is_email` function by Dominic Sayers. + +Future versions will improve upon the current version, optimizing it for efficient usage and DRYing the code. + +Install +------- + +```sh +$ npm install isemail +``` + +Test +---- + +The tests were pulled from is_email's extensive [test suite][tests] on October 15, 2013. Many thanks to the contributors! + +Run any of the following. + +```sh +$ mocha +$ npm test +$ make test +``` + +_remember to_ `npm install`! + +API +--- + +### isEmail(email, [options], [callback]) + +Determines whether the `email` is valid or not, for various definitions thereof. Optionally accepts an `options` object and a `callback` function. Options may include `errorLevel` and `checkDNS`. The `callback` function will always be called if specified, and the result of the operation supplied as the only parameter to the callback function. If `isEmail` is not asked to check for the existence of the domain (`checkDNS`), it will also synchronously return the result of the operation. + +Use `errorLevel` to specify the type of result for `isEmail`. Passing a `false` literal will result in a true or false boolean indicating whether the email address is sufficiently defined for use in sending an email. Passing a `true` literal will result in a more granular numeric status, with zero being a perfectly valid email address. Passing a number will return `0` if the numeric status is below the `errorLevel` and the numeric status otherwise. + +The `tldWhitelist` option can be either an object lookup table or an array of valid top-level domains. If the email address has a top-level domain that is not in the whitelist, the email will be marked as invalid. + +The `minDomainAtoms` option is an optional positive integer that specifies the minimum number of domain atoms that must be included for the email address to be considered valid. Be careful with the option, as some top-level domains, like `io`, directly support email addresses. + +#### Examples + +```js +$ node +> var isEmail = require('isemail'); +undefined +> var log = console.log.bind(console, 'result'); +undefined +> isEmail('test@iana.org'); +true +> isEmail('test@iana.org', log); +result true +true +> isEmail('test@iana.org', {checkDNS: true}); +undefined +> isEmail('test@iana.org', {checkDNS: true}, log); +undefined +result true +> isEmail('test@iana.org', {errorLevel: true}); +0 +> isEmail('test@iana.org', {errorLevel: true}, log); +result 0 +0 +> isEmail('test@e.com'); +true +> isEmail('test@e.com', {checkDNS: true, errorLevel: true}, log); +undefined +result 6 +> isEmail('test@e.com', {checkDNS: true, errorLevel: 7}, log); +undefined +result 0 +> isEmail('test@e.com', {checkDNS: true, errorLevel: 6}, log); +undefined +result 6 +``` + +TODO +==== + +Add tests for library usage, not just functionality comparisons. + +License +======= + +[BSD License](http://www.opensource.org/licenses/bsd-license.php) + +[tests]: http://isemail.info/_system/is_email/test/?all‎ "is_email test suite" diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/dns-no-mx.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/dns-no-mx.js new file mode 100755 index 0000000..c868304 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/dns-no-mx.js @@ -0,0 +1,80 @@ +#!/usr/bin/env node + +var dns = require('dns'); + +function check(domain, callback) { + var done = false, count = 3; + + dns.resolveCname(domain, handleRecords); + dns.resolve4(domain, handleRecords); + dns.resolve6(domain, handleRecords); + + function handleRecords(err, records) { + if (done) return; + count--; + if (!err && records && records.length) { + done = true; + return dns.resolveMx(domain, handleMail); + } + if (count === 0) { + done = true; + // ain't got time for node style callbacks + callback(false); + } + } + + function handleMail(err, records) { + if ((!err || err.code === dns.NODATA) && records && records.length) { + return callback(false); + } + callback(true); + } +} + +function spin(max, concurrent) { + if (!(max >= 0)) { + max = 1; + } + if (!(concurrent > 0)) { + concurrent = 4; + } + var active = 0, domain = domains(4, ['com', 'org', 'net']); + (function next() { + active++; + var d = domain(); + check(d, function(nomx) { + active--; + if (nomx) { + console.log(d); + if (!--max) { + process.exit(); + } + } + if (active < concurrent) { + next(); + } + }); + if (active < concurrent) { + next(); + } + })(); +} + +spin(1, 16); + +function domains(length, tops) { + var index = 0, end = Math.pow(26, length) * tops.length; + tops = tops.slice(); + return function next() { + if (index === end) return; + var active = index++, domain = ''; + var main = tops[active % tops.length]; + active = (active / tops.length) | 0; + for (var i = 0; i < length; i++) { + domain = String.fromCharCode(97 + active % 26) + domain; + active = (active / 26) | 0; + } + domain += '.' + main; + return domain; + }; +} diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/index.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/index.js new file mode 100644 index 0000000..d7a780e --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/index.js @@ -0,0 +1 @@ +module.exports = require('./lib/isemail'); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/lib/isemail.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/lib/isemail.js new file mode 100644 index 0000000..e948bbd --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/lib/isemail.js @@ -0,0 +1,1279 @@ +/** + * To validate an email address according to RFCs 5321, 5322 and others + * + * Copyright © 2008-2011, Dominic Sayers + * Test schema documentation Copyright © 2011, Daniel Marschall + * Port for Node.js Copyright © 2013, GlobeSherpa + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Neither the name of Dominic Sayers nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @author Dominic Sayers + * @author Eli Skeggs + * @copyright 2008-2011 Dominic Sayers + * @copyright 2013-2014 GlobeSherpa + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://www.dominicsayers.com/isemail + * @link https://github.com/globesherpa/isemail + * @version 1.1.1 - Optimization pass, simplify constants, style, dead code. + */ + +// lazy-loaded +var dns, HAS_REQUIRE = typeof require !== 'undefined'; + +// categories +var ISEMAIL_VALID_CATEGORY = 1; +var ISEMAIL_DNSWARN = 7; +var ISEMAIL_RFC5321 = 15; +var ISEMAIL_CFWS = 31; +var ISEMAIL_DEPREC = 63; +var ISEMAIL_RFC5322 = 127; +var ISEMAIL_ERR = 255; + +// diagnoses +// address is valid +var ISEMAIL_VALID = 0; +// address is valid but a DNS check was not successful +var ISEMAIL_DNSWARN_NO_MX_RECORD = 5; +var ISEMAIL_DNSWARN_NO_RECORD = 6; +// address is valid for SMTP but has unusual elements +var ISEMAIL_RFC5321_TLD = 9; +var ISEMAIL_RFC5321_TLDNUMERIC = 10; +var ISEMAIL_RFC5321_QUOTEDSTRING = 11; +var ISEMAIL_RFC5321_ADDRESSLITERAL = 12; +var ISEMAIL_RFC5321_IPV6DEPRECATED = 13; +// address is valid within the message but cannot be used unmodified for the +// envelope +var ISEMAIL_CFWS_COMMENT = 17; +var ISEMAIL_CFWS_FWS = 18; +// address contains deprecated elements but may still be valid in restricted +// contexts +var ISEMAIL_DEPREC_LOCALPART = 33; +var ISEMAIL_DEPREC_FWS = 34; +var ISEMAIL_DEPREC_QTEXT = 35; +var ISEMAIL_DEPREC_QP = 36; +var ISEMAIL_DEPREC_COMMENT = 37; +var ISEMAIL_DEPREC_CTEXT = 38; +var ISEMAIL_DEPREC_CFWS_NEAR_AT = 49; +// the address is only valid according to the broad definition of RFC 5322, but +// otherwise invalid +var ISEMAIL_RFC5322_DOMAIN = 65; +var ISEMAIL_RFC5322_TOOLONG = 66; +var ISEMAIL_RFC5322_LOCAL_TOOLONG = 67; +var ISEMAIL_RFC5322_DOMAIN_TOOLONG = 68; +var ISEMAIL_RFC5322_LABEL_TOOLONG = 69; +var ISEMAIL_RFC5322_DOMAINLITERAL = 70; +var ISEMAIL_RFC5322_DOMLIT_OBSDTEXT = 71; +var ISEMAIL_RFC5322_IPV6_GRPCOUNT = 72; +var ISEMAIL_RFC5322_IPV6_2X2XCOLON = 73; +var ISEMAIL_RFC5322_IPV6_BADCHAR = 74; +var ISEMAIL_RFC5322_IPV6_MAXGRPS = 75; +var ISEMAIL_RFC5322_IPV6_COLONSTRT = 76; +var ISEMAIL_RFC5322_IPV6_COLONEND = 77; +// address is invalid for any purpose +var ISEMAIL_ERR_EXPECTING_DTEXT = 129; +var ISEMAIL_ERR_NOLOCALPART = 130; +var ISEMAIL_ERR_NODOMAIN = 131; +var ISEMAIL_ERR_CONSECUTIVEDOTS = 132; +var ISEMAIL_ERR_ATEXT_AFTER_CFWS = 133; +var ISEMAIL_ERR_ATEXT_AFTER_QS = 134; +var ISEMAIL_ERR_ATEXT_AFTER_DOMLIT = 135; +var ISEMAIL_ERR_EXPECTING_QPAIR = 136; +var ISEMAIL_ERR_EXPECTING_ATEXT = 137; +var ISEMAIL_ERR_EXPECTING_QTEXT = 138; +var ISEMAIL_ERR_EXPECTING_CTEXT = 139; +var ISEMAIL_ERR_BACKSLASHEND = 140; +var ISEMAIL_ERR_DOT_START = 141; +var ISEMAIL_ERR_DOT_END = 142; +var ISEMAIL_ERR_DOMAINHYPHENSTART = 143; +var ISEMAIL_ERR_DOMAINHYPHENEND = 144; +var ISEMAIL_ERR_UNCLOSEDQUOTEDSTR = 145; +var ISEMAIL_ERR_UNCLOSEDCOMMENT = 146; +var ISEMAIL_ERR_UNCLOSEDDOMLIT = 147; +var ISEMAIL_ERR_FWS_CRLF_X2 = 148; +var ISEMAIL_ERR_FWS_CRLF_END = 149; +var ISEMAIL_ERR_CR_NO_LF = 150; +var ISEMAIL_ERR_UNKNOWN_TLD = 160; +var ISEMAIL_ERR_TOOSHORT_DOMAIN = 161; + +// function control +var THRESHOLD = 16; +// email parts +var COMPONENT_LOCALPART = 0; +var COMPONENT_DOMAIN = 1; +var COMPONENT_LITERAL = 2; +var CONTEXT_COMMENT = 3; +var CONTEXT_FWS = 4; +var CONTEXT_QUOTEDSTRING = 5; +var CONTEXT_QUOTEDPAIR = 6; + +// US-ASCII visible characters not valid for atext +// (http://tools.ietf.org/html/rfc5322#section-3.2.3) +var SPECIALS = '()<>[]:;@\\,."'; + +function optimizeLookup(string) { + var body = '', min = 0x100, max = 0, lookup = new Array(min); + for (var i = min - 1; i >= 0; i--) { + lookup[i] = false; + } + for (var i = 0; i < string.length; i++) { + var chr = string.charCodeAt(i); + if (chr < min) { + min = chr; + } + if (chr > max) { + max = chr; + } + lookup[chr] = true; + } + lookup.length = max; + var body = 'var lookup = ' + JSON.stringify(lookup) + ';\n'; + body += 'return function(code) {\n'; + body += ' if (code < ' + min + ' || code > ' + max + ') {\n'; + body += ' return false;\n'; + body += ' }\n'; + body += ' return lookup[code];\n'; + body += '}'; + return (new Function(body))(); +} + +var specialsLookup = optimizeLookup(SPECIALS); + +// matches valid IPv4 addresses from the end of a string +var IPv4_REGEX = + /\b(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/; +var IPv6_REGEX = /^[a-fA-F\d]{0,4}$/; +var IPv6_REGEX_TEST = IPv6_REGEX.test.bind(IPv6_REGEX); + +var hasOwn = Object.prototype.hasOwnProperty; + +/** + * Get the largest number in the array. + * + * Returns -Infinity if the array is empty. + * + * @param {Array.} array The array to scan. + * @return {number} The largest number contained. + */ +function maxValue(array) { + var v = -Infinity, i = 0, n = array.length; + + for (; i < n; i++) { + if (array[i] > v) { + v = array[i]; + } + } + + return v; +} + +/** + * Check that an email address conforms to RFCs 5321, 5322 and others + * + * As of Version 3.0, we are now distinguishing clearly between a Mailbox + * as defined by RFC 5321 and an addr-spec as defined by RFC 5322. Depending + * on the context, either can be regarded as a valid email address. The + * RFC 5321 Mailbox specification is more restrictive (comments, white space + * and obsolete forms are not allowed). + * + * @param {string} email The email address to check. + * @param {boolean} checkDNS If true then will check DNS for MX records. If true + * this isEmail _will_ be asynchronous. + * @param {*} errorLevel Determines the boundary between valid and invalid + * addresses. Status codes above this number will be returned as-is, status + * codes below will be returned as ISEMAIL_VALID. Thus the calling program can + * simply look for ISEMAIL_VALID if it is only interested in whether an + * address is valid or not. The errorLevel will determine how "picky" + * isEmail() is about the address. If omitted or passed as false then + * isEmail() will return true or false rather than an integer error or + * warning. NB Note the difference between errorLevel = false and + * errorLevel = 0. + * @return {*} + */ +function isEmail(email, options, callback) { + if (typeof options === 'function') { + callback = options; + options = {}; + } + options || (options = {}); + + var threshold, diagnose; + if (typeof options.errorLevel === 'number') { + diagnose = true; + threshold = options.errorLevel; + } else { + diagnose = !!options.errorLevel; + threshold = ISEMAIL_VALID; + } + + if (options.tldWhitelist && typeof options.tldWhitelist !== 'object') { + throw new TypeError('expected array or object tldWhitelist'); + } + + if (options.minDomainAtoms && (options.minDomainAtoms !== + ((+options.minDomainAtoms) | 0) || options.minDomainAtoms < 0)) { + throw new TypeError('expected positive integer minDomainAtoms'); + } + + var maxResult = ISEMAIL_VALID; + + function updateResult(value) { + if (value > maxResult) { + maxResult = value; + } + } + + var context = { + now: COMPONENT_LOCALPART, + prev: COMPONENT_LOCALPART, + stack: [COMPONENT_LOCALPART] + }; + + var token = '', prevToken = '', charCode = 0; + var parseData = {local: '', domain: ''}; + var atomList = {local: [''], domain: ['']}; + + var elementCount = 0, elementLength = 0, crlfCount = 0; + var hyphenFlag = false, assertEnd = false; + + for (var i = 0; i < email.length; i++) { + token = email[i]; + + switch (context.now) { + // local-part + case COMPONENT_LOCALPART: + // http://tools.ietf.org/html/rfc5322#section-3.4.1 + // local-part = dot-atom / quoted-string / obs-local-part + // + // dot-atom = [CFWS] dot-atom-text [CFWS] + // + // dot-atom-text = 1*atext *("." 1*atext) + // + // quoted-string = [CFWS] + // DQUOTE *([FWS] qcontent) [FWS] DQUOTE + // [CFWS] + // + // obs-local-part = word *("." word) + // + // word = atom / quoted-string + // + // atom = [CFWS] 1*atext [CFWS] + switch (token) { + // comment + case '(': + if (elementLength === 0) { + // comments are OK at the beginning of an element + updateResult(elementCount === 0 ? ISEMAIL_CFWS_COMMENT : + ISEMAIL_DEPREC_COMMENT); + } else { + updateResult(ISEMAIL_CFWS_COMMENT); + // can't start a comment in an element, should be end + assertEnd = true; + } + context.stack.push(context.now); + context.now = CONTEXT_COMMENT; + break; + // next dot-atom element + case '.': + if (elementLength === 0) { + // another dot, already? + updateResult(elementCount === 0 ? ISEMAIL_ERR_DOT_START : + ISEMAIL_ERR_CONSECUTIVEDOTS); + } else { + // the entire local-part can be a quoted string for RFC 5321 + // if it's just one atom that is quoted then it's an RFC 5322 obsolete + // form + if (assertEnd) { + updateResult(ISEMAIL_DEPREC_LOCALPART); + } + + // CFWS & quoted strings are OK again now we're at the beginning of an + // element (although they are obsolete forms) + assertEnd = false; + elementLength = 0; + elementCount++; + parseData.local += token; + atomList.local[elementCount] = ''; // TODO: push? + } + break; + // quoted string + case '"': + if (elementLength === 0) { + // the entire local-part can be a quoted string for RFC 5321 + // if it's just one atom that is quoted then it's an RFC 5322 obsolete + // form + updateResult(elementCount === 0 ? ISEMAIL_RFC5321_QUOTEDSTRING : + ISEMAIL_DEPREC_LOCALPART); + + parseData.local += token; + atomList.local[elementCount] += token; + elementLength++; + assertEnd = true; // quoted string must be the entire element + context.stack.push(context.now); + context.now = CONTEXT_QUOTEDSTRING; + } else { + updateResult(ISEMAIL_ERR_EXPECTING_ATEXT); + } + break; + // folding white space + case '\r': + if ((++i === email.length) || email[i] !== '\n') { + // fatal error + updateResult(ISEMAIL_ERR_CR_NO_LF); + break; + } + case ' ': + case '\t': + if (elementLength === 0) { + updateResult(elementCount === 0 ? ISEMAIL_CFWS_FWS : + ISEMAIL_DEPREC_FWS); + } else { + // we can't start FWS in the middle of an element, better be end + assertEnd = true; + } + + context.stack.push(context.now); + context.now = CONTEXT_FWS; + prevToken = token; + break; + // @ + case '@': + // at this point we should have a valid local-part + /* istanbul ignore next: logically unreachable */ + if (context.stack.length !== 1) { + throw new Error('unexpected item on context stack'); + } + + if (parseData.local.length === 0) { + // fatal error + updateResult(ISEMAIL_ERR_NOLOCALPART); + } else if (elementLength === 0) { + // fatal error + updateResult(ISEMAIL_ERR_DOT_END); + // http://tools.ietf.org/html/rfc5321#section-4.5.3.1.1 + // the maximum total length of a user name or other local-part is 64 + // octets + } else if (parseData.local.length > 64) { + updateResult(ISEMAIL_RFC5322_LOCAL_TOOLONG); + // http://tools.ietf.org/html/rfc5322#section-3.4.1 + // comments and folding white space + // SHOULD NOT be used around the "@" in the addr-spec + // + // http://tools.ietf.org/html/rfc2119 + // 4. SHOULD NOT this phrase, or the phrase "NOT RECOMMENDED" mean that + // there may exist valid reasons in particular circumstances when the + // particular behavior is acceptable or even useful, but the full + // implications should be understood and the case carefully weighed + // before implementing any behavior described with this label + } else if ((context.prev === CONTEXT_COMMENT) || + (context.prev === CONTEXT_FWS)) { + updateResult(ISEMAIL_DEPREC_CFWS_NEAR_AT); + } + + // clear everything down for the domain parsing + context.now = COMPONENT_DOMAIN; // where we are + context.stack[0] = COMPONENT_DOMAIN; // where we have been + elementCount = 0; + elementLength = 0; + assertEnd = false; // CFWS can only appear at the end of the element + break; + // atext + default: + // http://tools.ietf.org/html/rfc5322#section-3.2.3 + // atext = ALPHA / DIGIT / ; Printable US-ASCII + // "!" / "#" / ; characters not including + // "$" / "%" / ; specials. Used for atoms. + // "&" / "'" / + // "*" / "+" / + // "-" / "/" / + // "=" / "?" / + // "^" / "_" / + // "`" / "{" / + // "|" / "}" / + // "~" + if (assertEnd) { + // we have encountered atext where it is no longer valid + switch (context.prev) { + case CONTEXT_COMMENT: + case CONTEXT_FWS: + updateResult(ISEMAIL_ERR_ATEXT_AFTER_CFWS); + break; + case CONTEXT_QUOTEDSTRING: + updateResult(ISEMAIL_ERR_ATEXT_AFTER_QS); + break; + /* istanbul ignore next: logically unreachable */ + default: + throw new Error('more atext found where none is allowed, ' + + 'but unrecognized prev context: ' + context.prev); + } + } else { + context.prev = context.now; + charCode = token.charCodeAt(0); + + if (charCode < 33 || charCode > 126 || charCode === 10 || + specialsLookup(charCode)) { + // fatal error + updateResult(ISEMAIL_ERR_EXPECTING_ATEXT); + } + + parseData.local += token; + atomList.local[elementCount] += token; + elementLength++; + } + } + break; + case COMPONENT_DOMAIN: + // http://tools.ietf.org/html/rfc5322#section-3.4.1 + // domain = dot-atom / domain-literal / obs-domain + // + // dot-atom = [CFWS] dot-atom-text [CFWS] + // + // dot-atom-text = 1*atext *("." 1*atext) + // + // domain-literal = [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS] + // + // dtext = %d33-90 / ; Printable US-ASCII + // %d94-126 / ; characters not including + // obs-dtext ; "[", "]", or "\" + // + // obs-domain = atom *("." atom) + // + // atom = [CFWS] 1*atext [CFWS] + + // http://tools.ietf.org/html/rfc5321#section-4.1.2 + // Mailbox = Local-part "@" ( Domain / address-literal ) + // + // Domain = sub-domain *("." sub-domain) + // + // address-literal = "[" ( IPv4-address-literal / + // IPv6-address-literal / + // General-address-literal ) "]" + // ; See Section 4.1.3 + + // http://tools.ietf.org/html/rfc5322#section-3.4.1 + // Note: A liberal syntax for the domain portion of addr-spec is + // given here. However, the domain portion contains addressing + // information specified by and used in other protocols (e.g., + // [RFC1034], [RFC1035], [RFC1123], [RFC5321]). It is therefore + // incumbent upon implementations to conform to the syntax of + // addresses for the context in which they are used. + // is_email() author's note: it's not clear how to interpret this in + // the context of a general email address validator. The conclusion I + // have reached is this: "addressing information" must comply with + // RFC 5321 (and in turn RFC 1035), anything that is "semantically + // invisible" must comply only with RFC 5322. + switch (token) { + // comment + case '(': + if (elementLength === 0) { + // comments at the start of the domain are deprecated in the text + // comments at the start of a subdomain are obs-domain + // (http://tools.ietf.org/html/rfc5322#section-3.4.1) + updateResult(elementCount === 0 ? ISEMAIL_DEPREC_CFWS_NEAR_AT : + ISEMAIL_DEPREC_COMMENT); + } else { + updateResult(ISEMAIL_CFWS_COMMENT); + assertEnd = true; // can't start a comment mid-element, better be end + } + + context.stack.push(context.now); + context.now = CONTEXT_COMMENT; + break; + // next dot-atom element + case '.': + if (elementLength === 0) { + // another dot, already? fatal error + updateResult(elementCount === 0 ? ISEMAIL_ERR_DOT_START : + ISEMAIL_ERR_CONSECUTIVEDOTS); + } else if (hyphenFlag) { + // previous subdomain ended in a hyphen + updateResult(ISEMAIL_ERR_DOMAINHYPHENEND); // fatal error + } else if (elementLength > 63) { + // Nowhere in RFC 5321 does it say explicitly that the + // domain part of a Mailbox must be a valid domain according + // to the DNS standards set out in RFC 1035, but this *is* + // implied in several places. For instance, wherever the idea + // of host routing is discussed the RFC says that the domain + // must be looked up in the DNS. This would be nonsense unless + // the domain was designed to be a valid DNS domain. Hence we + // must conclude that the RFC 1035 restriction on label length + // also applies to RFC 5321 domains. + // + // http://tools.ietf.org/html/rfc1035#section-2.3.4 + // labels 63 octets or less + + updateResult(ISEMAIL_RFC5322_LABEL_TOOLONG); + } + + // CFWS is OK again now we're at the beginning of an element (although + // it may be obsolete CFWS) + assertEnd = false; + elementLength = 0; + elementCount++; + atomList.domain[elementCount] = ''; + parseData.domain += token; + + break; + // domain literal + case '[': + if (parseData.domain.length === 0) { + // domain literal must be the only component + assertEnd = true; + elementLength++; + context.stack.push(context.now); + context.now = COMPONENT_LITERAL; + parseData.domain += token; + atomList.domain[elementCount] += token; + parseData.literal = ''; + } else { + // fatal error + updateResult(ISEMAIL_ERR_EXPECTING_ATEXT); + } + break; + // folding white space + case '\r': + if ((++i === email.length) || email[i] !== '\n') { + // fatal error + updateResult(ISEMAIL_ERR_CR_NO_LF); + break; + } + case ' ': + case '\t': + if (elementLength === 0) { + updateResult(elementCount === 0 ? ISEMAIL_DEPREC_CFWS_NEAR_AT : + ISEMAIL_DEPREC_FWS); + } else { + // we can't start FWS in the middle of an element, so this better be + // the end + updateResult(ISEMAIL_CFWS_FWS); + assertEnd = true; + } + + context.stack.push(context.now); + context.now = CONTEXT_FWS; + prevToken = token; + break; + // atext + default: + // RFC 5322 allows any atext... + // http://tools.ietf.org/html/rfc5322#section-3.2.3 + // atext = ALPHA / DIGIT / ; Printable US-ASCII + // "!" / "#" / ; characters not including + // "$" / "%" / ; specials. Used for atoms. + // "&" / "'" / + // "*" / "+" / + // "-" / "/" / + // "=" / "?" / + // "^" / "_" / + // "`" / "{" / + // "|" / "}" / + // "~" + + // But RFC 5321 only allows letter-digit-hyphen to comply with DNS rules + // (RFCs 1034 & 1123) + // http://tools.ietf.org/html/rfc5321#section-4.1.2 + // sub-domain = Let-dig [Ldh-str] + // + // Let-dig = ALPHA / DIGIT + // + // Ldh-str = *( ALPHA / DIGIT / "-" ) Let-dig + // + if (assertEnd) { + // we have encountered atext where it is no longer valid + switch (context.prev) { + case CONTEXT_COMMENT: + case CONTEXT_FWS: + updateResult(ISEMAIL_ERR_ATEXT_AFTER_CFWS); + break; + case COMPONENT_LITERAL: + updateResult(ISEMAIL_ERR_ATEXT_AFTER_DOMLIT); + break; + /* istanbul ignore next: logically unreachable */ + default: + throw new Error('more atext found where none is allowed, ' + + 'but unrecognized prev context: ' + context.prev); + } + } + + charCode = token.charCodeAt(0); + // assume this token isn't a hyphen unless we discover it is + hyphenFlag = false; + + if (charCode < 33 || charCode > 126 || specialsLookup(charCode)) { + // fatal error + updateResult(ISEMAIL_ERR_EXPECTING_ATEXT); + } else if (token === '-') { + if (elementLength === 0) { + // hyphens can't be at the beginning of a subdomain + updateResult(ISEMAIL_ERR_DOMAINHYPHENSTART); // fatal error + } + + hyphenFlag = true; + } else if (!((charCode > 47 && charCode < 58) || + (charCode > 64 && charCode < 91) || + (charCode > 96 && charCode < 123))) { + // not an RFC 5321 subdomain, but still OK by RFC 5322 + updateResult(ISEMAIL_RFC5322_DOMAIN); + } + + parseData.domain += token; + atomList.domain[elementCount] += token; + elementLength++; + } + break; + // domain literal + case COMPONENT_LITERAL: + // http://tools.ietf.org/html/rfc5322#section-3.4.1 + // domain-literal = [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS] + // + // dtext = %d33-90 / ; Printable US-ASCII + // %d94-126 / ; characters not including + // obs-dtext ; "[", "]", or "\" + // + // obs-dtext = obs-NO-WS-CTL / quoted-pair + switch (token) { + // end of domain literal + case ']': + if (maxResult < ISEMAIL_DEPREC) { + // Could be a valid RFC 5321 address literal, so let's check + + // http://tools.ietf.org/html/rfc5321#section-4.1.2 + // address-literal = "[" ( IPv4-address-literal / + // IPv6-address-literal / + // General-address-literal ) "]" + // ; See Section 4.1.3 + // + // http://tools.ietf.org/html/rfc5321#section-4.1.3 + // IPv4-address-literal = Snum 3("." Snum) + // + // IPv6-address-literal = "IPv6:" IPv6-addr + // + // General-address-literal = Standardized-tag ":" 1*dcontent + // + // Standardized-tag = Ldh-str + // ; Standardized-tag MUST be specified in a + // ; Standards-Track RFC and registered with IANA + // + // dcontent = %d33-90 / ; Printable US-ASCII + // %d94-126 ; excl. "[", "\", "]" + // + // Snum = 1*3DIGIT + // ; representing a decimal integer + // ; value in the range 0 through 255 + // + // IPv6-addr = IPv6-full / IPv6-comp / IPv6v4-full / IPv6v4-comp + // + // IPv6-hex = 1*4HEXDIG + // + // IPv6-full = IPv6-hex 7(":" IPv6-hex) + // + // IPv6-comp = [IPv6-hex *5(":" IPv6-hex)] "::" + // [IPv6-hex *5(":" IPv6-hex)] + // ; The "::" represents at least 2 16-bit groups of + // ; zeros. No more than 6 groups in addition to the + // ; "::" may be present. + // + // IPv6v4-full = IPv6-hex 5(":" IPv6-hex) ":" IPv4-address-literal + // + // IPv6v4-comp = [IPv6-hex *3(":" IPv6-hex)] "::" + // [IPv6-hex *3(":" IPv6-hex) ":"] + // IPv4-address-literal + // ; The "::" represents at least 2 16-bit groups of + // ; zeros. No more than 4 groups in addition to the + // ; "::" and IPv4-address-literal may be present. + // + // is_email() author's note: We can't use ip2long() to validate + // IPv4 addresses because it accepts abbreviated addresses + // (xxx.xxx.xxx), expanding the last group to complete the address. + // filter_var() validates IPv6 address inconsistently (up to PHP 5.3.3 + // at least) -- see http://bugs.php.net/bug.php?id=53236 for example + + // TODO: var here? + var maxGroups = 8, matchesIP, index = false; + var addressLiteral = parseData.literal; + + // maybe extract IPv4 part from the end of the address-literal + if (matchesIP = IPv4_REGEX.exec(addressLiteral)) { + if ((index = matchesIP.index) !== 0) { + // convert IPv4 part to IPv6 format for futher testing + addressLiteral = addressLiteral.slice(0, matchesIP.index) + '0:0'; + } + } + + if (index === 0) { + // nothing there except a valid IPv4 address, so... + updateResult(ISEMAIL_RFC5321_ADDRESSLITERAL); + } else if (addressLiteral.slice(0, 5).toLowerCase() !== 'ipv6:') { + updateResult(ISEMAIL_RFC5322_DOMAINLITERAL); + } else { + var match = addressLiteral.substr(5); + matchesIP = match.split(':'); + index = match.indexOf('::'); + + if (!~index) { + // need exactly the right number of groups + if (matchesIP.length !== maxGroups) { + updateResult(ISEMAIL_RFC5322_IPV6_GRPCOUNT); + } + } else if (index !== match.lastIndexOf('::')) { + updateResult(ISEMAIL_RFC5322_IPV6_2X2XCOLON); + } else { + if (index === 0 || index === match.length - 2) { + // RFC 4291 allows :: at the start or end of an address with + // 7 other groups in addition + maxGroups++; + } + + if (matchesIP.length > maxGroups) { + updateResult(ISEMAIL_RFC5322_IPV6_MAXGRPS); + } else if (matchesIP.length === maxGroups) { + // eliding a single "::" + updateResult(ISEMAIL_RFC5321_IPV6DEPRECATED); + } + } + + // IPv6 testing strategy + if (match[0] === ':' && match[1] !== ':') { + updateResult(ISEMAIL_RFC5322_IPV6_COLONSTRT); + } else if (match[match.length - 1] === ':' && + match[match.length - 2] !== ':') { + updateResult(ISEMAIL_RFC5322_IPV6_COLONEND); + } else if (matchesIP.every(IPv6_REGEX_TEST)) { + updateResult(ISEMAIL_RFC5321_ADDRESSLITERAL); + } else { + updateResult(ISEMAIL_RFC5322_IPV6_BADCHAR); + } + } + } else { + updateResult(ISEMAIL_RFC5322_DOMAINLITERAL); + } + + parseData.domain += token; + atomList.domain[elementCount] += token; + elementLength++; + context.prev = context.now; + context.now = context.stack.pop(); + break; + case '\\': + updateResult(ISEMAIL_RFC5322_DOMLIT_OBSDTEXT); + context.stack.push(context.now); + context.now = CONTEXT_QUOTEDPAIR; + break; + // folding white space + case '\r': + if ((++i === email.length) || email[i] !== '\n') { + // fatal error + updateResult(ISEMAIL_ERR_CR_NO_LF); + break; + } + case ' ': + case '\t': + updateResult(ISEMAIL_CFWS_FWS); + + context.stack.push(context.now); + context.now = CONTEXT_FWS; + prevToken = token; + break; + // dtext + default: + // http://tools.ietf.org/html/rfc5322#section-3.4.1 + // dtext = %d33-90 / ; Printable US-ASCII + // %d94-126 / ; characters not including + // obs-dtext ; "[", "]", or "\" + // + // obs-dtext = obs-NO-WS-CTL / quoted-pair + // + // obs-NO-WS-CTL = %d1-8 / ; US-ASCII control + // %d11 / ; characters that do not + // %d12 / ; include the carriage + // %d14-31 / ; return, line feed, and + // %d127 ; white space characters + charCode = token.charCodeAt(0); + + // CR, LF, SP & HTAB have already been parsed above + if (charCode > 127 || charCode === 0 || token === '[') { + // fatal error + updateResult(ISEMAIL_ERR_EXPECTING_DTEXT); + break; + } else if (charCode < 33 || charCode === 127) { + updateResult(ISEMAIL_RFC5322_DOMLIT_OBSDTEXT); + } + + parseData.literal += token; + parseData.domain += token; + atomList.domain[elementCount] += token; + elementLength++; + } + break; + // quoted string + case CONTEXT_QUOTEDSTRING: + // http://tools.ietf.org/html/rfc5322#section-3.2.4 + // quoted-string = [CFWS] + // DQUOTE *([FWS] qcontent) [FWS] DQUOTE + // [CFWS] + // + // qcontent = qtext / quoted-pair + switch (token) { + // quoted pair + case '\\': + context.stack.push(context.now); + context.now = CONTEXT_QUOTEDPAIR; + break; + // folding white space + // inside a quoted string, spaces are allowed as regular characters + // it's only FWS if we include HTAB or CRLF + case '\r': + if ((++i === email.length) || email[i] !== '\n') { + // fatal error + updateResult(ISEMAIL_ERR_CR_NO_LF); + break; + } + case '\t': + // http://tools.ietf.org/html/rfc5322#section-3.2.2 + // Runs of FWS, comment, or CFWS that occur between lexical tokens in + // a structured header field are semantically interpreted as a single + // space character. + + // http://tools.ietf.org/html/rfc5322#section-3.2.4 + // the CRLF in any FWS/CFWS that appears within the quoted-string [is] + // semantically "invisible" and therefore not part of the + // quoted-string + + parseData.local += ' '; + atomList.local[elementCount] += ' '; + elementLength++; + + updateResult(ISEMAIL_CFWS_FWS); + context.stack.push(context.now); + context.now = CONTEXT_FWS; + prevToken = token; + break; + // end of quoted string + case '"': + parseData.local += token; + atomList.local[elementCount] += token; + elementLength++; + context.prev = context.now; + context.now = context.stack.pop(); + break; + // qtext + default: + // http://tools.ietf.org/html/rfc5322#section-3.2.4 + // qtext = %d33 / ; Printable US-ASCII + // %d35-91 / ; characters not including + // %d93-126 / ; "\" or the quote character + // obs-qtext + // + // obs-qtext = obs-NO-WS-CTL + // + // obs-NO-WS-CTL = %d1-8 / ; US-ASCII control + // %d11 / ; characters that do not + // %d12 / ; include the carriage + // %d14-31 / ; return, line feed, and + // %d127 ; white space characters + charCode = token.charCodeAt(0); + + if (charCode > 127 || charCode === 0 || charCode === 10) { + updateResult(ISEMAIL_ERR_EXPECTING_QTEXT); + } else if (charCode < 32 || charCode === 127) { + updateResult(ISEMAIL_DEPREC_QTEXT); + } + + parseData.local += token; + atomList.local[elementCount] += token; + elementLength++; + } + + // http://tools.ietf.org/html/rfc5322#section-3.4.1 + // If the string can be represented as a dot-atom (that is, it contains + // no characters other than atext characters or "." surrounded by atext + // characters), then the dot-atom form SHOULD be used and the quoted- + // string form SHOULD NOT be used. + + break; + // quoted pair + case CONTEXT_QUOTEDPAIR: + // http://tools.ietf.org/html/rfc5322#section-3.2.1 + // quoted-pair = ("\" (VCHAR / WSP)) / obs-qp + // + // VCHAR = %d33-126 ; visible (printing) characters + // WSP = SP / HTAB ; white space + // + // obs-qp = "\" (%d0 / obs-NO-WS-CTL / LF / CR) + // + // obs-NO-WS-CTL = %d1-8 / ; US-ASCII control + // %d11 / ; characters that do not + // %d12 / ; include the carriage + // %d14-31 / ; return, line feed, and + // %d127 ; white space characters + // + // i.e. obs-qp = "\" (%d0-8, %d10-31 / %d127) + charCode = token.charCodeAt(0); + + if (charCode > 127) { + // fatal error + updateResult(ISEMAIL_ERR_EXPECTING_QPAIR); + } else if ((charCode < 31 && charCode !== 9) || charCode === 127) { + // SP & HTAB are allowed + updateResult(ISEMAIL_DEPREC_QP); + } + + // At this point we know where this qpair occurred so + // we could check to see if the character actually + // needed to be quoted at all. + // http://tools.ietf.org/html/rfc5321#section-4.1.2 + // the sending system SHOULD transmit the + // form that uses the minimum quoting possible. + + // TODO: check whether the character needs to be quoted (escaped) + // in this context + + context.prev = context.now; + context.now = context.stack.pop(); // end of qpair + token = '\\' + token; + + switch (context.now) { + case CONTEXT_COMMENT: break; + case CONTEXT_QUOTEDSTRING: + parseData.local += token; + atomList.local[elementCount] += token; + + // the maximum sizes specified by RFC 5321 are octet counts, + // so we must include the backslash + elementLength += 2; + break; + case COMPONENT_LITERAL: + parseData.domain += token; + atomList.domain[elementCount] += token; + + // the maximum sizes specified by RFC 5321 are octet counts, + // so we must include the backslash + elementLength += 2; + break; + /* istanbul ignore next: logically unreachable */ + default: + throw new Error('quoted pair logic invoked in an invalid context: ' + + context.now); + } + break; + // comment + case CONTEXT_COMMENT: + // http://tools.ietf.org/html/rfc5322#section-3.2.2 + // comment = "(" *([FWS] ccontent) [FWS] ")" + // + // ccontent = ctext / quoted-pair / comment + switch (token) { + // nested comment + case '(': + // nested comments are ok + context.stack.push(context.now); + context.now = CONTEXT_COMMENT; + break; + // end of comment + case ')': + context.prev = context.now; + context.now = context.stack.pop(); + + break; + // quoted pair + case '\\': + context.stack.push(context.now); + context.now = CONTEXT_QUOTEDPAIR; + break; + // folding white space + case '\r': + if ((++i === email.length) || email[i] !== '\n') { + // fatal error + updateResult(ISEMAIL_ERR_CR_NO_LF); + break; + } + case ' ': + case '\t': + updateResult(ISEMAIL_CFWS_FWS); + + context.stack.push(context.now); + context.now = CONTEXT_FWS; + prevToken = token; + break; + // ctext + default: + // http://tools.ietf.org/html/rfc5322#section-3.2.3 + // ctext = %d33-39 / ; Printable US-ASCII + // %d42-91 / ; characters not including + // %d93-126 / ; "(", ")", or "\" + // obs-ctext + // + // obs-ctext = obs-NO-WS-CTL + // + // obs-NO-WS-CTL = %d1-8 / ; US-ASCII control + // %d11 / ; characters that do not + // %d12 / ; include the carriage + // %d14-31 / ; return, line feed, and + // %d127 ; white space characters + charCode = token.charCodeAt(0); + + if (charCode > 127 || charCode === 0 || charCode === 10) { + // fatal error + updateResult(ISEMAIL_ERR_EXPECTING_CTEXT); + break; + } else if (charCode < 32 || charCode === 127) { + updateResult(ISEMAIL_DEPREC_CTEXT); + } + } + break; + // folding white space + case CONTEXT_FWS: + // http://tools.ietf.org/html/rfc5322#section-3.2.2 + // FWS = ([*WSP CRLF] 1*WSP) / obs-FWS + // ; Folding white space + + // But note the erratum: + // http://www.rfc-editor.org/errata_search.php?rfc=5322&eid=1908: + // In the obsolete syntax, any amount of folding white space MAY be + // inserted where the obs-FWS rule is allowed. This creates the + // possibility of having two consecutive "folds" in a line, and + // therefore the possibility that a line which makes up a folded header + // field could be composed entirely of white space. + // + // obs-FWS = 1*([CRLF] WSP) + + if (prevToken === '\r') { + if (token === '\r') { + // fatal error + updateResult(ISEMAIL_ERR_FWS_CRLF_X2); + break; + } + + if (++crlfCount > 1) { + // multiple folds = obsolete FWS + updateResult(ISEMAIL_DEPREC_FWS); + } else { + crlfCount = 1; + } + } + + switch (token) { + case '\r': + if ((++i === email.length) || email[i] !== '\n') { + // fatal error + updateResult(ISEMAIL_ERR_CR_NO_LF); + } + break; + case ' ': + case '\t': + break; + default: + if (prevToken === '\r') { + // fatal error + updateResult(ISEMAIL_ERR_FWS_CRLF_END); + } + + crlfCount = 0; + + context.prev = context.now; + context.now = context.stack.pop(); // end of FWS + + i--; // look at this token again in the parent context + } + prevToken = token; + break; + // unexpected context + /* istanbul ignore next: logically unreachable */ + default: + throw new Error('unknown context: ' + context.now); + } // primary state machine + + if (maxResult > ISEMAIL_RFC5322) { + // fatal error, no point continuing + break; + } + } // token loop + + // check for errors + if (maxResult < ISEMAIL_RFC5322) { + // fatal errors + if (context.now === CONTEXT_QUOTEDSTRING) { + updateResult(ISEMAIL_ERR_UNCLOSEDQUOTEDSTR); + } else if (context.now === CONTEXT_QUOTEDPAIR) { + updateResult(ISEMAIL_ERR_BACKSLASHEND); + } else if (context.now === CONTEXT_COMMENT) { + updateResult(ISEMAIL_ERR_UNCLOSEDCOMMENT); + } else if (context.now === COMPONENT_LITERAL) { + updateResult(ISEMAIL_ERR_UNCLOSEDDOMLIT); + } else if (token === '\r') { + updateResult(ISEMAIL_ERR_FWS_CRLF_END); + } else if (parseData.domain.length === 0) { + updateResult(ISEMAIL_ERR_NODOMAIN); + } else if (elementLength === 0) { + updateResult(ISEMAIL_ERR_DOT_END); + } else if (hyphenFlag) { + updateResult(ISEMAIL_ERR_DOMAINHYPHENEND); + + // other errors + } else if (parseData.domain.length > 255) { + // http://tools.ietf.org/html/rfc5321#section-4.5.3.1.2 + // The maximum total length of a domain name or number is 255 octets. + updateResult(ISEMAIL_RFC5322_DOMAIN_TOOLONG); + } else if (parseData.local.length + parseData.domain.length + /* '@' */ 1 > + 254) { + // http://tools.ietf.org/html/rfc5321#section-4.1.2 + // Forward-path = Path + // + // Path = "<" [ A-d-l ":" ] Mailbox ">" + // + // http://tools.ietf.org/html/rfc5321#section-4.5.3.1.3 + // The maximum total length of a reverse-path or forward-path is 256 + // octets (including the punctuation and element separators). + // + // Thus, even without (obsolete) routing information, the Mailbox can + // only be 254 characters long. This is confirmed by this verified + // erratum to RFC 3696: + // + // http://www.rfc-editor.org/errata_search.php?rfc=3696&eid=1690 + // However, there is a restriction in RFC 2821 on the length of an + // address in MAIL and RCPT commands of 254 characters. Since addresses + // that do not fit in those fields are not normally useful, the upper + // limit on address lengths should normally be considered to be 254. + updateResult(ISEMAIL_RFC5322_TOOLONG); + } else if (elementLength > 63) { + // http://tools.ietf.org/html/rfc1035#section-2.3.4 + // labels 63 octets or less + updateResult(ISEMAIL_RFC5322_LABEL_TOOLONG); + } else if (options.minDomainAtoms && atomList.domain.length < + options.minDomainAtoms) { + updateResult(ISEMAIL_ERR_TOOSHORT_DOMAIN); + } else if (options.tldWhitelist) { + var tldAtom = atomList.domain[elementCount], tldValid = false, n; + if (Array.isArray(options.tldWhitelist)) { + for (i = 0, n = options.tldWhitelist.length; i < n; i++) { + if (tldAtom === options.tldWhitelist[i]) { + tldValid = true; + break; + } + } + } else { + tldValid = hasOwn.call(options.tldWhitelist, tldAtom); + } + if (!tldValid) { + updateResult(ISEMAIL_ERR_UNKNOWN_TLD); + } + } + } // check for errors + + var dnsPositive = false; + + if (options.checkDNS && maxResult < ISEMAIL_DNSWARN && HAS_REQUIRE) { + dns || (dns = require('dns')); + // http://tools.ietf.org/html/rfc5321#section-2.3.5 + // Names that can + // be resolved to MX RRs or address (i.e., A or AAAA) RRs (as discussed + // in Section 5) are permitted, as are CNAME RRs whose targets can be + // resolved, in turn, to MX or address RRs. + // + // http://tools.ietf.org/html/rfc5321#section-5.1 + // The lookup first attempts to locate an MX record associated with the + // name. If a CNAME record is found, the resulting name is processed as + // if it were the initial name. ... If an empty list of MXs is returned, + // the address is treated as if it was associated with an implicit MX + // RR, with a preference of 0, pointing to that host. + // + // isEmail() author's note: We will regard the existence of a CNAME to be + // sufficient evidence of the domain's existence. For performance reasons + // we will not repeat the DNS lookup for the CNAME's target, but we will + // raise a warning because we didn't immediately find an MX record. + if (elementCount === 0) { + // checking TLD DNS only works if you explicitly check from the root + parseData.domain += '.'; + } + + var dnsDomain = parseData.domain; + dns.resolveMx(dnsDomain, function(err, records) { + if ((err && err.code !== dns.NODATA) || (!err && !records)) { + updateResult(ISEMAIL_DNSWARN_NO_RECORD); + return finish(); + } + if (records && records.length) { + dnsPositive = true; + return finish(); + } + var done = false, count = 3; + updateResult(ISEMAIL_DNSWARN_NO_MX_RECORD); + dns.resolveCname(dnsDomain, handleRecords); + dns.resolve4(dnsDomain, handleRecords); + dns.resolve6(dnsDomain, handleRecords); + function handleRecords(err, records) { + if (done) return; + count--; + if (!err && records && records.length) { + done = true; + return finish(); + } + if (count === 0) { + // no usable records for the domain can be found + updateResult(ISEMAIL_DNSWARN_NO_RECORD); + done = true; + finish(); + } + } + }); + } else if (options.checkDNS) { + // guarantee asynchronicity + typeof process !== 'undefined' && process && + typeof process.nextTick === 'function' + ? process.nextTick(finish) + : setTimeout(finish, 1); + } else { + return finish(); + } // checkDNS + + function finish() { + if (!dnsPositive && maxResult < ISEMAIL_DNSWARN) { + if (elementCount === 0) { + updateResult(ISEMAIL_RFC5321_TLD); + } else { + var charCode = atomList.domain[elementCount].charCodeAt(0); + if (charCode >= 48 && charCode <= 57) { + updateResult(ISEMAIL_RFC5321_TLDNUMERIC); + } + } + } + + if (maxResult < threshold) { + maxResult = ISEMAIL_VALID; + } + + if (!diagnose) { + maxResult = maxResult < THRESHOLD; + } + + if (typeof callback === 'function') { + callback(maxResult); + } + + return maxResult; + } // finish +} // isEmail + +module.exports = isEmail; diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/package.json b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/package.json new file mode 100644 index 0000000..ba3eac0 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/package.json @@ -0,0 +1,52 @@ +{ + "name": "isemail", + "version": "1.1.1", + "author": { + "name": "Eli Skeggs", + "email": "skeggse@gmail.com" + }, + "description": "validate an email address according to RFCs 5321, 5322, and others", + "main": "./index", + "scripts": { + "test": "./node_modules/.bin/mocha" + }, + "repository": { + "type": "git", + "url": "https://github.com/globesherpa/node-isemail.git" + }, + "homepage": "https://github.com/globesherpa/node-isemail", + "bugs": { + "url": "https://github.com/globesherpa/node-isemail/issues" + }, + "keywords": [ + "isemail", + "validation", + "check", + "checking", + "verification", + "email", + "address", + "email address" + ], + "devDependencies": { + "mocha": "~1.13.0", + "chai": "~1.9.1" + }, + "licenses": [ + { + "type": "BSD", + "url": "http://www.opensource.org/licenses/bsd-license.php" + } + ], + "engines": { + "node": "*" + }, + "readme": "isemail\n=======\n\n[![Build Status](https://travis-ci.org/globesherpa/node-isemail.png)](https://travis-ci.org/globesherpa/node-isemail)\n[![Coverage Status](https://coveralls.io/repos/globesherpa/node-isemail/badge.png?branch=master)](https://coveralls.io/r/globesherpa/node-isemail?branch=master)\n\nThis first version of `isemail` is a port of the PHP `is_email` function by Dominic Sayers.\n\nFuture versions will improve upon the current version, optimizing it for efficient usage and DRYing the code.\n\nInstall\n-------\n\n```sh\n$ npm install isemail\n```\n\nTest\n----\n\nThe tests were pulled from is_email's extensive [test suite][tests] on October 15, 2013. Many thanks to the contributors!\n\nRun any of the following.\n\n```sh\n$ mocha\n$ npm test\n$ make test\n```\n\n_remember to_ `npm install`!\n\nAPI\n---\n\n### isEmail(email, [options], [callback])\n\nDetermines whether the `email` is valid or not, for various definitions thereof. Optionally accepts an `options` object and a `callback` function. Options may include `errorLevel` and `checkDNS`. The `callback` function will always be called if specified, and the result of the operation supplied as the only parameter to the callback function. If `isEmail` is not asked to check for the existence of the domain (`checkDNS`), it will also synchronously return the result of the operation.\n\nUse `errorLevel` to specify the type of result for `isEmail`. Passing a `false` literal will result in a true or false boolean indicating whether the email address is sufficiently defined for use in sending an email. Passing a `true` literal will result in a more granular numeric status, with zero being a perfectly valid email address. Passing a number will return `0` if the numeric status is below the `errorLevel` and the numeric status otherwise.\n\nThe `tldWhitelist` option can be either an object lookup table or an array of valid top-level domains. If the email address has a top-level domain that is not in the whitelist, the email will be marked as invalid.\n\nThe `minDomainAtoms` option is an optional positive integer that specifies the minimum number of domain atoms that must be included for the email address to be considered valid. Be careful with the option, as some top-level domains, like `io`, directly support email addresses.\n\n#### Examples\n\n```js\n$ node\n> var isEmail = require('isemail');\nundefined\n> var log = console.log.bind(console, 'result');\nundefined\n> isEmail('test@iana.org');\ntrue\n> isEmail('test@iana.org', log);\nresult true\ntrue\n> isEmail('test@iana.org', {checkDNS: true});\nundefined\n> isEmail('test@iana.org', {checkDNS: true}, log);\nundefined\nresult true\n> isEmail('test@iana.org', {errorLevel: true});\n0\n> isEmail('test@iana.org', {errorLevel: true}, log);\nresult 0\n0\n> isEmail('test@e.com');\ntrue\n> isEmail('test@e.com', {checkDNS: true, errorLevel: true}, log);\nundefined\nresult 6\n> isEmail('test@e.com', {checkDNS: true, errorLevel: 7}, log);\nundefined\nresult 0\n> isEmail('test@e.com', {checkDNS: true, errorLevel: 6}, log);\nundefined\nresult 6\n```\n\nTODO\n====\n\nAdd tests for library usage, not just functionality comparisons.\n\nLicense\n=======\n\n[BSD License](http://www.opensource.org/licenses/bsd-license.php)\n\n[tests]: http://isemail.info/_system/is_email/test/?all‎ \"is_email test suite\"\n", + "readmeFilename": "README.md", + "_id": "isemail@1.1.1", + "dist": { + "shasum": "1dc5963b585bcbfc8e794ab5f3dd1c4c7ab93cb8" + }, + "_from": "isemail@1.x.x", + "_resolved": "https://registry.npmjs.org/isemail/-/isemail-1.1.1.tgz" +} diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/test/isemail.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/test/isemail.js new file mode 100644 index 0000000..3bdfe7a --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/test/isemail.js @@ -0,0 +1,279 @@ +var expect = require('chai').expect; + +// diagnoses +var diagnoses = { + ISEMAIL_VALID: 0, + ISEMAIL_DNSWARN_NO_MX_RECORD: 5, + ISEMAIL_DNSWARN_NO_RECORD: 6, + ISEMAIL_RFC5321_TLD: 9, + ISEMAIL_RFC5321_TLDNUMERIC: 10, + ISEMAIL_RFC5321_QUOTEDSTRING: 11, + ISEMAIL_RFC5321_ADDRESSLITERAL: 12, + ISEMAIL_RFC5321_IPV6DEPRECATED: 13, + ISEMAIL_CFWS_COMMENT: 17, + ISEMAIL_CFWS_FWS: 18, + ISEMAIL_DEPREC_LOCALPART: 33, + ISEMAIL_DEPREC_FWS: 34, + ISEMAIL_DEPREC_QTEXT: 35, + ISEMAIL_DEPREC_QP: 36, + ISEMAIL_DEPREC_COMMENT: 37, + ISEMAIL_DEPREC_CTEXT: 38, + ISEMAIL_DEPREC_CFWS_NEAR_AT: 49, + ISEMAIL_RFC5322_DOMAIN: 65, + ISEMAIL_RFC5322_TOOLONG: 66, + ISEMAIL_RFC5322_LOCAL_TOOLONG: 67, + ISEMAIL_RFC5322_DOMAIN_TOOLONG: 68, + ISEMAIL_RFC5322_LABEL_TOOLONG: 69, + ISEMAIL_RFC5322_DOMAINLITERAL: 70, + ISEMAIL_RFC5322_DOMLIT_OBSDTEXT: 71, + ISEMAIL_RFC5322_IPV6_GRPCOUNT: 72, + ISEMAIL_RFC5322_IPV6_2X2XCOLON: 73, + ISEMAIL_RFC5322_IPV6_BADCHAR: 74, + ISEMAIL_RFC5322_IPV6_MAXGRPS: 75, + ISEMAIL_RFC5322_IPV6_COLONSTRT: 76, + ISEMAIL_RFC5322_IPV6_COLONEND: 77, + ISEMAIL_ERR_EXPECTING_DTEXT: 129, + ISEMAIL_ERR_NOLOCALPART: 130, + ISEMAIL_ERR_NODOMAIN: 131, + ISEMAIL_ERR_CONSECUTIVEDOTS: 132, + ISEMAIL_ERR_ATEXT_AFTER_CFWS: 133, + ISEMAIL_ERR_ATEXT_AFTER_QS: 134, + ISEMAIL_ERR_ATEXT_AFTER_DOMLIT: 135, + ISEMAIL_ERR_EXPECTING_QPAIR: 136, + ISEMAIL_ERR_EXPECTING_ATEXT: 137, + ISEMAIL_ERR_EXPECTING_QTEXT: 138, + ISEMAIL_ERR_EXPECTING_CTEXT: 139, + ISEMAIL_ERR_BACKSLASHEND: 140, + ISEMAIL_ERR_DOT_START: 141, + ISEMAIL_ERR_DOT_END: 142, + ISEMAIL_ERR_DOMAINHYPHENSTART: 143, + ISEMAIL_ERR_DOMAINHYPHENEND: 144, + ISEMAIL_ERR_UNCLOSEDQUOTEDSTR: 145, + ISEMAIL_ERR_UNCLOSEDCOMMENT: 146, + ISEMAIL_ERR_UNCLOSEDDOMLIT: 147, + ISEMAIL_ERR_FWS_CRLF_X2: 148, + ISEMAIL_ERR_FWS_CRLF_END: 149, + ISEMAIL_ERR_CR_NO_LF: 150, + ISEMAIL_ERR_UNKNOWN_TLD: 160, + ISEMAIL_ERR_TOOSHORT_TLD: 161 +}; + +// expectations +var expectations = [ + ['', diagnoses.ISEMAIL_ERR_NODOMAIN], + ['test', diagnoses.ISEMAIL_ERR_NODOMAIN], + ['@', diagnoses.ISEMAIL_ERR_NOLOCALPART], + ['test@', diagnoses.ISEMAIL_ERR_NODOMAIN], + ['test@io', diagnoses.ISEMAIL_VALID], + ['@io', diagnoses.ISEMAIL_ERR_NOLOCALPART], + ['@iana.org', diagnoses.ISEMAIL_ERR_NOLOCALPART], + ['test@iana.org', diagnoses.ISEMAIL_VALID], + ['test@nominet.org.uk', diagnoses.ISEMAIL_VALID], + ['test@about.museum', diagnoses.ISEMAIL_VALID], + ['a@iana.org', diagnoses.ISEMAIL_VALID], + ['test@e.com', diagnoses.ISEMAIL_DNSWARN_NO_RECORD], + ['test@iana.a', diagnoses.ISEMAIL_DNSWARN_NO_RECORD], + ['test.test@iana.org', diagnoses.ISEMAIL_VALID], + ['.test@iana.org', diagnoses.ISEMAIL_ERR_DOT_START], + ['test.@iana.org', diagnoses.ISEMAIL_ERR_DOT_END], + ['test..iana.org', diagnoses.ISEMAIL_ERR_CONSECUTIVEDOTS], + ['test_exa-mple.com', diagnoses.ISEMAIL_ERR_NODOMAIN], + ['!#$%&`*+/=?^`{|}~@iana.org', diagnoses.ISEMAIL_VALID], + ['test\\@test@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['123@iana.org', diagnoses.ISEMAIL_VALID], + ['test@123.com', diagnoses.ISEMAIL_VALID], + ['test@iana.123', diagnoses.ISEMAIL_RFC5321_TLDNUMERIC], + ['test@255.255.255.255', diagnoses.ISEMAIL_RFC5321_TLDNUMERIC], + ['abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@iana.org', diagnoses.ISEMAIL_VALID], + ['abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklmn@iana.org', diagnoses.ISEMAIL_RFC5322_LOCAL_TOOLONG], + ['test@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm', diagnoses.ISEMAIL_RFC5322_LABEL_TOOLONG], + ['test@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.com', diagnoses.ISEMAIL_DNSWARN_NO_RECORD], + ['test@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm.com', diagnoses.ISEMAIL_RFC5322_LABEL_TOOLONG], + ['test@mason-dixon.com', diagnoses.ISEMAIL_VALID], + ['test@-iana.org', diagnoses.ISEMAIL_ERR_DOMAINHYPHENSTART], + ['test@iana-.com', diagnoses.ISEMAIL_ERR_DOMAINHYPHENEND], + ['test@aaad.com', diagnoses.ISEMAIL_DNSWARN_NO_MX_RECORD], + ['test@iana.co-uk', diagnoses.ISEMAIL_DNSWARN_NO_RECORD], + ['test@.iana.org', diagnoses.ISEMAIL_ERR_DOT_START], + ['test@iana.org.', diagnoses.ISEMAIL_ERR_DOT_END], + ['test@iana..com', diagnoses.ISEMAIL_ERR_CONSECUTIVEDOTS], + ['a@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.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.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.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.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v', diagnoses.ISEMAIL_DNSWARN_NO_RECORD], + ['abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghi', diagnoses.ISEMAIL_DNSWARN_NO_RECORD], + ['abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghij', diagnoses.ISEMAIL_RFC5322_TOOLONG], + ['a@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.hij', diagnoses.ISEMAIL_RFC5322_TOOLONG], + ['a@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.hijk', diagnoses.ISEMAIL_RFC5322_DOMAIN_TOOLONG], + ['"test"@iana.org', diagnoses.ISEMAIL_RFC5321_QUOTEDSTRING], + ['""@iana.org', diagnoses.ISEMAIL_RFC5321_QUOTEDSTRING], + ['"""@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['"\\a"@iana.org', diagnoses.ISEMAIL_RFC5321_QUOTEDSTRING], + ['"\\""@iana.org', diagnoses.ISEMAIL_RFC5321_QUOTEDSTRING], + ['"\\"@iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDQUOTEDSTR], + ['"\\\\"@iana.org', diagnoses.ISEMAIL_RFC5321_QUOTEDSTRING], + ['test"@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['"test@iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDQUOTEDSTR], + ['"test"test@iana.org', diagnoses.ISEMAIL_ERR_ATEXT_AFTER_QS], + ['test"text"@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['"test""test"@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['"test"."test"@iana.org', diagnoses.ISEMAIL_DEPREC_LOCALPART], + ['"test\\ test"@iana.org', diagnoses.ISEMAIL_RFC5321_QUOTEDSTRING], + ['"test".test@iana.org', diagnoses.ISEMAIL_DEPREC_LOCALPART], + ['"test\0"@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_QTEXT], + ['"test\\\0"@iana.org', diagnoses.ISEMAIL_DEPREC_QP], + ['"test\r\n test"@iana.org', diagnoses.ISEMAIL_CFWS_FWS], + ['"abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz abcdefghj"@iana.org', diagnoses.ISEMAIL_RFC5322_LOCAL_TOOLONG], + ['"abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz abcdefg\\h"@iana.org', diagnoses.ISEMAIL_RFC5322_LOCAL_TOOLONG], + ['test@[255.255.255.255]', diagnoses.ISEMAIL_RFC5321_ADDRESSLITERAL], + ['test@a[255.255.255.255]', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['test@[255.255.255]', diagnoses.ISEMAIL_RFC5322_DOMAINLITERAL], + ['test@[255.255.255.255.255]', diagnoses.ISEMAIL_RFC5322_DOMAINLITERAL], + ['test@[255.255.255.256]', diagnoses.ISEMAIL_RFC5322_DOMAINLITERAL], + ['test@[1111:2222:3333:4444:5555:6666:7777:8888]', diagnoses.ISEMAIL_RFC5322_DOMAINLITERAL], + ['test@[IPv6:1111:2222:3333:4444:5555:6666:7777]', diagnoses.ISEMAIL_RFC5322_IPV6_GRPCOUNT], + ['test@[IPv6:1111:2222:3333:4444:5555:6666:7777:8888]', diagnoses.ISEMAIL_RFC5321_ADDRESSLITERAL], + ['test@[IPv6:1111:2222:3333:4444:5555:6666:7777:8888:9999]', diagnoses.ISEMAIL_RFC5322_IPV6_GRPCOUNT], + ['test@[IPv6:1111:2222:3333:4444:5555:6666:7777:888G]', diagnoses.ISEMAIL_RFC5322_IPV6_BADCHAR], + ['test@[IPv6:1111:2222:3333:4444:5555:6666::8888]', diagnoses.ISEMAIL_RFC5321_IPV6DEPRECATED], + ['test@[IPv6:1111:2222:3333:4444:5555::8888]', diagnoses.ISEMAIL_RFC5321_ADDRESSLITERAL], + ['test@[IPv6:1111:2222:3333:4444:5555:6666::7777:8888]', diagnoses.ISEMAIL_RFC5322_IPV6_MAXGRPS], + ['test@[IPv6::3333:4444:5555:6666:7777:8888]', diagnoses.ISEMAIL_RFC5322_IPV6_COLONSTRT], + ['test@[IPv6:::3333:4444:5555:6666:7777:8888]', diagnoses.ISEMAIL_RFC5321_ADDRESSLITERAL], + ['test@[IPv6:1111::4444:5555::8888]', diagnoses.ISEMAIL_RFC5322_IPV6_2X2XCOLON], + ['test@[IPv6:::]', diagnoses.ISEMAIL_RFC5321_ADDRESSLITERAL], + ['test@[IPv6:1111:2222:3333:4444:5555:255.255.255.255]', diagnoses.ISEMAIL_RFC5322_IPV6_GRPCOUNT], + ['test@[IPv6:1111:2222:3333:4444:5555:6666:255.255.255.255]', diagnoses.ISEMAIL_RFC5321_ADDRESSLITERAL], + ['test@[IPv6:1111:2222:3333:4444:5555:6666:7777:255.255.255.255]', diagnoses.ISEMAIL_RFC5322_IPV6_GRPCOUNT], + ['test@[IPv6:1111:2222:3333:4444::255.255.255.255]', diagnoses.ISEMAIL_RFC5321_ADDRESSLITERAL], + ['test@[IPv6:1111:2222:3333:4444:5555:6666::255.255.255.255]', diagnoses.ISEMAIL_RFC5322_IPV6_MAXGRPS], + ['test@[IPv6:1111:2222:3333:4444:::255.255.255.255]', diagnoses.ISEMAIL_RFC5322_IPV6_2X2XCOLON], + ['test@[IPv6::255.255.255.255]', diagnoses.ISEMAIL_RFC5322_IPV6_COLONSTRT], + [' test @iana.org', diagnoses.ISEMAIL_DEPREC_CFWS_NEAR_AT], + ['test@ iana .com', diagnoses.ISEMAIL_DEPREC_CFWS_NEAR_AT], + ['test . test@iana.org', diagnoses.ISEMAIL_DEPREC_FWS], + ['\r\n test@iana.org', diagnoses.ISEMAIL_CFWS_FWS], + ['\r\n \r\n test@iana.org', diagnoses.ISEMAIL_DEPREC_FWS], + ['(comment)test@iana.org', diagnoses.ISEMAIL_CFWS_COMMENT], + ['((comment)test@iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDCOMMENT], + ['(comment(comment))test@iana.org', diagnoses.ISEMAIL_CFWS_COMMENT], + ['test@(comment)iana.org', diagnoses.ISEMAIL_DEPREC_CFWS_NEAR_AT], + ['test(comment)test@iana.org', diagnoses.ISEMAIL_ERR_ATEXT_AFTER_CFWS], + ['test@(comment)[255.255.255.255]', diagnoses.ISEMAIL_DEPREC_CFWS_NEAR_AT], + ['(comment)abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@iana.org', diagnoses.ISEMAIL_CFWS_COMMENT], + ['test@(comment)abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.com', diagnoses.ISEMAIL_DEPREC_CFWS_NEAR_AT], + ['(comment)test@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghik.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghik.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijk.abcdefghijklmnopqrstuvwxyzabcdefghijk.abcdefghijklmnopqrstu', diagnoses.ISEMAIL_CFWS_COMMENT], + ['test@iana.org\n', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['test@xn--hxajbheg2az3al.xn--jxalpdlp', diagnoses.ISEMAIL_DNSWARN_NO_RECORD], + ['xn--test@iana.org', diagnoses.ISEMAIL_VALID], + ['test@iana.org-', diagnoses.ISEMAIL_ERR_DOMAINHYPHENEND], + ['"test@iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDQUOTEDSTR], + ['(test@iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDCOMMENT], + ['test@(iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDCOMMENT], + ['test@[1.2.3.4', diagnoses.ISEMAIL_ERR_UNCLOSEDDOMLIT], + ['"test\\"@iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDQUOTEDSTR], + ['(comment\\)test@iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDCOMMENT], + ['test@iana.org(comment\\)', diagnoses.ISEMAIL_ERR_UNCLOSEDCOMMENT], + ['test@iana.org(comment\\', diagnoses.ISEMAIL_ERR_BACKSLASHEND], + ['test@[RFC-5322-domain-literal]', diagnoses.ISEMAIL_RFC5322_DOMAINLITERAL], + ['test@[RFC-5322]-domain-literal]', diagnoses.ISEMAIL_ERR_ATEXT_AFTER_DOMLIT], + ['test@[RFC-5322-[domain-literal]', diagnoses.ISEMAIL_ERR_EXPECTING_DTEXT], + ['test@[RFC-5322-\\\x07-domain-literal]', diagnoses.ISEMAIL_RFC5322_DOMLIT_OBSDTEXT], + ['test@[RFC-5322-\\\t-domain-literal]', diagnoses.ISEMAIL_RFC5322_DOMLIT_OBSDTEXT], + ['test@[RFC-5322-\\]-domain-literal]', diagnoses.ISEMAIL_RFC5322_DOMLIT_OBSDTEXT], + ['test@[RFC-5322-\x7f-domain-literal]', diagnoses.ISEMAIL_RFC5322_DOMLIT_OBSDTEXT], + ['test@[RFC-5322-domain-literal\\]', diagnoses.ISEMAIL_ERR_UNCLOSEDDOMLIT], + ['test@[RFC-5322-domain-literal\\', diagnoses.ISEMAIL_ERR_BACKSLASHEND], + ['test@[RFC 5322 domain literal]', diagnoses.ISEMAIL_RFC5322_DOMAINLITERAL], + ['test@[RFC-5322-domain-literal] (comment)', diagnoses.ISEMAIL_RFC5322_DOMAINLITERAL], + ['\x7f@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['test@\x7f.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['"\x7f"@iana.org', diagnoses.ISEMAIL_DEPREC_QTEXT], + ['"\\\x7f"@iana.org', diagnoses.ISEMAIL_DEPREC_QP], + ['(\x7f)test@iana.org', diagnoses.ISEMAIL_DEPREC_CTEXT], + ['test@iana.org\r', diagnoses.ISEMAIL_ERR_CR_NO_LF], + ['\rtest@iana.org', diagnoses.ISEMAIL_ERR_CR_NO_LF], + ['"\rtest"@iana.org', diagnoses.ISEMAIL_ERR_CR_NO_LF], + ['(\r)test@iana.org', diagnoses.ISEMAIL_ERR_CR_NO_LF], + ['test@iana.org(\r)', diagnoses.ISEMAIL_ERR_CR_NO_LF], + ['\ntest@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['"\n"@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_QTEXT], + ['"\\\n"@iana.org', diagnoses.ISEMAIL_DEPREC_QP], + ['(\n)test@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_CTEXT], + ['\x07@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['test@\x07.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['"\x07"@iana.org', diagnoses.ISEMAIL_DEPREC_QTEXT], + ['"\\\x07"@iana.org', diagnoses.ISEMAIL_DEPREC_QP], + ['(\x07)test@iana.org', diagnoses.ISEMAIL_DEPREC_CTEXT], + ['\r\ntest@iana.org', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], + ['\r\n \r\ntest@iana.org', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], + [' \r\ntest@iana.org', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], + [' \r\n test@iana.org', diagnoses.ISEMAIL_CFWS_FWS], + [' \r\n \r\ntest@iana.org', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], + [' \r\n\r\ntest@iana.org', diagnoses.ISEMAIL_ERR_FWS_CRLF_X2], + [' \r\n\r\n test@iana.org', diagnoses.ISEMAIL_ERR_FWS_CRLF_X2], + ['test@iana.org\r\n ', diagnoses.ISEMAIL_CFWS_FWS], + ['test@iana.org\r\n \r\n ', diagnoses.ISEMAIL_DEPREC_FWS], + ['test@iana.org\r\n', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], + ['test@iana.org \r', diagnoses.ISEMAIL_ERR_CR_NO_LF], + ['test@iana.org\r\n \r\n', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], + ['test@iana.org \r\n', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], + ['test@iana.org \r\n ', diagnoses.ISEMAIL_CFWS_FWS], + ['test@iana.org \r\n \r\n', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], + ['test@iana.org \r\n\r\n', diagnoses.ISEMAIL_ERR_FWS_CRLF_X2], + ['test@iana.org \r\n\r\n ', diagnoses.ISEMAIL_ERR_FWS_CRLF_X2], + ['test@iana. org', diagnoses.ISEMAIL_DEPREC_FWS], + ['test@[\r', diagnoses.ISEMAIL_ERR_CR_NO_LF], + ['test@[\r\n', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], + [' test@iana.org', diagnoses.ISEMAIL_CFWS_FWS], + ['test@iana.org ', diagnoses.ISEMAIL_CFWS_FWS], + ['test@[IPv6:1::2:]', diagnoses.ISEMAIL_RFC5322_IPV6_COLONEND], + ['"test\\©"@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_QPAIR], + ['test@iana/icann.org', diagnoses.ISEMAIL_RFC5322_DOMAIN], + ['test.(comment)test@iana.org', diagnoses.ISEMAIL_DEPREC_COMMENT], + ['test@iana.(comment)org', diagnoses.ISEMAIL_DEPREC_COMMENT], + ['test@iana(comment)iana.org', diagnoses.ISEMAIL_ERR_ATEXT_AFTER_CFWS], + ['(comment\r\n comment)test@iana.org', diagnoses.ISEMAIL_CFWS_FWS], + ['test@org', diagnoses.ISEMAIL_RFC5321_TLD], + ['test@example.com', diagnoses.ISEMAIL_DNSWARN_NO_MX_RECORD], + ['test@nic.no', diagnoses.ISEMAIL_DNSWARN_NO_RECORD] +]; + +var tldExpectations = [ + ['shouldbe@invalid', diagnoses.ISEMAIL_ERR_UNKNOWN_TLD], + ['shouldbe@example.com', diagnoses.ISEMAIL_VALID] +]; + +describe('isEmail', function() { + var isEmail = require('..'); + + expectations.forEach(function(obj, i) { + var email = obj[0], result = obj[1]; + it('should handle test ' + (i + 1), function(done) { + isEmail(email, {errorLevel: 0, checkDNS: true}, function(res) { + expect(res).to.equal(result); + done(); + }); + }); + }); + + tldExpectations.forEach(function(obj, i) { + var email = obj[0], result = obj[1]; + it('should handle tld test ' + (i + 1), function() { + var res = isEmail(email, {errorLevel: 0, tldWhitelist: {com: true}}); + expect(res).to.equal(result); + + res = isEmail(email, {errorLevel: 0, tldWhitelist: ['com']}); + expect(res).to.equal(result); + }); + }); + + it('should handle domain atom test 1', function() { + var res = isEmail('shouldbe@invalid', {errorLevel: 0, minDomainAtoms: 2}); + + expect(res).to.equal(diagnoses.ISEMAIL_ERR_TOOSHORT_TLD); + }); + + it('should handle domain atom test 2', function() { + var res = isEmail('valid@example.com', {errorLevel: 0, minDomainAtoms: 2}); + + expect(res).to.equal(diagnoses.ISEMAIL_VALID); + }); +}); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/test/mocha.opts b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/test/mocha.opts new file mode 100644 index 0000000..84dcd68 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/isemail/test/mocha.opts @@ -0,0 +1,2 @@ +--reporter dot +--check-leaks diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/LICENSE b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/LICENSE new file mode 100644 index 0000000..bd17246 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2011-2014 Tim Wood, Iskren Chernev, Moment.js contributors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/README.md b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/README.md new file mode 100644 index 0000000..6c25b5e --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/README.md @@ -0,0 +1,39 @@ +[![NPM version][npm-version-image]][npm-url] [![NPM downloads][npm-downloads-image]][npm-url] [![MIT License][license-image]][license-url] [![Build Status][travis-image]][travis-url] + +A lightweight JavaScript date library for parsing, validating, manipulating, and formatting dates. + +## [Documentation](http://momentjs.com/docs/) + +## Upgrading to 2.0.0 + +There are a number of small backwards incompatible changes with version 2.0.0. [See the full descriptions here](https://gist.github.com/timrwood/e72f2eef320ed9e37c51#backwards-incompatible-changes) + + * Changed language ordinal method to return the number + ordinal instead of just the ordinal. + + * Changed two digit year parsing cutoff to match strptime. + + * Removed `moment#sod` and `moment#eod` in favor of `moment#startOf` and `moment#endOf`. + + * Removed `moment.humanizeDuration()` in favor of `moment.duration().humanize()`. + + * Removed the lang data objects from the top level namespace. + + * Duplicate `Date` passed to `moment()` instead of referencing it. + +## [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md) + +## [Contributing](https://github.com/moment/moment/blob/develop/CONTRIBUTING.md) + +## License + +Moment.js is freely distributable under the terms of the [MIT license](https://github.com/moment/moment/blob/develop/LICENSE). + +[license-image]: http://img.shields.io/badge/license-MIT-blue.svg?style=flat +[license-url]: LICENSE + +[npm-url]: https://npmjs.org/package/moment +[npm-version-image]: http://img.shields.io/npm/v/moment.svg?style=flat +[npm-downloads-image]: http://img.shields.io/npm/dm/moment.svg?style=flat + +[travis-url]: http://travis-ci.org/moment/moment +[travis-image]: http://img.shields.io/travis/moment/moment/develop.svg?style=flat diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/ender.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/ender.js new file mode 100644 index 0000000..71462a7 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/ender.js @@ -0,0 +1 @@ +$.ender({ moment: require('moment') }) diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/af.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/af.js new file mode 100644 index 0000000..9c7ad95 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/af.js @@ -0,0 +1,71 @@ +// moment.js locale configuration +// locale : afrikaans (af) +// author : Werner Mollentze : https://github.com/wernerm + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('af', { + months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'), + weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'), + weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'), + meridiemParse: /vm|nm/i, + isPM : function (input) { + return /^nm$/i.test(input); + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower ? 'vm' : 'VM'; + } else { + return isLower ? 'nm' : 'NM'; + } + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Vandag om] LT', + nextDay : '[Môre om] LT', + nextWeek : 'dddd [om] LT', + lastDay : '[Gister om] LT', + lastWeek : '[Laas] dddd [om] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'oor %s', + past : '%s gelede', + s : '\'n paar sekondes', + m : '\'n minuut', + mm : '%d minute', + h : '\'n uur', + hh : '%d ure', + d : '\'n dag', + dd : '%d dae', + M : '\'n maand', + MM : '%d maande', + y : '\'n jaar', + yy : '%d jaar' + }, + ordinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter + }, + week : { + dow : 1, // Maandag is die eerste dag van die week. + doy : 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ar-ma.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ar-ma.js new file mode 100644 index 0000000..7add172 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ar-ma.js @@ -0,0 +1,57 @@ +// moment.js locale configuration +// locale : Moroccan Arabic (ar-ma) +// author : ElFadili Yassine : https://github.com/ElFadiliY +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ar-ma', { + months : 'يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + monthsShort : 'يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'ÙÙŠ %s', + past : 'منذ %s', + s : 'ثوان', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ar-sa.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ar-sa.js new file mode 100644 index 0000000..731f97b --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ar-sa.js @@ -0,0 +1,101 @@ +// moment.js locale configuration +// locale : Arabic Saudi Arabia (ar-sa) +// author : Suhail Alkowaileet : https://github.com/xsoh + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': 'Ù¡', + '2': 'Ù¢', + '3': 'Ù£', + '4': 'Ù¤', + '5': 'Ù¥', + '6': 'Ù¦', + '7': 'Ù§', + '8': 'Ù¨', + '9': 'Ù©', + '0': 'Ù ' + }, numberMap = { + 'Ù¡': '1', + 'Ù¢': '2', + 'Ù£': '3', + 'Ù¤': '4', + 'Ù¥': '5', + 'Ù¦': '6', + 'Ù§': '7', + 'Ù¨': '8', + 'Ù©': '9', + 'Ù ': '0' + }; + + return moment.defineLocale('ar-sa', { + months : 'يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + monthsShort : 'يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + meridiemParse: /ص|Ù…/, + isPM : function (input) { + return 'Ù…' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'Ù…'; + } + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'ÙÙŠ %s', + past : 'منذ %s', + s : 'ثوان', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + preparse: function (string) { + return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return numberMap[match]; + }).replace(/ØŒ/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, 'ØŒ'); + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ar-tn.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ar-tn.js new file mode 100644 index 0000000..b1ddb4f --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ar-tn.js @@ -0,0 +1,55 @@ +// moment.js locale configuration +// locale : Tunisian Arabic (ar-tn) + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ar-tn', { + months: 'جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + monthsShort: 'جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin: 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS: 'LT:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd D MMMM YYYY LT' + }, + calendar: { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'ÙÙŠ %s', + past: 'منذ %s', + s: 'ثوان', + m: 'دقيقة', + mm: '%d دقائق', + h: 'ساعة', + hh: '%d ساعات', + d: 'يوم', + dd: '%d أيام', + M: 'شهر', + MM: '%d أشهر', + y: 'سنة', + yy: '%d سنوات' + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ar.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ar.js new file mode 100644 index 0000000..828e618 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ar.js @@ -0,0 +1,134 @@ +// moment.js locale configuration +// Locale: Arabic (ar) +// Author: Abdel Said: https://github.com/abdelsaid +// Changes in months, weekdays: Ahmed Elkhatib +// Native plural forms: forabi https://github.com/forabi + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': 'Ù¡', + '2': 'Ù¢', + '3': 'Ù£', + '4': 'Ù¤', + '5': 'Ù¥', + '6': 'Ù¦', + '7': 'Ù§', + '8': 'Ù¨', + '9': 'Ù©', + '0': 'Ù ' + }, numberMap = { + 'Ù¡': '1', + 'Ù¢': '2', + 'Ù£': '3', + 'Ù¤': '4', + 'Ù¥': '5', + 'Ù¦': '6', + 'Ù§': '7', + 'Ù¨': '8', + 'Ù©': '9', + 'Ù ': '0' + }, pluralForm = function (n) { + return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5; + }, plurals = { + s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'], + m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'], + h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'], + d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'], + M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'], + y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام'] + }, pluralize = function (u) { + return function (number, withoutSuffix, string, isFuture) { + var f = pluralForm(number), + str = plurals[u][pluralForm(number)]; + if (f === 2) { + str = str[withoutSuffix ? 0 : 1]; + } + return str.replace(/%d/i, number); + }; + }, months = [ + 'كانون الثاني يناير', + 'شباط Ùبراير', + 'آذار مارس', + 'نيسان أبريل', + 'أيار مايو', + 'حزيران يونيو', + 'تموز يوليو', + 'آب أغسطس', + 'أيلول سبتمبر', + 'تشرين الأول أكتوبر', + 'تشرين الثاني نوÙمبر', + 'كانون الأول ديسمبر' + ]; + + return moment.defineLocale('ar', { + months : months, + monthsShort : months, + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + meridiemParse: /ص|Ù…/, + isPM : function (input) { + return 'Ù…' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'Ù…'; + } + }, + calendar : { + sameDay: '[اليوم عند الساعة] LT', + nextDay: '[غدًا عند الساعة] LT', + nextWeek: 'dddd [عند الساعة] LT', + lastDay: '[أمس عند الساعة] LT', + lastWeek: 'dddd [عند الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'بعد %s', + past : 'منذ %s', + s : pluralize('s'), + m : pluralize('m'), + mm : pluralize('m'), + h : pluralize('h'), + hh : pluralize('h'), + d : pluralize('d'), + dd : pluralize('d'), + M : pluralize('M'), + MM : pluralize('M'), + y : pluralize('y'), + yy : pluralize('y') + }, + preparse: function (string) { + return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return numberMap[match]; + }).replace(/ØŒ/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, 'ØŒ'); + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/az.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/az.js new file mode 100644 index 0000000..7624fee --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/az.js @@ -0,0 +1,107 @@ +// moment.js locale configuration +// locale : azerbaijani (az) +// author : topchiyev : https://github.com/topchiyev + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var suffixes = { + 1: '-inci', + 5: '-inci', + 8: '-inci', + 70: '-inci', + 80: '-inci', + + 2: '-nci', + 7: '-nci', + 20: '-nci', + 50: '-nci', + + 3: '-üncü', + 4: '-üncü', + 100: '-üncü', + + 6: '-ncı', + + 9: '-uncu', + 10: '-uncu', + 30: '-uncu', + + 60: '-ıncı', + 90: '-ıncı' + }; + return moment.defineLocale('az', { + months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'), + monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'), + weekdays : 'Bazar_Bazar ertÉ™si_ÇərÅŸÉ™nbÉ™ axÅŸamı_ÇərÅŸÉ™nbÉ™_CümÉ™ axÅŸamı_CümÉ™_ŞənbÉ™'.split('_'), + weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'), + weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[bugün saat] LT', + nextDay : '[sabah saat] LT', + nextWeek : '[gÉ™lÉ™n hÉ™ftÉ™] dddd [saat] LT', + lastDay : '[dünÉ™n] LT', + lastWeek : '[keçən hÉ™ftÉ™] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s sonra', + past : '%s É™vvÉ™l', + s : 'birneçə saniyyÉ™', + m : 'bir dÉ™qiqÉ™', + mm : '%d dÉ™qiqÉ™', + h : 'bir saat', + hh : '%d saat', + d : 'bir gün', + dd : '%d gün', + M : 'bir ay', + MM : '%d ay', + y : 'bir il', + yy : '%d il' + }, + meridiemParse: /gecÉ™|sÉ™hÉ™r|gündüz|axÅŸam/, + isPM : function (input) { + return /^(gündüz|axÅŸam)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'gecÉ™'; + } else if (hour < 12) { + return 'sÉ™hÉ™r'; + } else if (hour < 17) { + return 'gündüz'; + } else { + return 'axÅŸam'; + } + }, + ordinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/, + ordinal : function (number) { + if (number === 0) { // special case for zero + return number + '-ıncı'; + } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + + return number + (suffixes[a] || suffixes[b] || suffixes[c]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/be.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/be.js new file mode 100644 index 0000000..d888e21 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/be.js @@ -0,0 +1,154 @@ +// moment.js locale configuration +// locale : belarusian (be) +// author : Dmitry Demidov : https://github.com/demidov91 +// author: Praleska: http://praleska.pro/ +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін', + 'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін', + 'dd': 'дзень_дні_дзён', + 'MM': 'меÑÑц_меÑÑцы_меÑÑцаў', + 'yy': 'год_гады_гадоў' + }; + if (key === 'm') { + return withoutSuffix ? 'хвіліна' : 'хвіліну'; + } + else if (key === 'h') { + return withoutSuffix ? 'гадзіна' : 'гадзіну'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñтудзень_люты_Ñакавік_краÑавік_травень_чÑрвень_ліпень_жнівень_вераÑень_каÑтрычнік_ліÑтапад_Ñнежань'.split('_'), + 'accusative': 'ÑтудзенÑ_лютага_Ñакавіка_краÑавіка_траўнÑ_чÑрвенÑ_ліпенÑ_жніўнÑ_вераÑнÑ_каÑтрычніка_ліÑтапада_ÑнежнÑ'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'нÑдзелÑ_панÑдзелак_аўторак_Ñерада_чацвер_пÑтніца_Ñубота'.split('_'), + 'accusative': 'нÑдзелю_панÑдзелак_аўторак_Ñераду_чацвер_пÑтніцу_Ñуботу'.split('_') + }, + + nounCase = (/\[ ?[Вв] ?(?:мінулую|наÑтупную)? ?\] ?dddd/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.defineLocale('be', { + months : monthsCaseReplace, + monthsShort : 'Ñтуд_лют_Ñак_краÑ_трав_чÑрв_ліп_жнів_вер_каÑÑ‚_ліÑÑ‚_Ñнеж'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'нд_пн_ат_ÑÑ€_чц_пт_Ñб'.split('_'), + weekdaysMin : 'нд_пн_ат_ÑÑ€_чц_пт_Ñб'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY г.', + LLL : 'D MMMM YYYY г., LT', + LLLL : 'dddd, D MMMM YYYY г., LT' + }, + calendar : { + sameDay: '[Ð¡Ñ‘Ð½Ð½Ñ Ñž] LT', + nextDay: '[Заўтра Ñž] LT', + lastDay: '[Учора Ñž] LT', + nextWeek: function () { + return '[У] dddd [Ñž] LT'; + }, + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return '[У мінулую] dddd [Ñž] LT'; + case 1: + case 2: + case 4: + return '[У мінулы] dddd [Ñž] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'праз %s', + past : '%s таму', + s : 'некалькі Ñекунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : relativeTimeWithPlural, + hh : relativeTimeWithPlural, + d : 'дзень', + dd : relativeTimeWithPlural, + M : 'меÑÑц', + MM : relativeTimeWithPlural, + y : 'год', + yy : relativeTimeWithPlural + }, + meridiemParse: /ночы|раніцы|днÑ|вечара/, + isPM : function (input) { + return /^(днÑ|вечара)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночы'; + } else if (hour < 12) { + return 'раніцы'; + } else if (hour < 17) { + return 'днÑ'; + } else { + return 'вечара'; + } + }, + + ordinalParse: /\d{1,2}-(Ñ–|Ñ‹|га)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-Ñ–' : number + '-Ñ‹'; + case 'D': + return number + '-га'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/bg.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/bg.js new file mode 100644 index 0000000..540e17b --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/bg.js @@ -0,0 +1,88 @@ +// moment.js locale configuration +// locale : bulgarian (bg) +// author : Krasen Borisov : https://github.com/kraz + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('bg', { + months : 'Ñнуари_февруари_март_април_май_юни_юли_авгуÑÑ‚_Ñептември_октомври_ноември_декември'.split('_'), + monthsShort : 'Ñнр_фев_мар_апр_май_юни_юли_авг_Ñеп_окт_ное_дек'.split('_'), + weekdays : 'неделÑ_понеделник_вторник_ÑÑ€Ñда_четвъртък_петък_Ñъбота'.split('_'), + weekdaysShort : 'нед_пон_вто_ÑÑ€Ñ_чет_пет_Ñъб'.split('_'), + weekdaysMin : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'D.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Ð”Ð½ÐµÑ Ð²] LT', + nextDay : '[Утре в] LT', + nextWeek : 'dddd [в] LT', + lastDay : '[Вчера в] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[Ð’ изминалата] dddd [в] LT'; + case 1: + case 2: + case 4: + case 5: + return '[Ð’ изминалиÑ] dddd [в] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'Ñлед %s', + past : 'преди %s', + s : 'нÑколко Ñекунди', + m : 'минута', + mm : '%d минути', + h : 'чаÑ', + hh : '%d чаÑа', + d : 'ден', + dd : '%d дни', + M : 'меÑец', + MM : '%d меÑеца', + y : 'година', + yy : '%d години' + }, + ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/bn.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/bn.js new file mode 100644 index 0000000..5b4ab51 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/bn.js @@ -0,0 +1,111 @@ +// moment.js locale configuration +// locale : Bengali (bn) +// author : Kaushik Gandhi : https://github.com/kaushikgandhi + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': '১', + '2': '২', + '3': '৩', + '4': '৪', + '5': '৫', + '6': '৬', + '7': '৭', + '8': '৮', + '9': '৯', + '0': '০' + }, + numberMap = { + '১': '1', + '২': '2', + '৩': '3', + '৪': '4', + '৫': '5', + '৬': '6', + '৭': '7', + '৮': '8', + '৯': '9', + '০': '0' + }; + + return moment.defineLocale('bn', { + months : 'জানà§à§Ÿà¦¾à¦°à§€_ফেবà§à§Ÿà¦¾à¦°à§€_মারà§à¦š_à¦à¦ªà§à¦°à¦¿à¦²_মে_জà§à¦¨_জà§à¦²à¦¾à¦‡_অগাসà§à¦Ÿ_সেপà§à¦Ÿà§‡à¦®à§à¦¬à¦°_অকà§à¦Ÿà§‹à¦¬à¦°_নভেমà§à¦¬à¦°_ডিসেমà§à¦¬à¦°'.split('_'), + monthsShort : 'জানà§_ফেব_মারà§à¦š_à¦à¦ªà¦°_মে_জà§à¦¨_জà§à¦²_অগ_সেপà§à¦Ÿ_অকà§à¦Ÿà§‹_নভ_ডিসেমà§'.split('_'), + weekdays : 'রবিবার_সোমবার_মঙà§à¦—লবার_বà§à¦§à¦¬à¦¾à¦°_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿à¦¬à¦¾à¦°_শà§à¦•à§à¦°à§à¦¬à¦¾à¦°_শনিবার'.split('_'), + weekdaysShort : 'রবি_সোম_মঙà§à¦—ল_বà§à¦§_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿_শà§à¦•à§à¦°à§_শনি'.split('_'), + weekdaysMin : 'রব_সম_মঙà§à¦—_বà§_বà§à¦°à¦¿à¦¹_শà§_শনি'.split('_'), + longDateFormat : { + LT : 'A h:mm সময়', + LTS : 'A h:mm:ss সময়', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[আজ] LT', + nextDay : '[আগামীকাল] LT', + nextWeek : 'dddd, LT', + lastDay : '[গতকাল] LT', + lastWeek : '[গত] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s পরে', + past : '%s আগে', + s : 'কà¦à¦• সেকেনà§à¦¡', + m : 'à¦à¦• মিনিট', + mm : '%d মিনিট', + h : 'à¦à¦• ঘনà§à¦Ÿà¦¾', + hh : '%d ঘনà§à¦Ÿà¦¾', + d : 'à¦à¦• দিন', + dd : '%d দিন', + M : 'à¦à¦• মাস', + MM : '%d মাস', + y : 'à¦à¦• বছর', + yy : '%d বছর' + }, + preparse: function (string) { + return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /রাত|শকাল|দà§à¦ªà§à¦°|বিকেল|রাত/, + isPM: function (input) { + return /^(দà§à¦ªà§à¦°|বিকেল|রাত)$/.test(input); + }, + //Bengali is a vast language its spoken + //in different forms in various parts of the world. + //I have just generalized with most common one used + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'রাত'; + } else if (hour < 10) { + return 'শকাল'; + } else if (hour < 17) { + return 'দà§à¦ªà§à¦°'; + } else if (hour < 20) { + return 'বিকেল'; + } else { + return 'রাত'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/bo.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/bo.js new file mode 100644 index 0000000..b8e7001 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/bo.js @@ -0,0 +1,108 @@ +// moment.js locale configuration +// locale : tibetan (bo) +// author : Thupten N. Chakrishar : https://github.com/vajradog + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': '༡', + '2': '༢', + '3': '༣', + '4': '༤', + '5': '༥', + '6': '༦', + '7': '༧', + '8': '༨', + '9': '༩', + '0': '༠' + }, + numberMap = { + '༡': '1', + '༢': '2', + '༣': '3', + '༤': '4', + '༥': '5', + '༦': '6', + '༧': '7', + '༨': '8', + '༩': '9', + '༠': '0' + }; + + return moment.defineLocale('bo', { + months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), + monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), + weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'), + weekdaysShort : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), + weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), + longDateFormat : { + LT : 'A h:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[དི་རིང] LT', + nextDay : '[སང་ཉིན] LT', + nextWeek : '[བདུན་ཕྲག་རྗེས་མ], LT', + lastDay : '[à½à¼‹à½¦à½„] LT', + lastWeek : '[བདུན་ཕྲག་མà½à½ à¼‹à½˜] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s ལ་', + past : '%s སྔན་ལ', + s : 'ལམ་སང', + m : 'སà¾à½¢à¼‹à½˜à¼‹à½‚ཅིག', + mm : '%d སà¾à½¢à¼‹à½˜', + h : 'ཆུ་ཚོད་གཅིག', + hh : '%d ཆུ་ཚོད', + d : 'ཉིན་གཅིག', + dd : '%d ཉིན་', + M : 'ཟླ་བ་གཅིག', + MM : '%d ཟླ་བ', + y : 'ལོ་གཅིག', + yy : '%d ལོ' + }, + preparse: function (string) { + return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/, + isPM: function (input) { + return /^(ཉིན་གུང|དགོང་དག|མཚན་མོ)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'མཚན་མོ'; + } else if (hour < 10) { + return 'ཞོགས་ཀས'; + } else if (hour < 17) { + return 'ཉིན་གུང'; + } else if (hour < 20) { + return 'དགོང་དག'; + } else { + return 'མཚན་མོ'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/br.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/br.js new file mode 100644 index 0000000..1f8dd61 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/br.js @@ -0,0 +1,109 @@ +// moment.js locale configuration +// locale : breton (br) +// author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function relativeTimeWithMutation(number, withoutSuffix, key) { + var format = { + 'mm': 'munutenn', + 'MM': 'miz', + 'dd': 'devezh' + }; + return number + ' ' + mutation(format[key], number); + } + + function specialMutationForYears(number) { + switch (lastNumber(number)) { + case 1: + case 3: + case 4: + case 5: + case 9: + return number + ' bloaz'; + default: + return number + ' vloaz'; + } + } + + function lastNumber(number) { + if (number > 9) { + return lastNumber(number % 10); + } + return number; + } + + function mutation(text, number) { + if (number === 2) { + return softMutation(text); + } + return text; + } + + function softMutation(text) { + var mutationTable = { + 'm': 'v', + 'b': 'v', + 'd': 'z' + }; + if (mutationTable[text.charAt(0)] === undefined) { + return text; + } + return mutationTable[text.charAt(0)] + text.substring(1); + } + + return moment.defineLocale('br', { + months : 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'), + monthsShort : 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'), + weekdays : 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'), + weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'), + weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'), + longDateFormat : { + LT : 'h[e]mm A', + LTS : 'h[e]mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D [a viz] MMMM YYYY', + LLL : 'D [a viz] MMMM YYYY LT', + LLLL : 'dddd, D [a viz] MMMM YYYY LT' + }, + calendar : { + sameDay : '[Hiziv da] LT', + nextDay : '[Warc\'hoazh da] LT', + nextWeek : 'dddd [da] LT', + lastDay : '[Dec\'h da] LT', + lastWeek : 'dddd [paset da] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'a-benn %s', + past : '%s \'zo', + s : 'un nebeud segondennoù', + m : 'ur vunutenn', + mm : relativeTimeWithMutation, + h : 'un eur', + hh : '%d eur', + d : 'un devezh', + dd : relativeTimeWithMutation, + M : 'ur miz', + MM : relativeTimeWithMutation, + y : 'ur bloaz', + yy : specialMutationForYears + }, + ordinalParse: /\d{1,2}(añ|vet)/, + ordinal : function (number) { + var output = (number === 1) ? 'añ' : 'vet'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/bs.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/bs.js new file mode 100644 index 0000000..c59f46b --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/bs.js @@ -0,0 +1,140 @@ +// moment.js locale configuration +// locale : bosnian (bs) +// author : Nedim Cholich : https://github.com/frontyard +// based on (hr) translation by Bojan Marković + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } + } + + return moment.defineLocale('bs', { + months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'), + monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'), + weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota'.split('_'), + weekdaysShort : 'ned._pon._uto._sri._Äet._pet._sub.'.split('_'), + weekdaysMin : 'ne_po_ut_sr_Äe_pe_su'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD. MM. YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[proÅ¡lu] dddd [u] LT'; + case 6: + return '[proÅ¡le] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[proÅ¡li] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'par sekundi', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'dan', + dd : translate, + M : 'mjesec', + MM : translate, + y : 'godinu', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ca.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ca.js new file mode 100644 index 0000000..4f0d3fe --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ca.js @@ -0,0 +1,77 @@ +// moment.js locale configuration +// locale : catalan (ca) +// author : Juan G. Hurtado : https://github.com/juanghurtado + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ca', { + months : 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'), + monthsShort : 'gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.'.split('_'), + weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'), + weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'), + weekdaysMin : 'Dg_Dl_Dt_Dc_Dj_Dv_Ds'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay : function () { + return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextDay : function () { + return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastDay : function () { + return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'fa %s', + s : 'uns segons', + m : 'un minut', + mm : '%d minuts', + h : 'una hora', + hh : '%d hores', + d : 'un dia', + dd : '%d dies', + M : 'un mes', + MM : '%d mesos', + y : 'un any', + yy : '%d anys' + }, + ordinalParse: /\d{1,2}(r|n|t|è|a)/, + ordinal : function (number, period) { + var output = (number === 1) ? 'r' : + (number === 2) ? 'n' : + (number === 3) ? 'r' : + (number === 4) ? 't' : 'è'; + if (period === 'w' || period === 'W') { + output = 'a'; + } + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/cs.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/cs.js new file mode 100644 index 0000000..b61658d --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/cs.js @@ -0,0 +1,157 @@ +// moment.js locale configuration +// locale : czech (cs) +// author : petrbela : https://github.com/petrbela + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var months = 'leden_únor_bÅ™ezen_duben_kvÄ›ten_Äerven_Äervenec_srpen_září_říjen_listopad_prosinec'.split('_'), + monthsShort = 'led_úno_bÅ™e_dub_kvÄ›_Ävn_Ävc_srp_zář_říj_lis_pro'.split('_'); + + function plural(n) { + return (n > 1) && (n < 5) && (~~(n / 10) !== 1); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami'; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minuty' : 'minut'); + } else { + return result + 'minutami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodin'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'den' : 'dnem'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dny' : 'dní'); + } else { + return result + 'dny'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mÄ›síc' : 'mÄ›sícem'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'mÄ›síce' : 'mÄ›síců'); + } else { + return result + 'mÄ›síci'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokem'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'let'); + } else { + return result + 'lety'; + } + break; + } + } + + return moment.defineLocale('cs', { + months : months, + monthsShort : monthsShort, + monthsParse : (function (months, monthsShort) { + var i, _monthsParse = []; + for (i = 0; i < 12; i++) { + // use custom parser to solve problem with July (Äervenec) + _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); + } + return _monthsParse; + }(months, monthsShort)), + weekdays : 'nedÄ›le_pondÄ›lí_úterý_stÅ™eda_Ätvrtek_pátek_sobota'.split('_'), + weekdaysShort : 'ne_po_út_st_Ät_pá_so'.split('_'), + weekdaysMin : 'ne_po_út_st_Ät_pá_so'.split('_'), + longDateFormat : { + LT: 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[dnes v] LT', + nextDay: '[zítra v] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedÄ›li v] LT'; + case 1: + case 2: + return '[v] dddd [v] LT'; + case 3: + return '[ve stÅ™edu v] LT'; + case 4: + return '[ve Ätvrtek v] LT'; + case 5: + return '[v pátek v] LT'; + case 6: + return '[v sobotu v] LT'; + } + }, + lastDay: '[vÄera v] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulou nedÄ›li v] LT'; + case 1: + case 2: + return '[minulé] dddd [v] LT'; + case 3: + return '[minulou stÅ™edu v] LT'; + case 4: + case 5: + return '[minulý] dddd [v] LT'; + case 6: + return '[minulou sobotu v] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pÅ™ed %s', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse : /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/cv.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/cv.js new file mode 100644 index 0000000..ea8e314 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/cv.js @@ -0,0 +1,61 @@ +// moment.js locale configuration +// locale : chuvash (cv) +// author : Anatoly Mironov : https://github.com/mirontoli + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('cv', { + months : 'кăрлач_нарăÑ_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав'.split('_'), + monthsShort : 'кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш'.split('_'), + weekdays : 'вырÑарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_Ñрнекун_шăматкун'.split('_'), + weekdaysShort : 'выр_тун_ытл_юн_кĕç_Ñрн_шăм'.split('_'), + weekdaysMin : 'вр_тн_Ñ‹Ñ‚_юн_кç_ÑÑ€_шм'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD-MM-YYYY', + LL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]', + LLL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT', + LLLL : 'dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT' + }, + calendar : { + sameDay: '[ПаÑн] LT [Ñехетре]', + nextDay: '[Ыран] LT [Ñехетре]', + lastDay: '[Ĕнер] LT [Ñехетре]', + nextWeek: '[ÇитеÑ] dddd LT [Ñехетре]', + lastWeek: '[Иртнĕ] dddd LT [Ñехетре]', + sameElse: 'L' + }, + relativeTime : { + future : function (output) { + var affix = /Ñехет$/i.exec(output) ? 'рен' : /çул$/i.exec(output) ? 'тан' : 'ран'; + return output + affix; + }, + past : '%s каÑлла', + s : 'пĕр-ик çеккунт', + m : 'пĕр минут', + mm : '%d минут', + h : 'пĕр Ñехет', + hh : '%d Ñехет', + d : 'пĕр кун', + dd : '%d кун', + M : 'пĕр уйăх', + MM : '%d уйăх', + y : 'пĕр çул', + yy : '%d çул' + }, + ordinalParse: /\d{1,2}-мĕш/, + ordinal : '%d-мĕш', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/cy.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/cy.js new file mode 100644 index 0000000..72b2f91 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/cy.js @@ -0,0 +1,79 @@ +// moment.js locale configuration +// locale : Welsh (cy) +// author : Robert Allen + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('cy', { + months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'), + monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'), + weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'), + weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'), + weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'), + // time formats are the same as en-gb + longDateFormat: { + LT: 'HH:mm', + LTS : 'LT:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd, D MMMM YYYY LT' + }, + calendar: { + sameDay: '[Heddiw am] LT', + nextDay: '[Yfory am] LT', + nextWeek: 'dddd [am] LT', + lastDay: '[Ddoe am] LT', + lastWeek: 'dddd [diwethaf am] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'mewn %s', + past: '%s yn ôl', + s: 'ychydig eiliadau', + m: 'munud', + mm: '%d munud', + h: 'awr', + hh: '%d awr', + d: 'diwrnod', + dd: '%d diwrnod', + M: 'mis', + MM: '%d mis', + y: 'blwyddyn', + yy: '%d flynedd' + }, + ordinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/, + // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh + ordinal: function (number) { + var b = number, + output = '', + lookup = [ + '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed + 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed + ]; + + if (b > 20) { + if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) { + output = 'fed'; // not 30ain, 70ain or 90ain + } else { + output = 'ain'; + } + } else if (b > 0) { + output = lookup[b]; + } + + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/da.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/da.js new file mode 100644 index 0000000..686ce00 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/da.js @@ -0,0 +1,58 @@ +// moment.js locale configuration +// locale : danish (da) +// author : Ulrik Nielsen : https://github.com/mrbase + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('da', { + months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), + weekdaysShort : 'søn_man_tir_ons_tor_fre_lør'.split('_'), + weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd [d.] D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[I dag kl.] LT', + nextDay : '[I morgen kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[I gÃ¥r kl.] LT', + lastWeek : '[sidste] dddd [kl] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'om %s', + past : '%s siden', + s : 'fÃ¥ sekunder', + m : 'et minut', + mm : '%d minutter', + h : 'en time', + hh : '%d timer', + d : 'en dag', + dd : '%d dage', + M : 'en mÃ¥ned', + MM : '%d mÃ¥neder', + y : 'et Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/de-at.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/de-at.js new file mode 100644 index 0000000..c982638 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/de-at.js @@ -0,0 +1,74 @@ +// moment.js locale configuration +// locale : austrian german (de-at) +// author : lluchs : https://github.com/lluchs +// author: Menelion Elensúle: https://github.com/Oire +// author : Martin Groller : https://github.com/MadMG + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + return moment.defineLocale('de-at', { + months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[Heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[Morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[Gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/de.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/de.js new file mode 100644 index 0000000..f6d89a9 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/de.js @@ -0,0 +1,73 @@ +// moment.js locale configuration +// locale : german (de) +// author : lluchs : https://github.com/lluchs +// author: Menelion Elensúle: https://github.com/Oire + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + return moment.defineLocale('de', { + months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[Heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[Morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[Gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/el.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/el.js new file mode 100644 index 0000000..6dc769e --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/el.js @@ -0,0 +1,94 @@ +// moment.js locale configuration +// locale : modern greek (el) +// author : Aggelos Karalias : https://github.com/mehiel + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('el', { + monthsNominativeEl : 'ΙανουάÏιος_ΦεβÏουάÏιος_ΜάÏτιος_ΑπÏίλιος_Μάιος_ΙοÏνιος_ΙοÏλιος_ΑÏγουστος_ΣεπτέμβÏιος_ΟκτώβÏιος_ÎοέμβÏιος_ΔεκέμβÏιος'.split('_'), + monthsGenitiveEl : 'ΙανουαÏίου_ΦεβÏουαÏίου_ΜαÏτίου_ΑπÏιλίου_ΜαÎου_Ιουνίου_Ιουλίου_ΑυγοÏστου_ΣεπτεμβÏίου_ΟκτωβÏίου_ÎοεμβÏίου_ΔεκεμβÏίου'.split('_'), + months : function (momentToFormat, format) { + if (/D/.test(format.substring(0, format.indexOf('MMMM')))) { // if there is a day number before 'MMMM' + return this._monthsGenitiveEl[momentToFormat.month()]; + } else { + return this._monthsNominativeEl[momentToFormat.month()]; + } + }, + monthsShort : 'Ιαν_Φεβ_ΜαÏ_ΑπÏ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Îοε_Δεκ'.split('_'), + weekdays : 'ΚυÏιακή_ΔευτέÏα_ΤÏίτη_ΤετάÏτη_Πέμπτη_ΠαÏασκευή_Σάββατο'.split('_'), + weekdaysShort : 'ΚυÏ_Δευ_ΤÏι_Τετ_Πεμ_ΠαÏ_Σαβ'.split('_'), + weekdaysMin : 'Κυ_Δε_ΤÏ_Τε_Πε_Πα_Σα'.split('_'), + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'μμ' : 'ΜΜ'; + } else { + return isLower ? 'πμ' : 'ΠΜ'; + } + }, + isPM : function (input) { + return ((input + '').toLowerCase()[0] === 'μ'); + }, + meridiemParse : /[ΠΜ]\.?Îœ?\.?/i, + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendarEl : { + sameDay : '[ΣήμεÏα {}] LT', + nextDay : '[ΑÏÏιο {}] LT', + nextWeek : 'dddd [{}] LT', + lastDay : '[Χθες {}] LT', + lastWeek : function () { + switch (this.day()) { + case 6: + return '[το Ï€ÏοηγοÏμενο] dddd [{}] LT'; + default: + return '[την Ï€ÏοηγοÏμενη] dddd [{}] LT'; + } + }, + sameElse : 'L' + }, + calendar : function (key, mom) { + var output = this._calendarEl[key], + hours = mom && mom.hours(); + + if (typeof output === 'function') { + output = output.apply(mom); + } + + return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις')); + }, + relativeTime : { + future : 'σε %s', + past : '%s Ï€Ïιν', + s : 'λίγα δευτεÏόλεπτα', + m : 'ένα λεπτό', + mm : '%d λεπτά', + h : 'μία ÏŽÏα', + hh : '%d ÏŽÏες', + d : 'μία μέÏα', + dd : '%d μέÏες', + M : 'ένας μήνας', + MM : '%d μήνες', + y : 'ένας χÏόνος', + yy : '%d χÏόνια' + }, + ordinalParse: /\d{1,2}η/, + ordinal: '%dη', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/en-au.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/en-au.js new file mode 100644 index 0000000..a382b0a --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/en-au.js @@ -0,0 +1,64 @@ +// moment.js locale configuration +// locale : australian english (en-au) + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('en-au', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + 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' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/en-ca.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/en-ca.js new file mode 100644 index 0000000..2dec8a6 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/en-ca.js @@ -0,0 +1,61 @@ +// moment.js locale configuration +// locale : canadian english (en-ca) +// author : Jonathan Abourbih : https://github.com/jonbca + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('en-ca', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'YYYY-MM-DD', + LL : 'D MMMM, YYYY', + LLL : 'D MMMM, YYYY LT', + LLLL : 'dddd, D MMMM, YYYY LT' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + 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' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/en-gb.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/en-gb.js new file mode 100644 index 0000000..4ea2b29 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/en-gb.js @@ -0,0 +1,65 @@ +// moment.js locale configuration +// locale : great britain english (en-gb) +// author : Chris Gedrim : https://github.com/chrisgedrim + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('en-gb', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + 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' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/eo.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/eo.js new file mode 100644 index 0000000..9e3d045 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/eo.js @@ -0,0 +1,71 @@ +// moment.js locale configuration +// locale : esperanto (eo) +// author : Colin Dean : https://github.com/colindean +// komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko. +// Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni! + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('eo', { + months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aÅ­gusto_septembro_oktobro_novembro_decembro'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aÅ­g_sep_okt_nov_dec'.split('_'), + weekdays : 'Dimanĉo_Lundo_Mardo_Merkredo_Ä´aÅ­do_Vendredo_Sabato'.split('_'), + weekdaysShort : 'Dim_Lun_Mard_Merk_Ä´aÅ­_Ven_Sab'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Ä´a_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'D[-an de] MMMM, YYYY', + LLL : 'D[-an de] MMMM, YYYY LT', + LLLL : 'dddd, [la] D[-an de] MMMM, YYYY LT' + }, + meridiemParse: /[ap]\.t\.m/i, + isPM: function (input) { + return input.charAt(0).toLowerCase() === 'p'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'p.t.m.' : 'P.T.M.'; + } else { + return isLower ? 'a.t.m.' : 'A.T.M.'; + } + }, + calendar : { + sameDay : '[HodiaÅ­ je] LT', + nextDay : '[MorgaÅ­ je] LT', + nextWeek : 'dddd [je] LT', + lastDay : '[HieraÅ­ je] LT', + lastWeek : '[pasinta] dddd [je] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'je %s', + past : 'antaÅ­ %s', + s : 'sekundoj', + m : 'minuto', + mm : '%d minutoj', + h : 'horo', + hh : '%d horoj', + d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo + dd : '%d tagoj', + M : 'monato', + MM : '%d monatoj', + y : 'jaro', + yy : '%d jaroj' + }, + ordinalParse: /\d{1,2}a/, + ordinal : '%da', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/es.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/es.js new file mode 100644 index 0000000..b6e30b1 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/es.js @@ -0,0 +1,77 @@ +// moment.js locale configuration +// locale : spanish (es) +// author : Julio Napurí : https://github.com/julionc + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), + monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); + + return moment.defineLocale('es', { + months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return monthsShort[m.month()]; + } else { + return monthsShortDot[m.month()]; + } + }, + weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), + weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), + weekdaysMin : 'Do_Lu_Ma_Mi_Ju_Vi_Sá'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY LT', + LLLL : 'dddd, D [de] MMMM [de] YYYY LT' + }, + calendar : { + sameDay : function () { + return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextDay : function () { + return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastDay : function () { + return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'hace %s', + s : 'unos segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'una hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un año', + yy : '%d años' + }, + ordinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/et.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/et.js new file mode 100644 index 0000000..7dbcee7 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/et.js @@ -0,0 +1,78 @@ +// moment.js locale configuration +// locale : estonian (et) +// author : Henry Kehlmann : https://github.com/madhenry +// improvements : Illimar Tambek : https://github.com/ragulka + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'], + 'm' : ['ühe minuti', 'üks minut'], + 'mm': [number + ' minuti', number + ' minutit'], + 'h' : ['ühe tunni', 'tund aega', 'üks tund'], + 'hh': [number + ' tunni', number + ' tundi'], + 'd' : ['ühe päeva', 'üks päev'], + 'M' : ['kuu aja', 'kuu aega', 'üks kuu'], + 'MM': [number + ' kuu', number + ' kuud'], + 'y' : ['ühe aasta', 'aasta', 'üks aasta'], + 'yy': [number + ' aasta', number + ' aastat'] + }; + if (withoutSuffix) { + return format[key][2] ? format[key][2] : format[key][1]; + } + return isFuture ? format[key][0] : format[key][1]; + } + + return moment.defineLocale('et', { + months : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'), + monthsShort : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'), + weekdays : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'), + weekdaysShort : 'P_E_T_K_N_R_L'.split('_'), + weekdaysMin : 'P_E_T_K_N_R_L'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[Täna,] LT', + nextDay : '[Homme,] LT', + nextWeek : '[Järgmine] dddd LT', + lastDay : '[Eile,] LT', + lastWeek : '[Eelmine] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s pärast', + past : '%s tagasi', + s : processRelativeTime, + m : processRelativeTime, + mm : processRelativeTime, + h : processRelativeTime, + hh : processRelativeTime, + d : processRelativeTime, + dd : '%d päeva', + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/eu.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/eu.js new file mode 100644 index 0000000..c455c46 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/eu.js @@ -0,0 +1,62 @@ +// moment.js locale configuration +// locale : euskara (eu) +// author : Eneko Illarramendi : https://github.com/eillarra + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('eu', { + months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'), + monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'), + weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'), + weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'), + weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY[ko] MMMM[ren] D[a]', + LLL : 'YYYY[ko] MMMM[ren] D[a] LT', + LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] LT', + l : 'YYYY-M-D', + ll : 'YYYY[ko] MMM D[a]', + lll : 'YYYY[ko] MMM D[a] LT', + llll : 'ddd, YYYY[ko] MMM D[a] LT' + }, + calendar : { + sameDay : '[gaur] LT[etan]', + nextDay : '[bihar] LT[etan]', + nextWeek : 'dddd LT[etan]', + lastDay : '[atzo] LT[etan]', + lastWeek : '[aurreko] dddd LT[etan]', + sameElse : 'L' + }, + relativeTime : { + future : '%s barru', + past : 'duela %s', + s : 'segundo batzuk', + m : 'minutu bat', + mm : '%d minutu', + h : 'ordu bat', + hh : '%d ordu', + d : 'egun bat', + dd : '%d egun', + M : 'hilabete bat', + MM : '%d hilabete', + y : 'urte bat', + yy : '%d urte' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/fa.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/fa.js new file mode 100644 index 0000000..6d76575 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/fa.js @@ -0,0 +1,103 @@ +// moment.js locale configuration +// locale : Persian (fa) +// author : Ebrahim Byagowi : https://github.com/ebraminio + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': 'Û±', + '2': 'Û²', + '3': 'Û³', + '4': 'Û´', + '5': 'Ûµ', + '6': 'Û¶', + '7': 'Û·', + '8': 'Û¸', + '9': 'Û¹', + '0': 'Û°' + }, numberMap = { + 'Û±': '1', + 'Û²': '2', + 'Û³': '3', + 'Û´': '4', + 'Ûµ': '5', + 'Û¶': '6', + 'Û·': '7', + 'Û¸': '8', + 'Û¹': '9', + 'Û°': '0' + }; + + return moment.defineLocale('fa', { + months : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + monthsShort : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysMin : 'ÛŒ_د_س_Ú†_Ù¾_ج_Ø´'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + meridiemParse: /قبل از ظهر|بعد از ظهر/, + isPM: function (input) { + return /بعد از ظهر/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'قبل از ظهر'; + } else { + return 'بعد از ظهر'; + } + }, + calendar : { + sameDay : '[امروز ساعت] LT', + nextDay : '[Ùردا ساعت] LT', + nextWeek : 'dddd [ساعت] LT', + lastDay : '[دیروز ساعت] LT', + lastWeek : 'dddd [پیش] [ساعت] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'در %s', + past : '%s پیش', + s : 'چندین ثانیه', + m : 'یک دقیقه', + mm : '%d دقیقه', + h : 'یک ساعت', + hh : '%d ساعت', + d : 'یک روز', + dd : '%d روز', + M : 'یک ماه', + MM : '%d ماه', + y : 'یک سال', + yy : '%d سال' + }, + preparse: function (string) { + return string.replace(/[Û°-Û¹]/g, function (match) { + return numberMap[match]; + }).replace(/ØŒ/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, 'ØŒ'); + }, + ordinalParse: /\d{1,2}Ù…/, + ordinal : '%dÙ…', + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/fi.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/fi.js new file mode 100644 index 0000000..f884c3e --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/fi.js @@ -0,0 +1,107 @@ +// moment.js locale configuration +// locale : finnish (fi) +// author : Tarmo Aidantausta : https://github.com/bleadof + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '), + numbersFuture = [ + 'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden', + numbersPast[7], numbersPast[8], numbersPast[9] + ]; + + function translate(number, withoutSuffix, key, isFuture) { + var result = ''; + switch (key) { + case 's': + return isFuture ? 'muutaman sekunnin' : 'muutama sekunti'; + case 'm': + return isFuture ? 'minuutin' : 'minuutti'; + case 'mm': + result = isFuture ? 'minuutin' : 'minuuttia'; + break; + case 'h': + return isFuture ? 'tunnin' : 'tunti'; + case 'hh': + result = isFuture ? 'tunnin' : 'tuntia'; + break; + case 'd': + return isFuture ? 'päivän' : 'päivä'; + case 'dd': + result = isFuture ? 'päivän' : 'päivää'; + break; + case 'M': + return isFuture ? 'kuukauden' : 'kuukausi'; + case 'MM': + result = isFuture ? 'kuukauden' : 'kuukautta'; + break; + case 'y': + return isFuture ? 'vuoden' : 'vuosi'; + case 'yy': + result = isFuture ? 'vuoden' : 'vuotta'; + break; + } + result = verbalNumber(number, isFuture) + ' ' + result; + return result; + } + + function verbalNumber(number, isFuture) { + return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number; + } + + return moment.defineLocale('fi', { + months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'), + monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'), + weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'), + weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'), + weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD.MM.YYYY', + LL : 'Do MMMM[ta] YYYY', + LLL : 'Do MMMM[ta] YYYY, [klo] LT', + LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] LT', + l : 'D.M.YYYY', + ll : 'Do MMM YYYY', + lll : 'Do MMM YYYY, [klo] LT', + llll : 'ddd, Do MMM YYYY, [klo] LT' + }, + calendar : { + sameDay : '[tänään] [klo] LT', + nextDay : '[huomenna] [klo] LT', + nextWeek : 'dddd [klo] LT', + lastDay : '[eilen] [klo] LT', + lastWeek : '[viime] dddd[na] [klo] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s päästä', + past : '%s sitten', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/fo.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/fo.js new file mode 100644 index 0000000..6b940e8 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/fo.js @@ -0,0 +1,58 @@ +// moment.js locale configuration +// locale : faroese (fo) +// author : Ragnar Johannesen : https://github.com/ragnar123 + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('fo', { + months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'), + weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'), + weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D. MMMM, YYYY LT' + }, + calendar : { + sameDay : '[à dag kl.] LT', + nextDay : '[à morgin kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[à gjár kl.] LT', + lastWeek : '[síðstu] dddd [kl] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'um %s', + past : '%s síðani', + s : 'fá sekund', + m : 'ein minutt', + mm : '%d minuttir', + h : 'ein tími', + hh : '%d tímar', + d : 'ein dagur', + dd : '%d dagar', + M : 'ein mánaði', + MM : '%d mánaðir', + y : 'eitt ár', + yy : '%d ár' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/fr-ca.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/fr-ca.js new file mode 100644 index 0000000..6cac1b8 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/fr-ca.js @@ -0,0 +1,56 @@ +// moment.js locale configuration +// locale : canadian french (fr-ca) +// author : Jonathan Abourbih : https://github.com/jonbca + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('fr-ca', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Aujourd\'hui à] LT', + nextDay: '[Demain à] LT', + nextWeek: 'dddd [à] LT', + lastDay: '[Hier à] LT', + lastWeek: 'dddd [dernier à] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + ordinalParse: /\d{1,2}(er|)/, + ordinal : function (number) { + return number + (number === 1 ? 'er' : ''); + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/fr.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/fr.js new file mode 100644 index 0000000..4a7cbcc --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/fr.js @@ -0,0 +1,60 @@ +// moment.js locale configuration +// locale : french (fr) +// author : John Fischer : https://github.com/jfroffice + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('fr', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Aujourd\'hui à] LT', + nextDay: '[Demain à] LT', + nextWeek: 'dddd [à] LT', + lastDay: '[Hier à] LT', + lastWeek: 'dddd [dernier à] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + ordinalParse: /\d{1,2}(er|)/, + ordinal : function (number) { + return number + (number === 1 ? 'er' : ''); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/fy.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/fy.js new file mode 100644 index 0000000..f86c249 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/fy.js @@ -0,0 +1,69 @@ +// moment.js locale configuration +// locale : frisian (fy) +// author : Robin van der Vliet : https://github.com/robin0van0der0v + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'); + + return moment.defineLocale('fy', { + months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'), + weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'), + weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[hjoed om] LT', + nextDay: '[moarn om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[juster om] LT', + lastWeek: '[ôfrûne] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'oer %s', + past : '%s lyn', + s : 'in pear sekonden', + m : 'ien minút', + mm : '%d minuten', + h : 'ien oere', + hh : '%d oeren', + d : 'ien dei', + dd : '%d dagen', + M : 'ien moanne', + MM : '%d moannen', + y : 'ien jier', + yy : '%d jierren' + }, + ordinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/gl.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/gl.js new file mode 100644 index 0000000..5ff9e3f --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/gl.js @@ -0,0 +1,73 @@ +// moment.js locale configuration +// locale : galician (gl) +// author : Juan G. Hurtado : https://github.com/juanghurtado + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('gl', { + months : 'Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro'.split('_'), + monthsShort : 'Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.'.split('_'), + weekdays : 'Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado'.split('_'), + weekdaysShort : 'Dom._Lun._Mar._Mér._Xov._Ven._Sáb.'.split('_'), + weekdaysMin : 'Do_Lu_Ma_Mé_Xo_Ve_Sá'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay : function () { + return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextDay : function () { + return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextWeek : function () { + return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + lastDay : function () { + return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT'; + }, + lastWeek : function () { + return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : function (str) { + if (str === 'uns segundos') { + return 'nuns segundos'; + } + return 'en ' + str; + }, + past : 'hai %s', + s : 'uns segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'unha hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un ano', + yy : '%d anos' + }, + ordinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/he.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/he.js new file mode 100644 index 0000000..d2f4b13 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/he.js @@ -0,0 +1,80 @@ +// moment.js locale configuration +// locale : Hebrew (he) +// author : Tomer Cohen : https://github.com/tomer +// author : Moshe Simantov : https://github.com/DevelopmentIL +// author : Tal Ater : https://github.com/TalAter + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('he', { + months : 'ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר'.split('_'), + monthsShort : 'ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳'.split('_'), + weekdays : 'ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'), + weekdaysShort : '×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'), + weekdaysMin : '×_ב_×’_ד_×”_ו_ש'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [ב]MMMM YYYY', + LLL : 'D [ב]MMMM YYYY LT', + LLLL : 'dddd, D [ב]MMMM YYYY LT', + l : 'D/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY LT', + llll : 'ddd, D MMM YYYY LT' + }, + calendar : { + sameDay : '[×”×™×•× ×‘Ö¾]LT', + nextDay : '[מחר ב־]LT', + nextWeek : 'dddd [בשעה] LT', + lastDay : '[×תמול ב־]LT', + lastWeek : '[ביו×] dddd [×”×חרון בשעה] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'בעוד %s', + past : 'לפני %s', + s : 'מספר שניות', + m : 'דקה', + mm : '%d דקות', + h : 'שעה', + hh : function (number) { + if (number === 2) { + return 'שעתיי×'; + } + return number + ' שעות'; + }, + d : 'יו×', + dd : function (number) { + if (number === 2) { + return 'יומיי×'; + } + return number + ' ימי×'; + }, + M : 'חודש', + MM : function (number) { + if (number === 2) { + return 'חודשיי×'; + } + return number + ' חודשי×'; + }, + y : 'שנה', + yy : function (number) { + if (number === 2) { + return 'שנתיי×'; + } else if (number % 10 === 0 && number !== 10) { + return number + ' שנה'; + } + return number + ' שני×'; + } + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/hi.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/hi.js new file mode 100644 index 0000000..173c4ee --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/hi.js @@ -0,0 +1,121 @@ +// moment.js locale configuration +// locale : hindi (hi) +// author : Mayank Singhal : https://github.com/mayanksinghal + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.defineLocale('hi', { + months : 'जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°'.split('_'), + monthsShort : 'जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.'.split('_'), + weekdays : 'रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split('_'), + weekdaysShort : 'रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split('_'), + weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split('_'), + longDateFormat : { + LT : 'A h:mm बजे', + LTS : 'A h:mm:ss बजे', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[कल] LT', + nextWeek : 'dddd, LT', + lastDay : '[कल] LT', + lastWeek : '[पिछले] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s में', + past : '%s पहले', + s : 'कà¥à¤› ही कà¥à¤·à¤£', + m : 'à¤à¤• मिनट', + mm : '%d मिनट', + h : 'à¤à¤• घंटा', + hh : '%d घंटे', + d : 'à¤à¤• दिन', + dd : '%d दिन', + M : 'à¤à¤• महीने', + MM : '%d महीने', + y : 'à¤à¤• वरà¥à¤·', + yy : '%d वरà¥à¤·' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + // Hindi notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi. + meridiemParse: /रात|सà¥à¤¬à¤¹|दोपहर|शाम/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'रात') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'सà¥à¤¬à¤¹') { + return hour; + } else if (meridiem === 'दोपहर') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'शाम') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'रात'; + } else if (hour < 10) { + return 'सà¥à¤¬à¤¹'; + } else if (hour < 17) { + return 'दोपहर'; + } else if (hour < 20) { + return 'शाम'; + } else { + return 'रात'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/hr.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/hr.js new file mode 100644 index 0000000..65264dc --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/hr.js @@ -0,0 +1,141 @@ +// moment.js locale configuration +// locale : hrvatski (hr) +// author : Bojan Marković : https://github.com/bmarkovic + +// based on (sl) translation by Robert SedovÅ¡ek + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } + } + + return moment.defineLocale('hr', { + months : 'sjeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_'), + monthsShort : 'sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'), + weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota'.split('_'), + weekdaysShort : 'ned._pon._uto._sri._Äet._pet._sub.'.split('_'), + weekdaysMin : 'ne_po_ut_sr_Äe_pe_su'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD. MM. YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[proÅ¡lu] dddd [u] LT'; + case 6: + return '[proÅ¡le] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[proÅ¡li] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'par sekundi', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'dan', + dd : translate, + M : 'mjesec', + MM : translate, + y : 'godinu', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/hu.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/hu.js new file mode 100644 index 0000000..de8cae9 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/hu.js @@ -0,0 +1,111 @@ +// moment.js locale configuration +// locale : hungarian (hu) +// author : Adam Brunner : https://github.com/adambrunner + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var weekEndings = 'vasárnap hétfÅ‘n kedden szerdán csütörtökön pénteken szombaton'.split(' '); + + function translate(number, withoutSuffix, key, isFuture) { + var num = number, + suffix; + + switch (key) { + case 's': + return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce'; + case 'm': + return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'mm': + return num + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'h': + return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'hh': + return num + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'd': + return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'dd': + return num + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'M': + return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'MM': + return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'y': + return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve'); + case 'yy': + return num + (isFuture || withoutSuffix ? ' év' : ' éve'); + } + + return ''; + } + + function week(isFuture) { + return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]'; + } + + return moment.defineLocale('hu', { + months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'), + monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'), + weekdays : 'vasárnap_hétfÅ‘_kedd_szerda_csütörtök_péntek_szombat'.split('_'), + weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'), + weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'YYYY.MM.DD.', + LL : 'YYYY. MMMM D.', + LLL : 'YYYY. MMMM D., LT', + LLLL : 'YYYY. MMMM D., dddd LT' + }, + meridiemParse: /de|du/i, + isPM: function (input) { + return input.charAt(1).toLowerCase() === 'u'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower === true ? 'de' : 'DE'; + } else { + return isLower === true ? 'du' : 'DU'; + } + }, + calendar : { + sameDay : '[ma] LT[-kor]', + nextDay : '[holnap] LT[-kor]', + nextWeek : function () { + return week.call(this, true); + }, + lastDay : '[tegnap] LT[-kor]', + lastWeek : function () { + return week.call(this, false); + }, + sameElse : 'L' + }, + relativeTime : { + future : '%s múlva', + past : '%s', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/hy-am.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/hy-am.js new file mode 100644 index 0000000..6e2de8b --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/hy-am.js @@ -0,0 +1,118 @@ +// moment.js locale configuration +// locale : Armenian (hy-am) +// author : Armendarabyan : https://github.com/armendarabyan + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€_Õ´Õ¡Ö€Õ¿_Õ¡ÕºÖ€Õ«Õ¬_Õ´Õ¡ÕµÕ«Õ½_Õ°Õ¸Ö‚Õ¶Õ«Õ½_Õ°Õ¸Ö‚Õ¬Õ«Õ½_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€'.split('_'), + 'accusative': 'Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€Õ«_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€Õ«_Õ´Õ¡Ö€Õ¿Õ«_Õ¡ÕºÖ€Õ«Õ¬Õ«_Õ´Õ¡ÕµÕ«Õ½Õ«_Õ°Õ¸Ö‚Õ¶Õ«Õ½Õ«_Õ°Õ¸Ö‚Õ¬Õ«Õ½Õ«_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½Õ«_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function monthsShortCaseReplace(m, format) { + var monthsShort = 'Õ°Õ¶Õ¾_ÖƒÕ¿Ö€_Õ´Ö€Õ¿_Õ¡ÕºÖ€_Õ´ÕµÕ½_Õ°Õ¶Õ½_Õ°Õ¬Õ½_Ö…Õ£Õ½_Õ½ÕºÕ¿_Õ°Õ¯Õ¿_Õ¶Õ´Õ¢_Õ¤Õ¯Õ¿'.split('_'); + + return monthsShort[m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = 'Õ¯Õ«Ö€Õ¡Õ¯Õ«_Õ¥Ö€Õ¯Õ¸Ö‚Õ·Õ¡Õ¢Õ©Õ«_Õ¥Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ¹Õ¸Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ°Õ«Õ¶Õ£Õ·Õ¡Õ¢Õ©Õ«_Õ¸Ö‚Ö€Õ¢Õ¡Õ©_Õ·Õ¡Õ¢Õ¡Õ©'.split('_'); + + return weekdays[m.day()]; + } + + return moment.defineLocale('hy-am', { + months : monthsCaseReplace, + monthsShort : monthsShortCaseReplace, + weekdays : weekdaysCaseReplace, + weekdaysShort : 'Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©'.split('_'), + weekdaysMin : 'Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY Õ©.', + LLL : 'D MMMM YYYY Õ©., LT', + LLLL : 'dddd, D MMMM YYYY Õ©., LT' + }, + calendar : { + sameDay: '[Õ¡ÕµÕ½Ö…Ö€] LT', + nextDay: '[Õ¾Õ¡Õ²Õ¨] LT', + lastDay: '[Õ¥Ö€Õ¥Õ¯] LT', + nextWeek: function () { + return 'dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT'; + }, + lastWeek: function () { + return '[Õ¡Õ¶ÖÕ¡Õ®] dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT'; + }, + sameElse: 'L' + }, + relativeTime : { + future : '%s Õ°Õ¥Õ¿Õ¸', + past : '%s Õ¡Õ¼Õ¡Õ»', + s : 'Õ´Õ« Ö„Õ¡Õ¶Õ« Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶', + m : 'Ö€Õ¸ÕºÕ¥', + mm : '%d Ö€Õ¸ÕºÕ¥', + h : 'ÕªÕ¡Õ´', + hh : '%d ÕªÕ¡Õ´', + d : 'Ö…Ö€', + dd : '%d Ö…Ö€', + M : 'Õ¡Õ´Õ«Õ½', + MM : '%d Õ¡Õ´Õ«Õ½', + y : 'Õ¿Õ¡Ö€Õ«', + yy : '%d Õ¿Õ¡Ö€Õ«' + }, + + meridiemParse: /Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡|Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡|ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶/, + isPM: function (input) { + return /^(ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶)$/.test(input); + }, + meridiem : function (hour) { + if (hour < 4) { + return 'Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡'; + } else if (hour < 12) { + return 'Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡'; + } else if (hour < 17) { + return 'ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡'; + } else { + return 'Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶'; + } + }, + + ordinalParse: /\d{1,2}|\d{1,2}-(Õ«Õ¶|Ö€Õ¤)/, + ordinal: function (number, period) { + switch (period) { + case 'DDD': + case 'w': + case 'W': + case 'DDDo': + if (number === 1) { + return number + '-Õ«Õ¶'; + } + return number + '-Ö€Õ¤'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/id.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/id.js new file mode 100644 index 0000000..fe04849 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/id.js @@ -0,0 +1,81 @@ +// moment.js locale configuration +// locale : Bahasa Indonesia (id) +// author : Mohammad Satrio Utomo : https://github.com/tyok +// reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('id', { + months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'), + weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'), + weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'LT.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] LT', + LLLL : 'dddd, D MMMM YYYY [pukul] LT' + }, + meridiemParse: /pagi|siang|sore|malam/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'siang') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'sore' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'siang'; + } else if (hours < 19) { + return 'sore'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Besok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kemarin pukul] LT', + lastWeek : 'dddd [lalu pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lalu', + s : 'beberapa detik', + m : 'semenit', + mm : '%d menit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/is.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/is.js new file mode 100644 index 0000000..21888aa --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/is.js @@ -0,0 +1,126 @@ +// moment.js locale configuration +// locale : icelandic (is) +// author : Hinrik Örn Sigurðsson : https://github.com/hinrik + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function plural(n) { + if (n % 100 === 11) { + return true; + } else if (n % 10 === 1) { + return false; + } + return true; + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': + return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum'; + case 'm': + return withoutSuffix ? 'mínúta' : 'mínútu'; + case 'mm': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum'); + } else if (withoutSuffix) { + return result + 'mínúta'; + } + return result + 'mínútu'; + case 'hh': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum'); + } + return result + 'klukkustund'; + case 'd': + if (withoutSuffix) { + return 'dagur'; + } + return isFuture ? 'dag' : 'degi'; + case 'dd': + if (plural(number)) { + if (withoutSuffix) { + return result + 'dagar'; + } + return result + (isFuture ? 'daga' : 'dögum'); + } else if (withoutSuffix) { + return result + 'dagur'; + } + return result + (isFuture ? 'dag' : 'degi'); + case 'M': + if (withoutSuffix) { + return 'mánuður'; + } + return isFuture ? 'mánuð' : 'mánuði'; + case 'MM': + if (plural(number)) { + if (withoutSuffix) { + return result + 'mánuðir'; + } + return result + (isFuture ? 'mánuði' : 'mánuðum'); + } else if (withoutSuffix) { + return result + 'mánuður'; + } + return result + (isFuture ? 'mánuð' : 'mánuði'); + case 'y': + return withoutSuffix || isFuture ? 'ár' : 'ári'; + case 'yy': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'ár' : 'árum'); + } + return result + (withoutSuffix || isFuture ? 'ár' : 'ári'); + } + } + + return moment.defineLocale('is', { + months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'), + weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'), + weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'), + weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] LT', + LLLL : 'dddd, D. MMMM YYYY [kl.] LT' + }, + calendar : { + sameDay : '[í dag kl.] LT', + nextDay : '[á morgun kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[í gær kl.] LT', + lastWeek : '[síðasta] dddd [kl.] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'eftir %s', + past : 'fyrir %s síðan', + s : translate, + m : translate, + mm : translate, + h : 'klukkustund', + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/it.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/it.js new file mode 100644 index 0000000..9d14714 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/it.js @@ -0,0 +1,68 @@ +// moment.js locale configuration +// locale : italian (it) +// author : Lorenzo : https://github.com/aliem +// author: Mattia Larentis: https://github.com/nostalgiaz + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('it', { + months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'), + monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'), + weekdays : 'Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato'.split('_'), + weekdaysShort : 'Dom_Lun_Mar_Mer_Gio_Ven_Sab'.split('_'), + weekdaysMin : 'D_L_Ma_Me_G_V_S'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Oggi alle] LT', + nextDay: '[Domani alle] LT', + nextWeek: 'dddd [alle] LT', + lastDay: '[Ieri alle] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[la scorsa] dddd [alle] LT'; + default: + return '[lo scorso] dddd [alle] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : function (s) { + return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s; + }, + past : '%s fa', + s : 'alcuni secondi', + m : 'un minuto', + mm : '%d minuti', + h : 'un\'ora', + hh : '%d ore', + d : 'un giorno', + dd : '%d giorni', + M : 'un mese', + MM : '%d mesi', + y : 'un anno', + yy : '%d anni' + }, + ordinalParse : /\d{1,2}º/, + ordinal: '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ja.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ja.js new file mode 100644 index 0000000..1feb202 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ja.js @@ -0,0 +1,63 @@ +// moment.js locale configuration +// locale : japanese (ja) +// author : LI Long : https://github.com/baryon + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ja', { + months : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '日曜日_月曜日_ç«æ›œæ—¥_水曜日_木曜日_金曜日_土曜日'.split('_'), + weekdaysShort : 'æ—¥_月_ç«_æ°´_木_金_土'.split('_'), + weekdaysMin : 'æ—¥_月_ç«_æ°´_木_金_土'.split('_'), + longDateFormat : { + LT : 'Ah時m分', + LTS : 'LTs秒', + L : 'YYYY/MM/DD', + LL : 'YYYYå¹´M月Dæ—¥', + LLL : 'YYYYå¹´M月Dæ—¥LT', + LLLL : 'YYYYå¹´M月Dæ—¥LT dddd' + }, + meridiemParse: /åˆå‰|åˆå¾Œ/i, + isPM : function (input) { + return input === 'åˆå¾Œ'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'åˆå‰'; + } else { + return 'åˆå¾Œ'; + } + }, + calendar : { + sameDay : '[今日] LT', + nextDay : '[明日] LT', + nextWeek : '[æ¥é€±]dddd LT', + lastDay : '[昨日] LT', + lastWeek : '[å‰é€±]dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s後', + past : '%så‰', + s : '数秒', + m : '1分', + mm : '%d分', + h : '1時間', + hh : '%d時間', + d : '1æ—¥', + dd : '%dæ—¥', + M : '1ヶ月', + MM : '%dヶ月', + y : '1å¹´', + yy : '%då¹´' + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ka.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ka.js new file mode 100644 index 0000000..b56e18c --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ka.js @@ -0,0 +1,109 @@ +// moment.js locale configuration +// locale : Georgian (ka) +// author : Irakli Janiashvili : https://github.com/irakli-janiashvili + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'იáƒáƒœáƒ•áƒáƒ áƒ˜_თებერვáƒáƒšáƒ˜_მáƒáƒ áƒ¢áƒ˜_áƒáƒžáƒ áƒ˜áƒšáƒ˜_მáƒáƒ˜áƒ¡áƒ˜_ივნისი_ივლისი_áƒáƒ’ვისტáƒ_სექტემბერი_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი_ნáƒáƒ”მბერი_დეკემბერი'.split('_'), + 'accusative': 'იáƒáƒœáƒ•áƒáƒ áƒ¡_თებერვáƒáƒšáƒ¡_მáƒáƒ áƒ¢áƒ¡_áƒáƒžáƒ áƒ˜áƒšáƒ˜áƒ¡_მáƒáƒ˜áƒ¡áƒ¡_ივნისს_ივლისს_áƒáƒ’ვისტს_სექტემბერს_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერს_ნáƒáƒ”მბერს_დეკემბერს'.split('_') + }, + + nounCase = (/D[oD] *MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'კვირáƒ_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ი_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი_ხუთშáƒáƒ‘áƒáƒ—ი_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი_შáƒáƒ‘áƒáƒ—ი'.split('_'), + 'accusative': 'კვირáƒáƒ¡_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ს_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ს_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ს_ხუთშáƒáƒ‘áƒáƒ—ს_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვს_შáƒáƒ‘áƒáƒ—ს'.split('_') + }, + + nounCase = (/(წინáƒ|შემდეგ)/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.defineLocale('ka', { + months : monthsCaseReplace, + monthsShort : 'იáƒáƒœ_თებ_მáƒáƒ _áƒáƒžáƒ _მáƒáƒ˜_ივნ_ივლ_áƒáƒ’ვ_სექ_áƒáƒ¥áƒ¢_ნáƒáƒ”_დეკ'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'კვი_áƒáƒ áƒ¨_სáƒáƒ›_áƒáƒ—ხ_ხუთ_პáƒáƒ _შáƒáƒ‘'.split('_'), + weekdaysMin : 'კვ_áƒáƒ _სáƒ_áƒáƒ—_ხუ_პáƒ_შáƒ'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[დღეს] LT[-ზე]', + nextDay : '[ხვáƒáƒš] LT[-ზე]', + lastDay : '[გუშინ] LT[-ზე]', + nextWeek : '[შემდეგ] dddd LT[-ზე]', + lastWeek : '[წინáƒ] dddd LT-ზე', + sameElse : 'L' + }, + relativeTime : { + future : function (s) { + return (/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|წელი)/).test(s) ? + s.replace(/ი$/, 'ში') : + s + 'ში'; + }, + past : function (s) { + if ((/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|დღე|თვე)/).test(s)) { + return s.replace(/(ი|ე)$/, 'ის წინ'); + } + if ((/წელი/).test(s)) { + return s.replace(/წელი$/, 'წლის წინ'); + } + }, + s : 'რáƒáƒ›áƒ“ენიმე წáƒáƒ›áƒ˜', + m : 'წუთი', + mm : '%d წუთი', + h : 'სáƒáƒáƒ—ი', + hh : '%d სáƒáƒáƒ—ი', + d : 'დღე', + dd : '%d დღე', + M : 'თვე', + MM : '%d თვე', + y : 'წელი', + yy : '%d წელი' + }, + ordinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/, + ordinal : function (number) { + if (number === 0) { + return number; + } + + if (number === 1) { + return number + '-ლი'; + } + + if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) { + return 'მე-' + number; + } + + return number + '-ე'; + }, + week : { + dow : 1, + doy : 7 + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/km.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/km.js new file mode 100644 index 0000000..8d7b9b8 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/km.js @@ -0,0 +1,56 @@ +// moment.js locale configuration +// locale : khmer (km) +// author : Kruy Vanna : https://github.com/kruyvanna + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('km', { + months: 'មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ'.split('_'), + monthsShort: 'មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ'.split('_'), + weekdays: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), + weekdaysShort: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), + weekdaysMin: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS : 'LT:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd, D MMMM YYYY LT' + }, + calendar: { + sameDay: '[ážáŸ’ងៃនៈ ម៉ោង] LT', + nextDay: '[ស្អែក ម៉ោង] LT', + nextWeek: 'dddd [ម៉ោង] LT', + lastDay: '[ម្សិលមិញ ម៉ោង] LT', + lastWeek: 'dddd [សប្ážáž¶áž áŸáž˜áž»áž“] [ម៉ោង] LT', + sameElse: 'L' + }, + relativeTime: { + future: '%sទៀáž', + past: '%sមុន', + s: 'ប៉ុន្មានវិនាទី', + m: 'មួយនាទី', + mm: '%d នាទី', + h: 'មួយម៉ោង', + hh: '%d ម៉ោង', + d: 'មួយážáŸ’ងៃ', + dd: '%d ážáŸ’ងៃ', + M: 'មួយážáŸ‚', + MM: '%d ážáŸ‚', + y: 'មួយឆ្នាំ', + yy: '%d ឆ្នាំ' + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ko.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ko.js new file mode 100644 index 0000000..8f9396f --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ko.js @@ -0,0 +1,65 @@ +// moment.js locale configuration +// locale : korean (ko) +// +// authors +// +// - Kyungwook, Park : https://github.com/kyungw00k +// - Jeeeyul Lee +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ko', { + months : '1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”'.split('_'), + monthsShort : '1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”'.split('_'), + weekdays : 'ì¼ìš”ì¼_월요ì¼_화요ì¼_수요ì¼_목요ì¼_금요ì¼_토요ì¼'.split('_'), + weekdaysShort : 'ì¼_ì›”_í™”_수_목_금_토'.split('_'), + weekdaysMin : 'ì¼_ì›”_í™”_수_목_금_토'.split('_'), + longDateFormat : { + LT : 'A hì‹œ m분', + LTS : 'A hì‹œ m분 sì´ˆ', + L : 'YYYY.MM.DD', + LL : 'YYYYë…„ MMMM Dì¼', + LLL : 'YYYYë…„ MMMM Dì¼ LT', + LLLL : 'YYYYë…„ MMMM Dì¼ dddd LT' + }, + calendar : { + sameDay : '오늘 LT', + nextDay : 'ë‚´ì¼ LT', + nextWeek : 'dddd LT', + lastDay : 'ì–´ì œ LT', + lastWeek : '지난주 dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s 후', + past : '%s ì „', + s : '몇초', + ss : '%dì´ˆ', + m : 'ì¼ë¶„', + mm : '%d분', + h : '한시간', + hh : '%d시간', + d : '하루', + dd : '%dì¼', + M : '한달', + MM : '%d달', + y : 'ì¼ë…„', + yy : '%dë…„' + }, + ordinalParse : /\d{1,2}ì¼/, + ordinal : '%dì¼', + meridiemParse : /오전|오후/, + isPM : function (token) { + return token === '오후'; + }, + meridiem : function (hour, minute, isUpper) { + return hour < 12 ? '오전' : '오후'; + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/lb.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/lb.js new file mode 100644 index 0000000..2e84dab --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/lb.js @@ -0,0 +1,139 @@ +// moment.js locale configuration +// locale : Luxembourgish (lb) +// author : mweimerskirch : https://github.com/mweimerskirch, David Raison : https://github.com/kwisatz + +// Note: Luxembourgish has a very particular phonological rule ('Eifeler Regel') that causes the +// deletion of the final 'n' in certain contexts. That's what the 'eifelerRegelAppliesToWeekday' +// and 'eifelerRegelAppliesToNumber' methods are meant for + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eng Minutt', 'enger Minutt'], + 'h': ['eng Stonn', 'enger Stonn'], + 'd': ['een Dag', 'engem Dag'], + 'M': ['ee Mount', 'engem Mount'], + 'y': ['ee Joer', 'engem Joer'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + function processFutureTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'a ' + string; + } + return 'an ' + string; + } + + function processPastTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'viru ' + string; + } + return 'virun ' + string; + } + + /** + * Returns true if the word before the given number loses the '-n' ending. + * e.g. 'an 10 Deeg' but 'a 5 Deeg' + * + * @param number {integer} + * @returns {boolean} + */ + function eifelerRegelAppliesToNumber(number) { + number = parseInt(number, 10); + if (isNaN(number)) { + return false; + } + if (number < 0) { + // Negative Number --> always true + return true; + } else if (number < 10) { + // Only 1 digit + if (4 <= number && number <= 7) { + return true; + } + return false; + } else if (number < 100) { + // 2 digits + var lastDigit = number % 10, firstDigit = number / 10; + if (lastDigit === 0) { + return eifelerRegelAppliesToNumber(firstDigit); + } + return eifelerRegelAppliesToNumber(lastDigit); + } else if (number < 10000) { + // 3 or 4 digits --> recursively check first digit + while (number >= 10) { + number = number / 10; + } + return eifelerRegelAppliesToNumber(number); + } else { + // Anything larger than 4 digits: recursively check first n-3 digits + number = number / 1000; + return eifelerRegelAppliesToNumber(number); + } + } + + return moment.defineLocale('lb', { + months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'), + weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'), + weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'), + longDateFormat: { + LT: 'H:mm [Auer]', + LTS: 'H:mm:ss [Auer]', + L: 'DD.MM.YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY LT', + LLLL: 'dddd, D. MMMM YYYY LT' + }, + calendar: { + sameDay: '[Haut um] LT', + sameElse: 'L', + nextDay: '[Muer um] LT', + nextWeek: 'dddd [um] LT', + lastDay: '[Gëschter um] LT', + lastWeek: function () { + // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule + switch (this.day()) { + case 2: + case 4: + return '[Leschten] dddd [um] LT'; + default: + return '[Leschte] dddd [um] LT'; + } + } + }, + relativeTime : { + future : processFutureTime, + past : processPastTime, + s : 'e puer Sekonnen', + m : processRelativeTime, + mm : '%d Minutten', + h : processRelativeTime, + hh : '%d Stonnen', + d : processRelativeTime, + dd : '%d Deeg', + M : processRelativeTime, + MM : '%d Méint', + y : processRelativeTime, + yy : '%d Joer' + }, + ordinalParse: /\d{1,2}\./, + ordinal: '%d.', + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/lt.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/lt.js new file mode 100644 index 0000000..2d87e04 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/lt.js @@ -0,0 +1,120 @@ +// moment.js locale configuration +// locale : Lithuanian (lt) +// author : Mindaugas MozÅ«ras : https://github.com/mmozuras + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var units = { + 'm' : 'minutÄ—_minutÄ—s_minutÄ™', + 'mm': 'minutÄ—s_minuÄių_minutes', + 'h' : 'valanda_valandos_valandÄ…', + 'hh': 'valandos_valandų_valandas', + 'd' : 'diena_dienos_dienÄ…', + 'dd': 'dienos_dienų_dienas', + 'M' : 'mÄ—nuo_mÄ—nesio_mÄ—nesį', + 'MM': 'mÄ—nesiai_mÄ—nesių_mÄ—nesius', + 'y' : 'metai_metų_metus', + 'yy': 'metai_metų_metus' + }, + weekDays = 'sekmadienis_pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis'.split('_'); + + function translateSeconds(number, withoutSuffix, key, isFuture) { + if (withoutSuffix) { + return 'kelios sekundÄ—s'; + } else { + return isFuture ? 'kelių sekundžių' : 'kelias sekundes'; + } + } + + function translateSingular(number, withoutSuffix, key, isFuture) { + return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]); + } + + function special(number) { + return number % 10 === 0 || (number > 10 && number < 20); + } + + function forms(key) { + return units[key].split('_'); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + if (number === 1) { + return result + translateSingular(number, withoutSuffix, key[0], isFuture); + } else if (withoutSuffix) { + return result + (special(number) ? forms(key)[1] : forms(key)[0]); + } else { + if (isFuture) { + return result + forms(key)[1]; + } else { + return result + (special(number) ? forms(key)[1] : forms(key)[2]); + } + } + } + + function relativeWeekDay(moment, format) { + var nominative = format.indexOf('dddd HH:mm') === -1, + weekDay = weekDays[moment.day()]; + + return nominative ? weekDay : weekDay.substring(0, weekDay.length - 2) + 'į'; + } + + return moment.defineLocale('lt', { + months : 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio'.split('_'), + monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'), + weekdays : relativeWeekDay, + weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Å eÅ¡'.split('_'), + weekdaysMin : 'S_P_A_T_K_Pn_Å '.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY [m.] MMMM D [d.]', + LLL : 'YYYY [m.] MMMM D [d.], LT [val.]', + LLLL : 'YYYY [m.] MMMM D [d.], dddd, LT [val.]', + l : 'YYYY-MM-DD', + ll : 'YYYY [m.] MMMM D [d.]', + lll : 'YYYY [m.] MMMM D [d.], LT [val.]', + llll : 'YYYY [m.] MMMM D [d.], ddd, LT [val.]' + }, + calendar : { + sameDay : '[Å iandien] LT', + nextDay : '[Rytoj] LT', + nextWeek : 'dddd LT', + lastDay : '[Vakar] LT', + lastWeek : '[PraÄ—jusį] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : 'po %s', + past : 'prieÅ¡ %s', + s : translateSeconds, + m : translateSingular, + mm : translate, + h : translateSingular, + hh : translate, + d : translateSingular, + dd : translate, + M : translateSingular, + MM : translate, + y : translateSingular, + yy : translate + }, + ordinalParse: /\d{1,2}-oji/, + ordinal : function (number) { + return number + '-oji'; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/lv.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/lv.js new file mode 100644 index 0000000..47a0708 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/lv.js @@ -0,0 +1,79 @@ +// moment.js locale configuration +// locale : latvian (lv) +// author : Kristaps Karlsons : https://github.com/skakri + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var units = { + 'mm': 'minÅ«ti_minÅ«tes_minÅ«te_minÅ«tes', + 'hh': 'stundu_stundas_stunda_stundas', + 'dd': 'dienu_dienas_diena_dienas', + 'MM': 'mÄ“nesi_mÄ“neÅ¡us_mÄ“nesis_mÄ“neÅ¡i', + 'yy': 'gadu_gadus_gads_gadi' + }; + + function format(word, number, withoutSuffix) { + var forms = word.split('_'); + if (withoutSuffix) { + return number % 10 === 1 && number !== 11 ? forms[2] : forms[3]; + } else { + return number % 10 === 1 && number !== 11 ? forms[0] : forms[1]; + } + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + return number + ' ' + format(units[key], number, withoutSuffix); + } + + return moment.defineLocale('lv', { + months : 'janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jÅ«n_jÅ«l_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'svÄ“tdiena_pirmdiena_otrdiena_treÅ¡diena_ceturtdiena_piektdiena_sestdiena'.split('_'), + weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'), + weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'YYYY. [gada] D. MMMM', + LLL : 'YYYY. [gada] D. MMMM, LT', + LLLL : 'YYYY. [gada] D. MMMM, dddd, LT' + }, + calendar : { + sameDay : '[Å odien pulksten] LT', + nextDay : '[RÄ«t pulksten] LT', + nextWeek : 'dddd [pulksten] LT', + lastDay : '[Vakar pulksten] LT', + lastWeek : '[PagÄjuÅ¡Ä] dddd [pulksten] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s vÄ“lÄk', + past : '%s agrÄk', + s : 'dažas sekundes', + m : 'minÅ«ti', + mm : relativeTimeWithPlural, + h : 'stundu', + hh : relativeTimeWithPlural, + d : 'dienu', + dd : relativeTimeWithPlural, + M : 'mÄ“nesi', + MM : relativeTimeWithPlural, + y : 'gadu', + yy : relativeTimeWithPlural + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/mk.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/mk.js new file mode 100644 index 0000000..de36631 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/mk.js @@ -0,0 +1,88 @@ +// moment.js locale configuration +// locale : macedonian (mk) +// author : Borislav Mickov : https://github.com/B0k0 + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('mk', { + months : 'јануари_февруари_март_април_мај_јуни_јули_авгуÑÑ‚_Ñептември_октомври_ноември_декември'.split('_'), + monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_Ñеп_окт_ное_дек'.split('_'), + weekdays : 'недела_понеделник_вторник_Ñреда_четврток_петок_Ñабота'.split('_'), + weekdaysShort : 'нед_пон_вто_Ñре_чет_пет_Ñаб'.split('_'), + weekdaysMin : 'нe_пo_вт_ÑÑ€_че_пе_Ña'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'D.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Ð”ÐµÐ½ÐµÑ Ð²Ð¾] LT', + nextDay : '[Утре во] LT', + nextWeek : 'dddd [во] LT', + lastDay : '[Вчера во] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[Во изминатата] dddd [во] LT'; + case 1: + case 2: + case 4: + case 5: + return '[Во изминатиот] dddd [во] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'поÑле %s', + past : 'пред %s', + s : 'неколку Ñекунди', + m : 'минута', + mm : '%d минути', + h : 'чаÑ', + hh : '%d чаÑа', + d : 'ден', + dd : '%d дена', + M : 'меÑец', + MM : '%d меÑеци', + y : 'година', + yy : '%d години' + }, + ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ml.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ml.js new file mode 100644 index 0000000..eb877bb --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ml.js @@ -0,0 +1,69 @@ +// moment.js locale configuration +// locale : malayalam (ml) +// author : Floyd Pink : https://github.com/floydpink + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ml', { + months : 'ജനàµà´µà´°à´¿_ഫെബàµà´°àµà´µà´°à´¿_മാർചàµà´šàµ_à´à´ªàµà´°à´¿àµ½_മേയàµ_ജൂൺ_ജൂലൈ_à´“à´—à´¸àµà´±àµà´±àµ_സെപàµà´±àµà´±à´‚ബർ_à´’à´•àµà´Ÿàµ‹à´¬àµ¼_നവംബർ_ഡിസംബർ'.split('_'), + monthsShort : 'ജനàµ._ഫെബàµà´°àµ._മാർ._à´à´ªàµà´°à´¿._മേയàµ_ജൂൺ_ജൂലൈ._à´“à´—._സെപàµà´±àµà´±._à´’à´•àµà´Ÿàµ‹._നവം._ഡിസം.'.split('_'), + weekdays : 'ഞായറാഴàµà´š_തിങàµà´•à´³à´¾à´´àµà´š_ചൊവàµà´µà´¾à´´àµà´š_à´¬àµà´§à´¨à´¾à´´àµà´š_à´µàµà´¯à´¾à´´à´¾à´´àµà´š_വെളàµà´³à´¿à´¯à´¾à´´àµà´š_ശനിയാഴàµà´š'.split('_'), + weekdaysShort : 'ഞായർ_തിങàµà´•àµ¾_ചൊവàµà´µ_à´¬àµà´§àµ»_à´µàµà´¯à´¾à´´à´‚_വെളàµà´³à´¿_ശനി'.split('_'), + weekdaysMin : 'à´žà´¾_തി_ചൊ_à´¬àµ_à´µàµà´¯à´¾_വെ_à´¶'.split('_'), + longDateFormat : { + LT : 'A h:mm -à´¨àµ', + LTS : 'A h:mm:ss -à´¨àµ', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[ഇനàµà´¨àµ] LT', + nextDay : '[നാളെ] LT', + nextWeek : 'dddd, LT', + lastDay : '[ഇനàµà´¨à´²àµ†] LT', + lastWeek : '[à´•à´´à´¿à´žàµà´ž] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s à´•à´´à´¿à´žàµà´žàµ', + past : '%s à´®àµàµ»à´ªàµ', + s : 'അൽപ നിമിഷങàµà´™àµ¾', + m : 'ഒരൠമിനിറàµà´±àµ', + mm : '%d മിനിറàµà´±àµ', + h : 'ഒരൠമണികàµà´•àµ‚ർ', + hh : '%d മണികàµà´•àµ‚ർ', + d : 'ഒരൠദിവസം', + dd : '%d ദിവസം', + M : 'ഒരൠമാസം', + MM : '%d മാസം', + y : 'ഒരൠവർഷം', + yy : '%d വർഷം' + }, + meridiemParse: /രാതàµà´°à´¿|രാവിലെ|ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿/i, + isPM : function (input) { + return /^(ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'രാതàµà´°à´¿'; + } else if (hour < 12) { + return 'രാവിലെ'; + } else if (hour < 17) { + return 'ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ'; + } else if (hour < 20) { + return 'വൈകàµà´¨àµà´¨àµ‡à´°à´‚'; + } else { + return 'രാതàµà´°à´¿'; + } + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/mr.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/mr.js new file mode 100644 index 0000000..93f0eea --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/mr.js @@ -0,0 +1,120 @@ +// moment.js locale configuration +// locale : Marathi (mr) +// author : Harshad Kale : https://github.com/kalehv + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.defineLocale('mr', { + months : 'जानेवारी_फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€_मारà¥à¤š_à¤à¤ªà¥à¤°à¤¿à¤²_मे_जून_जà¥à¤²à¥ˆ_ऑगसà¥à¤Ÿ_सपà¥à¤Ÿà¥‡à¤‚बर_ऑकà¥à¤Ÿà¥‹à¤¬à¤°_नोवà¥à¤¹à¥‡à¤‚बर_डिसेंबर'.split('_'), + monthsShort: 'जाने._फेबà¥à¤°à¥._मारà¥à¤š._à¤à¤ªà¥à¤°à¤¿._मे._जून._जà¥à¤²à¥ˆ._ऑग._सपà¥à¤Ÿà¥‡à¤‚._ऑकà¥à¤Ÿà¥‹._नोवà¥à¤¹à¥‡à¤‚._डिसें.'.split('_'), + weekdays : 'रविवार_सोमवार_मंगळवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split('_'), + weekdaysShort : 'रवि_सोम_मंगळ_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split('_'), + weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split('_'), + longDateFormat : { + LT : 'A h:mm वाजता', + LTS : 'A h:mm:ss वाजता', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[उदà¥à¤¯à¤¾] LT', + nextWeek : 'dddd, LT', + lastDay : '[काल] LT', + lastWeek: '[मागील] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s नंतर', + past : '%s पूरà¥à¤µà¥€', + s : 'सेकंद', + m: 'à¤à¤• मिनिट', + mm: '%d मिनिटे', + h : 'à¤à¤• तास', + hh : '%d तास', + d : 'à¤à¤• दिवस', + dd : '%d दिवस', + M : 'à¤à¤• महिना', + MM : '%d महिने', + y : 'à¤à¤• वरà¥à¤·', + yy : '%d वरà¥à¤·à¥‡' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /रातà¥à¤°à¥€|सकाळी|दà¥à¤ªà¤¾à¤°à¥€|सायंकाळी/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'रातà¥à¤°à¥€') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'सकाळी') { + return hour; + } else if (meridiem === 'दà¥à¤ªà¤¾à¤°à¥€') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'सायंकाळी') { + return hour + 12; + } + }, + meridiem: function (hour, minute, isLower) + { + if (hour < 4) { + return 'रातà¥à¤°à¥€'; + } else if (hour < 10) { + return 'सकाळी'; + } else if (hour < 17) { + return 'दà¥à¤ªà¤¾à¤°à¥€'; + } else if (hour < 20) { + return 'सायंकाळी'; + } else { + return 'रातà¥à¤°à¥€'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ms-my.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ms-my.js new file mode 100644 index 0000000..56d5e91 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ms-my.js @@ -0,0 +1,80 @@ +// moment.js locale configuration +// locale : Bahasa Malaysia (ms-MY) +// author : Weldan Jamili : https://github.com/weldan + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ms-my', { + months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), + monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), + weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), + weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), + weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'LT.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] LT', + LLLL : 'dddd, D MMMM YYYY [pukul] LT' + }, + meridiemParse: /pagi|tengahari|petang|malam/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'tengahari') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'petang' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'tengahari'; + } else if (hours < 19) { + return 'petang'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Esok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kelmarin pukul] LT', + lastWeek : 'dddd [lepas pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lepas', + s : 'beberapa saat', + m : 'seminit', + mm : '%d minit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/my.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/my.js new file mode 100644 index 0000000..31f5c9e --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/my.js @@ -0,0 +1,89 @@ +// moment.js locale configuration +// locale : Burmese (my) +// author : Squar team, mysquar.com + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': 'á', + '2': 'á‚', + '3': 'áƒ', + '4': 'á„', + '5': 'á…', + '6': 'á†', + '7': 'á‡', + '8': 'áˆ', + '9': 'á‰', + '0': 'á€' + }, numberMap = { + 'á': '1', + 'á‚': '2', + 'áƒ': '3', + 'á„': '4', + 'á…': '5', + 'á†': '6', + 'á‡': '7', + 'áˆ': '8', + 'á‰': '9', + 'á€': '0' + }; + return moment.defineLocale('my', { + months: 'ဇန်နá€á€«á€›á€®_ဖေဖော်á€á€«á€›á€®_မá€á€º_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုá€á€º_စက်á€á€„်ဘာ_အောက်á€á€­á€¯á€˜á€¬_နိုá€á€„်ဘာ_ဒီဇင်ဘာ'.split('_'), + monthsShort: 'ဇန်_ဖေ_မá€á€º_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'), + weekdays: 'á€á€”င်္ဂနွေ_á€á€”င်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပá€á€±á€¸_သောကြာ_စနေ'.split('_'), + weekdaysShort: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), + weekdaysMin: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd D MMMM YYYY LT' + }, + calendar: { + sameDay: '[ယနေ.] LT [မှာ]', + nextDay: '[မနက်ဖြန်] LT [မှာ]', + nextWeek: 'dddd LT [မှာ]', + lastDay: '[မနေ.က] LT [မှာ]', + lastWeek: '[ပြီးá€á€²á€·á€žá€±á€¬] dddd LT [မှာ]', + sameElse: 'L' + }, + relativeTime: { + future: 'လာမည့် %s မှာ', + past: 'လွန်á€á€²á€·á€žá€±á€¬ %s က', + s: 'စက္ကန်.အနည်းငယ်', + m: 'á€á€…်မိနစ်', + mm: '%d မိနစ်', + h: 'á€á€…်နာရီ', + hh: '%d နာရီ', + d: 'á€á€…်ရက်', + dd: '%d ရက်', + M: 'á€á€…်လ', + MM: '%d လ', + y: 'á€á€…်နှစ်', + yy: '%d နှစ်' + }, + preparse: function (string) { + return string.replace(/[áá‚áƒá„á…á†á‡áˆá‰á€]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/nb.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/nb.js new file mode 100644 index 0000000..4764b50 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/nb.js @@ -0,0 +1,59 @@ +// moment.js locale configuration +// locale : norwegian bokmÃ¥l (nb) +// authors : Espen Hovlandsdal : https://github.com/rexxars +// Sigurd Gartmann : https://github.com/sigurdga + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('nb', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), + weekdaysShort : 'søn_man_tirs_ons_tors_fre_lør'.split('_'), + weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'H.mm', + LTS : 'LT.ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] LT', + LLLL : 'dddd D. MMMM YYYY [kl.] LT' + }, + calendar : { + sameDay: '[i dag kl.] LT', + nextDay: '[i morgen kl.] LT', + nextWeek: 'dddd [kl.] LT', + lastDay: '[i gÃ¥r kl.] LT', + lastWeek: '[forrige] dddd [kl.] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'for %s siden', + s : 'noen sekunder', + m : 'ett minutt', + mm : '%d minutter', + h : 'en time', + hh : '%d timer', + d : 'en dag', + dd : '%d dager', + M : 'en mÃ¥ned', + MM : '%d mÃ¥neder', + y : 'ett Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ne.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ne.js new file mode 100644 index 0000000..eb25ebe --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ne.js @@ -0,0 +1,121 @@ +// moment.js locale configuration +// locale : nepali/nepalese +// author : suvash : https://github.com/suvash + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.defineLocale('ne', { + months : 'जनवरी_फेबà¥à¤°à¥à¤µà¤°à¥€_मारà¥à¤š_अपà¥à¤°à¤¿à¤²_मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ_अगषà¥à¤Ÿ_सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°_अकà¥à¤Ÿà¥‹à¤¬à¤°_नोभेमà¥à¤¬à¤°_डिसेमà¥à¤¬à¤°'.split('_'), + monthsShort : 'जन._फेबà¥à¤°à¥._मारà¥à¤š_अपà¥à¤°à¤¿._मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ._अग._सेपà¥à¤Ÿ._अकà¥à¤Ÿà¥‹._नोभे._डिसे.'.split('_'), + weekdays : 'आइतबार_सोमबार_मङà¥à¤—लबार_बà¥à¤§à¤¬à¤¾à¤°_बिहिबार_शà¥à¤•à¥à¤°à¤¬à¤¾à¤°_शनिबार'.split('_'), + weekdaysShort : 'आइत._सोम._मङà¥à¤—ल._बà¥à¤§._बिहि._शà¥à¤•à¥à¤°._शनि.'.split('_'), + weekdaysMin : 'आइ._सो._मङà¥_बà¥._बि._शà¥._श.'.split('_'), + longDateFormat : { + LT : 'Aको h:mm बजे', + LTS : 'Aको h:mm:ss बजे', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /राती|बिहान|दिउà¤à¤¸à¥‹|बेलà¥à¤•à¤¾|साà¤à¤|राती/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'राती') { + return hour < 3 ? hour : hour + 12; + } else if (meridiem === 'बिहान') { + return hour; + } else if (meridiem === 'दिउà¤à¤¸à¥‹') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'बेलà¥à¤•à¤¾' || meridiem === 'साà¤à¤') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 3) { + return 'राती'; + } else if (hour < 10) { + return 'बिहान'; + } else if (hour < 15) { + return 'दिउà¤à¤¸à¥‹'; + } else if (hour < 18) { + return 'बेलà¥à¤•à¤¾'; + } else if (hour < 20) { + return 'साà¤à¤'; + } else { + return 'राती'; + } + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[भोली] LT', + nextWeek : '[आउà¤à¤¦à¥‹] dddd[,] LT', + lastDay : '[हिजो] LT', + lastWeek : '[गà¤à¤•à¥‹] dddd[,] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%sमा', + past : '%s अगाडी', + s : 'केही समय', + m : 'à¤à¤• मिनेट', + mm : '%d मिनेट', + h : 'à¤à¤• घणà¥à¤Ÿà¤¾', + hh : '%d घणà¥à¤Ÿà¤¾', + d : 'à¤à¤• दिन', + dd : '%d दिन', + M : 'à¤à¤• महिना', + MM : '%d महिना', + y : 'à¤à¤• बरà¥à¤·', + yy : '%d बरà¥à¤·' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/nl.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/nl.js new file mode 100644 index 0000000..9f4fdfe --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/nl.js @@ -0,0 +1,69 @@ +// moment.js locale configuration +// locale : dutch (nl) +// author : Joris Röling : https://github.com/jjupiter + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); + + return moment.defineLocale('nl', { + months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), + weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), + weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[vandaag om] LT', + nextDay: '[morgen om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[gisteren om] LT', + lastWeek: '[afgelopen] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'over %s', + past : '%s geleden', + s : 'een paar seconden', + m : 'één minuut', + mm : '%d minuten', + h : 'één uur', + hh : '%d uur', + d : 'één dag', + dd : '%d dagen', + M : 'één maand', + MM : '%d maanden', + y : 'één jaar', + yy : '%d jaar' + }, + ordinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/nn.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/nn.js new file mode 100644 index 0000000..d7a8238 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/nn.js @@ -0,0 +1,58 @@ +// moment.js locale configuration +// locale : norwegian nynorsk (nn) +// author : https://github.com/mechuwind + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('nn', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sundag_mÃ¥ndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'), + weekdaysShort : 'sun_mÃ¥n_tys_ons_tor_fre_lau'.split('_'), + weekdaysMin : 'su_mÃ¥_ty_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[I dag klokka] LT', + nextDay: '[I morgon klokka] LT', + nextWeek: 'dddd [klokka] LT', + lastDay: '[I gÃ¥r klokka] LT', + lastWeek: '[FøregÃ¥ande] dddd [klokka] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'for %s sidan', + s : 'nokre sekund', + m : 'eit minutt', + mm : '%d minutt', + h : 'ein time', + hh : '%d timar', + d : 'ein dag', + dd : '%d dagar', + M : 'ein mÃ¥nad', + MM : '%d mÃ¥nader', + y : 'eit Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/pl.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/pl.js new file mode 100644 index 0000000..418ca81 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/pl.js @@ -0,0 +1,100 @@ +// moment.js locale configuration +// locale : polish (pl) +// author : Rafal Hirsz : https://github.com/evoL + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var monthsNominative = 'styczeÅ„_luty_marzec_kwiecieÅ„_maj_czerwiec_lipiec_sierpieÅ„_wrzesieÅ„_październik_listopad_grudzieÅ„'.split('_'), + monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrzeÅ›nia_października_listopada_grudnia'.split('_'); + + function plural(n) { + return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1); + } + + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'minuta' : 'minutÄ™'; + case 'mm': + return result + (plural(number) ? 'minuty' : 'minut'); + case 'h': + return withoutSuffix ? 'godzina' : 'godzinÄ™'; + case 'hh': + return result + (plural(number) ? 'godziny' : 'godzin'); + case 'MM': + return result + (plural(number) ? 'miesiÄ…ce' : 'miesiÄ™cy'); + case 'yy': + return result + (plural(number) ? 'lata' : 'lat'); + } + } + + return moment.defineLocale('pl', { + months : function (momentToFormat, format) { + if (/D MMMM/.test(format)) { + return monthsSubjective[momentToFormat.month()]; + } else { + return monthsNominative[momentToFormat.month()]; + } + }, + monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'), + weekdays : 'niedziela_poniedziaÅ‚ek_wtorek_Å›roda_czwartek_piÄ…tek_sobota'.split('_'), + weekdaysShort : 'nie_pon_wt_Å›r_czw_pt_sb'.split('_'), + weekdaysMin : 'N_Pn_Wt_Åšr_Cz_Pt_So'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay: '[DziÅ› o] LT', + nextDay: '[Jutro o] LT', + nextWeek: '[W] dddd [o] LT', + lastDay: '[Wczoraj o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[W zeszÅ‚Ä… niedzielÄ™ o] LT'; + case 3: + return '[W zeszÅ‚Ä… Å›rodÄ™ o] LT'; + case 6: + return '[W zeszÅ‚Ä… sobotÄ™ o] LT'; + default: + return '[W zeszÅ‚y] dddd [o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : '%s temu', + s : 'kilka sekund', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : '1 dzieÅ„', + dd : '%d dni', + M : 'miesiÄ…c', + MM : translate, + y : 'rok', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/pt-br.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/pt-br.js new file mode 100644 index 0000000..813c2de --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/pt-br.js @@ -0,0 +1,58 @@ +// moment.js locale configuration +// locale : brazilian portuguese (pt-br) +// author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('pt-br', { + months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), + monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), + weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'), + weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'), + weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY [às] LT', + LLLL : 'dddd, D [de] MMMM [de] YYYY [às] LT' + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : 'em %s', + past : '%s atrás', + s : 'segundos', + m : 'um minuto', + mm : '%d minutos', + h : 'uma hora', + hh : '%d horas', + d : 'um dia', + dd : '%d dias', + M : 'um mês', + MM : '%d meses', + y : 'um ano', + yy : '%d anos' + }, + ordinalParse: /\d{1,2}º/, + ordinal : '%dº' + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/pt.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/pt.js new file mode 100644 index 0000000..4afd564 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/pt.js @@ -0,0 +1,62 @@ +// moment.js locale configuration +// locale : portuguese (pt) +// author : Jefferson : https://github.com/jalex79 + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('pt', { + months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), + monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), + weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'), + weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'), + weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY LT', + LLLL : 'dddd, D [de] MMMM [de] YYYY LT' + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : 'em %s', + past : 'há %s', + s : 'segundos', + m : 'um minuto', + mm : '%d minutos', + h : 'uma hora', + hh : '%d horas', + d : 'um dia', + dd : '%d dias', + M : 'um mês', + MM : '%d meses', + y : 'um ano', + yy : '%d anos' + }, + ordinalParse: /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ro.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ro.js new file mode 100644 index 0000000..fcc7d07 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ro.js @@ -0,0 +1,73 @@ +// moment.js locale configuration +// locale : romanian (ro) +// author : Vlad Gurdiga : https://github.com/gurdiga +// author : Valentin Agachi : https://github.com/avaly + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': 'minute', + 'hh': 'ore', + 'dd': 'zile', + 'MM': 'luni', + 'yy': 'ani' + }, + separator = ' '; + if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) { + separator = ' de '; + } + + return number + separator + format[key]; + } + + return moment.defineLocale('ro', { + months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'), + monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'), + weekdays : 'duminică_luni_marÈ›i_miercuri_joi_vineri_sâmbătă'.split('_'), + weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'), + weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY H:mm', + LLLL : 'dddd, D MMMM YYYY H:mm' + }, + calendar : { + sameDay: '[azi la] LT', + nextDay: '[mâine la] LT', + nextWeek: 'dddd [la] LT', + lastDay: '[ieri la] LT', + lastWeek: '[fosta] dddd [la] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'peste %s', + past : '%s în urmă', + s : 'câteva secunde', + m : 'un minut', + mm : relativeTimeWithPlural, + h : 'o oră', + hh : relativeTimeWithPlural, + d : 'o zi', + dd : relativeTimeWithPlural, + M : 'o lună', + MM : relativeTimeWithPlural, + y : 'un an', + yy : relativeTimeWithPlural + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ru.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ru.js new file mode 100644 index 0000000..5adfa9a --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ru.js @@ -0,0 +1,176 @@ +// moment.js locale configuration +// locale : russian (ru) +// author : Viktorminator : https://github.com/Viktorminator +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут', + 'hh': 'чаÑ_чаÑа_чаÑов', + 'dd': 'день_днÑ_дней', + 'MM': 'меÑÑц_меÑÑца_меÑÑцев', + 'yy': 'год_года_лет' + }; + if (key === 'm') { + return withoutSuffix ? 'минута' : 'минуту'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь'.split('_'), + 'accusative': 'ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function monthsShortCaseReplace(m, format) { + var monthsShort = { + 'nominative': 'Ñнв_фев_март_апр_май_июнь_июль_авг_Ñен_окт_ноÑ_дек'.split('_'), + 'accusative': 'Ñнв_фев_мар_апр_маÑ_июнÑ_июлÑ_авг_Ñен_окт_ноÑ_дек'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return monthsShort[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота'.split('_'), + 'accusative': 'воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу'.split('_') + }, + + nounCase = (/\[ ?[Вв] ?(?:прошлую|Ñледующую|Ñту)? ?\] ?dddd/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.defineLocale('ru', { + months : monthsCaseReplace, + monthsShort : monthsShortCaseReplace, + weekdays : weekdaysCaseReplace, + weekdaysShort : 'вÑ_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + weekdaysMin : 'вÑ_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + monthsParse : [/^Ñнв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[й|Ñ]/i, /^июн/i, /^июл/i, /^авг/i, /^Ñен/i, /^окт/i, /^ноÑ/i, /^дек/i], + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY г.', + LLL : 'D MMMM YYYY г., LT', + LLLL : 'dddd, D MMMM YYYY г., LT' + }, + calendar : { + sameDay: '[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT', + nextDay: '[Завтра в] LT', + lastDay: '[Вчера в] LT', + nextWeek: function () { + return this.day() === 2 ? '[Во] dddd [в] LT' : '[Ð’] dddd [в] LT'; + }, + lastWeek: function (now) { + if (now.week() !== this.week()) { + switch (this.day()) { + case 0: + return '[Ð’ прошлое] dddd [в] LT'; + case 1: + case 2: + case 4: + return '[Ð’ прошлый] dddd [в] LT'; + case 3: + case 5: + case 6: + return '[Ð’ прошлую] dddd [в] LT'; + } + } else { + if (this.day() === 2) { + return '[Во] dddd [в] LT'; + } else { + return '[Ð’] dddd [в] LT'; + } + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'через %s', + past : '%s назад', + s : 'неÑколько Ñекунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : 'чаÑ', + hh : relativeTimeWithPlural, + d : 'день', + dd : relativeTimeWithPlural, + M : 'меÑÑц', + MM : relativeTimeWithPlural, + y : 'год', + yy : relativeTimeWithPlural + }, + + meridiemParse: /ночи|утра|днÑ|вечера/i, + isPM : function (input) { + return /^(днÑ|вечера)$/.test(input); + }, + + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночи'; + } else if (hour < 12) { + return 'утра'; + } else if (hour < 17) { + return 'днÑ'; + } else { + return 'вечера'; + } + }, + + ordinalParse: /\d{1,2}-(й|го|Ñ)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + return number + '-й'; + case 'D': + return number + '-го'; + case 'w': + case 'W': + return number + '-Ñ'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/sk.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/sk.js new file mode 100644 index 0000000..f9d74c5 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/sk.js @@ -0,0 +1,158 @@ +// moment.js locale configuration +// locale : slovak (sk) +// author : Martin Minka : https://github.com/k2s +// based on work of petrbela : https://github.com/petrbela + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'), + monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_'); + + function plural(n) { + return (n > 1) && (n < 5); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami'; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minúty' : 'minút'); + } else { + return result + 'minútami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodín'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'deň' : 'dňom'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dni' : 'dní'); + } else { + return result + 'dňami'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'mesiace' : 'mesiacov'); + } else { + return result + 'mesiacmi'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokom'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'rokov'); + } else { + return result + 'rokmi'; + } + break; + } + } + + return moment.defineLocale('sk', { + months : months, + monthsShort : monthsShort, + monthsParse : (function (months, monthsShort) { + var i, _monthsParse = []; + for (i = 0; i < 12; i++) { + // use custom parser to solve problem with July (Äervenec) + _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); + } + return _monthsParse; + }(months, monthsShort)), + weekdays : 'nedeľa_pondelok_utorok_streda_Å¡tvrtok_piatok_sobota'.split('_'), + weekdaysShort : 'ne_po_ut_st_Å¡t_pi_so'.split('_'), + weekdaysMin : 'ne_po_ut_st_Å¡t_pi_so'.split('_'), + longDateFormat : { + LT: 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[dnes o] LT', + nextDay: '[zajtra o] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedeľu o] LT'; + case 1: + case 2: + return '[v] dddd [o] LT'; + case 3: + return '[v stredu o] LT'; + case 4: + return '[vo Å¡tvrtok o] LT'; + case 5: + return '[v piatok o] LT'; + case 6: + return '[v sobotu o] LT'; + } + }, + lastDay: '[vÄera o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulú nedeľu o] LT'; + case 1: + case 2: + return '[minulý] dddd [o] LT'; + case 3: + return '[minulú stredu o] LT'; + case 4: + case 5: + return '[minulý] dddd [o] LT'; + case 6: + return '[minulú sobotu o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pred %s', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/sl.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/sl.js new file mode 100644 index 0000000..232695f --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/sl.js @@ -0,0 +1,146 @@ +// moment.js locale configuration +// locale : slovenian (sl) +// author : Robert SedovÅ¡ek : https://github.com/sedovsek + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'ena minuta' : 'eno minuto'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2) { + result += 'minuti'; + } else if (number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minut'; + } + return result; + case 'h': + return withoutSuffix ? 'ena ura' : 'eno uro'; + case 'hh': + if (number === 1) { + result += 'ura'; + } else if (number === 2) { + result += 'uri'; + } else if (number === 3 || number === 4) { + result += 'ure'; + } else { + result += 'ur'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dni'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mesec'; + } else if (number === 2) { + result += 'meseca'; + } else if (number === 3 || number === 4) { + result += 'mesece'; + } else { + result += 'mesecev'; + } + return result; + case 'yy': + if (number === 1) { + result += 'leto'; + } else if (number === 2) { + result += 'leti'; + } else if (number === 3 || number === 4) { + result += 'leta'; + } else { + result += 'let'; + } + return result; + } + } + + return moment.defineLocale('sl', { + months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'), + monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'), + weekdays : 'nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota'.split('_'), + weekdaysShort : 'ned._pon._tor._sre._Äet._pet._sob.'.split('_'), + weekdaysMin : 'ne_po_to_sr_Äe_pe_so'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD. MM. YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[danes ob] LT', + nextDay : '[jutri ob] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[v] [nedeljo] [ob] LT'; + case 3: + return '[v] [sredo] [ob] LT'; + case 6: + return '[v] [soboto] [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[v] dddd [ob] LT'; + } + }, + lastDay : '[vÄeraj ob] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[prejÅ¡nja] dddd [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[prejÅ¡nji] dddd [ob] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'Äez %s', + past : '%s nazaj', + s : 'nekaj sekund', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'en dan', + dd : translate, + M : 'en mesec', + MM : translate, + y : 'eno leto', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/sq.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/sq.js new file mode 100644 index 0000000..9a5bc09 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/sq.js @@ -0,0 +1,67 @@ +// moment.js locale configuration +// locale : Albanian (sq) +// author : Flakërim Ismani : https://github.com/flakerimi +// author: Menelion Elensúle: https://github.com/Oire (tests) +// author : Oerd Cukalla : https://github.com/oerd (fixes) + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('sq', { + months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'), + monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'), + weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'), + weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'), + weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'), + meridiemParse: /PD|MD/, + isPM: function (input) { + return input.charAt(0) === 'M'; + }, + meridiem : function (hours, minutes, isLower) { + return hours < 12 ? 'PD' : 'MD'; + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Sot në] LT', + nextDay : '[Nesër në] LT', + nextWeek : 'dddd [në] LT', + lastDay : '[Dje në] LT', + lastWeek : 'dddd [e kaluar në] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'në %s', + past : '%s më parë', + s : 'disa sekonda', + m : 'një minutë', + mm : '%d minuta', + h : 'një orë', + hh : '%d orë', + d : 'një ditë', + dd : '%d ditë', + M : 'një muaj', + MM : '%d muaj', + y : 'një vit', + yy : '%d vite' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/sr-cyrl.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/sr-cyrl.js new file mode 100644 index 0000000..57619b6 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/sr-cyrl.js @@ -0,0 +1,107 @@ +// moment.js locale configuration +// locale : Serbian-cyrillic (sr-cyrl) +// author : Milan JanaÄković : https://github.com/milan-j + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var translator = { + words: { //Different grammatical cases + m: ['један минут', 'једне минуте'], + mm: ['минут', 'минуте', 'минута'], + h: ['један Ñат', 'једног Ñата'], + hh: ['Ñат', 'Ñата', 'Ñати'], + dd: ['дан', 'дана', 'дана'], + MM: ['меÑец', 'меÑеца', 'меÑеци'], + yy: ['година', 'године', 'година'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } + }; + + return moment.defineLocale('sr-cyrl', { + months: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'авгуÑÑ‚', 'Ñептембар', 'октобар', 'новембар', 'децембар'], + monthsShort: ['јан.', 'феб.', 'мар.', 'апр.', 'мај', 'јун', 'јул', 'авг.', 'Ñеп.', 'окт.', 'нов.', 'дец.'], + weekdays: ['недеља', 'понедељак', 'уторак', 'Ñреда', 'четвртак', 'петак', 'Ñубота'], + weekdaysShort: ['нед.', 'пон.', 'уто.', 'Ñре.', 'чет.', 'пет.', 'Ñуб.'], + weekdaysMin: ['не', 'по', 'ут', 'ÑÑ€', 'че', 'пе', 'Ñу'], + longDateFormat: { + LT: 'H:mm', + LTS : 'LT:ss', + L: 'DD. MM. YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY LT', + LLLL: 'dddd, D. MMMM YYYY LT' + }, + calendar: { + sameDay: '[Ð´Ð°Ð½Ð°Ñ Ñƒ] LT', + nextDay: '[Ñутра у] LT', + + nextWeek: function () { + switch (this.day()) { + case 0: + return '[у] [недељу] [у] LT'; + case 3: + return '[у] [Ñреду] [у] LT'; + case 6: + return '[у] [Ñуботу] [у] LT'; + case 1: + case 2: + case 4: + case 5: + return '[у] dddd [у] LT'; + } + }, + lastDay : '[јуче у] LT', + lastWeek : function () { + var lastWeekDays = [ + '[прошле] [недеље] [у] LT', + '[прошлог] [понедељка] [у] LT', + '[прошлог] [уторка] [у] LT', + '[прошле] [Ñреде] [у] LT', + '[прошлог] [четвртка] [у] LT', + '[прошлог] [петка] [у] LT', + '[прошле] [Ñуботе] [у] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'за %s', + past : 'пре %s', + s : 'неколико Ñекунди', + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'дан', + dd : translator.translate, + M : 'меÑец', + MM : translator.translate, + y : 'годину', + yy : translator.translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/sr.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/sr.js new file mode 100644 index 0000000..6f14284 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/sr.js @@ -0,0 +1,107 @@ +// moment.js locale configuration +// locale : Serbian-latin (sr) +// author : Milan JanaÄković : https://github.com/milan-j + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var translator = { + words: { //Different grammatical cases + m: ['jedan minut', 'jedne minute'], + mm: ['minut', 'minute', 'minuta'], + h: ['jedan sat', 'jednog sata'], + hh: ['sat', 'sata', 'sati'], + dd: ['dan', 'dana', 'dana'], + MM: ['mesec', 'meseca', 'meseci'], + yy: ['godina', 'godine', 'godina'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } + }; + + return moment.defineLocale('sr', { + months: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'], + monthsShort: ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun', 'jul', 'avg.', 'sep.', 'okt.', 'nov.', 'dec.'], + weekdays: ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'Äetvrtak', 'petak', 'subota'], + weekdaysShort: ['ned.', 'pon.', 'uto.', 'sre.', 'Äet.', 'pet.', 'sub.'], + weekdaysMin: ['ne', 'po', 'ut', 'sr', 'Äe', 'pe', 'su'], + longDateFormat: { + LT: 'H:mm', + LTS : 'LT:ss', + L: 'DD. MM. YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY LT', + LLLL: 'dddd, D. MMMM YYYY LT' + }, + calendar: { + sameDay: '[danas u] LT', + nextDay: '[sutra u] LT', + + nextWeek: function () { + switch (this.day()) { + case 0: + return '[u] [nedelju] [u] LT'; + case 3: + return '[u] [sredu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄe u] LT', + lastWeek : function () { + var lastWeekDays = [ + '[proÅ¡le] [nedelje] [u] LT', + '[proÅ¡log] [ponedeljka] [u] LT', + '[proÅ¡log] [utorka] [u] LT', + '[proÅ¡le] [srede] [u] LT', + '[proÅ¡log] [Äetvrtka] [u] LT', + '[proÅ¡log] [petka] [u] LT', + '[proÅ¡le] [subote] [u] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pre %s', + s : 'nekoliko sekundi', + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'dan', + dd : translator.translate, + M : 'mesec', + MM : translator.translate, + y : 'godinu', + yy : translator.translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/sv.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/sv.js new file mode 100644 index 0000000..6e14958 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/sv.js @@ -0,0 +1,65 @@ +// moment.js locale configuration +// locale : swedish (sv) +// author : Jens Alm : https://github.com/ulmus + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('sv', { + months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'söndag_mÃ¥ndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'), + weekdaysShort : 'sön_mÃ¥n_tis_ons_tor_fre_lör'.split('_'), + weekdaysMin : 'sö_mÃ¥_ti_on_to_fr_lö'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Idag] LT', + nextDay: '[Imorgon] LT', + lastDay: '[IgÃ¥r] LT', + nextWeek: 'dddd LT', + lastWeek: '[Förra] dddd[en] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'för %s sedan', + s : 'nÃ¥gra sekunder', + m : 'en minut', + mm : '%d minuter', + h : 'en timme', + hh : '%d timmar', + d : 'en dag', + dd : '%d dagar', + M : 'en mÃ¥nad', + MM : '%d mÃ¥nader', + y : 'ett Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}(e|a)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'e' : + (b === 1) ? 'a' : + (b === 2) ? 'a' : + (b === 3) ? 'e' : 'e'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ta.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ta.js new file mode 100644 index 0000000..8c86b4b --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/ta.js @@ -0,0 +1,130 @@ +// moment.js locale configuration +// locale : tamil (ta) +// author : Arjunkumar Krishnamoorthy : https://github.com/tk120404 + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + /*var symbolMap = { + '1': '௧', + '2': '௨', + '3': '௩', + '4': '௪', + '5': '௫', + '6': '௬', + '7': '௭', + '8': '௮', + '9': '௯', + '0': '௦' + }, + numberMap = { + '௧': '1', + '௨': '2', + '௩': '3', + '௪': '4', + '௫': '5', + '௬': '6', + '௭': '7', + '௮': '8', + '௯': '9', + '௦': '0' + }; */ + + return moment.defineLocale('ta', { + months : 'ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯'.split('_'), + monthsShort : 'ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯'.split('_'), + weekdays : 'ஞாயிறà¯à®±à¯à®•à¯à®•à®¿à®´à®®à¯ˆ_திஙà¯à®•à®Ÿà¯à®•à®¿à®´à®®à¯ˆ_செவà¯à®µà®¾à®¯à¯à®•à®¿à®´à®®à¯ˆ_பà¯à®¤à®©à¯à®•à®¿à®´à®®à¯ˆ_வியாழகà¯à®•à®¿à®´à®®à¯ˆ_வெளà¯à®³à®¿à®•à¯à®•à®¿à®´à®®à¯ˆ_சனிகà¯à®•à®¿à®´à®®à¯ˆ'.split('_'), + weekdaysShort : 'ஞாயிறà¯_திஙà¯à®•à®³à¯_செவà¯à®µà®¾à®¯à¯_பà¯à®¤à®©à¯_வியாழனà¯_வெளà¯à®³à®¿_சனி'.split('_'), + weekdaysMin : 'ஞா_தி_செ_பà¯_வி_வெ_ச'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[இனà¯à®±à¯] LT', + nextDay : '[நாளை] LT', + nextWeek : 'dddd, LT', + lastDay : '[நேறà¯à®±à¯] LT', + lastWeek : '[கடநà¯à®¤ வாரமà¯] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s இலà¯', + past : '%s à®®à¯à®©à¯', + s : 'ஒர௠சில விநாடிகளà¯', + m : 'ஒர௠நிமிடமà¯', + mm : '%d நிமிடஙà¯à®•à®³à¯', + h : 'ஒர௠மணி நேரமà¯', + hh : '%d மணி நேரமà¯', + d : 'ஒர௠நாளà¯', + dd : '%d நாடà¯à®•à®³à¯', + M : 'ஒர௠மாதமà¯', + MM : '%d மாதஙà¯à®•à®³à¯', + y : 'ஒர௠வரà¯à®Ÿà®®à¯', + yy : '%d ஆணà¯à®Ÿà¯à®•à®³à¯' + }, +/* preparse: function (string) { + return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + },*/ + ordinalParse: /\d{1,2}வதà¯/, + ordinal : function (number) { + return number + 'வதà¯'; + }, + + + // refer http://ta.wikipedia.org/s/1er1 + meridiemParse: /யாமமà¯|வைகறை|காலை|நணà¯à®ªà®•à®²à¯|எறà¯à®ªà®¾à®Ÿà¯|மாலை/, + meridiem : function (hour, minute, isLower) { + if (hour < 2) { + return ' யாமமà¯'; + } else if (hour < 6) { + return ' வைகறை'; // வைகறை + } else if (hour < 10) { + return ' காலை'; // காலை + } else if (hour < 14) { + return ' நணà¯à®ªà®•à®²à¯'; // நணà¯à®ªà®•à®²à¯ + } else if (hour < 18) { + return ' எறà¯à®ªà®¾à®Ÿà¯'; // எறà¯à®ªà®¾à®Ÿà¯ + } else if (hour < 22) { + return ' மாலை'; // மாலை + } else { + return ' யாமமà¯'; + } + }, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'யாமமà¯') { + return hour < 2 ? hour : hour + 12; + } else if (meridiem === 'வைகறை' || meridiem === 'காலை') { + return hour; + } else if (meridiem === 'நணà¯à®ªà®•à®²à¯') { + return hour >= 10 ? hour : hour + 12; + } else { + return hour + 12; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/th.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/th.js new file mode 100644 index 0000000..ec9b840 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/th.js @@ -0,0 +1,63 @@ +// moment.js locale configuration +// locale : thai (th) +// author : Kridsada Thanabulpong : https://github.com/sirn + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('th', { + months : 'มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม'.split('_'), + monthsShort : 'มà¸à¸£à¸²_à¸à¸¸à¸¡à¸ à¸²_มีนา_เมษา_พฤษภา_มิถุนา_à¸à¸£à¸à¸Žà¸²_สิงหา_à¸à¸±à¸™à¸¢à¸²_ตุลา_พฤศจิà¸à¸²_ธันวา'.split('_'), + weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์'.split('_'), + weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์'.split('_'), // yes, three characters difference + weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'), + longDateFormat : { + LT : 'H นาฬิà¸à¸² m นาที', + LTS : 'LT s วินาที', + L : 'YYYY/MM/DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY เวลา LT', + LLLL : 'วันddddที่ D MMMM YYYY เวลา LT' + }, + meridiemParse: /à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง|หลังเที่ยง/, + isPM: function (input) { + return input === 'หลังเที่ยง'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง'; + } else { + return 'หลังเที่ยง'; + } + }, + calendar : { + sameDay : '[วันนี้ เวลา] LT', + nextDay : '[พรุ่งนี้ เวลา] LT', + nextWeek : 'dddd[หน้า เวลา] LT', + lastDay : '[เมื่อวานนี้ เวลา] LT', + lastWeek : '[วัน]dddd[ที่à¹à¸¥à¹‰à¸§ เวลา] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'อีภ%s', + past : '%sที่à¹à¸¥à¹‰à¸§', + s : 'ไม่à¸à¸µà¹ˆà¸§à¸´à¸™à¸²à¸—ี', + m : '1 นาที', + mm : '%d นาที', + h : '1 ชั่วโมง', + hh : '%d ชั่วโมง', + d : '1 วัน', + dd : '%d วัน', + M : '1 เดือน', + MM : '%d เดือน', + y : '1 ปี', + yy : '%d ปี' + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/tl-ph.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/tl-ph.js new file mode 100644 index 0000000..40dbb07 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/tl-ph.js @@ -0,0 +1,60 @@ +// moment.js locale configuration +// locale : Tagalog/Filipino (tl-ph) +// author : Dan Hagman + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('tl-ph', { + months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'), + monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'), + weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'), + weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'), + weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'MM/D/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY LT', + LLLL : 'dddd, MMMM DD, YYYY LT' + }, + calendar : { + sameDay: '[Ngayon sa] LT', + nextDay: '[Bukas sa] LT', + nextWeek: 'dddd [sa] LT', + lastDay: '[Kahapon sa] LT', + lastWeek: 'dddd [huling linggo] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'sa loob ng %s', + past : '%s ang nakalipas', + s : 'ilang segundo', + m : 'isang minuto', + mm : '%d minuto', + h : 'isang oras', + hh : '%d oras', + d : 'isang araw', + dd : '%d araw', + M : 'isang buwan', + MM : '%d buwan', + y : 'isang taon', + yy : '%d taon' + }, + ordinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/tr.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/tr.js new file mode 100644 index 0000000..cd0a746 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/tr.js @@ -0,0 +1,94 @@ +// moment.js locale configuration +// locale : turkish (tr) +// authors : Erhan Gundogan : https://github.com/erhangundogan, +// Burak YiÄŸit Kaya: https://github.com/BYK + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var suffixes = { + 1: '\'inci', + 5: '\'inci', + 8: '\'inci', + 70: '\'inci', + 80: '\'inci', + + 2: '\'nci', + 7: '\'nci', + 20: '\'nci', + 50: '\'nci', + + 3: '\'üncü', + 4: '\'üncü', + 100: '\'üncü', + + 6: '\'ncı', + + 9: '\'uncu', + 10: '\'uncu', + 30: '\'uncu', + + 60: '\'ıncı', + 90: '\'ıncı' + }; + + return moment.defineLocale('tr', { + months : 'Ocak_Åžubat_Mart_Nisan_Mayıs_Haziran_Temmuz_AÄŸustos_Eylül_Ekim_Kasım_Aralık'.split('_'), + monthsShort : 'Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara'.split('_'), + weekdays : 'Pazar_Pazartesi_Salı_ÇarÅŸamba_PerÅŸembe_Cuma_Cumartesi'.split('_'), + weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'), + weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[bugün saat] LT', + nextDay : '[yarın saat] LT', + nextWeek : '[haftaya] dddd [saat] LT', + lastDay : '[dün] LT', + lastWeek : '[geçen hafta] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s sonra', + past : '%s önce', + s : 'birkaç saniye', + m : 'bir dakika', + mm : '%d dakika', + h : 'bir saat', + hh : '%d saat', + d : 'bir gün', + dd : '%d gün', + M : 'bir ay', + MM : '%d ay', + y : 'bir yıl', + yy : '%d yıl' + }, + ordinalParse: /\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/, + ordinal : function (number) { + if (number === 0) { // special case for zero + return number + '\'ıncı'; + } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + + return number + (suffixes[a] || suffixes[b] || suffixes[c]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/tzm-latn.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/tzm-latn.js new file mode 100644 index 0000000..34592b4 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/tzm-latn.js @@ -0,0 +1,56 @@ +// moment.js locale configuration +// locale : Morocco Central Atlas TamaziÉ£t in Latin (tzm-latn) +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('tzm-latn', { + months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), + weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), + weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[asdkh g] LT', + nextDay: '[aska g] LT', + nextWeek: 'dddd [g] LT', + lastDay: '[assant g] LT', + lastWeek: 'dddd [g] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dadkh s yan %s', + past : 'yan %s', + s : 'imik', + m : 'minuá¸', + mm : '%d minuá¸', + h : 'saÉ›a', + hh : '%d tassaÉ›in', + d : 'ass', + dd : '%d ossan', + M : 'ayowr', + MM : '%d iyyirn', + y : 'asgas', + yy : '%d isgasn' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/tzm.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/tzm.js new file mode 100644 index 0000000..9591521 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/tzm.js @@ -0,0 +1,56 @@ +// moment.js locale configuration +// locale : Morocco Central Atlas TamaziÉ£t (tzm) +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('tzm', { + months : 'ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”'.split('_'), + monthsShort : 'ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”'.split('_'), + weekdays : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + weekdaysShort : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS: 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[ⴰⵙⴷⵅ â´´] LT', + nextDay: '[ⴰⵙⴽⴰ â´´] LT', + nextWeek: 'dddd [â´´] LT', + lastDay: '[ⴰⵚⴰâµâµœ â´´] LT', + lastWeek: 'dddd [â´´] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'â´·â´°â´·âµ… âµ™ ⵢⴰⵠ%s', + past : 'ⵢⴰⵠ%s', + s : 'ⵉⵎⵉⴽ', + m : 'ⵎⵉâµâµ“â´º', + mm : '%d ⵎⵉâµâµ“â´º', + h : 'ⵙⴰⵄⴰ', + hh : '%d ⵜⴰⵙⵙⴰⵄⵉâµ', + d : 'ⴰⵙⵙ', + dd : '%d oⵙⵙⴰâµ', + M : 'â´°âµ¢oⵓⵔ', + MM : '%d ⵉⵢⵢⵉⵔâµ', + y : 'ⴰⵙⴳⴰⵙ', + yy : '%d ⵉⵙⴳⴰⵙâµ' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/uk.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/uk.js new file mode 100644 index 0000000..84e11ce --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/uk.js @@ -0,0 +1,163 @@ +// moment.js locale configuration +// locale : ukrainian (uk) +// author : zemlanin : https://github.com/zemlanin +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': 'хвилина_хвилини_хвилин', + 'hh': 'година_години_годин', + 'dd': 'день_дні_днів', + 'MM': 'міÑÑць_міÑÑці_міÑÑців', + 'yy': 'рік_роки_років' + }; + if (key === 'm') { + return withoutSuffix ? 'хвилина' : 'хвилину'; + } + else if (key === 'h') { + return withoutSuffix ? 'година' : 'годину'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень'.split('_'), + 'accusative': 'ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ'.split('_') + }, + + nounCase = (/D[oD]? *MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота'.split('_'), + 'accusative': 'неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу'.split('_'), + 'genitive': 'неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи'.split('_') + }, + + nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ? + 'accusative' : + ((/\[?(?:минулої|наÑтупної)? ?\] ?dddd/).test(format) ? + 'genitive' : + 'nominative'); + + return weekdays[nounCase][m.day()]; + } + + function processHoursFunction(str) { + return function () { + return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT'; + }; + } + + return moment.defineLocale('uk', { + months : monthsCaseReplace, + monthsShort : 'Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + weekdaysMin : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY Ñ€.', + LLL : 'D MMMM YYYY Ñ€., LT', + LLLL : 'dddd, D MMMM YYYY Ñ€., LT' + }, + calendar : { + sameDay: processHoursFunction('[Сьогодні '), + nextDay: processHoursFunction('[Завтра '), + lastDay: processHoursFunction('[Вчора '), + nextWeek: processHoursFunction('[У] dddd ['), + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return processHoursFunction('[Минулої] dddd [').call(this); + case 1: + case 2: + case 4: + return processHoursFunction('[Минулого] dddd [').call(this); + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'за %s', + past : '%s тому', + s : 'декілька Ñекунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : 'годину', + hh : relativeTimeWithPlural, + d : 'день', + dd : relativeTimeWithPlural, + M : 'міÑÑць', + MM : relativeTimeWithPlural, + y : 'рік', + yy : relativeTimeWithPlural + }, + + // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason + + meridiemParse: /ночі|ранку|днÑ|вечора/, + isPM: function (input) { + return /^(днÑ|вечора)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночі'; + } else if (hour < 12) { + return 'ранку'; + } else if (hour < 17) { + return 'днÑ'; + } else { + return 'вечора'; + } + }, + + ordinalParse: /\d{1,2}-(й|го)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return number + '-й'; + case 'D': + return number + '-го'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/uz.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/uz.js new file mode 100644 index 0000000..139e4de --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/uz.js @@ -0,0 +1,56 @@ +// moment.js locale configuration +// locale : uzbek (uz) +// author : Sardor Muminov : https://github.com/muminoff + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('uz', { + months : 'Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь'.split('_'), + monthsShort : 'Ñнв_фев_мар_апр_май_июн_июл_авг_Ñен_окт_ноÑ_дек'.split('_'), + weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'), + weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'), + weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'D MMMM YYYY, dddd LT' + }, + calendar : { + sameDay : '[Бугун Ñоат] LT [да]', + nextDay : '[Эртага] LT [да]', + nextWeek : 'dddd [куни Ñоат] LT [да]', + lastDay : '[Кеча Ñоат] LT [да]', + lastWeek : '[Утган] dddd [куни Ñоат] LT [да]', + sameElse : 'L' + }, + relativeTime : { + future : 'Якин %s ичида', + past : 'Бир неча %s олдин', + s : 'фурÑат', + m : 'бир дакика', + mm : '%d дакика', + h : 'бир Ñоат', + hh : '%d Ñоат', + d : 'бир кун', + dd : '%d кун', + M : 'бир ой', + MM : '%d ой', + y : 'бир йил', + yy : '%d йил' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/vi.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/vi.js new file mode 100644 index 0000000..15ec7dd --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/vi.js @@ -0,0 +1,64 @@ +// moment.js locale configuration +// locale : vietnamese (vi) +// author : Bang Nguyen : https://github.com/bangnk + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('vi', { + months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'), + monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'), + weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tÆ°_thứ năm_thứ sáu_thứ bảy'.split('_'), + weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM [năm] YYYY', + LLL : 'D MMMM [năm] YYYY LT', + LLLL : 'dddd, D MMMM [năm] YYYY LT', + l : 'DD/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY LT', + llll : 'ddd, D MMM YYYY LT' + }, + calendar : { + sameDay: '[Hôm nay lúc] LT', + nextDay: '[Ngày mai lúc] LT', + nextWeek: 'dddd [tuần tá»›i lúc] LT', + lastDay: '[Hôm qua lúc] LT', + lastWeek: 'dddd [tuần rồi lúc] LT', + sameElse: 'L' + }, + relativeTime : { + future : '%s tá»›i', + past : '%s trÆ°á»›c', + s : 'vài giây', + m : 'má»™t phút', + mm : '%d phút', + h : 'má»™t giá»', + hh : '%d giá»', + d : 'má»™t ngày', + dd : '%d ngày', + M : 'má»™t tháng', + MM : '%d tháng', + y : 'má»™t năm', + yy : '%d năm' + }, + ordinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/zh-cn.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/zh-cn.js new file mode 100644 index 0000000..da83416 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/zh-cn.js @@ -0,0 +1,125 @@ +// moment.js locale configuration +// locale : chinese (zh-cn) +// author : suupic : https://github.com/suupic +// author : Zeno Zeng : https://github.com/zenozeng + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('zh-cn', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'), + weekdaysMin : 'æ—¥_一_二_三_å››_五_å…­'.split('_'), + longDateFormat : { + LT : 'Ah点mm', + LTS : 'Ah点m分s秒', + L : 'YYYY-MM-DD', + LL : 'YYYYå¹´MMMDæ—¥', + LLL : 'YYYYå¹´MMMDæ—¥LT', + LLLL : 'YYYYå¹´MMMDæ—¥ddddLT', + l : 'YYYY-MM-DD', + ll : 'YYYYå¹´MMMDæ—¥', + lll : 'YYYYå¹´MMMDæ—¥LT', + llll : 'YYYYå¹´MMMDæ—¥ddddLT' + }, + meridiemParse: /凌晨|早上|上åˆ|中åˆ|下åˆ|晚上/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '凌晨' || meridiem === '早上' || + meridiem === '上åˆ') { + return hour; + } else if (meridiem === '下åˆ' || meridiem === '晚上') { + return hour + 12; + } else { + // '中åˆ' + return hour >= 11 ? hour : hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return '凌晨'; + } else if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上åˆ'; + } else if (hm < 1230) { + return '中åˆ'; + } else if (hm < 1800) { + return '下åˆ'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : function () { + return this.minutes() === 0 ? '[今天]Ah[点整]' : '[今天]LT'; + }, + nextDay : function () { + return this.minutes() === 0 ? '[明天]Ah[点整]' : '[明天]LT'; + }, + lastDay : function () { + return this.minutes() === 0 ? '[昨天]Ah[点整]' : '[昨天]LT'; + }, + nextWeek : function () { + var startOfWeek, prefix; + startOfWeek = moment().startOf('week'); + prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]'; + return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; + }, + lastWeek : function () { + var startOfWeek, prefix; + startOfWeek = moment().startOf('week'); + prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]'; + return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; + }, + sameElse : 'LL' + }, + ordinalParse: /\d{1,2}(æ—¥|月|周)/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + 'æ—¥'; + case 'M': + return number + '月'; + case 'w': + case 'W': + return number + '周'; + default: + return number; + } + }, + relativeTime : { + future : '%s内', + past : '%så‰', + s : '几秒', + m : '1分钟', + mm : '%d分钟', + h : '1å°æ—¶', + hh : '%då°æ—¶', + d : '1天', + dd : '%d天', + M : '1个月', + MM : '%d个月', + y : '1å¹´', + yy : '%då¹´' + }, + week : { + // GB/T 7408-1994《数æ®å…ƒå’Œäº¤æ¢æ ¼å¼Â·ä¿¡æ¯äº¤æ¢Â·æ—¥æœŸå’Œæ—¶é—´è¡¨ç¤ºæ³•ã€‹ä¸ŽISO 8601:1988等效 + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/zh-tw.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/zh-tw.js new file mode 100644 index 0000000..75c974d --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/locale/zh-tw.js @@ -0,0 +1,99 @@ +// moment.js locale configuration +// locale : traditional chinese (zh-tw) +// author : Ben : https://github.com/ben-lin + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('zh-tw', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), + weekdaysMin : 'æ—¥_一_二_三_å››_五_å…­'.split('_'), + longDateFormat : { + LT : 'Ah點mm', + LTS : 'Ah點m分s秒', + L : 'YYYYå¹´MMMDæ—¥', + LL : 'YYYYå¹´MMMDæ—¥', + LLL : 'YYYYå¹´MMMDæ—¥LT', + LLLL : 'YYYYå¹´MMMDæ—¥ddddLT', + l : 'YYYYå¹´MMMDæ—¥', + ll : 'YYYYå¹´MMMDæ—¥', + lll : 'YYYYå¹´MMMDæ—¥LT', + llll : 'YYYYå¹´MMMDæ—¥ddddLT' + }, + meridiemParse: /早上|上åˆ|中åˆ|下åˆ|晚上/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '早上' || meridiem === '上åˆ') { + return hour; + } else if (meridiem === '中åˆ') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === '下åˆ' || meridiem === '晚上') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上åˆ'; + } else if (hm < 1230) { + return '中åˆ'; + } else if (hm < 1800) { + return '下åˆ'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : '[今天]LT', + nextDay : '[明天]LT', + nextWeek : '[下]ddddLT', + lastDay : '[昨天]LT', + lastWeek : '[上]ddddLT', + sameElse : 'L' + }, + ordinalParse: /\d{1,2}(æ—¥|月|週)/, + ordinal : function (number, period) { + switch (period) { + case 'd' : + case 'D' : + case 'DDD' : + return number + 'æ—¥'; + case 'M' : + return number + '月'; + case 'w' : + case 'W' : + return number + '週'; + default : + return number; + } + }, + relativeTime : { + future : '%så…§', + past : '%så‰', + s : '幾秒', + m : '一分é˜', + mm : '%d分é˜', + h : '一å°æ™‚', + hh : '%då°æ™‚', + d : '一天', + dd : '%d天', + M : '一個月', + MM : '%d個月', + y : '一年', + yy : '%då¹´' + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/min/locales.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/min/locales.js new file mode 100644 index 0000000..e93562b --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/min/locales.js @@ -0,0 +1,7306 @@ +// moment.js locale configuration +// locale : afrikaans (af) +// author : Werner Mollentze : https://github.com/wernerm + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('af', { + months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'), + weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'), + weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'), + meridiemParse: /vm|nm/i, + isPM : function (input) { + return /^nm$/i.test(input); + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower ? 'vm' : 'VM'; + } else { + return isLower ? 'nm' : 'NM'; + } + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Vandag om] LT', + nextDay : '[Môre om] LT', + nextWeek : 'dddd [om] LT', + lastDay : '[Gister om] LT', + lastWeek : '[Laas] dddd [om] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'oor %s', + past : '%s gelede', + s : '\'n paar sekondes', + m : '\'n minuut', + mm : '%d minute', + h : '\'n uur', + hh : '%d ure', + d : '\'n dag', + dd : '%d dae', + M : '\'n maand', + MM : '%d maande', + y : '\'n jaar', + yy : '%d jaar' + }, + ordinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter + }, + week : { + dow : 1, // Maandag is die eerste dag van die week. + doy : 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar. + } + }); +})); + +// moment.js locale configuration +// locale : Moroccan Arabic (ar-ma) +// author : ElFadili Yassine : https://github.com/ElFadiliY +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ar-ma', { + months : 'يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + monthsShort : 'يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'ÙÙŠ %s', + past : 'منذ %s', + s : 'ثوان', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Arabic Saudi Arabia (ar-sa) +// author : Suhail Alkowaileet : https://github.com/xsoh + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': 'Ù¡', + '2': 'Ù¢', + '3': 'Ù£', + '4': 'Ù¤', + '5': 'Ù¥', + '6': 'Ù¦', + '7': 'Ù§', + '8': 'Ù¨', + '9': 'Ù©', + '0': 'Ù ' + }, numberMap = { + 'Ù¡': '1', + 'Ù¢': '2', + 'Ù£': '3', + 'Ù¤': '4', + 'Ù¥': '5', + 'Ù¦': '6', + 'Ù§': '7', + 'Ù¨': '8', + 'Ù©': '9', + 'Ù ': '0' + }; + + return moment.defineLocale('ar-sa', { + months : 'يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + monthsShort : 'يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + meridiemParse: /ص|Ù…/, + isPM : function (input) { + return 'Ù…' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'Ù…'; + } + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'ÙÙŠ %s', + past : 'منذ %s', + s : 'ثوان', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + preparse: function (string) { + return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return numberMap[match]; + }).replace(/ØŒ/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, 'ØŒ'); + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Tunisian Arabic (ar-tn) + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ar-tn', { + months: 'جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + monthsShort: 'جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin: 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS: 'LT:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd D MMMM YYYY LT' + }, + calendar: { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'ÙÙŠ %s', + past: 'منذ %s', + s: 'ثوان', + m: 'دقيقة', + mm: '%d دقائق', + h: 'ساعة', + hh: '%d ساعات', + d: 'يوم', + dd: '%d أيام', + M: 'شهر', + MM: '%d أشهر', + y: 'سنة', + yy: '%d سنوات' + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// Locale: Arabic (ar) +// Author: Abdel Said: https://github.com/abdelsaid +// Changes in months, weekdays: Ahmed Elkhatib +// Native plural forms: forabi https://github.com/forabi + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': 'Ù¡', + '2': 'Ù¢', + '3': 'Ù£', + '4': 'Ù¤', + '5': 'Ù¥', + '6': 'Ù¦', + '7': 'Ù§', + '8': 'Ù¨', + '9': 'Ù©', + '0': 'Ù ' + }, numberMap = { + 'Ù¡': '1', + 'Ù¢': '2', + 'Ù£': '3', + 'Ù¤': '4', + 'Ù¥': '5', + 'Ù¦': '6', + 'Ù§': '7', + 'Ù¨': '8', + 'Ù©': '9', + 'Ù ': '0' + }, pluralForm = function (n) { + return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5; + }, plurals = { + s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'], + m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'], + h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'], + d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'], + M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'], + y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام'] + }, pluralize = function (u) { + return function (number, withoutSuffix, string, isFuture) { + var f = pluralForm(number), + str = plurals[u][pluralForm(number)]; + if (f === 2) { + str = str[withoutSuffix ? 0 : 1]; + } + return str.replace(/%d/i, number); + }; + }, months = [ + 'كانون الثاني يناير', + 'شباط Ùبراير', + 'آذار مارس', + 'نيسان أبريل', + 'أيار مايو', + 'حزيران يونيو', + 'تموز يوليو', + 'آب أغسطس', + 'أيلول سبتمبر', + 'تشرين الأول أكتوبر', + 'تشرين الثاني نوÙمبر', + 'كانون الأول ديسمبر' + ]; + + return moment.defineLocale('ar', { + months : months, + monthsShort : months, + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + meridiemParse: /ص|Ù…/, + isPM : function (input) { + return 'Ù…' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'Ù…'; + } + }, + calendar : { + sameDay: '[اليوم عند الساعة] LT', + nextDay: '[غدًا عند الساعة] LT', + nextWeek: 'dddd [عند الساعة] LT', + lastDay: '[أمس عند الساعة] LT', + lastWeek: 'dddd [عند الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'بعد %s', + past : 'منذ %s', + s : pluralize('s'), + m : pluralize('m'), + mm : pluralize('m'), + h : pluralize('h'), + hh : pluralize('h'), + d : pluralize('d'), + dd : pluralize('d'), + M : pluralize('M'), + MM : pluralize('M'), + y : pluralize('y'), + yy : pluralize('y') + }, + preparse: function (string) { + return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return numberMap[match]; + }).replace(/ØŒ/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, 'ØŒ'); + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : azerbaijani (az) +// author : topchiyev : https://github.com/topchiyev + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var suffixes = { + 1: '-inci', + 5: '-inci', + 8: '-inci', + 70: '-inci', + 80: '-inci', + + 2: '-nci', + 7: '-nci', + 20: '-nci', + 50: '-nci', + + 3: '-üncü', + 4: '-üncü', + 100: '-üncü', + + 6: '-ncı', + + 9: '-uncu', + 10: '-uncu', + 30: '-uncu', + + 60: '-ıncı', + 90: '-ıncı' + }; + return moment.defineLocale('az', { + months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'), + monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'), + weekdays : 'Bazar_Bazar ertÉ™si_ÇərÅŸÉ™nbÉ™ axÅŸamı_ÇərÅŸÉ™nbÉ™_CümÉ™ axÅŸamı_CümÉ™_ŞənbÉ™'.split('_'), + weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'), + weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[bugün saat] LT', + nextDay : '[sabah saat] LT', + nextWeek : '[gÉ™lÉ™n hÉ™ftÉ™] dddd [saat] LT', + lastDay : '[dünÉ™n] LT', + lastWeek : '[keçən hÉ™ftÉ™] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s sonra', + past : '%s É™vvÉ™l', + s : 'birneçə saniyyÉ™', + m : 'bir dÉ™qiqÉ™', + mm : '%d dÉ™qiqÉ™', + h : 'bir saat', + hh : '%d saat', + d : 'bir gün', + dd : '%d gün', + M : 'bir ay', + MM : '%d ay', + y : 'bir il', + yy : '%d il' + }, + meridiemParse: /gecÉ™|sÉ™hÉ™r|gündüz|axÅŸam/, + isPM : function (input) { + return /^(gündüz|axÅŸam)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'gecÉ™'; + } else if (hour < 12) { + return 'sÉ™hÉ™r'; + } else if (hour < 17) { + return 'gündüz'; + } else { + return 'axÅŸam'; + } + }, + ordinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/, + ordinal : function (number) { + if (number === 0) { // special case for zero + return number + '-ıncı'; + } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + + return number + (suffixes[a] || suffixes[b] || suffixes[c]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : belarusian (be) +// author : Dmitry Demidov : https://github.com/demidov91 +// author: Praleska: http://praleska.pro/ +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін', + 'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін', + 'dd': 'дзень_дні_дзён', + 'MM': 'меÑÑц_меÑÑцы_меÑÑцаў', + 'yy': 'год_гады_гадоў' + }; + if (key === 'm') { + return withoutSuffix ? 'хвіліна' : 'хвіліну'; + } + else if (key === 'h') { + return withoutSuffix ? 'гадзіна' : 'гадзіну'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñтудзень_люты_Ñакавік_краÑавік_травень_чÑрвень_ліпень_жнівень_вераÑень_каÑтрычнік_ліÑтапад_Ñнежань'.split('_'), + 'accusative': 'ÑтудзенÑ_лютага_Ñакавіка_краÑавіка_траўнÑ_чÑрвенÑ_ліпенÑ_жніўнÑ_вераÑнÑ_каÑтрычніка_ліÑтапада_ÑнежнÑ'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'нÑдзелÑ_панÑдзелак_аўторак_Ñерада_чацвер_пÑтніца_Ñубота'.split('_'), + 'accusative': 'нÑдзелю_панÑдзелак_аўторак_Ñераду_чацвер_пÑтніцу_Ñуботу'.split('_') + }, + + nounCase = (/\[ ?[Вв] ?(?:мінулую|наÑтупную)? ?\] ?dddd/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.defineLocale('be', { + months : monthsCaseReplace, + monthsShort : 'Ñтуд_лют_Ñак_краÑ_трав_чÑрв_ліп_жнів_вер_каÑÑ‚_ліÑÑ‚_Ñнеж'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'нд_пн_ат_ÑÑ€_чц_пт_Ñб'.split('_'), + weekdaysMin : 'нд_пн_ат_ÑÑ€_чц_пт_Ñб'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY г.', + LLL : 'D MMMM YYYY г., LT', + LLLL : 'dddd, D MMMM YYYY г., LT' + }, + calendar : { + sameDay: '[Ð¡Ñ‘Ð½Ð½Ñ Ñž] LT', + nextDay: '[Заўтра Ñž] LT', + lastDay: '[Учора Ñž] LT', + nextWeek: function () { + return '[У] dddd [Ñž] LT'; + }, + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return '[У мінулую] dddd [Ñž] LT'; + case 1: + case 2: + case 4: + return '[У мінулы] dddd [Ñž] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'праз %s', + past : '%s таму', + s : 'некалькі Ñекунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : relativeTimeWithPlural, + hh : relativeTimeWithPlural, + d : 'дзень', + dd : relativeTimeWithPlural, + M : 'меÑÑц', + MM : relativeTimeWithPlural, + y : 'год', + yy : relativeTimeWithPlural + }, + meridiemParse: /ночы|раніцы|днÑ|вечара/, + isPM : function (input) { + return /^(днÑ|вечара)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночы'; + } else if (hour < 12) { + return 'раніцы'; + } else if (hour < 17) { + return 'днÑ'; + } else { + return 'вечара'; + } + }, + + ordinalParse: /\d{1,2}-(Ñ–|Ñ‹|га)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-Ñ–' : number + '-Ñ‹'; + case 'D': + return number + '-га'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : bulgarian (bg) +// author : Krasen Borisov : https://github.com/kraz + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('bg', { + months : 'Ñнуари_февруари_март_април_май_юни_юли_авгуÑÑ‚_Ñептември_октомври_ноември_декември'.split('_'), + monthsShort : 'Ñнр_фев_мар_апр_май_юни_юли_авг_Ñеп_окт_ное_дек'.split('_'), + weekdays : 'неделÑ_понеделник_вторник_ÑÑ€Ñда_четвъртък_петък_Ñъбота'.split('_'), + weekdaysShort : 'нед_пон_вто_ÑÑ€Ñ_чет_пет_Ñъб'.split('_'), + weekdaysMin : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'D.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Ð”Ð½ÐµÑ Ð²] LT', + nextDay : '[Утре в] LT', + nextWeek : 'dddd [в] LT', + lastDay : '[Вчера в] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[Ð’ изминалата] dddd [в] LT'; + case 1: + case 2: + case 4: + case 5: + return '[Ð’ изминалиÑ] dddd [в] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'Ñлед %s', + past : 'преди %s', + s : 'нÑколко Ñекунди', + m : 'минута', + mm : '%d минути', + h : 'чаÑ', + hh : '%d чаÑа', + d : 'ден', + dd : '%d дни', + M : 'меÑец', + MM : '%d меÑеца', + y : 'година', + yy : '%d години' + }, + ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Bengali (bn) +// author : Kaushik Gandhi : https://github.com/kaushikgandhi + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': '১', + '2': '২', + '3': '৩', + '4': '৪', + '5': '৫', + '6': '৬', + '7': '৭', + '8': '৮', + '9': '৯', + '0': '০' + }, + numberMap = { + '১': '1', + '২': '2', + '৩': '3', + '৪': '4', + '৫': '5', + '৬': '6', + '৭': '7', + '৮': '8', + '৯': '9', + '০': '0' + }; + + return moment.defineLocale('bn', { + months : 'জানà§à§Ÿà¦¾à¦°à§€_ফেবà§à§Ÿà¦¾à¦°à§€_মারà§à¦š_à¦à¦ªà§à¦°à¦¿à¦²_মে_জà§à¦¨_জà§à¦²à¦¾à¦‡_অগাসà§à¦Ÿ_সেপà§à¦Ÿà§‡à¦®à§à¦¬à¦°_অকà§à¦Ÿà§‹à¦¬à¦°_নভেমà§à¦¬à¦°_ডিসেমà§à¦¬à¦°'.split('_'), + monthsShort : 'জানà§_ফেব_মারà§à¦š_à¦à¦ªà¦°_মে_জà§à¦¨_জà§à¦²_অগ_সেপà§à¦Ÿ_অকà§à¦Ÿà§‹_নভ_ডিসেমà§'.split('_'), + weekdays : 'রবিবার_সোমবার_মঙà§à¦—লবার_বà§à¦§à¦¬à¦¾à¦°_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿à¦¬à¦¾à¦°_শà§à¦•à§à¦°à§à¦¬à¦¾à¦°_শনিবার'.split('_'), + weekdaysShort : 'রবি_সোম_মঙà§à¦—ল_বà§à¦§_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿_শà§à¦•à§à¦°à§_শনি'.split('_'), + weekdaysMin : 'রব_সম_মঙà§à¦—_বà§_বà§à¦°à¦¿à¦¹_শà§_শনি'.split('_'), + longDateFormat : { + LT : 'A h:mm সময়', + LTS : 'A h:mm:ss সময়', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[আজ] LT', + nextDay : '[আগামীকাল] LT', + nextWeek : 'dddd, LT', + lastDay : '[গতকাল] LT', + lastWeek : '[গত] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s পরে', + past : '%s আগে', + s : 'কà¦à¦• সেকেনà§à¦¡', + m : 'à¦à¦• মিনিট', + mm : '%d মিনিট', + h : 'à¦à¦• ঘনà§à¦Ÿà¦¾', + hh : '%d ঘনà§à¦Ÿà¦¾', + d : 'à¦à¦• দিন', + dd : '%d দিন', + M : 'à¦à¦• মাস', + MM : '%d মাস', + y : 'à¦à¦• বছর', + yy : '%d বছর' + }, + preparse: function (string) { + return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /রাত|শকাল|দà§à¦ªà§à¦°|বিকেল|রাত/, + isPM: function (input) { + return /^(দà§à¦ªà§à¦°|বিকেল|রাত)$/.test(input); + }, + //Bengali is a vast language its spoken + //in different forms in various parts of the world. + //I have just generalized with most common one used + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'রাত'; + } else if (hour < 10) { + return 'শকাল'; + } else if (hour < 17) { + return 'দà§à¦ªà§à¦°'; + } else if (hour < 20) { + return 'বিকেল'; + } else { + return 'রাত'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : tibetan (bo) +// author : Thupten N. Chakrishar : https://github.com/vajradog + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': '༡', + '2': '༢', + '3': '༣', + '4': '༤', + '5': '༥', + '6': '༦', + '7': '༧', + '8': '༨', + '9': '༩', + '0': '༠' + }, + numberMap = { + '༡': '1', + '༢': '2', + '༣': '3', + '༤': '4', + '༥': '5', + '༦': '6', + '༧': '7', + '༨': '8', + '༩': '9', + '༠': '0' + }; + + return moment.defineLocale('bo', { + months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), + monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), + weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'), + weekdaysShort : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), + weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), + longDateFormat : { + LT : 'A h:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[དི་རིང] LT', + nextDay : '[སང་ཉིན] LT', + nextWeek : '[བདུན་ཕྲག་རྗེས་མ], LT', + lastDay : '[à½à¼‹à½¦à½„] LT', + lastWeek : '[བདུན་ཕྲག་མà½à½ à¼‹à½˜] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s ལ་', + past : '%s སྔན་ལ', + s : 'ལམ་སང', + m : 'སà¾à½¢à¼‹à½˜à¼‹à½‚ཅིག', + mm : '%d སà¾à½¢à¼‹à½˜', + h : 'ཆུ་ཚོད་གཅིག', + hh : '%d ཆུ་ཚོད', + d : 'ཉིན་གཅིག', + dd : '%d ཉིན་', + M : 'ཟླ་བ་གཅིག', + MM : '%d ཟླ་བ', + y : 'ལོ་གཅིག', + yy : '%d ལོ' + }, + preparse: function (string) { + return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/, + isPM: function (input) { + return /^(ཉིན་གུང|དགོང་དག|མཚན་མོ)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'མཚན་མོ'; + } else if (hour < 10) { + return 'ཞོགས་ཀས'; + } else if (hour < 17) { + return 'ཉིན་གུང'; + } else if (hour < 20) { + return 'དགོང་དག'; + } else { + return 'མཚན་མོ'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : breton (br) +// author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function relativeTimeWithMutation(number, withoutSuffix, key) { + var format = { + 'mm': 'munutenn', + 'MM': 'miz', + 'dd': 'devezh' + }; + return number + ' ' + mutation(format[key], number); + } + + function specialMutationForYears(number) { + switch (lastNumber(number)) { + case 1: + case 3: + case 4: + case 5: + case 9: + return number + ' bloaz'; + default: + return number + ' vloaz'; + } + } + + function lastNumber(number) { + if (number > 9) { + return lastNumber(number % 10); + } + return number; + } + + function mutation(text, number) { + if (number === 2) { + return softMutation(text); + } + return text; + } + + function softMutation(text) { + var mutationTable = { + 'm': 'v', + 'b': 'v', + 'd': 'z' + }; + if (mutationTable[text.charAt(0)] === undefined) { + return text; + } + return mutationTable[text.charAt(0)] + text.substring(1); + } + + return moment.defineLocale('br', { + months : 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'), + monthsShort : 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'), + weekdays : 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'), + weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'), + weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'), + longDateFormat : { + LT : 'h[e]mm A', + LTS : 'h[e]mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D [a viz] MMMM YYYY', + LLL : 'D [a viz] MMMM YYYY LT', + LLLL : 'dddd, D [a viz] MMMM YYYY LT' + }, + calendar : { + sameDay : '[Hiziv da] LT', + nextDay : '[Warc\'hoazh da] LT', + nextWeek : 'dddd [da] LT', + lastDay : '[Dec\'h da] LT', + lastWeek : 'dddd [paset da] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'a-benn %s', + past : '%s \'zo', + s : 'un nebeud segondennoù', + m : 'ur vunutenn', + mm : relativeTimeWithMutation, + h : 'un eur', + hh : '%d eur', + d : 'un devezh', + dd : relativeTimeWithMutation, + M : 'ur miz', + MM : relativeTimeWithMutation, + y : 'ur bloaz', + yy : specialMutationForYears + }, + ordinalParse: /\d{1,2}(añ|vet)/, + ordinal : function (number) { + var output = (number === 1) ? 'añ' : 'vet'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : bosnian (bs) +// author : Nedim Cholich : https://github.com/frontyard +// based on (hr) translation by Bojan Marković + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } + } + + return moment.defineLocale('bs', { + months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'), + monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'), + weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota'.split('_'), + weekdaysShort : 'ned._pon._uto._sri._Äet._pet._sub.'.split('_'), + weekdaysMin : 'ne_po_ut_sr_Äe_pe_su'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD. MM. YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[proÅ¡lu] dddd [u] LT'; + case 6: + return '[proÅ¡le] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[proÅ¡li] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'par sekundi', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'dan', + dd : translate, + M : 'mjesec', + MM : translate, + y : 'godinu', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : catalan (ca) +// author : Juan G. Hurtado : https://github.com/juanghurtado + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ca', { + months : 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'), + monthsShort : 'gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.'.split('_'), + weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'), + weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'), + weekdaysMin : 'Dg_Dl_Dt_Dc_Dj_Dv_Ds'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay : function () { + return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextDay : function () { + return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastDay : function () { + return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'fa %s', + s : 'uns segons', + m : 'un minut', + mm : '%d minuts', + h : 'una hora', + hh : '%d hores', + d : 'un dia', + dd : '%d dies', + M : 'un mes', + MM : '%d mesos', + y : 'un any', + yy : '%d anys' + }, + ordinalParse: /\d{1,2}(r|n|t|è|a)/, + ordinal : function (number, period) { + var output = (number === 1) ? 'r' : + (number === 2) ? 'n' : + (number === 3) ? 'r' : + (number === 4) ? 't' : 'è'; + if (period === 'w' || period === 'W') { + output = 'a'; + } + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : czech (cs) +// author : petrbela : https://github.com/petrbela + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var months = 'leden_únor_bÅ™ezen_duben_kvÄ›ten_Äerven_Äervenec_srpen_září_říjen_listopad_prosinec'.split('_'), + monthsShort = 'led_úno_bÅ™e_dub_kvÄ›_Ävn_Ävc_srp_zář_říj_lis_pro'.split('_'); + + function plural(n) { + return (n > 1) && (n < 5) && (~~(n / 10) !== 1); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami'; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minuty' : 'minut'); + } else { + return result + 'minutami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodin'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'den' : 'dnem'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dny' : 'dní'); + } else { + return result + 'dny'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mÄ›síc' : 'mÄ›sícem'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'mÄ›síce' : 'mÄ›síců'); + } else { + return result + 'mÄ›síci'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokem'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'let'); + } else { + return result + 'lety'; + } + break; + } + } + + return moment.defineLocale('cs', { + months : months, + monthsShort : monthsShort, + monthsParse : (function (months, monthsShort) { + var i, _monthsParse = []; + for (i = 0; i < 12; i++) { + // use custom parser to solve problem with July (Äervenec) + _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); + } + return _monthsParse; + }(months, monthsShort)), + weekdays : 'nedÄ›le_pondÄ›lí_úterý_stÅ™eda_Ätvrtek_pátek_sobota'.split('_'), + weekdaysShort : 'ne_po_út_st_Ät_pá_so'.split('_'), + weekdaysMin : 'ne_po_út_st_Ät_pá_so'.split('_'), + longDateFormat : { + LT: 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[dnes v] LT', + nextDay: '[zítra v] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedÄ›li v] LT'; + case 1: + case 2: + return '[v] dddd [v] LT'; + case 3: + return '[ve stÅ™edu v] LT'; + case 4: + return '[ve Ätvrtek v] LT'; + case 5: + return '[v pátek v] LT'; + case 6: + return '[v sobotu v] LT'; + } + }, + lastDay: '[vÄera v] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulou nedÄ›li v] LT'; + case 1: + case 2: + return '[minulé] dddd [v] LT'; + case 3: + return '[minulou stÅ™edu v] LT'; + case 4: + case 5: + return '[minulý] dddd [v] LT'; + case 6: + return '[minulou sobotu v] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pÅ™ed %s', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse : /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : chuvash (cv) +// author : Anatoly Mironov : https://github.com/mirontoli + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('cv', { + months : 'кăрлач_нарăÑ_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав'.split('_'), + monthsShort : 'кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш'.split('_'), + weekdays : 'вырÑарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_Ñрнекун_шăматкун'.split('_'), + weekdaysShort : 'выр_тун_ытл_юн_кĕç_Ñрн_шăм'.split('_'), + weekdaysMin : 'вр_тн_Ñ‹Ñ‚_юн_кç_ÑÑ€_шм'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD-MM-YYYY', + LL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]', + LLL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT', + LLLL : 'dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT' + }, + calendar : { + sameDay: '[ПаÑн] LT [Ñехетре]', + nextDay: '[Ыран] LT [Ñехетре]', + lastDay: '[Ĕнер] LT [Ñехетре]', + nextWeek: '[ÇитеÑ] dddd LT [Ñехетре]', + lastWeek: '[Иртнĕ] dddd LT [Ñехетре]', + sameElse: 'L' + }, + relativeTime : { + future : function (output) { + var affix = /Ñехет$/i.exec(output) ? 'рен' : /çул$/i.exec(output) ? 'тан' : 'ран'; + return output + affix; + }, + past : '%s каÑлла', + s : 'пĕр-ик çеккунт', + m : 'пĕр минут', + mm : '%d минут', + h : 'пĕр Ñехет', + hh : '%d Ñехет', + d : 'пĕр кун', + dd : '%d кун', + M : 'пĕр уйăх', + MM : '%d уйăх', + y : 'пĕр çул', + yy : '%d çул' + }, + ordinalParse: /\d{1,2}-мĕш/, + ordinal : '%d-мĕш', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Welsh (cy) +// author : Robert Allen + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('cy', { + months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'), + monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'), + weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'), + weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'), + weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'), + // time formats are the same as en-gb + longDateFormat: { + LT: 'HH:mm', + LTS : 'LT:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd, D MMMM YYYY LT' + }, + calendar: { + sameDay: '[Heddiw am] LT', + nextDay: '[Yfory am] LT', + nextWeek: 'dddd [am] LT', + lastDay: '[Ddoe am] LT', + lastWeek: 'dddd [diwethaf am] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'mewn %s', + past: '%s yn ôl', + s: 'ychydig eiliadau', + m: 'munud', + mm: '%d munud', + h: 'awr', + hh: '%d awr', + d: 'diwrnod', + dd: '%d diwrnod', + M: 'mis', + MM: '%d mis', + y: 'blwyddyn', + yy: '%d flynedd' + }, + ordinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/, + // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh + ordinal: function (number) { + var b = number, + output = '', + lookup = [ + '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed + 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed + ]; + + if (b > 20) { + if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) { + output = 'fed'; // not 30ain, 70ain or 90ain + } else { + output = 'ain'; + } + } else if (b > 0) { + output = lookup[b]; + } + + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : danish (da) +// author : Ulrik Nielsen : https://github.com/mrbase + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('da', { + months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), + weekdaysShort : 'søn_man_tir_ons_tor_fre_lør'.split('_'), + weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd [d.] D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[I dag kl.] LT', + nextDay : '[I morgen kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[I gÃ¥r kl.] LT', + lastWeek : '[sidste] dddd [kl] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'om %s', + past : '%s siden', + s : 'fÃ¥ sekunder', + m : 'et minut', + mm : '%d minutter', + h : 'en time', + hh : '%d timer', + d : 'en dag', + dd : '%d dage', + M : 'en mÃ¥ned', + MM : '%d mÃ¥neder', + y : 'et Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : austrian german (de-at) +// author : lluchs : https://github.com/lluchs +// author: Menelion Elensúle: https://github.com/Oire +// author : Martin Groller : https://github.com/MadMG + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + return moment.defineLocale('de-at', { + months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[Heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[Morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[Gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : german (de) +// author : lluchs : https://github.com/lluchs +// author: Menelion Elensúle: https://github.com/Oire + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + return moment.defineLocale('de', { + months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[Heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[Morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[Gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : modern greek (el) +// author : Aggelos Karalias : https://github.com/mehiel + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('el', { + monthsNominativeEl : 'ΙανουάÏιος_ΦεβÏουάÏιος_ΜάÏτιος_ΑπÏίλιος_Μάιος_ΙοÏνιος_ΙοÏλιος_ΑÏγουστος_ΣεπτέμβÏιος_ΟκτώβÏιος_ÎοέμβÏιος_ΔεκέμβÏιος'.split('_'), + monthsGenitiveEl : 'ΙανουαÏίου_ΦεβÏουαÏίου_ΜαÏτίου_ΑπÏιλίου_ΜαÎου_Ιουνίου_Ιουλίου_ΑυγοÏστου_ΣεπτεμβÏίου_ΟκτωβÏίου_ÎοεμβÏίου_ΔεκεμβÏίου'.split('_'), + months : function (momentToFormat, format) { + if (/D/.test(format.substring(0, format.indexOf('MMMM')))) { // if there is a day number before 'MMMM' + return this._monthsGenitiveEl[momentToFormat.month()]; + } else { + return this._monthsNominativeEl[momentToFormat.month()]; + } + }, + monthsShort : 'Ιαν_Φεβ_ΜαÏ_ΑπÏ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Îοε_Δεκ'.split('_'), + weekdays : 'ΚυÏιακή_ΔευτέÏα_ΤÏίτη_ΤετάÏτη_Πέμπτη_ΠαÏασκευή_Σάββατο'.split('_'), + weekdaysShort : 'ΚυÏ_Δευ_ΤÏι_Τετ_Πεμ_ΠαÏ_Σαβ'.split('_'), + weekdaysMin : 'Κυ_Δε_ΤÏ_Τε_Πε_Πα_Σα'.split('_'), + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'μμ' : 'ΜΜ'; + } else { + return isLower ? 'πμ' : 'ΠΜ'; + } + }, + isPM : function (input) { + return ((input + '').toLowerCase()[0] === 'μ'); + }, + meridiemParse : /[ΠΜ]\.?Îœ?\.?/i, + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendarEl : { + sameDay : '[ΣήμεÏα {}] LT', + nextDay : '[ΑÏÏιο {}] LT', + nextWeek : 'dddd [{}] LT', + lastDay : '[Χθες {}] LT', + lastWeek : function () { + switch (this.day()) { + case 6: + return '[το Ï€ÏοηγοÏμενο] dddd [{}] LT'; + default: + return '[την Ï€ÏοηγοÏμενη] dddd [{}] LT'; + } + }, + sameElse : 'L' + }, + calendar : function (key, mom) { + var output = this._calendarEl[key], + hours = mom && mom.hours(); + + if (typeof output === 'function') { + output = output.apply(mom); + } + + return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις')); + }, + relativeTime : { + future : 'σε %s', + past : '%s Ï€Ïιν', + s : 'λίγα δευτεÏόλεπτα', + m : 'ένα λεπτό', + mm : '%d λεπτά', + h : 'μία ÏŽÏα', + hh : '%d ÏŽÏες', + d : 'μία μέÏα', + dd : '%d μέÏες', + M : 'ένας μήνας', + MM : '%d μήνες', + y : 'ένας χÏόνος', + yy : '%d χÏόνια' + }, + ordinalParse: /\d{1,2}η/, + ordinal: '%dη', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : australian english (en-au) + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('en-au', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + 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' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : canadian english (en-ca) +// author : Jonathan Abourbih : https://github.com/jonbca + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('en-ca', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'YYYY-MM-DD', + LL : 'D MMMM, YYYY', + LLL : 'D MMMM, YYYY LT', + LLLL : 'dddd, D MMMM, YYYY LT' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + 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' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); +})); + +// moment.js locale configuration +// locale : great britain english (en-gb) +// author : Chris Gedrim : https://github.com/chrisgedrim + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('en-gb', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + 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' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : esperanto (eo) +// author : Colin Dean : https://github.com/colindean +// komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko. +// Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni! + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('eo', { + months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aÅ­gusto_septembro_oktobro_novembro_decembro'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aÅ­g_sep_okt_nov_dec'.split('_'), + weekdays : 'Dimanĉo_Lundo_Mardo_Merkredo_Ä´aÅ­do_Vendredo_Sabato'.split('_'), + weekdaysShort : 'Dim_Lun_Mard_Merk_Ä´aÅ­_Ven_Sab'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Ä´a_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'D[-an de] MMMM, YYYY', + LLL : 'D[-an de] MMMM, YYYY LT', + LLLL : 'dddd, [la] D[-an de] MMMM, YYYY LT' + }, + meridiemParse: /[ap]\.t\.m/i, + isPM: function (input) { + return input.charAt(0).toLowerCase() === 'p'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'p.t.m.' : 'P.T.M.'; + } else { + return isLower ? 'a.t.m.' : 'A.T.M.'; + } + }, + calendar : { + sameDay : '[HodiaÅ­ je] LT', + nextDay : '[MorgaÅ­ je] LT', + nextWeek : 'dddd [je] LT', + lastDay : '[HieraÅ­ je] LT', + lastWeek : '[pasinta] dddd [je] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'je %s', + past : 'antaÅ­ %s', + s : 'sekundoj', + m : 'minuto', + mm : '%d minutoj', + h : 'horo', + hh : '%d horoj', + d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo + dd : '%d tagoj', + M : 'monato', + MM : '%d monatoj', + y : 'jaro', + yy : '%d jaroj' + }, + ordinalParse: /\d{1,2}a/, + ordinal : '%da', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : spanish (es) +// author : Julio Napurí : https://github.com/julionc + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), + monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); + + return moment.defineLocale('es', { + months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return monthsShort[m.month()]; + } else { + return monthsShortDot[m.month()]; + } + }, + weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), + weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), + weekdaysMin : 'Do_Lu_Ma_Mi_Ju_Vi_Sá'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY LT', + LLLL : 'dddd, D [de] MMMM [de] YYYY LT' + }, + calendar : { + sameDay : function () { + return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextDay : function () { + return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastDay : function () { + return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'hace %s', + s : 'unos segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'una hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un año', + yy : '%d años' + }, + ordinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : estonian (et) +// author : Henry Kehlmann : https://github.com/madhenry +// improvements : Illimar Tambek : https://github.com/ragulka + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'], + 'm' : ['ühe minuti', 'üks minut'], + 'mm': [number + ' minuti', number + ' minutit'], + 'h' : ['ühe tunni', 'tund aega', 'üks tund'], + 'hh': [number + ' tunni', number + ' tundi'], + 'd' : ['ühe päeva', 'üks päev'], + 'M' : ['kuu aja', 'kuu aega', 'üks kuu'], + 'MM': [number + ' kuu', number + ' kuud'], + 'y' : ['ühe aasta', 'aasta', 'üks aasta'], + 'yy': [number + ' aasta', number + ' aastat'] + }; + if (withoutSuffix) { + return format[key][2] ? format[key][2] : format[key][1]; + } + return isFuture ? format[key][0] : format[key][1]; + } + + return moment.defineLocale('et', { + months : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'), + monthsShort : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'), + weekdays : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'), + weekdaysShort : 'P_E_T_K_N_R_L'.split('_'), + weekdaysMin : 'P_E_T_K_N_R_L'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[Täna,] LT', + nextDay : '[Homme,] LT', + nextWeek : '[Järgmine] dddd LT', + lastDay : '[Eile,] LT', + lastWeek : '[Eelmine] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s pärast', + past : '%s tagasi', + s : processRelativeTime, + m : processRelativeTime, + mm : processRelativeTime, + h : processRelativeTime, + hh : processRelativeTime, + d : processRelativeTime, + dd : '%d päeva', + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : euskara (eu) +// author : Eneko Illarramendi : https://github.com/eillarra + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('eu', { + months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'), + monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'), + weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'), + weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'), + weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY[ko] MMMM[ren] D[a]', + LLL : 'YYYY[ko] MMMM[ren] D[a] LT', + LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] LT', + l : 'YYYY-M-D', + ll : 'YYYY[ko] MMM D[a]', + lll : 'YYYY[ko] MMM D[a] LT', + llll : 'ddd, YYYY[ko] MMM D[a] LT' + }, + calendar : { + sameDay : '[gaur] LT[etan]', + nextDay : '[bihar] LT[etan]', + nextWeek : 'dddd LT[etan]', + lastDay : '[atzo] LT[etan]', + lastWeek : '[aurreko] dddd LT[etan]', + sameElse : 'L' + }, + relativeTime : { + future : '%s barru', + past : 'duela %s', + s : 'segundo batzuk', + m : 'minutu bat', + mm : '%d minutu', + h : 'ordu bat', + hh : '%d ordu', + d : 'egun bat', + dd : '%d egun', + M : 'hilabete bat', + MM : '%d hilabete', + y : 'urte bat', + yy : '%d urte' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Persian (fa) +// author : Ebrahim Byagowi : https://github.com/ebraminio + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': 'Û±', + '2': 'Û²', + '3': 'Û³', + '4': 'Û´', + '5': 'Ûµ', + '6': 'Û¶', + '7': 'Û·', + '8': 'Û¸', + '9': 'Û¹', + '0': 'Û°' + }, numberMap = { + 'Û±': '1', + 'Û²': '2', + 'Û³': '3', + 'Û´': '4', + 'Ûµ': '5', + 'Û¶': '6', + 'Û·': '7', + 'Û¸': '8', + 'Û¹': '9', + 'Û°': '0' + }; + + return moment.defineLocale('fa', { + months : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + monthsShort : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysMin : 'ÛŒ_د_س_Ú†_Ù¾_ج_Ø´'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + meridiemParse: /قبل از ظهر|بعد از ظهر/, + isPM: function (input) { + return /بعد از ظهر/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'قبل از ظهر'; + } else { + return 'بعد از ظهر'; + } + }, + calendar : { + sameDay : '[امروز ساعت] LT', + nextDay : '[Ùردا ساعت] LT', + nextWeek : 'dddd [ساعت] LT', + lastDay : '[دیروز ساعت] LT', + lastWeek : 'dddd [پیش] [ساعت] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'در %s', + past : '%s پیش', + s : 'چندین ثانیه', + m : 'یک دقیقه', + mm : '%d دقیقه', + h : 'یک ساعت', + hh : '%d ساعت', + d : 'یک روز', + dd : '%d روز', + M : 'یک ماه', + MM : '%d ماه', + y : 'یک سال', + yy : '%d سال' + }, + preparse: function (string) { + return string.replace(/[Û°-Û¹]/g, function (match) { + return numberMap[match]; + }).replace(/ØŒ/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, 'ØŒ'); + }, + ordinalParse: /\d{1,2}Ù…/, + ordinal : '%dÙ…', + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : finnish (fi) +// author : Tarmo Aidantausta : https://github.com/bleadof + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '), + numbersFuture = [ + 'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden', + numbersPast[7], numbersPast[8], numbersPast[9] + ]; + + function translate(number, withoutSuffix, key, isFuture) { + var result = ''; + switch (key) { + case 's': + return isFuture ? 'muutaman sekunnin' : 'muutama sekunti'; + case 'm': + return isFuture ? 'minuutin' : 'minuutti'; + case 'mm': + result = isFuture ? 'minuutin' : 'minuuttia'; + break; + case 'h': + return isFuture ? 'tunnin' : 'tunti'; + case 'hh': + result = isFuture ? 'tunnin' : 'tuntia'; + break; + case 'd': + return isFuture ? 'päivän' : 'päivä'; + case 'dd': + result = isFuture ? 'päivän' : 'päivää'; + break; + case 'M': + return isFuture ? 'kuukauden' : 'kuukausi'; + case 'MM': + result = isFuture ? 'kuukauden' : 'kuukautta'; + break; + case 'y': + return isFuture ? 'vuoden' : 'vuosi'; + case 'yy': + result = isFuture ? 'vuoden' : 'vuotta'; + break; + } + result = verbalNumber(number, isFuture) + ' ' + result; + return result; + } + + function verbalNumber(number, isFuture) { + return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number; + } + + return moment.defineLocale('fi', { + months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'), + monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'), + weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'), + weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'), + weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD.MM.YYYY', + LL : 'Do MMMM[ta] YYYY', + LLL : 'Do MMMM[ta] YYYY, [klo] LT', + LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] LT', + l : 'D.M.YYYY', + ll : 'Do MMM YYYY', + lll : 'Do MMM YYYY, [klo] LT', + llll : 'ddd, Do MMM YYYY, [klo] LT' + }, + calendar : { + sameDay : '[tänään] [klo] LT', + nextDay : '[huomenna] [klo] LT', + nextWeek : 'dddd [klo] LT', + lastDay : '[eilen] [klo] LT', + lastWeek : '[viime] dddd[na] [klo] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s päästä', + past : '%s sitten', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : faroese (fo) +// author : Ragnar Johannesen : https://github.com/ragnar123 + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('fo', { + months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'), + weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'), + weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D. MMMM, YYYY LT' + }, + calendar : { + sameDay : '[à dag kl.] LT', + nextDay : '[à morgin kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[à gjár kl.] LT', + lastWeek : '[síðstu] dddd [kl] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'um %s', + past : '%s síðani', + s : 'fá sekund', + m : 'ein minutt', + mm : '%d minuttir', + h : 'ein tími', + hh : '%d tímar', + d : 'ein dagur', + dd : '%d dagar', + M : 'ein mánaði', + MM : '%d mánaðir', + y : 'eitt ár', + yy : '%d ár' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : canadian french (fr-ca) +// author : Jonathan Abourbih : https://github.com/jonbca + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('fr-ca', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Aujourd\'hui à] LT', + nextDay: '[Demain à] LT', + nextWeek: 'dddd [à] LT', + lastDay: '[Hier à] LT', + lastWeek: 'dddd [dernier à] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + ordinalParse: /\d{1,2}(er|)/, + ordinal : function (number) { + return number + (number === 1 ? 'er' : ''); + } + }); +})); + +// moment.js locale configuration +// locale : french (fr) +// author : John Fischer : https://github.com/jfroffice + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('fr', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Aujourd\'hui à] LT', + nextDay: '[Demain à] LT', + nextWeek: 'dddd [à] LT', + lastDay: '[Hier à] LT', + lastWeek: 'dddd [dernier à] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + ordinalParse: /\d{1,2}(er|)/, + ordinal : function (number) { + return number + (number === 1 ? 'er' : ''); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : frisian (fy) +// author : Robin van der Vliet : https://github.com/robin0van0der0v + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'); + + return moment.defineLocale('fy', { + months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'), + weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'), + weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[hjoed om] LT', + nextDay: '[moarn om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[juster om] LT', + lastWeek: '[ôfrûne] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'oer %s', + past : '%s lyn', + s : 'in pear sekonden', + m : 'ien minút', + mm : '%d minuten', + h : 'ien oere', + hh : '%d oeren', + d : 'ien dei', + dd : '%d dagen', + M : 'ien moanne', + MM : '%d moannen', + y : 'ien jier', + yy : '%d jierren' + }, + ordinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : galician (gl) +// author : Juan G. Hurtado : https://github.com/juanghurtado + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('gl', { + months : 'Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro'.split('_'), + monthsShort : 'Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.'.split('_'), + weekdays : 'Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado'.split('_'), + weekdaysShort : 'Dom._Lun._Mar._Mér._Xov._Ven._Sáb.'.split('_'), + weekdaysMin : 'Do_Lu_Ma_Mé_Xo_Ve_Sá'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay : function () { + return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextDay : function () { + return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextWeek : function () { + return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + lastDay : function () { + return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT'; + }, + lastWeek : function () { + return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : function (str) { + if (str === 'uns segundos') { + return 'nuns segundos'; + } + return 'en ' + str; + }, + past : 'hai %s', + s : 'uns segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'unha hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un ano', + yy : '%d anos' + }, + ordinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Hebrew (he) +// author : Tomer Cohen : https://github.com/tomer +// author : Moshe Simantov : https://github.com/DevelopmentIL +// author : Tal Ater : https://github.com/TalAter + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('he', { + months : 'ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר'.split('_'), + monthsShort : 'ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳'.split('_'), + weekdays : 'ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'), + weekdaysShort : '×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'), + weekdaysMin : '×_ב_×’_ד_×”_ו_ש'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [ב]MMMM YYYY', + LLL : 'D [ב]MMMM YYYY LT', + LLLL : 'dddd, D [ב]MMMM YYYY LT', + l : 'D/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY LT', + llll : 'ddd, D MMM YYYY LT' + }, + calendar : { + sameDay : '[×”×™×•× ×‘Ö¾]LT', + nextDay : '[מחר ב־]LT', + nextWeek : 'dddd [בשעה] LT', + lastDay : '[×תמול ב־]LT', + lastWeek : '[ביו×] dddd [×”×חרון בשעה] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'בעוד %s', + past : 'לפני %s', + s : 'מספר שניות', + m : 'דקה', + mm : '%d דקות', + h : 'שעה', + hh : function (number) { + if (number === 2) { + return 'שעתיי×'; + } + return number + ' שעות'; + }, + d : 'יו×', + dd : function (number) { + if (number === 2) { + return 'יומיי×'; + } + return number + ' ימי×'; + }, + M : 'חודש', + MM : function (number) { + if (number === 2) { + return 'חודשיי×'; + } + return number + ' חודשי×'; + }, + y : 'שנה', + yy : function (number) { + if (number === 2) { + return 'שנתיי×'; + } else if (number % 10 === 0 && number !== 10) { + return number + ' שנה'; + } + return number + ' שני×'; + } + } + }); +})); + +// moment.js locale configuration +// locale : hindi (hi) +// author : Mayank Singhal : https://github.com/mayanksinghal + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.defineLocale('hi', { + months : 'जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°'.split('_'), + monthsShort : 'जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.'.split('_'), + weekdays : 'रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split('_'), + weekdaysShort : 'रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split('_'), + weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split('_'), + longDateFormat : { + LT : 'A h:mm बजे', + LTS : 'A h:mm:ss बजे', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[कल] LT', + nextWeek : 'dddd, LT', + lastDay : '[कल] LT', + lastWeek : '[पिछले] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s में', + past : '%s पहले', + s : 'कà¥à¤› ही कà¥à¤·à¤£', + m : 'à¤à¤• मिनट', + mm : '%d मिनट', + h : 'à¤à¤• घंटा', + hh : '%d घंटे', + d : 'à¤à¤• दिन', + dd : '%d दिन', + M : 'à¤à¤• महीने', + MM : '%d महीने', + y : 'à¤à¤• वरà¥à¤·', + yy : '%d वरà¥à¤·' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + // Hindi notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi. + meridiemParse: /रात|सà¥à¤¬à¤¹|दोपहर|शाम/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'रात') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'सà¥à¤¬à¤¹') { + return hour; + } else if (meridiem === 'दोपहर') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'शाम') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'रात'; + } else if (hour < 10) { + return 'सà¥à¤¬à¤¹'; + } else if (hour < 17) { + return 'दोपहर'; + } else if (hour < 20) { + return 'शाम'; + } else { + return 'रात'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : hrvatski (hr) +// author : Bojan Marković : https://github.com/bmarkovic + +// based on (sl) translation by Robert SedovÅ¡ek + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } + } + + return moment.defineLocale('hr', { + months : 'sjeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_'), + monthsShort : 'sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'), + weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota'.split('_'), + weekdaysShort : 'ned._pon._uto._sri._Äet._pet._sub.'.split('_'), + weekdaysMin : 'ne_po_ut_sr_Äe_pe_su'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD. MM. YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[proÅ¡lu] dddd [u] LT'; + case 6: + return '[proÅ¡le] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[proÅ¡li] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'par sekundi', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'dan', + dd : translate, + M : 'mjesec', + MM : translate, + y : 'godinu', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : hungarian (hu) +// author : Adam Brunner : https://github.com/adambrunner + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var weekEndings = 'vasárnap hétfÅ‘n kedden szerdán csütörtökön pénteken szombaton'.split(' '); + + function translate(number, withoutSuffix, key, isFuture) { + var num = number, + suffix; + + switch (key) { + case 's': + return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce'; + case 'm': + return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'mm': + return num + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'h': + return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'hh': + return num + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'd': + return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'dd': + return num + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'M': + return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'MM': + return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'y': + return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve'); + case 'yy': + return num + (isFuture || withoutSuffix ? ' év' : ' éve'); + } + + return ''; + } + + function week(isFuture) { + return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]'; + } + + return moment.defineLocale('hu', { + months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'), + monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'), + weekdays : 'vasárnap_hétfÅ‘_kedd_szerda_csütörtök_péntek_szombat'.split('_'), + weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'), + weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'YYYY.MM.DD.', + LL : 'YYYY. MMMM D.', + LLL : 'YYYY. MMMM D., LT', + LLLL : 'YYYY. MMMM D., dddd LT' + }, + meridiemParse: /de|du/i, + isPM: function (input) { + return input.charAt(1).toLowerCase() === 'u'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower === true ? 'de' : 'DE'; + } else { + return isLower === true ? 'du' : 'DU'; + } + }, + calendar : { + sameDay : '[ma] LT[-kor]', + nextDay : '[holnap] LT[-kor]', + nextWeek : function () { + return week.call(this, true); + }, + lastDay : '[tegnap] LT[-kor]', + lastWeek : function () { + return week.call(this, false); + }, + sameElse : 'L' + }, + relativeTime : { + future : '%s múlva', + past : '%s', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Armenian (hy-am) +// author : Armendarabyan : https://github.com/armendarabyan + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€_Õ´Õ¡Ö€Õ¿_Õ¡ÕºÖ€Õ«Õ¬_Õ´Õ¡ÕµÕ«Õ½_Õ°Õ¸Ö‚Õ¶Õ«Õ½_Õ°Õ¸Ö‚Õ¬Õ«Õ½_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€'.split('_'), + 'accusative': 'Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€Õ«_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€Õ«_Õ´Õ¡Ö€Õ¿Õ«_Õ¡ÕºÖ€Õ«Õ¬Õ«_Õ´Õ¡ÕµÕ«Õ½Õ«_Õ°Õ¸Ö‚Õ¶Õ«Õ½Õ«_Õ°Õ¸Ö‚Õ¬Õ«Õ½Õ«_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½Õ«_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function monthsShortCaseReplace(m, format) { + var monthsShort = 'Õ°Õ¶Õ¾_ÖƒÕ¿Ö€_Õ´Ö€Õ¿_Õ¡ÕºÖ€_Õ´ÕµÕ½_Õ°Õ¶Õ½_Õ°Õ¬Õ½_Ö…Õ£Õ½_Õ½ÕºÕ¿_Õ°Õ¯Õ¿_Õ¶Õ´Õ¢_Õ¤Õ¯Õ¿'.split('_'); + + return monthsShort[m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = 'Õ¯Õ«Ö€Õ¡Õ¯Õ«_Õ¥Ö€Õ¯Õ¸Ö‚Õ·Õ¡Õ¢Õ©Õ«_Õ¥Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ¹Õ¸Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ°Õ«Õ¶Õ£Õ·Õ¡Õ¢Õ©Õ«_Õ¸Ö‚Ö€Õ¢Õ¡Õ©_Õ·Õ¡Õ¢Õ¡Õ©'.split('_'); + + return weekdays[m.day()]; + } + + return moment.defineLocale('hy-am', { + months : monthsCaseReplace, + monthsShort : monthsShortCaseReplace, + weekdays : weekdaysCaseReplace, + weekdaysShort : 'Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©'.split('_'), + weekdaysMin : 'Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY Õ©.', + LLL : 'D MMMM YYYY Õ©., LT', + LLLL : 'dddd, D MMMM YYYY Õ©., LT' + }, + calendar : { + sameDay: '[Õ¡ÕµÕ½Ö…Ö€] LT', + nextDay: '[Õ¾Õ¡Õ²Õ¨] LT', + lastDay: '[Õ¥Ö€Õ¥Õ¯] LT', + nextWeek: function () { + return 'dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT'; + }, + lastWeek: function () { + return '[Õ¡Õ¶ÖÕ¡Õ®] dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT'; + }, + sameElse: 'L' + }, + relativeTime : { + future : '%s Õ°Õ¥Õ¿Õ¸', + past : '%s Õ¡Õ¼Õ¡Õ»', + s : 'Õ´Õ« Ö„Õ¡Õ¶Õ« Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶', + m : 'Ö€Õ¸ÕºÕ¥', + mm : '%d Ö€Õ¸ÕºÕ¥', + h : 'ÕªÕ¡Õ´', + hh : '%d ÕªÕ¡Õ´', + d : 'Ö…Ö€', + dd : '%d Ö…Ö€', + M : 'Õ¡Õ´Õ«Õ½', + MM : '%d Õ¡Õ´Õ«Õ½', + y : 'Õ¿Õ¡Ö€Õ«', + yy : '%d Õ¿Õ¡Ö€Õ«' + }, + + meridiemParse: /Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡|Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡|ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶/, + isPM: function (input) { + return /^(ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶)$/.test(input); + }, + meridiem : function (hour) { + if (hour < 4) { + return 'Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡'; + } else if (hour < 12) { + return 'Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡'; + } else if (hour < 17) { + return 'ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡'; + } else { + return 'Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶'; + } + }, + + ordinalParse: /\d{1,2}|\d{1,2}-(Õ«Õ¶|Ö€Õ¤)/, + ordinal: function (number, period) { + switch (period) { + case 'DDD': + case 'w': + case 'W': + case 'DDDo': + if (number === 1) { + return number + '-Õ«Õ¶'; + } + return number + '-Ö€Õ¤'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Bahasa Indonesia (id) +// author : Mohammad Satrio Utomo : https://github.com/tyok +// reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('id', { + months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'), + weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'), + weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'LT.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] LT', + LLLL : 'dddd, D MMMM YYYY [pukul] LT' + }, + meridiemParse: /pagi|siang|sore|malam/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'siang') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'sore' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'siang'; + } else if (hours < 19) { + return 'sore'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Besok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kemarin pukul] LT', + lastWeek : 'dddd [lalu pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lalu', + s : 'beberapa detik', + m : 'semenit', + mm : '%d menit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : icelandic (is) +// author : Hinrik Örn Sigurðsson : https://github.com/hinrik + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function plural(n) { + if (n % 100 === 11) { + return true; + } else if (n % 10 === 1) { + return false; + } + return true; + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': + return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum'; + case 'm': + return withoutSuffix ? 'mínúta' : 'mínútu'; + case 'mm': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum'); + } else if (withoutSuffix) { + return result + 'mínúta'; + } + return result + 'mínútu'; + case 'hh': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum'); + } + return result + 'klukkustund'; + case 'd': + if (withoutSuffix) { + return 'dagur'; + } + return isFuture ? 'dag' : 'degi'; + case 'dd': + if (plural(number)) { + if (withoutSuffix) { + return result + 'dagar'; + } + return result + (isFuture ? 'daga' : 'dögum'); + } else if (withoutSuffix) { + return result + 'dagur'; + } + return result + (isFuture ? 'dag' : 'degi'); + case 'M': + if (withoutSuffix) { + return 'mánuður'; + } + return isFuture ? 'mánuð' : 'mánuði'; + case 'MM': + if (plural(number)) { + if (withoutSuffix) { + return result + 'mánuðir'; + } + return result + (isFuture ? 'mánuði' : 'mánuðum'); + } else if (withoutSuffix) { + return result + 'mánuður'; + } + return result + (isFuture ? 'mánuð' : 'mánuði'); + case 'y': + return withoutSuffix || isFuture ? 'ár' : 'ári'; + case 'yy': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'ár' : 'árum'); + } + return result + (withoutSuffix || isFuture ? 'ár' : 'ári'); + } + } + + return moment.defineLocale('is', { + months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'), + weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'), + weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'), + weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] LT', + LLLL : 'dddd, D. MMMM YYYY [kl.] LT' + }, + calendar : { + sameDay : '[í dag kl.] LT', + nextDay : '[á morgun kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[í gær kl.] LT', + lastWeek : '[síðasta] dddd [kl.] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'eftir %s', + past : 'fyrir %s síðan', + s : translate, + m : translate, + mm : translate, + h : 'klukkustund', + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : italian (it) +// author : Lorenzo : https://github.com/aliem +// author: Mattia Larentis: https://github.com/nostalgiaz + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('it', { + months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'), + monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'), + weekdays : 'Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato'.split('_'), + weekdaysShort : 'Dom_Lun_Mar_Mer_Gio_Ven_Sab'.split('_'), + weekdaysMin : 'D_L_Ma_Me_G_V_S'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Oggi alle] LT', + nextDay: '[Domani alle] LT', + nextWeek: 'dddd [alle] LT', + lastDay: '[Ieri alle] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[la scorsa] dddd [alle] LT'; + default: + return '[lo scorso] dddd [alle] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : function (s) { + return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s; + }, + past : '%s fa', + s : 'alcuni secondi', + m : 'un minuto', + mm : '%d minuti', + h : 'un\'ora', + hh : '%d ore', + d : 'un giorno', + dd : '%d giorni', + M : 'un mese', + MM : '%d mesi', + y : 'un anno', + yy : '%d anni' + }, + ordinalParse : /\d{1,2}º/, + ordinal: '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : japanese (ja) +// author : LI Long : https://github.com/baryon + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ja', { + months : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '日曜日_月曜日_ç«æ›œæ—¥_水曜日_木曜日_金曜日_土曜日'.split('_'), + weekdaysShort : 'æ—¥_月_ç«_æ°´_木_金_土'.split('_'), + weekdaysMin : 'æ—¥_月_ç«_æ°´_木_金_土'.split('_'), + longDateFormat : { + LT : 'Ah時m分', + LTS : 'LTs秒', + L : 'YYYY/MM/DD', + LL : 'YYYYå¹´M月Dæ—¥', + LLL : 'YYYYå¹´M月Dæ—¥LT', + LLLL : 'YYYYå¹´M月Dæ—¥LT dddd' + }, + meridiemParse: /åˆå‰|åˆå¾Œ/i, + isPM : function (input) { + return input === 'åˆå¾Œ'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'åˆå‰'; + } else { + return 'åˆå¾Œ'; + } + }, + calendar : { + sameDay : '[今日] LT', + nextDay : '[明日] LT', + nextWeek : '[æ¥é€±]dddd LT', + lastDay : '[昨日] LT', + lastWeek : '[å‰é€±]dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s後', + past : '%så‰', + s : '数秒', + m : '1分', + mm : '%d分', + h : '1時間', + hh : '%d時間', + d : '1æ—¥', + dd : '%dæ—¥', + M : '1ヶ月', + MM : '%dヶ月', + y : '1å¹´', + yy : '%då¹´' + } + }); +})); + +// moment.js locale configuration +// locale : Georgian (ka) +// author : Irakli Janiashvili : https://github.com/irakli-janiashvili + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'იáƒáƒœáƒ•áƒáƒ áƒ˜_თებერვáƒáƒšáƒ˜_მáƒáƒ áƒ¢áƒ˜_áƒáƒžáƒ áƒ˜áƒšáƒ˜_მáƒáƒ˜áƒ¡áƒ˜_ივნისი_ივლისი_áƒáƒ’ვისტáƒ_სექტემბერი_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი_ნáƒáƒ”მბერი_დეკემბერი'.split('_'), + 'accusative': 'იáƒáƒœáƒ•áƒáƒ áƒ¡_თებერვáƒáƒšáƒ¡_მáƒáƒ áƒ¢áƒ¡_áƒáƒžáƒ áƒ˜áƒšáƒ˜áƒ¡_მáƒáƒ˜áƒ¡áƒ¡_ივნისს_ივლისს_áƒáƒ’ვისტს_სექტემბერს_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერს_ნáƒáƒ”მბერს_დეკემბერს'.split('_') + }, + + nounCase = (/D[oD] *MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'კვირáƒ_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ი_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი_ხუთშáƒáƒ‘áƒáƒ—ი_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი_შáƒáƒ‘áƒáƒ—ი'.split('_'), + 'accusative': 'კვირáƒáƒ¡_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ს_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ს_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ს_ხუთშáƒáƒ‘áƒáƒ—ს_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვს_შáƒáƒ‘áƒáƒ—ს'.split('_') + }, + + nounCase = (/(წინáƒ|შემდეგ)/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.defineLocale('ka', { + months : monthsCaseReplace, + monthsShort : 'იáƒáƒœ_თებ_მáƒáƒ _áƒáƒžáƒ _მáƒáƒ˜_ივნ_ივლ_áƒáƒ’ვ_სექ_áƒáƒ¥áƒ¢_ნáƒáƒ”_დეკ'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'კვი_áƒáƒ áƒ¨_სáƒáƒ›_áƒáƒ—ხ_ხუთ_პáƒáƒ _შáƒáƒ‘'.split('_'), + weekdaysMin : 'კვ_áƒáƒ _სáƒ_áƒáƒ—_ხუ_პáƒ_შáƒ'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[დღეს] LT[-ზე]', + nextDay : '[ხვáƒáƒš] LT[-ზე]', + lastDay : '[გუშინ] LT[-ზე]', + nextWeek : '[შემდეგ] dddd LT[-ზე]', + lastWeek : '[წინáƒ] dddd LT-ზე', + sameElse : 'L' + }, + relativeTime : { + future : function (s) { + return (/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|წელი)/).test(s) ? + s.replace(/ი$/, 'ში') : + s + 'ში'; + }, + past : function (s) { + if ((/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|დღე|თვე)/).test(s)) { + return s.replace(/(ი|ე)$/, 'ის წინ'); + } + if ((/წელი/).test(s)) { + return s.replace(/წელი$/, 'წლის წინ'); + } + }, + s : 'რáƒáƒ›áƒ“ენიმე წáƒáƒ›áƒ˜', + m : 'წუთი', + mm : '%d წუთი', + h : 'სáƒáƒáƒ—ი', + hh : '%d სáƒáƒáƒ—ი', + d : 'დღე', + dd : '%d დღე', + M : 'თვე', + MM : '%d თვე', + y : 'წელი', + yy : '%d წელი' + }, + ordinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/, + ordinal : function (number) { + if (number === 0) { + return number; + } + + if (number === 1) { + return number + '-ლი'; + } + + if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) { + return 'მე-' + number; + } + + return number + '-ე'; + }, + week : { + dow : 1, + doy : 7 + } + }); +})); + +// moment.js locale configuration +// locale : khmer (km) +// author : Kruy Vanna : https://github.com/kruyvanna + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('km', { + months: 'មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ'.split('_'), + monthsShort: 'មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ'.split('_'), + weekdays: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), + weekdaysShort: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), + weekdaysMin: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS : 'LT:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd, D MMMM YYYY LT' + }, + calendar: { + sameDay: '[ážáŸ’ងៃនៈ ម៉ោង] LT', + nextDay: '[ស្អែក ម៉ោង] LT', + nextWeek: 'dddd [ម៉ោង] LT', + lastDay: '[ម្សិលមិញ ម៉ោង] LT', + lastWeek: 'dddd [សប្ážáž¶áž áŸáž˜áž»áž“] [ម៉ោង] LT', + sameElse: 'L' + }, + relativeTime: { + future: '%sទៀáž', + past: '%sមុន', + s: 'ប៉ុន្មានវិនាទី', + m: 'មួយនាទី', + mm: '%d នាទី', + h: 'មួយម៉ោង', + hh: '%d ម៉ោង', + d: 'មួយážáŸ’ងៃ', + dd: '%d ážáŸ’ងៃ', + M: 'មួយážáŸ‚', + MM: '%d ážáŸ‚', + y: 'មួយឆ្នាំ', + yy: '%d ឆ្នាំ' + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : korean (ko) +// +// authors +// +// - Kyungwook, Park : https://github.com/kyungw00k +// - Jeeeyul Lee +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ko', { + months : '1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”'.split('_'), + monthsShort : '1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”'.split('_'), + weekdays : 'ì¼ìš”ì¼_월요ì¼_화요ì¼_수요ì¼_목요ì¼_금요ì¼_토요ì¼'.split('_'), + weekdaysShort : 'ì¼_ì›”_í™”_수_목_금_토'.split('_'), + weekdaysMin : 'ì¼_ì›”_í™”_수_목_금_토'.split('_'), + longDateFormat : { + LT : 'A hì‹œ m분', + LTS : 'A hì‹œ m분 sì´ˆ', + L : 'YYYY.MM.DD', + LL : 'YYYYë…„ MMMM Dì¼', + LLL : 'YYYYë…„ MMMM Dì¼ LT', + LLLL : 'YYYYë…„ MMMM Dì¼ dddd LT' + }, + calendar : { + sameDay : '오늘 LT', + nextDay : 'ë‚´ì¼ LT', + nextWeek : 'dddd LT', + lastDay : 'ì–´ì œ LT', + lastWeek : '지난주 dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s 후', + past : '%s ì „', + s : '몇초', + ss : '%dì´ˆ', + m : 'ì¼ë¶„', + mm : '%d분', + h : '한시간', + hh : '%d시간', + d : '하루', + dd : '%dì¼', + M : '한달', + MM : '%d달', + y : 'ì¼ë…„', + yy : '%dë…„' + }, + ordinalParse : /\d{1,2}ì¼/, + ordinal : '%dì¼', + meridiemParse : /오전|오후/, + isPM : function (token) { + return token === '오후'; + }, + meridiem : function (hour, minute, isUpper) { + return hour < 12 ? '오전' : '오후'; + } + }); +})); + +// moment.js locale configuration +// locale : Luxembourgish (lb) +// author : mweimerskirch : https://github.com/mweimerskirch, David Raison : https://github.com/kwisatz + +// Note: Luxembourgish has a very particular phonological rule ('Eifeler Regel') that causes the +// deletion of the final 'n' in certain contexts. That's what the 'eifelerRegelAppliesToWeekday' +// and 'eifelerRegelAppliesToNumber' methods are meant for + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eng Minutt', 'enger Minutt'], + 'h': ['eng Stonn', 'enger Stonn'], + 'd': ['een Dag', 'engem Dag'], + 'M': ['ee Mount', 'engem Mount'], + 'y': ['ee Joer', 'engem Joer'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + function processFutureTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'a ' + string; + } + return 'an ' + string; + } + + function processPastTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'viru ' + string; + } + return 'virun ' + string; + } + + /** + * Returns true if the word before the given number loses the '-n' ending. + * e.g. 'an 10 Deeg' but 'a 5 Deeg' + * + * @param number {integer} + * @returns {boolean} + */ + function eifelerRegelAppliesToNumber(number) { + number = parseInt(number, 10); + if (isNaN(number)) { + return false; + } + if (number < 0) { + // Negative Number --> always true + return true; + } else if (number < 10) { + // Only 1 digit + if (4 <= number && number <= 7) { + return true; + } + return false; + } else if (number < 100) { + // 2 digits + var lastDigit = number % 10, firstDigit = number / 10; + if (lastDigit === 0) { + return eifelerRegelAppliesToNumber(firstDigit); + } + return eifelerRegelAppliesToNumber(lastDigit); + } else if (number < 10000) { + // 3 or 4 digits --> recursively check first digit + while (number >= 10) { + number = number / 10; + } + return eifelerRegelAppliesToNumber(number); + } else { + // Anything larger than 4 digits: recursively check first n-3 digits + number = number / 1000; + return eifelerRegelAppliesToNumber(number); + } + } + + return moment.defineLocale('lb', { + months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'), + weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'), + weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'), + longDateFormat: { + LT: 'H:mm [Auer]', + LTS: 'H:mm:ss [Auer]', + L: 'DD.MM.YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY LT', + LLLL: 'dddd, D. MMMM YYYY LT' + }, + calendar: { + sameDay: '[Haut um] LT', + sameElse: 'L', + nextDay: '[Muer um] LT', + nextWeek: 'dddd [um] LT', + lastDay: '[Gëschter um] LT', + lastWeek: function () { + // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule + switch (this.day()) { + case 2: + case 4: + return '[Leschten] dddd [um] LT'; + default: + return '[Leschte] dddd [um] LT'; + } + } + }, + relativeTime : { + future : processFutureTime, + past : processPastTime, + s : 'e puer Sekonnen', + m : processRelativeTime, + mm : '%d Minutten', + h : processRelativeTime, + hh : '%d Stonnen', + d : processRelativeTime, + dd : '%d Deeg', + M : processRelativeTime, + MM : '%d Méint', + y : processRelativeTime, + yy : '%d Joer' + }, + ordinalParse: /\d{1,2}\./, + ordinal: '%d.', + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Lithuanian (lt) +// author : Mindaugas MozÅ«ras : https://github.com/mmozuras + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var units = { + 'm' : 'minutÄ—_minutÄ—s_minutÄ™', + 'mm': 'minutÄ—s_minuÄių_minutes', + 'h' : 'valanda_valandos_valandÄ…', + 'hh': 'valandos_valandų_valandas', + 'd' : 'diena_dienos_dienÄ…', + 'dd': 'dienos_dienų_dienas', + 'M' : 'mÄ—nuo_mÄ—nesio_mÄ—nesį', + 'MM': 'mÄ—nesiai_mÄ—nesių_mÄ—nesius', + 'y' : 'metai_metų_metus', + 'yy': 'metai_metų_metus' + }, + weekDays = 'sekmadienis_pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis'.split('_'); + + function translateSeconds(number, withoutSuffix, key, isFuture) { + if (withoutSuffix) { + return 'kelios sekundÄ—s'; + } else { + return isFuture ? 'kelių sekundžių' : 'kelias sekundes'; + } + } + + function translateSingular(number, withoutSuffix, key, isFuture) { + return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]); + } + + function special(number) { + return number % 10 === 0 || (number > 10 && number < 20); + } + + function forms(key) { + return units[key].split('_'); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + if (number === 1) { + return result + translateSingular(number, withoutSuffix, key[0], isFuture); + } else if (withoutSuffix) { + return result + (special(number) ? forms(key)[1] : forms(key)[0]); + } else { + if (isFuture) { + return result + forms(key)[1]; + } else { + return result + (special(number) ? forms(key)[1] : forms(key)[2]); + } + } + } + + function relativeWeekDay(moment, format) { + var nominative = format.indexOf('dddd HH:mm') === -1, + weekDay = weekDays[moment.day()]; + + return nominative ? weekDay : weekDay.substring(0, weekDay.length - 2) + 'į'; + } + + return moment.defineLocale('lt', { + months : 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio'.split('_'), + monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'), + weekdays : relativeWeekDay, + weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Å eÅ¡'.split('_'), + weekdaysMin : 'S_P_A_T_K_Pn_Å '.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY [m.] MMMM D [d.]', + LLL : 'YYYY [m.] MMMM D [d.], LT [val.]', + LLLL : 'YYYY [m.] MMMM D [d.], dddd, LT [val.]', + l : 'YYYY-MM-DD', + ll : 'YYYY [m.] MMMM D [d.]', + lll : 'YYYY [m.] MMMM D [d.], LT [val.]', + llll : 'YYYY [m.] MMMM D [d.], ddd, LT [val.]' + }, + calendar : { + sameDay : '[Å iandien] LT', + nextDay : '[Rytoj] LT', + nextWeek : 'dddd LT', + lastDay : '[Vakar] LT', + lastWeek : '[PraÄ—jusį] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : 'po %s', + past : 'prieÅ¡ %s', + s : translateSeconds, + m : translateSingular, + mm : translate, + h : translateSingular, + hh : translate, + d : translateSingular, + dd : translate, + M : translateSingular, + MM : translate, + y : translateSingular, + yy : translate + }, + ordinalParse: /\d{1,2}-oji/, + ordinal : function (number) { + return number + '-oji'; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : latvian (lv) +// author : Kristaps Karlsons : https://github.com/skakri + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var units = { + 'mm': 'minÅ«ti_minÅ«tes_minÅ«te_minÅ«tes', + 'hh': 'stundu_stundas_stunda_stundas', + 'dd': 'dienu_dienas_diena_dienas', + 'MM': 'mÄ“nesi_mÄ“neÅ¡us_mÄ“nesis_mÄ“neÅ¡i', + 'yy': 'gadu_gadus_gads_gadi' + }; + + function format(word, number, withoutSuffix) { + var forms = word.split('_'); + if (withoutSuffix) { + return number % 10 === 1 && number !== 11 ? forms[2] : forms[3]; + } else { + return number % 10 === 1 && number !== 11 ? forms[0] : forms[1]; + } + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + return number + ' ' + format(units[key], number, withoutSuffix); + } + + return moment.defineLocale('lv', { + months : 'janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jÅ«n_jÅ«l_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'svÄ“tdiena_pirmdiena_otrdiena_treÅ¡diena_ceturtdiena_piektdiena_sestdiena'.split('_'), + weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'), + weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'YYYY. [gada] D. MMMM', + LLL : 'YYYY. [gada] D. MMMM, LT', + LLLL : 'YYYY. [gada] D. MMMM, dddd, LT' + }, + calendar : { + sameDay : '[Å odien pulksten] LT', + nextDay : '[RÄ«t pulksten] LT', + nextWeek : 'dddd [pulksten] LT', + lastDay : '[Vakar pulksten] LT', + lastWeek : '[PagÄjuÅ¡Ä] dddd [pulksten] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s vÄ“lÄk', + past : '%s agrÄk', + s : 'dažas sekundes', + m : 'minÅ«ti', + mm : relativeTimeWithPlural, + h : 'stundu', + hh : relativeTimeWithPlural, + d : 'dienu', + dd : relativeTimeWithPlural, + M : 'mÄ“nesi', + MM : relativeTimeWithPlural, + y : 'gadu', + yy : relativeTimeWithPlural + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : macedonian (mk) +// author : Borislav Mickov : https://github.com/B0k0 + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('mk', { + months : 'јануари_февруари_март_април_мај_јуни_јули_авгуÑÑ‚_Ñептември_октомври_ноември_декември'.split('_'), + monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_Ñеп_окт_ное_дек'.split('_'), + weekdays : 'недела_понеделник_вторник_Ñреда_четврток_петок_Ñабота'.split('_'), + weekdaysShort : 'нед_пон_вто_Ñре_чет_пет_Ñаб'.split('_'), + weekdaysMin : 'нe_пo_вт_ÑÑ€_че_пе_Ña'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'D.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Ð”ÐµÐ½ÐµÑ Ð²Ð¾] LT', + nextDay : '[Утре во] LT', + nextWeek : 'dddd [во] LT', + lastDay : '[Вчера во] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[Во изминатата] dddd [во] LT'; + case 1: + case 2: + case 4: + case 5: + return '[Во изминатиот] dddd [во] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'поÑле %s', + past : 'пред %s', + s : 'неколку Ñекунди', + m : 'минута', + mm : '%d минути', + h : 'чаÑ', + hh : '%d чаÑа', + d : 'ден', + dd : '%d дена', + M : 'меÑец', + MM : '%d меÑеци', + y : 'година', + yy : '%d години' + }, + ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : malayalam (ml) +// author : Floyd Pink : https://github.com/floydpink + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ml', { + months : 'ജനàµà´µà´°à´¿_ഫെബàµà´°àµà´µà´°à´¿_മാർചàµà´šàµ_à´à´ªàµà´°à´¿àµ½_മേയàµ_ജൂൺ_ജൂലൈ_à´“à´—à´¸àµà´±àµà´±àµ_സെപàµà´±àµà´±à´‚ബർ_à´’à´•àµà´Ÿàµ‹à´¬àµ¼_നവംബർ_ഡിസംബർ'.split('_'), + monthsShort : 'ജനàµ._ഫെബàµà´°àµ._മാർ._à´à´ªàµà´°à´¿._മേയàµ_ജൂൺ_ജൂലൈ._à´“à´—._സെപàµà´±àµà´±._à´’à´•àµà´Ÿàµ‹._നവം._ഡിസം.'.split('_'), + weekdays : 'ഞായറാഴàµà´š_തിങàµà´•à´³à´¾à´´àµà´š_ചൊവàµà´µà´¾à´´àµà´š_à´¬àµà´§à´¨à´¾à´´àµà´š_à´µàµà´¯à´¾à´´à´¾à´´àµà´š_വെളàµà´³à´¿à´¯à´¾à´´àµà´š_ശനിയാഴàµà´š'.split('_'), + weekdaysShort : 'ഞായർ_തിങàµà´•àµ¾_ചൊവàµà´µ_à´¬àµà´§àµ»_à´µàµà´¯à´¾à´´à´‚_വെളàµà´³à´¿_ശനി'.split('_'), + weekdaysMin : 'à´žà´¾_തി_ചൊ_à´¬àµ_à´µàµà´¯à´¾_വെ_à´¶'.split('_'), + longDateFormat : { + LT : 'A h:mm -à´¨àµ', + LTS : 'A h:mm:ss -à´¨àµ', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[ഇനàµà´¨àµ] LT', + nextDay : '[നാളെ] LT', + nextWeek : 'dddd, LT', + lastDay : '[ഇനàµà´¨à´²àµ†] LT', + lastWeek : '[à´•à´´à´¿à´žàµà´ž] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s à´•à´´à´¿à´žàµà´žàµ', + past : '%s à´®àµàµ»à´ªàµ', + s : 'അൽപ നിമിഷങàµà´™àµ¾', + m : 'ഒരൠമിനിറàµà´±àµ', + mm : '%d മിനിറàµà´±àµ', + h : 'ഒരൠമണികàµà´•àµ‚ർ', + hh : '%d മണികàµà´•àµ‚ർ', + d : 'ഒരൠദിവസം', + dd : '%d ദിവസം', + M : 'ഒരൠമാസം', + MM : '%d മാസം', + y : 'ഒരൠവർഷം', + yy : '%d വർഷം' + }, + meridiemParse: /രാതàµà´°à´¿|രാവിലെ|ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿/i, + isPM : function (input) { + return /^(ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'രാതàµà´°à´¿'; + } else if (hour < 12) { + return 'രാവിലെ'; + } else if (hour < 17) { + return 'ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ'; + } else if (hour < 20) { + return 'വൈകàµà´¨àµà´¨àµ‡à´°à´‚'; + } else { + return 'രാതàµà´°à´¿'; + } + } + }); +})); + +// moment.js locale configuration +// locale : Marathi (mr) +// author : Harshad Kale : https://github.com/kalehv + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.defineLocale('mr', { + months : 'जानेवारी_फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€_मारà¥à¤š_à¤à¤ªà¥à¤°à¤¿à¤²_मे_जून_जà¥à¤²à¥ˆ_ऑगसà¥à¤Ÿ_सपà¥à¤Ÿà¥‡à¤‚बर_ऑकà¥à¤Ÿà¥‹à¤¬à¤°_नोवà¥à¤¹à¥‡à¤‚बर_डिसेंबर'.split('_'), + monthsShort: 'जाने._फेबà¥à¤°à¥._मारà¥à¤š._à¤à¤ªà¥à¤°à¤¿._मे._जून._जà¥à¤²à¥ˆ._ऑग._सपà¥à¤Ÿà¥‡à¤‚._ऑकà¥à¤Ÿà¥‹._नोवà¥à¤¹à¥‡à¤‚._डिसें.'.split('_'), + weekdays : 'रविवार_सोमवार_मंगळवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split('_'), + weekdaysShort : 'रवि_सोम_मंगळ_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split('_'), + weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split('_'), + longDateFormat : { + LT : 'A h:mm वाजता', + LTS : 'A h:mm:ss वाजता', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[उदà¥à¤¯à¤¾] LT', + nextWeek : 'dddd, LT', + lastDay : '[काल] LT', + lastWeek: '[मागील] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s नंतर', + past : '%s पूरà¥à¤µà¥€', + s : 'सेकंद', + m: 'à¤à¤• मिनिट', + mm: '%d मिनिटे', + h : 'à¤à¤• तास', + hh : '%d तास', + d : 'à¤à¤• दिवस', + dd : '%d दिवस', + M : 'à¤à¤• महिना', + MM : '%d महिने', + y : 'à¤à¤• वरà¥à¤·', + yy : '%d वरà¥à¤·à¥‡' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /रातà¥à¤°à¥€|सकाळी|दà¥à¤ªà¤¾à¤°à¥€|सायंकाळी/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'रातà¥à¤°à¥€') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'सकाळी') { + return hour; + } else if (meridiem === 'दà¥à¤ªà¤¾à¤°à¥€') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'सायंकाळी') { + return hour + 12; + } + }, + meridiem: function (hour, minute, isLower) + { + if (hour < 4) { + return 'रातà¥à¤°à¥€'; + } else if (hour < 10) { + return 'सकाळी'; + } else if (hour < 17) { + return 'दà¥à¤ªà¤¾à¤°à¥€'; + } else if (hour < 20) { + return 'सायंकाळी'; + } else { + return 'रातà¥à¤°à¥€'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Bahasa Malaysia (ms-MY) +// author : Weldan Jamili : https://github.com/weldan + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ms-my', { + months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), + monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), + weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), + weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), + weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'LT.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] LT', + LLLL : 'dddd, D MMMM YYYY [pukul] LT' + }, + meridiemParse: /pagi|tengahari|petang|malam/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'tengahari') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'petang' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'tengahari'; + } else if (hours < 19) { + return 'petang'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Esok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kelmarin pukul] LT', + lastWeek : 'dddd [lepas pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lepas', + s : 'beberapa saat', + m : 'seminit', + mm : '%d minit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Burmese (my) +// author : Squar team, mysquar.com + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': 'á', + '2': 'á‚', + '3': 'áƒ', + '4': 'á„', + '5': 'á…', + '6': 'á†', + '7': 'á‡', + '8': 'áˆ', + '9': 'á‰', + '0': 'á€' + }, numberMap = { + 'á': '1', + 'á‚': '2', + 'áƒ': '3', + 'á„': '4', + 'á…': '5', + 'á†': '6', + 'á‡': '7', + 'áˆ': '8', + 'á‰': '9', + 'á€': '0' + }; + return moment.defineLocale('my', { + months: 'ဇန်နá€á€«á€›á€®_ဖေဖော်á€á€«á€›á€®_မá€á€º_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုá€á€º_စက်á€á€„်ဘာ_အောက်á€á€­á€¯á€˜á€¬_နိုá€á€„်ဘာ_ဒီဇင်ဘာ'.split('_'), + monthsShort: 'ဇန်_ဖေ_မá€á€º_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'), + weekdays: 'á€á€”င်္ဂနွေ_á€á€”င်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပá€á€±á€¸_သောကြာ_စနေ'.split('_'), + weekdaysShort: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), + weekdaysMin: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd D MMMM YYYY LT' + }, + calendar: { + sameDay: '[ယနေ.] LT [မှာ]', + nextDay: '[မနက်ဖြန်] LT [မှာ]', + nextWeek: 'dddd LT [မှာ]', + lastDay: '[မနေ.က] LT [မှာ]', + lastWeek: '[ပြီးá€á€²á€·á€žá€±á€¬] dddd LT [မှာ]', + sameElse: 'L' + }, + relativeTime: { + future: 'လာမည့် %s မှာ', + past: 'လွန်á€á€²á€·á€žá€±á€¬ %s က', + s: 'စက္ကန်.အနည်းငယ်', + m: 'á€á€…်မိနစ်', + mm: '%d မိနစ်', + h: 'á€á€…်နာရီ', + hh: '%d နာရီ', + d: 'á€á€…်ရက်', + dd: '%d ရက်', + M: 'á€á€…်လ', + MM: '%d လ', + y: 'á€á€…်နှစ်', + yy: '%d နှစ်' + }, + preparse: function (string) { + return string.replace(/[áá‚áƒá„á…á†á‡áˆá‰á€]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : norwegian bokmÃ¥l (nb) +// authors : Espen Hovlandsdal : https://github.com/rexxars +// Sigurd Gartmann : https://github.com/sigurdga + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('nb', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), + weekdaysShort : 'søn_man_tirs_ons_tors_fre_lør'.split('_'), + weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'H.mm', + LTS : 'LT.ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] LT', + LLLL : 'dddd D. MMMM YYYY [kl.] LT' + }, + calendar : { + sameDay: '[i dag kl.] LT', + nextDay: '[i morgen kl.] LT', + nextWeek: 'dddd [kl.] LT', + lastDay: '[i gÃ¥r kl.] LT', + lastWeek: '[forrige] dddd [kl.] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'for %s siden', + s : 'noen sekunder', + m : 'ett minutt', + mm : '%d minutter', + h : 'en time', + hh : '%d timer', + d : 'en dag', + dd : '%d dager', + M : 'en mÃ¥ned', + MM : '%d mÃ¥neder', + y : 'ett Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : nepali/nepalese +// author : suvash : https://github.com/suvash + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.defineLocale('ne', { + months : 'जनवरी_फेबà¥à¤°à¥à¤µà¤°à¥€_मारà¥à¤š_अपà¥à¤°à¤¿à¤²_मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ_अगषà¥à¤Ÿ_सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°_अकà¥à¤Ÿà¥‹à¤¬à¤°_नोभेमà¥à¤¬à¤°_डिसेमà¥à¤¬à¤°'.split('_'), + monthsShort : 'जन._फेबà¥à¤°à¥._मारà¥à¤š_अपà¥à¤°à¤¿._मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ._अग._सेपà¥à¤Ÿ._अकà¥à¤Ÿà¥‹._नोभे._डिसे.'.split('_'), + weekdays : 'आइतबार_सोमबार_मङà¥à¤—लबार_बà¥à¤§à¤¬à¤¾à¤°_बिहिबार_शà¥à¤•à¥à¤°à¤¬à¤¾à¤°_शनिबार'.split('_'), + weekdaysShort : 'आइत._सोम._मङà¥à¤—ल._बà¥à¤§._बिहि._शà¥à¤•à¥à¤°._शनि.'.split('_'), + weekdaysMin : 'आइ._सो._मङà¥_बà¥._बि._शà¥._श.'.split('_'), + longDateFormat : { + LT : 'Aको h:mm बजे', + LTS : 'Aको h:mm:ss बजे', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /राती|बिहान|दिउà¤à¤¸à¥‹|बेलà¥à¤•à¤¾|साà¤à¤|राती/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'राती') { + return hour < 3 ? hour : hour + 12; + } else if (meridiem === 'बिहान') { + return hour; + } else if (meridiem === 'दिउà¤à¤¸à¥‹') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'बेलà¥à¤•à¤¾' || meridiem === 'साà¤à¤') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 3) { + return 'राती'; + } else if (hour < 10) { + return 'बिहान'; + } else if (hour < 15) { + return 'दिउà¤à¤¸à¥‹'; + } else if (hour < 18) { + return 'बेलà¥à¤•à¤¾'; + } else if (hour < 20) { + return 'साà¤à¤'; + } else { + return 'राती'; + } + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[भोली] LT', + nextWeek : '[आउà¤à¤¦à¥‹] dddd[,] LT', + lastDay : '[हिजो] LT', + lastWeek : '[गà¤à¤•à¥‹] dddd[,] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%sमा', + past : '%s अगाडी', + s : 'केही समय', + m : 'à¤à¤• मिनेट', + mm : '%d मिनेट', + h : 'à¤à¤• घणà¥à¤Ÿà¤¾', + hh : '%d घणà¥à¤Ÿà¤¾', + d : 'à¤à¤• दिन', + dd : '%d दिन', + M : 'à¤à¤• महिना', + MM : '%d महिना', + y : 'à¤à¤• बरà¥à¤·', + yy : '%d बरà¥à¤·' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : dutch (nl) +// author : Joris Röling : https://github.com/jjupiter + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); + + return moment.defineLocale('nl', { + months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), + weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), + weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[vandaag om] LT', + nextDay: '[morgen om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[gisteren om] LT', + lastWeek: '[afgelopen] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'over %s', + past : '%s geleden', + s : 'een paar seconden', + m : 'één minuut', + mm : '%d minuten', + h : 'één uur', + hh : '%d uur', + d : 'één dag', + dd : '%d dagen', + M : 'één maand', + MM : '%d maanden', + y : 'één jaar', + yy : '%d jaar' + }, + ordinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : norwegian nynorsk (nn) +// author : https://github.com/mechuwind + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('nn', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sundag_mÃ¥ndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'), + weekdaysShort : 'sun_mÃ¥n_tys_ons_tor_fre_lau'.split('_'), + weekdaysMin : 'su_mÃ¥_ty_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[I dag klokka] LT', + nextDay: '[I morgon klokka] LT', + nextWeek: 'dddd [klokka] LT', + lastDay: '[I gÃ¥r klokka] LT', + lastWeek: '[FøregÃ¥ande] dddd [klokka] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'for %s sidan', + s : 'nokre sekund', + m : 'eit minutt', + mm : '%d minutt', + h : 'ein time', + hh : '%d timar', + d : 'ein dag', + dd : '%d dagar', + M : 'ein mÃ¥nad', + MM : '%d mÃ¥nader', + y : 'eit Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : polish (pl) +// author : Rafal Hirsz : https://github.com/evoL + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var monthsNominative = 'styczeÅ„_luty_marzec_kwiecieÅ„_maj_czerwiec_lipiec_sierpieÅ„_wrzesieÅ„_październik_listopad_grudzieÅ„'.split('_'), + monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrzeÅ›nia_października_listopada_grudnia'.split('_'); + + function plural(n) { + return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1); + } + + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'minuta' : 'minutÄ™'; + case 'mm': + return result + (plural(number) ? 'minuty' : 'minut'); + case 'h': + return withoutSuffix ? 'godzina' : 'godzinÄ™'; + case 'hh': + return result + (plural(number) ? 'godziny' : 'godzin'); + case 'MM': + return result + (plural(number) ? 'miesiÄ…ce' : 'miesiÄ™cy'); + case 'yy': + return result + (plural(number) ? 'lata' : 'lat'); + } + } + + return moment.defineLocale('pl', { + months : function (momentToFormat, format) { + if (/D MMMM/.test(format)) { + return monthsSubjective[momentToFormat.month()]; + } else { + return monthsNominative[momentToFormat.month()]; + } + }, + monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'), + weekdays : 'niedziela_poniedziaÅ‚ek_wtorek_Å›roda_czwartek_piÄ…tek_sobota'.split('_'), + weekdaysShort : 'nie_pon_wt_Å›r_czw_pt_sb'.split('_'), + weekdaysMin : 'N_Pn_Wt_Åšr_Cz_Pt_So'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay: '[DziÅ› o] LT', + nextDay: '[Jutro o] LT', + nextWeek: '[W] dddd [o] LT', + lastDay: '[Wczoraj o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[W zeszÅ‚Ä… niedzielÄ™ o] LT'; + case 3: + return '[W zeszÅ‚Ä… Å›rodÄ™ o] LT'; + case 6: + return '[W zeszÅ‚Ä… sobotÄ™ o] LT'; + default: + return '[W zeszÅ‚y] dddd [o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : '%s temu', + s : 'kilka sekund', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : '1 dzieÅ„', + dd : '%d dni', + M : 'miesiÄ…c', + MM : translate, + y : 'rok', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : brazilian portuguese (pt-br) +// author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('pt-br', { + months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), + monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), + weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'), + weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'), + weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY [às] LT', + LLLL : 'dddd, D [de] MMMM [de] YYYY [às] LT' + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : 'em %s', + past : '%s atrás', + s : 'segundos', + m : 'um minuto', + mm : '%d minutos', + h : 'uma hora', + hh : '%d horas', + d : 'um dia', + dd : '%d dias', + M : 'um mês', + MM : '%d meses', + y : 'um ano', + yy : '%d anos' + }, + ordinalParse: /\d{1,2}º/, + ordinal : '%dº' + }); +})); + +// moment.js locale configuration +// locale : portuguese (pt) +// author : Jefferson : https://github.com/jalex79 + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('pt', { + months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), + monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), + weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'), + weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'), + weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY LT', + LLLL : 'dddd, D [de] MMMM [de] YYYY LT' + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : 'em %s', + past : 'há %s', + s : 'segundos', + m : 'um minuto', + mm : '%d minutos', + h : 'uma hora', + hh : '%d horas', + d : 'um dia', + dd : '%d dias', + M : 'um mês', + MM : '%d meses', + y : 'um ano', + yy : '%d anos' + }, + ordinalParse: /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : romanian (ro) +// author : Vlad Gurdiga : https://github.com/gurdiga +// author : Valentin Agachi : https://github.com/avaly + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': 'minute', + 'hh': 'ore', + 'dd': 'zile', + 'MM': 'luni', + 'yy': 'ani' + }, + separator = ' '; + if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) { + separator = ' de '; + } + + return number + separator + format[key]; + } + + return moment.defineLocale('ro', { + months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'), + monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'), + weekdays : 'duminică_luni_marÈ›i_miercuri_joi_vineri_sâmbătă'.split('_'), + weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'), + weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY H:mm', + LLLL : 'dddd, D MMMM YYYY H:mm' + }, + calendar : { + sameDay: '[azi la] LT', + nextDay: '[mâine la] LT', + nextWeek: 'dddd [la] LT', + lastDay: '[ieri la] LT', + lastWeek: '[fosta] dddd [la] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'peste %s', + past : '%s în urmă', + s : 'câteva secunde', + m : 'un minut', + mm : relativeTimeWithPlural, + h : 'o oră', + hh : relativeTimeWithPlural, + d : 'o zi', + dd : relativeTimeWithPlural, + M : 'o lună', + MM : relativeTimeWithPlural, + y : 'un an', + yy : relativeTimeWithPlural + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : russian (ru) +// author : Viktorminator : https://github.com/Viktorminator +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут', + 'hh': 'чаÑ_чаÑа_чаÑов', + 'dd': 'день_днÑ_дней', + 'MM': 'меÑÑц_меÑÑца_меÑÑцев', + 'yy': 'год_года_лет' + }; + if (key === 'm') { + return withoutSuffix ? 'минута' : 'минуту'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь'.split('_'), + 'accusative': 'ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function monthsShortCaseReplace(m, format) { + var monthsShort = { + 'nominative': 'Ñнв_фев_март_апр_май_июнь_июль_авг_Ñен_окт_ноÑ_дек'.split('_'), + 'accusative': 'Ñнв_фев_мар_апр_маÑ_июнÑ_июлÑ_авг_Ñен_окт_ноÑ_дек'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return monthsShort[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота'.split('_'), + 'accusative': 'воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу'.split('_') + }, + + nounCase = (/\[ ?[Вв] ?(?:прошлую|Ñледующую|Ñту)? ?\] ?dddd/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.defineLocale('ru', { + months : monthsCaseReplace, + monthsShort : monthsShortCaseReplace, + weekdays : weekdaysCaseReplace, + weekdaysShort : 'вÑ_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + weekdaysMin : 'вÑ_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + monthsParse : [/^Ñнв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[й|Ñ]/i, /^июн/i, /^июл/i, /^авг/i, /^Ñен/i, /^окт/i, /^ноÑ/i, /^дек/i], + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY г.', + LLL : 'D MMMM YYYY г., LT', + LLLL : 'dddd, D MMMM YYYY г., LT' + }, + calendar : { + sameDay: '[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT', + nextDay: '[Завтра в] LT', + lastDay: '[Вчера в] LT', + nextWeek: function () { + return this.day() === 2 ? '[Во] dddd [в] LT' : '[Ð’] dddd [в] LT'; + }, + lastWeek: function (now) { + if (now.week() !== this.week()) { + switch (this.day()) { + case 0: + return '[Ð’ прошлое] dddd [в] LT'; + case 1: + case 2: + case 4: + return '[Ð’ прошлый] dddd [в] LT'; + case 3: + case 5: + case 6: + return '[Ð’ прошлую] dddd [в] LT'; + } + } else { + if (this.day() === 2) { + return '[Во] dddd [в] LT'; + } else { + return '[Ð’] dddd [в] LT'; + } + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'через %s', + past : '%s назад', + s : 'неÑколько Ñекунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : 'чаÑ', + hh : relativeTimeWithPlural, + d : 'день', + dd : relativeTimeWithPlural, + M : 'меÑÑц', + MM : relativeTimeWithPlural, + y : 'год', + yy : relativeTimeWithPlural + }, + + meridiemParse: /ночи|утра|днÑ|вечера/i, + isPM : function (input) { + return /^(днÑ|вечера)$/.test(input); + }, + + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночи'; + } else if (hour < 12) { + return 'утра'; + } else if (hour < 17) { + return 'днÑ'; + } else { + return 'вечера'; + } + }, + + ordinalParse: /\d{1,2}-(й|го|Ñ)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + return number + '-й'; + case 'D': + return number + '-го'; + case 'w': + case 'W': + return number + '-Ñ'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : slovak (sk) +// author : Martin Minka : https://github.com/k2s +// based on work of petrbela : https://github.com/petrbela + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'), + monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_'); + + function plural(n) { + return (n > 1) && (n < 5); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami'; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minúty' : 'minút'); + } else { + return result + 'minútami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodín'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'deň' : 'dňom'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dni' : 'dní'); + } else { + return result + 'dňami'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'mesiace' : 'mesiacov'); + } else { + return result + 'mesiacmi'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokom'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'rokov'); + } else { + return result + 'rokmi'; + } + break; + } + } + + return moment.defineLocale('sk', { + months : months, + monthsShort : monthsShort, + monthsParse : (function (months, monthsShort) { + var i, _monthsParse = []; + for (i = 0; i < 12; i++) { + // use custom parser to solve problem with July (Äervenec) + _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); + } + return _monthsParse; + }(months, monthsShort)), + weekdays : 'nedeľa_pondelok_utorok_streda_Å¡tvrtok_piatok_sobota'.split('_'), + weekdaysShort : 'ne_po_ut_st_Å¡t_pi_so'.split('_'), + weekdaysMin : 'ne_po_ut_st_Å¡t_pi_so'.split('_'), + longDateFormat : { + LT: 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[dnes o] LT', + nextDay: '[zajtra o] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedeľu o] LT'; + case 1: + case 2: + return '[v] dddd [o] LT'; + case 3: + return '[v stredu o] LT'; + case 4: + return '[vo Å¡tvrtok o] LT'; + case 5: + return '[v piatok o] LT'; + case 6: + return '[v sobotu o] LT'; + } + }, + lastDay: '[vÄera o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulú nedeľu o] LT'; + case 1: + case 2: + return '[minulý] dddd [o] LT'; + case 3: + return '[minulú stredu o] LT'; + case 4: + case 5: + return '[minulý] dddd [o] LT'; + case 6: + return '[minulú sobotu o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pred %s', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : slovenian (sl) +// author : Robert SedovÅ¡ek : https://github.com/sedovsek + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'ena minuta' : 'eno minuto'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2) { + result += 'minuti'; + } else if (number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minut'; + } + return result; + case 'h': + return withoutSuffix ? 'ena ura' : 'eno uro'; + case 'hh': + if (number === 1) { + result += 'ura'; + } else if (number === 2) { + result += 'uri'; + } else if (number === 3 || number === 4) { + result += 'ure'; + } else { + result += 'ur'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dni'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mesec'; + } else if (number === 2) { + result += 'meseca'; + } else if (number === 3 || number === 4) { + result += 'mesece'; + } else { + result += 'mesecev'; + } + return result; + case 'yy': + if (number === 1) { + result += 'leto'; + } else if (number === 2) { + result += 'leti'; + } else if (number === 3 || number === 4) { + result += 'leta'; + } else { + result += 'let'; + } + return result; + } + } + + return moment.defineLocale('sl', { + months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'), + monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'), + weekdays : 'nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota'.split('_'), + weekdaysShort : 'ned._pon._tor._sre._Äet._pet._sob.'.split('_'), + weekdaysMin : 'ne_po_to_sr_Äe_pe_so'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD. MM. YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[danes ob] LT', + nextDay : '[jutri ob] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[v] [nedeljo] [ob] LT'; + case 3: + return '[v] [sredo] [ob] LT'; + case 6: + return '[v] [soboto] [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[v] dddd [ob] LT'; + } + }, + lastDay : '[vÄeraj ob] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[prejÅ¡nja] dddd [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[prejÅ¡nji] dddd [ob] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'Äez %s', + past : '%s nazaj', + s : 'nekaj sekund', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'en dan', + dd : translate, + M : 'en mesec', + MM : translate, + y : 'eno leto', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Albanian (sq) +// author : Flakërim Ismani : https://github.com/flakerimi +// author: Menelion Elensúle: https://github.com/Oire (tests) +// author : Oerd Cukalla : https://github.com/oerd (fixes) + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('sq', { + months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'), + monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'), + weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'), + weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'), + weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'), + meridiemParse: /PD|MD/, + isPM: function (input) { + return input.charAt(0) === 'M'; + }, + meridiem : function (hours, minutes, isLower) { + return hours < 12 ? 'PD' : 'MD'; + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Sot në] LT', + nextDay : '[Nesër në] LT', + nextWeek : 'dddd [në] LT', + lastDay : '[Dje në] LT', + lastWeek : 'dddd [e kaluar në] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'në %s', + past : '%s më parë', + s : 'disa sekonda', + m : 'një minutë', + mm : '%d minuta', + h : 'një orë', + hh : '%d orë', + d : 'një ditë', + dd : '%d ditë', + M : 'një muaj', + MM : '%d muaj', + y : 'një vit', + yy : '%d vite' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Serbian-cyrillic (sr-cyrl) +// author : Milan JanaÄković : https://github.com/milan-j + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var translator = { + words: { //Different grammatical cases + m: ['један минут', 'једне минуте'], + mm: ['минут', 'минуте', 'минута'], + h: ['један Ñат', 'једног Ñата'], + hh: ['Ñат', 'Ñата', 'Ñати'], + dd: ['дан', 'дана', 'дана'], + MM: ['меÑец', 'меÑеца', 'меÑеци'], + yy: ['година', 'године', 'година'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } + }; + + return moment.defineLocale('sr-cyrl', { + months: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'авгуÑÑ‚', 'Ñептембар', 'октобар', 'новембар', 'децембар'], + monthsShort: ['јан.', 'феб.', 'мар.', 'апр.', 'мај', 'јун', 'јул', 'авг.', 'Ñеп.', 'окт.', 'нов.', 'дец.'], + weekdays: ['недеља', 'понедељак', 'уторак', 'Ñреда', 'четвртак', 'петак', 'Ñубота'], + weekdaysShort: ['нед.', 'пон.', 'уто.', 'Ñре.', 'чет.', 'пет.', 'Ñуб.'], + weekdaysMin: ['не', 'по', 'ут', 'ÑÑ€', 'че', 'пе', 'Ñу'], + longDateFormat: { + LT: 'H:mm', + LTS : 'LT:ss', + L: 'DD. MM. YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY LT', + LLLL: 'dddd, D. MMMM YYYY LT' + }, + calendar: { + sameDay: '[Ð´Ð°Ð½Ð°Ñ Ñƒ] LT', + nextDay: '[Ñутра у] LT', + + nextWeek: function () { + switch (this.day()) { + case 0: + return '[у] [недељу] [у] LT'; + case 3: + return '[у] [Ñреду] [у] LT'; + case 6: + return '[у] [Ñуботу] [у] LT'; + case 1: + case 2: + case 4: + case 5: + return '[у] dddd [у] LT'; + } + }, + lastDay : '[јуче у] LT', + lastWeek : function () { + var lastWeekDays = [ + '[прошле] [недеље] [у] LT', + '[прошлог] [понедељка] [у] LT', + '[прошлог] [уторка] [у] LT', + '[прошле] [Ñреде] [у] LT', + '[прошлог] [четвртка] [у] LT', + '[прошлог] [петка] [у] LT', + '[прошле] [Ñуботе] [у] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'за %s', + past : 'пре %s', + s : 'неколико Ñекунди', + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'дан', + dd : translator.translate, + M : 'меÑец', + MM : translator.translate, + y : 'годину', + yy : translator.translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Serbian-latin (sr) +// author : Milan JanaÄković : https://github.com/milan-j + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var translator = { + words: { //Different grammatical cases + m: ['jedan minut', 'jedne minute'], + mm: ['minut', 'minute', 'minuta'], + h: ['jedan sat', 'jednog sata'], + hh: ['sat', 'sata', 'sati'], + dd: ['dan', 'dana', 'dana'], + MM: ['mesec', 'meseca', 'meseci'], + yy: ['godina', 'godine', 'godina'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } + }; + + return moment.defineLocale('sr', { + months: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'], + monthsShort: ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun', 'jul', 'avg.', 'sep.', 'okt.', 'nov.', 'dec.'], + weekdays: ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'Äetvrtak', 'petak', 'subota'], + weekdaysShort: ['ned.', 'pon.', 'uto.', 'sre.', 'Äet.', 'pet.', 'sub.'], + weekdaysMin: ['ne', 'po', 'ut', 'sr', 'Äe', 'pe', 'su'], + longDateFormat: { + LT: 'H:mm', + LTS : 'LT:ss', + L: 'DD. MM. YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY LT', + LLLL: 'dddd, D. MMMM YYYY LT' + }, + calendar: { + sameDay: '[danas u] LT', + nextDay: '[sutra u] LT', + + nextWeek: function () { + switch (this.day()) { + case 0: + return '[u] [nedelju] [u] LT'; + case 3: + return '[u] [sredu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄe u] LT', + lastWeek : function () { + var lastWeekDays = [ + '[proÅ¡le] [nedelje] [u] LT', + '[proÅ¡log] [ponedeljka] [u] LT', + '[proÅ¡log] [utorka] [u] LT', + '[proÅ¡le] [srede] [u] LT', + '[proÅ¡log] [Äetvrtka] [u] LT', + '[proÅ¡log] [petka] [u] LT', + '[proÅ¡le] [subote] [u] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pre %s', + s : 'nekoliko sekundi', + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'dan', + dd : translator.translate, + M : 'mesec', + MM : translator.translate, + y : 'godinu', + yy : translator.translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : swedish (sv) +// author : Jens Alm : https://github.com/ulmus + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('sv', { + months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'söndag_mÃ¥ndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'), + weekdaysShort : 'sön_mÃ¥n_tis_ons_tor_fre_lör'.split('_'), + weekdaysMin : 'sö_mÃ¥_ti_on_to_fr_lö'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Idag] LT', + nextDay: '[Imorgon] LT', + lastDay: '[IgÃ¥r] LT', + nextWeek: 'dddd LT', + lastWeek: '[Förra] dddd[en] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'för %s sedan', + s : 'nÃ¥gra sekunder', + m : 'en minut', + mm : '%d minuter', + h : 'en timme', + hh : '%d timmar', + d : 'en dag', + dd : '%d dagar', + M : 'en mÃ¥nad', + MM : '%d mÃ¥nader', + y : 'ett Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}(e|a)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'e' : + (b === 1) ? 'a' : + (b === 2) ? 'a' : + (b === 3) ? 'e' : 'e'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : tamil (ta) +// author : Arjunkumar Krishnamoorthy : https://github.com/tk120404 + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + /*var symbolMap = { + '1': '௧', + '2': '௨', + '3': '௩', + '4': '௪', + '5': '௫', + '6': '௬', + '7': '௭', + '8': '௮', + '9': '௯', + '0': '௦' + }, + numberMap = { + '௧': '1', + '௨': '2', + '௩': '3', + '௪': '4', + '௫': '5', + '௬': '6', + '௭': '7', + '௮': '8', + '௯': '9', + '௦': '0' + }; */ + + return moment.defineLocale('ta', { + months : 'ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯'.split('_'), + monthsShort : 'ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯'.split('_'), + weekdays : 'ஞாயிறà¯à®±à¯à®•à¯à®•à®¿à®´à®®à¯ˆ_திஙà¯à®•à®Ÿà¯à®•à®¿à®´à®®à¯ˆ_செவà¯à®µà®¾à®¯à¯à®•à®¿à®´à®®à¯ˆ_பà¯à®¤à®©à¯à®•à®¿à®´à®®à¯ˆ_வியாழகà¯à®•à®¿à®´à®®à¯ˆ_வெளà¯à®³à®¿à®•à¯à®•à®¿à®´à®®à¯ˆ_சனிகà¯à®•à®¿à®´à®®à¯ˆ'.split('_'), + weekdaysShort : 'ஞாயிறà¯_திஙà¯à®•à®³à¯_செவà¯à®µà®¾à®¯à¯_பà¯à®¤à®©à¯_வியாழனà¯_வெளà¯à®³à®¿_சனி'.split('_'), + weekdaysMin : 'ஞா_தி_செ_பà¯_வி_வெ_ச'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[இனà¯à®±à¯] LT', + nextDay : '[நாளை] LT', + nextWeek : 'dddd, LT', + lastDay : '[நேறà¯à®±à¯] LT', + lastWeek : '[கடநà¯à®¤ வாரமà¯] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s இலà¯', + past : '%s à®®à¯à®©à¯', + s : 'ஒர௠சில விநாடிகளà¯', + m : 'ஒர௠நிமிடமà¯', + mm : '%d நிமிடஙà¯à®•à®³à¯', + h : 'ஒர௠மணி நேரமà¯', + hh : '%d மணி நேரமà¯', + d : 'ஒர௠நாளà¯', + dd : '%d நாடà¯à®•à®³à¯', + M : 'ஒர௠மாதமà¯', + MM : '%d மாதஙà¯à®•à®³à¯', + y : 'ஒர௠வரà¯à®Ÿà®®à¯', + yy : '%d ஆணà¯à®Ÿà¯à®•à®³à¯' + }, +/* preparse: function (string) { + return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + },*/ + ordinalParse: /\d{1,2}வதà¯/, + ordinal : function (number) { + return number + 'வதà¯'; + }, + + + // refer http://ta.wikipedia.org/s/1er1 + meridiemParse: /யாமமà¯|வைகறை|காலை|நணà¯à®ªà®•à®²à¯|எறà¯à®ªà®¾à®Ÿà¯|மாலை/, + meridiem : function (hour, minute, isLower) { + if (hour < 2) { + return ' யாமமà¯'; + } else if (hour < 6) { + return ' வைகறை'; // வைகறை + } else if (hour < 10) { + return ' காலை'; // காலை + } else if (hour < 14) { + return ' நணà¯à®ªà®•à®²à¯'; // நணà¯à®ªà®•à®²à¯ + } else if (hour < 18) { + return ' எறà¯à®ªà®¾à®Ÿà¯'; // எறà¯à®ªà®¾à®Ÿà¯ + } else if (hour < 22) { + return ' மாலை'; // மாலை + } else { + return ' யாமமà¯'; + } + }, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'யாமமà¯') { + return hour < 2 ? hour : hour + 12; + } else if (meridiem === 'வைகறை' || meridiem === 'காலை') { + return hour; + } else if (meridiem === 'நணà¯à®ªà®•à®²à¯') { + return hour >= 10 ? hour : hour + 12; + } else { + return hour + 12; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : thai (th) +// author : Kridsada Thanabulpong : https://github.com/sirn + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('th', { + months : 'มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม'.split('_'), + monthsShort : 'มà¸à¸£à¸²_à¸à¸¸à¸¡à¸ à¸²_มีนา_เมษา_พฤษภา_มิถุนา_à¸à¸£à¸à¸Žà¸²_สิงหา_à¸à¸±à¸™à¸¢à¸²_ตุลา_พฤศจิà¸à¸²_ธันวา'.split('_'), + weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์'.split('_'), + weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์'.split('_'), // yes, three characters difference + weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'), + longDateFormat : { + LT : 'H นาฬิà¸à¸² m นาที', + LTS : 'LT s วินาที', + L : 'YYYY/MM/DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY เวลา LT', + LLLL : 'วันddddที่ D MMMM YYYY เวลา LT' + }, + meridiemParse: /à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง|หลังเที่ยง/, + isPM: function (input) { + return input === 'หลังเที่ยง'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง'; + } else { + return 'หลังเที่ยง'; + } + }, + calendar : { + sameDay : '[วันนี้ เวลา] LT', + nextDay : '[พรุ่งนี้ เวลา] LT', + nextWeek : 'dddd[หน้า เวลา] LT', + lastDay : '[เมื่อวานนี้ เวลา] LT', + lastWeek : '[วัน]dddd[ที่à¹à¸¥à¹‰à¸§ เวลา] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'อีภ%s', + past : '%sที่à¹à¸¥à¹‰à¸§', + s : 'ไม่à¸à¸µà¹ˆà¸§à¸´à¸™à¸²à¸—ี', + m : '1 นาที', + mm : '%d นาที', + h : '1 ชั่วโมง', + hh : '%d ชั่วโมง', + d : '1 วัน', + dd : '%d วัน', + M : '1 เดือน', + MM : '%d เดือน', + y : '1 ปี', + yy : '%d ปี' + } + }); +})); + +// moment.js locale configuration +// locale : Tagalog/Filipino (tl-ph) +// author : Dan Hagman + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('tl-ph', { + months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'), + monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'), + weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'), + weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'), + weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'MM/D/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY LT', + LLLL : 'dddd, MMMM DD, YYYY LT' + }, + calendar : { + sameDay: '[Ngayon sa] LT', + nextDay: '[Bukas sa] LT', + nextWeek: 'dddd [sa] LT', + lastDay: '[Kahapon sa] LT', + lastWeek: 'dddd [huling linggo] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'sa loob ng %s', + past : '%s ang nakalipas', + s : 'ilang segundo', + m : 'isang minuto', + mm : '%d minuto', + h : 'isang oras', + hh : '%d oras', + d : 'isang araw', + dd : '%d araw', + M : 'isang buwan', + MM : '%d buwan', + y : 'isang taon', + yy : '%d taon' + }, + ordinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : turkish (tr) +// authors : Erhan Gundogan : https://github.com/erhangundogan, +// Burak YiÄŸit Kaya: https://github.com/BYK + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var suffixes = { + 1: '\'inci', + 5: '\'inci', + 8: '\'inci', + 70: '\'inci', + 80: '\'inci', + + 2: '\'nci', + 7: '\'nci', + 20: '\'nci', + 50: '\'nci', + + 3: '\'üncü', + 4: '\'üncü', + 100: '\'üncü', + + 6: '\'ncı', + + 9: '\'uncu', + 10: '\'uncu', + 30: '\'uncu', + + 60: '\'ıncı', + 90: '\'ıncı' + }; + + return moment.defineLocale('tr', { + months : 'Ocak_Åžubat_Mart_Nisan_Mayıs_Haziran_Temmuz_AÄŸustos_Eylül_Ekim_Kasım_Aralık'.split('_'), + monthsShort : 'Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara'.split('_'), + weekdays : 'Pazar_Pazartesi_Salı_ÇarÅŸamba_PerÅŸembe_Cuma_Cumartesi'.split('_'), + weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'), + weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[bugün saat] LT', + nextDay : '[yarın saat] LT', + nextWeek : '[haftaya] dddd [saat] LT', + lastDay : '[dün] LT', + lastWeek : '[geçen hafta] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s sonra', + past : '%s önce', + s : 'birkaç saniye', + m : 'bir dakika', + mm : '%d dakika', + h : 'bir saat', + hh : '%d saat', + d : 'bir gün', + dd : '%d gün', + M : 'bir ay', + MM : '%d ay', + y : 'bir yıl', + yy : '%d yıl' + }, + ordinalParse: /\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/, + ordinal : function (number) { + if (number === 0) { // special case for zero + return number + '\'ıncı'; + } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + + return number + (suffixes[a] || suffixes[b] || suffixes[c]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Morocco Central Atlas TamaziÉ£t in Latin (tzm-latn) +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('tzm-latn', { + months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), + weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), + weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[asdkh g] LT', + nextDay: '[aska g] LT', + nextWeek: 'dddd [g] LT', + lastDay: '[assant g] LT', + lastWeek: 'dddd [g] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dadkh s yan %s', + past : 'yan %s', + s : 'imik', + m : 'minuá¸', + mm : '%d minuá¸', + h : 'saÉ›a', + hh : '%d tassaÉ›in', + d : 'ass', + dd : '%d ossan', + M : 'ayowr', + MM : '%d iyyirn', + y : 'asgas', + yy : '%d isgasn' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Morocco Central Atlas TamaziÉ£t (tzm) +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('tzm', { + months : 'ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”'.split('_'), + monthsShort : 'ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”'.split('_'), + weekdays : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + weekdaysShort : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS: 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[ⴰⵙⴷⵅ â´´] LT', + nextDay: '[ⴰⵙⴽⴰ â´´] LT', + nextWeek: 'dddd [â´´] LT', + lastDay: '[ⴰⵚⴰâµâµœ â´´] LT', + lastWeek: 'dddd [â´´] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'â´·â´°â´·âµ… âµ™ ⵢⴰⵠ%s', + past : 'ⵢⴰⵠ%s', + s : 'ⵉⵎⵉⴽ', + m : 'ⵎⵉâµâµ“â´º', + mm : '%d ⵎⵉâµâµ“â´º', + h : 'ⵙⴰⵄⴰ', + hh : '%d ⵜⴰⵙⵙⴰⵄⵉâµ', + d : 'ⴰⵙⵙ', + dd : '%d oⵙⵙⴰâµ', + M : 'â´°âµ¢oⵓⵔ', + MM : '%d ⵉⵢⵢⵉⵔâµ', + y : 'ⴰⵙⴳⴰⵙ', + yy : '%d ⵉⵙⴳⴰⵙâµ' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : ukrainian (uk) +// author : zemlanin : https://github.com/zemlanin +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': 'хвилина_хвилини_хвилин', + 'hh': 'година_години_годин', + 'dd': 'день_дні_днів', + 'MM': 'міÑÑць_міÑÑці_міÑÑців', + 'yy': 'рік_роки_років' + }; + if (key === 'm') { + return withoutSuffix ? 'хвилина' : 'хвилину'; + } + else if (key === 'h') { + return withoutSuffix ? 'година' : 'годину'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень'.split('_'), + 'accusative': 'ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ'.split('_') + }, + + nounCase = (/D[oD]? *MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота'.split('_'), + 'accusative': 'неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу'.split('_'), + 'genitive': 'неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи'.split('_') + }, + + nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ? + 'accusative' : + ((/\[?(?:минулої|наÑтупної)? ?\] ?dddd/).test(format) ? + 'genitive' : + 'nominative'); + + return weekdays[nounCase][m.day()]; + } + + function processHoursFunction(str) { + return function () { + return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT'; + }; + } + + return moment.defineLocale('uk', { + months : monthsCaseReplace, + monthsShort : 'Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + weekdaysMin : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY Ñ€.', + LLL : 'D MMMM YYYY Ñ€., LT', + LLLL : 'dddd, D MMMM YYYY Ñ€., LT' + }, + calendar : { + sameDay: processHoursFunction('[Сьогодні '), + nextDay: processHoursFunction('[Завтра '), + lastDay: processHoursFunction('[Вчора '), + nextWeek: processHoursFunction('[У] dddd ['), + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return processHoursFunction('[Минулої] dddd [').call(this); + case 1: + case 2: + case 4: + return processHoursFunction('[Минулого] dddd [').call(this); + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'за %s', + past : '%s тому', + s : 'декілька Ñекунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : 'годину', + hh : relativeTimeWithPlural, + d : 'день', + dd : relativeTimeWithPlural, + M : 'міÑÑць', + MM : relativeTimeWithPlural, + y : 'рік', + yy : relativeTimeWithPlural + }, + + // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason + + meridiemParse: /ночі|ранку|днÑ|вечора/, + isPM: function (input) { + return /^(днÑ|вечора)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночі'; + } else if (hour < 12) { + return 'ранку'; + } else if (hour < 17) { + return 'днÑ'; + } else { + return 'вечора'; + } + }, + + ordinalParse: /\d{1,2}-(й|го)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return number + '-й'; + case 'D': + return number + '-го'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : uzbek (uz) +// author : Sardor Muminov : https://github.com/muminoff + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('uz', { + months : 'Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь'.split('_'), + monthsShort : 'Ñнв_фев_мар_апр_май_июн_июл_авг_Ñен_окт_ноÑ_дек'.split('_'), + weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'), + weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'), + weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'D MMMM YYYY, dddd LT' + }, + calendar : { + sameDay : '[Бугун Ñоат] LT [да]', + nextDay : '[Эртага] LT [да]', + nextWeek : 'dddd [куни Ñоат] LT [да]', + lastDay : '[Кеча Ñоат] LT [да]', + lastWeek : '[Утган] dddd [куни Ñоат] LT [да]', + sameElse : 'L' + }, + relativeTime : { + future : 'Якин %s ичида', + past : 'Бир неча %s олдин', + s : 'фурÑат', + m : 'бир дакика', + mm : '%d дакика', + h : 'бир Ñоат', + hh : '%d Ñоат', + d : 'бир кун', + dd : '%d кун', + M : 'бир ой', + MM : '%d ой', + y : 'бир йил', + yy : '%d йил' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : vietnamese (vi) +// author : Bang Nguyen : https://github.com/bangnk + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('vi', { + months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'), + monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'), + weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tÆ°_thứ năm_thứ sáu_thứ bảy'.split('_'), + weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM [năm] YYYY', + LLL : 'D MMMM [năm] YYYY LT', + LLLL : 'dddd, D MMMM [năm] YYYY LT', + l : 'DD/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY LT', + llll : 'ddd, D MMM YYYY LT' + }, + calendar : { + sameDay: '[Hôm nay lúc] LT', + nextDay: '[Ngày mai lúc] LT', + nextWeek: 'dddd [tuần tá»›i lúc] LT', + lastDay: '[Hôm qua lúc] LT', + lastWeek: 'dddd [tuần rồi lúc] LT', + sameElse: 'L' + }, + relativeTime : { + future : '%s tá»›i', + past : '%s trÆ°á»›c', + s : 'vài giây', + m : 'má»™t phút', + mm : '%d phút', + h : 'má»™t giá»', + hh : '%d giá»', + d : 'má»™t ngày', + dd : '%d ngày', + M : 'má»™t tháng', + MM : '%d tháng', + y : 'má»™t năm', + yy : '%d năm' + }, + ordinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : chinese (zh-cn) +// author : suupic : https://github.com/suupic +// author : Zeno Zeng : https://github.com/zenozeng + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('zh-cn', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'), + weekdaysMin : 'æ—¥_一_二_三_å››_五_å…­'.split('_'), + longDateFormat : { + LT : 'Ah点mm', + LTS : 'Ah点m分s秒', + L : 'YYYY-MM-DD', + LL : 'YYYYå¹´MMMDæ—¥', + LLL : 'YYYYå¹´MMMDæ—¥LT', + LLLL : 'YYYYå¹´MMMDæ—¥ddddLT', + l : 'YYYY-MM-DD', + ll : 'YYYYå¹´MMMDæ—¥', + lll : 'YYYYå¹´MMMDæ—¥LT', + llll : 'YYYYå¹´MMMDæ—¥ddddLT' + }, + meridiemParse: /凌晨|早上|上åˆ|中åˆ|下åˆ|晚上/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '凌晨' || meridiem === '早上' || + meridiem === '上åˆ') { + return hour; + } else if (meridiem === '下åˆ' || meridiem === '晚上') { + return hour + 12; + } else { + // '中åˆ' + return hour >= 11 ? hour : hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return '凌晨'; + } else if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上åˆ'; + } else if (hm < 1230) { + return '中åˆ'; + } else if (hm < 1800) { + return '下åˆ'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : function () { + return this.minutes() === 0 ? '[今天]Ah[点整]' : '[今天]LT'; + }, + nextDay : function () { + return this.minutes() === 0 ? '[明天]Ah[点整]' : '[明天]LT'; + }, + lastDay : function () { + return this.minutes() === 0 ? '[昨天]Ah[点整]' : '[昨天]LT'; + }, + nextWeek : function () { + var startOfWeek, prefix; + startOfWeek = moment().startOf('week'); + prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]'; + return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; + }, + lastWeek : function () { + var startOfWeek, prefix; + startOfWeek = moment().startOf('week'); + prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]'; + return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; + }, + sameElse : 'LL' + }, + ordinalParse: /\d{1,2}(æ—¥|月|周)/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + 'æ—¥'; + case 'M': + return number + '月'; + case 'w': + case 'W': + return number + '周'; + default: + return number; + } + }, + relativeTime : { + future : '%s内', + past : '%så‰', + s : '几秒', + m : '1分钟', + mm : '%d分钟', + h : '1å°æ—¶', + hh : '%då°æ—¶', + d : '1天', + dd : '%d天', + M : '1个月', + MM : '%d个月', + y : '1å¹´', + yy : '%då¹´' + }, + week : { + // GB/T 7408-1994《数æ®å…ƒå’Œäº¤æ¢æ ¼å¼Â·ä¿¡æ¯äº¤æ¢Â·æ—¥æœŸå’Œæ—¶é—´è¡¨ç¤ºæ³•ã€‹ä¸ŽISO 8601:1988等效 + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : traditional chinese (zh-tw) +// author : Ben : https://github.com/ben-lin + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('zh-tw', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), + weekdaysMin : 'æ—¥_一_二_三_å››_五_å…­'.split('_'), + longDateFormat : { + LT : 'Ah點mm', + LTS : 'Ah點m分s秒', + L : 'YYYYå¹´MMMDæ—¥', + LL : 'YYYYå¹´MMMDæ—¥', + LLL : 'YYYYå¹´MMMDæ—¥LT', + LLLL : 'YYYYå¹´MMMDæ—¥ddddLT', + l : 'YYYYå¹´MMMDæ—¥', + ll : 'YYYYå¹´MMMDæ—¥', + lll : 'YYYYå¹´MMMDæ—¥LT', + llll : 'YYYYå¹´MMMDæ—¥ddddLT' + }, + meridiemParse: /早上|上åˆ|中åˆ|下åˆ|晚上/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '早上' || meridiem === '上åˆ') { + return hour; + } else if (meridiem === '中åˆ') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === '下åˆ' || meridiem === '晚上') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上åˆ'; + } else if (hm < 1230) { + return '中åˆ'; + } else if (hm < 1800) { + return '下åˆ'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : '[今天]LT', + nextDay : '[明天]LT', + nextWeek : '[下]ddddLT', + lastDay : '[昨天]LT', + lastWeek : '[上]ddddLT', + sameElse : 'L' + }, + ordinalParse: /\d{1,2}(æ—¥|月|週)/, + ordinal : function (number, period) { + switch (period) { + case 'd' : + case 'D' : + case 'DDD' : + return number + 'æ—¥'; + case 'M' : + return number + '月'; + case 'w' : + case 'W' : + return number + '週'; + default : + return number; + } + }, + relativeTime : { + future : '%så…§', + past : '%så‰', + s : '幾秒', + m : '一分é˜', + mm : '%d分é˜', + h : '一å°æ™‚', + hh : '%då°æ™‚', + d : '一天', + dd : '%d天', + M : '一個月', + MM : '%d個月', + y : '一年', + yy : '%då¹´' + } + }); +})); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/min/locales.min.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/min/locales.min.js new file mode 100644 index 0000000..b35ba6d --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/min/locales.min.js @@ -0,0 +1,4 @@ +!function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(a){return/^nm$/i.test(a)},meridiem:function(a,b,c){return 12>a?c?"vm":"VM":c?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[Môre om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ar-ma",{months:"يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:6,doy:12}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"Ù¡",2:"Ù¢",3:"Ù£",4:"Ù¤",5:"Ù¥",6:"Ù¦",7:"Ù§",8:"Ù¨",9:"Ù©",0:"Ù "},c={"Ù¡":"1","Ù¢":"2","Ù£":"3","Ù¤":"4","Ù¥":"5","Ù¦":"6","Ù§":"7","Ù¨":"8","Ù©":"9","Ù ":"0"};return a.defineLocale("ar-sa",{months:"يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),monthsShort:"يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiemParse:/ص|Ù…/,isPM:function(a){return"Ù…"===a},meridiem:function(a){return 12>a?"ص":"Ù…"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(a){return a.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(a){return c[a]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]}).replace(/,/g,"ØŒ")},week:{dow:6,doy:12}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ar-tn",{months:"جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),monthsShort:"جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"Ù¡",2:"Ù¢",3:"Ù£",4:"Ù¤",5:"Ù¥",6:"Ù¦",7:"Ù§",8:"Ù¨",9:"Ù©",0:"Ù "},c={"Ù¡":"1","Ù¢":"2","Ù£":"3","Ù¤":"4","Ù¥":"5","Ù¦":"6","Ù§":"7","Ù¨":"8","Ù©":"9","Ù ":"0"},d=function(a){return 0===a?0:1===a?1:2===a?2:a%100>=3&&10>=a%100?3:a%100>=11?4:5},e={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},f=function(a){return function(b,c){var f=d(b),g=e[a][d(b)];return 2===f&&(g=g[c?0:1]),g.replace(/%d/i,b)}},g=["كانون الثاني يناير","شباط Ùبراير","آذار مارس","نيسان أبريل","أيار مايو","حزيران يونيو","تموز يوليو","آب أغسطس","أيلول سبتمبر","تشرين الأول أكتوبر","تشرين الثاني نوÙمبر","كانون الأول ديسمبر"];return a.defineLocale("ar",{months:g,monthsShort:g,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiemParse:/ص|Ù…/,isPM:function(a){return"Ù…"===a},meridiem:function(a){return 12>a?"ص":"Ù…"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:f("s"),m:f("m"),mm:f("m"),h:f("h"),hh:f("h"),d:f("d"),dd:f("d"),M:f("M"),MM:f("M"),y:f("y"),yy:f("y")},preparse:function(a){return a.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(a){return c[a]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]}).replace(/,/g,"ØŒ")},week:{dow:6,doy:12}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"-inci",5:"-inci",8:"-inci",70:"-inci",80:"-inci",2:"-nci",7:"-nci",20:"-nci",50:"-nci",3:"-üncü",4:"-üncü",100:"-üncü",6:"-ncı",9:"-uncu",10:"-uncu",30:"-uncu",60:"-ıncı",90:"-ıncı"};return a.defineLocale("az",{months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekdays:"Bazar_Bazar ertÉ™si_ÇərÅŸÉ™nbÉ™ axÅŸamı_ÇərÅŸÉ™nbÉ™_CümÉ™ axÅŸamı_CümÉ™_ŞənbÉ™".split("_"),weekdaysShort:"Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən".split("_"),weekdaysMin:"Bz_BE_ÇA_Çə_CA_Cü_Şə".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[sabah saat] LT",nextWeek:"[gÉ™lÉ™n hÉ™ftÉ™] dddd [saat] LT",lastDay:"[dünÉ™n] LT",lastWeek:"[keçən hÉ™ftÉ™] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s É™vvÉ™l",s:"birneçə saniyyÉ™",m:"bir dÉ™qiqÉ™",mm:"%d dÉ™qiqÉ™",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},meridiemParse:/gecÉ™|sÉ™hÉ™r|gündüz|axÅŸam/,isPM:function(a){return/^(gündüz|axÅŸam)$/.test(a)},meridiem:function(a){return 4>a?"gecÉ™":12>a?"sÉ™hÉ™r":17>a?"gündüz":"axÅŸam"},ordinalParse:/\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,ordinal:function(a){if(0===a)return a+"-ıncı";var c=a%10,d=a%100-c,e=a>=100?100:null;return a+(b[c]||b[d]||b[e])},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:c?"хвіліна_хвіліны_хвілін":"хвіліну_хвіліны_хвілін",hh:c?"гадзіна_гадзіны_гадзін":"гадзіну_гадзіны_гадзін",dd:"дзень_дні_дзён",MM:"меÑÑц_меÑÑцы_меÑÑцаў",yy:"год_гады_гадоў"};return"m"===d?c?"хвіліна":"хвіліну":"h"===d?c?"гадзіна":"гадзіну":a+" "+b(e[d],+a)}function d(a,b){var c={nominative:"Ñтудзень_люты_Ñакавік_краÑавік_травень_чÑрвень_ліпень_жнівень_вераÑень_каÑтрычнік_ліÑтапад_Ñнежань".split("_"),accusative:"ÑтудзенÑ_лютага_Ñакавіка_краÑавіка_траўнÑ_чÑрвенÑ_ліпенÑ_жніўнÑ_вераÑнÑ_каÑтрычніка_ліÑтапада_ÑнежнÑ".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function e(a,b){var c={nominative:"нÑдзелÑ_панÑдзелак_аўторак_Ñерада_чацвер_пÑтніца_Ñубота".split("_"),accusative:"нÑдзелю_панÑдзелак_аўторак_Ñераду_чацвер_пÑтніцу_Ñуботу".split("_")},d=/\[ ?[Вв] ?(?:мінулую|наÑтупную)? ?\] ?dddd/.test(b)?"accusative":"nominative";return c[d][a.day()]}return a.defineLocale("be",{months:d,monthsShort:"Ñтуд_лют_Ñак_краÑ_трав_чÑрв_ліп_жнів_вер_каÑÑ‚_ліÑÑ‚_Ñнеж".split("_"),weekdays:e,weekdaysShort:"нд_пн_ат_ÑÑ€_чц_пт_Ñб".split("_"),weekdaysMin:"нд_пн_ат_ÑÑ€_чц_пт_Ñб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., LT",LLLL:"dddd, D MMMM YYYY г., LT"},calendar:{sameDay:"[Ð¡Ñ‘Ð½Ð½Ñ Ñž] LT",nextDay:"[Заўтра Ñž] LT",lastDay:"[Учора Ñž] LT",nextWeek:function(){return"[У] dddd [Ñž] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[У мінулую] dddd [Ñž] LT";case 1:case 2:case 4:return"[У мінулы] dddd [Ñž] LT"}},sameElse:"L"},relativeTime:{future:"праз %s",past:"%s таму",s:"некалькі Ñекунд",m:c,mm:c,h:c,hh:c,d:"дзень",dd:c,M:"меÑÑц",MM:c,y:"год",yy:c},meridiemParse:/ночы|раніцы|днÑ|вечара/,isPM:function(a){return/^(днÑ|вечара)$/.test(a)},meridiem:function(a){return 4>a?"ночы":12>a?"раніцы":17>a?"днÑ":"вечара"},ordinalParse:/\d{1,2}-(Ñ–|Ñ‹|га)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":case"w":case"W":return a%10!==2&&a%10!==3||a%100===12||a%100===13?a+"-Ñ‹":a+"-Ñ–";case"D":return a+"-га";default:return a}},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("bg",{months:"Ñнуари_февруари_март_април_май_юни_юли_авгуÑÑ‚_Ñептември_октомври_ноември_декември".split("_"),monthsShort:"Ñнр_фев_мар_апр_май_юни_юли_авг_Ñеп_окт_ное_дек".split("_"),weekdays:"неделÑ_понеделник_вторник_ÑÑ€Ñда_четвъртък_петък_Ñъбота".split("_"),weekdaysShort:"нед_пон_вто_ÑÑ€Ñ_чет_пет_Ñъб".split("_"),weekdaysMin:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Ð”Ð½ÐµÑ Ð²] LT",nextDay:"[Утре в] LT",nextWeek:"dddd [в] LT",lastDay:"[Вчера в] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Ð’ изминалата] dddd [в] LT";case 1:case 2:case 4:case 5:return"[Ð’ изминалиÑ] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"Ñлед %s",past:"преди %s",s:"нÑколко Ñекунди",m:"минута",mm:"%d минути",h:"чаÑ",hh:"%d чаÑа",d:"ден",dd:"%d дни",M:"меÑец",MM:"%d меÑеца",y:"година",yy:"%d години"},ordinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(a){var b=a%10,c=a%100;return 0===a?a+"-ев":0===c?a+"-ен":c>10&&20>c?a+"-ти":1===b?a+"-ви":2===b?a+"-ри":7===b||8===b?a+"-ми":a+"-ти"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"১",2:"২",3:"৩",4:"৪",5:"৫",6:"৬",7:"৭",8:"৮",9:"৯",0:"০"},c={"১":"1","২":"2","৩":"3","৪":"4","৫":"5","৬":"6","৭":"7","৮":"8","৯":"9","০":"0"};return a.defineLocale("bn",{months:"জানà§à§Ÿà¦¾à¦°à§€_ফেবà§à§Ÿà¦¾à¦°à§€_মারà§à¦š_à¦à¦ªà§à¦°à¦¿à¦²_মে_জà§à¦¨_জà§à¦²à¦¾à¦‡_অগাসà§à¦Ÿ_সেপà§à¦Ÿà§‡à¦®à§à¦¬à¦°_অকà§à¦Ÿà§‹à¦¬à¦°_নভেমà§à¦¬à¦°_ডিসেমà§à¦¬à¦°".split("_"),monthsShort:"জানà§_ফেব_মারà§à¦š_à¦à¦ªà¦°_মে_জà§à¦¨_জà§à¦²_অগ_সেপà§à¦Ÿ_অকà§à¦Ÿà§‹_নভ_ডিসেমà§".split("_"),weekdays:"রবিবার_সোমবার_মঙà§à¦—লবার_বà§à¦§à¦¬à¦¾à¦°_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿à¦¬à¦¾à¦°_শà§à¦•à§à¦°à§à¦¬à¦¾à¦°_শনিবার".split("_"),weekdaysShort:"রবি_সোম_মঙà§à¦—ল_বà§à¦§_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿_শà§à¦•à§à¦°à§_শনি".split("_"),weekdaysMin:"রব_সম_মঙà§à¦—_বà§_বà§à¦°à¦¿à¦¹_শà§_শনি".split("_"),longDateFormat:{LT:"A h:mm সময়",LTS:"A h:mm:ss সময়",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[আজ] LT",nextDay:"[আগামীকাল] LT",nextWeek:"dddd, LT",lastDay:"[গতকাল] LT",lastWeek:"[গত] dddd, LT",sameElse:"L"},relativeTime:{future:"%s পরে",past:"%s আগে",s:"কà¦à¦• সেকেনà§à¦¡",m:"à¦à¦• মিনিট",mm:"%d মিনিট",h:"à¦à¦• ঘনà§à¦Ÿà¦¾",hh:"%d ঘনà§à¦Ÿà¦¾",d:"à¦à¦• দিন",dd:"%d দিন",M:"à¦à¦• মাস",MM:"%d মাস",y:"à¦à¦• বছর",yy:"%d বছর"},preparse:function(a){return a.replace(/[১২৩৪৫৬৭৮৯০]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/রাত|শকাল|দà§à¦ªà§à¦°|বিকেল|রাত/,isPM:function(a){return/^(দà§à¦ªà§à¦°|বিকেল|রাত)$/.test(a)},meridiem:function(a){return 4>a?"রাত":10>a?"শকাল":17>a?"দà§à¦ªà§à¦°":20>a?"বিকেল":"রাত"},week:{dow:0,doy:6}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"༡",2:"༢",3:"༣",4:"༤",5:"༥",6:"༦",7:"༧",8:"༨",9:"༩",0:"༠"},c={"༡":"1","༢":"2","༣":"3","༤":"4","༥":"5","༦":"6","༧":"7","༨":"8","༩":"9","༠":"0"};return a.defineLocale("bo",{months:"ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ".split("_"),monthsShort:"ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ".split("_"),weekdays:"གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་".split("_"),weekdaysShort:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),weekdaysMin:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),longDateFormat:{LT:"A h:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[དི་རིང] LT",nextDay:"[སང་ཉིན] LT",nextWeek:"[བདུན་ཕྲག་རྗེས་མ], LT",lastDay:"[à½à¼‹à½¦à½„] LT",lastWeek:"[བདུན་ཕྲག་མà½à½ à¼‹à½˜] dddd, LT",sameElse:"L"},relativeTime:{future:"%s ལ་",past:"%s སྔན་ལ",s:"ལམ་སང",m:"སà¾à½¢à¼‹à½˜à¼‹à½‚ཅིག",mm:"%d སà¾à½¢à¼‹à½˜",h:"ཆུ་ཚོད་གཅིག",hh:"%d ཆུ་ཚོད",d:"ཉིན་གཅིག",dd:"%d ཉིན་",M:"ཟླ་བ་གཅིག",MM:"%d ཟླ་བ",y:"ལོ་གཅིག",yy:"%d ལོ"},preparse:function(a){return a.replace(/[༡༢༣༤༥༦༧༨༩༠]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,isPM:function(a){return/^(ཉིན་གུང|དགོང་དག|མཚན་མོ)$/.test(a)},meridiem:function(a){return 4>a?"མཚན་མོ":10>a?"ཞོགས་ཀས":17>a?"ཉིན་གུང":20>a?"དགོང་དག":"མཚན་མོ"},week:{dow:0,doy:6}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d={mm:"munutenn",MM:"miz",dd:"devezh"};return a+" "+e(d[c],a)}function c(a){switch(d(a)){case 1:case 3:case 4:case 5:case 9:return a+" bloaz";default:return a+" vloaz"}}function d(a){return a>9?d(a%10):a}function e(a,b){return 2===b?f(a):a}function f(a){var b={m:"v",b:"v",d:"z"};return void 0===b[a.charAt(0)]?a:b[a.charAt(0)]+a.substring(1)}return a.defineLocale("br",{months:"Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),longDateFormat:{LT:"h[e]mm A",LTS:"h[e]mm:ss A",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY LT",LLLL:"dddd, D [a viz] MMMM YYYY LT"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc'hoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec'h da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s 'zo",s:"un nebeud segondennoù",m:"ur vunutenn",mm:b,h:"un eur",hh:"%d eur",d:"un devezh",dd:b,M:"ur miz",MM:b,y:"ur bloaz",yy:c},ordinalParse:/\d{1,2}(añ|vet)/,ordinal:function(a){var b=1===a?"añ":"vet";return a+b},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d=a+" ";switch(c){case"m":return b?"jedna minuta":"jedne minute";case"mm":return d+=1===a?"minuta":2===a||3===a||4===a?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return d+=1===a?"sat":2===a||3===a||4===a?"sata":"sati";case"dd":return d+=1===a?"dan":"dana";case"MM":return d+=1===a?"mjesec":2===a||3===a||4===a?"mjeseca":"mjeseci";case"yy":return d+=1===a?"godina":2===a||3===a||4===a?"godine":"godina"}}return a.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),weekdays:"nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._Äet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_Äe_pe_su".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[proÅ¡lu] dddd [u] LT";case 6:return"[proÅ¡le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[proÅ¡li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:b,mm:b,h:b,hh:b,d:"dan",dd:b,M:"mjesec",MM:b,y:"godinu",yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ca",{months:"gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),monthsShort:"gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.".split("_"),weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[demà a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"fa %s",s:"uns segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},ordinalParse:/\d{1,2}(r|n|t|è|a)/,ordinal:function(a,b){var c=1===a?"r":2===a?"n":3===a?"r":4===a?"t":"è";return("w"===b||"W"===b)&&(c="a"),a+c},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a){return a>1&&5>a&&1!==~~(a/10)}function c(a,c,d,e){var f=a+" ";switch(d){case"s":return c||e?"pár sekund":"pár sekundami";case"m":return c?"minuta":e?"minutu":"minutou";case"mm":return c||e?f+(b(a)?"minuty":"minut"):f+"minutami";break;case"h":return c?"hodina":e?"hodinu":"hodinou";case"hh":return c||e?f+(b(a)?"hodiny":"hodin"):f+"hodinami";break;case"d":return c||e?"den":"dnem";case"dd":return c||e?f+(b(a)?"dny":"dní"):f+"dny";break;case"M":return c||e?"mÄ›síc":"mÄ›sícem";case"MM":return c||e?f+(b(a)?"mÄ›síce":"mÄ›síců"):f+"mÄ›síci";break;case"y":return c||e?"rok":"rokem";case"yy":return c||e?f+(b(a)?"roky":"let"):f+"lety"}}var d="leden_únor_bÅ™ezen_duben_kvÄ›ten_Äerven_Äervenec_srpen_září_říjen_listopad_prosinec".split("_"),e="led_úno_bÅ™e_dub_kvÄ›_Ävn_Ävc_srp_zář_říj_lis_pro".split("_");return a.defineLocale("cs",{months:d,monthsShort:e,monthsParse:function(a,b){var c,d=[];for(c=0;12>c;c++)d[c]=new RegExp("^"+a[c]+"$|^"+b[c]+"$","i");return d}(d,e),weekdays:"nedÄ›le_pondÄ›lí_úterý_stÅ™eda_Ätvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_Ät_pá_so".split("_"),weekdaysMin:"ne_po_út_st_Ät_pá_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedÄ›li v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve stÅ™edu v] LT";case 4:return"[ve Ätvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[vÄera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou nedÄ›li v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou stÅ™edu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pÅ™ed %s",s:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("cv",{months:"кăрлач_нарăÑ_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав".split("_"),monthsShort:"кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш".split("_"),weekdays:"вырÑарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_Ñрнекун_шăматкун".split("_"),weekdaysShort:"выр_тун_ытл_юн_кĕç_Ñрн_шăм".split("_"),weekdaysMin:"вр_тн_Ñ‹Ñ‚_юн_кç_ÑÑ€_шм".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD-MM-YYYY",LL:"YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]",LLL:"YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT",LLLL:"dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT"},calendar:{sameDay:"[ПаÑн] LT [Ñехетре]",nextDay:"[Ыран] LT [Ñехетре]",lastDay:"[Ĕнер] LT [Ñехетре]",nextWeek:"[ÇитеÑ] dddd LT [Ñехетре]",lastWeek:"[Иртнĕ] dddd LT [Ñехетре]",sameElse:"L"},relativeTime:{future:function(a){var b=/Ñехет$/i.exec(a)?"рен":/çул$/i.exec(a)?"тан":"ран";return a+b},past:"%s каÑлла",s:"пĕр-ик çеккунт",m:"пĕр минут",mm:"%d минут",h:"пĕр Ñехет",hh:"%d Ñехет",d:"пĕр кун",dd:"%d кун",M:"пĕр уйăх",MM:"%d уйăх",y:"пĕр çул",yy:"%d çул"},ordinalParse:/\d{1,2}-мĕш/,ordinal:"%d-мĕш",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("cy",{months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Heddiw am] LT",nextDay:"[Yfory am] LT",nextWeek:"dddd [am] LT",lastDay:"[Ddoe am] LT",lastWeek:"dddd [diwethaf am] LT",sameElse:"L"},relativeTime:{future:"mewn %s",past:"%s yn ôl",s:"ychydig eiliadau",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"},ordinalParse:/\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,ordinal:function(a){var b=a,c="",d=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"];return b>20?c=40===b||50===b||60===b||80===b||100===b?"fed":"ain":b>0&&(c=d[b]),a+c},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd [d.] D. MMMM YYYY LT"},calendar:{sameDay:"[I dag kl.] LT",nextDay:"[I morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[I gÃ¥r kl.] LT",lastWeek:"[sidste] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"fÃ¥ sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en mÃ¥ned",MM:"%d mÃ¥neder",y:"et Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[a+" Tage",a+" Tagen"],M:["ein Monat","einem Monat"],MM:[a+" Monate",a+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[a+" Jahre",a+" Jahren"]};return b?d[c][0]:d[c][1]}return a.defineLocale("de-at",{months:"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT [Uhr]",sameElse:"L",nextDay:"[Morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[Gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:b,mm:"%d Minuten",h:b,hh:"%d Stunden",d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[a+" Tage",a+" Tagen"],M:["ein Monat","einem Monat"],MM:[a+" Monate",a+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[a+" Jahre",a+" Jahren"]};return b?d[c][0]:d[c][1]}return a.defineLocale("de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT [Uhr]",sameElse:"L",nextDay:"[Morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[Gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:b,mm:"%d Minuten",h:b,hh:"%d Stunden",d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("el",{monthsNominativeEl:"ΙανουάÏιος_ΦεβÏουάÏιος_ΜάÏτιος_ΑπÏίλιος_Μάιος_ΙοÏνιος_ΙοÏλιος_ΑÏγουστος_ΣεπτέμβÏιος_ΟκτώβÏιος_ÎοέμβÏιος_ΔεκέμβÏιος".split("_"),monthsGenitiveEl:"ΙανουαÏίου_ΦεβÏουαÏίου_ΜαÏτίου_ΑπÏιλίου_ΜαÎου_Ιουνίου_Ιουλίου_ΑυγοÏστου_ΣεπτεμβÏίου_ΟκτωβÏίου_ÎοεμβÏίου_ΔεκεμβÏίου".split("_"),months:function(a,b){return/D/.test(b.substring(0,b.indexOf("MMMM")))?this._monthsGenitiveEl[a.month()]:this._monthsNominativeEl[a.month()]},monthsShort:"Ιαν_Φεβ_ΜαÏ_ΑπÏ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Îοε_Δεκ".split("_"),weekdays:"ΚυÏιακή_ΔευτέÏα_ΤÏίτη_ΤετάÏτη_Πέμπτη_ΠαÏασκευή_Σάββατο".split("_"),weekdaysShort:"ΚυÏ_Δευ_ΤÏι_Τετ_Πεμ_ΠαÏ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_ΤÏ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(a,b,c){return a>11?c?"μμ":"ΜΜ":c?"πμ":"ΠΜ"},isPM:function(a){return"μ"===(a+"").toLowerCase()[0]},meridiemParse:/[ΠΜ]\.?Îœ?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendarEl:{sameDay:"[ΣήμεÏα {}] LT",nextDay:"[ΑÏÏιο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[το Ï€ÏοηγοÏμενο] dddd [{}] LT";default:return"[την Ï€ÏοηγοÏμενη] dddd [{}] LT"}},sameElse:"L"},calendar:function(a,b){var c=this._calendarEl[a],d=b&&b.hours();return"function"==typeof c&&(c=c.apply(b)),c.replace("{}",d%12===1?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s Ï€Ïιν",s:"λίγα δευτεÏόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ÏŽÏα",hh:"%d ÏŽÏες",d:"μία μέÏα",dd:"%d μέÏες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χÏόνος",yy:"%d χÏόνια"},ordinalParse:/\d{1,2}η/,ordinal:"%dη",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},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"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th"; +return a+c},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"D MMMM, YYYY",LLL:"D MMMM, YYYY LT",LLLL:"dddd, D MMMM, YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},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"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},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"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_aÅ­gusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aÅ­g_sep_okt_nov_dec".split("_"),weekdays:"Dimanĉo_Lundo_Mardo_Merkredo_Ä´aÅ­do_Vendredo_Sabato".split("_"),weekdaysShort:"Dim_Lun_Mard_Merk_Ä´aÅ­_Ven_Sab".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Ä´a_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"D[-an de] MMMM, YYYY",LLL:"D[-an de] MMMM, YYYY LT",LLLL:"dddd, [la] D[-an de] MMMM, YYYY LT"},meridiemParse:/[ap]\.t\.m/i,isPM:function(a){return"p"===a.charAt(0).toLowerCase()},meridiem:function(a,b,c){return a>11?c?"p.t.m.":"P.T.M.":c?"a.t.m.":"A.T.M."},calendar:{sameDay:"[HodiaÅ­ je] LT",nextDay:"[MorgaÅ­ je] LT",nextWeek:"dddd [je] LT",lastDay:"[HieraÅ­ je] LT",lastWeek:"[pasinta] dddd [je] LT",sameElse:"L"},relativeTime:{future:"je %s",past:"antaÅ­ %s",s:"sekundoj",m:"minuto",mm:"%d minutoj",h:"horo",hh:"%d horoj",d:"tago",dd:"%d tagoj",M:"monato",MM:"%d monatoj",y:"jaro",yy:"%d jaroj"},ordinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),c="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");return a.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(a,d){return/-MMM-/.test(d)?c[a.month()]:b[a.month()]},weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c,d){var e={s:["mõne sekundi","mõni sekund","paar sekundit"],m:["ühe minuti","üks minut"],mm:[a+" minuti",a+" minutit"],h:["ühe tunni","tund aega","üks tund"],hh:[a+" tunni",a+" tundi"],d:["ühe päeva","üks päev"],M:["kuu aja","kuu aega","üks kuu"],MM:[a+" kuu",a+" kuud"],y:["ühe aasta","aasta","üks aasta"],yy:[a+" aasta",a+" aastat"]};return b?e[c][2]?e[c][2]:e[c][1]:d?e[c][0]:e[c][1]}return a.defineLocale("et",{months:"jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Täna,] LT",nextDay:"[Homme,] LT",nextWeek:"[Järgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s pärast",past:"%s tagasi",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:"%d päeva",M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] LT",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] LT",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] LT",llll:"ddd, YYYY[ko] MMM D[a] LT"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"Û±",2:"Û²",3:"Û³",4:"Û´",5:"Ûµ",6:"Û¶",7:"Û·",8:"Û¸",9:"Û¹",0:"Û°"},c={"Û±":"1","Û²":"2","Û³":"3","Û´":"4","Ûµ":"5","Û¶":"6","Û·":"7","Û¸":"8","Û¹":"9","Û°":"0"};return a.defineLocale("fa",{months:"ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ÛŒ_د_س_Ú†_Ù¾_ج_Ø´".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},meridiemParse:/قبل از ظهر|بعد از ظهر/,isPM:function(a){return/بعد از ظهر/.test(a)},meridiem:function(a){return 12>a?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[Ùردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چندین ثانیه",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(a){return a.replace(/[Û°-Û¹]/g,function(a){return c[a]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]}).replace(/,/g,"ØŒ")},ordinalParse:/\d{1,2}Ù…/,ordinal:"%dÙ…",week:{dow:6,doy:12}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,d,e){var f="";switch(d){case"s":return e?"muutaman sekunnin":"muutama sekunti";case"m":return e?"minuutin":"minuutti";case"mm":f=e?"minuutin":"minuuttia";break;case"h":return e?"tunnin":"tunti";case"hh":f=e?"tunnin":"tuntia";break;case"d":return e?"päivän":"päivä";case"dd":f=e?"päivän":"päivää";break;case"M":return e?"kuukauden":"kuukausi";case"MM":f=e?"kuukauden":"kuukautta";break;case"y":return e?"vuoden":"vuosi";case"yy":f=e?"vuoden":"vuotta"}return f=c(a,e)+" "+f}function c(a,b){return 10>a?b?e[a]:d[a]:a}var d="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),e=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",d[7],d[8],d[9]];return a.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] LT",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] LT",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] LT",llll:"ddd, Do MMM YYYY, [klo] LT"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("fo",{months:"januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur".split("_"),weekdaysShort:"sun_mán_týs_mik_hós_frí_ley".split("_"),weekdaysMin:"su_má_tý_mi_hó_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D. MMMM, YYYY LT"},calendar:{sameDay:"[à dag kl.] LT",nextDay:"[à morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[à gjár kl.] LT",lastWeek:"[síðstu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s síðani",s:"fá sekund",m:"ein minutt",mm:"%d minuttir",h:"ein tími",hh:"%d tímar",d:"ein dagur",dd:"%d dagar",M:"ein mánaði",MM:"%d mánaðir",y:"eitt ár",yy:"%d ár"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|)/,ordinal:function(a){return a+(1===a?"er":"")}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|)/,ordinal:function(a){return a+(1===a?"er":"")},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b="jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.".split("_"),c="jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_");return a.defineLocale("fy",{months:"jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber".split("_"),monthsShort:function(a,d){return/-MMM-/.test(d)?c[a.month()]:b[a.month()]},weekdays:"snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon".split("_"),weekdaysShort:"si._mo._ti._wo._to._fr._so.".split("_"),weekdaysMin:"Si_Mo_Ti_Wo_To_Fr_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[hjoed om] LT",nextDay:"[moarn om] LT",nextWeek:"dddd [om] LT",lastDay:"[juster om] LT",lastWeek:"[ôfrûne] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oer %s",past:"%s lyn",s:"in pear sekonden",m:"ien minút",mm:"%d minuten",h:"ien oere",hh:"%d oeren",d:"ien dei",dd:"%d dagen",M:"ien moanne",MM:"%d moannen",y:"ien jier",yy:"%d jierren"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("gl",{months:"Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro".split("_"),monthsShort:"Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.".split("_"),weekdays:"Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado".split("_"),weekdaysShort:"Dom._Lun._Mar._Mér._Xov._Ven._Sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mé_Xo_Ve_Sá".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"ás":"á")+"] LT"},nextDay:function(){return"[mañá "+(1!==this.hours()?"ás":"á")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"ás":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"á":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"ás":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(a){return"uns segundos"===a?"nuns segundos":"en "+a},past:"hai %s",s:"uns segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("he",{months:"ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר".split("_"),monthsShort:"ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳".split("_"),weekdays:"ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),weekdaysShort:"×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),weekdaysMin:"×_ב_×’_ד_×”_ו_ש".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY LT",LLLL:"dddd, D [ב]MMMM YYYY LT",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY LT",llll:"ddd, D MMM YYYY LT"},calendar:{sameDay:"[×”×™×•× ×‘Ö¾]LT",nextDay:"[מחר ב־]LT",nextWeek:"dddd [בשעה] LT",lastDay:"[×תמול ב־]LT",lastWeek:"[ביו×] dddd [×”×חרון בשעה] LT",sameElse:"L"},relativeTime:{future:"בעוד %s",past:"לפני %s",s:"מספר שניות",m:"דקה",mm:"%d דקות",h:"שעה",hh:function(a){return 2===a?"שעתיי×":a+" שעות"},d:"יו×",dd:function(a){return 2===a?"יומיי×":a+" ימי×"},M:"חודש",MM:function(a){return 2===a?"חודשיי×":a+" חודשי×"},y:"שנה",yy:function(a){return 2===a?"שנתיי×":a%10===0&&10!==a?a+" שנה":a+" שני×"}}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return a.defineLocale("hi",{months:"जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°".split("_"),monthsShort:"जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.".split("_"),weekdays:"रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि".split("_"),weekdaysMin:"र_सो_मं_बà¥_गà¥_शà¥_श".split("_"),longDateFormat:{LT:"A h:mm बजे",LTS:"A h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कà¥à¤› ही कà¥à¤·à¤£",m:"à¤à¤• मिनट",mm:"%d मिनट",h:"à¤à¤• घंटा",hh:"%d घंटे",d:"à¤à¤• दिन",dd:"%d दिन",M:"à¤à¤• महीने",MM:"%d महीने",y:"à¤à¤• वरà¥à¤·",yy:"%d वरà¥à¤·"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/रात|सà¥à¤¬à¤¹|दोपहर|शाम/,meridiemHour:function(a,b){return 12===a&&(a=0),"रात"===b?4>a?a:a+12:"सà¥à¤¬à¤¹"===b?a:"दोपहर"===b?a>=10?a:a+12:"शाम"===b?a+12:void 0},meridiem:function(a){return 4>a?"रात":10>a?"सà¥à¤¬à¤¹":17>a?"दोपहर":20>a?"शाम":"रात"},week:{dow:0,doy:6}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d=a+" ";switch(c){case"m":return b?"jedna minuta":"jedne minute";case"mm":return d+=1===a?"minuta":2===a||3===a||4===a?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return d+=1===a?"sat":2===a||3===a||4===a?"sata":"sati";case"dd":return d+=1===a?"dan":"dana";case"MM":return d+=1===a?"mjesec":2===a||3===a||4===a?"mjeseca":"mjeseci";case"yy":return d+=1===a?"godina":2===a||3===a||4===a?"godine":"godina"}}return a.defineLocale("hr",{months:"sjeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_"),monthsShort:"sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),weekdays:"nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._Äet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_Äe_pe_su".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[proÅ¡lu] dddd [u] LT";case 6:return"[proÅ¡le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[proÅ¡li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:b,mm:b,h:b,hh:b,d:"dan",dd:b,M:"mjesec",MM:b,y:"godinu",yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c,d){var e=a;switch(c){case"s":return d||b?"néhány másodperc":"néhány másodperce";case"m":return"egy"+(d||b?" perc":" perce");case"mm":return e+(d||b?" perc":" perce");case"h":return"egy"+(d||b?" óra":" órája");case"hh":return e+(d||b?" óra":" órája");case"d":return"egy"+(d||b?" nap":" napja");case"dd":return e+(d||b?" nap":" napja");case"M":return"egy"+(d||b?" hónap":" hónapja");case"MM":return e+(d||b?" hónap":" hónapja");case"y":return"egy"+(d||b?" év":" éve");case"yy":return e+(d||b?" év":" éve")}return""}function c(a){return(a?"":"[múlt] ")+"["+d[this.day()]+"] LT[-kor]"}var d="vasárnap hétfÅ‘n kedden szerdán csütörtökön pénteken szombaton".split(" ");return a.defineLocale("hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfÅ‘_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D., LT",LLLL:"YYYY. MMMM D., dddd LT"},meridiemParse:/de|du/i,isPM:function(a){return"u"===a.charAt(1).toLowerCase()},meridiem:function(a,b,c){return 12>a?c===!0?"de":"DE":c===!0?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return c.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return c.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b){var c={nominative:"Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€_Õ´Õ¡Ö€Õ¿_Õ¡ÕºÖ€Õ«Õ¬_Õ´Õ¡ÕµÕ«Õ½_Õ°Õ¸Ö‚Õ¶Õ«Õ½_Õ°Õ¸Ö‚Õ¬Õ«Õ½_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€".split("_"),accusative:"Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€Õ«_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€Õ«_Õ´Õ¡Ö€Õ¿Õ«_Õ¡ÕºÖ€Õ«Õ¬Õ«_Õ´Õ¡ÕµÕ«Õ½Õ«_Õ°Õ¸Ö‚Õ¶Õ«Õ½Õ«_Õ°Õ¸Ö‚Õ¬Õ«Õ½Õ«_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½Õ«_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function c(a){var b="Õ°Õ¶Õ¾_ÖƒÕ¿Ö€_Õ´Ö€Õ¿_Õ¡ÕºÖ€_Õ´ÕµÕ½_Õ°Õ¶Õ½_Õ°Õ¬Õ½_Ö…Õ£Õ½_Õ½ÕºÕ¿_Õ°Õ¯Õ¿_Õ¶Õ´Õ¢_Õ¤Õ¯Õ¿".split("_");return b[a.month()]}function d(a){var b="Õ¯Õ«Ö€Õ¡Õ¯Õ«_Õ¥Ö€Õ¯Õ¸Ö‚Õ·Õ¡Õ¢Õ©Õ«_Õ¥Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ¹Õ¸Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ°Õ«Õ¶Õ£Õ·Õ¡Õ¢Õ©Õ«_Õ¸Ö‚Ö€Õ¢Õ¡Õ©_Õ·Õ¡Õ¢Õ¡Õ©".split("_");return b[a.day()]}return a.defineLocale("hy-am",{months:b,monthsShort:c,weekdays:d,weekdaysShort:"Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©".split("_"),weekdaysMin:"Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY Õ©.",LLL:"D MMMM YYYY Õ©., LT",LLLL:"dddd, D MMMM YYYY Õ©., LT"},calendar:{sameDay:"[Õ¡ÕµÕ½Ö…Ö€] LT",nextDay:"[Õ¾Õ¡Õ²Õ¨] LT",lastDay:"[Õ¥Ö€Õ¥Õ¯] LT",nextWeek:function(){return"dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT"},lastWeek:function(){return"[Õ¡Õ¶ÖÕ¡Õ®] dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT"},sameElse:"L"},relativeTime:{future:"%s Õ°Õ¥Õ¿Õ¸",past:"%s Õ¡Õ¼Õ¡Õ»",s:"Õ´Õ« Ö„Õ¡Õ¶Õ« Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶",m:"Ö€Õ¸ÕºÕ¥",mm:"%d Ö€Õ¸ÕºÕ¥",h:"ÕªÕ¡Õ´",hh:"%d ÕªÕ¡Õ´",d:"Ö…Ö€",dd:"%d Ö…Ö€",M:"Õ¡Õ´Õ«Õ½",MM:"%d Õ¡Õ´Õ«Õ½",y:"Õ¿Õ¡Ö€Õ«",yy:"%d Õ¿Õ¡Ö€Õ«"},meridiemParse:/Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡|Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡|ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶/,isPM:function(a){return/^(ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶)$/.test(a)},meridiem:function(a){return 4>a?"Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡":12>a?"Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡":17>a?"ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡":"Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶"},ordinalParse:/\d{1,2}|\d{1,2}-(Õ«Õ¶|Ö€Õ¤)/,ordinal:function(a,b){switch(b){case"DDD":case"w":case"W":case"DDDo":return 1===a?a+"-Õ«Õ¶":a+"-Ö€Õ¤";default:return a}},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"LT.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] LT",LLLL:"dddd, D MMMM YYYY [pukul] LT"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(a,b){return 12===a&&(a=0),"pagi"===b?a:"siang"===b?a>=11?a:a+12:"sore"===b||"malam"===b?a+12:void 0},meridiem:function(a){return 11>a?"pagi":15>a?"siang":19>a?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a){return a%100===11?!0:a%10===1?!1:!0}function c(a,c,d,e){var f=a+" ";switch(d){case"s":return c||e?"nokkrar sekúndur":"nokkrum sekúndum";case"m":return c?"mínúta":"mínútu";case"mm":return b(a)?f+(c||e?"mínútur":"mínútum"):c?f+"mínúta":f+"mínútu";case"hh":return b(a)?f+(c||e?"klukkustundir":"klukkustundum"):f+"klukkustund";case"d":return c?"dagur":e?"dag":"degi";case"dd":return b(a)?c?f+"dagar":f+(e?"daga":"dögum"):c?f+"dagur":f+(e?"dag":"degi");case"M":return c?"mánuður":e?"mánuð":"mánuði";case"MM":return b(a)?c?f+"mánuðir":f+(e?"mánuði":"mánuðum"):c?f+"mánuður":f+(e?"mánuð":"mánuði");case"y":return c||e?"ár":"ári";case"yy":return b(a)?f+(c||e?"ár":"árum"):f+(c||e?"ár":"ári")}}return a.defineLocale("is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd, D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:c,m:c,mm:c,h:"klukkustund",hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),weekdaysShort:"Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),weekdaysMin:"D_L_Ma_Me_G_V_S".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(a){return(/^[0-9].+$/.test(a)?"tra":"in")+" "+a},past:"%s fa",s:"alcuni secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_ç«æ›œæ—¥_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"æ—¥_月_ç«_æ°´_木_金_土".split("_"),weekdaysMin:"æ—¥_月_ç«_æ°´_木_金_土".split("_"),longDateFormat:{LT:"Ah時m分",LTS:"LTs秒",L:"YYYY/MM/DD",LL:"YYYYå¹´M月Dæ—¥",LLL:"YYYYå¹´M月Dæ—¥LT",LLLL:"YYYYå¹´M月Dæ—¥LT dddd"},meridiemParse:/åˆå‰|åˆå¾Œ/i,isPM:function(a){return"åˆå¾Œ"===a},meridiem:function(a){return 12>a?"åˆå‰":"åˆå¾Œ"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:"[æ¥é€±]dddd LT",lastDay:"[昨日] LT",lastWeek:"[å‰é€±]dddd LT",sameElse:"L"},relativeTime:{future:"%s後",past:"%så‰",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1æ—¥",dd:"%dæ—¥",M:"1ヶ月",MM:"%dヶ月",y:"1å¹´",yy:"%då¹´"}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b){var c={nominative:"იáƒáƒœáƒ•áƒáƒ áƒ˜_თებერვáƒáƒšáƒ˜_მáƒáƒ áƒ¢áƒ˜_áƒáƒžáƒ áƒ˜áƒšáƒ˜_მáƒáƒ˜áƒ¡áƒ˜_ივნისი_ივლისი_áƒáƒ’ვისტáƒ_სექტემბერი_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი_ნáƒáƒ”მბერი_დეკემბერი".split("_"),accusative:"იáƒáƒœáƒ•áƒáƒ áƒ¡_თებერვáƒáƒšáƒ¡_მáƒáƒ áƒ¢áƒ¡_áƒáƒžáƒ áƒ˜áƒšáƒ˜áƒ¡_მáƒáƒ˜áƒ¡áƒ¡_ივნისს_ივლისს_áƒáƒ’ვისტს_სექტემბერს_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერს_ნáƒáƒ”მბერს_დეკემბერს".split("_")},d=/D[oD] *MMMM?/.test(b)?"accusative":"nominative"; +return c[d][a.month()]}function c(a,b){var c={nominative:"კვირáƒ_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ი_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი_ხუთშáƒáƒ‘áƒáƒ—ი_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი_შáƒáƒ‘áƒáƒ—ი".split("_"),accusative:"კვირáƒáƒ¡_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ს_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ს_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ს_ხუთშáƒáƒ‘áƒáƒ—ს_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვს_შáƒáƒ‘áƒáƒ—ს".split("_")},d=/(წინáƒ|შემდეგ)/.test(b)?"accusative":"nominative";return c[d][a.day()]}return a.defineLocale("ka",{months:b,monthsShort:"იáƒáƒœ_თებ_მáƒáƒ _áƒáƒžáƒ _მáƒáƒ˜_ივნ_ივლ_áƒáƒ’ვ_სექ_áƒáƒ¥áƒ¢_ნáƒáƒ”_დეკ".split("_"),weekdays:c,weekdaysShort:"კვი_áƒáƒ áƒ¨_სáƒáƒ›_áƒáƒ—ხ_ხუთ_პáƒáƒ _შáƒáƒ‘".split("_"),weekdaysMin:"კვ_áƒáƒ _სáƒ_áƒáƒ—_ხუ_პáƒ_შáƒ".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[დღეს] LT[-ზე]",nextDay:"[ხვáƒáƒš] LT[-ზე]",lastDay:"[გუშინ] LT[-ზე]",nextWeek:"[შემდეგ] dddd LT[-ზე]",lastWeek:"[წინáƒ] dddd LT-ზე",sameElse:"L"},relativeTime:{future:function(a){return/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|წელი)/.test(a)?a.replace(/ი$/,"ში"):a+"ში"},past:function(a){return/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|დღე|თვე)/.test(a)?a.replace(/(ი|ე)$/,"ის წინ"):/წელი/.test(a)?a.replace(/წელი$/,"წლის წინ"):void 0},s:"რáƒáƒ›áƒ“ენიმე წáƒáƒ›áƒ˜",m:"წუთი",mm:"%d წუთი",h:"სáƒáƒáƒ—ი",hh:"%d სáƒáƒáƒ—ი",d:"დღე",dd:"%d დღე",M:"თვე",MM:"%d თვე",y:"წელი",yy:"%d წელი"},ordinalParse:/0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/,ordinal:function(a){return 0===a?a:1===a?a+"-ლი":20>a||100>=a&&a%20===0||a%100===0?"მე-"+a:a+"-ე"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("km",{months:"មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ".split("_"),monthsShort:"មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ".split("_"),weekdays:"អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ".split("_"),weekdaysShort:"អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ".split("_"),weekdaysMin:"អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[ážáŸ’ងៃនៈ ម៉ោង] LT",nextDay:"[ស្អែក ម៉ោង] LT",nextWeek:"dddd [ម៉ោង] LT",lastDay:"[ម្សិលមិញ ម៉ោង] LT",lastWeek:"dddd [សប្ážáž¶áž áŸáž˜áž»áž“] [ម៉ោង] LT",sameElse:"L"},relativeTime:{future:"%sទៀáž",past:"%sមុន",s:"ប៉ុន្មានវិនាទី",m:"មួយនាទី",mm:"%d នាទី",h:"មួយម៉ោង",hh:"%d ម៉ោង",d:"មួយážáŸ’ងៃ",dd:"%d ážáŸ’ងៃ",M:"មួយážáŸ‚",MM:"%d ážáŸ‚",y:"មួយឆ្នាំ",yy:"%d ឆ្នាំ"},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ko",{months:"1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"),monthsShort:"1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"),weekdays:"ì¼ìš”ì¼_월요ì¼_화요ì¼_수요ì¼_목요ì¼_금요ì¼_토요ì¼".split("_"),weekdaysShort:"ì¼_ì›”_í™”_수_목_금_토".split("_"),weekdaysMin:"ì¼_ì›”_í™”_수_목_금_토".split("_"),longDateFormat:{LT:"A hì‹œ m분",LTS:"A hì‹œ m분 sì´ˆ",L:"YYYY.MM.DD",LL:"YYYYë…„ MMMM Dì¼",LLL:"YYYYë…„ MMMM Dì¼ LT",LLLL:"YYYYë…„ MMMM Dì¼ dddd LT"},calendar:{sameDay:"오늘 LT",nextDay:"ë‚´ì¼ LT",nextWeek:"dddd LT",lastDay:"ì–´ì œ LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s ì „",s:"몇초",ss:"%dì´ˆ",m:"ì¼ë¶„",mm:"%d분",h:"한시간",hh:"%d시간",d:"하루",dd:"%dì¼",M:"한달",MM:"%d달",y:"ì¼ë…„",yy:"%dë…„"},ordinalParse:/\d{1,2}ì¼/,ordinal:"%dì¼",meridiemParse:/오전|오후/,isPM:function(a){return"오후"===a},meridiem:function(a){return 12>a?"오전":"오후"}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return b?d[c][0]:d[c][1]}function c(a){var b=a.substr(0,a.indexOf(" "));return e(b)?"a "+a:"an "+a}function d(a){var b=a.substr(0,a.indexOf(" "));return e(b)?"viru "+a:"virun "+a}function e(a){if(a=parseInt(a,10),isNaN(a))return!1;if(0>a)return!0;if(10>a)return a>=4&&7>=a?!0:!1;if(100>a){var b=a%10,c=a/10;return e(0===b?c:b)}if(1e4>a){for(;a>=10;)a/=10;return e(a)}return a/=1e3,e(a)}return a.defineLocale("lb",{months:"Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._Mé._Dë._Më._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mé_Dë_Më_Do_Fr_Sa".split("_"),longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gëschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:c,past:d,s:"e puer Sekonnen",m:b,mm:"%d Minutten",h:b,hh:"%d Stonnen",d:b,dd:"%d Deeg",M:b,MM:"%d Méint",y:b,yy:"%d Joer"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c,d){return b?"kelios sekundÄ—s":d?"kelių sekundžių":"kelias sekundes"}function c(a,b,c,d){return b?e(c)[0]:d?e(c)[1]:e(c)[2]}function d(a){return a%10===0||a>10&&20>a}function e(a){return h[a].split("_")}function f(a,b,f,g){var h=a+" ";return 1===a?h+c(a,b,f[0],g):b?h+(d(a)?e(f)[1]:e(f)[0]):g?h+e(f)[1]:h+(d(a)?e(f)[1]:e(f)[2])}function g(a,b){var c=-1===b.indexOf("dddd HH:mm"),d=i[a.day()];return c?d:d.substring(0,d.length-2)+"į"}var h={m:"minutÄ—_minutÄ—s_minutÄ™",mm:"minutÄ—s_minuÄių_minutes",h:"valanda_valandos_valandÄ…",hh:"valandos_valandų_valandas",d:"diena_dienos_dienÄ…",dd:"dienos_dienų_dienas",M:"mÄ—nuo_mÄ—nesio_mÄ—nesį",MM:"mÄ—nesiai_mÄ—nesių_mÄ—nesius",y:"metai_metų_metus",yy:"metai_metų_metus"},i="sekmadienis_pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis".split("_");return a.defineLocale("lt",{months:"sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio".split("_"),monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:g,weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Å eÅ¡".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Å ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], LT [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, LT [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], LT [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, LT [val.]"},calendar:{sameDay:"[Å iandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[PraÄ—jusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieÅ¡ %s",s:b,m:c,mm:f,h:c,hh:f,d:c,dd:f,M:c,MM:f,y:c,yy:f},ordinalParse:/\d{1,2}-oji/,ordinal:function(a){return a+"-oji"},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d=a.split("_");return c?b%10===1&&11!==b?d[2]:d[3]:b%10===1&&11!==b?d[0]:d[1]}function c(a,c,e){return a+" "+b(d[e],a,c)}var d={mm:"minÅ«ti_minÅ«tes_minÅ«te_minÅ«tes",hh:"stundu_stundas_stunda_stundas",dd:"dienu_dienas_diena_dienas",MM:"mÄ“nesi_mÄ“neÅ¡us_mÄ“nesis_mÄ“neÅ¡i",yy:"gadu_gadus_gads_gadi"};return a.defineLocale("lv",{months:"janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jÅ«n_jÅ«l_aug_sep_okt_nov_dec".split("_"),weekdays:"svÄ“tdiena_pirmdiena_otrdiena_treÅ¡diena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, LT",LLLL:"YYYY. [gada] D. MMMM, dddd, LT"},calendar:{sameDay:"[Å odien pulksten] LT",nextDay:"[RÄ«t pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[PagÄjuÅ¡Ä] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"%s vÄ“lÄk",past:"%s agrÄk",s:"dažas sekundes",m:"minÅ«ti",mm:c,h:"stundu",hh:c,d:"dienu",dd:c,M:"mÄ“nesi",MM:c,y:"gadu",yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("mk",{months:"јануари_февруари_март_април_мај_јуни_јули_авгуÑÑ‚_Ñептември_октомври_ноември_декември".split("_"),monthsShort:"јан_фев_мар_апр_мај_јун_јул_авг_Ñеп_окт_ное_дек".split("_"),weekdays:"недела_понеделник_вторник_Ñреда_четврток_петок_Ñабота".split("_"),weekdaysShort:"нед_пон_вто_Ñре_чет_пет_Ñаб".split("_"),weekdaysMin:"нe_пo_вт_ÑÑ€_че_пе_Ña".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Ð”ÐµÐ½ÐµÑ Ð²Ð¾] LT",nextDay:"[Утре во] LT",nextWeek:"dddd [во] LT",lastDay:"[Вчера во] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Во изминатата] dddd [во] LT";case 1:case 2:case 4:case 5:return"[Во изминатиот] dddd [во] LT"}},sameElse:"L"},relativeTime:{future:"поÑле %s",past:"пред %s",s:"неколку Ñекунди",m:"минута",mm:"%d минути",h:"чаÑ",hh:"%d чаÑа",d:"ден",dd:"%d дена",M:"меÑец",MM:"%d меÑеци",y:"година",yy:"%d години"},ordinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(a){var b=a%10,c=a%100;return 0===a?a+"-ев":0===c?a+"-ен":c>10&&20>c?a+"-ти":1===b?a+"-ви":2===b?a+"-ри":7===b||8===b?a+"-ми":a+"-ти"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ml",{months:"ജനàµà´µà´°à´¿_ഫെബàµà´°àµà´µà´°à´¿_മാർചàµà´šàµ_à´à´ªàµà´°à´¿àµ½_മേയàµ_ജൂൺ_ജൂലൈ_à´“à´—à´¸àµà´±àµà´±àµ_സെപàµà´±àµà´±à´‚ബർ_à´’à´•àµà´Ÿàµ‹à´¬àµ¼_നവംബർ_ഡിസംബർ".split("_"),monthsShort:"ജനàµ._ഫെബàµà´°àµ._മാർ._à´à´ªàµà´°à´¿._മേയàµ_ജൂൺ_ജൂലൈ._à´“à´—._സെപàµà´±àµà´±._à´’à´•àµà´Ÿàµ‹._നവം._ഡിസം.".split("_"),weekdays:"ഞായറാഴàµà´š_തിങàµà´•à´³à´¾à´´àµà´š_ചൊവàµà´µà´¾à´´àµà´š_à´¬àµà´§à´¨à´¾à´´àµà´š_à´µàµà´¯à´¾à´´à´¾à´´àµà´š_വെളàµà´³à´¿à´¯à´¾à´´àµà´š_ശനിയാഴàµà´š".split("_"),weekdaysShort:"ഞായർ_തിങàµà´•àµ¾_ചൊവàµà´µ_à´¬àµà´§àµ»_à´µàµà´¯à´¾à´´à´‚_വെളàµà´³à´¿_ശനി".split("_"),weekdaysMin:"à´žà´¾_തി_ചൊ_à´¬àµ_à´µàµà´¯à´¾_വെ_à´¶".split("_"),longDateFormat:{LT:"A h:mm -à´¨àµ",LTS:"A h:mm:ss -à´¨àµ",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[ഇനàµà´¨àµ] LT",nextDay:"[നാളെ] LT",nextWeek:"dddd, LT",lastDay:"[ഇനàµà´¨à´²àµ†] LT",lastWeek:"[à´•à´´à´¿à´žàµà´ž] dddd, LT",sameElse:"L"},relativeTime:{future:"%s à´•à´´à´¿à´žàµà´žàµ",past:"%s à´®àµàµ»à´ªàµ",s:"അൽപ നിമിഷങàµà´™àµ¾",m:"ഒരൠമിനിറàµà´±àµ",mm:"%d മിനിറàµà´±àµ",h:"ഒരൠമണികàµà´•àµ‚ർ",hh:"%d മണികàµà´•àµ‚ർ",d:"ഒരൠദിവസം",dd:"%d ദിവസം",M:"ഒരൠമാസം",MM:"%d മാസം",y:"ഒരൠവർഷം",yy:"%d വർഷം"},meridiemParse:/രാതàµà´°à´¿|രാവിലെ|ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿/i,isPM:function(a){return/^(ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿)$/.test(a)},meridiem:function(a){return 4>a?"രാതàµà´°à´¿":12>a?"രാവിലെ":17>a?"ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ":20>a?"വൈകàµà´¨àµà´¨àµ‡à´°à´‚":"രാതàµà´°à´¿"}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return a.defineLocale("mr",{months:"जानेवारी_फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€_मारà¥à¤š_à¤à¤ªà¥à¤°à¤¿à¤²_मे_जून_जà¥à¤²à¥ˆ_ऑगसà¥à¤Ÿ_सपà¥à¤Ÿà¥‡à¤‚बर_ऑकà¥à¤Ÿà¥‹à¤¬à¤°_नोवà¥à¤¹à¥‡à¤‚बर_डिसेंबर".split("_"),monthsShort:"जाने._फेबà¥à¤°à¥._मारà¥à¤š._à¤à¤ªà¥à¤°à¤¿._मे._जून._जà¥à¤²à¥ˆ._ऑग._सपà¥à¤Ÿà¥‡à¤‚._ऑकà¥à¤Ÿà¥‹._नोवà¥à¤¹à¥‡à¤‚._डिसें.".split("_"),weekdays:"रविवार_सोमवार_मंगळवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगळ_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि".split("_"),weekdaysMin:"र_सो_मं_बà¥_गà¥_शà¥_श".split("_"),longDateFormat:{LT:"A h:mm वाजता",LTS:"A h:mm:ss वाजता",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[आज] LT",nextDay:"[उदà¥à¤¯à¤¾] LT",nextWeek:"dddd, LT",lastDay:"[काल] LT",lastWeek:"[मागील] dddd, LT",sameElse:"L"},relativeTime:{future:"%s नंतर",past:"%s पूरà¥à¤µà¥€",s:"सेकंद",m:"à¤à¤• मिनिट",mm:"%d मिनिटे",h:"à¤à¤• तास",hh:"%d तास",d:"à¤à¤• दिवस",dd:"%d दिवस",M:"à¤à¤• महिना",MM:"%d महिने",y:"à¤à¤• वरà¥à¤·",yy:"%d वरà¥à¤·à¥‡"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/रातà¥à¤°à¥€|सकाळी|दà¥à¤ªà¤¾à¤°à¥€|सायंकाळी/,meridiemHour:function(a,b){return 12===a&&(a=0),"रातà¥à¤°à¥€"===b?4>a?a:a+12:"सकाळी"===b?a:"दà¥à¤ªà¤¾à¤°à¥€"===b?a>=10?a:a+12:"सायंकाळी"===b?a+12:void 0},meridiem:function(a){return 4>a?"रातà¥à¤°à¥€":10>a?"सकाळी":17>a?"दà¥à¤ªà¤¾à¤°à¥€":20>a?"सायंकाळी":"रातà¥à¤°à¥€"},week:{dow:0,doy:6}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"LT.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] LT",LLLL:"dddd, D MMMM YYYY [pukul] LT"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(a,b){return 12===a&&(a=0),"pagi"===b?a:"tengahari"===b?a>=11?a:a+12:"petang"===b||"malam"===b?a+12:void 0},meridiem:function(a){return 11>a?"pagi":15>a?"tengahari":19>a?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"á",2:"á‚",3:"áƒ",4:"á„",5:"á…",6:"á†",7:"á‡",8:"áˆ",9:"á‰",0:"á€"},c={"á":"1","á‚":"2","áƒ":"3","á„":"4","á…":"5","á†":"6","á‡":"7","áˆ":"8","á‰":"9","á€":"0"};return a.defineLocale("my",{months:"ဇန်နá€á€«á€›á€®_ဖေဖော်á€á€«á€›á€®_မá€á€º_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုá€á€º_စက်á€á€„်ဘာ_အောက်á€á€­á€¯á€˜á€¬_နိုá€á€„်ဘာ_ဒီဇင်ဘာ".split("_"),monthsShort:"ဇန်_ဖေ_မá€á€º_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ".split("_"),weekdays:"á€á€”င်္ဂနွေ_á€á€”င်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပá€á€±á€¸_သောကြာ_စနေ".split("_"),weekdaysShort:"နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),weekdaysMin:"နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[ယနေ.] LT [မှာ]",nextDay:"[မနက်ဖြန်] LT [မှာ]",nextWeek:"dddd LT [မှာ]",lastDay:"[မနေ.က] LT [မှာ]",lastWeek:"[ပြီးá€á€²á€·á€žá€±á€¬] dddd LT [မှာ]",sameElse:"L"},relativeTime:{future:"လာမည့် %s မှာ",past:"လွန်á€á€²á€·á€žá€±á€¬ %s က",s:"စက္ကန်.အနည်းငယ်",m:"á€á€…်မိနစ်",mm:"%d မိနစ်",h:"á€á€…်နာရီ",hh:"%d နာရီ",d:"á€á€…်ရက်",dd:"%d ရက်",M:"á€á€…်လ",MM:"%d လ",y:"á€á€…်နှစ်",yy:"%d နှစ်"},preparse:function(a){return a.replace(/[áá‚áƒá„á…á†á‡áˆá‰á€]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tirs_ons_tors_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"H.mm",LTS:"LT.ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i gÃ¥r kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"for %s siden",s:"noen sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en mÃ¥ned",MM:"%d mÃ¥neder",y:"ett Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return a.defineLocale("ne",{months:"जनवरी_फेबà¥à¤°à¥à¤µà¤°à¥€_मारà¥à¤š_अपà¥à¤°à¤¿à¤²_मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ_अगषà¥à¤Ÿ_सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°_अकà¥à¤Ÿà¥‹à¤¬à¤°_नोभेमà¥à¤¬à¤°_डिसेमà¥à¤¬à¤°".split("_"),monthsShort:"जन._फेबà¥à¤°à¥._मारà¥à¤š_अपà¥à¤°à¤¿._मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ._अग._सेपà¥à¤Ÿ._अकà¥à¤Ÿà¥‹._नोभे._डिसे.".split("_"),weekdays:"आइतबार_सोमबार_मङà¥à¤—लबार_बà¥à¤§à¤¬à¤¾à¤°_बिहिबार_शà¥à¤•à¥à¤°à¤¬à¤¾à¤°_शनिबार".split("_"),weekdaysShort:"आइत._सोम._मङà¥à¤—ल._बà¥à¤§._बिहि._शà¥à¤•à¥à¤°._शनि.".split("_"),weekdaysMin:"आइ._सो._मङà¥_बà¥._बि._शà¥._श.".split("_"),longDateFormat:{LT:"Aको h:mm बजे",LTS:"Aको h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/राती|बिहान|दिउà¤à¤¸à¥‹|बेलà¥à¤•à¤¾|साà¤à¤|राती/,meridiemHour:function(a,b){return 12===a&&(a=0),"राती"===b?3>a?a:a+12:"बिहान"===b?a:"दिउà¤à¤¸à¥‹"===b?a>=10?a:a+12:"बेलà¥à¤•à¤¾"===b||"साà¤à¤"===b?a+12:void 0},meridiem:function(a){return 3>a?"राती":10>a?"बिहान":15>a?"दिउà¤à¤¸à¥‹":18>a?"बेलà¥à¤•à¤¾":20>a?"साà¤à¤":"राती"},calendar:{sameDay:"[आज] LT",nextDay:"[भोली] LT",nextWeek:"[आउà¤à¤¦à¥‹] dddd[,] LT",lastDay:"[हिजो] LT",lastWeek:"[गà¤à¤•à¥‹] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%sमा",past:"%s अगाडी",s:"केही समय",m:"à¤à¤• मिनेट",mm:"%d मिनेट",h:"à¤à¤• घणà¥à¤Ÿà¤¾",hh:"%d घणà¥à¤Ÿà¤¾",d:"à¤à¤• दिन",dd:"%d दिन",M:"à¤à¤• महिना",MM:"%d महिना",y:"à¤à¤• बरà¥à¤·",yy:"%d बरà¥à¤·"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),c="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_");return a.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(a,d){return/-MMM-/.test(d)?c[a.month()]:b[a.month()]},weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_mÃ¥ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_mÃ¥n_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_mÃ¥_ty_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I gÃ¥r klokka] LT",lastWeek:"[FøregÃ¥ande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"for %s sidan",s:"nokre sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",M:"ein mÃ¥nad",MM:"%d mÃ¥nader",y:"eit Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a){return 5>a%10&&a%10>1&&~~(a/10)%10!==1}function c(a,c,d){var e=a+" ";switch(d){case"m":return c?"minuta":"minutÄ™";case"mm":return e+(b(a)?"minuty":"minut");case"h":return c?"godzina":"godzinÄ™";case"hh":return e+(b(a)?"godziny":"godzin");case"MM":return e+(b(a)?"miesiÄ…ce":"miesiÄ™cy");case"yy":return e+(b(a)?"lata":"lat")}}var d="styczeÅ„_luty_marzec_kwiecieÅ„_maj_czerwiec_lipiec_sierpieÅ„_wrzesieÅ„_październik_listopad_grudzieÅ„".split("_"),e="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrzeÅ›nia_października_listopada_grudnia".split("_");return a.defineLocale("pl",{months:function(a,b){return/D MMMM/.test(b)?e[a.month()]:d[a.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziaÅ‚ek_wtorek_Å›roda_czwartek_piÄ…tek_sobota".split("_"),weekdaysShort:"nie_pon_wt_Å›r_czw_pt_sb".split("_"),weekdaysMin:"N_Pn_Wt_Åšr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[DziÅ› o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszÅ‚Ä… niedzielÄ™ o] LT";case 3:return"[W zeszÅ‚Ä… Å›rodÄ™ o] LT";case 6:return"[W zeszÅ‚Ä… sobotÄ™ o] LT";default:return"[W zeszÅ‚y] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:c,mm:c,h:c,hh:c,d:"1 dzieÅ„",dd:"%d dni",M:"miesiÄ…c",MM:c,y:"rok",yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("pt-br",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] LT",LLLL:"dddd, D [de] MMMM [de] YYYY [às] LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº"})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("pt",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d={mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"},e=" ";return(a%100>=20||a>=100&&a%100===0)&&(e=" de "),a+e+d[c]}return a.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),weekdays:"duminică_luni_marÈ›i_miercuri_joi_vineri_sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",m:"un minut",mm:b,h:"o oră",hh:b,d:"o zi",dd:b,M:"o lună",MM:b,y:"un an",yy:b},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:c?"минута_минуты_минут":"минуту_минуты_минут",hh:"чаÑ_чаÑа_чаÑов",dd:"день_днÑ_дней",MM:"меÑÑц_меÑÑца_меÑÑцев",yy:"год_года_лет"};return"m"===d?c?"минута":"минуту":a+" "+b(e[d],+a)}function d(a,b){var c={nominative:"Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь".split("_"),accusative:"ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function e(a,b){var c={nominative:"Ñнв_фев_март_апр_май_июнь_июль_авг_Ñен_окт_ноÑ_дек".split("_"),accusative:"Ñнв_фев_мар_апр_маÑ_июнÑ_июлÑ_авг_Ñен_окт_ноÑ_дек".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function f(a,b){var c={nominative:"воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота".split("_"),accusative:"воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу".split("_")},d=/\[ ?[Вв] ?(?:прошлую|Ñледующую|Ñту)? ?\] ?dddd/.test(b)?"accusative":"nominative";return c[d][a.day()]}return a.defineLocale("ru",{months:d,monthsShort:e,weekdays:f,weekdaysShort:"вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),weekdaysMin:"вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),monthsParse:[/^Ñнв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[й|Ñ]/i,/^июн/i,/^июл/i,/^авг/i,/^Ñен/i,/^окт/i,/^ноÑ/i,/^дек/i],longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., LT",LLLL:"dddd, D MMMM YYYY г., LT"},calendar:{sameDay:"[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT",nextDay:"[Завтра в] LT",lastDay:"[Вчера в] LT",nextWeek:function(){return 2===this.day()?"[Во] dddd [в] LT":"[Ð’] dddd [в] LT"},lastWeek:function(a){if(a.week()===this.week())return 2===this.day()?"[Во] dddd [в] LT":"[Ð’] dddd [в] LT";switch(this.day()){case 0:return"[Ð’ прошлое] dddd [в] LT";case 1:case 2:case 4:return"[Ð’ прошлый] dddd [в] LT";case 3:case 5:case 6:return"[Ð’ прошлую] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"неÑколько Ñекунд",m:c,mm:c,h:"чаÑ",hh:c,d:"день",dd:c,M:"меÑÑц",MM:c,y:"год",yy:c},meridiemParse:/ночи|утра|днÑ|вечера/i,isPM:function(a){return/^(днÑ|вечера)$/.test(a)},meridiem:function(a){return 4>a?"ночи":12>a?"утра":17>a?"днÑ":"вечера"},ordinalParse:/\d{1,2}-(й|го|Ñ)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":return a+"-й";case"D":return a+"-го";case"w":case"W":return a+"-Ñ";default:return a}},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a){return a>1&&5>a}function c(a,c,d,e){var f=a+" ";switch(d){case"s":return c||e?"pár sekúnd":"pár sekundami";case"m":return c?"minúta":e?"minútu":"minútou";case"mm":return c||e?f+(b(a)?"minúty":"minút"):f+"minútami";break;case"h":return c?"hodina":e?"hodinu":"hodinou";case"hh":return c||e?f+(b(a)?"hodiny":"hodín"):f+"hodinami";break;case"d":return c||e?"deň":"dňom";case"dd":return c||e?f+(b(a)?"dni":"dní"):f+"dňami";break;case"M":return c||e?"mesiac":"mesiacom";case"MM":return c||e?f+(b(a)?"mesiace":"mesiacov"):f+"mesiacmi";break;case"y":return c||e?"rok":"rokom";case"yy":return c||e?f+(b(a)?"roky":"rokov"):f+"rokmi"}}var d="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),e="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");return a.defineLocale("sk",{months:d,monthsShort:e,monthsParse:function(a,b){var c,d=[];for(c=0;12>c;c++)d[c]=new RegExp("^"+a[c]+"$|^"+b[c]+"$","i");return d}(d,e),weekdays:"nedeľa_pondelok_utorok_streda_Å¡tvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_Å¡t_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_Å¡t_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo Å¡tvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[vÄera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT";case 1:case 2:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 4:case 5:return"[minulý] dddd [o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d=a+" ";switch(c){case"m":return b?"ena minuta":"eno minuto";case"mm":return d+=1===a?"minuta":2===a?"minuti":3===a||4===a?"minute":"minut";case"h":return b?"ena ura":"eno uro";case"hh":return d+=1===a?"ura":2===a?"uri":3===a||4===a?"ure":"ur";case"dd":return d+=1===a?"dan":"dni"; +case"MM":return d+=1===a?"mesec":2===a?"meseca":3===a||4===a?"mesece":"mesecev";case"yy":return d+=1===a?"leto":2===a?"leti":3===a||4===a?"leta":"let"}}return a.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),weekdays:"nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._Äet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_Äe_pe_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[vÄeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[prejÅ¡nja] dddd [ob] LT";case 1:case 2:case 4:case 5:return"[prejÅ¡nji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"Äez %s",past:"%s nazaj",s:"nekaj sekund",m:b,mm:b,h:b,hh:b,d:"en dan",dd:b,M:"en mesec",MM:b,y:"eno leto",yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"),weekdays:"E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë".split("_"),weekdaysShort:"Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_Më_E_P_Sh".split("_"),meridiemParse:/PD|MD/,isPM:function(a){return"M"===a.charAt(0)},meridiem:function(a){return 12>a?"PD":"MD"},longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Sot në] LT",nextDay:"[Nesër në] LT",nextWeek:"dddd [në] LT",lastDay:"[Dje në] LT",lastWeek:"dddd [e kaluar në] LT",sameElse:"L"},relativeTime:{future:"në %s",past:"%s më parë",s:"disa sekonda",m:"një minutë",mm:"%d minuta",h:"një orë",hh:"%d orë",d:"një ditë",dd:"%d ditë",M:"një muaj",MM:"%d muaj",y:"një vit",yy:"%d vite"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={words:{m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један Ñат","једног Ñата"],hh:["Ñат","Ñата","Ñати"],dd:["дан","дана","дана"],MM:["меÑец","меÑеца","меÑеци"],yy:["година","године","година"]},correctGrammaticalCase:function(a,b){return 1===a?b[0]:a>=2&&4>=a?b[1]:b[2]},translate:function(a,c,d){var e=b.words[d];return 1===d.length?c?e[0]:e[1]:a+" "+b.correctGrammaticalCase(a,e)}};return a.defineLocale("sr-cyrl",{months:["јануар","фебруар","март","април","мај","јун","јул","авгуÑÑ‚","Ñептембар","октобар","новембар","децембар"],monthsShort:["јан.","феб.","мар.","апр.","мај","јун","јул","авг.","Ñеп.","окт.","нов.","дец."],weekdays:["недеља","понедељак","уторак","Ñреда","четвртак","петак","Ñубота"],weekdaysShort:["нед.","пон.","уто.","Ñре.","чет.","пет.","Ñуб."],weekdaysMin:["не","по","ут","ÑÑ€","че","пе","Ñу"],longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Ð´Ð°Ð½Ð°Ñ Ñƒ] LT",nextDay:"[Ñутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [Ñреду] [у] LT";case 6:return"[у] [Ñуботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){var a=["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [Ñреде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [Ñуботе] [у] LT"];return a[this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико Ñекунди",m:b.translate,mm:b.translate,h:b.translate,hh:b.translate,d:"дан",dd:b.translate,M:"меÑец",MM:b.translate,y:"годину",yy:b.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={words:{m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(a,b){return 1===a?b[0]:a>=2&&4>=a?b[1]:b[2]},translate:function(a,c,d){var e=b.words[d];return 1===d.length?c?e[0]:e[1]:a+" "+b.correctGrammaticalCase(a,e)}};return a.defineLocale("sr",{months:["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar"],monthsShort:["jan.","feb.","mar.","apr.","maj","jun","jul","avg.","sep.","okt.","nov.","dec."],weekdays:["nedelja","ponedeljak","utorak","sreda","Äetvrtak","petak","subota"],weekdaysShort:["ned.","pon.","uto.","sre.","Äet.","pet.","sub."],weekdaysMin:["ne","po","ut","sr","Äe","pe","su"],longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄe u] LT",lastWeek:function(){var a=["[proÅ¡le] [nedelje] [u] LT","[proÅ¡log] [ponedeljka] [u] LT","[proÅ¡log] [utorka] [u] LT","[proÅ¡le] [srede] [u] LT","[proÅ¡log] [Äetvrtka] [u] LT","[proÅ¡log] [petka] [u] LT","[proÅ¡le] [subote] [u] LT"];return a[this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",m:b.translate,mm:b.translate,h:b.translate,hh:b.translate,d:"dan",dd:b.translate,M:"mesec",MM:b.translate,y:"godinu",yy:b.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_mÃ¥ndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mÃ¥n_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_mÃ¥_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[IgÃ¥r] LT",nextWeek:"dddd LT",lastWeek:"[Förra] dddd[en] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"nÃ¥gra sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en mÃ¥nad",MM:"%d mÃ¥nader",y:"ett Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}(e|a)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"e":1===b?"a":2===b?"a":"e";return a+c},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ta",{months:"ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯".split("_"),monthsShort:"ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯".split("_"),weekdays:"ஞாயிறà¯à®±à¯à®•à¯à®•à®¿à®´à®®à¯ˆ_திஙà¯à®•à®Ÿà¯à®•à®¿à®´à®®à¯ˆ_செவà¯à®µà®¾à®¯à¯à®•à®¿à®´à®®à¯ˆ_பà¯à®¤à®©à¯à®•à®¿à®´à®®à¯ˆ_வியாழகà¯à®•à®¿à®´à®®à¯ˆ_வெளà¯à®³à®¿à®•à¯à®•à®¿à®´à®®à¯ˆ_சனிகà¯à®•à®¿à®´à®®à¯ˆ".split("_"),weekdaysShort:"ஞாயிறà¯_திஙà¯à®•à®³à¯_செவà¯à®µà®¾à®¯à¯_பà¯à®¤à®©à¯_வியாழனà¯_வெளà¯à®³à®¿_சனி".split("_"),weekdaysMin:"ஞா_தி_செ_பà¯_வி_வெ_ச".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[இனà¯à®±à¯] LT",nextDay:"[நாளை] LT",nextWeek:"dddd, LT",lastDay:"[நேறà¯à®±à¯] LT",lastWeek:"[கடநà¯à®¤ வாரமà¯] dddd, LT",sameElse:"L"},relativeTime:{future:"%s இலà¯",past:"%s à®®à¯à®©à¯",s:"ஒர௠சில விநாடிகளà¯",m:"ஒர௠நிமிடமà¯",mm:"%d நிமிடஙà¯à®•à®³à¯",h:"ஒர௠மணி நேரமà¯",hh:"%d மணி நேரமà¯",d:"ஒர௠நாளà¯",dd:"%d நாடà¯à®•à®³à¯",M:"ஒர௠மாதமà¯",MM:"%d மாதஙà¯à®•à®³à¯",y:"ஒர௠வரà¯à®Ÿà®®à¯",yy:"%d ஆணà¯à®Ÿà¯à®•à®³à¯"},ordinalParse:/\d{1,2}வதà¯/,ordinal:function(a){return a+"வதà¯"},meridiemParse:/யாமமà¯|வைகறை|காலை|நணà¯à®ªà®•à®²à¯|எறà¯à®ªà®¾à®Ÿà¯|மாலை/,meridiem:function(a){return 2>a?" யாமமà¯":6>a?" வைகறை":10>a?" காலை":14>a?" நணà¯à®ªà®•à®²à¯":18>a?" எறà¯à®ªà®¾à®Ÿà¯":22>a?" மாலை":" யாமமà¯"},meridiemHour:function(a,b){return 12===a&&(a=0),"யாமமà¯"===b?2>a?a:a+12:"வைகறை"===b||"காலை"===b?a:"நணà¯à®ªà®•à®²à¯"===b&&a>=10?a:a+12},week:{dow:0,doy:6}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("th",{months:"มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม".split("_"),monthsShort:"มà¸à¸£à¸²_à¸à¸¸à¸¡à¸ à¸²_มีนา_เมษา_พฤษภา_มิถุนา_à¸à¸£à¸à¸Žà¸²_สิงหา_à¸à¸±à¸™à¸¢à¸²_ตุลา_พฤศจิà¸à¸²_ธันวา".split("_"),weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),longDateFormat:{LT:"H นาฬิà¸à¸² m นาที",LTS:"LT s วินาที",L:"YYYY/MM/DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา LT",LLLL:"วันddddที่ D MMMM YYYY เวลา LT"},meridiemParse:/à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง|หลังเที่ยง/,isPM:function(a){return"หลังเที่ยง"===a},meridiem:function(a){return 12>a?"à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่à¹à¸¥à¹‰à¸§ เวลา] LT",sameElse:"L"},relativeTime:{future:"อีภ%s",past:"%sที่à¹à¸¥à¹‰à¸§",s:"ไม่à¸à¸µà¹ˆà¸§à¸´à¸™à¸²à¸—ี",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY LT",LLLL:"dddd, MMMM DD, YYYY LT"},calendar:{sameDay:"[Ngayon sa] LT",nextDay:"[Bukas sa] LT",nextWeek:"dddd [sa] LT",lastDay:"[Kahapon sa] LT",lastWeek:"dddd [huling linggo] LT",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},ordinalParse:/\d{1,2}/,ordinal:function(a){return a},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"};return a.defineLocale("tr",{months:"Ocak_Åžubat_Mart_Nisan_Mayıs_Haziran_Temmuz_AÄŸustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_ÇarÅŸamba_PerÅŸembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[haftaya] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen hafta] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinalParse:/\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/,ordinal:function(a){if(0===a)return a+"'ıncı";var c=a%10,d=a%100-c,e=a>=100?100:null;return a+(b[c]||b[d]||b[e])},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("tzm-latn",{months:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",m:"minuá¸",mm:"%d minuá¸",h:"saÉ›a",hh:"%d tassaÉ›in",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("tzm",{months:"ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”".split("_"),monthsShort:"ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”".split("_"),weekdays:"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysShort:"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysMin:"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[ⴰⵙⴷⵅ â´´] LT",nextDay:"[ⴰⵙⴽⴰ â´´] LT",nextWeek:"dddd [â´´] LT",lastDay:"[ⴰⵚⴰâµâµœ â´´] LT",lastWeek:"dddd [â´´] LT",sameElse:"L"},relativeTime:{future:"â´·â´°â´·âµ… âµ™ ⵢⴰⵠ%s",past:"ⵢⴰⵠ%s",s:"ⵉⵎⵉⴽ",m:"ⵎⵉâµâµ“â´º",mm:"%d ⵎⵉâµâµ“â´º",h:"ⵙⴰⵄⴰ",hh:"%d ⵜⴰⵙⵙⴰⵄⵉâµ",d:"ⴰⵙⵙ",dd:"%d oⵙⵙⴰâµ",M:"â´°âµ¢oⵓⵔ",MM:"%d ⵉⵢⵢⵉⵔâµ",y:"ⴰⵙⴳⴰⵙ",yy:"%d ⵉⵙⴳⴰⵙâµ"},week:{dow:6,doy:12}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:"хвилина_хвилини_хвилин",hh:"година_години_годин",dd:"день_дні_днів",MM:"міÑÑць_міÑÑці_міÑÑців",yy:"рік_роки_років"};return"m"===d?c?"хвилина":"хвилину":"h"===d?c?"година":"годину":a+" "+b(e[d],+a)}function d(a,b){var c={nominative:"Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень".split("_"),accusative:"ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ".split("_")},d=/D[oD]? *MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function e(a,b){var c={nominative:"неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота".split("_"),accusative:"неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу".split("_"),genitive:"неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи".split("_")},d=/(\[[ВвУу]\]) ?dddd/.test(b)?"accusative":/\[?(?:минулої|наÑтупної)? ?\] ?dddd/.test(b)?"genitive":"nominative";return c[d][a.day()]}function f(a){return function(){return a+"о"+(11===this.hours()?"б":"")+"] LT"}}return a.defineLocale("uk",{months:d,monthsShort:"Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд".split("_"),weekdays:e,weekdaysShort:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),weekdaysMin:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY Ñ€.",LLL:"D MMMM YYYY Ñ€., LT",LLLL:"dddd, D MMMM YYYY Ñ€., LT"},calendar:{sameDay:f("[Сьогодні "),nextDay:f("[Завтра "),lastDay:f("[Вчора "),nextWeek:f("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return f("[Минулої] dddd [").call(this);case 1:case 2:case 4:return f("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька Ñекунд",m:c,mm:c,h:"годину",hh:c,d:"день",dd:c,M:"міÑÑць",MM:c,y:"рік",yy:c},meridiemParse:/ночі|ранку|днÑ|вечора/,isPM:function(a){return/^(днÑ|вечора)$/.test(a)},meridiem:function(a){return 4>a?"ночі":12>a?"ранку":17>a?"днÑ":"вечора"},ordinalParse:/\d{1,2}-(й|го)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":case"w":case"W":return a+"-й";case"D":return a+"-го";default:return a}},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("uz",{months:"Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь".split("_"),monthsShort:"Ñнв_фев_мар_апр_май_июн_июл_авг_Ñен_окт_ноÑ_дек".split("_"),weekdays:"Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"),weekdaysShort:"Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"),weekdaysMin:"Як_Ду_Се_Чо_Па_Жу_Ша".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"D MMMM YYYY, dddd LT"},calendar:{sameDay:"[Бугун Ñоат] LT [да]",nextDay:"[Эртага] LT [да]",nextWeek:"dddd [куни Ñоат] LT [да]",lastDay:"[Кеча Ñоат] LT [да]",lastWeek:"[Утган] dddd [куни Ñоат] LT [да]",sameElse:"L"},relativeTime:{future:"Якин %s ичида",past:"Бир неча %s олдин",s:"фурÑат",m:"бир дакика",mm:"%d дакика",h:"бир Ñоат",hh:"%d Ñоат",d:"бир кун",dd:"%d кун",M:"бир ой",MM:"%d ой",y:"бир йил",yy:"%d йил"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("vi",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),weekdays:"chủ nhật_thứ hai_thứ ba_thứ tÆ°_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY LT",LLLL:"dddd, D MMMM [năm] YYYY LT",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY LT",llll:"ddd, D MMM YYYY LT"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tá»›i lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần rồi lúc] LT",sameElse:"L"},relativeTime:{future:"%s tá»›i",past:"%s trÆ°á»›c",s:"vài giây",m:"má»™t phút",mm:"%d phút",h:"má»™t giá»",hh:"%d giá»",d:"má»™t ngày",dd:"%d ngày",M:"má»™t tháng",MM:"%d tháng",y:"má»™t năm",yy:"%d năm"},ordinalParse:/\d{1,2}/,ordinal:function(a){return a},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"æ—¥_一_二_三_å››_五_å…­".split("_"),longDateFormat:{LT:"Ah点mm",LTS:"Ah点m分s秒",L:"YYYY-MM-DD",LL:"YYYYå¹´MMMDæ—¥",LLL:"YYYYå¹´MMMDæ—¥LT",LLLL:"YYYYå¹´MMMDæ—¥ddddLT",l:"YYYY-MM-DD",ll:"YYYYå¹´MMMDæ—¥",lll:"YYYYå¹´MMMDæ—¥LT",llll:"YYYYå¹´MMMDæ—¥ddddLT"},meridiemParse:/凌晨|早上|上åˆ|中åˆ|下åˆ|晚上/,meridiemHour:function(a,b){return 12===a&&(a=0),"凌晨"===b||"早上"===b||"上åˆ"===b?a:"下åˆ"===b||"晚上"===b?a+12:a>=11?a:a+12},meridiem:function(a,b){var c=100*a+b;return 600>c?"凌晨":900>c?"早上":1130>c?"上åˆ":1230>c?"中åˆ":1800>c?"下åˆ":"晚上"},calendar:{sameDay:function(){return 0===this.minutes()?"[今天]Ah[点整]":"[今天]LT"},nextDay:function(){return 0===this.minutes()?"[明天]Ah[点整]":"[明天]LT"},lastDay:function(){return 0===this.minutes()?"[昨天]Ah[点整]":"[昨天]LT"},nextWeek:function(){var b,c;return b=a().startOf("week"),c=this.unix()-b.unix()>=604800?"[下]":"[本]",0===this.minutes()?c+"dddAh点整":c+"dddAh点mm"},lastWeek:function(){var b,c;return b=a().startOf("week"),c=this.unix()=11?a:a+12:"下åˆ"===b||"晚上"===b?a+12:void 0},meridiem:function(a,b){var c=100*a+b;return 900>c?"早上":1130>c?"上åˆ":1230>c?"中åˆ":1800>c?"下åˆ":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},ordinalParse:/\d{1,2}(æ—¥|月|週)/,ordinal:function(a,b){switch(b){case"d":case"D":case"DDD":return a+"æ—¥";case"M":return a+"月";case"w":case"W":return a+"週";default:return a}},relativeTime:{future:"%så…§",past:"%så‰",s:"幾秒",m:"一分é˜",mm:"%d分é˜",h:"一å°æ™‚",hh:"%då°æ™‚",d:"一天",dd:"%d天",M:"一個月",MM:"%d個月",y:"一年",yy:"%då¹´"}})}); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/min/moment-with-locales.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/min/moment-with-locales.js new file mode 100644 index 0000000..202450a --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/min/moment-with-locales.js @@ -0,0 +1,9792 @@ +//! moment.js +//! version : 2.9.0 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com + +(function (undefined) { + /************************************ + Constants + ************************************/ + + var moment, + VERSION = '2.9.0', + // the global-scope this is NOT the global object in Node.js + globalScope = (typeof global !== 'undefined' && (typeof window === 'undefined' || window === global.window)) ? global : this, + oldGlobalMoment, + round = Math.round, + hasOwnProperty = Object.prototype.hasOwnProperty, + i, + + YEAR = 0, + MONTH = 1, + DATE = 2, + HOUR = 3, + MINUTE = 4, + SECOND = 5, + MILLISECOND = 6, + + // internal storage for locale config files + locales = {}, + + // extra moment internal properties (plugins register props here) + momentProperties = [], + + // check for nodeJS + hasModule = (typeof module !== 'undefined' && module && module.exports), + + // ASP.NET json date format regex + aspNetJsonRegex = /^\/?Date\((\-?\d+)/i, + aspNetTimeSpanJsonRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/, + + // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html + // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere + isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/, + + // format tokens + formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|x|X|zz?|ZZ?|.)/g, + localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, + + // parsing token regexes + parseTokenOneOrTwoDigits = /\d\d?/, // 0 - 99 + parseTokenOneToThreeDigits = /\d{1,3}/, // 0 - 999 + parseTokenOneToFourDigits = /\d{1,4}/, // 0 - 9999 + parseTokenOneToSixDigits = /[+\-]?\d{1,6}/, // -999,999 - 999,999 + parseTokenDigits = /\d+/, // nonzero number of digits + parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i, // any word (or two) characters or numbers including two/three word month in arabic. + parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z + parseTokenT = /T/i, // T (ISO separator) + parseTokenOffsetMs = /[\+\-]?\d+/, // 1234567890123 + parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123 + + //strict parsing regexes + parseTokenOneDigit = /\d/, // 0 - 9 + parseTokenTwoDigits = /\d\d/, // 00 - 99 + parseTokenThreeDigits = /\d{3}/, // 000 - 999 + parseTokenFourDigits = /\d{4}/, // 0000 - 9999 + parseTokenSixDigits = /[+-]?\d{6}/, // -999,999 - 999,999 + parseTokenSignedNumber = /[+-]?\d+/, // -inf - inf + + // iso 8601 regex + // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) + isoRegex = /^\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)?)?$/, + + isoFormat = 'YYYY-MM-DDTHH:mm:ssZ', + + isoDates = [ + ['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}/] + ], + + // iso time formats and regexes + isoTimes = [ + ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d+/], + ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/], + ['HH:mm', /(T| )\d\d:\d\d/], + ['HH', /(T| )\d\d/] + ], + + // timezone chunker '+10:00' > ['10', '00'] or '-1530' > ['-', '15', '30'] + parseTimezoneChunker = /([\+\-]|\d\d)/gi, + + // getter and setter names + proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'), + unitMillisecondFactors = { + 'Milliseconds' : 1, + 'Seconds' : 1e3, + 'Minutes' : 6e4, + 'Hours' : 36e5, + 'Days' : 864e5, + 'Months' : 2592e6, + 'Years' : 31536e6 + }, + + unitAliases = { + ms : 'millisecond', + s : 'second', + m : 'minute', + h : 'hour', + d : 'day', + D : 'date', + w : 'week', + W : 'isoWeek', + M : 'month', + Q : 'quarter', + y : 'year', + DDD : 'dayOfYear', + e : 'weekday', + E : 'isoWeekday', + gg: 'weekYear', + GG: 'isoWeekYear' + }, + + camelFunctions = { + dayofyear : 'dayOfYear', + isoweekday : 'isoWeekday', + isoweek : 'isoWeek', + weekyear : 'weekYear', + isoweekyear : 'isoWeekYear' + }, + + // format function strings + formatFunctions = {}, + + // default relative time thresholds + relativeTimeThresholds = { + s: 45, // seconds to minute + m: 45, // minutes to hour + h: 22, // hours to day + d: 26, // days to month + M: 11 // months to year + }, + + // tokens to ordinalize and pad + ordinalizeTokens = 'DDD w W M D d'.split(' '), + paddedTokens = 'M D H h m s w W'.split(' '), + + formatTokenFunctions = { + M : function () { + return this.month() + 1; + }, + MMM : function (format) { + return this.localeData().monthsShort(this, format); + }, + MMMM : function (format) { + return this.localeData().months(this, format); + }, + D : function () { + return this.date(); + }, + DDD : function () { + return this.dayOfYear(); + }, + d : function () { + return this.day(); + }, + dd : function (format) { + return this.localeData().weekdaysMin(this, format); + }, + ddd : function (format) { + return this.localeData().weekdaysShort(this, format); + }, + dddd : function (format) { + return this.localeData().weekdays(this, format); + }, + w : function () { + return this.week(); + }, + W : function () { + return this.isoWeek(); + }, + YY : function () { + return leftZeroFill(this.year() % 100, 2); + }, + YYYY : function () { + return leftZeroFill(this.year(), 4); + }, + YYYYY : function () { + return leftZeroFill(this.year(), 5); + }, + YYYYYY : function () { + var y = this.year(), sign = y >= 0 ? '+' : '-'; + return sign + leftZeroFill(Math.abs(y), 6); + }, + gg : function () { + return leftZeroFill(this.weekYear() % 100, 2); + }, + gggg : function () { + return leftZeroFill(this.weekYear(), 4); + }, + ggggg : function () { + return leftZeroFill(this.weekYear(), 5); + }, + GG : function () { + return leftZeroFill(this.isoWeekYear() % 100, 2); + }, + GGGG : function () { + return leftZeroFill(this.isoWeekYear(), 4); + }, + GGGGG : function () { + return leftZeroFill(this.isoWeekYear(), 5); + }, + e : function () { + return this.weekday(); + }, + E : function () { + return this.isoWeekday(); + }, + a : function () { + return this.localeData().meridiem(this.hours(), this.minutes(), true); + }, + A : function () { + return this.localeData().meridiem(this.hours(), this.minutes(), false); + }, + 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 toInt(this.milliseconds() / 100); + }, + SS : function () { + return leftZeroFill(toInt(this.milliseconds() / 10), 2); + }, + SSS : function () { + return leftZeroFill(this.milliseconds(), 3); + }, + SSSS : function () { + return leftZeroFill(this.milliseconds(), 3); + }, + Z : function () { + var a = this.utcOffset(), + b = '+'; + if (a < 0) { + a = -a; + b = '-'; + } + return b + leftZeroFill(toInt(a / 60), 2) + ':' + leftZeroFill(toInt(a) % 60, 2); + }, + ZZ : function () { + var a = this.utcOffset(), + b = '+'; + if (a < 0) { + a = -a; + b = '-'; + } + return b + leftZeroFill(toInt(a / 60), 2) + leftZeroFill(toInt(a) % 60, 2); + }, + z : function () { + return this.zoneAbbr(); + }, + zz : function () { + return this.zoneName(); + }, + x : function () { + return this.valueOf(); + }, + X : function () { + return this.unix(); + }, + Q : function () { + return this.quarter(); + } + }, + + deprecations = {}, + + lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin'], + + updateInProgress = false; + + // Pick the first defined of two or three arguments. dfl comes from + // default. + function dfl(a, b, c) { + switch (arguments.length) { + case 2: return a != null ? a : b; + case 3: return a != null ? a : b != null ? b : c; + default: throw new Error('Implement me'); + } + } + + function hasOwnProp(a, b) { + return hasOwnProperty.call(a, b); + } + + function defaultParsingFlags() { + // We need to deep clone this object, and es5 standard is not very + // helpful. + return { + empty : false, + unusedTokens : [], + unusedInput : [], + overflow : -2, + charsLeftOver : 0, + nullInput : false, + invalidMonth : null, + invalidFormat : false, + userInvalidated : false, + iso: false + }; + } + + function printMsg(msg) { + if (moment.suppressDeprecationWarnings === false && + typeof console !== 'undefined' && console.warn) { + console.warn('Deprecation warning: ' + msg); + } + } + + function deprecate(msg, fn) { + var firstTime = true; + return extend(function () { + if (firstTime) { + printMsg(msg); + firstTime = false; + } + return fn.apply(this, arguments); + }, fn); + } + + function deprecateSimple(name, msg) { + if (!deprecations[name]) { + printMsg(msg); + deprecations[name] = true; + } + } + + function padToken(func, count) { + return function (a) { + return leftZeroFill(func.call(this, a), count); + }; + } + function ordinalizeToken(func, period) { + return function (a) { + return this.localeData().ordinal(func.call(this, a), period); + }; + } + + function monthDiff(a, b) { + // difference in months + var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), + // b is in (anchor - 1 month, anchor + 1 month) + anchor = a.clone().add(wholeMonthDiff, 'months'), + anchor2, adjust; + + if (b - anchor < 0) { + anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor - anchor2); + } else { + anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor2 - anchor); + } + + return -(wholeMonthDiff + adjust); + } + + while (ordinalizeTokens.length) { + i = ordinalizeTokens.pop(); + formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i); + } + while (paddedTokens.length) { + i = paddedTokens.pop(); + formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2); + } + formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3); + + + function meridiemFixWrap(locale, hour, meridiem) { + var isPm; + + if (meridiem == null) { + // nothing to do + return hour; + } + if (locale.meridiemHour != null) { + return locale.meridiemHour(hour, meridiem); + } else if (locale.isPM != null) { + // Fallback + isPm = locale.isPM(meridiem); + if (isPm && hour < 12) { + hour += 12; + } + if (!isPm && hour === 12) { + hour = 0; + } + return hour; + } else { + // thie is not supposed to happen + return hour; + } + } + + /************************************ + Constructors + ************************************/ + + function Locale() { + } + + // Moment prototype object + function Moment(config, skipOverflow) { + if (skipOverflow !== false) { + checkOverflow(config); + } + copyConfig(this, config); + this._d = new Date(+config._d); + // Prevent infinite loop in case updateOffset creates new moment + // objects. + if (updateInProgress === false) { + updateInProgress = true; + moment.updateOffset(this); + updateInProgress = false; + } + } + + // Duration Constructor + function Duration(duration) { + var normalizedInput = normalizeObjectUnits(duration), + years = normalizedInput.year || 0, + quarters = normalizedInput.quarter || 0, + months = normalizedInput.month || 0, + weeks = normalizedInput.week || 0, + days = normalizedInput.day || 0, + hours = normalizedInput.hour || 0, + minutes = normalizedInput.minute || 0, + seconds = normalizedInput.second || 0, + milliseconds = normalizedInput.millisecond || 0; + + // representation for dateAddRemove + this._milliseconds = +milliseconds + + seconds * 1e3 + // 1000 + minutes * 6e4 + // 1000 * 60 + hours * 36e5; // 1000 * 60 * 60 + // Because of dateAddRemove treats 24 hours as different from a + // day when working around DST, we need to store them separately + this._days = +days + + weeks * 7; + // It is impossible translate months into days without knowing + // which months you are are talking about, so we have to store + // it separately. + this._months = +months + + quarters * 3 + + years * 12; + + this._data = {}; + + this._locale = moment.localeData(); + + this._bubble(); + } + + /************************************ + Helpers + ************************************/ + + + function extend(a, b) { + for (var i in b) { + if (hasOwnProp(b, i)) { + a[i] = b[i]; + } + } + + if (hasOwnProp(b, 'toString')) { + a.toString = b.toString; + } + + if (hasOwnProp(b, 'valueOf')) { + a.valueOf = b.valueOf; + } + + return a; + } + + function copyConfig(to, from) { + var i, prop, val; + + if (typeof from._isAMomentObject !== 'undefined') { + to._isAMomentObject = from._isAMomentObject; + } + if (typeof from._i !== 'undefined') { + to._i = from._i; + } + if (typeof from._f !== 'undefined') { + to._f = from._f; + } + if (typeof from._l !== 'undefined') { + to._l = from._l; + } + if (typeof from._strict !== 'undefined') { + to._strict = from._strict; + } + if (typeof from._tzm !== 'undefined') { + to._tzm = from._tzm; + } + if (typeof from._isUTC !== 'undefined') { + to._isUTC = from._isUTC; + } + if (typeof from._offset !== 'undefined') { + to._offset = from._offset; + } + if (typeof from._pf !== 'undefined') { + to._pf = from._pf; + } + if (typeof from._locale !== 'undefined') { + to._locale = from._locale; + } + + if (momentProperties.length > 0) { + for (i in momentProperties) { + prop = momentProperties[i]; + val = from[prop]; + if (typeof val !== 'undefined') { + to[prop] = val; + } + } + } + + return to; + } + + function absRound(number) { + if (number < 0) { + return Math.ceil(number); + } else { + return Math.floor(number); + } + } + + // left zero fill a number + // see http://jsperf.com/left-zero-filling for performance comparison + function leftZeroFill(number, targetLength, forceSign) { + var output = '' + Math.abs(number), + sign = number >= 0; + + while (output.length < targetLength) { + output = '0' + output; + } + return (sign ? (forceSign ? '+' : '') : '-') + output; + } + + function positiveMomentsDifference(base, other) { + var res = {milliseconds: 0, months: 0}; + + res.months = other.month() - base.month() + + (other.year() - base.year()) * 12; + if (base.clone().add(res.months, 'M').isAfter(other)) { + --res.months; + } + + res.milliseconds = +other - +(base.clone().add(res.months, 'M')); + + return res; + } + + function momentsDifference(base, other) { + var res; + other = makeAs(other, base); + if (base.isBefore(other)) { + res = positiveMomentsDifference(base, other); + } else { + res = positiveMomentsDifference(other, base); + res.milliseconds = -res.milliseconds; + res.months = -res.months; + } + + return res; + } + + // TODO: remove 'name' arg after deprecation is removed + function createAdder(direction, name) { + return function (val, period) { + var dur, tmp; + //invert the arguments, but complain about it + if (period !== null && !isNaN(+period)) { + deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period).'); + tmp = val; val = period; period = tmp; + } + + val = typeof val === 'string' ? +val : val; + dur = moment.duration(val, period); + addOrSubtractDurationFromMoment(this, dur, direction); + return this; + }; + } + + function addOrSubtractDurationFromMoment(mom, duration, isAdding, updateOffset) { + var milliseconds = duration._milliseconds, + days = duration._days, + months = duration._months; + updateOffset = updateOffset == null ? true : updateOffset; + + if (milliseconds) { + mom._d.setTime(+mom._d + milliseconds * isAdding); + } + if (days) { + rawSetter(mom, 'Date', rawGetter(mom, 'Date') + days * isAdding); + } + if (months) { + rawMonthSetter(mom, rawGetter(mom, 'Month') + months * isAdding); + } + if (updateOffset) { + moment.updateOffset(mom, days || months); + } + } + + // check if is an array + function isArray(input) { + return Object.prototype.toString.call(input) === '[object Array]'; + } + + function isDate(input) { + return Object.prototype.toString.call(input) === '[object Date]' || + input instanceof Date; + } + + // compare two arrays, return the number of differences + function compareArrays(array1, array2, dontConvert) { + var len = Math.min(array1.length, array2.length), + lengthDiff = Math.abs(array1.length - array2.length), + diffs = 0, + i; + for (i = 0; i < len; i++) { + if ((dontConvert && array1[i] !== array2[i]) || + (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { + diffs++; + } + } + return diffs + lengthDiff; + } + + function normalizeUnits(units) { + if (units) { + var lowered = units.toLowerCase().replace(/(.)s$/, '$1'); + units = unitAliases[units] || camelFunctions[lowered] || lowered; + } + return units; + } + + function normalizeObjectUnits(inputObject) { + var normalizedInput = {}, + normalizedProp, + prop; + + for (prop in inputObject) { + if (hasOwnProp(inputObject, prop)) { + normalizedProp = normalizeUnits(prop); + if (normalizedProp) { + normalizedInput[normalizedProp] = inputObject[prop]; + } + } + } + + return normalizedInput; + } + + function makeList(field) { + var count, setter; + + if (field.indexOf('week') === 0) { + count = 7; + setter = 'day'; + } + else if (field.indexOf('month') === 0) { + count = 12; + setter = 'month'; + } + else { + return; + } + + moment[field] = function (format, index) { + var i, getter, + method = moment._locale[field], + results = []; + + if (typeof format === 'number') { + index = format; + format = undefined; + } + + getter = function (i) { + var m = moment().utc().set(setter, i); + return method.call(moment._locale, m, format || ''); + }; + + if (index != null) { + return getter(index); + } + else { + for (i = 0; i < count; i++) { + results.push(getter(i)); + } + return results; + } + }; + } + + function toInt(argumentForCoercion) { + var coercedNumber = +argumentForCoercion, + value = 0; + + if (coercedNumber !== 0 && isFinite(coercedNumber)) { + if (coercedNumber >= 0) { + value = Math.floor(coercedNumber); + } else { + value = Math.ceil(coercedNumber); + } + } + + return value; + } + + function daysInMonth(year, month) { + return new Date(Date.UTC(year, month + 1, 0)).getUTCDate(); + } + + function weeksInYear(year, dow, doy) { + return weekOfYear(moment([year, 11, 31 + dow - doy]), dow, doy).week; + } + + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; + } + + function isLeapYear(year) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; + } + + function checkOverflow(m) { + var overflow; + if (m._a && m._pf.overflow === -2) { + overflow = + m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH : + m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE : + m._a[HOUR] < 0 || m._a[HOUR] > 24 || + (m._a[HOUR] === 24 && (m._a[MINUTE] !== 0 || + m._a[SECOND] !== 0 || + m._a[MILLISECOND] !== 0)) ? HOUR : + m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE : + m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND : + m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND : + -1; + + if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { + overflow = DATE; + } + + m._pf.overflow = overflow; + } + } + + function isValid(m) { + if (m._isValid == null) { + m._isValid = !isNaN(m._d.getTime()) && + m._pf.overflow < 0 && + !m._pf.empty && + !m._pf.invalidMonth && + !m._pf.nullInput && + !m._pf.invalidFormat && + !m._pf.userInvalidated; + + if (m._strict) { + m._isValid = m._isValid && + m._pf.charsLeftOver === 0 && + m._pf.unusedTokens.length === 0 && + m._pf.bigHour === undefined; + } + } + return m._isValid; + } + + function normalizeLocale(key) { + return key ? key.toLowerCase().replace('_', '-') : key; + } + + // pick the locale from the array + // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each + // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root + function chooseLocale(names) { + var i = 0, j, next, locale, split; + + while (i < names.length) { + split = normalizeLocale(names[i]).split('-'); + j = split.length; + next = normalizeLocale(names[i + 1]); + next = next ? next.split('-') : null; + while (j > 0) { + locale = loadLocale(split.slice(0, j).join('-')); + if (locale) { + return locale; + } + if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { + //the next array item is better than a shallower substring of this one + break; + } + j--; + } + i++; + } + return null; + } + + function loadLocale(name) { + var oldLocale = null; + if (!locales[name] && hasModule) { + try { + oldLocale = moment.locale(); + require('./locale/' + name); + // because defineLocale currently also sets the global locale, we want to undo that for lazy loaded locales + moment.locale(oldLocale); + } catch (e) { } + } + return locales[name]; + } + + // Return a moment from input, that is local/utc/utcOffset equivalent to + // model. + function makeAs(input, model) { + var res, diff; + if (model._isUTC) { + res = model.clone(); + diff = (moment.isMoment(input) || isDate(input) ? + +input : +moment(input)) - (+res); + // Use low-level api, because this fn is low-level api. + res._d.setTime(+res._d + diff); + moment.updateOffset(res, false); + return res; + } else { + return moment(input).local(); + } + } + + /************************************ + Locale + ************************************/ + + + extend(Locale.prototype, { + + set : function (config) { + var prop, i; + for (i in config) { + prop = config[i]; + if (typeof prop === 'function') { + this[i] = prop; + } else { + this['_' + i] = prop; + } + } + // Lenient ordinal parsing accepts just a number in addition to + // number + (possibly) stuff coming from _ordinalParseLenient. + this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + /\d{1,2}/.source); + }, + + _months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + months : function (m) { + return this._months[m.month()]; + }, + + _monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + monthsShort : function (m) { + return this._monthsShort[m.month()]; + }, + + monthsParse : function (monthName, format, strict) { + var i, mom, regex; + + if (!this._monthsParse) { + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + } + + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = moment.utc([2000, i]); + if (strict && !this._longMonthsParse[i]) { + this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); + this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); + } + if (!strict && !this._monthsParse[i]) { + regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); + this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { + return i; + } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { + return i; + } else if (!strict && this._monthsParse[i].test(monthName)) { + return i; + } + } + }, + + _weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdays : function (m) { + return this._weekdays[m.day()]; + }, + + _weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysShort : function (m) { + return this._weekdaysShort[m.day()]; + }, + + _weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + weekdaysMin : function (m) { + return this._weekdaysMin[m.day()]; + }, + + weekdaysParse : function (weekdayName) { + var i, mom, regex; + + if (!this._weekdaysParse) { + this._weekdaysParse = []; + } + + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + if (!this._weekdaysParse[i]) { + mom = moment([2000, 1]).day(i); + regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); + this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (this._weekdaysParse[i].test(weekdayName)) { + return i; + } + } + }, + + _longDateFormat : { + LTS : 'h:mm:ss A', + 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 (key) { + var output = this._longDateFormat[key]; + if (!output && this._longDateFormat[key.toUpperCase()]) { + output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) { + return val.slice(1); + }); + this._longDateFormat[key] = output; + } + return output; + }, + + isPM : function (input) { + // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays + // Using charAt should be more compatible. + return ((input + '').toLowerCase().charAt(0) === 'p'); + }, + + _meridiemParse : /[ap]\.?m?\.?/i, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'pm' : 'PM'; + } else { + return isLower ? '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 (key, mom, now) { + var output = this._calendar[key]; + return typeof output === 'function' ? output.apply(mom, [now]) : output; + }, + + _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 (number, withoutSuffix, string, isFuture) { + var output = this._relativeTime[string]; + return (typeof output === 'function') ? + output(number, withoutSuffix, string, isFuture) : + output.replace(/%d/i, number); + }, + + pastFuture : function (diff, output) { + var format = this._relativeTime[diff > 0 ? 'future' : 'past']; + return typeof format === 'function' ? format(output) : format.replace(/%s/i, output); + }, + + ordinal : function (number) { + return this._ordinal.replace('%d', number); + }, + _ordinal : '%d', + _ordinalParse : /\d{1,2}/, + + preparse : function (string) { + return string; + }, + + postformat : function (string) { + return string; + }, + + week : function (mom) { + return weekOfYear(mom, this._week.dow, this._week.doy).week; + }, + + _week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + }, + + firstDayOfWeek : function () { + return this._week.dow; + }, + + firstDayOfYear : function () { + return this._week.doy; + }, + + _invalidDate: 'Invalid date', + invalidDate: function () { + return this._invalidDate; + } + }); + + /************************************ + Formatting + ************************************/ + + + function removeFormattingTokens(input) { + if (input.match(/\[[\s\S]/)) { + return input.replace(/^\[|\]$/g, ''); + } + return input.replace(/\\/g, ''); + } + + function makeFormatFunction(format) { + var array = format.match(formattingTokens), i, length; + + for (i = 0, length = array.length; i < length; i++) { + if (formatTokenFunctions[array[i]]) { + array[i] = formatTokenFunctions[array[i]]; + } else { + array[i] = removeFormattingTokens(array[i]); + } + } + + return function (mom) { + var output = ''; + for (i = 0; i < length; i++) { + output += array[i] instanceof Function ? array[i].call(mom, format) : array[i]; + } + return output; + }; + } + + // format date using native date object + function formatMoment(m, format) { + if (!m.isValid()) { + return m.localeData().invalidDate(); + } + + format = expandFormat(format, m.localeData()); + + if (!formatFunctions[format]) { + formatFunctions[format] = makeFormatFunction(format); + } + + return formatFunctions[format](m); + } + + function expandFormat(format, locale) { + var i = 5; + + function replaceLongDateFormatTokens(input) { + return locale.longDateFormat(input) || input; + } + + localFormattingTokens.lastIndex = 0; + while (i >= 0 && localFormattingTokens.test(format)) { + format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); + localFormattingTokens.lastIndex = 0; + i -= 1; + } + + return format; + } + + + /************************************ + Parsing + ************************************/ + + + // get the regex to find the next token + function getParseRegexForToken(token, config) { + var a, strict = config._strict; + switch (token) { + case 'Q': + return parseTokenOneDigit; + case 'DDDD': + return parseTokenThreeDigits; + case 'YYYY': + case 'GGGG': + case 'gggg': + return strict ? parseTokenFourDigits : parseTokenOneToFourDigits; + case 'Y': + case 'G': + case 'g': + return parseTokenSignedNumber; + case 'YYYYYY': + case 'YYYYY': + case 'GGGGG': + case 'ggggg': + return strict ? parseTokenSixDigits : parseTokenOneToSixDigits; + case 'S': + if (strict) { + return parseTokenOneDigit; + } + /* falls through */ + case 'SS': + if (strict) { + return parseTokenTwoDigits; + } + /* falls through */ + case 'SSS': + if (strict) { + return parseTokenThreeDigits; + } + /* falls through */ + case 'DDD': + return parseTokenOneToThreeDigits; + case 'MMM': + case 'MMMM': + case 'dd': + case 'ddd': + case 'dddd': + return parseTokenWord; + case 'a': + case 'A': + return config._locale._meridiemParse; + case 'x': + return parseTokenOffsetMs; + case 'X': + return parseTokenTimestampMs; + case 'Z': + case 'ZZ': + return parseTokenTimezone; + case 'T': + return parseTokenT; + case 'SSSS': + return parseTokenDigits; + case 'MM': + case 'DD': + case 'YY': + case 'GG': + case 'gg': + case 'HH': + case 'hh': + case 'mm': + case 'ss': + case 'ww': + case 'WW': + return strict ? parseTokenTwoDigits : parseTokenOneOrTwoDigits; + case 'M': + case 'D': + case 'd': + case 'H': + case 'h': + case 'm': + case 's': + case 'w': + case 'W': + case 'e': + case 'E': + return parseTokenOneOrTwoDigits; + case 'Do': + return strict ? config._locale._ordinalParse : config._locale._ordinalParseLenient; + default : + a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), 'i')); + return a; + } + } + + function utcOffsetFromString(string) { + string = string || ''; + var possibleTzMatches = (string.match(parseTokenTimezone) || []), + tzChunk = possibleTzMatches[possibleTzMatches.length - 1] || [], + parts = (tzChunk + '').match(parseTimezoneChunker) || ['-', 0, 0], + minutes = +(parts[1] * 60) + toInt(parts[2]); + + return parts[0] === '+' ? minutes : -minutes; + } + + // function to convert string input to date + function addTimeToArrayFromToken(token, input, config) { + var a, datePartArray = config._a; + + switch (token) { + // QUARTER + case 'Q': + if (input != null) { + datePartArray[MONTH] = (toInt(input) - 1) * 3; + } + break; + // MONTH + case 'M' : // fall through to MM + case 'MM' : + if (input != null) { + datePartArray[MONTH] = toInt(input) - 1; + } + break; + case 'MMM' : // fall through to MMMM + case 'MMMM' : + a = config._locale.monthsParse(input, token, config._strict); + // if we didn't find a month name, mark the date as invalid. + if (a != null) { + datePartArray[MONTH] = a; + } else { + config._pf.invalidMonth = input; + } + break; + // DAY OF MONTH + case 'D' : // fall through to DD + case 'DD' : + if (input != null) { + datePartArray[DATE] = toInt(input); + } + break; + case 'Do' : + if (input != null) { + datePartArray[DATE] = toInt(parseInt( + input.match(/\d{1,2}/)[0], 10)); + } + break; + // DAY OF YEAR + case 'DDD' : // fall through to DDDD + case 'DDDD' : + if (input != null) { + config._dayOfYear = toInt(input); + } + + break; + // YEAR + case 'YY' : + datePartArray[YEAR] = moment.parseTwoDigitYear(input); + break; + case 'YYYY' : + case 'YYYYY' : + case 'YYYYYY' : + datePartArray[YEAR] = toInt(input); + break; + // AM / PM + case 'a' : // fall through to A + case 'A' : + config._meridiem = input; + // config._isPm = config._locale.isPM(input); + break; + // HOUR + case 'h' : // fall through to hh + case 'hh' : + config._pf.bigHour = true; + /* falls through */ + case 'H' : // fall through to HH + case 'HH' : + datePartArray[HOUR] = toInt(input); + break; + // MINUTE + case 'm' : // fall through to mm + case 'mm' : + datePartArray[MINUTE] = toInt(input); + break; + // SECOND + case 's' : // fall through to ss + case 'ss' : + datePartArray[SECOND] = toInt(input); + break; + // MILLISECOND + case 'S' : + case 'SS' : + case 'SSS' : + case 'SSSS' : + datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000); + break; + // UNIX OFFSET (MILLISECONDS) + case 'x': + config._d = new Date(toInt(input)); + break; + // UNIX TIMESTAMP WITH MS + case 'X': + config._d = new Date(parseFloat(input) * 1000); + break; + // TIMEZONE + case 'Z' : // fall through to ZZ + case 'ZZ' : + config._useUTC = true; + config._tzm = utcOffsetFromString(input); + break; + // WEEKDAY - human + case 'dd': + case 'ddd': + case 'dddd': + a = config._locale.weekdaysParse(input); + // if we didn't get a weekday name, mark the date as invalid + if (a != null) { + config._w = config._w || {}; + config._w['d'] = a; + } else { + config._pf.invalidWeekday = input; + } + break; + // WEEK, WEEK DAY - numeric + case 'w': + case 'ww': + case 'W': + case 'WW': + case 'd': + case 'e': + case 'E': + token = token.substr(0, 1); + /* falls through */ + case 'gggg': + case 'GGGG': + case 'GGGGG': + token = token.substr(0, 2); + if (input) { + config._w = config._w || {}; + config._w[token] = toInt(input); + } + break; + case 'gg': + case 'GG': + config._w = config._w || {}; + config._w[token] = moment.parseTwoDigitYear(input); + } + } + + function dayOfYearFromWeekInfo(config) { + var w, weekYear, week, weekday, dow, doy, temp; + + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + dow = 1; + doy = 4; + + // TODO: We need to take the current isoWeekYear, but that depends on + // how we interpret now (local, utc, fixed offset). So create + // a now version of current config (take local/utc/offset flags, and + // create now). + weekYear = dfl(w.GG, config._a[YEAR], weekOfYear(moment(), 1, 4).year); + week = dfl(w.W, 1); + weekday = dfl(w.E, 1); + } else { + dow = config._locale._week.dow; + doy = config._locale._week.doy; + + weekYear = dfl(w.gg, config._a[YEAR], weekOfYear(moment(), dow, doy).year); + week = dfl(w.w, 1); + + if (w.d != null) { + // weekday -- low day numbers are considered next week + weekday = w.d; + if (weekday < dow) { + ++week; + } + } else if (w.e != null) { + // local weekday -- counting starts from begining of week + weekday = w.e + dow; + } else { + // default to begining of week + weekday = dow; + } + } + temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow); + + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } + + // convert an array to a date. + // the array should mirror the parameters below + // note: all values past the year are optional and will default to the lowest possible value. + // [year, month, day , hour, minute, second, millisecond] + function dateFromConfig(config) { + var i, date, input = [], currentDate, yearToUse; + + if (config._d) { + return; + } + + currentDate = currentDateArray(config); + + //compute day of the year from weeks and weekdays + if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { + dayOfYearFromWeekInfo(config); + } + + //if the day of the year is set, figure out what it is + if (config._dayOfYear) { + yearToUse = dfl(config._a[YEAR], currentDate[YEAR]); + + if (config._dayOfYear > daysInYear(yearToUse)) { + config._pf._overflowDayOfYear = true; + } + + date = makeUTCDate(yearToUse, 0, config._dayOfYear); + config._a[MONTH] = date.getUTCMonth(); + config._a[DATE] = date.getUTCDate(); + } + + // Default to current date. + // * if no year, month, day of month are given, default to today + // * if day of month is given, default month and year + // * if month is given, default only year + // * if year is given, don't default anything + for (i = 0; i < 3 && config._a[i] == null; ++i) { + config._a[i] = input[i] = currentDate[i]; + } + + // Zero out whatever was not defaulted, including time + for (; i < 7; i++) { + config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; + } + + // Check for 24:00:00.000 + if (config._a[HOUR] === 24 && + config._a[MINUTE] === 0 && + config._a[SECOND] === 0 && + config._a[MILLISECOND] === 0) { + config._nextDay = true; + config._a[HOUR] = 0; + } + + config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input); + // Apply timezone offset from input. The actual utcOffset can be changed + // with parseZone. + if (config._tzm != null) { + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); + } + + if (config._nextDay) { + config._a[HOUR] = 24; + } + } + + function dateFromObject(config) { + var normalizedInput; + + if (config._d) { + return; + } + + normalizedInput = normalizeObjectUnits(config._i); + config._a = [ + normalizedInput.year, + normalizedInput.month, + normalizedInput.day || normalizedInput.date, + normalizedInput.hour, + normalizedInput.minute, + normalizedInput.second, + normalizedInput.millisecond + ]; + + dateFromConfig(config); + } + + function currentDateArray(config) { + var now = new Date(); + if (config._useUTC) { + return [ + now.getUTCFullYear(), + now.getUTCMonth(), + now.getUTCDate() + ]; + } else { + return [now.getFullYear(), now.getMonth(), now.getDate()]; + } + } + + // date from string and format string + function makeDateFromStringAndFormat(config) { + if (config._f === moment.ISO_8601) { + parseISO(config); + return; + } + + config._a = []; + config._pf.empty = true; + + // This array is used to make a Date, either with `new Date` or `Date.UTC` + var string = '' + config._i, + i, parsedInput, tokens, token, skipped, + stringLength = string.length, + totalParsedInputLength = 0; + + tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; + + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; + if (parsedInput) { + skipped = string.substr(0, string.indexOf(parsedInput)); + if (skipped.length > 0) { + config._pf.unusedInput.push(skipped); + } + string = string.slice(string.indexOf(parsedInput) + parsedInput.length); + totalParsedInputLength += parsedInput.length; + } + // don't parse if it's not a known token + if (formatTokenFunctions[token]) { + if (parsedInput) { + config._pf.empty = false; + } + else { + config._pf.unusedTokens.push(token); + } + addTimeToArrayFromToken(token, parsedInput, config); + } + else if (config._strict && !parsedInput) { + config._pf.unusedTokens.push(token); + } + } + + // add remaining unparsed input length to the string + config._pf.charsLeftOver = stringLength - totalParsedInputLength; + if (string.length > 0) { + config._pf.unusedInput.push(string); + } + + // clear _12h flag if hour is <= 12 + if (config._pf.bigHour === true && config._a[HOUR] <= 12) { + config._pf.bigHour = undefined; + } + // handle meridiem + config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], + config._meridiem); + dateFromConfig(config); + checkOverflow(config); + } + + function unescapeFormat(s) { + return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { + return p1 || p2 || p3 || p4; + }); + } + + // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript + function regexpEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + } + + // date from string and array of format strings + function makeDateFromStringAndArray(config) { + var tempConfig, + bestMoment, + + scoreToBeat, + i, + currentScore; + + if (config._f.length === 0) { + config._pf.invalidFormat = true; + config._d = new Date(NaN); + return; + } + + for (i = 0; i < config._f.length; i++) { + currentScore = 0; + tempConfig = copyConfig({}, config); + if (config._useUTC != null) { + tempConfig._useUTC = config._useUTC; + } + tempConfig._pf = defaultParsingFlags(); + tempConfig._f = config._f[i]; + makeDateFromStringAndFormat(tempConfig); + + if (!isValid(tempConfig)) { + continue; + } + + // if there is any input that was not parsed add a penalty for that format + currentScore += tempConfig._pf.charsLeftOver; + + //or tokens + currentScore += tempConfig._pf.unusedTokens.length * 10; + + tempConfig._pf.score = currentScore; + + if (scoreToBeat == null || currentScore < scoreToBeat) { + scoreToBeat = currentScore; + bestMoment = tempConfig; + } + } + + extend(config, bestMoment || tempConfig); + } + + // date from iso format + function parseISO(config) { + var i, l, + string = config._i, + match = isoRegex.exec(string); + + if (match) { + config._pf.iso = true; + for (i = 0, l = isoDates.length; i < l; i++) { + if (isoDates[i][1].exec(string)) { + // match[5] should be 'T' or undefined + config._f = isoDates[i][0] + (match[6] || ' '); + break; + } + } + for (i = 0, l = isoTimes.length; i < l; i++) { + if (isoTimes[i][1].exec(string)) { + config._f += isoTimes[i][0]; + break; + } + } + if (string.match(parseTokenTimezone)) { + config._f += 'Z'; + } + makeDateFromStringAndFormat(config); + } else { + config._isValid = false; + } + } + + // date from iso format or fallback + function makeDateFromString(config) { + parseISO(config); + if (config._isValid === false) { + delete config._isValid; + moment.createFromInputFallback(config); + } + } + + function map(arr, fn) { + var res = [], i; + for (i = 0; i < arr.length; ++i) { + res.push(fn(arr[i], i)); + } + return res; + } + + function makeDateFromInput(config) { + var input = config._i, matched; + if (input === undefined) { + config._d = new Date(); + } else if (isDate(input)) { + config._d = new Date(+input); + } else if ((matched = aspNetJsonRegex.exec(input)) !== null) { + config._d = new Date(+matched[1]); + } else if (typeof input === 'string') { + makeDateFromString(config); + } else if (isArray(input)) { + config._a = map(input.slice(0), function (obj) { + return parseInt(obj, 10); + }); + dateFromConfig(config); + } else if (typeof(input) === 'object') { + dateFromObject(config); + } else if (typeof(input) === 'number') { + // from milliseconds + config._d = new Date(input); + } else { + moment.createFromInputFallback(config); + } + } + + function makeDate(y, m, d, h, M, s, ms) { + //can't just apply() to create a date: + //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply + var date = new Date(y, m, d, h, M, s, ms); + + //the date constructor doesn't accept years < 1970 + if (y < 1970) { + date.setFullYear(y); + } + return date; + } + + function makeUTCDate(y) { + var date = new Date(Date.UTC.apply(null, arguments)); + if (y < 1970) { + date.setUTCFullYear(y); + } + return date; + } + + function parseWeekday(input, locale) { + if (typeof input === 'string') { + if (!isNaN(input)) { + input = parseInt(input, 10); + } + else { + input = locale.weekdaysParse(input); + if (typeof input !== 'number') { + return null; + } + } + } + return input; + } + + /************************************ + Relative Time + ************************************/ + + + // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize + function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { + return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); + } + + function relativeTime(posNegDuration, withoutSuffix, locale) { + var duration = moment.duration(posNegDuration).abs(), + seconds = round(duration.as('s')), + minutes = round(duration.as('m')), + hours = round(duration.as('h')), + days = round(duration.as('d')), + months = round(duration.as('M')), + years = round(duration.as('y')), + + args = seconds < relativeTimeThresholds.s && ['s', seconds] || + minutes === 1 && ['m'] || + minutes < relativeTimeThresholds.m && ['mm', minutes] || + hours === 1 && ['h'] || + hours < relativeTimeThresholds.h && ['hh', hours] || + days === 1 && ['d'] || + days < relativeTimeThresholds.d && ['dd', days] || + months === 1 && ['M'] || + months < relativeTimeThresholds.M && ['MM', months] || + years === 1 && ['y'] || ['yy', years]; + + args[2] = withoutSuffix; + args[3] = +posNegDuration > 0; + args[4] = locale; + return substituteTimeAgo.apply({}, args); + } + + + /************************************ + Week of Year + ************************************/ + + + // firstDayOfWeek 0 = sun, 6 = sat + // the day of the week that starts the week + // (usually sunday or monday) + // firstDayOfWeekOfYear 0 = sun, 6 = sat + // the first week is the week that contains the first + // of this day of the week + // (eg. ISO weeks use thursday (4)) + function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) { + var end = firstDayOfWeekOfYear - firstDayOfWeek, + daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(), + adjustedMoment; + + + if (daysToDayOfWeek > end) { + daysToDayOfWeek -= 7; + } + + if (daysToDayOfWeek < end - 7) { + daysToDayOfWeek += 7; + } + + adjustedMoment = moment(mom).add(daysToDayOfWeek, 'd'); + return { + week: Math.ceil(adjustedMoment.dayOfYear() / 7), + year: adjustedMoment.year() + }; + } + + //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday + function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) { + var d = makeUTCDate(year, 0, 1).getUTCDay(), daysToAdd, dayOfYear; + + d = d === 0 ? 7 : d; + weekday = weekday != null ? weekday : firstDayOfWeek; + daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0); + dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1; + + return { + year: dayOfYear > 0 ? year : year - 1, + dayOfYear: dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear + }; + } + + /************************************ + Top Level Functions + ************************************/ + + function makeMoment(config) { + var input = config._i, + format = config._f, + res; + + config._locale = config._locale || moment.localeData(config._l); + + if (input === null || (format === undefined && input === '')) { + return moment.invalid({nullInput: true}); + } + + if (typeof input === 'string') { + config._i = input = config._locale.preparse(input); + } + + if (moment.isMoment(input)) { + return new Moment(input, true); + } else if (format) { + if (isArray(format)) { + makeDateFromStringAndArray(config); + } else { + makeDateFromStringAndFormat(config); + } + } else { + makeDateFromInput(config); + } + + res = new Moment(config); + if (res._nextDay) { + // Adding is smart enough around DST + res.add(1, 'd'); + res._nextDay = undefined; + } + + return res; + } + + moment = function (input, format, locale, strict) { + var c; + + if (typeof(locale) === 'boolean') { + strict = locale; + locale = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c = {}; + c._isAMomentObject = true; + c._i = input; + c._f = format; + c._l = locale; + c._strict = strict; + c._isUTC = false; + c._pf = defaultParsingFlags(); + + return makeMoment(c); + }; + + moment.suppressDeprecationWarnings = false; + + moment.createFromInputFallback = deprecate( + 'moment construction falls back to js Date. This is ' + + 'discouraged and will be removed in upcoming major ' + + 'release. Please refer to ' + + 'https://github.com/moment/moment/issues/1407 for more info.', + function (config) { + config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); + } + ); + + // Pick a moment m from moments so that m[fn](other) is true for all + // other. This relies on the function fn to be transitive. + // + // moments should either be an array of moment objects or an array, whose + // first element is an array of moment objects. + function pickBy(fn, moments) { + var res, i; + if (moments.length === 1 && isArray(moments[0])) { + moments = moments[0]; + } + if (!moments.length) { + return moment(); + } + res = moments[0]; + for (i = 1; i < moments.length; ++i) { + if (moments[i][fn](res)) { + res = moments[i]; + } + } + return res; + } + + moment.min = function () { + var args = [].slice.call(arguments, 0); + + return pickBy('isBefore', args); + }; + + moment.max = function () { + var args = [].slice.call(arguments, 0); + + return pickBy('isAfter', args); + }; + + // creating with utc + moment.utc = function (input, format, locale, strict) { + var c; + + if (typeof(locale) === 'boolean') { + strict = locale; + locale = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c = {}; + c._isAMomentObject = true; + c._useUTC = true; + c._isUTC = true; + c._l = locale; + c._i = input; + c._f = format; + c._strict = strict; + c._pf = defaultParsingFlags(); + + return makeMoment(c).utc(); + }; + + // creating with unix timestamp (in seconds) + moment.unix = function (input) { + return moment(input * 1000); + }; + + // duration + moment.duration = function (input, key) { + var duration = input, + // matching against regexp is expensive, do it on demand + match = null, + sign, + ret, + parseIso, + diffRes; + + if (moment.isDuration(input)) { + duration = { + ms: input._milliseconds, + d: input._days, + M: input._months + }; + } else if (typeof input === 'number') { + duration = {}; + if (key) { + duration[key] = input; + } else { + duration.milliseconds = input; + } + } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + duration = { + y: 0, + d: toInt(match[DATE]) * sign, + h: toInt(match[HOUR]) * sign, + m: toInt(match[MINUTE]) * sign, + s: toInt(match[SECOND]) * sign, + ms: toInt(match[MILLISECOND]) * sign + }; + } else if (!!(match = isoDurationRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + parseIso = function (inp) { + // We'd normally use ~~inp for this, but unfortunately it also + // converts floats to ints. + // inp may be undefined, so careful calling replace on it. + var res = inp && parseFloat(inp.replace(',', '.')); + // apply sign while we're at it + return (isNaN(res) ? 0 : res) * sign; + }; + duration = { + y: parseIso(match[2]), + M: parseIso(match[3]), + d: parseIso(match[4]), + h: parseIso(match[5]), + m: parseIso(match[6]), + s: parseIso(match[7]), + w: parseIso(match[8]) + }; + } else if (duration == null) {// checks for null or undefined + duration = {}; + } else if (typeof duration === 'object' && + ('from' in duration || 'to' in duration)) { + diffRes = momentsDifference(moment(duration.from), moment(duration.to)); + + duration = {}; + duration.ms = diffRes.milliseconds; + duration.M = diffRes.months; + } + + ret = new Duration(duration); + + if (moment.isDuration(input) && hasOwnProp(input, '_locale')) { + ret._locale = input._locale; + } + + return ret; + }; + + // version number + moment.version = VERSION; + + // default format + moment.defaultFormat = isoFormat; + + // constant that refers to the ISO standard + moment.ISO_8601 = function () {}; + + // Plugins that add properties should also add the key here (null value), + // so we can properly clone ourselves. + moment.momentProperties = momentProperties; + + // This function will be called whenever a moment is mutated. + // It is intended to keep the offset in sync with the timezone. + moment.updateOffset = function () {}; + + // This function allows you to set a threshold for relative time strings + moment.relativeTimeThreshold = function (threshold, limit) { + if (relativeTimeThresholds[threshold] === undefined) { + return false; + } + if (limit === undefined) { + return relativeTimeThresholds[threshold]; + } + relativeTimeThresholds[threshold] = limit; + return true; + }; + + moment.lang = deprecate( + 'moment.lang is deprecated. Use moment.locale instead.', + function (key, value) { + return moment.locale(key, value); + } + ); + + // This function will load locale and then set the global locale. If + // no arguments are passed in, it will simply return the current global + // locale key. + moment.locale = function (key, values) { + var data; + if (key) { + if (typeof(values) !== 'undefined') { + data = moment.defineLocale(key, values); + } + else { + data = moment.localeData(key); + } + + if (data) { + moment.duration._locale = moment._locale = data; + } + } + + return moment._locale._abbr; + }; + + moment.defineLocale = function (name, values) { + if (values !== null) { + values.abbr = name; + if (!locales[name]) { + locales[name] = new Locale(); + } + locales[name].set(values); + + // backwards compat for now: also set the locale + moment.locale(name); + + return locales[name]; + } else { + // useful for testing + delete locales[name]; + return null; + } + }; + + moment.langData = deprecate( + 'moment.langData is deprecated. Use moment.localeData instead.', + function (key) { + return moment.localeData(key); + } + ); + + // returns locale data + moment.localeData = function (key) { + var locale; + + if (key && key._locale && key._locale._abbr) { + key = key._locale._abbr; + } + + if (!key) { + return moment._locale; + } + + if (!isArray(key)) { + //short-circuit everything else + locale = loadLocale(key); + if (locale) { + return locale; + } + key = [key]; + } + + return chooseLocale(key); + }; + + // compare moment object + moment.isMoment = function (obj) { + return obj instanceof Moment || + (obj != null && hasOwnProp(obj, '_isAMomentObject')); + }; + + // for typechecking Duration objects + moment.isDuration = function (obj) { + return obj instanceof Duration; + }; + + for (i = lists.length - 1; i >= 0; --i) { + makeList(lists[i]); + } + + moment.normalizeUnits = function (units) { + return normalizeUnits(units); + }; + + moment.invalid = function (flags) { + var m = moment.utc(NaN); + if (flags != null) { + extend(m._pf, flags); + } + else { + m._pf.userInvalidated = true; + } + + return m; + }; + + moment.parseZone = function () { + return moment.apply(null, arguments).parseZone(); + }; + + moment.parseTwoDigitYear = function (input) { + return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); + }; + + moment.isDate = isDate; + + /************************************ + Moment Prototype + ************************************/ + + + extend(moment.fn = Moment.prototype, { + + clone : function () { + return moment(this); + }, + + valueOf : function () { + return +this._d - ((this._offset || 0) * 60000); + }, + + unix : function () { + return Math.floor(+this / 1000); + }, + + toString : function () { + return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); + }, + + toDate : function () { + return this._offset ? new Date(+this) : this._d; + }, + + toISOString : function () { + var m = moment(this).utc(); + if (0 < m.year() && m.year() <= 9999) { + if ('function' === typeof Date.prototype.toISOString) { + // native implementation is ~50x faster, use it when we can + return this.toDate().toISOString(); + } else { + return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } + } else { + return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } + }, + + toArray : function () { + var m = this; + return [ + m.year(), + m.month(), + m.date(), + m.hours(), + m.minutes(), + m.seconds(), + m.milliseconds() + ]; + }, + + isValid : function () { + return isValid(this); + }, + + isDSTShifted : function () { + if (this._a) { + return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0; + } + + return false; + }, + + parsingFlags : function () { + return extend({}, this._pf); + }, + + invalidAt: function () { + return this._pf.overflow; + }, + + utc : function (keepLocalTime) { + return this.utcOffset(0, keepLocalTime); + }, + + local : function (keepLocalTime) { + if (this._isUTC) { + this.utcOffset(0, keepLocalTime); + this._isUTC = false; + + if (keepLocalTime) { + this.subtract(this._dateUtcOffset(), 'm'); + } + } + return this; + }, + + format : function (inputString) { + var output = formatMoment(this, inputString || moment.defaultFormat); + return this.localeData().postformat(output); + }, + + add : createAdder(1, 'add'), + + subtract : createAdder(-1, 'subtract'), + + diff : function (input, units, asFloat) { + var that = makeAs(input, this), + zoneDiff = (that.utcOffset() - this.utcOffset()) * 6e4, + anchor, diff, output, daysAdjust; + + units = normalizeUnits(units); + + if (units === 'year' || units === 'month' || units === 'quarter') { + output = monthDiff(this, that); + if (units === 'quarter') { + output = output / 3; + } else if (units === 'year') { + output = output / 12; + } + } else { + diff = this - that; + output = units === 'second' ? diff / 1e3 : // 1000 + units === 'minute' ? diff / 6e4 : // 1000 * 60 + units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60 + units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst + units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst + diff; + } + return asFloat ? output : absRound(output); + }, + + from : function (time, withoutSuffix) { + return moment.duration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); + }, + + fromNow : function (withoutSuffix) { + return this.from(moment(), withoutSuffix); + }, + + calendar : function (time) { + // We want to compare the start of today, vs this. + // Getting start-of-today depends on whether we're locat/utc/offset + // or not. + var now = time || moment(), + sod = makeAs(now, this).startOf('day'), + diff = this.diff(sod, 'days', true), + format = diff < -6 ? 'sameElse' : + diff < -1 ? 'lastWeek' : + diff < 0 ? 'lastDay' : + diff < 1 ? 'sameDay' : + diff < 2 ? 'nextDay' : + diff < 7 ? 'nextWeek' : 'sameElse'; + return this.format(this.localeData().calendar(format, this, moment(now))); + }, + + isLeapYear : function () { + return isLeapYear(this.year()); + }, + + isDST : function () { + return (this.utcOffset() > this.clone().month(0).utcOffset() || + this.utcOffset() > this.clone().month(5).utcOffset()); + }, + + day : function (input) { + var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); + if (input != null) { + input = parseWeekday(input, this.localeData()); + return this.add(input - day, 'd'); + } else { + return day; + } + }, + + month : makeAccessor('Month', true), + + startOf : function (units) { + units = normalizeUnits(units); + // the following switch intentionally omits break keywords + // to utilize falling through the cases. + switch (units) { + case 'year': + this.month(0); + /* falls through */ + case 'quarter': + case 'month': + this.date(1); + /* falls through */ + case 'week': + case 'isoWeek': + case 'day': + this.hours(0); + /* falls through */ + case 'hour': + this.minutes(0); + /* falls through */ + case 'minute': + this.seconds(0); + /* falls through */ + case 'second': + this.milliseconds(0); + /* falls through */ + } + + // weeks are a special case + if (units === 'week') { + this.weekday(0); + } else if (units === 'isoWeek') { + this.isoWeekday(1); + } + + // quarters are also special + if (units === 'quarter') { + this.month(Math.floor(this.month() / 3) * 3); + } + + return this; + }, + + endOf: function (units) { + units = normalizeUnits(units); + if (units === undefined || units === 'millisecond') { + return this; + } + return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); + }, + + isAfter: function (input, units) { + var inputMs; + units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); + if (units === 'millisecond') { + input = moment.isMoment(input) ? input : moment(input); + return +this > +input; + } else { + inputMs = moment.isMoment(input) ? +input : +moment(input); + return inputMs < +this.clone().startOf(units); + } + }, + + isBefore: function (input, units) { + var inputMs; + units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); + if (units === 'millisecond') { + input = moment.isMoment(input) ? input : moment(input); + return +this < +input; + } else { + inputMs = moment.isMoment(input) ? +input : +moment(input); + return +this.clone().endOf(units) < inputMs; + } + }, + + isBetween: function (from, to, units) { + return this.isAfter(from, units) && this.isBefore(to, units); + }, + + isSame: function (input, units) { + var inputMs; + units = normalizeUnits(units || 'millisecond'); + if (units === 'millisecond') { + input = moment.isMoment(input) ? input : moment(input); + return +this === +input; + } else { + inputMs = +moment(input); + return +(this.clone().startOf(units)) <= inputMs && inputMs <= +(this.clone().endOf(units)); + } + }, + + min: deprecate( + 'moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548', + function (other) { + other = moment.apply(null, arguments); + return other < this ? this : other; + } + ), + + max: deprecate( + 'moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548', + function (other) { + other = moment.apply(null, arguments); + return other > this ? this : other; + } + ), + + zone : deprecate( + 'moment().zone is deprecated, use moment().utcOffset instead. ' + + 'https://github.com/moment/moment/issues/1779', + function (input, keepLocalTime) { + if (input != null) { + if (typeof input !== 'string') { + input = -input; + } + + this.utcOffset(input, keepLocalTime); + + return this; + } else { + return -this.utcOffset(); + } + } + ), + + // keepLocalTime = true means only change the timezone, without + // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> + // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset + // +0200, so we adjust the time as needed, to be valid. + // + // Keeping the time actually adds/subtracts (one hour) + // from the actual represented time. That is why we call updateOffset + // a second time. In case it wants us to change the offset again + // _changeInProgress == true case, then we have to adjust, because + // there is no such time in the given timezone. + utcOffset : function (input, keepLocalTime) { + var offset = this._offset || 0, + localAdjust; + if (input != null) { + if (typeof input === 'string') { + input = utcOffsetFromString(input); + } + if (Math.abs(input) < 16) { + input = input * 60; + } + if (!this._isUTC && keepLocalTime) { + localAdjust = this._dateUtcOffset(); + } + this._offset = input; + this._isUTC = true; + if (localAdjust != null) { + this.add(localAdjust, 'm'); + } + if (offset !== input) { + if (!keepLocalTime || this._changeInProgress) { + addOrSubtractDurationFromMoment(this, + moment.duration(input - offset, 'm'), 1, false); + } else if (!this._changeInProgress) { + this._changeInProgress = true; + moment.updateOffset(this, true); + this._changeInProgress = null; + } + } + + return this; + } else { + return this._isUTC ? offset : this._dateUtcOffset(); + } + }, + + isLocal : function () { + return !this._isUTC; + }, + + isUtcOffset : function () { + return this._isUTC; + }, + + isUtc : function () { + return this._isUTC && this._offset === 0; + }, + + zoneAbbr : function () { + return this._isUTC ? 'UTC' : ''; + }, + + zoneName : function () { + return this._isUTC ? 'Coordinated Universal Time' : ''; + }, + + parseZone : function () { + if (this._tzm) { + this.utcOffset(this._tzm); + } else if (typeof this._i === 'string') { + this.utcOffset(utcOffsetFromString(this._i)); + } + return this; + }, + + hasAlignedHourOffset : function (input) { + if (!input) { + input = 0; + } + else { + input = moment(input).utcOffset(); + } + + return (this.utcOffset() - input) % 60 === 0; + }, + + daysInMonth : function () { + return daysInMonth(this.year(), this.month()); + }, + + dayOfYear : function (input) { + var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1; + return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); + }, + + quarter : function (input) { + return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); + }, + + weekYear : function (input) { + var year = weekOfYear(this, this.localeData()._week.dow, this.localeData()._week.doy).year; + return input == null ? year : this.add((input - year), 'y'); + }, + + isoWeekYear : function (input) { + var year = weekOfYear(this, 1, 4).year; + return input == null ? year : this.add((input - year), 'y'); + }, + + week : function (input) { + var week = this.localeData().week(this); + return input == null ? week : this.add((input - week) * 7, 'd'); + }, + + isoWeek : function (input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add((input - week) * 7, 'd'); + }, + + weekday : function (input) { + var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; + return input == null ? weekday : this.add(input - weekday, 'd'); + }, + + isoWeekday : function (input) { + // behaves the same as moment#day except + // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) + // as a setter, sunday should belong to the previous week. + return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7); + }, + + isoWeeksInYear : function () { + return weeksInYear(this.year(), 1, 4); + }, + + weeksInYear : function () { + var weekInfo = this.localeData()._week; + return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); + }, + + get : function (units) { + units = normalizeUnits(units); + return this[units](); + }, + + set : function (units, value) { + var unit; + if (typeof units === 'object') { + for (unit in units) { + this.set(unit, units[unit]); + } + } + else { + units = normalizeUnits(units); + if (typeof this[units] === 'function') { + this[units](value); + } + } + return this; + }, + + // If passed a locale key, it will set the locale for this + // instance. Otherwise, it will return the locale configuration + // variables for this instance. + locale : function (key) { + var newLocaleData; + + if (key === undefined) { + return this._locale._abbr; + } else { + newLocaleData = moment.localeData(key); + if (newLocaleData != null) { + this._locale = newLocaleData; + } + return this; + } + }, + + lang : deprecate( + 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', + function (key) { + if (key === undefined) { + return this.localeData(); + } else { + return this.locale(key); + } + } + ), + + localeData : function () { + return this._locale; + }, + + _dateUtcOffset : function () { + // On Firefox.24 Date#getTimezoneOffset returns a floating point. + // https://github.com/moment/moment/pull/1871 + return -Math.round(this._d.getTimezoneOffset() / 15) * 15; + } + + }); + + function rawMonthSetter(mom, value) { + var dayOfMonth; + + // TODO: Move this out of here! + if (typeof value === 'string') { + value = mom.localeData().monthsParse(value); + // TODO: Another silent failure? + if (typeof value !== 'number') { + return mom; + } + } + + dayOfMonth = Math.min(mom.date(), + daysInMonth(mom.year(), value)); + mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); + return mom; + } + + function rawGetter(mom, unit) { + return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit](); + } + + function rawSetter(mom, unit, value) { + if (unit === 'Month') { + return rawMonthSetter(mom, value); + } else { + return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); + } + } + + function makeAccessor(unit, keepTime) { + return function (value) { + if (value != null) { + rawSetter(this, unit, value); + moment.updateOffset(this, keepTime); + return this; + } else { + return rawGetter(this, unit); + } + }; + } + + moment.fn.millisecond = moment.fn.milliseconds = makeAccessor('Milliseconds', false); + moment.fn.second = moment.fn.seconds = makeAccessor('Seconds', false); + moment.fn.minute = moment.fn.minutes = makeAccessor('Minutes', false); + // Setting the hour should keep the time, because the user explicitly + // specified which hour he wants. So trying to maintain the same hour (in + // a new timezone) makes sense. Adding/subtracting hours does not follow + // this rule. + moment.fn.hour = moment.fn.hours = makeAccessor('Hours', true); + // moment.fn.month is defined separately + moment.fn.date = makeAccessor('Date', true); + moment.fn.dates = deprecate('dates accessor is deprecated. Use date instead.', makeAccessor('Date', true)); + moment.fn.year = makeAccessor('FullYear', true); + moment.fn.years = deprecate('years accessor is deprecated. Use year instead.', makeAccessor('FullYear', true)); + + // add plural methods + moment.fn.days = moment.fn.day; + moment.fn.months = moment.fn.month; + moment.fn.weeks = moment.fn.week; + moment.fn.isoWeeks = moment.fn.isoWeek; + moment.fn.quarters = moment.fn.quarter; + + // add aliased format methods + moment.fn.toJSON = moment.fn.toISOString; + + // alias isUtc for dev-friendliness + moment.fn.isUTC = moment.fn.isUtc; + + /************************************ + Duration Prototype + ************************************/ + + + function daysToYears (days) { + // 400 years have 146097 days (taking into account leap year rules) + return days * 400 / 146097; + } + + function yearsToDays (years) { + // years * 365 + absRound(years / 4) - + // absRound(years / 100) + absRound(years / 400); + return years * 146097 / 400; + } + + extend(moment.duration.fn = Duration.prototype, { + + _bubble : function () { + var milliseconds = this._milliseconds, + days = this._days, + months = this._months, + data = this._data, + seconds, minutes, hours, years = 0; + + // The following code bubbles up values, see the tests for + // examples of what that means. + data.milliseconds = milliseconds % 1000; + + seconds = absRound(milliseconds / 1000); + data.seconds = seconds % 60; + + minutes = absRound(seconds / 60); + data.minutes = minutes % 60; + + hours = absRound(minutes / 60); + data.hours = hours % 24; + + days += absRound(hours / 24); + + // Accurately convert days to years, assume start from year 0. + years = absRound(daysToYears(days)); + days -= absRound(yearsToDays(years)); + + // 30 days to a month + // TODO (iskren): Use anchor date (like 1st Jan) to compute this. + months += absRound(days / 30); + days %= 30; + + // 12 months -> 1 year + years += absRound(months / 12); + months %= 12; + + data.days = days; + data.months = months; + data.years = years; + }, + + abs : function () { + this._milliseconds = Math.abs(this._milliseconds); + this._days = Math.abs(this._days); + this._months = Math.abs(this._months); + + this._data.milliseconds = Math.abs(this._data.milliseconds); + this._data.seconds = Math.abs(this._data.seconds); + this._data.minutes = Math.abs(this._data.minutes); + this._data.hours = Math.abs(this._data.hours); + this._data.months = Math.abs(this._data.months); + this._data.years = Math.abs(this._data.years); + + return this; + }, + + weeks : function () { + return absRound(this.days() / 7); + }, + + valueOf : function () { + return this._milliseconds + + this._days * 864e5 + + (this._months % 12) * 2592e6 + + toInt(this._months / 12) * 31536e6; + }, + + humanize : function (withSuffix) { + var output = relativeTime(this, !withSuffix, this.localeData()); + + if (withSuffix) { + output = this.localeData().pastFuture(+this, output); + } + + return this.localeData().postformat(output); + }, + + add : function (input, val) { + // supports only 2.0-style add(1, 's') or add(moment) + var dur = moment.duration(input, val); + + this._milliseconds += dur._milliseconds; + this._days += dur._days; + this._months += dur._months; + + this._bubble(); + + return this; + }, + + subtract : function (input, val) { + var dur = moment.duration(input, val); + + this._milliseconds -= dur._milliseconds; + this._days -= dur._days; + this._months -= dur._months; + + this._bubble(); + + return this; + }, + + get : function (units) { + units = normalizeUnits(units); + return this[units.toLowerCase() + 's'](); + }, + + as : function (units) { + var days, months; + units = normalizeUnits(units); + + if (units === 'month' || units === 'year') { + days = this._days + this._milliseconds / 864e5; + months = this._months + daysToYears(days) * 12; + return units === 'month' ? months : months / 12; + } else { + // handle milliseconds separately because of floating point math errors (issue #1867) + days = this._days + Math.round(yearsToDays(this._months / 12)); + switch (units) { + case 'week': return days / 7 + this._milliseconds / 6048e5; + case 'day': return days + this._milliseconds / 864e5; + case 'hour': return days * 24 + this._milliseconds / 36e5; + case 'minute': return days * 24 * 60 + this._milliseconds / 6e4; + case 'second': return days * 24 * 60 * 60 + this._milliseconds / 1000; + // Math.floor prevents floating point math errors here + case 'millisecond': return Math.floor(days * 24 * 60 * 60 * 1000) + this._milliseconds; + default: throw new Error('Unknown unit ' + units); + } + } + }, + + lang : moment.fn.lang, + locale : moment.fn.locale, + + toIsoString : deprecate( + 'toIsoString() is deprecated. Please use toISOString() instead ' + + '(notice the capitals)', + function () { + return this.toISOString(); + } + ), + + toISOString : function () { + // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js + var years = Math.abs(this.years()), + months = Math.abs(this.months()), + days = Math.abs(this.days()), + hours = Math.abs(this.hours()), + minutes = Math.abs(this.minutes()), + seconds = Math.abs(this.seconds() + this.milliseconds() / 1000); + + if (!this.asSeconds()) { + // this is the same as C#'s (Noda) and python (isodate)... + // but not other JS (goog.date) + return 'P0D'; + } + + return (this.asSeconds() < 0 ? '-' : '') + + 'P' + + (years ? years + 'Y' : '') + + (months ? months + 'M' : '') + + (days ? days + 'D' : '') + + ((hours || minutes || seconds) ? 'T' : '') + + (hours ? hours + 'H' : '') + + (minutes ? minutes + 'M' : '') + + (seconds ? seconds + 'S' : ''); + }, + + localeData : function () { + return this._locale; + }, + + toJSON : function () { + return this.toISOString(); + } + }); + + moment.duration.fn.toString = moment.duration.fn.toISOString; + + function makeDurationGetter(name) { + moment.duration.fn[name] = function () { + return this._data[name]; + }; + } + + for (i in unitMillisecondFactors) { + if (hasOwnProp(unitMillisecondFactors, i)) { + makeDurationGetter(i.toLowerCase()); + } + } + + moment.duration.fn.asMilliseconds = function () { + return this.as('ms'); + }; + moment.duration.fn.asSeconds = function () { + return this.as('s'); + }; + moment.duration.fn.asMinutes = function () { + return this.as('m'); + }; + moment.duration.fn.asHours = function () { + return this.as('h'); + }; + moment.duration.fn.asDays = function () { + return this.as('d'); + }; + moment.duration.fn.asWeeks = function () { + return this.as('weeks'); + }; + moment.duration.fn.asMonths = function () { + return this.as('M'); + }; + moment.duration.fn.asYears = function () { + return this.as('y'); + }; + + /************************************ + Default Locale + ************************************/ + + + // Set default locale, other locale will inherit from English. + moment.locale('en', { + ordinalParse: /\d{1,2}(th|st|nd|rd)/, + ordinal : function (number) { + var b = number % 10, + output = (toInt(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); + + // moment.js locale configuration +// locale : afrikaans (af) +// author : Werner Mollentze : https://github.com/wernerm + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('af', { + months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'), + weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'), + weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'), + meridiemParse: /vm|nm/i, + isPM : function (input) { + return /^nm$/i.test(input); + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower ? 'vm' : 'VM'; + } else { + return isLower ? 'nm' : 'NM'; + } + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Vandag om] LT', + nextDay : '[Môre om] LT', + nextWeek : 'dddd [om] LT', + lastDay : '[Gister om] LT', + lastWeek : '[Laas] dddd [om] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'oor %s', + past : '%s gelede', + s : '\'n paar sekondes', + m : '\'n minuut', + mm : '%d minute', + h : '\'n uur', + hh : '%d ure', + d : '\'n dag', + dd : '%d dae', + M : '\'n maand', + MM : '%d maande', + y : '\'n jaar', + yy : '%d jaar' + }, + ordinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter + }, + week : { + dow : 1, // Maandag is die eerste dag van die week. + doy : 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar. + } + }); +})); +// moment.js locale configuration +// locale : Moroccan Arabic (ar-ma) +// author : ElFadili Yassine : https://github.com/ElFadiliY +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('ar-ma', { + months : 'يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + monthsShort : 'يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'ÙÙŠ %s', + past : 'منذ %s', + s : 'ثوان', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Arabic Saudi Arabia (ar-sa) +// author : Suhail Alkowaileet : https://github.com/xsoh + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': 'Ù¡', + '2': 'Ù¢', + '3': 'Ù£', + '4': 'Ù¤', + '5': 'Ù¥', + '6': 'Ù¦', + '7': 'Ù§', + '8': 'Ù¨', + '9': 'Ù©', + '0': 'Ù ' + }, numberMap = { + 'Ù¡': '1', + 'Ù¢': '2', + 'Ù£': '3', + 'Ù¤': '4', + 'Ù¥': '5', + 'Ù¦': '6', + 'Ù§': '7', + 'Ù¨': '8', + 'Ù©': '9', + 'Ù ': '0' + }; + + return moment.defineLocale('ar-sa', { + months : 'يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + monthsShort : 'يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + meridiemParse: /ص|Ù…/, + isPM : function (input) { + return 'Ù…' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'Ù…'; + } + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'ÙÙŠ %s', + past : 'منذ %s', + s : 'ثوان', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + preparse: function (string) { + return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return numberMap[match]; + }).replace(/ØŒ/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, 'ØŒ'); + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Tunisian Arabic (ar-tn) + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('ar-tn', { + months: 'جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + monthsShort: 'جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin: 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS: 'LT:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd D MMMM YYYY LT' + }, + calendar: { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'ÙÙŠ %s', + past: 'منذ %s', + s: 'ثوان', + m: 'دقيقة', + mm: '%d دقائق', + h: 'ساعة', + hh: '%d ساعات', + d: 'يوم', + dd: '%d أيام', + M: 'شهر', + MM: '%d أشهر', + y: 'سنة', + yy: '%d سنوات' + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// Locale: Arabic (ar) +// Author: Abdel Said: https://github.com/abdelsaid +// Changes in months, weekdays: Ahmed Elkhatib +// Native plural forms: forabi https://github.com/forabi + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': 'Ù¡', + '2': 'Ù¢', + '3': 'Ù£', + '4': 'Ù¤', + '5': 'Ù¥', + '6': 'Ù¦', + '7': 'Ù§', + '8': 'Ù¨', + '9': 'Ù©', + '0': 'Ù ' + }, numberMap = { + 'Ù¡': '1', + 'Ù¢': '2', + 'Ù£': '3', + 'Ù¤': '4', + 'Ù¥': '5', + 'Ù¦': '6', + 'Ù§': '7', + 'Ù¨': '8', + 'Ù©': '9', + 'Ù ': '0' + }, pluralForm = function (n) { + return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5; + }, plurals = { + s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'], + m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'], + h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'], + d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'], + M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'], + y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام'] + }, pluralize = function (u) { + return function (number, withoutSuffix, string, isFuture) { + var f = pluralForm(number), + str = plurals[u][pluralForm(number)]; + if (f === 2) { + str = str[withoutSuffix ? 0 : 1]; + } + return str.replace(/%d/i, number); + }; + }, months = [ + 'كانون الثاني يناير', + 'شباط Ùبراير', + 'آذار مارس', + 'نيسان أبريل', + 'أيار مايو', + 'حزيران يونيو', + 'تموز يوليو', + 'آب أغسطس', + 'أيلول سبتمبر', + 'تشرين الأول أكتوبر', + 'تشرين الثاني نوÙمبر', + 'كانون الأول ديسمبر' + ]; + + return moment.defineLocale('ar', { + months : months, + monthsShort : months, + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + meridiemParse: /ص|Ù…/, + isPM : function (input) { + return 'Ù…' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'Ù…'; + } + }, + calendar : { + sameDay: '[اليوم عند الساعة] LT', + nextDay: '[غدًا عند الساعة] LT', + nextWeek: 'dddd [عند الساعة] LT', + lastDay: '[أمس عند الساعة] LT', + lastWeek: 'dddd [عند الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'بعد %s', + past : 'منذ %s', + s : pluralize('s'), + m : pluralize('m'), + mm : pluralize('m'), + h : pluralize('h'), + hh : pluralize('h'), + d : pluralize('d'), + dd : pluralize('d'), + M : pluralize('M'), + MM : pluralize('M'), + y : pluralize('y'), + yy : pluralize('y') + }, + preparse: function (string) { + return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return numberMap[match]; + }).replace(/ØŒ/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, 'ØŒ'); + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : azerbaijani (az) +// author : topchiyev : https://github.com/topchiyev + +(function (factory) { + factory(moment); +}(function (moment) { + var suffixes = { + 1: '-inci', + 5: '-inci', + 8: '-inci', + 70: '-inci', + 80: '-inci', + + 2: '-nci', + 7: '-nci', + 20: '-nci', + 50: '-nci', + + 3: '-üncü', + 4: '-üncü', + 100: '-üncü', + + 6: '-ncı', + + 9: '-uncu', + 10: '-uncu', + 30: '-uncu', + + 60: '-ıncı', + 90: '-ıncı' + }; + return moment.defineLocale('az', { + months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'), + monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'), + weekdays : 'Bazar_Bazar ertÉ™si_ÇərÅŸÉ™nbÉ™ axÅŸamı_ÇərÅŸÉ™nbÉ™_CümÉ™ axÅŸamı_CümÉ™_ŞənbÉ™'.split('_'), + weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'), + weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[bugün saat] LT', + nextDay : '[sabah saat] LT', + nextWeek : '[gÉ™lÉ™n hÉ™ftÉ™] dddd [saat] LT', + lastDay : '[dünÉ™n] LT', + lastWeek : '[keçən hÉ™ftÉ™] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s sonra', + past : '%s É™vvÉ™l', + s : 'birneçə saniyyÉ™', + m : 'bir dÉ™qiqÉ™', + mm : '%d dÉ™qiqÉ™', + h : 'bir saat', + hh : '%d saat', + d : 'bir gün', + dd : '%d gün', + M : 'bir ay', + MM : '%d ay', + y : 'bir il', + yy : '%d il' + }, + meridiemParse: /gecÉ™|sÉ™hÉ™r|gündüz|axÅŸam/, + isPM : function (input) { + return /^(gündüz|axÅŸam)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'gecÉ™'; + } else if (hour < 12) { + return 'sÉ™hÉ™r'; + } else if (hour < 17) { + return 'gündüz'; + } else { + return 'axÅŸam'; + } + }, + ordinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/, + ordinal : function (number) { + if (number === 0) { // special case for zero + return number + '-ıncı'; + } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + + return number + (suffixes[a] || suffixes[b] || suffixes[c]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : belarusian (be) +// author : Dmitry Demidov : https://github.com/demidov91 +// author: Praleska: http://praleska.pro/ +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + factory(moment); +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін', + 'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін', + 'dd': 'дзень_дні_дзён', + 'MM': 'меÑÑц_меÑÑцы_меÑÑцаў', + 'yy': 'год_гады_гадоў' + }; + if (key === 'm') { + return withoutSuffix ? 'хвіліна' : 'хвіліну'; + } + else if (key === 'h') { + return withoutSuffix ? 'гадзіна' : 'гадзіну'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñтудзень_люты_Ñакавік_краÑавік_травень_чÑрвень_ліпень_жнівень_вераÑень_каÑтрычнік_ліÑтапад_Ñнежань'.split('_'), + 'accusative': 'ÑтудзенÑ_лютага_Ñакавіка_краÑавіка_траўнÑ_чÑрвенÑ_ліпенÑ_жніўнÑ_вераÑнÑ_каÑтрычніка_ліÑтапада_ÑнежнÑ'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'нÑдзелÑ_панÑдзелак_аўторак_Ñерада_чацвер_пÑтніца_Ñубота'.split('_'), + 'accusative': 'нÑдзелю_панÑдзелак_аўторак_Ñераду_чацвер_пÑтніцу_Ñуботу'.split('_') + }, + + nounCase = (/\[ ?[Вв] ?(?:мінулую|наÑтупную)? ?\] ?dddd/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.defineLocale('be', { + months : monthsCaseReplace, + monthsShort : 'Ñтуд_лют_Ñак_краÑ_трав_чÑрв_ліп_жнів_вер_каÑÑ‚_ліÑÑ‚_Ñнеж'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'нд_пн_ат_ÑÑ€_чц_пт_Ñб'.split('_'), + weekdaysMin : 'нд_пн_ат_ÑÑ€_чц_пт_Ñб'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY г.', + LLL : 'D MMMM YYYY г., LT', + LLLL : 'dddd, D MMMM YYYY г., LT' + }, + calendar : { + sameDay: '[Ð¡Ñ‘Ð½Ð½Ñ Ñž] LT', + nextDay: '[Заўтра Ñž] LT', + lastDay: '[Учора Ñž] LT', + nextWeek: function () { + return '[У] dddd [Ñž] LT'; + }, + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return '[У мінулую] dddd [Ñž] LT'; + case 1: + case 2: + case 4: + return '[У мінулы] dddd [Ñž] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'праз %s', + past : '%s таму', + s : 'некалькі Ñекунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : relativeTimeWithPlural, + hh : relativeTimeWithPlural, + d : 'дзень', + dd : relativeTimeWithPlural, + M : 'меÑÑц', + MM : relativeTimeWithPlural, + y : 'год', + yy : relativeTimeWithPlural + }, + meridiemParse: /ночы|раніцы|днÑ|вечара/, + isPM : function (input) { + return /^(днÑ|вечара)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночы'; + } else if (hour < 12) { + return 'раніцы'; + } else if (hour < 17) { + return 'днÑ'; + } else { + return 'вечара'; + } + }, + + ordinalParse: /\d{1,2}-(Ñ–|Ñ‹|га)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-Ñ–' : number + '-Ñ‹'; + case 'D': + return number + '-га'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : bulgarian (bg) +// author : Krasen Borisov : https://github.com/kraz + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('bg', { + months : 'Ñнуари_февруари_март_април_май_юни_юли_авгуÑÑ‚_Ñептември_октомври_ноември_декември'.split('_'), + monthsShort : 'Ñнр_фев_мар_апр_май_юни_юли_авг_Ñеп_окт_ное_дек'.split('_'), + weekdays : 'неделÑ_понеделник_вторник_ÑÑ€Ñда_четвъртък_петък_Ñъбота'.split('_'), + weekdaysShort : 'нед_пон_вто_ÑÑ€Ñ_чет_пет_Ñъб'.split('_'), + weekdaysMin : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'D.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Ð”Ð½ÐµÑ Ð²] LT', + nextDay : '[Утре в] LT', + nextWeek : 'dddd [в] LT', + lastDay : '[Вчера в] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[Ð’ изминалата] dddd [в] LT'; + case 1: + case 2: + case 4: + case 5: + return '[Ð’ изминалиÑ] dddd [в] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'Ñлед %s', + past : 'преди %s', + s : 'нÑколко Ñекунди', + m : 'минута', + mm : '%d минути', + h : 'чаÑ', + hh : '%d чаÑа', + d : 'ден', + dd : '%d дни', + M : 'меÑец', + MM : '%d меÑеца', + y : 'година', + yy : '%d години' + }, + ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Bengali (bn) +// author : Kaushik Gandhi : https://github.com/kaushikgandhi + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': '১', + '2': '২', + '3': '৩', + '4': '৪', + '5': '৫', + '6': '৬', + '7': '৭', + '8': '৮', + '9': '৯', + '0': '০' + }, + numberMap = { + '১': '1', + '২': '2', + '৩': '3', + '৪': '4', + '৫': '5', + '৬': '6', + '৭': '7', + '৮': '8', + '৯': '9', + '০': '0' + }; + + return moment.defineLocale('bn', { + months : 'জানà§à§Ÿà¦¾à¦°à§€_ফেবà§à§Ÿà¦¾à¦°à§€_মারà§à¦š_à¦à¦ªà§à¦°à¦¿à¦²_মে_জà§à¦¨_জà§à¦²à¦¾à¦‡_অগাসà§à¦Ÿ_সেপà§à¦Ÿà§‡à¦®à§à¦¬à¦°_অকà§à¦Ÿà§‹à¦¬à¦°_নভেমà§à¦¬à¦°_ডিসেমà§à¦¬à¦°'.split('_'), + monthsShort : 'জানà§_ফেব_মারà§à¦š_à¦à¦ªà¦°_মে_জà§à¦¨_জà§à¦²_অগ_সেপà§à¦Ÿ_অকà§à¦Ÿà§‹_নভ_ডিসেমà§'.split('_'), + weekdays : 'রবিবার_সোমবার_মঙà§à¦—লবার_বà§à¦§à¦¬à¦¾à¦°_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿à¦¬à¦¾à¦°_শà§à¦•à§à¦°à§à¦¬à¦¾à¦°_শনিবার'.split('_'), + weekdaysShort : 'রবি_সোম_মঙà§à¦—ল_বà§à¦§_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿_শà§à¦•à§à¦°à§_শনি'.split('_'), + weekdaysMin : 'রব_সম_মঙà§à¦—_বà§_বà§à¦°à¦¿à¦¹_শà§_শনি'.split('_'), + longDateFormat : { + LT : 'A h:mm সময়', + LTS : 'A h:mm:ss সময়', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[আজ] LT', + nextDay : '[আগামীকাল] LT', + nextWeek : 'dddd, LT', + lastDay : '[গতকাল] LT', + lastWeek : '[গত] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s পরে', + past : '%s আগে', + s : 'কà¦à¦• সেকেনà§à¦¡', + m : 'à¦à¦• মিনিট', + mm : '%d মিনিট', + h : 'à¦à¦• ঘনà§à¦Ÿà¦¾', + hh : '%d ঘনà§à¦Ÿà¦¾', + d : 'à¦à¦• দিন', + dd : '%d দিন', + M : 'à¦à¦• মাস', + MM : '%d মাস', + y : 'à¦à¦• বছর', + yy : '%d বছর' + }, + preparse: function (string) { + return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /রাত|শকাল|দà§à¦ªà§à¦°|বিকেল|রাত/, + isPM: function (input) { + return /^(দà§à¦ªà§à¦°|বিকেল|রাত)$/.test(input); + }, + //Bengali is a vast language its spoken + //in different forms in various parts of the world. + //I have just generalized with most common one used + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'রাত'; + } else if (hour < 10) { + return 'শকাল'; + } else if (hour < 17) { + return 'দà§à¦ªà§à¦°'; + } else if (hour < 20) { + return 'বিকেল'; + } else { + return 'রাত'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : tibetan (bo) +// author : Thupten N. Chakrishar : https://github.com/vajradog + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': '༡', + '2': '༢', + '3': '༣', + '4': '༤', + '5': '༥', + '6': '༦', + '7': '༧', + '8': '༨', + '9': '༩', + '0': '༠' + }, + numberMap = { + '༡': '1', + '༢': '2', + '༣': '3', + '༤': '4', + '༥': '5', + '༦': '6', + '༧': '7', + '༨': '8', + '༩': '9', + '༠': '0' + }; + + return moment.defineLocale('bo', { + months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), + monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), + weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'), + weekdaysShort : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), + weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), + longDateFormat : { + LT : 'A h:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[དི་རིང] LT', + nextDay : '[སང་ཉིན] LT', + nextWeek : '[བདུན་ཕྲག་རྗེས་མ], LT', + lastDay : '[à½à¼‹à½¦à½„] LT', + lastWeek : '[བདུན་ཕྲག་མà½à½ à¼‹à½˜] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s ལ་', + past : '%s སྔན་ལ', + s : 'ལམ་སང', + m : 'སà¾à½¢à¼‹à½˜à¼‹à½‚ཅིག', + mm : '%d སà¾à½¢à¼‹à½˜', + h : 'ཆུ་ཚོད་གཅིག', + hh : '%d ཆུ་ཚོད', + d : 'ཉིན་གཅིག', + dd : '%d ཉིན་', + M : 'ཟླ་བ་གཅིག', + MM : '%d ཟླ་བ', + y : 'ལོ་གཅིག', + yy : '%d ལོ' + }, + preparse: function (string) { + return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/, + isPM: function (input) { + return /^(ཉིན་གུང|དགོང་དག|མཚན་མོ)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'མཚན་མོ'; + } else if (hour < 10) { + return 'ཞོགས་ཀས'; + } else if (hour < 17) { + return 'ཉིན་གུང'; + } else if (hour < 20) { + return 'དགོང་དག'; + } else { + return 'མཚན་མོ'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : breton (br) +// author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou + +(function (factory) { + factory(moment); +}(function (moment) { + function relativeTimeWithMutation(number, withoutSuffix, key) { + var format = { + 'mm': 'munutenn', + 'MM': 'miz', + 'dd': 'devezh' + }; + return number + ' ' + mutation(format[key], number); + } + + function specialMutationForYears(number) { + switch (lastNumber(number)) { + case 1: + case 3: + case 4: + case 5: + case 9: + return number + ' bloaz'; + default: + return number + ' vloaz'; + } + } + + function lastNumber(number) { + if (number > 9) { + return lastNumber(number % 10); + } + return number; + } + + function mutation(text, number) { + if (number === 2) { + return softMutation(text); + } + return text; + } + + function softMutation(text) { + var mutationTable = { + 'm': 'v', + 'b': 'v', + 'd': 'z' + }; + if (mutationTable[text.charAt(0)] === undefined) { + return text; + } + return mutationTable[text.charAt(0)] + text.substring(1); + } + + return moment.defineLocale('br', { + months : 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'), + monthsShort : 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'), + weekdays : 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'), + weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'), + weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'), + longDateFormat : { + LT : 'h[e]mm A', + LTS : 'h[e]mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D [a viz] MMMM YYYY', + LLL : 'D [a viz] MMMM YYYY LT', + LLLL : 'dddd, D [a viz] MMMM YYYY LT' + }, + calendar : { + sameDay : '[Hiziv da] LT', + nextDay : '[Warc\'hoazh da] LT', + nextWeek : 'dddd [da] LT', + lastDay : '[Dec\'h da] LT', + lastWeek : 'dddd [paset da] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'a-benn %s', + past : '%s \'zo', + s : 'un nebeud segondennoù', + m : 'ur vunutenn', + mm : relativeTimeWithMutation, + h : 'un eur', + hh : '%d eur', + d : 'un devezh', + dd : relativeTimeWithMutation, + M : 'ur miz', + MM : relativeTimeWithMutation, + y : 'ur bloaz', + yy : specialMutationForYears + }, + ordinalParse: /\d{1,2}(añ|vet)/, + ordinal : function (number) { + var output = (number === 1) ? 'añ' : 'vet'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : bosnian (bs) +// author : Nedim Cholich : https://github.com/frontyard +// based on (hr) translation by Bojan Marković + +(function (factory) { + factory(moment); +}(function (moment) { + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } + } + + return moment.defineLocale('bs', { + months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'), + monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'), + weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota'.split('_'), + weekdaysShort : 'ned._pon._uto._sri._Äet._pet._sub.'.split('_'), + weekdaysMin : 'ne_po_ut_sr_Äe_pe_su'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD. MM. YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[proÅ¡lu] dddd [u] LT'; + case 6: + return '[proÅ¡le] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[proÅ¡li] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'par sekundi', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'dan', + dd : translate, + M : 'mjesec', + MM : translate, + y : 'godinu', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : catalan (ca) +// author : Juan G. Hurtado : https://github.com/juanghurtado + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('ca', { + months : 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'), + monthsShort : 'gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.'.split('_'), + weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'), + weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'), + weekdaysMin : 'Dg_Dl_Dt_Dc_Dj_Dv_Ds'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay : function () { + return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextDay : function () { + return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastDay : function () { + return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'fa %s', + s : 'uns segons', + m : 'un minut', + mm : '%d minuts', + h : 'una hora', + hh : '%d hores', + d : 'un dia', + dd : '%d dies', + M : 'un mes', + MM : '%d mesos', + y : 'un any', + yy : '%d anys' + }, + ordinalParse: /\d{1,2}(r|n|t|è|a)/, + ordinal : function (number, period) { + var output = (number === 1) ? 'r' : + (number === 2) ? 'n' : + (number === 3) ? 'r' : + (number === 4) ? 't' : 'è'; + if (period === 'w' || period === 'W') { + output = 'a'; + } + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : czech (cs) +// author : petrbela : https://github.com/petrbela + +(function (factory) { + factory(moment); +}(function (moment) { + var months = 'leden_únor_bÅ™ezen_duben_kvÄ›ten_Äerven_Äervenec_srpen_září_říjen_listopad_prosinec'.split('_'), + monthsShort = 'led_úno_bÅ™e_dub_kvÄ›_Ävn_Ävc_srp_zář_říj_lis_pro'.split('_'); + + function plural(n) { + return (n > 1) && (n < 5) && (~~(n / 10) !== 1); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami'; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minuty' : 'minut'); + } else { + return result + 'minutami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodin'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'den' : 'dnem'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dny' : 'dní'); + } else { + return result + 'dny'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mÄ›síc' : 'mÄ›sícem'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'mÄ›síce' : 'mÄ›síců'); + } else { + return result + 'mÄ›síci'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokem'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'let'); + } else { + return result + 'lety'; + } + break; + } + } + + return moment.defineLocale('cs', { + months : months, + monthsShort : monthsShort, + monthsParse : (function (months, monthsShort) { + var i, _monthsParse = []; + for (i = 0; i < 12; i++) { + // use custom parser to solve problem with July (Äervenec) + _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); + } + return _monthsParse; + }(months, monthsShort)), + weekdays : 'nedÄ›le_pondÄ›lí_úterý_stÅ™eda_Ätvrtek_pátek_sobota'.split('_'), + weekdaysShort : 'ne_po_út_st_Ät_pá_so'.split('_'), + weekdaysMin : 'ne_po_út_st_Ät_pá_so'.split('_'), + longDateFormat : { + LT: 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[dnes v] LT', + nextDay: '[zítra v] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedÄ›li v] LT'; + case 1: + case 2: + return '[v] dddd [v] LT'; + case 3: + return '[ve stÅ™edu v] LT'; + case 4: + return '[ve Ätvrtek v] LT'; + case 5: + return '[v pátek v] LT'; + case 6: + return '[v sobotu v] LT'; + } + }, + lastDay: '[vÄera v] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulou nedÄ›li v] LT'; + case 1: + case 2: + return '[minulé] dddd [v] LT'; + case 3: + return '[minulou stÅ™edu v] LT'; + case 4: + case 5: + return '[minulý] dddd [v] LT'; + case 6: + return '[minulou sobotu v] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pÅ™ed %s', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse : /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : chuvash (cv) +// author : Anatoly Mironov : https://github.com/mirontoli + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('cv', { + months : 'кăрлач_нарăÑ_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав'.split('_'), + monthsShort : 'кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш'.split('_'), + weekdays : 'вырÑарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_Ñрнекун_шăматкун'.split('_'), + weekdaysShort : 'выр_тун_ытл_юн_кĕç_Ñрн_шăм'.split('_'), + weekdaysMin : 'вр_тн_Ñ‹Ñ‚_юн_кç_ÑÑ€_шм'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD-MM-YYYY', + LL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]', + LLL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT', + LLLL : 'dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT' + }, + calendar : { + sameDay: '[ПаÑн] LT [Ñехетре]', + nextDay: '[Ыран] LT [Ñехетре]', + lastDay: '[Ĕнер] LT [Ñехетре]', + nextWeek: '[ÇитеÑ] dddd LT [Ñехетре]', + lastWeek: '[Иртнĕ] dddd LT [Ñехетре]', + sameElse: 'L' + }, + relativeTime : { + future : function (output) { + var affix = /Ñехет$/i.exec(output) ? 'рен' : /çул$/i.exec(output) ? 'тан' : 'ран'; + return output + affix; + }, + past : '%s каÑлла', + s : 'пĕр-ик çеккунт', + m : 'пĕр минут', + mm : '%d минут', + h : 'пĕр Ñехет', + hh : '%d Ñехет', + d : 'пĕр кун', + dd : '%d кун', + M : 'пĕр уйăх', + MM : '%d уйăх', + y : 'пĕр çул', + yy : '%d çул' + }, + ordinalParse: /\d{1,2}-мĕш/, + ordinal : '%d-мĕш', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Welsh (cy) +// author : Robert Allen + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('cy', { + months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'), + monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'), + weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'), + weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'), + weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'), + // time formats are the same as en-gb + longDateFormat: { + LT: 'HH:mm', + LTS : 'LT:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd, D MMMM YYYY LT' + }, + calendar: { + sameDay: '[Heddiw am] LT', + nextDay: '[Yfory am] LT', + nextWeek: 'dddd [am] LT', + lastDay: '[Ddoe am] LT', + lastWeek: 'dddd [diwethaf am] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'mewn %s', + past: '%s yn ôl', + s: 'ychydig eiliadau', + m: 'munud', + mm: '%d munud', + h: 'awr', + hh: '%d awr', + d: 'diwrnod', + dd: '%d diwrnod', + M: 'mis', + MM: '%d mis', + y: 'blwyddyn', + yy: '%d flynedd' + }, + ordinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/, + // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh + ordinal: function (number) { + var b = number, + output = '', + lookup = [ + '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed + 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed + ]; + + if (b > 20) { + if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) { + output = 'fed'; // not 30ain, 70ain or 90ain + } else { + output = 'ain'; + } + } else if (b > 0) { + output = lookup[b]; + } + + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : danish (da) +// author : Ulrik Nielsen : https://github.com/mrbase + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('da', { + months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), + weekdaysShort : 'søn_man_tir_ons_tor_fre_lør'.split('_'), + weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd [d.] D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[I dag kl.] LT', + nextDay : '[I morgen kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[I gÃ¥r kl.] LT', + lastWeek : '[sidste] dddd [kl] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'om %s', + past : '%s siden', + s : 'fÃ¥ sekunder', + m : 'et minut', + mm : '%d minutter', + h : 'en time', + hh : '%d timer', + d : 'en dag', + dd : '%d dage', + M : 'en mÃ¥ned', + MM : '%d mÃ¥neder', + y : 'et Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : austrian german (de-at) +// author : lluchs : https://github.com/lluchs +// author: Menelion Elensúle: https://github.com/Oire +// author : Martin Groller : https://github.com/MadMG + +(function (factory) { + factory(moment); +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + return moment.defineLocale('de-at', { + months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[Heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[Morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[Gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : german (de) +// author : lluchs : https://github.com/lluchs +// author: Menelion Elensúle: https://github.com/Oire + +(function (factory) { + factory(moment); +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + return moment.defineLocale('de', { + months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[Heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[Morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[Gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : modern greek (el) +// author : Aggelos Karalias : https://github.com/mehiel + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('el', { + monthsNominativeEl : 'ΙανουάÏιος_ΦεβÏουάÏιος_ΜάÏτιος_ΑπÏίλιος_Μάιος_ΙοÏνιος_ΙοÏλιος_ΑÏγουστος_ΣεπτέμβÏιος_ΟκτώβÏιος_ÎοέμβÏιος_ΔεκέμβÏιος'.split('_'), + monthsGenitiveEl : 'ΙανουαÏίου_ΦεβÏουαÏίου_ΜαÏτίου_ΑπÏιλίου_ΜαÎου_Ιουνίου_Ιουλίου_ΑυγοÏστου_ΣεπτεμβÏίου_ΟκτωβÏίου_ÎοεμβÏίου_ΔεκεμβÏίου'.split('_'), + months : function (momentToFormat, format) { + if (/D/.test(format.substring(0, format.indexOf('MMMM')))) { // if there is a day number before 'MMMM' + return this._monthsGenitiveEl[momentToFormat.month()]; + } else { + return this._monthsNominativeEl[momentToFormat.month()]; + } + }, + monthsShort : 'Ιαν_Φεβ_ΜαÏ_ΑπÏ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Îοε_Δεκ'.split('_'), + weekdays : 'ΚυÏιακή_ΔευτέÏα_ΤÏίτη_ΤετάÏτη_Πέμπτη_ΠαÏασκευή_Σάββατο'.split('_'), + weekdaysShort : 'ΚυÏ_Δευ_ΤÏι_Τετ_Πεμ_ΠαÏ_Σαβ'.split('_'), + weekdaysMin : 'Κυ_Δε_ΤÏ_Τε_Πε_Πα_Σα'.split('_'), + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'μμ' : 'ΜΜ'; + } else { + return isLower ? 'πμ' : 'ΠΜ'; + } + }, + isPM : function (input) { + return ((input + '').toLowerCase()[0] === 'μ'); + }, + meridiemParse : /[ΠΜ]\.?Îœ?\.?/i, + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendarEl : { + sameDay : '[ΣήμεÏα {}] LT', + nextDay : '[ΑÏÏιο {}] LT', + nextWeek : 'dddd [{}] LT', + lastDay : '[Χθες {}] LT', + lastWeek : function () { + switch (this.day()) { + case 6: + return '[το Ï€ÏοηγοÏμενο] dddd [{}] LT'; + default: + return '[την Ï€ÏοηγοÏμενη] dddd [{}] LT'; + } + }, + sameElse : 'L' + }, + calendar : function (key, mom) { + var output = this._calendarEl[key], + hours = mom && mom.hours(); + + if (typeof output === 'function') { + output = output.apply(mom); + } + + return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις')); + }, + relativeTime : { + future : 'σε %s', + past : '%s Ï€Ïιν', + s : 'λίγα δευτεÏόλεπτα', + m : 'ένα λεπτό', + mm : '%d λεπτά', + h : 'μία ÏŽÏα', + hh : '%d ÏŽÏες', + d : 'μία μέÏα', + dd : '%d μέÏες', + M : 'ένας μήνας', + MM : '%d μήνες', + y : 'ένας χÏόνος', + yy : '%d χÏόνια' + }, + ordinalParse: /\d{1,2}η/, + ordinal: '%dη', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : australian english (en-au) + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('en-au', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + 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' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : canadian english (en-ca) +// author : Jonathan Abourbih : https://github.com/jonbca + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('en-ca', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'YYYY-MM-DD', + LL : 'D MMMM, YYYY', + LLL : 'D MMMM, YYYY LT', + LLLL : 'dddd, D MMMM, YYYY LT' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + 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' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); +})); +// moment.js locale configuration +// locale : great britain english (en-gb) +// author : Chris Gedrim : https://github.com/chrisgedrim + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('en-gb', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + 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' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : esperanto (eo) +// author : Colin Dean : https://github.com/colindean +// komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko. +// Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni! + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('eo', { + months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aÅ­gusto_septembro_oktobro_novembro_decembro'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aÅ­g_sep_okt_nov_dec'.split('_'), + weekdays : 'Dimanĉo_Lundo_Mardo_Merkredo_Ä´aÅ­do_Vendredo_Sabato'.split('_'), + weekdaysShort : 'Dim_Lun_Mard_Merk_Ä´aÅ­_Ven_Sab'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Ä´a_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'D[-an de] MMMM, YYYY', + LLL : 'D[-an de] MMMM, YYYY LT', + LLLL : 'dddd, [la] D[-an de] MMMM, YYYY LT' + }, + meridiemParse: /[ap]\.t\.m/i, + isPM: function (input) { + return input.charAt(0).toLowerCase() === 'p'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'p.t.m.' : 'P.T.M.'; + } else { + return isLower ? 'a.t.m.' : 'A.T.M.'; + } + }, + calendar : { + sameDay : '[HodiaÅ­ je] LT', + nextDay : '[MorgaÅ­ je] LT', + nextWeek : 'dddd [je] LT', + lastDay : '[HieraÅ­ je] LT', + lastWeek : '[pasinta] dddd [je] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'je %s', + past : 'antaÅ­ %s', + s : 'sekundoj', + m : 'minuto', + mm : '%d minutoj', + h : 'horo', + hh : '%d horoj', + d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo + dd : '%d tagoj', + M : 'monato', + MM : '%d monatoj', + y : 'jaro', + yy : '%d jaroj' + }, + ordinalParse: /\d{1,2}a/, + ordinal : '%da', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : spanish (es) +// author : Julio Napurí : https://github.com/julionc + +(function (factory) { + factory(moment); +}(function (moment) { + var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), + monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); + + return moment.defineLocale('es', { + months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return monthsShort[m.month()]; + } else { + return monthsShortDot[m.month()]; + } + }, + weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), + weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), + weekdaysMin : 'Do_Lu_Ma_Mi_Ju_Vi_Sá'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY LT', + LLLL : 'dddd, D [de] MMMM [de] YYYY LT' + }, + calendar : { + sameDay : function () { + return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextDay : function () { + return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastDay : function () { + return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'hace %s', + s : 'unos segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'una hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un año', + yy : '%d años' + }, + ordinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : estonian (et) +// author : Henry Kehlmann : https://github.com/madhenry +// improvements : Illimar Tambek : https://github.com/ragulka + +(function (factory) { + factory(moment); +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'], + 'm' : ['ühe minuti', 'üks minut'], + 'mm': [number + ' minuti', number + ' minutit'], + 'h' : ['ühe tunni', 'tund aega', 'üks tund'], + 'hh': [number + ' tunni', number + ' tundi'], + 'd' : ['ühe päeva', 'üks päev'], + 'M' : ['kuu aja', 'kuu aega', 'üks kuu'], + 'MM': [number + ' kuu', number + ' kuud'], + 'y' : ['ühe aasta', 'aasta', 'üks aasta'], + 'yy': [number + ' aasta', number + ' aastat'] + }; + if (withoutSuffix) { + return format[key][2] ? format[key][2] : format[key][1]; + } + return isFuture ? format[key][0] : format[key][1]; + } + + return moment.defineLocale('et', { + months : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'), + monthsShort : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'), + weekdays : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'), + weekdaysShort : 'P_E_T_K_N_R_L'.split('_'), + weekdaysMin : 'P_E_T_K_N_R_L'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[Täna,] LT', + nextDay : '[Homme,] LT', + nextWeek : '[Järgmine] dddd LT', + lastDay : '[Eile,] LT', + lastWeek : '[Eelmine] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s pärast', + past : '%s tagasi', + s : processRelativeTime, + m : processRelativeTime, + mm : processRelativeTime, + h : processRelativeTime, + hh : processRelativeTime, + d : processRelativeTime, + dd : '%d päeva', + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : euskara (eu) +// author : Eneko Illarramendi : https://github.com/eillarra + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('eu', { + months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'), + monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'), + weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'), + weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'), + weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY[ko] MMMM[ren] D[a]', + LLL : 'YYYY[ko] MMMM[ren] D[a] LT', + LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] LT', + l : 'YYYY-M-D', + ll : 'YYYY[ko] MMM D[a]', + lll : 'YYYY[ko] MMM D[a] LT', + llll : 'ddd, YYYY[ko] MMM D[a] LT' + }, + calendar : { + sameDay : '[gaur] LT[etan]', + nextDay : '[bihar] LT[etan]', + nextWeek : 'dddd LT[etan]', + lastDay : '[atzo] LT[etan]', + lastWeek : '[aurreko] dddd LT[etan]', + sameElse : 'L' + }, + relativeTime : { + future : '%s barru', + past : 'duela %s', + s : 'segundo batzuk', + m : 'minutu bat', + mm : '%d minutu', + h : 'ordu bat', + hh : '%d ordu', + d : 'egun bat', + dd : '%d egun', + M : 'hilabete bat', + MM : '%d hilabete', + y : 'urte bat', + yy : '%d urte' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Persian (fa) +// author : Ebrahim Byagowi : https://github.com/ebraminio + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': 'Û±', + '2': 'Û²', + '3': 'Û³', + '4': 'Û´', + '5': 'Ûµ', + '6': 'Û¶', + '7': 'Û·', + '8': 'Û¸', + '9': 'Û¹', + '0': 'Û°' + }, numberMap = { + 'Û±': '1', + 'Û²': '2', + 'Û³': '3', + 'Û´': '4', + 'Ûµ': '5', + 'Û¶': '6', + 'Û·': '7', + 'Û¸': '8', + 'Û¹': '9', + 'Û°': '0' + }; + + return moment.defineLocale('fa', { + months : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + monthsShort : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysMin : 'ÛŒ_د_س_Ú†_Ù¾_ج_Ø´'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + meridiemParse: /قبل از ظهر|بعد از ظهر/, + isPM: function (input) { + return /بعد از ظهر/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'قبل از ظهر'; + } else { + return 'بعد از ظهر'; + } + }, + calendar : { + sameDay : '[امروز ساعت] LT', + nextDay : '[Ùردا ساعت] LT', + nextWeek : 'dddd [ساعت] LT', + lastDay : '[دیروز ساعت] LT', + lastWeek : 'dddd [پیش] [ساعت] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'در %s', + past : '%s پیش', + s : 'چندین ثانیه', + m : 'یک دقیقه', + mm : '%d دقیقه', + h : 'یک ساعت', + hh : '%d ساعت', + d : 'یک روز', + dd : '%d روز', + M : 'یک ماه', + MM : '%d ماه', + y : 'یک سال', + yy : '%d سال' + }, + preparse: function (string) { + return string.replace(/[Û°-Û¹]/g, function (match) { + return numberMap[match]; + }).replace(/ØŒ/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, 'ØŒ'); + }, + ordinalParse: /\d{1,2}Ù…/, + ordinal : '%dÙ…', + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : finnish (fi) +// author : Tarmo Aidantausta : https://github.com/bleadof + +(function (factory) { + factory(moment); +}(function (moment) { + var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '), + numbersFuture = [ + 'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden', + numbersPast[7], numbersPast[8], numbersPast[9] + ]; + + function translate(number, withoutSuffix, key, isFuture) { + var result = ''; + switch (key) { + case 's': + return isFuture ? 'muutaman sekunnin' : 'muutama sekunti'; + case 'm': + return isFuture ? 'minuutin' : 'minuutti'; + case 'mm': + result = isFuture ? 'minuutin' : 'minuuttia'; + break; + case 'h': + return isFuture ? 'tunnin' : 'tunti'; + case 'hh': + result = isFuture ? 'tunnin' : 'tuntia'; + break; + case 'd': + return isFuture ? 'päivän' : 'päivä'; + case 'dd': + result = isFuture ? 'päivän' : 'päivää'; + break; + case 'M': + return isFuture ? 'kuukauden' : 'kuukausi'; + case 'MM': + result = isFuture ? 'kuukauden' : 'kuukautta'; + break; + case 'y': + return isFuture ? 'vuoden' : 'vuosi'; + case 'yy': + result = isFuture ? 'vuoden' : 'vuotta'; + break; + } + result = verbalNumber(number, isFuture) + ' ' + result; + return result; + } + + function verbalNumber(number, isFuture) { + return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number; + } + + return moment.defineLocale('fi', { + months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'), + monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'), + weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'), + weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'), + weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD.MM.YYYY', + LL : 'Do MMMM[ta] YYYY', + LLL : 'Do MMMM[ta] YYYY, [klo] LT', + LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] LT', + l : 'D.M.YYYY', + ll : 'Do MMM YYYY', + lll : 'Do MMM YYYY, [klo] LT', + llll : 'ddd, Do MMM YYYY, [klo] LT' + }, + calendar : { + sameDay : '[tänään] [klo] LT', + nextDay : '[huomenna] [klo] LT', + nextWeek : 'dddd [klo] LT', + lastDay : '[eilen] [klo] LT', + lastWeek : '[viime] dddd[na] [klo] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s päästä', + past : '%s sitten', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : faroese (fo) +// author : Ragnar Johannesen : https://github.com/ragnar123 + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('fo', { + months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'), + weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'), + weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D. MMMM, YYYY LT' + }, + calendar : { + sameDay : '[à dag kl.] LT', + nextDay : '[à morgin kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[à gjár kl.] LT', + lastWeek : '[síðstu] dddd [kl] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'um %s', + past : '%s síðani', + s : 'fá sekund', + m : 'ein minutt', + mm : '%d minuttir', + h : 'ein tími', + hh : '%d tímar', + d : 'ein dagur', + dd : '%d dagar', + M : 'ein mánaði', + MM : '%d mánaðir', + y : 'eitt ár', + yy : '%d ár' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : canadian french (fr-ca) +// author : Jonathan Abourbih : https://github.com/jonbca + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('fr-ca', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Aujourd\'hui à] LT', + nextDay: '[Demain à] LT', + nextWeek: 'dddd [à] LT', + lastDay: '[Hier à] LT', + lastWeek: 'dddd [dernier à] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + ordinalParse: /\d{1,2}(er|)/, + ordinal : function (number) { + return number + (number === 1 ? 'er' : ''); + } + }); +})); +// moment.js locale configuration +// locale : french (fr) +// author : John Fischer : https://github.com/jfroffice + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('fr', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Aujourd\'hui à] LT', + nextDay: '[Demain à] LT', + nextWeek: 'dddd [à] LT', + lastDay: '[Hier à] LT', + lastWeek: 'dddd [dernier à] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + ordinalParse: /\d{1,2}(er|)/, + ordinal : function (number) { + return number + (number === 1 ? 'er' : ''); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : frisian (fy) +// author : Robin van der Vliet : https://github.com/robin0van0der0v + +(function (factory) { + factory(moment); +}(function (moment) { + var monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'); + + return moment.defineLocale('fy', { + months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'), + weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'), + weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[hjoed om] LT', + nextDay: '[moarn om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[juster om] LT', + lastWeek: '[ôfrûne] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'oer %s', + past : '%s lyn', + s : 'in pear sekonden', + m : 'ien minút', + mm : '%d minuten', + h : 'ien oere', + hh : '%d oeren', + d : 'ien dei', + dd : '%d dagen', + M : 'ien moanne', + MM : '%d moannen', + y : 'ien jier', + yy : '%d jierren' + }, + ordinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : galician (gl) +// author : Juan G. Hurtado : https://github.com/juanghurtado + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('gl', { + months : 'Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro'.split('_'), + monthsShort : 'Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.'.split('_'), + weekdays : 'Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado'.split('_'), + weekdaysShort : 'Dom._Lun._Mar._Mér._Xov._Ven._Sáb.'.split('_'), + weekdaysMin : 'Do_Lu_Ma_Mé_Xo_Ve_Sá'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay : function () { + return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextDay : function () { + return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextWeek : function () { + return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + lastDay : function () { + return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT'; + }, + lastWeek : function () { + return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : function (str) { + if (str === 'uns segundos') { + return 'nuns segundos'; + } + return 'en ' + str; + }, + past : 'hai %s', + s : 'uns segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'unha hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un ano', + yy : '%d anos' + }, + ordinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Hebrew (he) +// author : Tomer Cohen : https://github.com/tomer +// author : Moshe Simantov : https://github.com/DevelopmentIL +// author : Tal Ater : https://github.com/TalAter + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('he', { + months : 'ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר'.split('_'), + monthsShort : 'ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳'.split('_'), + weekdays : 'ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'), + weekdaysShort : '×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'), + weekdaysMin : '×_ב_×’_ד_×”_ו_ש'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [ב]MMMM YYYY', + LLL : 'D [ב]MMMM YYYY LT', + LLLL : 'dddd, D [ב]MMMM YYYY LT', + l : 'D/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY LT', + llll : 'ddd, D MMM YYYY LT' + }, + calendar : { + sameDay : '[×”×™×•× ×‘Ö¾]LT', + nextDay : '[מחר ב־]LT', + nextWeek : 'dddd [בשעה] LT', + lastDay : '[×תמול ב־]LT', + lastWeek : '[ביו×] dddd [×”×חרון בשעה] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'בעוד %s', + past : 'לפני %s', + s : 'מספר שניות', + m : 'דקה', + mm : '%d דקות', + h : 'שעה', + hh : function (number) { + if (number === 2) { + return 'שעתיי×'; + } + return number + ' שעות'; + }, + d : 'יו×', + dd : function (number) { + if (number === 2) { + return 'יומיי×'; + } + return number + ' ימי×'; + }, + M : 'חודש', + MM : function (number) { + if (number === 2) { + return 'חודשיי×'; + } + return number + ' חודשי×'; + }, + y : 'שנה', + yy : function (number) { + if (number === 2) { + return 'שנתיי×'; + } else if (number % 10 === 0 && number !== 10) { + return number + ' שנה'; + } + return number + ' שני×'; + } + } + }); +})); +// moment.js locale configuration +// locale : hindi (hi) +// author : Mayank Singhal : https://github.com/mayanksinghal + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.defineLocale('hi', { + months : 'जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°'.split('_'), + monthsShort : 'जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.'.split('_'), + weekdays : 'रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split('_'), + weekdaysShort : 'रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split('_'), + weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split('_'), + longDateFormat : { + LT : 'A h:mm बजे', + LTS : 'A h:mm:ss बजे', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[कल] LT', + nextWeek : 'dddd, LT', + lastDay : '[कल] LT', + lastWeek : '[पिछले] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s में', + past : '%s पहले', + s : 'कà¥à¤› ही कà¥à¤·à¤£', + m : 'à¤à¤• मिनट', + mm : '%d मिनट', + h : 'à¤à¤• घंटा', + hh : '%d घंटे', + d : 'à¤à¤• दिन', + dd : '%d दिन', + M : 'à¤à¤• महीने', + MM : '%d महीने', + y : 'à¤à¤• वरà¥à¤·', + yy : '%d वरà¥à¤·' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + // Hindi notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi. + meridiemParse: /रात|सà¥à¤¬à¤¹|दोपहर|शाम/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'रात') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'सà¥à¤¬à¤¹') { + return hour; + } else if (meridiem === 'दोपहर') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'शाम') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'रात'; + } else if (hour < 10) { + return 'सà¥à¤¬à¤¹'; + } else if (hour < 17) { + return 'दोपहर'; + } else if (hour < 20) { + return 'शाम'; + } else { + return 'रात'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : hrvatski (hr) +// author : Bojan Marković : https://github.com/bmarkovic + +// based on (sl) translation by Robert SedovÅ¡ek + +(function (factory) { + factory(moment); +}(function (moment) { + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } + } + + return moment.defineLocale('hr', { + months : 'sjeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_'), + monthsShort : 'sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'), + weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota'.split('_'), + weekdaysShort : 'ned._pon._uto._sri._Äet._pet._sub.'.split('_'), + weekdaysMin : 'ne_po_ut_sr_Äe_pe_su'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD. MM. YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[proÅ¡lu] dddd [u] LT'; + case 6: + return '[proÅ¡le] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[proÅ¡li] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'par sekundi', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'dan', + dd : translate, + M : 'mjesec', + MM : translate, + y : 'godinu', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : hungarian (hu) +// author : Adam Brunner : https://github.com/adambrunner + +(function (factory) { + factory(moment); +}(function (moment) { + var weekEndings = 'vasárnap hétfÅ‘n kedden szerdán csütörtökön pénteken szombaton'.split(' '); + + function translate(number, withoutSuffix, key, isFuture) { + var num = number, + suffix; + + switch (key) { + case 's': + return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce'; + case 'm': + return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'mm': + return num + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'h': + return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'hh': + return num + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'd': + return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'dd': + return num + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'M': + return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'MM': + return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'y': + return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve'); + case 'yy': + return num + (isFuture || withoutSuffix ? ' év' : ' éve'); + } + + return ''; + } + + function week(isFuture) { + return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]'; + } + + return moment.defineLocale('hu', { + months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'), + monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'), + weekdays : 'vasárnap_hétfÅ‘_kedd_szerda_csütörtök_péntek_szombat'.split('_'), + weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'), + weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'YYYY.MM.DD.', + LL : 'YYYY. MMMM D.', + LLL : 'YYYY. MMMM D., LT', + LLLL : 'YYYY. MMMM D., dddd LT' + }, + meridiemParse: /de|du/i, + isPM: function (input) { + return input.charAt(1).toLowerCase() === 'u'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower === true ? 'de' : 'DE'; + } else { + return isLower === true ? 'du' : 'DU'; + } + }, + calendar : { + sameDay : '[ma] LT[-kor]', + nextDay : '[holnap] LT[-kor]', + nextWeek : function () { + return week.call(this, true); + }, + lastDay : '[tegnap] LT[-kor]', + lastWeek : function () { + return week.call(this, false); + }, + sameElse : 'L' + }, + relativeTime : { + future : '%s múlva', + past : '%s', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Armenian (hy-am) +// author : Armendarabyan : https://github.com/armendarabyan + +(function (factory) { + factory(moment); +}(function (moment) { + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€_Õ´Õ¡Ö€Õ¿_Õ¡ÕºÖ€Õ«Õ¬_Õ´Õ¡ÕµÕ«Õ½_Õ°Õ¸Ö‚Õ¶Õ«Õ½_Õ°Õ¸Ö‚Õ¬Õ«Õ½_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€'.split('_'), + 'accusative': 'Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€Õ«_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€Õ«_Õ´Õ¡Ö€Õ¿Õ«_Õ¡ÕºÖ€Õ«Õ¬Õ«_Õ´Õ¡ÕµÕ«Õ½Õ«_Õ°Õ¸Ö‚Õ¶Õ«Õ½Õ«_Õ°Õ¸Ö‚Õ¬Õ«Õ½Õ«_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½Õ«_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function monthsShortCaseReplace(m, format) { + var monthsShort = 'Õ°Õ¶Õ¾_ÖƒÕ¿Ö€_Õ´Ö€Õ¿_Õ¡ÕºÖ€_Õ´ÕµÕ½_Õ°Õ¶Õ½_Õ°Õ¬Õ½_Ö…Õ£Õ½_Õ½ÕºÕ¿_Õ°Õ¯Õ¿_Õ¶Õ´Õ¢_Õ¤Õ¯Õ¿'.split('_'); + + return monthsShort[m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = 'Õ¯Õ«Ö€Õ¡Õ¯Õ«_Õ¥Ö€Õ¯Õ¸Ö‚Õ·Õ¡Õ¢Õ©Õ«_Õ¥Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ¹Õ¸Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ°Õ«Õ¶Õ£Õ·Õ¡Õ¢Õ©Õ«_Õ¸Ö‚Ö€Õ¢Õ¡Õ©_Õ·Õ¡Õ¢Õ¡Õ©'.split('_'); + + return weekdays[m.day()]; + } + + return moment.defineLocale('hy-am', { + months : monthsCaseReplace, + monthsShort : monthsShortCaseReplace, + weekdays : weekdaysCaseReplace, + weekdaysShort : 'Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©'.split('_'), + weekdaysMin : 'Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY Õ©.', + LLL : 'D MMMM YYYY Õ©., LT', + LLLL : 'dddd, D MMMM YYYY Õ©., LT' + }, + calendar : { + sameDay: '[Õ¡ÕµÕ½Ö…Ö€] LT', + nextDay: '[Õ¾Õ¡Õ²Õ¨] LT', + lastDay: '[Õ¥Ö€Õ¥Õ¯] LT', + nextWeek: function () { + return 'dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT'; + }, + lastWeek: function () { + return '[Õ¡Õ¶ÖÕ¡Õ®] dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT'; + }, + sameElse: 'L' + }, + relativeTime : { + future : '%s Õ°Õ¥Õ¿Õ¸', + past : '%s Õ¡Õ¼Õ¡Õ»', + s : 'Õ´Õ« Ö„Õ¡Õ¶Õ« Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶', + m : 'Ö€Õ¸ÕºÕ¥', + mm : '%d Ö€Õ¸ÕºÕ¥', + h : 'ÕªÕ¡Õ´', + hh : '%d ÕªÕ¡Õ´', + d : 'Ö…Ö€', + dd : '%d Ö…Ö€', + M : 'Õ¡Õ´Õ«Õ½', + MM : '%d Õ¡Õ´Õ«Õ½', + y : 'Õ¿Õ¡Ö€Õ«', + yy : '%d Õ¿Õ¡Ö€Õ«' + }, + + meridiemParse: /Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡|Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡|ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶/, + isPM: function (input) { + return /^(ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶)$/.test(input); + }, + meridiem : function (hour) { + if (hour < 4) { + return 'Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡'; + } else if (hour < 12) { + return 'Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡'; + } else if (hour < 17) { + return 'ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡'; + } else { + return 'Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶'; + } + }, + + ordinalParse: /\d{1,2}|\d{1,2}-(Õ«Õ¶|Ö€Õ¤)/, + ordinal: function (number, period) { + switch (period) { + case 'DDD': + case 'w': + case 'W': + case 'DDDo': + if (number === 1) { + return number + '-Õ«Õ¶'; + } + return number + '-Ö€Õ¤'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Bahasa Indonesia (id) +// author : Mohammad Satrio Utomo : https://github.com/tyok +// reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('id', { + months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'), + weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'), + weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'LT.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] LT', + LLLL : 'dddd, D MMMM YYYY [pukul] LT' + }, + meridiemParse: /pagi|siang|sore|malam/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'siang') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'sore' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'siang'; + } else if (hours < 19) { + return 'sore'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Besok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kemarin pukul] LT', + lastWeek : 'dddd [lalu pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lalu', + s : 'beberapa detik', + m : 'semenit', + mm : '%d menit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : icelandic (is) +// author : Hinrik Örn Sigurðsson : https://github.com/hinrik + +(function (factory) { + factory(moment); +}(function (moment) { + function plural(n) { + if (n % 100 === 11) { + return true; + } else if (n % 10 === 1) { + return false; + } + return true; + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': + return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum'; + case 'm': + return withoutSuffix ? 'mínúta' : 'mínútu'; + case 'mm': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum'); + } else if (withoutSuffix) { + return result + 'mínúta'; + } + return result + 'mínútu'; + case 'hh': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum'); + } + return result + 'klukkustund'; + case 'd': + if (withoutSuffix) { + return 'dagur'; + } + return isFuture ? 'dag' : 'degi'; + case 'dd': + if (plural(number)) { + if (withoutSuffix) { + return result + 'dagar'; + } + return result + (isFuture ? 'daga' : 'dögum'); + } else if (withoutSuffix) { + return result + 'dagur'; + } + return result + (isFuture ? 'dag' : 'degi'); + case 'M': + if (withoutSuffix) { + return 'mánuður'; + } + return isFuture ? 'mánuð' : 'mánuði'; + case 'MM': + if (plural(number)) { + if (withoutSuffix) { + return result + 'mánuðir'; + } + return result + (isFuture ? 'mánuði' : 'mánuðum'); + } else if (withoutSuffix) { + return result + 'mánuður'; + } + return result + (isFuture ? 'mánuð' : 'mánuði'); + case 'y': + return withoutSuffix || isFuture ? 'ár' : 'ári'; + case 'yy': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'ár' : 'árum'); + } + return result + (withoutSuffix || isFuture ? 'ár' : 'ári'); + } + } + + return moment.defineLocale('is', { + months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'), + weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'), + weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'), + weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] LT', + LLLL : 'dddd, D. MMMM YYYY [kl.] LT' + }, + calendar : { + sameDay : '[í dag kl.] LT', + nextDay : '[á morgun kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[í gær kl.] LT', + lastWeek : '[síðasta] dddd [kl.] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'eftir %s', + past : 'fyrir %s síðan', + s : translate, + m : translate, + mm : translate, + h : 'klukkustund', + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : italian (it) +// author : Lorenzo : https://github.com/aliem +// author: Mattia Larentis: https://github.com/nostalgiaz + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('it', { + months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'), + monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'), + weekdays : 'Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato'.split('_'), + weekdaysShort : 'Dom_Lun_Mar_Mer_Gio_Ven_Sab'.split('_'), + weekdaysMin : 'D_L_Ma_Me_G_V_S'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Oggi alle] LT', + nextDay: '[Domani alle] LT', + nextWeek: 'dddd [alle] LT', + lastDay: '[Ieri alle] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[la scorsa] dddd [alle] LT'; + default: + return '[lo scorso] dddd [alle] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : function (s) { + return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s; + }, + past : '%s fa', + s : 'alcuni secondi', + m : 'un minuto', + mm : '%d minuti', + h : 'un\'ora', + hh : '%d ore', + d : 'un giorno', + dd : '%d giorni', + M : 'un mese', + MM : '%d mesi', + y : 'un anno', + yy : '%d anni' + }, + ordinalParse : /\d{1,2}º/, + ordinal: '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : japanese (ja) +// author : LI Long : https://github.com/baryon + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('ja', { + months : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '日曜日_月曜日_ç«æ›œæ—¥_水曜日_木曜日_金曜日_土曜日'.split('_'), + weekdaysShort : 'æ—¥_月_ç«_æ°´_木_金_土'.split('_'), + weekdaysMin : 'æ—¥_月_ç«_æ°´_木_金_土'.split('_'), + longDateFormat : { + LT : 'Ah時m分', + LTS : 'LTs秒', + L : 'YYYY/MM/DD', + LL : 'YYYYå¹´M月Dæ—¥', + LLL : 'YYYYå¹´M月Dæ—¥LT', + LLLL : 'YYYYå¹´M月Dæ—¥LT dddd' + }, + meridiemParse: /åˆå‰|åˆå¾Œ/i, + isPM : function (input) { + return input === 'åˆå¾Œ'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'åˆå‰'; + } else { + return 'åˆå¾Œ'; + } + }, + calendar : { + sameDay : '[今日] LT', + nextDay : '[明日] LT', + nextWeek : '[æ¥é€±]dddd LT', + lastDay : '[昨日] LT', + lastWeek : '[å‰é€±]dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s後', + past : '%så‰', + s : '数秒', + m : '1分', + mm : '%d分', + h : '1時間', + hh : '%d時間', + d : '1æ—¥', + dd : '%dæ—¥', + M : '1ヶ月', + MM : '%dヶ月', + y : '1å¹´', + yy : '%då¹´' + } + }); +})); +// moment.js locale configuration +// locale : Georgian (ka) +// author : Irakli Janiashvili : https://github.com/irakli-janiashvili + +(function (factory) { + factory(moment); +}(function (moment) { + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'იáƒáƒœáƒ•áƒáƒ áƒ˜_თებერვáƒáƒšáƒ˜_მáƒáƒ áƒ¢áƒ˜_áƒáƒžáƒ áƒ˜áƒšáƒ˜_მáƒáƒ˜áƒ¡áƒ˜_ივნისი_ივლისი_áƒáƒ’ვისტáƒ_სექტემბერი_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი_ნáƒáƒ”მბერი_დეკემბერი'.split('_'), + 'accusative': 'იáƒáƒœáƒ•áƒáƒ áƒ¡_თებერვáƒáƒšáƒ¡_მáƒáƒ áƒ¢áƒ¡_áƒáƒžáƒ áƒ˜áƒšáƒ˜áƒ¡_მáƒáƒ˜áƒ¡áƒ¡_ივნისს_ივლისს_áƒáƒ’ვისტს_სექტემბერს_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერს_ნáƒáƒ”მბერს_დეკემბერს'.split('_') + }, + + nounCase = (/D[oD] *MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'კვირáƒ_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ი_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი_ხუთშáƒáƒ‘áƒáƒ—ი_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი_შáƒáƒ‘áƒáƒ—ი'.split('_'), + 'accusative': 'კვირáƒáƒ¡_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ს_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ს_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ს_ხუთშáƒáƒ‘áƒáƒ—ს_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვს_შáƒáƒ‘áƒáƒ—ს'.split('_') + }, + + nounCase = (/(წინáƒ|შემდეგ)/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.defineLocale('ka', { + months : monthsCaseReplace, + monthsShort : 'იáƒáƒœ_თებ_მáƒáƒ _áƒáƒžáƒ _მáƒáƒ˜_ივნ_ივლ_áƒáƒ’ვ_სექ_áƒáƒ¥áƒ¢_ნáƒáƒ”_დეკ'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'კვი_áƒáƒ áƒ¨_სáƒáƒ›_áƒáƒ—ხ_ხუთ_პáƒáƒ _შáƒáƒ‘'.split('_'), + weekdaysMin : 'კვ_áƒáƒ _სáƒ_áƒáƒ—_ხუ_პáƒ_შáƒ'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[დღეს] LT[-ზე]', + nextDay : '[ხვáƒáƒš] LT[-ზე]', + lastDay : '[გუშინ] LT[-ზე]', + nextWeek : '[შემდეგ] dddd LT[-ზე]', + lastWeek : '[წინáƒ] dddd LT-ზე', + sameElse : 'L' + }, + relativeTime : { + future : function (s) { + return (/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|წელი)/).test(s) ? + s.replace(/ი$/, 'ში') : + s + 'ში'; + }, + past : function (s) { + if ((/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|დღე|თვე)/).test(s)) { + return s.replace(/(ი|ე)$/, 'ის წინ'); + } + if ((/წელი/).test(s)) { + return s.replace(/წელი$/, 'წლის წინ'); + } + }, + s : 'რáƒáƒ›áƒ“ენიმე წáƒáƒ›áƒ˜', + m : 'წუთი', + mm : '%d წუთი', + h : 'სáƒáƒáƒ—ი', + hh : '%d სáƒáƒáƒ—ი', + d : 'დღე', + dd : '%d დღე', + M : 'თვე', + MM : '%d თვე', + y : 'წელი', + yy : '%d წელი' + }, + ordinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/, + ordinal : function (number) { + if (number === 0) { + return number; + } + + if (number === 1) { + return number + '-ლი'; + } + + if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) { + return 'მე-' + number; + } + + return number + '-ე'; + }, + week : { + dow : 1, + doy : 7 + } + }); +})); +// moment.js locale configuration +// locale : khmer (km) +// author : Kruy Vanna : https://github.com/kruyvanna + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('km', { + months: 'មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ'.split('_'), + monthsShort: 'មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ'.split('_'), + weekdays: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), + weekdaysShort: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), + weekdaysMin: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS : 'LT:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd, D MMMM YYYY LT' + }, + calendar: { + sameDay: '[ážáŸ’ងៃនៈ ម៉ោង] LT', + nextDay: '[ស្អែក ម៉ោង] LT', + nextWeek: 'dddd [ម៉ោង] LT', + lastDay: '[ម្សិលមិញ ម៉ោង] LT', + lastWeek: 'dddd [សប្ážáž¶áž áŸáž˜áž»áž“] [ម៉ោង] LT', + sameElse: 'L' + }, + relativeTime: { + future: '%sទៀáž', + past: '%sមុន', + s: 'ប៉ុន្មានវិនាទី', + m: 'មួយនាទី', + mm: '%d នាទី', + h: 'មួយម៉ោង', + hh: '%d ម៉ោង', + d: 'មួយážáŸ’ងៃ', + dd: '%d ážáŸ’ងៃ', + M: 'មួយážáŸ‚', + MM: '%d ážáŸ‚', + y: 'មួយឆ្នាំ', + yy: '%d ឆ្នាំ' + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : korean (ko) +// +// authors +// +// - Kyungwook, Park : https://github.com/kyungw00k +// - Jeeeyul Lee +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('ko', { + months : '1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”'.split('_'), + monthsShort : '1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”'.split('_'), + weekdays : 'ì¼ìš”ì¼_월요ì¼_화요ì¼_수요ì¼_목요ì¼_금요ì¼_토요ì¼'.split('_'), + weekdaysShort : 'ì¼_ì›”_í™”_수_목_금_토'.split('_'), + weekdaysMin : 'ì¼_ì›”_í™”_수_목_금_토'.split('_'), + longDateFormat : { + LT : 'A hì‹œ m분', + LTS : 'A hì‹œ m분 sì´ˆ', + L : 'YYYY.MM.DD', + LL : 'YYYYë…„ MMMM Dì¼', + LLL : 'YYYYë…„ MMMM Dì¼ LT', + LLLL : 'YYYYë…„ MMMM Dì¼ dddd LT' + }, + calendar : { + sameDay : '오늘 LT', + nextDay : 'ë‚´ì¼ LT', + nextWeek : 'dddd LT', + lastDay : 'ì–´ì œ LT', + lastWeek : '지난주 dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s 후', + past : '%s ì „', + s : '몇초', + ss : '%dì´ˆ', + m : 'ì¼ë¶„', + mm : '%d분', + h : '한시간', + hh : '%d시간', + d : '하루', + dd : '%dì¼', + M : '한달', + MM : '%d달', + y : 'ì¼ë…„', + yy : '%dë…„' + }, + ordinalParse : /\d{1,2}ì¼/, + ordinal : '%dì¼', + meridiemParse : /오전|오후/, + isPM : function (token) { + return token === '오후'; + }, + meridiem : function (hour, minute, isUpper) { + return hour < 12 ? '오전' : '오후'; + } + }); +})); +// moment.js locale configuration +// locale : Luxembourgish (lb) +// author : mweimerskirch : https://github.com/mweimerskirch, David Raison : https://github.com/kwisatz + +// Note: Luxembourgish has a very particular phonological rule ('Eifeler Regel') that causes the +// deletion of the final 'n' in certain contexts. That's what the 'eifelerRegelAppliesToWeekday' +// and 'eifelerRegelAppliesToNumber' methods are meant for + +(function (factory) { + factory(moment); +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eng Minutt', 'enger Minutt'], + 'h': ['eng Stonn', 'enger Stonn'], + 'd': ['een Dag', 'engem Dag'], + 'M': ['ee Mount', 'engem Mount'], + 'y': ['ee Joer', 'engem Joer'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + function processFutureTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'a ' + string; + } + return 'an ' + string; + } + + function processPastTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'viru ' + string; + } + return 'virun ' + string; + } + + /** + * Returns true if the word before the given number loses the '-n' ending. + * e.g. 'an 10 Deeg' but 'a 5 Deeg' + * + * @param number {integer} + * @returns {boolean} + */ + function eifelerRegelAppliesToNumber(number) { + number = parseInt(number, 10); + if (isNaN(number)) { + return false; + } + if (number < 0) { + // Negative Number --> always true + return true; + } else if (number < 10) { + // Only 1 digit + if (4 <= number && number <= 7) { + return true; + } + return false; + } else if (number < 100) { + // 2 digits + var lastDigit = number % 10, firstDigit = number / 10; + if (lastDigit === 0) { + return eifelerRegelAppliesToNumber(firstDigit); + } + return eifelerRegelAppliesToNumber(lastDigit); + } else if (number < 10000) { + // 3 or 4 digits --> recursively check first digit + while (number >= 10) { + number = number / 10; + } + return eifelerRegelAppliesToNumber(number); + } else { + // Anything larger than 4 digits: recursively check first n-3 digits + number = number / 1000; + return eifelerRegelAppliesToNumber(number); + } + } + + return moment.defineLocale('lb', { + months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'), + weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'), + weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'), + longDateFormat: { + LT: 'H:mm [Auer]', + LTS: 'H:mm:ss [Auer]', + L: 'DD.MM.YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY LT', + LLLL: 'dddd, D. MMMM YYYY LT' + }, + calendar: { + sameDay: '[Haut um] LT', + sameElse: 'L', + nextDay: '[Muer um] LT', + nextWeek: 'dddd [um] LT', + lastDay: '[Gëschter um] LT', + lastWeek: function () { + // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule + switch (this.day()) { + case 2: + case 4: + return '[Leschten] dddd [um] LT'; + default: + return '[Leschte] dddd [um] LT'; + } + } + }, + relativeTime : { + future : processFutureTime, + past : processPastTime, + s : 'e puer Sekonnen', + m : processRelativeTime, + mm : '%d Minutten', + h : processRelativeTime, + hh : '%d Stonnen', + d : processRelativeTime, + dd : '%d Deeg', + M : processRelativeTime, + MM : '%d Méint', + y : processRelativeTime, + yy : '%d Joer' + }, + ordinalParse: /\d{1,2}\./, + ordinal: '%d.', + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Lithuanian (lt) +// author : Mindaugas MozÅ«ras : https://github.com/mmozuras + +(function (factory) { + factory(moment); +}(function (moment) { + var units = { + 'm' : 'minutÄ—_minutÄ—s_minutÄ™', + 'mm': 'minutÄ—s_minuÄių_minutes', + 'h' : 'valanda_valandos_valandÄ…', + 'hh': 'valandos_valandų_valandas', + 'd' : 'diena_dienos_dienÄ…', + 'dd': 'dienos_dienų_dienas', + 'M' : 'mÄ—nuo_mÄ—nesio_mÄ—nesį', + 'MM': 'mÄ—nesiai_mÄ—nesių_mÄ—nesius', + 'y' : 'metai_metų_metus', + 'yy': 'metai_metų_metus' + }, + weekDays = 'sekmadienis_pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis'.split('_'); + + function translateSeconds(number, withoutSuffix, key, isFuture) { + if (withoutSuffix) { + return 'kelios sekundÄ—s'; + } else { + return isFuture ? 'kelių sekundžių' : 'kelias sekundes'; + } + } + + function translateSingular(number, withoutSuffix, key, isFuture) { + return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]); + } + + function special(number) { + return number % 10 === 0 || (number > 10 && number < 20); + } + + function forms(key) { + return units[key].split('_'); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + if (number === 1) { + return result + translateSingular(number, withoutSuffix, key[0], isFuture); + } else if (withoutSuffix) { + return result + (special(number) ? forms(key)[1] : forms(key)[0]); + } else { + if (isFuture) { + return result + forms(key)[1]; + } else { + return result + (special(number) ? forms(key)[1] : forms(key)[2]); + } + } + } + + function relativeWeekDay(moment, format) { + var nominative = format.indexOf('dddd HH:mm') === -1, + weekDay = weekDays[moment.day()]; + + return nominative ? weekDay : weekDay.substring(0, weekDay.length - 2) + 'į'; + } + + return moment.defineLocale('lt', { + months : 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio'.split('_'), + monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'), + weekdays : relativeWeekDay, + weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Å eÅ¡'.split('_'), + weekdaysMin : 'S_P_A_T_K_Pn_Å '.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY [m.] MMMM D [d.]', + LLL : 'YYYY [m.] MMMM D [d.], LT [val.]', + LLLL : 'YYYY [m.] MMMM D [d.], dddd, LT [val.]', + l : 'YYYY-MM-DD', + ll : 'YYYY [m.] MMMM D [d.]', + lll : 'YYYY [m.] MMMM D [d.], LT [val.]', + llll : 'YYYY [m.] MMMM D [d.], ddd, LT [val.]' + }, + calendar : { + sameDay : '[Å iandien] LT', + nextDay : '[Rytoj] LT', + nextWeek : 'dddd LT', + lastDay : '[Vakar] LT', + lastWeek : '[PraÄ—jusį] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : 'po %s', + past : 'prieÅ¡ %s', + s : translateSeconds, + m : translateSingular, + mm : translate, + h : translateSingular, + hh : translate, + d : translateSingular, + dd : translate, + M : translateSingular, + MM : translate, + y : translateSingular, + yy : translate + }, + ordinalParse: /\d{1,2}-oji/, + ordinal : function (number) { + return number + '-oji'; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : latvian (lv) +// author : Kristaps Karlsons : https://github.com/skakri + +(function (factory) { + factory(moment); +}(function (moment) { + var units = { + 'mm': 'minÅ«ti_minÅ«tes_minÅ«te_minÅ«tes', + 'hh': 'stundu_stundas_stunda_stundas', + 'dd': 'dienu_dienas_diena_dienas', + 'MM': 'mÄ“nesi_mÄ“neÅ¡us_mÄ“nesis_mÄ“neÅ¡i', + 'yy': 'gadu_gadus_gads_gadi' + }; + + function format(word, number, withoutSuffix) { + var forms = word.split('_'); + if (withoutSuffix) { + return number % 10 === 1 && number !== 11 ? forms[2] : forms[3]; + } else { + return number % 10 === 1 && number !== 11 ? forms[0] : forms[1]; + } + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + return number + ' ' + format(units[key], number, withoutSuffix); + } + + return moment.defineLocale('lv', { + months : 'janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jÅ«n_jÅ«l_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'svÄ“tdiena_pirmdiena_otrdiena_treÅ¡diena_ceturtdiena_piektdiena_sestdiena'.split('_'), + weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'), + weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'YYYY. [gada] D. MMMM', + LLL : 'YYYY. [gada] D. MMMM, LT', + LLLL : 'YYYY. [gada] D. MMMM, dddd, LT' + }, + calendar : { + sameDay : '[Å odien pulksten] LT', + nextDay : '[RÄ«t pulksten] LT', + nextWeek : 'dddd [pulksten] LT', + lastDay : '[Vakar pulksten] LT', + lastWeek : '[PagÄjuÅ¡Ä] dddd [pulksten] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s vÄ“lÄk', + past : '%s agrÄk', + s : 'dažas sekundes', + m : 'minÅ«ti', + mm : relativeTimeWithPlural, + h : 'stundu', + hh : relativeTimeWithPlural, + d : 'dienu', + dd : relativeTimeWithPlural, + M : 'mÄ“nesi', + MM : relativeTimeWithPlural, + y : 'gadu', + yy : relativeTimeWithPlural + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : macedonian (mk) +// author : Borislav Mickov : https://github.com/B0k0 + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('mk', { + months : 'јануари_февруари_март_април_мај_јуни_јули_авгуÑÑ‚_Ñептември_октомври_ноември_декември'.split('_'), + monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_Ñеп_окт_ное_дек'.split('_'), + weekdays : 'недела_понеделник_вторник_Ñреда_четврток_петок_Ñабота'.split('_'), + weekdaysShort : 'нед_пон_вто_Ñре_чет_пет_Ñаб'.split('_'), + weekdaysMin : 'нe_пo_вт_ÑÑ€_че_пе_Ña'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'D.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Ð”ÐµÐ½ÐµÑ Ð²Ð¾] LT', + nextDay : '[Утре во] LT', + nextWeek : 'dddd [во] LT', + lastDay : '[Вчера во] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[Во изминатата] dddd [во] LT'; + case 1: + case 2: + case 4: + case 5: + return '[Во изминатиот] dddd [во] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'поÑле %s', + past : 'пред %s', + s : 'неколку Ñекунди', + m : 'минута', + mm : '%d минути', + h : 'чаÑ', + hh : '%d чаÑа', + d : 'ден', + dd : '%d дена', + M : 'меÑец', + MM : '%d меÑеци', + y : 'година', + yy : '%d години' + }, + ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : malayalam (ml) +// author : Floyd Pink : https://github.com/floydpink + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('ml', { + months : 'ജനàµà´µà´°à´¿_ഫെബàµà´°àµà´µà´°à´¿_മാർചàµà´šàµ_à´à´ªàµà´°à´¿àµ½_മേയàµ_ജൂൺ_ജൂലൈ_à´“à´—à´¸àµà´±àµà´±àµ_സെപàµà´±àµà´±à´‚ബർ_à´’à´•àµà´Ÿàµ‹à´¬àµ¼_നവംബർ_ഡിസംബർ'.split('_'), + monthsShort : 'ജനàµ._ഫെബàµà´°àµ._മാർ._à´à´ªàµà´°à´¿._മേയàµ_ജൂൺ_ജൂലൈ._à´“à´—._സെപàµà´±àµà´±._à´’à´•àµà´Ÿàµ‹._നവം._ഡിസം.'.split('_'), + weekdays : 'ഞായറാഴàµà´š_തിങàµà´•à´³à´¾à´´àµà´š_ചൊവàµà´µà´¾à´´àµà´š_à´¬àµà´§à´¨à´¾à´´àµà´š_à´µàµà´¯à´¾à´´à´¾à´´àµà´š_വെളàµà´³à´¿à´¯à´¾à´´àµà´š_ശനിയാഴàµà´š'.split('_'), + weekdaysShort : 'ഞായർ_തിങàµà´•àµ¾_ചൊവàµà´µ_à´¬àµà´§àµ»_à´µàµà´¯à´¾à´´à´‚_വെളàµà´³à´¿_ശനി'.split('_'), + weekdaysMin : 'à´žà´¾_തി_ചൊ_à´¬àµ_à´µàµà´¯à´¾_വെ_à´¶'.split('_'), + longDateFormat : { + LT : 'A h:mm -à´¨àµ', + LTS : 'A h:mm:ss -à´¨àµ', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[ഇനàµà´¨àµ] LT', + nextDay : '[നാളെ] LT', + nextWeek : 'dddd, LT', + lastDay : '[ഇനàµà´¨à´²àµ†] LT', + lastWeek : '[à´•à´´à´¿à´žàµà´ž] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s à´•à´´à´¿à´žàµà´žàµ', + past : '%s à´®àµàµ»à´ªàµ', + s : 'അൽപ നിമിഷങàµà´™àµ¾', + m : 'ഒരൠമിനിറàµà´±àµ', + mm : '%d മിനിറàµà´±àµ', + h : 'ഒരൠമണികàµà´•àµ‚ർ', + hh : '%d മണികàµà´•àµ‚ർ', + d : 'ഒരൠദിവസം', + dd : '%d ദിവസം', + M : 'ഒരൠമാസം', + MM : '%d മാസം', + y : 'ഒരൠവർഷം', + yy : '%d വർഷം' + }, + meridiemParse: /രാതàµà´°à´¿|രാവിലെ|ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿/i, + isPM : function (input) { + return /^(ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'രാതàµà´°à´¿'; + } else if (hour < 12) { + return 'രാവിലെ'; + } else if (hour < 17) { + return 'ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ'; + } else if (hour < 20) { + return 'വൈകàµà´¨àµà´¨àµ‡à´°à´‚'; + } else { + return 'രാതàµà´°à´¿'; + } + } + }); +})); +// moment.js locale configuration +// locale : Marathi (mr) +// author : Harshad Kale : https://github.com/kalehv + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.defineLocale('mr', { + months : 'जानेवारी_फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€_मारà¥à¤š_à¤à¤ªà¥à¤°à¤¿à¤²_मे_जून_जà¥à¤²à¥ˆ_ऑगसà¥à¤Ÿ_सपà¥à¤Ÿà¥‡à¤‚बर_ऑकà¥à¤Ÿà¥‹à¤¬à¤°_नोवà¥à¤¹à¥‡à¤‚बर_डिसेंबर'.split('_'), + monthsShort: 'जाने._फेबà¥à¤°à¥._मारà¥à¤š._à¤à¤ªà¥à¤°à¤¿._मे._जून._जà¥à¤²à¥ˆ._ऑग._सपà¥à¤Ÿà¥‡à¤‚._ऑकà¥à¤Ÿà¥‹._नोवà¥à¤¹à¥‡à¤‚._डिसें.'.split('_'), + weekdays : 'रविवार_सोमवार_मंगळवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split('_'), + weekdaysShort : 'रवि_सोम_मंगळ_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split('_'), + weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split('_'), + longDateFormat : { + LT : 'A h:mm वाजता', + LTS : 'A h:mm:ss वाजता', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[उदà¥à¤¯à¤¾] LT', + nextWeek : 'dddd, LT', + lastDay : '[काल] LT', + lastWeek: '[मागील] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s नंतर', + past : '%s पूरà¥à¤µà¥€', + s : 'सेकंद', + m: 'à¤à¤• मिनिट', + mm: '%d मिनिटे', + h : 'à¤à¤• तास', + hh : '%d तास', + d : 'à¤à¤• दिवस', + dd : '%d दिवस', + M : 'à¤à¤• महिना', + MM : '%d महिने', + y : 'à¤à¤• वरà¥à¤·', + yy : '%d वरà¥à¤·à¥‡' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /रातà¥à¤°à¥€|सकाळी|दà¥à¤ªà¤¾à¤°à¥€|सायंकाळी/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'रातà¥à¤°à¥€') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'सकाळी') { + return hour; + } else if (meridiem === 'दà¥à¤ªà¤¾à¤°à¥€') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'सायंकाळी') { + return hour + 12; + } + }, + meridiem: function (hour, minute, isLower) + { + if (hour < 4) { + return 'रातà¥à¤°à¥€'; + } else if (hour < 10) { + return 'सकाळी'; + } else if (hour < 17) { + return 'दà¥à¤ªà¤¾à¤°à¥€'; + } else if (hour < 20) { + return 'सायंकाळी'; + } else { + return 'रातà¥à¤°à¥€'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Bahasa Malaysia (ms-MY) +// author : Weldan Jamili : https://github.com/weldan + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('ms-my', { + months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), + monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), + weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), + weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), + weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'LT.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] LT', + LLLL : 'dddd, D MMMM YYYY [pukul] LT' + }, + meridiemParse: /pagi|tengahari|petang|malam/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'tengahari') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'petang' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'tengahari'; + } else if (hours < 19) { + return 'petang'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Esok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kelmarin pukul] LT', + lastWeek : 'dddd [lepas pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lepas', + s : 'beberapa saat', + m : 'seminit', + mm : '%d minit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Burmese (my) +// author : Squar team, mysquar.com + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': 'á', + '2': 'á‚', + '3': 'áƒ', + '4': 'á„', + '5': 'á…', + '6': 'á†', + '7': 'á‡', + '8': 'áˆ', + '9': 'á‰', + '0': 'á€' + }, numberMap = { + 'á': '1', + 'á‚': '2', + 'áƒ': '3', + 'á„': '4', + 'á…': '5', + 'á†': '6', + 'á‡': '7', + 'áˆ': '8', + 'á‰': '9', + 'á€': '0' + }; + return moment.defineLocale('my', { + months: 'ဇန်နá€á€«á€›á€®_ဖေဖော်á€á€«á€›á€®_မá€á€º_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုá€á€º_စက်á€á€„်ဘာ_အောက်á€á€­á€¯á€˜á€¬_နိုá€á€„်ဘာ_ဒီဇင်ဘာ'.split('_'), + monthsShort: 'ဇန်_ဖေ_မá€á€º_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'), + weekdays: 'á€á€”င်္ဂနွေ_á€á€”င်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပá€á€±á€¸_သောကြာ_စနေ'.split('_'), + weekdaysShort: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), + weekdaysMin: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd D MMMM YYYY LT' + }, + calendar: { + sameDay: '[ယနေ.] LT [မှာ]', + nextDay: '[မနက်ဖြန်] LT [မှာ]', + nextWeek: 'dddd LT [မှာ]', + lastDay: '[မနေ.က] LT [မှာ]', + lastWeek: '[ပြီးá€á€²á€·á€žá€±á€¬] dddd LT [မှာ]', + sameElse: 'L' + }, + relativeTime: { + future: 'လာမည့် %s မှာ', + past: 'လွန်á€á€²á€·á€žá€±á€¬ %s က', + s: 'စက္ကန်.အနည်းငယ်', + m: 'á€á€…်မိနစ်', + mm: '%d မိနစ်', + h: 'á€á€…်နာရီ', + hh: '%d နာရီ', + d: 'á€á€…်ရက်', + dd: '%d ရက်', + M: 'á€á€…်လ', + MM: '%d လ', + y: 'á€á€…်နှစ်', + yy: '%d နှစ်' + }, + preparse: function (string) { + return string.replace(/[áá‚áƒá„á…á†á‡áˆá‰á€]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : norwegian bokmÃ¥l (nb) +// authors : Espen Hovlandsdal : https://github.com/rexxars +// Sigurd Gartmann : https://github.com/sigurdga + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('nb', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), + weekdaysShort : 'søn_man_tirs_ons_tors_fre_lør'.split('_'), + weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'H.mm', + LTS : 'LT.ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] LT', + LLLL : 'dddd D. MMMM YYYY [kl.] LT' + }, + calendar : { + sameDay: '[i dag kl.] LT', + nextDay: '[i morgen kl.] LT', + nextWeek: 'dddd [kl.] LT', + lastDay: '[i gÃ¥r kl.] LT', + lastWeek: '[forrige] dddd [kl.] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'for %s siden', + s : 'noen sekunder', + m : 'ett minutt', + mm : '%d minutter', + h : 'en time', + hh : '%d timer', + d : 'en dag', + dd : '%d dager', + M : 'en mÃ¥ned', + MM : '%d mÃ¥neder', + y : 'ett Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : nepali/nepalese +// author : suvash : https://github.com/suvash + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.defineLocale('ne', { + months : 'जनवरी_फेबà¥à¤°à¥à¤µà¤°à¥€_मारà¥à¤š_अपà¥à¤°à¤¿à¤²_मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ_अगषà¥à¤Ÿ_सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°_अकà¥à¤Ÿà¥‹à¤¬à¤°_नोभेमà¥à¤¬à¤°_डिसेमà¥à¤¬à¤°'.split('_'), + monthsShort : 'जन._फेबà¥à¤°à¥._मारà¥à¤š_अपà¥à¤°à¤¿._मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ._अग._सेपà¥à¤Ÿ._अकà¥à¤Ÿà¥‹._नोभे._डिसे.'.split('_'), + weekdays : 'आइतबार_सोमबार_मङà¥à¤—लबार_बà¥à¤§à¤¬à¤¾à¤°_बिहिबार_शà¥à¤•à¥à¤°à¤¬à¤¾à¤°_शनिबार'.split('_'), + weekdaysShort : 'आइत._सोम._मङà¥à¤—ल._बà¥à¤§._बिहि._शà¥à¤•à¥à¤°._शनि.'.split('_'), + weekdaysMin : 'आइ._सो._मङà¥_बà¥._बि._शà¥._श.'.split('_'), + longDateFormat : { + LT : 'Aको h:mm बजे', + LTS : 'Aको h:mm:ss बजे', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /राती|बिहान|दिउà¤à¤¸à¥‹|बेलà¥à¤•à¤¾|साà¤à¤|राती/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'राती') { + return hour < 3 ? hour : hour + 12; + } else if (meridiem === 'बिहान') { + return hour; + } else if (meridiem === 'दिउà¤à¤¸à¥‹') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'बेलà¥à¤•à¤¾' || meridiem === 'साà¤à¤') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 3) { + return 'राती'; + } else if (hour < 10) { + return 'बिहान'; + } else if (hour < 15) { + return 'दिउà¤à¤¸à¥‹'; + } else if (hour < 18) { + return 'बेलà¥à¤•à¤¾'; + } else if (hour < 20) { + return 'साà¤à¤'; + } else { + return 'राती'; + } + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[भोली] LT', + nextWeek : '[आउà¤à¤¦à¥‹] dddd[,] LT', + lastDay : '[हिजो] LT', + lastWeek : '[गà¤à¤•à¥‹] dddd[,] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%sमा', + past : '%s अगाडी', + s : 'केही समय', + m : 'à¤à¤• मिनेट', + mm : '%d मिनेट', + h : 'à¤à¤• घणà¥à¤Ÿà¤¾', + hh : '%d घणà¥à¤Ÿà¤¾', + d : 'à¤à¤• दिन', + dd : '%d दिन', + M : 'à¤à¤• महिना', + MM : '%d महिना', + y : 'à¤à¤• बरà¥à¤·', + yy : '%d बरà¥à¤·' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : dutch (nl) +// author : Joris Röling : https://github.com/jjupiter + +(function (factory) { + factory(moment); +}(function (moment) { + var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); + + return moment.defineLocale('nl', { + months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), + weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), + weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[vandaag om] LT', + nextDay: '[morgen om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[gisteren om] LT', + lastWeek: '[afgelopen] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'over %s', + past : '%s geleden', + s : 'een paar seconden', + m : 'één minuut', + mm : '%d minuten', + h : 'één uur', + hh : '%d uur', + d : 'één dag', + dd : '%d dagen', + M : 'één maand', + MM : '%d maanden', + y : 'één jaar', + yy : '%d jaar' + }, + ordinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : norwegian nynorsk (nn) +// author : https://github.com/mechuwind + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('nn', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sundag_mÃ¥ndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'), + weekdaysShort : 'sun_mÃ¥n_tys_ons_tor_fre_lau'.split('_'), + weekdaysMin : 'su_mÃ¥_ty_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[I dag klokka] LT', + nextDay: '[I morgon klokka] LT', + nextWeek: 'dddd [klokka] LT', + lastDay: '[I gÃ¥r klokka] LT', + lastWeek: '[FøregÃ¥ande] dddd [klokka] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'for %s sidan', + s : 'nokre sekund', + m : 'eit minutt', + mm : '%d minutt', + h : 'ein time', + hh : '%d timar', + d : 'ein dag', + dd : '%d dagar', + M : 'ein mÃ¥nad', + MM : '%d mÃ¥nader', + y : 'eit Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : polish (pl) +// author : Rafal Hirsz : https://github.com/evoL + +(function (factory) { + factory(moment); +}(function (moment) { + var monthsNominative = 'styczeÅ„_luty_marzec_kwiecieÅ„_maj_czerwiec_lipiec_sierpieÅ„_wrzesieÅ„_październik_listopad_grudzieÅ„'.split('_'), + monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrzeÅ›nia_października_listopada_grudnia'.split('_'); + + function plural(n) { + return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1); + } + + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'minuta' : 'minutÄ™'; + case 'mm': + return result + (plural(number) ? 'minuty' : 'minut'); + case 'h': + return withoutSuffix ? 'godzina' : 'godzinÄ™'; + case 'hh': + return result + (plural(number) ? 'godziny' : 'godzin'); + case 'MM': + return result + (plural(number) ? 'miesiÄ…ce' : 'miesiÄ™cy'); + case 'yy': + return result + (plural(number) ? 'lata' : 'lat'); + } + } + + return moment.defineLocale('pl', { + months : function (momentToFormat, format) { + if (/D MMMM/.test(format)) { + return monthsSubjective[momentToFormat.month()]; + } else { + return monthsNominative[momentToFormat.month()]; + } + }, + monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'), + weekdays : 'niedziela_poniedziaÅ‚ek_wtorek_Å›roda_czwartek_piÄ…tek_sobota'.split('_'), + weekdaysShort : 'nie_pon_wt_Å›r_czw_pt_sb'.split('_'), + weekdaysMin : 'N_Pn_Wt_Åšr_Cz_Pt_So'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay: '[DziÅ› o] LT', + nextDay: '[Jutro o] LT', + nextWeek: '[W] dddd [o] LT', + lastDay: '[Wczoraj o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[W zeszÅ‚Ä… niedzielÄ™ o] LT'; + case 3: + return '[W zeszÅ‚Ä… Å›rodÄ™ o] LT'; + case 6: + return '[W zeszÅ‚Ä… sobotÄ™ o] LT'; + default: + return '[W zeszÅ‚y] dddd [o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : '%s temu', + s : 'kilka sekund', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : '1 dzieÅ„', + dd : '%d dni', + M : 'miesiÄ…c', + MM : translate, + y : 'rok', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : brazilian portuguese (pt-br) +// author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('pt-br', { + months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), + monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), + weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'), + weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'), + weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY [às] LT', + LLLL : 'dddd, D [de] MMMM [de] YYYY [às] LT' + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : 'em %s', + past : '%s atrás', + s : 'segundos', + m : 'um minuto', + mm : '%d minutos', + h : 'uma hora', + hh : '%d horas', + d : 'um dia', + dd : '%d dias', + M : 'um mês', + MM : '%d meses', + y : 'um ano', + yy : '%d anos' + }, + ordinalParse: /\d{1,2}º/, + ordinal : '%dº' + }); +})); +// moment.js locale configuration +// locale : portuguese (pt) +// author : Jefferson : https://github.com/jalex79 + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('pt', { + months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), + monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), + weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'), + weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'), + weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY LT', + LLLL : 'dddd, D [de] MMMM [de] YYYY LT' + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : 'em %s', + past : 'há %s', + s : 'segundos', + m : 'um minuto', + mm : '%d minutos', + h : 'uma hora', + hh : '%d horas', + d : 'um dia', + dd : '%d dias', + M : 'um mês', + MM : '%d meses', + y : 'um ano', + yy : '%d anos' + }, + ordinalParse: /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : romanian (ro) +// author : Vlad Gurdiga : https://github.com/gurdiga +// author : Valentin Agachi : https://github.com/avaly + +(function (factory) { + factory(moment); +}(function (moment) { + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': 'minute', + 'hh': 'ore', + 'dd': 'zile', + 'MM': 'luni', + 'yy': 'ani' + }, + separator = ' '; + if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) { + separator = ' de '; + } + + return number + separator + format[key]; + } + + return moment.defineLocale('ro', { + months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'), + monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'), + weekdays : 'duminică_luni_marÈ›i_miercuri_joi_vineri_sâmbătă'.split('_'), + weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'), + weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY H:mm', + LLLL : 'dddd, D MMMM YYYY H:mm' + }, + calendar : { + sameDay: '[azi la] LT', + nextDay: '[mâine la] LT', + nextWeek: 'dddd [la] LT', + lastDay: '[ieri la] LT', + lastWeek: '[fosta] dddd [la] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'peste %s', + past : '%s în urmă', + s : 'câteva secunde', + m : 'un minut', + mm : relativeTimeWithPlural, + h : 'o oră', + hh : relativeTimeWithPlural, + d : 'o zi', + dd : relativeTimeWithPlural, + M : 'o lună', + MM : relativeTimeWithPlural, + y : 'un an', + yy : relativeTimeWithPlural + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : russian (ru) +// author : Viktorminator : https://github.com/Viktorminator +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + factory(moment); +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут', + 'hh': 'чаÑ_чаÑа_чаÑов', + 'dd': 'день_днÑ_дней', + 'MM': 'меÑÑц_меÑÑца_меÑÑцев', + 'yy': 'год_года_лет' + }; + if (key === 'm') { + return withoutSuffix ? 'минута' : 'минуту'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь'.split('_'), + 'accusative': 'ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function monthsShortCaseReplace(m, format) { + var monthsShort = { + 'nominative': 'Ñнв_фев_март_апр_май_июнь_июль_авг_Ñен_окт_ноÑ_дек'.split('_'), + 'accusative': 'Ñнв_фев_мар_апр_маÑ_июнÑ_июлÑ_авг_Ñен_окт_ноÑ_дек'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return monthsShort[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота'.split('_'), + 'accusative': 'воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу'.split('_') + }, + + nounCase = (/\[ ?[Вв] ?(?:прошлую|Ñледующую|Ñту)? ?\] ?dddd/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.defineLocale('ru', { + months : monthsCaseReplace, + monthsShort : monthsShortCaseReplace, + weekdays : weekdaysCaseReplace, + weekdaysShort : 'вÑ_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + weekdaysMin : 'вÑ_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + monthsParse : [/^Ñнв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[й|Ñ]/i, /^июн/i, /^июл/i, /^авг/i, /^Ñен/i, /^окт/i, /^ноÑ/i, /^дек/i], + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY г.', + LLL : 'D MMMM YYYY г., LT', + LLLL : 'dddd, D MMMM YYYY г., LT' + }, + calendar : { + sameDay: '[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT', + nextDay: '[Завтра в] LT', + lastDay: '[Вчера в] LT', + nextWeek: function () { + return this.day() === 2 ? '[Во] dddd [в] LT' : '[Ð’] dddd [в] LT'; + }, + lastWeek: function (now) { + if (now.week() !== this.week()) { + switch (this.day()) { + case 0: + return '[Ð’ прошлое] dddd [в] LT'; + case 1: + case 2: + case 4: + return '[Ð’ прошлый] dddd [в] LT'; + case 3: + case 5: + case 6: + return '[Ð’ прошлую] dddd [в] LT'; + } + } else { + if (this.day() === 2) { + return '[Во] dddd [в] LT'; + } else { + return '[Ð’] dddd [в] LT'; + } + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'через %s', + past : '%s назад', + s : 'неÑколько Ñекунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : 'чаÑ', + hh : relativeTimeWithPlural, + d : 'день', + dd : relativeTimeWithPlural, + M : 'меÑÑц', + MM : relativeTimeWithPlural, + y : 'год', + yy : relativeTimeWithPlural + }, + + meridiemParse: /ночи|утра|днÑ|вечера/i, + isPM : function (input) { + return /^(днÑ|вечера)$/.test(input); + }, + + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночи'; + } else if (hour < 12) { + return 'утра'; + } else if (hour < 17) { + return 'днÑ'; + } else { + return 'вечера'; + } + }, + + ordinalParse: /\d{1,2}-(й|го|Ñ)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + return number + '-й'; + case 'D': + return number + '-го'; + case 'w': + case 'W': + return number + '-Ñ'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : slovak (sk) +// author : Martin Minka : https://github.com/k2s +// based on work of petrbela : https://github.com/petrbela + +(function (factory) { + factory(moment); +}(function (moment) { + var months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'), + monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_'); + + function plural(n) { + return (n > 1) && (n < 5); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami'; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minúty' : 'minút'); + } else { + return result + 'minútami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodín'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'deň' : 'dňom'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dni' : 'dní'); + } else { + return result + 'dňami'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'mesiace' : 'mesiacov'); + } else { + return result + 'mesiacmi'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokom'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'rokov'); + } else { + return result + 'rokmi'; + } + break; + } + } + + return moment.defineLocale('sk', { + months : months, + monthsShort : monthsShort, + monthsParse : (function (months, monthsShort) { + var i, _monthsParse = []; + for (i = 0; i < 12; i++) { + // use custom parser to solve problem with July (Äervenec) + _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); + } + return _monthsParse; + }(months, monthsShort)), + weekdays : 'nedeľa_pondelok_utorok_streda_Å¡tvrtok_piatok_sobota'.split('_'), + weekdaysShort : 'ne_po_ut_st_Å¡t_pi_so'.split('_'), + weekdaysMin : 'ne_po_ut_st_Å¡t_pi_so'.split('_'), + longDateFormat : { + LT: 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[dnes o] LT', + nextDay: '[zajtra o] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedeľu o] LT'; + case 1: + case 2: + return '[v] dddd [o] LT'; + case 3: + return '[v stredu o] LT'; + case 4: + return '[vo Å¡tvrtok o] LT'; + case 5: + return '[v piatok o] LT'; + case 6: + return '[v sobotu o] LT'; + } + }, + lastDay: '[vÄera o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulú nedeľu o] LT'; + case 1: + case 2: + return '[minulý] dddd [o] LT'; + case 3: + return '[minulú stredu o] LT'; + case 4: + case 5: + return '[minulý] dddd [o] LT'; + case 6: + return '[minulú sobotu o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pred %s', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : slovenian (sl) +// author : Robert SedovÅ¡ek : https://github.com/sedovsek + +(function (factory) { + factory(moment); +}(function (moment) { + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'ena minuta' : 'eno minuto'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2) { + result += 'minuti'; + } else if (number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minut'; + } + return result; + case 'h': + return withoutSuffix ? 'ena ura' : 'eno uro'; + case 'hh': + if (number === 1) { + result += 'ura'; + } else if (number === 2) { + result += 'uri'; + } else if (number === 3 || number === 4) { + result += 'ure'; + } else { + result += 'ur'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dni'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mesec'; + } else if (number === 2) { + result += 'meseca'; + } else if (number === 3 || number === 4) { + result += 'mesece'; + } else { + result += 'mesecev'; + } + return result; + case 'yy': + if (number === 1) { + result += 'leto'; + } else if (number === 2) { + result += 'leti'; + } else if (number === 3 || number === 4) { + result += 'leta'; + } else { + result += 'let'; + } + return result; + } + } + + return moment.defineLocale('sl', { + months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'), + monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'), + weekdays : 'nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota'.split('_'), + weekdaysShort : 'ned._pon._tor._sre._Äet._pet._sob.'.split('_'), + weekdaysMin : 'ne_po_to_sr_Äe_pe_so'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD. MM. YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[danes ob] LT', + nextDay : '[jutri ob] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[v] [nedeljo] [ob] LT'; + case 3: + return '[v] [sredo] [ob] LT'; + case 6: + return '[v] [soboto] [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[v] dddd [ob] LT'; + } + }, + lastDay : '[vÄeraj ob] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[prejÅ¡nja] dddd [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[prejÅ¡nji] dddd [ob] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'Äez %s', + past : '%s nazaj', + s : 'nekaj sekund', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'en dan', + dd : translate, + M : 'en mesec', + MM : translate, + y : 'eno leto', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Albanian (sq) +// author : Flakërim Ismani : https://github.com/flakerimi +// author: Menelion Elensúle: https://github.com/Oire (tests) +// author : Oerd Cukalla : https://github.com/oerd (fixes) + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('sq', { + months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'), + monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'), + weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'), + weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'), + weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'), + meridiemParse: /PD|MD/, + isPM: function (input) { + return input.charAt(0) === 'M'; + }, + meridiem : function (hours, minutes, isLower) { + return hours < 12 ? 'PD' : 'MD'; + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Sot në] LT', + nextDay : '[Nesër në] LT', + nextWeek : 'dddd [në] LT', + lastDay : '[Dje në] LT', + lastWeek : 'dddd [e kaluar në] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'në %s', + past : '%s më parë', + s : 'disa sekonda', + m : 'një minutë', + mm : '%d minuta', + h : 'një orë', + hh : '%d orë', + d : 'një ditë', + dd : '%d ditë', + M : 'një muaj', + MM : '%d muaj', + y : 'një vit', + yy : '%d vite' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Serbian-cyrillic (sr-cyrl) +// author : Milan JanaÄković : https://github.com/milan-j + +(function (factory) { + factory(moment); +}(function (moment) { + var translator = { + words: { //Different grammatical cases + m: ['један минут', 'једне минуте'], + mm: ['минут', 'минуте', 'минута'], + h: ['један Ñат', 'једног Ñата'], + hh: ['Ñат', 'Ñата', 'Ñати'], + dd: ['дан', 'дана', 'дана'], + MM: ['меÑец', 'меÑеца', 'меÑеци'], + yy: ['година', 'године', 'година'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } + }; + + return moment.defineLocale('sr-cyrl', { + months: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'авгуÑÑ‚', 'Ñептембар', 'октобар', 'новембар', 'децембар'], + monthsShort: ['јан.', 'феб.', 'мар.', 'апр.', 'мај', 'јун', 'јул', 'авг.', 'Ñеп.', 'окт.', 'нов.', 'дец.'], + weekdays: ['недеља', 'понедељак', 'уторак', 'Ñреда', 'четвртак', 'петак', 'Ñубота'], + weekdaysShort: ['нед.', 'пон.', 'уто.', 'Ñре.', 'чет.', 'пет.', 'Ñуб.'], + weekdaysMin: ['не', 'по', 'ут', 'ÑÑ€', 'че', 'пе', 'Ñу'], + longDateFormat: { + LT: 'H:mm', + LTS : 'LT:ss', + L: 'DD. MM. YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY LT', + LLLL: 'dddd, D. MMMM YYYY LT' + }, + calendar: { + sameDay: '[Ð´Ð°Ð½Ð°Ñ Ñƒ] LT', + nextDay: '[Ñутра у] LT', + + nextWeek: function () { + switch (this.day()) { + case 0: + return '[у] [недељу] [у] LT'; + case 3: + return '[у] [Ñреду] [у] LT'; + case 6: + return '[у] [Ñуботу] [у] LT'; + case 1: + case 2: + case 4: + case 5: + return '[у] dddd [у] LT'; + } + }, + lastDay : '[јуче у] LT', + lastWeek : function () { + var lastWeekDays = [ + '[прошле] [недеље] [у] LT', + '[прошлог] [понедељка] [у] LT', + '[прошлог] [уторка] [у] LT', + '[прошле] [Ñреде] [у] LT', + '[прошлог] [четвртка] [у] LT', + '[прошлог] [петка] [у] LT', + '[прошле] [Ñуботе] [у] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'за %s', + past : 'пре %s', + s : 'неколико Ñекунди', + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'дан', + dd : translator.translate, + M : 'меÑец', + MM : translator.translate, + y : 'годину', + yy : translator.translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Serbian-latin (sr) +// author : Milan JanaÄković : https://github.com/milan-j + +(function (factory) { + factory(moment); +}(function (moment) { + var translator = { + words: { //Different grammatical cases + m: ['jedan minut', 'jedne minute'], + mm: ['minut', 'minute', 'minuta'], + h: ['jedan sat', 'jednog sata'], + hh: ['sat', 'sata', 'sati'], + dd: ['dan', 'dana', 'dana'], + MM: ['mesec', 'meseca', 'meseci'], + yy: ['godina', 'godine', 'godina'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } + }; + + return moment.defineLocale('sr', { + months: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'], + monthsShort: ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun', 'jul', 'avg.', 'sep.', 'okt.', 'nov.', 'dec.'], + weekdays: ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'Äetvrtak', 'petak', 'subota'], + weekdaysShort: ['ned.', 'pon.', 'uto.', 'sre.', 'Äet.', 'pet.', 'sub.'], + weekdaysMin: ['ne', 'po', 'ut', 'sr', 'Äe', 'pe', 'su'], + longDateFormat: { + LT: 'H:mm', + LTS : 'LT:ss', + L: 'DD. MM. YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY LT', + LLLL: 'dddd, D. MMMM YYYY LT' + }, + calendar: { + sameDay: '[danas u] LT', + nextDay: '[sutra u] LT', + + nextWeek: function () { + switch (this.day()) { + case 0: + return '[u] [nedelju] [u] LT'; + case 3: + return '[u] [sredu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄe u] LT', + lastWeek : function () { + var lastWeekDays = [ + '[proÅ¡le] [nedelje] [u] LT', + '[proÅ¡log] [ponedeljka] [u] LT', + '[proÅ¡log] [utorka] [u] LT', + '[proÅ¡le] [srede] [u] LT', + '[proÅ¡log] [Äetvrtka] [u] LT', + '[proÅ¡log] [petka] [u] LT', + '[proÅ¡le] [subote] [u] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pre %s', + s : 'nekoliko sekundi', + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'dan', + dd : translator.translate, + M : 'mesec', + MM : translator.translate, + y : 'godinu', + yy : translator.translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : swedish (sv) +// author : Jens Alm : https://github.com/ulmus + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('sv', { + months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'söndag_mÃ¥ndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'), + weekdaysShort : 'sön_mÃ¥n_tis_ons_tor_fre_lör'.split('_'), + weekdaysMin : 'sö_mÃ¥_ti_on_to_fr_lö'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Idag] LT', + nextDay: '[Imorgon] LT', + lastDay: '[IgÃ¥r] LT', + nextWeek: 'dddd LT', + lastWeek: '[Förra] dddd[en] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'för %s sedan', + s : 'nÃ¥gra sekunder', + m : 'en minut', + mm : '%d minuter', + h : 'en timme', + hh : '%d timmar', + d : 'en dag', + dd : '%d dagar', + M : 'en mÃ¥nad', + MM : '%d mÃ¥nader', + y : 'ett Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}(e|a)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'e' : + (b === 1) ? 'a' : + (b === 2) ? 'a' : + (b === 3) ? 'e' : 'e'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : tamil (ta) +// author : Arjunkumar Krishnamoorthy : https://github.com/tk120404 + +(function (factory) { + factory(moment); +}(function (moment) { + /*var symbolMap = { + '1': '௧', + '2': '௨', + '3': '௩', + '4': '௪', + '5': '௫', + '6': '௬', + '7': '௭', + '8': '௮', + '9': '௯', + '0': '௦' + }, + numberMap = { + '௧': '1', + '௨': '2', + '௩': '3', + '௪': '4', + '௫': '5', + '௬': '6', + '௭': '7', + '௮': '8', + '௯': '9', + '௦': '0' + }; */ + + return moment.defineLocale('ta', { + months : 'ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯'.split('_'), + monthsShort : 'ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯'.split('_'), + weekdays : 'ஞாயிறà¯à®±à¯à®•à¯à®•à®¿à®´à®®à¯ˆ_திஙà¯à®•à®Ÿà¯à®•à®¿à®´à®®à¯ˆ_செவà¯à®µà®¾à®¯à¯à®•à®¿à®´à®®à¯ˆ_பà¯à®¤à®©à¯à®•à®¿à®´à®®à¯ˆ_வியாழகà¯à®•à®¿à®´à®®à¯ˆ_வெளà¯à®³à®¿à®•à¯à®•à®¿à®´à®®à¯ˆ_சனிகà¯à®•à®¿à®´à®®à¯ˆ'.split('_'), + weekdaysShort : 'ஞாயிறà¯_திஙà¯à®•à®³à¯_செவà¯à®µà®¾à®¯à¯_பà¯à®¤à®©à¯_வியாழனà¯_வெளà¯à®³à®¿_சனி'.split('_'), + weekdaysMin : 'ஞா_தி_செ_பà¯_வி_வெ_ச'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[இனà¯à®±à¯] LT', + nextDay : '[நாளை] LT', + nextWeek : 'dddd, LT', + lastDay : '[நேறà¯à®±à¯] LT', + lastWeek : '[கடநà¯à®¤ வாரமà¯] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s இலà¯', + past : '%s à®®à¯à®©à¯', + s : 'ஒர௠சில விநாடிகளà¯', + m : 'ஒர௠நிமிடமà¯', + mm : '%d நிமிடஙà¯à®•à®³à¯', + h : 'ஒர௠மணி நேரமà¯', + hh : '%d மணி நேரமà¯', + d : 'ஒர௠நாளà¯', + dd : '%d நாடà¯à®•à®³à¯', + M : 'ஒர௠மாதமà¯', + MM : '%d மாதஙà¯à®•à®³à¯', + y : 'ஒர௠வரà¯à®Ÿà®®à¯', + yy : '%d ஆணà¯à®Ÿà¯à®•à®³à¯' + }, +/* preparse: function (string) { + return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + },*/ + ordinalParse: /\d{1,2}வதà¯/, + ordinal : function (number) { + return number + 'வதà¯'; + }, + + + // refer http://ta.wikipedia.org/s/1er1 + meridiemParse: /யாமமà¯|வைகறை|காலை|நணà¯à®ªà®•à®²à¯|எறà¯à®ªà®¾à®Ÿà¯|மாலை/, + meridiem : function (hour, minute, isLower) { + if (hour < 2) { + return ' யாமமà¯'; + } else if (hour < 6) { + return ' வைகறை'; // வைகறை + } else if (hour < 10) { + return ' காலை'; // காலை + } else if (hour < 14) { + return ' நணà¯à®ªà®•à®²à¯'; // நணà¯à®ªà®•à®²à¯ + } else if (hour < 18) { + return ' எறà¯à®ªà®¾à®Ÿà¯'; // எறà¯à®ªà®¾à®Ÿà¯ + } else if (hour < 22) { + return ' மாலை'; // மாலை + } else { + return ' யாமமà¯'; + } + }, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'யாமமà¯') { + return hour < 2 ? hour : hour + 12; + } else if (meridiem === 'வைகறை' || meridiem === 'காலை') { + return hour; + } else if (meridiem === 'நணà¯à®ªà®•à®²à¯') { + return hour >= 10 ? hour : hour + 12; + } else { + return hour + 12; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : thai (th) +// author : Kridsada Thanabulpong : https://github.com/sirn + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('th', { + months : 'มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม'.split('_'), + monthsShort : 'มà¸à¸£à¸²_à¸à¸¸à¸¡à¸ à¸²_มีนา_เมษา_พฤษภา_มิถุนา_à¸à¸£à¸à¸Žà¸²_สิงหา_à¸à¸±à¸™à¸¢à¸²_ตุลา_พฤศจิà¸à¸²_ธันวา'.split('_'), + weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์'.split('_'), + weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์'.split('_'), // yes, three characters difference + weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'), + longDateFormat : { + LT : 'H นาฬิà¸à¸² m นาที', + LTS : 'LT s วินาที', + L : 'YYYY/MM/DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY เวลา LT', + LLLL : 'วันddddที่ D MMMM YYYY เวลา LT' + }, + meridiemParse: /à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง|หลังเที่ยง/, + isPM: function (input) { + return input === 'หลังเที่ยง'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง'; + } else { + return 'หลังเที่ยง'; + } + }, + calendar : { + sameDay : '[วันนี้ เวลา] LT', + nextDay : '[พรุ่งนี้ เวลา] LT', + nextWeek : 'dddd[หน้า เวลา] LT', + lastDay : '[เมื่อวานนี้ เวลา] LT', + lastWeek : '[วัน]dddd[ที่à¹à¸¥à¹‰à¸§ เวลา] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'อีภ%s', + past : '%sที่à¹à¸¥à¹‰à¸§', + s : 'ไม่à¸à¸µà¹ˆà¸§à¸´à¸™à¸²à¸—ี', + m : '1 นาที', + mm : '%d นาที', + h : '1 ชั่วโมง', + hh : '%d ชั่วโมง', + d : '1 วัน', + dd : '%d วัน', + M : '1 เดือน', + MM : '%d เดือน', + y : '1 ปี', + yy : '%d ปี' + } + }); +})); +// moment.js locale configuration +// locale : Tagalog/Filipino (tl-ph) +// author : Dan Hagman + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('tl-ph', { + months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'), + monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'), + weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'), + weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'), + weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'MM/D/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY LT', + LLLL : 'dddd, MMMM DD, YYYY LT' + }, + calendar : { + sameDay: '[Ngayon sa] LT', + nextDay: '[Bukas sa] LT', + nextWeek: 'dddd [sa] LT', + lastDay: '[Kahapon sa] LT', + lastWeek: 'dddd [huling linggo] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'sa loob ng %s', + past : '%s ang nakalipas', + s : 'ilang segundo', + m : 'isang minuto', + mm : '%d minuto', + h : 'isang oras', + hh : '%d oras', + d : 'isang araw', + dd : '%d araw', + M : 'isang buwan', + MM : '%d buwan', + y : 'isang taon', + yy : '%d taon' + }, + ordinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : turkish (tr) +// authors : Erhan Gundogan : https://github.com/erhangundogan, +// Burak YiÄŸit Kaya: https://github.com/BYK + +(function (factory) { + factory(moment); +}(function (moment) { + var suffixes = { + 1: '\'inci', + 5: '\'inci', + 8: '\'inci', + 70: '\'inci', + 80: '\'inci', + + 2: '\'nci', + 7: '\'nci', + 20: '\'nci', + 50: '\'nci', + + 3: '\'üncü', + 4: '\'üncü', + 100: '\'üncü', + + 6: '\'ncı', + + 9: '\'uncu', + 10: '\'uncu', + 30: '\'uncu', + + 60: '\'ıncı', + 90: '\'ıncı' + }; + + return moment.defineLocale('tr', { + months : 'Ocak_Åžubat_Mart_Nisan_Mayıs_Haziran_Temmuz_AÄŸustos_Eylül_Ekim_Kasım_Aralık'.split('_'), + monthsShort : 'Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara'.split('_'), + weekdays : 'Pazar_Pazartesi_Salı_ÇarÅŸamba_PerÅŸembe_Cuma_Cumartesi'.split('_'), + weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'), + weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[bugün saat] LT', + nextDay : '[yarın saat] LT', + nextWeek : '[haftaya] dddd [saat] LT', + lastDay : '[dün] LT', + lastWeek : '[geçen hafta] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s sonra', + past : '%s önce', + s : 'birkaç saniye', + m : 'bir dakika', + mm : '%d dakika', + h : 'bir saat', + hh : '%d saat', + d : 'bir gün', + dd : '%d gün', + M : 'bir ay', + MM : '%d ay', + y : 'bir yıl', + yy : '%d yıl' + }, + ordinalParse: /\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/, + ordinal : function (number) { + if (number === 0) { // special case for zero + return number + '\'ıncı'; + } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + + return number + (suffixes[a] || suffixes[b] || suffixes[c]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Morocco Central Atlas TamaziÉ£t in Latin (tzm-latn) +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('tzm-latn', { + months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), + weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), + weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[asdkh g] LT', + nextDay: '[aska g] LT', + nextWeek: 'dddd [g] LT', + lastDay: '[assant g] LT', + lastWeek: 'dddd [g] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dadkh s yan %s', + past : 'yan %s', + s : 'imik', + m : 'minuá¸', + mm : '%d minuá¸', + h : 'saÉ›a', + hh : '%d tassaÉ›in', + d : 'ass', + dd : '%d ossan', + M : 'ayowr', + MM : '%d iyyirn', + y : 'asgas', + yy : '%d isgasn' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Morocco Central Atlas TamaziÉ£t (tzm) +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('tzm', { + months : 'ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”'.split('_'), + monthsShort : 'ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”'.split('_'), + weekdays : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + weekdaysShort : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS: 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[ⴰⵙⴷⵅ â´´] LT', + nextDay: '[ⴰⵙⴽⴰ â´´] LT', + nextWeek: 'dddd [â´´] LT', + lastDay: '[ⴰⵚⴰâµâµœ â´´] LT', + lastWeek: 'dddd [â´´] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'â´·â´°â´·âµ… âµ™ ⵢⴰⵠ%s', + past : 'ⵢⴰⵠ%s', + s : 'ⵉⵎⵉⴽ', + m : 'ⵎⵉâµâµ“â´º', + mm : '%d ⵎⵉâµâµ“â´º', + h : 'ⵙⴰⵄⴰ', + hh : '%d ⵜⴰⵙⵙⴰⵄⵉâµ', + d : 'ⴰⵙⵙ', + dd : '%d oⵙⵙⴰâµ', + M : 'â´°âµ¢oⵓⵔ', + MM : '%d ⵉⵢⵢⵉⵔâµ', + y : 'ⴰⵙⴳⴰⵙ', + yy : '%d ⵉⵙⴳⴰⵙâµ' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : ukrainian (uk) +// author : zemlanin : https://github.com/zemlanin +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + factory(moment); +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': 'хвилина_хвилини_хвилин', + 'hh': 'година_години_годин', + 'dd': 'день_дні_днів', + 'MM': 'міÑÑць_міÑÑці_міÑÑців', + 'yy': 'рік_роки_років' + }; + if (key === 'm') { + return withoutSuffix ? 'хвилина' : 'хвилину'; + } + else if (key === 'h') { + return withoutSuffix ? 'година' : 'годину'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень'.split('_'), + 'accusative': 'ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ'.split('_') + }, + + nounCase = (/D[oD]? *MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота'.split('_'), + 'accusative': 'неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу'.split('_'), + 'genitive': 'неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи'.split('_') + }, + + nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ? + 'accusative' : + ((/\[?(?:минулої|наÑтупної)? ?\] ?dddd/).test(format) ? + 'genitive' : + 'nominative'); + + return weekdays[nounCase][m.day()]; + } + + function processHoursFunction(str) { + return function () { + return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT'; + }; + } + + return moment.defineLocale('uk', { + months : monthsCaseReplace, + monthsShort : 'Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + weekdaysMin : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY Ñ€.', + LLL : 'D MMMM YYYY Ñ€., LT', + LLLL : 'dddd, D MMMM YYYY Ñ€., LT' + }, + calendar : { + sameDay: processHoursFunction('[Сьогодні '), + nextDay: processHoursFunction('[Завтра '), + lastDay: processHoursFunction('[Вчора '), + nextWeek: processHoursFunction('[У] dddd ['), + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return processHoursFunction('[Минулої] dddd [').call(this); + case 1: + case 2: + case 4: + return processHoursFunction('[Минулого] dddd [').call(this); + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'за %s', + past : '%s тому', + s : 'декілька Ñекунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : 'годину', + hh : relativeTimeWithPlural, + d : 'день', + dd : relativeTimeWithPlural, + M : 'міÑÑць', + MM : relativeTimeWithPlural, + y : 'рік', + yy : relativeTimeWithPlural + }, + + // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason + + meridiemParse: /ночі|ранку|днÑ|вечора/, + isPM: function (input) { + return /^(днÑ|вечора)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночі'; + } else if (hour < 12) { + return 'ранку'; + } else if (hour < 17) { + return 'днÑ'; + } else { + return 'вечора'; + } + }, + + ordinalParse: /\d{1,2}-(й|го)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return number + '-й'; + case 'D': + return number + '-го'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : uzbek (uz) +// author : Sardor Muminov : https://github.com/muminoff + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('uz', { + months : 'Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь'.split('_'), + monthsShort : 'Ñнв_фев_мар_апр_май_июн_июл_авг_Ñен_окт_ноÑ_дек'.split('_'), + weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'), + weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'), + weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'D MMMM YYYY, dddd LT' + }, + calendar : { + sameDay : '[Бугун Ñоат] LT [да]', + nextDay : '[Эртага] LT [да]', + nextWeek : 'dddd [куни Ñоат] LT [да]', + lastDay : '[Кеча Ñоат] LT [да]', + lastWeek : '[Утган] dddd [куни Ñоат] LT [да]', + sameElse : 'L' + }, + relativeTime : { + future : 'Якин %s ичида', + past : 'Бир неча %s олдин', + s : 'фурÑат', + m : 'бир дакика', + mm : '%d дакика', + h : 'бир Ñоат', + hh : '%d Ñоат', + d : 'бир кун', + dd : '%d кун', + M : 'бир ой', + MM : '%d ой', + y : 'бир йил', + yy : '%d йил' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : vietnamese (vi) +// author : Bang Nguyen : https://github.com/bangnk + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('vi', { + months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'), + monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'), + weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tÆ°_thứ năm_thứ sáu_thứ bảy'.split('_'), + weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM [năm] YYYY', + LLL : 'D MMMM [năm] YYYY LT', + LLLL : 'dddd, D MMMM [năm] YYYY LT', + l : 'DD/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY LT', + llll : 'ddd, D MMM YYYY LT' + }, + calendar : { + sameDay: '[Hôm nay lúc] LT', + nextDay: '[Ngày mai lúc] LT', + nextWeek: 'dddd [tuần tá»›i lúc] LT', + lastDay: '[Hôm qua lúc] LT', + lastWeek: 'dddd [tuần rồi lúc] LT', + sameElse: 'L' + }, + relativeTime : { + future : '%s tá»›i', + past : '%s trÆ°á»›c', + s : 'vài giây', + m : 'má»™t phút', + mm : '%d phút', + h : 'má»™t giá»', + hh : '%d giá»', + d : 'má»™t ngày', + dd : '%d ngày', + M : 'má»™t tháng', + MM : '%d tháng', + y : 'má»™t năm', + yy : '%d năm' + }, + ordinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : chinese (zh-cn) +// author : suupic : https://github.com/suupic +// author : Zeno Zeng : https://github.com/zenozeng + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('zh-cn', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'), + weekdaysMin : 'æ—¥_一_二_三_å››_五_å…­'.split('_'), + longDateFormat : { + LT : 'Ah点mm', + LTS : 'Ah点m分s秒', + L : 'YYYY-MM-DD', + LL : 'YYYYå¹´MMMDæ—¥', + LLL : 'YYYYå¹´MMMDæ—¥LT', + LLLL : 'YYYYå¹´MMMDæ—¥ddddLT', + l : 'YYYY-MM-DD', + ll : 'YYYYå¹´MMMDæ—¥', + lll : 'YYYYå¹´MMMDæ—¥LT', + llll : 'YYYYå¹´MMMDæ—¥ddddLT' + }, + meridiemParse: /凌晨|早上|上åˆ|中åˆ|下åˆ|晚上/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '凌晨' || meridiem === '早上' || + meridiem === '上åˆ') { + return hour; + } else if (meridiem === '下åˆ' || meridiem === '晚上') { + return hour + 12; + } else { + // '中åˆ' + return hour >= 11 ? hour : hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return '凌晨'; + } else if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上åˆ'; + } else if (hm < 1230) { + return '中åˆ'; + } else if (hm < 1800) { + return '下åˆ'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : function () { + return this.minutes() === 0 ? '[今天]Ah[点整]' : '[今天]LT'; + }, + nextDay : function () { + return this.minutes() === 0 ? '[明天]Ah[点整]' : '[明天]LT'; + }, + lastDay : function () { + return this.minutes() === 0 ? '[昨天]Ah[点整]' : '[昨天]LT'; + }, + nextWeek : function () { + var startOfWeek, prefix; + startOfWeek = moment().startOf('week'); + prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]'; + return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; + }, + lastWeek : function () { + var startOfWeek, prefix; + startOfWeek = moment().startOf('week'); + prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]'; + return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; + }, + sameElse : 'LL' + }, + ordinalParse: /\d{1,2}(æ—¥|月|周)/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + 'æ—¥'; + case 'M': + return number + '月'; + case 'w': + case 'W': + return number + '周'; + default: + return number; + } + }, + relativeTime : { + future : '%s内', + past : '%så‰', + s : '几秒', + m : '1分钟', + mm : '%d分钟', + h : '1å°æ—¶', + hh : '%då°æ—¶', + d : '1天', + dd : '%d天', + M : '1个月', + MM : '%d个月', + y : '1å¹´', + yy : '%då¹´' + }, + week : { + // GB/T 7408-1994《数æ®å…ƒå’Œäº¤æ¢æ ¼å¼Â·ä¿¡æ¯äº¤æ¢Â·æ—¥æœŸå’Œæ—¶é—´è¡¨ç¤ºæ³•ã€‹ä¸ŽISO 8601:1988等效 + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : traditional chinese (zh-tw) +// author : Ben : https://github.com/ben-lin + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('zh-tw', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), + weekdaysMin : 'æ—¥_一_二_三_å››_五_å…­'.split('_'), + longDateFormat : { + LT : 'Ah點mm', + LTS : 'Ah點m分s秒', + L : 'YYYYå¹´MMMDæ—¥', + LL : 'YYYYå¹´MMMDæ—¥', + LLL : 'YYYYå¹´MMMDæ—¥LT', + LLLL : 'YYYYå¹´MMMDæ—¥ddddLT', + l : 'YYYYå¹´MMMDæ—¥', + ll : 'YYYYå¹´MMMDæ—¥', + lll : 'YYYYå¹´MMMDæ—¥LT', + llll : 'YYYYå¹´MMMDæ—¥ddddLT' + }, + meridiemParse: /早上|上åˆ|中åˆ|下åˆ|晚上/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '早上' || meridiem === '上åˆ') { + return hour; + } else if (meridiem === '中åˆ') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === '下åˆ' || meridiem === '晚上') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上åˆ'; + } else if (hm < 1230) { + return '中åˆ'; + } else if (hm < 1800) { + return '下åˆ'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : '[今天]LT', + nextDay : '[明天]LT', + nextWeek : '[下]ddddLT', + lastDay : '[昨天]LT', + lastWeek : '[上]ddddLT', + sameElse : 'L' + }, + ordinalParse: /\d{1,2}(æ—¥|月|週)/, + ordinal : function (number, period) { + switch (period) { + case 'd' : + case 'D' : + case 'DDD' : + return number + 'æ—¥'; + case 'M' : + return number + '月'; + case 'w' : + case 'W' : + return number + '週'; + default : + return number; + } + }, + relativeTime : { + future : '%så…§', + past : '%så‰', + s : '幾秒', + m : '一分é˜', + mm : '%d分é˜', + h : '一å°æ™‚', + hh : '%då°æ™‚', + d : '一天', + dd : '%d天', + M : '一個月', + MM : '%d個月', + y : '一年', + yy : '%då¹´' + } + }); +})); + + moment.locale('en'); + + + /************************************ + Exposing Moment + ************************************/ + + function makeGlobal(shouldDeprecate) { + /*global ender:false */ + if (typeof ender !== 'undefined') { + return; + } + oldGlobalMoment = globalScope.moment; + if (shouldDeprecate) { + globalScope.moment = deprecate( + 'Accessing Moment through the global scope is ' + + 'deprecated, and will be removed in an upcoming ' + + 'release.', + moment); + } else { + globalScope.moment = moment; + } + } + + // CommonJS module is defined + if (hasModule) { + module.exports = moment; + } else if (typeof define === 'function' && define.amd) { + define(function (require, exports, module) { + if (module.config && module.config() && module.config().noGlobal === true) { + // release the global variable + globalScope.moment = oldGlobalMoment; + } + + return moment; + }); + makeGlobal(true); + } else { + makeGlobal(); + } +}).call(this); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/min/moment-with-locales.min.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/min/moment-with-locales.min.js new file mode 100644 index 0000000..f604348 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/min/moment-with-locales.min.js @@ -0,0 +1,10 @@ +//! moment.js +//! version : 2.9.0 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com +(function(a){function b(a,b,c){switch(arguments.length){case 2:return null!=a?a:b;case 3:return null!=a?a:null!=b?b:c;default:throw new Error("Implement me")}}function c(a,b){return Bb.call(a,b)}function d(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function e(a){vb.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+a)}function f(a,b){var c=!0;return o(function(){return c&&(e(a),c=!1),b.apply(this,arguments)},b)}function g(a,b){sc[a]||(e(b),sc[a]=!0)}function h(a,b){return function(c){return r(a.call(this,c),b)}}function i(a,b){return function(c){return this.localeData().ordinal(a.call(this,c),b)}}function j(a,b){var c,d,e=12*(b.year()-a.year())+(b.month()-a.month()),f=a.clone().add(e,"months");return 0>b-f?(c=a.clone().add(e-1,"months"),d=(b-f)/(f-c)):(c=a.clone().add(e+1,"months"),d=(b-f)/(c-f)),-(e+d)}function k(a,b,c){var d;return null==c?b:null!=a.meridiemHour?a.meridiemHour(b,c):null!=a.isPM?(d=a.isPM(c),d&&12>b&&(b+=12),d||12!==b||(b=0),b):b}function l(){}function m(a,b){b!==!1&&H(a),p(this,a),this._d=new Date(+a._d),uc===!1&&(uc=!0,vb.updateOffset(this),uc=!1)}function n(a){var b=A(a),c=b.year||0,d=b.quarter||0,e=b.month||0,f=b.week||0,g=b.day||0,h=b.hour||0,i=b.minute||0,j=b.second||0,k=b.millisecond||0;this._milliseconds=+k+1e3*j+6e4*i+36e5*h,this._days=+g+7*f,this._months=+e+3*d+12*c,this._data={},this._locale=vb.localeData(),this._bubble()}function o(a,b){for(var d in b)c(b,d)&&(a[d]=b[d]);return c(b,"toString")&&(a.toString=b.toString),c(b,"valueOf")&&(a.valueOf=b.valueOf),a}function p(a,b){var c,d,e;if("undefined"!=typeof b._isAMomentObject&&(a._isAMomentObject=b._isAMomentObject),"undefined"!=typeof b._i&&(a._i=b._i),"undefined"!=typeof b._f&&(a._f=b._f),"undefined"!=typeof b._l&&(a._l=b._l),"undefined"!=typeof b._strict&&(a._strict=b._strict),"undefined"!=typeof b._tzm&&(a._tzm=b._tzm),"undefined"!=typeof b._isUTC&&(a._isUTC=b._isUTC),"undefined"!=typeof b._offset&&(a._offset=b._offset),"undefined"!=typeof b._pf&&(a._pf=b._pf),"undefined"!=typeof b._locale&&(a._locale=b._locale),Kb.length>0)for(c in Kb)d=Kb[c],e=b[d],"undefined"!=typeof e&&(a[d]=e);return a}function q(a){return 0>a?Math.ceil(a):Math.floor(a)}function r(a,b,c){for(var d=""+Math.abs(a),e=a>=0;d.lengthd;d++)(c&&a[d]!==b[d]||!c&&C(a[d])!==C(b[d]))&&g++;return g+f}function z(a){if(a){var b=a.toLowerCase().replace(/(.)s$/,"$1");a=lc[a]||mc[b]||b}return a}function A(a){var b,d,e={};for(d in a)c(a,d)&&(b=z(d),b&&(e[b]=a[d]));return e}function B(b){var c,d;if(0===b.indexOf("week"))c=7,d="day";else{if(0!==b.indexOf("month"))return;c=12,d="month"}vb[b]=function(e,f){var g,h,i=vb._locale[b],j=[];if("number"==typeof e&&(f=e,e=a),h=function(a){var b=vb().utc().set(d,a);return i.call(vb._locale,b,e||"")},null!=f)return h(f);for(g=0;c>g;g++)j.push(h(g));return j}}function C(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=b>=0?Math.floor(b):Math.ceil(b)),c}function D(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function E(a,b,c){return jb(vb([a,11,31+b-c]),b,c).week}function F(a){return G(a)?366:365}function G(a){return a%4===0&&a%100!==0||a%400===0}function H(a){var b;a._a&&-2===a._pf.overflow&&(b=a._a[Db]<0||a._a[Db]>11?Db:a._a[Eb]<1||a._a[Eb]>D(a._a[Cb],a._a[Db])?Eb:a._a[Fb]<0||a._a[Fb]>24||24===a._a[Fb]&&(0!==a._a[Gb]||0!==a._a[Hb]||0!==a._a[Ib])?Fb:a._a[Gb]<0||a._a[Gb]>59?Gb:a._a[Hb]<0||a._a[Hb]>59?Hb:a._a[Ib]<0||a._a[Ib]>999?Ib:-1,a._pf._overflowDayOfYear&&(Cb>b||b>Eb)&&(b=Eb),a._pf.overflow=b)}function I(b){return null==b._isValid&&(b._isValid=!isNaN(b._d.getTime())&&b._pf.overflow<0&&!b._pf.empty&&!b._pf.invalidMonth&&!b._pf.nullInput&&!b._pf.invalidFormat&&!b._pf.userInvalidated,b._strict&&(b._isValid=b._isValid&&0===b._pf.charsLeftOver&&0===b._pf.unusedTokens.length&&b._pf.bigHour===a)),b._isValid}function J(a){return a?a.toLowerCase().replace("_","-"):a}function K(a){for(var b,c,d,e,f=0;f0;){if(d=L(e.slice(0,b).join("-")))return d;if(c&&c.length>=b&&y(e,c,!0)>=b-1)break;b--}f++}return null}function L(a){var b=null;if(!Jb[a]&&Lb)try{b=vb.locale(),require("./locale/"+a),vb.locale(b)}catch(c){}return Jb[a]}function M(a,b){var c,d;return b._isUTC?(c=b.clone(),d=(vb.isMoment(a)||x(a)?+a:+vb(a))-+c,c._d.setTime(+c._d+d),vb.updateOffset(c,!1),c):vb(a).local()}function N(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function O(a){var b,c,d=a.match(Pb);for(b=0,c=d.length;c>b;b++)d[b]=rc[d[b]]?rc[d[b]]:N(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 P(a,b){return a.isValid()?(b=Q(b,a.localeData()),nc[b]||(nc[b]=O(b)),nc[b](a)):a.localeData().invalidDate()}function Q(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(Qb.lastIndex=0;d>=0&&Qb.test(a);)a=a.replace(Qb,c),Qb.lastIndex=0,d-=1;return a}function R(a,b){var c,d=b._strict;switch(a){case"Q":return _b;case"DDDD":return bc;case"YYYY":case"GGGG":case"gggg":return d?cc:Tb;case"Y":case"G":case"g":return ec;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return d?dc:Ub;case"S":if(d)return _b;case"SS":if(d)return ac;case"SSS":if(d)return bc;case"DDD":return Sb;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Wb;case"a":case"A":return b._locale._meridiemParse;case"x":return Zb;case"X":return $b;case"Z":case"ZZ":return Xb;case"T":return Yb;case"SSSS":return Vb;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return d?ac:Rb;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return Rb;case"Do":return d?b._locale._ordinalParse:b._locale._ordinalParseLenient;default:return c=new RegExp($(Z(a.replace("\\","")),"i"))}}function S(a){a=a||"";var b=a.match(Xb)||[],c=b[b.length-1]||[],d=(c+"").match(jc)||["-",0,0],e=+(60*d[1])+C(d[2]);return"+"===d[0]?e:-e}function T(a,b,c){var d,e=c._a;switch(a){case"Q":null!=b&&(e[Db]=3*(C(b)-1));break;case"M":case"MM":null!=b&&(e[Db]=C(b)-1);break;case"MMM":case"MMMM":d=c._locale.monthsParse(b,a,c._strict),null!=d?e[Db]=d:c._pf.invalidMonth=b;break;case"D":case"DD":null!=b&&(e[Eb]=C(b));break;case"Do":null!=b&&(e[Eb]=C(parseInt(b.match(/\d{1,2}/)[0],10)));break;case"DDD":case"DDDD":null!=b&&(c._dayOfYear=C(b));break;case"YY":e[Cb]=vb.parseTwoDigitYear(b);break;case"YYYY":case"YYYYY":case"YYYYYY":e[Cb]=C(b);break;case"a":case"A":c._meridiem=b;break;case"h":case"hh":c._pf.bigHour=!0;case"H":case"HH":e[Fb]=C(b);break;case"m":case"mm":e[Gb]=C(b);break;case"s":case"ss":e[Hb]=C(b);break;case"S":case"SS":case"SSS":case"SSSS":e[Ib]=C(1e3*("0."+b));break;case"x":c._d=new Date(C(b));break;case"X":c._d=new Date(1e3*parseFloat(b));break;case"Z":case"ZZ":c._useUTC=!0,c._tzm=S(b);break;case"dd":case"ddd":case"dddd":d=c._locale.weekdaysParse(b),null!=d?(c._w=c._w||{},c._w.d=d):c._pf.invalidWeekday=b;break;case"w":case"ww":case"W":case"WW":case"d":case"e":case"E":a=a.substr(0,1);case"gggg":case"GGGG":case"GGGGG":a=a.substr(0,2),b&&(c._w=c._w||{},c._w[a]=C(b));break;case"gg":case"GG":c._w=c._w||{},c._w[a]=vb.parseTwoDigitYear(b)}}function U(a){var c,d,e,f,g,h,i;c=a._w,null!=c.GG||null!=c.W||null!=c.E?(g=1,h=4,d=b(c.GG,a._a[Cb],jb(vb(),1,4).year),e=b(c.W,1),f=b(c.E,1)):(g=a._locale._week.dow,h=a._locale._week.doy,d=b(c.gg,a._a[Cb],jb(vb(),g,h).year),e=b(c.w,1),null!=c.d?(f=c.d,g>f&&++e):f=null!=c.e?c.e+g:g),i=kb(d,e,f,h,g),a._a[Cb]=i.year,a._dayOfYear=i.dayOfYear}function V(a){var c,d,e,f,g=[];if(!a._d){for(e=X(a),a._w&&null==a._a[Eb]&&null==a._a[Db]&&U(a),a._dayOfYear&&(f=b(a._a[Cb],e[Cb]),a._dayOfYear>F(f)&&(a._pf._overflowDayOfYear=!0),d=fb(f,0,a._dayOfYear),a._a[Db]=d.getUTCMonth(),a._a[Eb]=d.getUTCDate()),c=0;3>c&&null==a._a[c];++c)a._a[c]=g[c]=e[c];for(;7>c;c++)a._a[c]=g[c]=null==a._a[c]?2===c?1:0:a._a[c];24===a._a[Fb]&&0===a._a[Gb]&&0===a._a[Hb]&&0===a._a[Ib]&&(a._nextDay=!0,a._a[Fb]=0),a._d=(a._useUTC?fb:eb).apply(null,g),null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()-a._tzm),a._nextDay&&(a._a[Fb]=24)}}function W(a){var b;a._d||(b=A(a._i),a._a=[b.year,b.month,b.day||b.date,b.hour,b.minute,b.second,b.millisecond],V(a))}function X(a){var b=new Date;return a._useUTC?[b.getUTCFullYear(),b.getUTCMonth(),b.getUTCDate()]:[b.getFullYear(),b.getMonth(),b.getDate()]}function Y(b){if(b._f===vb.ISO_8601)return void ab(b);b._a=[],b._pf.empty=!0;var c,d,e,f,g,h=""+b._i,i=h.length,j=0;for(e=Q(b._f,b._locale).match(Pb)||[],c=0;c0&&b._pf.unusedInput.push(g),h=h.slice(h.indexOf(d)+d.length),j+=d.length),rc[f]?(d?b._pf.empty=!1:b._pf.unusedTokens.push(f),T(f,d,b)):b._strict&&!d&&b._pf.unusedTokens.push(f);b._pf.charsLeftOver=i-j,h.length>0&&b._pf.unusedInput.push(h),b._pf.bigHour===!0&&b._a[Fb]<=12&&(b._pf.bigHour=a),b._a[Fb]=k(b._locale,b._a[Fb],b._meridiem),V(b),H(b)}function Z(a){return a.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e})}function $(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function _(a){var b,c,e,f,g;if(0===a._f.length)return a._pf.invalidFormat=!0,void(a._d=new Date(0/0));for(f=0;fg)&&(e=g,c=b));o(a,c||b)}function ab(a){var b,c,d=a._i,e=fc.exec(d);if(e){for(a._pf.iso=!0,b=0,c=hc.length;c>b;b++)if(hc[b][1].exec(d)){a._f=hc[b][0]+(e[6]||" ");break}for(b=0,c=ic.length;c>b;b++)if(ic[b][1].exec(d)){a._f+=ic[b][0];break}d.match(Xb)&&(a._f+="Z"),Y(a)}else a._isValid=!1}function bb(a){ab(a),a._isValid===!1&&(delete a._isValid,vb.createFromInputFallback(a))}function cb(a,b){var c,d=[];for(c=0;ca&&h.setFullYear(a),h}function fb(a){var b=new Date(Date.UTC.apply(null,arguments));return 1970>a&&b.setUTCFullYear(a),b}function gb(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 hb(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function ib(a,b,c){var d=vb.duration(a).abs(),e=Ab(d.as("s")),f=Ab(d.as("m")),g=Ab(d.as("h")),h=Ab(d.as("d")),i=Ab(d.as("M")),j=Ab(d.as("y")),k=e0,k[4]=c,hb.apply({},k)}function jb(a,b,c){var d,e=c-b,f=c-a.day();return f>e&&(f-=7),e-7>f&&(f+=7),d=vb(a).add(f,"d"),{week:Math.ceil(d.dayOfYear()/7),year:d.year()}}function kb(a,b,c,d,e){var f,g,h=fb(a,0,1).getUTCDay();return h=0===h?7:h,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:F(a-1)+g}}function lb(b){var c,d=b._i,e=b._f;return b._locale=b._locale||vb.localeData(b._l),null===d||e===a&&""===d?vb.invalid({nullInput:!0}):("string"==typeof d&&(b._i=d=b._locale.preparse(d)),vb.isMoment(d)?new m(d,!0):(e?w(e)?_(b):Y(b):db(b),c=new m(b),c._nextDay&&(c.add(1,"d"),c._nextDay=a),c))}function mb(a,b){var c,d;if(1===b.length&&w(b[0])&&(b=b[0]),!b.length)return vb();for(c=b[0],d=1;d=0?"+":"-";return b+r(Math.abs(a),6)},gg:function(){return r(this.weekYear()%100,2)},gggg:function(){return r(this.weekYear(),4)},ggggg:function(){return r(this.weekYear(),5)},GG:function(){return r(this.isoWeekYear()%100,2)},GGGG:function(){return r(this.isoWeekYear(),4)},GGGGG:function(){return r(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.localeData().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.localeData().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 C(this.milliseconds()/100)},SS:function(){return r(C(this.milliseconds()/10),2)},SSS:function(){return r(this.milliseconds(),3)},SSSS:function(){return r(this.milliseconds(),3)},Z:function(){var a=this.utcOffset(),b="+";return 0>a&&(a=-a,b="-"),b+r(C(a/60),2)+":"+r(C(a)%60,2)},ZZ:function(){var a=this.utcOffset(),b="+";return 0>a&&(a=-a,b="-"),b+r(C(a/60),2)+r(C(a)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},x:function(){return this.valueOf()},X:function(){return this.unix()},Q:function(){return this.quarter()}},sc={},tc=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"],uc=!1;pc.length;)xb=pc.pop(),rc[xb+"o"]=i(rc[xb],xb);for(;qc.length;)xb=qc.pop(),rc[xb+xb]=h(rc[xb],2);rc.DDDD=h(rc.DDD,3),o(l.prototype,{set:function(a){var b,c;for(c in a)b=a[c],"function"==typeof b?this[c]=b:this["_"+c]=b;this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)},_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,b,c){var d,e,f;for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),d=0;12>d;d++){if(e=vb.utc([2e3,d]),c&&!this._longMonthsParse[d]&&(this._longMonthsParse[d]=new RegExp("^"+this.months(e,"").replace(".","")+"$","i"),this._shortMonthsParse[d]=new RegExp("^"+this.monthsShort(e,"").replace(".","")+"$","i")),c||this._monthsParse[d]||(f="^"+this.months(e,"")+"|^"+this.monthsShort(e,""),this._monthsParse[d]=new RegExp(f.replace(".",""),"i")),c&&"MMMM"===b&&this._longMonthsParse[d].test(a))return d;if(c&&"MMM"===b&&this._shortMonthsParse[d].test(a))return d;if(!c&&this._monthsParse[d].test(a))return d}},_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=vb([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:{LTS:"h:mm:ss A",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,c){var d=this._calendar[a];return"function"==typeof d?d.apply(b,[c]):d},_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",_ordinalParse:/\d{1,2}/,preparse:function(a){return a},postformat:function(a){return a},week:function(a){return jb(a,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},firstDayOfWeek:function(){return this._week.dow},firstDayOfYear:function(){return this._week.doy},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),vb=function(b,c,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._i=b,g._f=c,g._l=e,g._strict=f,g._isUTC=!1,g._pf=d(),lb(g)},vb.suppressDeprecationWarnings=!1,vb.createFromInputFallback=f("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(a){a._d=new Date(a._i+(a._useUTC?" UTC":""))}),vb.min=function(){var a=[].slice.call(arguments,0);return mb("isBefore",a)},vb.max=function(){var a=[].slice.call(arguments,0);return mb("isAfter",a)},vb.utc=function(b,c,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=b,g._f=c,g._strict=f,g._pf=d(),lb(g).utc()},vb.unix=function(a){return vb(1e3*a)},vb.duration=function(a,b){var d,e,f,g,h=a,i=null;return vb.isDuration(a)?h={ms:a._milliseconds,d:a._days,M:a._months}:"number"==typeof a?(h={},b?h[b]=a:h.milliseconds=a):(i=Nb.exec(a))?(d="-"===i[1]?-1:1,h={y:0,d:C(i[Eb])*d,h:C(i[Fb])*d,m:C(i[Gb])*d,s:C(i[Hb])*d,ms:C(i[Ib])*d}):(i=Ob.exec(a))?(d="-"===i[1]?-1:1,f=function(a){var b=a&&parseFloat(a.replace(",","."));return(isNaN(b)?0:b)*d},h={y:f(i[2]),M:f(i[3]),d:f(i[4]),h:f(i[5]),m:f(i[6]),s:f(i[7]),w:f(i[8])}):null==h?h={}:"object"==typeof h&&("from"in h||"to"in h)&&(g=t(vb(h.from),vb(h.to)),h={},h.ms=g.milliseconds,h.M=g.months),e=new n(h),vb.isDuration(a)&&c(a,"_locale")&&(e._locale=a._locale),e},vb.version=yb,vb.defaultFormat=gc,vb.ISO_8601=function(){},vb.momentProperties=Kb,vb.updateOffset=function(){},vb.relativeTimeThreshold=function(b,c){return oc[b]===a?!1:c===a?oc[b]:(oc[b]=c,!0)},vb.lang=f("moment.lang is deprecated. Use moment.locale instead.",function(a,b){return vb.locale(a,b)}),vb.locale=function(a,b){var c;return a&&(c="undefined"!=typeof b?vb.defineLocale(a,b):vb.localeData(a),c&&(vb.duration._locale=vb._locale=c)),vb._locale._abbr},vb.defineLocale=function(a,b){return null!==b?(b.abbr=a,Jb[a]||(Jb[a]=new l),Jb[a].set(b),vb.locale(a),Jb[a]):(delete Jb[a],null)},vb.langData=f("moment.langData is deprecated. Use moment.localeData instead.",function(a){return vb.localeData(a)}),vb.localeData=function(a){var b;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return vb._locale;if(!w(a)){if(b=L(a))return b;a=[a]}return K(a)},vb.isMoment=function(a){return a instanceof m||null!=a&&c(a,"_isAMomentObject")},vb.isDuration=function(a){return a instanceof n};for(xb=tc.length-1;xb>=0;--xb)B(tc[xb]);vb.normalizeUnits=function(a){return z(a)},vb.invalid=function(a){var b=vb.utc(0/0);return null!=a?o(b._pf,a):b._pf.userInvalidated=!0,b},vb.parseZone=function(){return vb.apply(null,arguments).parseZone()},vb.parseTwoDigitYear=function(a){return C(a)+(C(a)>68?1900:2e3)},vb.isDate=x,o(vb.fn=m.prototype,{clone:function(){return vb(this)},valueOf:function(){return+this._d-6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().locale("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=vb(this).utc();return 00:!1},parsingFlags:function(){return o({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(a){return this.utcOffset(0,a)},local:function(a){return this._isUTC&&(this.utcOffset(0,a),this._isUTC=!1,a&&this.subtract(this._dateUtcOffset(),"m")),this},format:function(a){var b=P(this,a||vb.defaultFormat);return this.localeData().postformat(b)},add:u(1,"add"),subtract:u(-1,"subtract"),diff:function(a,b,c){var d,e,f=M(a,this),g=6e4*(f.utcOffset()-this.utcOffset());return b=z(b),"year"===b||"month"===b||"quarter"===b?(e=j(this,f),"quarter"===b?e/=3:"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:q(e)},from:function(a,b){return vb.duration({to:this,from:a}).locale(this.locale()).humanize(!b)},fromNow:function(a){return this.from(vb(),a)},calendar:function(a){var b=a||vb(),c=M(b,this).startOf("day"),d=this.diff(c,"days",!0),e=-6>d?"sameElse":-1>d?"lastWeek":0>d?"lastDay":1>d?"sameDay":2>d?"nextDay":7>d?"nextWeek":"sameElse";return this.format(this.localeData().calendar(e,this,vb(b)))},isLeapYear:function(){return G(this.year())},isDST:function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},day:function(a){var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=gb(a,this.localeData()),this.add(a-b,"d")):b},month:qb("Month",!0),startOf:function(a){switch(a=z(a)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===a?this.weekday(0):"isoWeek"===a&&this.isoWeekday(1),"quarter"===a&&this.month(3*Math.floor(this.month()/3)),this},endOf:function(b){return b=z(b),b===a||"millisecond"===b?this:this.startOf(b).add(1,"isoWeek"===b?"week":b).subtract(1,"ms")},isAfter:function(a,b){var c;return b=z("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=vb.isMoment(a)?a:vb(a),+this>+a):(c=vb.isMoment(a)?+a:+vb(a),c<+this.clone().startOf(b))},isBefore:function(a,b){var c;return b=z("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=vb.isMoment(a)?a:vb(a),+a>+this):(c=vb.isMoment(a)?+a:+vb(a),+this.clone().endOf(b)a?this:a}),max:f("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(a){return a=vb.apply(null,arguments),a>this?this:a}),zone:f("moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779",function(a,b){return null!=a?("string"!=typeof a&&(a=-a),this.utcOffset(a,b),this):-this.utcOffset()}),utcOffset:function(a,b){var c,d=this._offset||0;return null!=a?("string"==typeof a&&(a=S(a)),Math.abs(a)<16&&(a=60*a),!this._isUTC&&b&&(c=this._dateUtcOffset()),this._offset=a,this._isUTC=!0,null!=c&&this.add(c,"m"),d!==a&&(!b||this._changeInProgress?v(this,vb.duration(a-d,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,vb.updateOffset(this,!0),this._changeInProgress=null)),this):this._isUTC?d:this._dateUtcOffset()},isLocal:function(){return!this._isUTC},isUtcOffset:function(){return this._isUTC},isUtc:function(){return this._isUTC&&0===this._offset},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.utcOffset(this._tzm):"string"==typeof this._i&&this.utcOffset(S(this._i)),this},hasAlignedHourOffset:function(a){return a=a?vb(a).utcOffset():0,(this.utcOffset()-a)%60===0},daysInMonth:function(){return D(this.year(),this.month())},dayOfYear:function(a){var b=Ab((vb(this).startOf("day")-vb(this).startOf("year"))/864e5)+1;return null==a?b:this.add(a-b,"d")},quarter:function(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)},weekYear:function(a){var b=jb(this,this.localeData()._week.dow,this.localeData()._week.doy).year;return null==a?b:this.add(a-b,"y")},isoWeekYear:function(a){var b=jb(this,1,4).year;return null==a?b:this.add(a-b,"y")},week:function(a){var b=this.localeData().week(this);return null==a?b:this.add(7*(a-b),"d")},isoWeek:function(a){var b=jb(this,1,4).week;return null==a?b:this.add(7*(a-b),"d")},weekday:function(a){var b=(this.day()+7-this.localeData()._week.dow)%7;return null==a?b:this.add(a-b,"d")},isoWeekday:function(a){return null==a?this.day()||7:this.day(this.day()%7?a:a-7)},isoWeeksInYear:function(){return E(this.year(),1,4)},weeksInYear:function(){var a=this.localeData()._week;return E(this.year(),a.dow,a.doy)},get:function(a){return a=z(a),this[a]()},set:function(a,b){var c;if("object"==typeof a)for(c in a)this.set(c,a[c]);else a=z(a),"function"==typeof this[a]&&this[a](b);return this},locale:function(b){var c;return b===a?this._locale._abbr:(c=vb.localeData(b),null!=c&&(this._locale=c),this)},lang:f("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(b){return b===a?this.localeData():this.locale(b)}),localeData:function(){return this._locale},_dateUtcOffset:function(){return 15*-Math.round(this._d.getTimezoneOffset()/15)}}),vb.fn.millisecond=vb.fn.milliseconds=qb("Milliseconds",!1),vb.fn.second=vb.fn.seconds=qb("Seconds",!1),vb.fn.minute=vb.fn.minutes=qb("Minutes",!1),vb.fn.hour=vb.fn.hours=qb("Hours",!0),vb.fn.date=qb("Date",!0),vb.fn.dates=f("dates accessor is deprecated. Use date instead.",qb("Date",!0)),vb.fn.year=qb("FullYear",!0),vb.fn.years=f("years accessor is deprecated. Use year instead.",qb("FullYear",!0)),vb.fn.days=vb.fn.day,vb.fn.months=vb.fn.month,vb.fn.weeks=vb.fn.week,vb.fn.isoWeeks=vb.fn.isoWeek,vb.fn.quarters=vb.fn.quarter,vb.fn.toJSON=vb.fn.toISOString,vb.fn.isUTC=vb.fn.isUtc,o(vb.duration.fn=n.prototype,{_bubble:function(){var a,b,c,d=this._milliseconds,e=this._days,f=this._months,g=this._data,h=0;g.milliseconds=d%1e3,a=q(d/1e3),g.seconds=a%60,b=q(a/60),g.minutes=b%60,c=q(b/60),g.hours=c%24,e+=q(c/24),h=q(rb(e)),e-=q(sb(h)),f+=q(e/30),e%=30,h+=q(f/12),f%=12,g.days=e,g.months=f,g.years=h},abs:function(){return this._milliseconds=Math.abs(this._milliseconds),this._days=Math.abs(this._days),this._months=Math.abs(this._months),this._data.milliseconds=Math.abs(this._data.milliseconds),this._data.seconds=Math.abs(this._data.seconds),this._data.minutes=Math.abs(this._data.minutes),this._data.hours=Math.abs(this._data.hours),this._data.months=Math.abs(this._data.months),this._data.years=Math.abs(this._data.years),this},weeks:function(){return q(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*C(this._months/12) +},humanize:function(a){var b=ib(this,!a,this.localeData());return a&&(b=this.localeData().pastFuture(+this,b)),this.localeData().postformat(b)},add:function(a,b){var c=vb.duration(a,b);return this._milliseconds+=c._milliseconds,this._days+=c._days,this._months+=c._months,this._bubble(),this},subtract:function(a,b){var c=vb.duration(a,b);return this._milliseconds-=c._milliseconds,this._days-=c._days,this._months-=c._months,this._bubble(),this},get:function(a){return a=z(a),this[a.toLowerCase()+"s"]()},as:function(a){var b,c;if(a=z(a),"month"===a||"year"===a)return b=this._days+this._milliseconds/864e5,c=this._months+12*rb(b),"month"===a?c:c/12;switch(b=this._days+Math.round(sb(this._months/12)),a){case"week":return b/7+this._milliseconds/6048e5;case"day":return b+this._milliseconds/864e5;case"hour":return 24*b+this._milliseconds/36e5;case"minute":return 24*b*60+this._milliseconds/6e4;case"second":return 24*b*60*60+this._milliseconds/1e3;case"millisecond":return Math.floor(24*b*60*60*1e3)+this._milliseconds;default:throw new Error("Unknown unit "+a)}},lang:vb.fn.lang,locale:vb.fn.locale,toIsoString:f("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",function(){return this.toISOString()}),toISOString:function(){var a=Math.abs(this.years()),b=Math.abs(this.months()),c=Math.abs(this.days()),d=Math.abs(this.hours()),e=Math.abs(this.minutes()),f=Math.abs(this.seconds()+this.milliseconds()/1e3);return this.asSeconds()?(this.asSeconds()<0?"-":"")+"P"+(a?a+"Y":"")+(b?b+"M":"")+(c?c+"D":"")+(d||e||f?"T":"")+(d?d+"H":"")+(e?e+"M":"")+(f?f+"S":""):"P0D"},localeData:function(){return this._locale},toJSON:function(){return this.toISOString()}}),vb.duration.fn.toString=vb.duration.fn.toISOString;for(xb in kc)c(kc,xb)&&tb(xb.toLowerCase());vb.duration.fn.asMilliseconds=function(){return this.as("ms")},vb.duration.fn.asSeconds=function(){return this.as("s")},vb.duration.fn.asMinutes=function(){return this.as("m")},vb.duration.fn.asHours=function(){return this.as("h")},vb.duration.fn.asDays=function(){return this.as("d")},vb.duration.fn.asWeeks=function(){return this.as("weeks")},vb.duration.fn.asMonths=function(){return this.as("M")},vb.duration.fn.asYears=function(){return this.as("y")},vb.locale("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var b=a%10,c=1===C(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}),function(a){a(vb)}(function(a){return a.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(a){return/^nm$/i.test(a)},meridiem:function(a,b,c){return 12>a?c?"vm":"VM":c?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[Môre om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("ar-ma",{months:"يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:6,doy:12}})}),function(a){a(vb)}(function(a){var b={1:"Ù¡",2:"Ù¢",3:"Ù£",4:"Ù¤",5:"Ù¥",6:"Ù¦",7:"Ù§",8:"Ù¨",9:"Ù©",0:"Ù "},c={"Ù¡":"1","Ù¢":"2","Ù£":"3","Ù¤":"4","Ù¥":"5","Ù¦":"6","Ù§":"7","Ù¨":"8","Ù©":"9","Ù ":"0"};return a.defineLocale("ar-sa",{months:"يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),monthsShort:"يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiemParse:/ص|Ù…/,isPM:function(a){return"Ù…"===a},meridiem:function(a){return 12>a?"ص":"Ù…"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(a){return a.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(a){return c[a]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]}).replace(/,/g,"ØŒ")},week:{dow:6,doy:12}})}),function(a){a(vb)}(function(a){return a.defineLocale("ar-tn",{months:"جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),monthsShort:"جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){var b={1:"Ù¡",2:"Ù¢",3:"Ù£",4:"Ù¤",5:"Ù¥",6:"Ù¦",7:"Ù§",8:"Ù¨",9:"Ù©",0:"Ù "},c={"Ù¡":"1","Ù¢":"2","Ù£":"3","Ù¤":"4","Ù¥":"5","Ù¦":"6","Ù§":"7","Ù¨":"8","Ù©":"9","Ù ":"0"},d=function(a){return 0===a?0:1===a?1:2===a?2:a%100>=3&&10>=a%100?3:a%100>=11?4:5},e={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},f=function(a){return function(b,c){var f=d(b),g=e[a][d(b)];return 2===f&&(g=g[c?0:1]),g.replace(/%d/i,b)}},g=["كانون الثاني يناير","شباط Ùبراير","آذار مارس","نيسان أبريل","أيار مايو","حزيران يونيو","تموز يوليو","آب أغسطس","أيلول سبتمبر","تشرين الأول أكتوبر","تشرين الثاني نوÙمبر","كانون الأول ديسمبر"];return a.defineLocale("ar",{months:g,monthsShort:g,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiemParse:/ص|Ù…/,isPM:function(a){return"Ù…"===a},meridiem:function(a){return 12>a?"ص":"Ù…"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:f("s"),m:f("m"),mm:f("m"),h:f("h"),hh:f("h"),d:f("d"),dd:f("d"),M:f("M"),MM:f("M"),y:f("y"),yy:f("y")},preparse:function(a){return a.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(a){return c[a]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]}).replace(/,/g,"ØŒ")},week:{dow:6,doy:12}})}),function(a){a(vb)}(function(a){var b={1:"-inci",5:"-inci",8:"-inci",70:"-inci",80:"-inci",2:"-nci",7:"-nci",20:"-nci",50:"-nci",3:"-üncü",4:"-üncü",100:"-üncü",6:"-ncı",9:"-uncu",10:"-uncu",30:"-uncu",60:"-ıncı",90:"-ıncı"};return a.defineLocale("az",{months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekdays:"Bazar_Bazar ertÉ™si_ÇərÅŸÉ™nbÉ™ axÅŸamı_ÇərÅŸÉ™nbÉ™_CümÉ™ axÅŸamı_CümÉ™_ŞənbÉ™".split("_"),weekdaysShort:"Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən".split("_"),weekdaysMin:"Bz_BE_ÇA_Çə_CA_Cü_Şə".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[sabah saat] LT",nextWeek:"[gÉ™lÉ™n hÉ™ftÉ™] dddd [saat] LT",lastDay:"[dünÉ™n] LT",lastWeek:"[keçən hÉ™ftÉ™] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s É™vvÉ™l",s:"birneçə saniyyÉ™",m:"bir dÉ™qiqÉ™",mm:"%d dÉ™qiqÉ™",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},meridiemParse:/gecÉ™|sÉ™hÉ™r|gündüz|axÅŸam/,isPM:function(a){return/^(gündüz|axÅŸam)$/.test(a)},meridiem:function(a){return 4>a?"gecÉ™":12>a?"sÉ™hÉ™r":17>a?"gündüz":"axÅŸam"},ordinalParse:/\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,ordinal:function(a){if(0===a)return a+"-ıncı";var c=a%10,d=a%100-c,e=a>=100?100:null;return a+(b[c]||b[d]||b[e])},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){function b(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:c?"хвіліна_хвіліны_хвілін":"хвіліну_хвіліны_хвілін",hh:c?"гадзіна_гадзіны_гадзін":"гадзіну_гадзіны_гадзін",dd:"дзень_дні_дзён",MM:"меÑÑц_меÑÑцы_меÑÑцаў",yy:"год_гады_гадоў"};return"m"===d?c?"хвіліна":"хвіліну":"h"===d?c?"гадзіна":"гадзіну":a+" "+b(e[d],+a)}function d(a,b){var c={nominative:"Ñтудзень_люты_Ñакавік_краÑавік_травень_чÑрвень_ліпень_жнівень_вераÑень_каÑтрычнік_ліÑтапад_Ñнежань".split("_"),accusative:"ÑтудзенÑ_лютага_Ñакавіка_краÑавіка_траўнÑ_чÑрвенÑ_ліпенÑ_жніўнÑ_вераÑнÑ_каÑтрычніка_ліÑтапада_ÑнежнÑ".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function e(a,b){var c={nominative:"нÑдзелÑ_панÑдзелак_аўторак_Ñерада_чацвер_пÑтніца_Ñубота".split("_"),accusative:"нÑдзелю_панÑдзелак_аўторак_Ñераду_чацвер_пÑтніцу_Ñуботу".split("_")},d=/\[ ?[Вв] ?(?:мінулую|наÑтупную)? ?\] ?dddd/.test(b)?"accusative":"nominative";return c[d][a.day()]}return a.defineLocale("be",{months:d,monthsShort:"Ñтуд_лют_Ñак_краÑ_трав_чÑрв_ліп_жнів_вер_каÑÑ‚_ліÑÑ‚_Ñнеж".split("_"),weekdays:e,weekdaysShort:"нд_пн_ат_ÑÑ€_чц_пт_Ñб".split("_"),weekdaysMin:"нд_пн_ат_ÑÑ€_чц_пт_Ñб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., LT",LLLL:"dddd, D MMMM YYYY г., LT"},calendar:{sameDay:"[Ð¡Ñ‘Ð½Ð½Ñ Ñž] LT",nextDay:"[Заўтра Ñž] LT",lastDay:"[Учора Ñž] LT",nextWeek:function(){return"[У] dddd [Ñž] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[У мінулую] dddd [Ñž] LT";case 1:case 2:case 4:return"[У мінулы] dddd [Ñž] LT"}},sameElse:"L"},relativeTime:{future:"праз %s",past:"%s таму",s:"некалькі Ñекунд",m:c,mm:c,h:c,hh:c,d:"дзень",dd:c,M:"меÑÑц",MM:c,y:"год",yy:c},meridiemParse:/ночы|раніцы|днÑ|вечара/,isPM:function(a){return/^(днÑ|вечара)$/.test(a)},meridiem:function(a){return 4>a?"ночы":12>a?"раніцы":17>a?"днÑ":"вечара"},ordinalParse:/\d{1,2}-(Ñ–|Ñ‹|га)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":case"w":case"W":return a%10!==2&&a%10!==3||a%100===12||a%100===13?a+"-Ñ‹":a+"-Ñ–";case"D":return a+"-га";default:return a}},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("bg",{months:"Ñнуари_февруари_март_април_май_юни_юли_авгуÑÑ‚_Ñептември_октомври_ноември_декември".split("_"),monthsShort:"Ñнр_фев_мар_апр_май_юни_юли_авг_Ñеп_окт_ное_дек".split("_"),weekdays:"неделÑ_понеделник_вторник_ÑÑ€Ñда_четвъртък_петък_Ñъбота".split("_"),weekdaysShort:"нед_пон_вто_ÑÑ€Ñ_чет_пет_Ñъб".split("_"),weekdaysMin:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Ð”Ð½ÐµÑ Ð²] LT",nextDay:"[Утре в] LT",nextWeek:"dddd [в] LT",lastDay:"[Вчера в] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Ð’ изминалата] dddd [в] LT";case 1:case 2:case 4:case 5:return"[Ð’ изминалиÑ] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"Ñлед %s",past:"преди %s",s:"нÑколко Ñекунди",m:"минута",mm:"%d минути",h:"чаÑ",hh:"%d чаÑа",d:"ден",dd:"%d дни",M:"меÑец",MM:"%d меÑеца",y:"година",yy:"%d години"},ordinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(a){var b=a%10,c=a%100;return 0===a?a+"-ев":0===c?a+"-ен":c>10&&20>c?a+"-ти":1===b?a+"-ви":2===b?a+"-ри":7===b||8===b?a+"-ми":a+"-ти"},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){var b={1:"১",2:"২",3:"৩",4:"৪",5:"৫",6:"৬",7:"৭",8:"৮",9:"৯",0:"০"},c={"১":"1","২":"2","৩":"3","৪":"4","৫":"5","৬":"6","৭":"7","৮":"8","৯":"9","০":"0"};return a.defineLocale("bn",{months:"জানà§à§Ÿà¦¾à¦°à§€_ফেবà§à§Ÿà¦¾à¦°à§€_মারà§à¦š_à¦à¦ªà§à¦°à¦¿à¦²_মে_জà§à¦¨_জà§à¦²à¦¾à¦‡_অগাসà§à¦Ÿ_সেপà§à¦Ÿà§‡à¦®à§à¦¬à¦°_অকà§à¦Ÿà§‹à¦¬à¦°_নভেমà§à¦¬à¦°_ডিসেমà§à¦¬à¦°".split("_"),monthsShort:"জানà§_ফেব_মারà§à¦š_à¦à¦ªà¦°_মে_জà§à¦¨_জà§à¦²_অগ_সেপà§à¦Ÿ_অকà§à¦Ÿà§‹_নভ_ডিসেমà§".split("_"),weekdays:"রবিবার_সোমবার_মঙà§à¦—লবার_বà§à¦§à¦¬à¦¾à¦°_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿à¦¬à¦¾à¦°_শà§à¦•à§à¦°à§à¦¬à¦¾à¦°_শনিবার".split("_"),weekdaysShort:"রবি_সোম_মঙà§à¦—ল_বà§à¦§_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿_শà§à¦•à§à¦°à§_শনি".split("_"),weekdaysMin:"রব_সম_মঙà§à¦—_বà§_বà§à¦°à¦¿à¦¹_শà§_শনি".split("_"),longDateFormat:{LT:"A h:mm সময়",LTS:"A h:mm:ss সময়",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[আজ] LT",nextDay:"[আগামীকাল] LT",nextWeek:"dddd, LT",lastDay:"[গতকাল] LT",lastWeek:"[গত] dddd, LT",sameElse:"L"},relativeTime:{future:"%s পরে",past:"%s আগে",s:"কà¦à¦• সেকেনà§à¦¡",m:"à¦à¦• মিনিট",mm:"%d মিনিট",h:"à¦à¦• ঘনà§à¦Ÿà¦¾",hh:"%d ঘনà§à¦Ÿà¦¾",d:"à¦à¦• দিন",dd:"%d দিন",M:"à¦à¦• মাস",MM:"%d মাস",y:"à¦à¦• বছর",yy:"%d বছর"},preparse:function(a){return a.replace(/[১২৩৪৫৬৭৮৯০]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/রাত|শকাল|দà§à¦ªà§à¦°|বিকেল|রাত/,isPM:function(a){return/^(দà§à¦ªà§à¦°|বিকেল|রাত)$/.test(a)},meridiem:function(a){return 4>a?"রাত":10>a?"শকাল":17>a?"দà§à¦ªà§à¦°":20>a?"বিকেল":"রাত"},week:{dow:0,doy:6}})}),function(a){a(vb)}(function(a){var b={1:"༡",2:"༢",3:"༣",4:"༤",5:"༥",6:"༦",7:"༧",8:"༨",9:"༩",0:"༠"},c={"༡":"1","༢":"2","༣":"3","༤":"4","༥":"5","༦":"6","༧":"7","༨":"8","༩":"9","༠":"0"};return a.defineLocale("bo",{months:"ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ".split("_"),monthsShort:"ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ".split("_"),weekdays:"གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་".split("_"),weekdaysShort:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),weekdaysMin:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),longDateFormat:{LT:"A h:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[དི་རིང] LT",nextDay:"[སང་ཉིན] LT",nextWeek:"[བདུན་ཕྲག་རྗེས་མ], LT",lastDay:"[à½à¼‹à½¦à½„] LT",lastWeek:"[བདུན་ཕྲག་མà½à½ à¼‹à½˜] dddd, LT",sameElse:"L"},relativeTime:{future:"%s ལ་",past:"%s སྔན་ལ",s:"ལམ་སང",m:"སà¾à½¢à¼‹à½˜à¼‹à½‚ཅིག",mm:"%d སà¾à½¢à¼‹à½˜",h:"ཆུ་ཚོད་གཅིག",hh:"%d ཆུ་ཚོད",d:"ཉིན་གཅིག",dd:"%d ཉིན་",M:"ཟླ་བ་གཅིག",MM:"%d ཟླ་བ",y:"ལོ་གཅིག",yy:"%d ལོ"},preparse:function(a){return a.replace(/[༡༢༣༤༥༦༧༨༩༠]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,isPM:function(a){return/^(ཉིན་གུང|དགོང་དག|མཚན་མོ)$/.test(a)},meridiem:function(a){return 4>a?"མཚན་མོ":10>a?"ཞོགས་ཀས":17>a?"ཉིན་གུང":20>a?"དགོང་དག":"མཚན་མོ"},week:{dow:0,doy:6}})}),function(a){a(vb)}(function(b){function c(a,b,c){var d={mm:"munutenn",MM:"miz",dd:"devezh"};return a+" "+f(d[c],a)}function d(a){switch(e(a)){case 1:case 3:case 4:case 5:case 9:return a+" bloaz";default:return a+" vloaz"}}function e(a){return a>9?e(a%10):a}function f(a,b){return 2===b?g(a):a}function g(b){var c={m:"v",b:"v",d:"z"};return c[b.charAt(0)]===a?b:c[b.charAt(0)]+b.substring(1)}return b.defineLocale("br",{months:"Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),longDateFormat:{LT:"h[e]mm A",LTS:"h[e]mm:ss A",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY LT",LLLL:"dddd, D [a viz] MMMM YYYY LT"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc'hoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec'h da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s 'zo",s:"un nebeud segondennoù",m:"ur vunutenn",mm:c,h:"un eur",hh:"%d eur",d:"un devezh",dd:c,M:"ur miz",MM:c,y:"ur bloaz",yy:d},ordinalParse:/\d{1,2}(añ|vet)/,ordinal:function(a){var b=1===a?"añ":"vet";return a+b},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d=a+" ";switch(c){case"m":return b?"jedna minuta":"jedne minute";case"mm":return d+=1===a?"minuta":2===a||3===a||4===a?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return d+=1===a?"sat":2===a||3===a||4===a?"sata":"sati";case"dd":return d+=1===a?"dan":"dana";case"MM":return d+=1===a?"mjesec":2===a||3===a||4===a?"mjeseca":"mjeseci";case"yy":return d+=1===a?"godina":2===a||3===a||4===a?"godine":"godina"}}return a.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),weekdays:"nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._Äet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_Äe_pe_su".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[proÅ¡lu] dddd [u] LT";case 6:return"[proÅ¡le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[proÅ¡li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:b,mm:b,h:b,hh:b,d:"dan",dd:b,M:"mjesec",MM:b,y:"godinu",yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("ca",{months:"gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),monthsShort:"gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.".split("_"),weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[demà a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"fa %s",s:"uns segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},ordinalParse:/\d{1,2}(r|n|t|è|a)/,ordinal:function(a,b){var c=1===a?"r":2===a?"n":3===a?"r":4===a?"t":"è";return("w"===b||"W"===b)&&(c="a"),a+c},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a){return a>1&&5>a&&1!==~~(a/10)}function c(a,c,d,e){var f=a+" ";switch(d){case"s":return c||e?"pár sekund":"pár sekundami";case"m":return c?"minuta":e?"minutu":"minutou";case"mm":return c||e?f+(b(a)?"minuty":"minut"):f+"minutami";break;case"h":return c?"hodina":e?"hodinu":"hodinou";case"hh":return c||e?f+(b(a)?"hodiny":"hodin"):f+"hodinami";break;case"d":return c||e?"den":"dnem";case"dd":return c||e?f+(b(a)?"dny":"dní"):f+"dny";break;case"M":return c||e?"mÄ›síc":"mÄ›sícem";case"MM":return c||e?f+(b(a)?"mÄ›síce":"mÄ›síců"):f+"mÄ›síci";break;case"y":return c||e?"rok":"rokem";case"yy":return c||e?f+(b(a)?"roky":"let"):f+"lety"}}var d="leden_únor_bÅ™ezen_duben_kvÄ›ten_Äerven_Äervenec_srpen_září_říjen_listopad_prosinec".split("_"),e="led_úno_bÅ™e_dub_kvÄ›_Ävn_Ävc_srp_zář_říj_lis_pro".split("_");return a.defineLocale("cs",{months:d,monthsShort:e,monthsParse:function(a,b){var c,d=[];for(c=0;12>c;c++)d[c]=new RegExp("^"+a[c]+"$|^"+b[c]+"$","i");return d}(d,e),weekdays:"nedÄ›le_pondÄ›lí_úterý_stÅ™eda_Ätvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_Ät_pá_so".split("_"),weekdaysMin:"ne_po_út_st_Ät_pá_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedÄ›li v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve stÅ™edu v] LT";case 4:return"[ve Ätvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[vÄera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou nedÄ›li v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou stÅ™edu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pÅ™ed %s",s:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("cv",{months:"кăрлач_нарăÑ_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав".split("_"),monthsShort:"кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш".split("_"),weekdays:"вырÑарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_Ñрнекун_шăматкун".split("_"),weekdaysShort:"выр_тун_ытл_юн_кĕç_Ñрн_шăм".split("_"),weekdaysMin:"вр_тн_Ñ‹Ñ‚_юн_кç_ÑÑ€_шм".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD-MM-YYYY",LL:"YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]",LLL:"YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT",LLLL:"dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT"},calendar:{sameDay:"[ПаÑн] LT [Ñехетре]",nextDay:"[Ыран] LT [Ñехетре]",lastDay:"[Ĕнер] LT [Ñехетре]",nextWeek:"[ÇитеÑ] dddd LT [Ñехетре]",lastWeek:"[Иртнĕ] dddd LT [Ñехетре]",sameElse:"L"},relativeTime:{future:function(a){var b=/Ñехет$/i.exec(a)?"рен":/çул$/i.exec(a)?"тан":"ран";return a+b},past:"%s каÑлла",s:"пĕр-ик çеккунт",m:"пĕр минут",mm:"%d минут",h:"пĕр Ñехет",hh:"%d Ñехет",d:"пĕр кун",dd:"%d кун",M:"пĕр уйăх",MM:"%d уйăх",y:"пĕр çул",yy:"%d çул"},ordinalParse:/\d{1,2}-мĕш/,ordinal:"%d-мĕш",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("cy",{months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Heddiw am] LT",nextDay:"[Yfory am] LT",nextWeek:"dddd [am] LT",lastDay:"[Ddoe am] LT",lastWeek:"dddd [diwethaf am] LT",sameElse:"L"},relativeTime:{future:"mewn %s",past:"%s yn ôl",s:"ychydig eiliadau",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"},ordinalParse:/\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,ordinal:function(a){var b=a,c="",d=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"];return b>20?c=40===b||50===b||60===b||80===b||100===b?"fed":"ain":b>0&&(c=d[b]),a+c},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd [d.] D. MMMM YYYY LT"},calendar:{sameDay:"[I dag kl.] LT",nextDay:"[I morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[I gÃ¥r kl.] LT",lastWeek:"[sidste] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"fÃ¥ sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en mÃ¥ned",MM:"%d mÃ¥neder",y:"et Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[a+" Tage",a+" Tagen"],M:["ein Monat","einem Monat"],MM:[a+" Monate",a+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[a+" Jahre",a+" Jahren"]};return b?d[c][0]:d[c][1]}return a.defineLocale("de-at",{months:"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT [Uhr]",sameElse:"L",nextDay:"[Morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[Gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:b,mm:"%d Minuten",h:b,hh:"%d Stunden",d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[a+" Tage",a+" Tagen"],M:["ein Monat","einem Monat"],MM:[a+" Monate",a+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[a+" Jahre",a+" Jahren"]};return b?d[c][0]:d[c][1]}return a.defineLocale("de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT [Uhr]",sameElse:"L",nextDay:"[Morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[Gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:b,mm:"%d Minuten",h:b,hh:"%d Stunden",d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("el",{monthsNominativeEl:"ΙανουάÏιος_ΦεβÏουάÏιος_ΜάÏτιος_ΑπÏίλιος_Μάιος_ΙοÏνιος_ΙοÏλιος_ΑÏγουστος_ΣεπτέμβÏιος_ΟκτώβÏιος_ÎοέμβÏιος_ΔεκέμβÏιος".split("_"),monthsGenitiveEl:"ΙανουαÏίου_ΦεβÏουαÏίου_ΜαÏτίου_ΑπÏιλίου_ΜαÎου_Ιουνίου_Ιουλίου_ΑυγοÏστου_ΣεπτεμβÏίου_ΟκτωβÏίου_ÎοεμβÏίου_ΔεκεμβÏίου".split("_"),months:function(a,b){return/D/.test(b.substring(0,b.indexOf("MMMM")))?this._monthsGenitiveEl[a.month()]:this._monthsNominativeEl[a.month()]},monthsShort:"Ιαν_Φεβ_ΜαÏ_ΑπÏ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Îοε_Δεκ".split("_"),weekdays:"ΚυÏιακή_ΔευτέÏα_ΤÏίτη_ΤετάÏτη_Πέμπτη_ΠαÏασκευή_Σάββατο".split("_"),weekdaysShort:"ΚυÏ_Δευ_ΤÏι_Τετ_Πεμ_ΠαÏ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_ΤÏ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(a,b,c){return a>11?c?"μμ":"ΜΜ":c?"πμ":"ΠΜ"},isPM:function(a){return"μ"===(a+"").toLowerCase()[0]},meridiemParse:/[ΠΜ]\.?Îœ?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendarEl:{sameDay:"[ΣήμεÏα {}] LT",nextDay:"[ΑÏÏιο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[το Ï€ÏοηγοÏμενο] dddd [{}] LT";default:return"[την Ï€ÏοηγοÏμενη] dddd [{}] LT"}},sameElse:"L"},calendar:function(a,b){var c=this._calendarEl[a],d=b&&b.hours();return"function"==typeof c&&(c=c.apply(b)),c.replace("{}",d%12===1?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s Ï€Ïιν",s:"λίγα δευτεÏόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ÏŽÏα",hh:"%d ÏŽÏες",d:"μία μέÏα",dd:"%d μέÏες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χÏόνος",yy:"%d χÏόνια"},ordinalParse:/\d{1,2}η/,ordinal:"%dη",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},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"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"D MMMM, YYYY",LLL:"D MMMM, YYYY LT",LLLL:"dddd, D MMMM, YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},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"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th"; +return a+c}})}),function(a){a(vb)}(function(a){return a.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},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"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_aÅ­gusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aÅ­g_sep_okt_nov_dec".split("_"),weekdays:"Dimanĉo_Lundo_Mardo_Merkredo_Ä´aÅ­do_Vendredo_Sabato".split("_"),weekdaysShort:"Dim_Lun_Mard_Merk_Ä´aÅ­_Ven_Sab".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Ä´a_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"D[-an de] MMMM, YYYY",LLL:"D[-an de] MMMM, YYYY LT",LLLL:"dddd, [la] D[-an de] MMMM, YYYY LT"},meridiemParse:/[ap]\.t\.m/i,isPM:function(a){return"p"===a.charAt(0).toLowerCase()},meridiem:function(a,b,c){return a>11?c?"p.t.m.":"P.T.M.":c?"a.t.m.":"A.T.M."},calendar:{sameDay:"[HodiaÅ­ je] LT",nextDay:"[MorgaÅ­ je] LT",nextWeek:"dddd [je] LT",lastDay:"[HieraÅ­ je] LT",lastWeek:"[pasinta] dddd [je] LT",sameElse:"L"},relativeTime:{future:"je %s",past:"antaÅ­ %s",s:"sekundoj",m:"minuto",mm:"%d minutoj",h:"horo",hh:"%d horoj",d:"tago",dd:"%d tagoj",M:"monato",MM:"%d monatoj",y:"jaro",yy:"%d jaroj"},ordinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){var b="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),c="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");return a.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(a,d){return/-MMM-/.test(d)?c[a.month()]:b[a.month()]},weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c,d){var e={s:["mõne sekundi","mõni sekund","paar sekundit"],m:["ühe minuti","üks minut"],mm:[a+" minuti",a+" minutit"],h:["ühe tunni","tund aega","üks tund"],hh:[a+" tunni",a+" tundi"],d:["ühe päeva","üks päev"],M:["kuu aja","kuu aega","üks kuu"],MM:[a+" kuu",a+" kuud"],y:["ühe aasta","aasta","üks aasta"],yy:[a+" aasta",a+" aastat"]};return b?e[c][2]?e[c][2]:e[c][1]:d?e[c][0]:e[c][1]}return a.defineLocale("et",{months:"jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Täna,] LT",nextDay:"[Homme,] LT",nextWeek:"[Järgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s pärast",past:"%s tagasi",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:"%d päeva",M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] LT",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] LT",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] LT",llll:"ddd, YYYY[ko] MMM D[a] LT"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){var b={1:"Û±",2:"Û²",3:"Û³",4:"Û´",5:"Ûµ",6:"Û¶",7:"Û·",8:"Û¸",9:"Û¹",0:"Û°"},c={"Û±":"1","Û²":"2","Û³":"3","Û´":"4","Ûµ":"5","Û¶":"6","Û·":"7","Û¸":"8","Û¹":"9","Û°":"0"};return a.defineLocale("fa",{months:"ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ÛŒ_د_س_Ú†_Ù¾_ج_Ø´".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},meridiemParse:/قبل از ظهر|بعد از ظهر/,isPM:function(a){return/بعد از ظهر/.test(a)},meridiem:function(a){return 12>a?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[Ùردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چندین ثانیه",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(a){return a.replace(/[Û°-Û¹]/g,function(a){return c[a]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]}).replace(/,/g,"ØŒ")},ordinalParse:/\d{1,2}Ù…/,ordinal:"%dÙ…",week:{dow:6,doy:12}})}),function(a){a(vb)}(function(a){function b(a,b,d,e){var f="";switch(d){case"s":return e?"muutaman sekunnin":"muutama sekunti";case"m":return e?"minuutin":"minuutti";case"mm":f=e?"minuutin":"minuuttia";break;case"h":return e?"tunnin":"tunti";case"hh":f=e?"tunnin":"tuntia";break;case"d":return e?"päivän":"päivä";case"dd":f=e?"päivän":"päivää";break;case"M":return e?"kuukauden":"kuukausi";case"MM":f=e?"kuukauden":"kuukautta";break;case"y":return e?"vuoden":"vuosi";case"yy":f=e?"vuoden":"vuotta"}return f=c(a,e)+" "+f}function c(a,b){return 10>a?b?e[a]:d[a]:a}var d="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),e=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",d[7],d[8],d[9]];return a.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] LT",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] LT",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] LT",llll:"ddd, Do MMM YYYY, [klo] LT"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("fo",{months:"januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur".split("_"),weekdaysShort:"sun_mán_týs_mik_hós_frí_ley".split("_"),weekdaysMin:"su_má_tý_mi_hó_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D. MMMM, YYYY LT"},calendar:{sameDay:"[à dag kl.] LT",nextDay:"[à morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[à gjár kl.] LT",lastWeek:"[síðstu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s síðani",s:"fá sekund",m:"ein minutt",mm:"%d minuttir",h:"ein tími",hh:"%d tímar",d:"ein dagur",dd:"%d dagar",M:"ein mánaði",MM:"%d mánaðir",y:"eitt ár",yy:"%d ár"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|)/,ordinal:function(a){return a+(1===a?"er":"")}})}),function(a){a(vb)}(function(a){return a.defineLocale("fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|)/,ordinal:function(a){return a+(1===a?"er":"")},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){var b="jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.".split("_"),c="jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_");return a.defineLocale("fy",{months:"jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber".split("_"),monthsShort:function(a,d){return/-MMM-/.test(d)?c[a.month()]:b[a.month()]},weekdays:"snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon".split("_"),weekdaysShort:"si._mo._ti._wo._to._fr._so.".split("_"),weekdaysMin:"Si_Mo_Ti_Wo_To_Fr_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[hjoed om] LT",nextDay:"[moarn om] LT",nextWeek:"dddd [om] LT",lastDay:"[juster om] LT",lastWeek:"[ôfrûne] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oer %s",past:"%s lyn",s:"in pear sekonden",m:"ien minút",mm:"%d minuten",h:"ien oere",hh:"%d oeren",d:"ien dei",dd:"%d dagen",M:"ien moanne",MM:"%d moannen",y:"ien jier",yy:"%d jierren"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("gl",{months:"Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro".split("_"),monthsShort:"Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.".split("_"),weekdays:"Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado".split("_"),weekdaysShort:"Dom._Lun._Mar._Mér._Xov._Ven._Sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mé_Xo_Ve_Sá".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"ás":"á")+"] LT"},nextDay:function(){return"[mañá "+(1!==this.hours()?"ás":"á")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"ás":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"á":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"ás":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(a){return"uns segundos"===a?"nuns segundos":"en "+a},past:"hai %s",s:"uns segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("he",{months:"ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר".split("_"),monthsShort:"ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳".split("_"),weekdays:"ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),weekdaysShort:"×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),weekdaysMin:"×_ב_×’_ד_×”_ו_ש".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY LT",LLLL:"dddd, D [ב]MMMM YYYY LT",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY LT",llll:"ddd, D MMM YYYY LT"},calendar:{sameDay:"[×”×™×•× ×‘Ö¾]LT",nextDay:"[מחר ב־]LT",nextWeek:"dddd [בשעה] LT",lastDay:"[×תמול ב־]LT",lastWeek:"[ביו×] dddd [×”×חרון בשעה] LT",sameElse:"L"},relativeTime:{future:"בעוד %s",past:"לפני %s",s:"מספר שניות",m:"דקה",mm:"%d דקות",h:"שעה",hh:function(a){return 2===a?"שעתיי×":a+" שעות"},d:"יו×",dd:function(a){return 2===a?"יומיי×":a+" ימי×"},M:"חודש",MM:function(a){return 2===a?"חודשיי×":a+" חודשי×"},y:"שנה",yy:function(a){return 2===a?"שנתיי×":a%10===0&&10!==a?a+" שנה":a+" שני×"}}})}),function(a){a(vb)}(function(a){var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return a.defineLocale("hi",{months:"जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°".split("_"),monthsShort:"जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.".split("_"),weekdays:"रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि".split("_"),weekdaysMin:"र_सो_मं_बà¥_गà¥_शà¥_श".split("_"),longDateFormat:{LT:"A h:mm बजे",LTS:"A h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कà¥à¤› ही कà¥à¤·à¤£",m:"à¤à¤• मिनट",mm:"%d मिनट",h:"à¤à¤• घंटा",hh:"%d घंटे",d:"à¤à¤• दिन",dd:"%d दिन",M:"à¤à¤• महीने",MM:"%d महीने",y:"à¤à¤• वरà¥à¤·",yy:"%d वरà¥à¤·"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/रात|सà¥à¤¬à¤¹|दोपहर|शाम/,meridiemHour:function(a,b){return 12===a&&(a=0),"रात"===b?4>a?a:a+12:"सà¥à¤¬à¤¹"===b?a:"दोपहर"===b?a>=10?a:a+12:"शाम"===b?a+12:void 0},meridiem:function(a){return 4>a?"रात":10>a?"सà¥à¤¬à¤¹":17>a?"दोपहर":20>a?"शाम":"रात"},week:{dow:0,doy:6}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d=a+" ";switch(c){case"m":return b?"jedna minuta":"jedne minute";case"mm":return d+=1===a?"minuta":2===a||3===a||4===a?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return d+=1===a?"sat":2===a||3===a||4===a?"sata":"sati";case"dd":return d+=1===a?"dan":"dana";case"MM":return d+=1===a?"mjesec":2===a||3===a||4===a?"mjeseca":"mjeseci";case"yy":return d+=1===a?"godina":2===a||3===a||4===a?"godine":"godina"}}return a.defineLocale("hr",{months:"sjeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_"),monthsShort:"sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),weekdays:"nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._Äet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_Äe_pe_su".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[proÅ¡lu] dddd [u] LT";case 6:return"[proÅ¡le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[proÅ¡li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:b,mm:b,h:b,hh:b,d:"dan",dd:b,M:"mjesec",MM:b,y:"godinu",yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){function b(a,b,c,d){var e=a;switch(c){case"s":return d||b?"néhány másodperc":"néhány másodperce";case"m":return"egy"+(d||b?" perc":" perce");case"mm":return e+(d||b?" perc":" perce");case"h":return"egy"+(d||b?" óra":" órája");case"hh":return e+(d||b?" óra":" órája");case"d":return"egy"+(d||b?" nap":" napja");case"dd":return e+(d||b?" nap":" napja");case"M":return"egy"+(d||b?" hónap":" hónapja");case"MM":return e+(d||b?" hónap":" hónapja");case"y":return"egy"+(d||b?" év":" éve");case"yy":return e+(d||b?" év":" éve")}return""}function c(a){return(a?"":"[múlt] ")+"["+d[this.day()]+"] LT[-kor]"}var d="vasárnap hétfÅ‘n kedden szerdán csütörtökön pénteken szombaton".split(" ");return a.defineLocale("hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfÅ‘_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D., LT",LLLL:"YYYY. MMMM D., dddd LT"},meridiemParse:/de|du/i,isPM:function(a){return"u"===a.charAt(1).toLowerCase()},meridiem:function(a,b,c){return 12>a?c===!0?"de":"DE":c===!0?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return c.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return c.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){function b(a,b){var c={nominative:"Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€_Õ´Õ¡Ö€Õ¿_Õ¡ÕºÖ€Õ«Õ¬_Õ´Õ¡ÕµÕ«Õ½_Õ°Õ¸Ö‚Õ¶Õ«Õ½_Õ°Õ¸Ö‚Õ¬Õ«Õ½_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€".split("_"),accusative:"Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€Õ«_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€Õ«_Õ´Õ¡Ö€Õ¿Õ«_Õ¡ÕºÖ€Õ«Õ¬Õ«_Õ´Õ¡ÕµÕ«Õ½Õ«_Õ°Õ¸Ö‚Õ¶Õ«Õ½Õ«_Õ°Õ¸Ö‚Õ¬Õ«Õ½Õ«_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½Õ«_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function c(a){var b="Õ°Õ¶Õ¾_ÖƒÕ¿Ö€_Õ´Ö€Õ¿_Õ¡ÕºÖ€_Õ´ÕµÕ½_Õ°Õ¶Õ½_Õ°Õ¬Õ½_Ö…Õ£Õ½_Õ½ÕºÕ¿_Õ°Õ¯Õ¿_Õ¶Õ´Õ¢_Õ¤Õ¯Õ¿".split("_");return b[a.month()]}function d(a){var b="Õ¯Õ«Ö€Õ¡Õ¯Õ«_Õ¥Ö€Õ¯Õ¸Ö‚Õ·Õ¡Õ¢Õ©Õ«_Õ¥Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ¹Õ¸Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ°Õ«Õ¶Õ£Õ·Õ¡Õ¢Õ©Õ«_Õ¸Ö‚Ö€Õ¢Õ¡Õ©_Õ·Õ¡Õ¢Õ¡Õ©".split("_");return b[a.day()]}return a.defineLocale("hy-am",{months:b,monthsShort:c,weekdays:d,weekdaysShort:"Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©".split("_"),weekdaysMin:"Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY Õ©.",LLL:"D MMMM YYYY Õ©., LT",LLLL:"dddd, D MMMM YYYY Õ©., LT"},calendar:{sameDay:"[Õ¡ÕµÕ½Ö…Ö€] LT",nextDay:"[Õ¾Õ¡Õ²Õ¨] LT",lastDay:"[Õ¥Ö€Õ¥Õ¯] LT",nextWeek:function(){return"dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT"},lastWeek:function(){return"[Õ¡Õ¶ÖÕ¡Õ®] dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT"},sameElse:"L"},relativeTime:{future:"%s Õ°Õ¥Õ¿Õ¸",past:"%s Õ¡Õ¼Õ¡Õ»",s:"Õ´Õ« Ö„Õ¡Õ¶Õ« Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶",m:"Ö€Õ¸ÕºÕ¥",mm:"%d Ö€Õ¸ÕºÕ¥",h:"ÕªÕ¡Õ´",hh:"%d ÕªÕ¡Õ´",d:"Ö…Ö€",dd:"%d Ö…Ö€",M:"Õ¡Õ´Õ«Õ½",MM:"%d Õ¡Õ´Õ«Õ½",y:"Õ¿Õ¡Ö€Õ«",yy:"%d Õ¿Õ¡Ö€Õ«"},meridiemParse:/Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡|Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡|ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶/,isPM:function(a){return/^(ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶)$/.test(a)},meridiem:function(a){return 4>a?"Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡":12>a?"Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡":17>a?"ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡":"Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶"},ordinalParse:/\d{1,2}|\d{1,2}-(Õ«Õ¶|Ö€Õ¤)/,ordinal:function(a,b){switch(b){case"DDD":case"w":case"W":case"DDDo":return 1===a?a+"-Õ«Õ¶":a+"-Ö€Õ¤";default:return a}},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"LT.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] LT",LLLL:"dddd, D MMMM YYYY [pukul] LT"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(a,b){return 12===a&&(a=0),"pagi"===b?a:"siang"===b?a>=11?a:a+12:"sore"===b||"malam"===b?a+12:void 0},meridiem:function(a){return 11>a?"pagi":15>a?"siang":19>a?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){function b(a){return a%100===11?!0:a%10===1?!1:!0}function c(a,c,d,e){var f=a+" ";switch(d){case"s":return c||e?"nokkrar sekúndur":"nokkrum sekúndum";case"m":return c?"mínúta":"mínútu";case"mm":return b(a)?f+(c||e?"mínútur":"mínútum"):c?f+"mínúta":f+"mínútu";case"hh":return b(a)?f+(c||e?"klukkustundir":"klukkustundum"):f+"klukkustund";case"d":return c?"dagur":e?"dag":"degi";case"dd":return b(a)?c?f+"dagar":f+(e?"daga":"dögum"):c?f+"dagur":f+(e?"dag":"degi");case"M":return c?"mánuður":e?"mánuð":"mánuði";case"MM":return b(a)?c?f+"mánuðir":f+(e?"mánuði":"mánuðum"):c?f+"mánuður":f+(e?"mánuð":"mánuði");case"y":return c||e?"ár":"ári";case"yy":return b(a)?f+(c||e?"ár":"árum"):f+(c||e?"ár":"ári")}}return a.defineLocale("is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd, D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:c,m:c,mm:c,h:"klukkustund",hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),weekdaysShort:"Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),weekdaysMin:"D_L_Ma_Me_G_V_S".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(a){return(/^[0-9].+$/.test(a)?"tra":"in")+" "+a},past:"%s fa",s:"alcuni secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_ç«æ›œæ—¥_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"æ—¥_月_ç«_æ°´_木_金_土".split("_"),weekdaysMin:"æ—¥_月_ç«_æ°´_木_金_土".split("_"),longDateFormat:{LT:"Ah時m分",LTS:"LTs秒",L:"YYYY/MM/DD",LL:"YYYYå¹´M月Dæ—¥",LLL:"YYYYå¹´M月Dæ—¥LT",LLLL:"YYYYå¹´M月Dæ—¥LT dddd"},meridiemParse:/åˆå‰|åˆå¾Œ/i,isPM:function(a){return"åˆå¾Œ"===a},meridiem:function(a){return 12>a?"åˆå‰":"åˆå¾Œ"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:"[æ¥é€±]dddd LT",lastDay:"[昨日] LT",lastWeek:"[å‰é€±]dddd LT",sameElse:"L"},relativeTime:{future:"%s後",past:"%så‰",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1æ—¥",dd:"%dæ—¥",M:"1ヶ月",MM:"%dヶ月",y:"1å¹´",yy:"%då¹´"}})}),function(a){a(vb)}(function(a){function b(a,b){var c={nominative:"იáƒáƒœáƒ•áƒáƒ áƒ˜_თებერვáƒáƒšáƒ˜_მáƒáƒ áƒ¢áƒ˜_áƒáƒžáƒ áƒ˜áƒšáƒ˜_მáƒáƒ˜áƒ¡áƒ˜_ივნისი_ივლისი_áƒáƒ’ვისტáƒ_სექტემბერი_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი_ნáƒáƒ”მბერი_დეკემბერი".split("_"),accusative:"იáƒáƒœáƒ•áƒáƒ áƒ¡_თებერვáƒáƒšáƒ¡_მáƒáƒ áƒ¢áƒ¡_áƒáƒžáƒ áƒ˜áƒšáƒ˜áƒ¡_მáƒáƒ˜áƒ¡áƒ¡_ივნისს_ივლისს_áƒáƒ’ვისტს_სექტემბერს_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერს_ნáƒáƒ”მბერს_დეკემბერს".split("_")},d=/D[oD] *MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function c(a,b){var c={nominative:"კვირáƒ_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ი_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი_ხუთშáƒáƒ‘áƒáƒ—ი_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი_შáƒáƒ‘áƒáƒ—ი".split("_"),accusative:"კვირáƒáƒ¡_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ს_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ს_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ს_ხუთშáƒáƒ‘áƒáƒ—ს_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვს_შáƒáƒ‘áƒáƒ—ს".split("_")},d=/(წინáƒ|შემდეგ)/.test(b)?"accusative":"nominative";return c[d][a.day()]}return a.defineLocale("ka",{months:b,monthsShort:"იáƒáƒœ_თებ_მáƒáƒ _áƒáƒžáƒ _მáƒáƒ˜_ივნ_ივლ_áƒáƒ’ვ_სექ_áƒáƒ¥áƒ¢_ნáƒáƒ”_დეკ".split("_"),weekdays:c,weekdaysShort:"კვი_áƒáƒ áƒ¨_სáƒáƒ›_áƒáƒ—ხ_ხუთ_პáƒáƒ _შáƒáƒ‘".split("_"),weekdaysMin:"კვ_áƒáƒ _სáƒ_áƒáƒ—_ხუ_პáƒ_შáƒ".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[დღეს] LT[-ზე]",nextDay:"[ხვáƒáƒš] LT[-ზე]",lastDay:"[გუშინ] LT[-ზე]",nextWeek:"[შემდეგ] dddd LT[-ზე]",lastWeek:"[წინáƒ] dddd LT-ზე",sameElse:"L"},relativeTime:{future:function(a){return/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|წელი)/.test(a)?a.replace(/ი$/,"ში"):a+"ში"},past:function(a){return/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|დღე|თვე)/.test(a)?a.replace(/(ი|ე)$/,"ის წინ"):/წელი/.test(a)?a.replace(/წელი$/,"წლის წინ"):void 0},s:"რáƒáƒ›áƒ“ენიმე წáƒáƒ›áƒ˜",m:"წუთი",mm:"%d წუთი",h:"სáƒáƒáƒ—ი",hh:"%d სáƒáƒáƒ—ი",d:"დღე",dd:"%d დღე",M:"თვე",MM:"%d თვე",y:"წელი",yy:"%d წელი"},ordinalParse:/0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/,ordinal:function(a){return 0===a?a:1===a?a+"-ლი":20>a||100>=a&&a%20===0||a%100===0?"მე-"+a:a+"-ე"},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("km",{months:"មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ".split("_"),monthsShort:"មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ".split("_"),weekdays:"អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ".split("_"),weekdaysShort:"អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ".split("_"),weekdaysMin:"អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[ážáŸ’ងៃនៈ ម៉ោង] LT",nextDay:"[ស្អែក ម៉ោង] LT",nextWeek:"dddd [ម៉ោង] LT",lastDay:"[ម្សិលមិញ ម៉ោង] LT",lastWeek:"dddd [សប្ážáž¶áž áŸáž˜áž»áž“] [ម៉ោង] LT",sameElse:"L"},relativeTime:{future:"%sទៀáž",past:"%sមុន",s:"ប៉ុន្មានវិនាទី",m:"មួយនាទី",mm:"%d នាទី",h:"មួយម៉ោង",hh:"%d ម៉ោង",d:"មួយážáŸ’ងៃ",dd:"%d ážáŸ’ងៃ",M:"មួយážáŸ‚",MM:"%d ážáŸ‚",y:"មួយឆ្នាំ",yy:"%d ឆ្នាំ"},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("ko",{months:"1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"),monthsShort:"1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"),weekdays:"ì¼ìš”ì¼_월요ì¼_화요ì¼_수요ì¼_목요ì¼_금요ì¼_토요ì¼".split("_"),weekdaysShort:"ì¼_ì›”_í™”_수_목_금_토".split("_"),weekdaysMin:"ì¼_ì›”_í™”_수_목_금_토".split("_"),longDateFormat:{LT:"A hì‹œ m분",LTS:"A hì‹œ m분 sì´ˆ",L:"YYYY.MM.DD",LL:"YYYYë…„ MMMM Dì¼",LLL:"YYYYë…„ MMMM Dì¼ LT",LLLL:"YYYYë…„ MMMM Dì¼ dddd LT"},calendar:{sameDay:"오늘 LT",nextDay:"ë‚´ì¼ LT",nextWeek:"dddd LT",lastDay:"ì–´ì œ LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s ì „",s:"몇초",ss:"%dì´ˆ",m:"ì¼ë¶„",mm:"%d분",h:"한시간",hh:"%d시간",d:"하루",dd:"%dì¼",M:"한달",MM:"%d달",y:"ì¼ë…„",yy:"%dë…„"},ordinalParse:/\d{1,2}ì¼/,ordinal:"%dì¼",meridiemParse:/오전|오후/,isPM:function(a){return"오후"===a},meridiem:function(a){return 12>a?"오전":"오후"}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return b?d[c][0]:d[c][1]}function c(a){var b=a.substr(0,a.indexOf(" "));return e(b)?"a "+a:"an "+a}function d(a){var b=a.substr(0,a.indexOf(" "));return e(b)?"viru "+a:"virun "+a}function e(a){if(a=parseInt(a,10),isNaN(a))return!1;if(0>a)return!0;if(10>a)return a>=4&&7>=a?!0:!1;if(100>a){var b=a%10,c=a/10;return e(0===b?c:b)}if(1e4>a){for(;a>=10;)a/=10;return e(a)}return a/=1e3,e(a)}return a.defineLocale("lb",{months:"Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._Mé._Dë._Më._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mé_Dë_Më_Do_Fr_Sa".split("_"),longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gëschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:c,past:d,s:"e puer Sekonnen",m:b,mm:"%d Minutten",h:b,hh:"%d Stonnen",d:b,dd:"%d Deeg",M:b,MM:"%d Méint",y:b,yy:"%d Joer"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c,d){return b?"kelios sekundÄ—s":d?"kelių sekundžių":"kelias sekundes"}function c(a,b,c,d){return b?e(c)[0]:d?e(c)[1]:e(c)[2] +}function d(a){return a%10===0||a>10&&20>a}function e(a){return h[a].split("_")}function f(a,b,f,g){var h=a+" ";return 1===a?h+c(a,b,f[0],g):b?h+(d(a)?e(f)[1]:e(f)[0]):g?h+e(f)[1]:h+(d(a)?e(f)[1]:e(f)[2])}function g(a,b){var c=-1===b.indexOf("dddd HH:mm"),d=i[a.day()];return c?d:d.substring(0,d.length-2)+"į"}var h={m:"minutÄ—_minutÄ—s_minutÄ™",mm:"minutÄ—s_minuÄių_minutes",h:"valanda_valandos_valandÄ…",hh:"valandos_valandų_valandas",d:"diena_dienos_dienÄ…",dd:"dienos_dienų_dienas",M:"mÄ—nuo_mÄ—nesio_mÄ—nesį",MM:"mÄ—nesiai_mÄ—nesių_mÄ—nesius",y:"metai_metų_metus",yy:"metai_metų_metus"},i="sekmadienis_pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis".split("_");return a.defineLocale("lt",{months:"sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio".split("_"),monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:g,weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Å eÅ¡".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Å ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], LT [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, LT [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], LT [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, LT [val.]"},calendar:{sameDay:"[Å iandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[PraÄ—jusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieÅ¡ %s",s:b,m:c,mm:f,h:c,hh:f,d:c,dd:f,M:c,MM:f,y:c,yy:f},ordinalParse:/\d{1,2}-oji/,ordinal:function(a){return a+"-oji"},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d=a.split("_");return c?b%10===1&&11!==b?d[2]:d[3]:b%10===1&&11!==b?d[0]:d[1]}function c(a,c,e){return a+" "+b(d[e],a,c)}var d={mm:"minÅ«ti_minÅ«tes_minÅ«te_minÅ«tes",hh:"stundu_stundas_stunda_stundas",dd:"dienu_dienas_diena_dienas",MM:"mÄ“nesi_mÄ“neÅ¡us_mÄ“nesis_mÄ“neÅ¡i",yy:"gadu_gadus_gads_gadi"};return a.defineLocale("lv",{months:"janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jÅ«n_jÅ«l_aug_sep_okt_nov_dec".split("_"),weekdays:"svÄ“tdiena_pirmdiena_otrdiena_treÅ¡diena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, LT",LLLL:"YYYY. [gada] D. MMMM, dddd, LT"},calendar:{sameDay:"[Å odien pulksten] LT",nextDay:"[RÄ«t pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[PagÄjuÅ¡Ä] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"%s vÄ“lÄk",past:"%s agrÄk",s:"dažas sekundes",m:"minÅ«ti",mm:c,h:"stundu",hh:c,d:"dienu",dd:c,M:"mÄ“nesi",MM:c,y:"gadu",yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("mk",{months:"јануари_февруари_март_април_мај_јуни_јули_авгуÑÑ‚_Ñептември_октомври_ноември_декември".split("_"),monthsShort:"јан_фев_мар_апр_мај_јун_јул_авг_Ñеп_окт_ное_дек".split("_"),weekdays:"недела_понеделник_вторник_Ñреда_четврток_петок_Ñабота".split("_"),weekdaysShort:"нед_пон_вто_Ñре_чет_пет_Ñаб".split("_"),weekdaysMin:"нe_пo_вт_ÑÑ€_че_пе_Ña".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Ð”ÐµÐ½ÐµÑ Ð²Ð¾] LT",nextDay:"[Утре во] LT",nextWeek:"dddd [во] LT",lastDay:"[Вчера во] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Во изминатата] dddd [во] LT";case 1:case 2:case 4:case 5:return"[Во изминатиот] dddd [во] LT"}},sameElse:"L"},relativeTime:{future:"поÑле %s",past:"пред %s",s:"неколку Ñекунди",m:"минута",mm:"%d минути",h:"чаÑ",hh:"%d чаÑа",d:"ден",dd:"%d дена",M:"меÑец",MM:"%d меÑеци",y:"година",yy:"%d години"},ordinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(a){var b=a%10,c=a%100;return 0===a?a+"-ев":0===c?a+"-ен":c>10&&20>c?a+"-ти":1===b?a+"-ви":2===b?a+"-ри":7===b||8===b?a+"-ми":a+"-ти"},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("ml",{months:"ജനàµà´µà´°à´¿_ഫെബàµà´°àµà´µà´°à´¿_മാർചàµà´šàµ_à´à´ªàµà´°à´¿àµ½_മേയàµ_ജൂൺ_ജൂലൈ_à´“à´—à´¸àµà´±àµà´±àµ_സെപàµà´±àµà´±à´‚ബർ_à´’à´•àµà´Ÿàµ‹à´¬àµ¼_നവംബർ_ഡിസംബർ".split("_"),monthsShort:"ജനàµ._ഫെബàµà´°àµ._മാർ._à´à´ªàµà´°à´¿._മേയàµ_ജൂൺ_ജൂലൈ._à´“à´—._സെപàµà´±àµà´±._à´’à´•àµà´Ÿàµ‹._നവം._ഡിസം.".split("_"),weekdays:"ഞായറാഴàµà´š_തിങàµà´•à´³à´¾à´´àµà´š_ചൊവàµà´µà´¾à´´àµà´š_à´¬àµà´§à´¨à´¾à´´àµà´š_à´µàµà´¯à´¾à´´à´¾à´´àµà´š_വെളàµà´³à´¿à´¯à´¾à´´àµà´š_ശനിയാഴàµà´š".split("_"),weekdaysShort:"ഞായർ_തിങàµà´•àµ¾_ചൊവàµà´µ_à´¬àµà´§àµ»_à´µàµà´¯à´¾à´´à´‚_വെളàµà´³à´¿_ശനി".split("_"),weekdaysMin:"à´žà´¾_തി_ചൊ_à´¬àµ_à´µàµà´¯à´¾_വെ_à´¶".split("_"),longDateFormat:{LT:"A h:mm -à´¨àµ",LTS:"A h:mm:ss -à´¨àµ",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[ഇനàµà´¨àµ] LT",nextDay:"[നാളെ] LT",nextWeek:"dddd, LT",lastDay:"[ഇനàµà´¨à´²àµ†] LT",lastWeek:"[à´•à´´à´¿à´žàµà´ž] dddd, LT",sameElse:"L"},relativeTime:{future:"%s à´•à´´à´¿à´žàµà´žàµ",past:"%s à´®àµàµ»à´ªàµ",s:"അൽപ നിമിഷങàµà´™àµ¾",m:"ഒരൠമിനിറàµà´±àµ",mm:"%d മിനിറàµà´±àµ",h:"ഒരൠമണികàµà´•àµ‚ർ",hh:"%d മണികàµà´•àµ‚ർ",d:"ഒരൠദിവസം",dd:"%d ദിവസം",M:"ഒരൠമാസം",MM:"%d മാസം",y:"ഒരൠവർഷം",yy:"%d വർഷം"},meridiemParse:/രാതàµà´°à´¿|രാവിലെ|ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿/i,isPM:function(a){return/^(ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿)$/.test(a)},meridiem:function(a){return 4>a?"രാതàµà´°à´¿":12>a?"രാവിലെ":17>a?"ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ":20>a?"വൈകàµà´¨àµà´¨àµ‡à´°à´‚":"രാതàµà´°à´¿"}})}),function(a){a(vb)}(function(a){var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return a.defineLocale("mr",{months:"जानेवारी_फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€_मारà¥à¤š_à¤à¤ªà¥à¤°à¤¿à¤²_मे_जून_जà¥à¤²à¥ˆ_ऑगसà¥à¤Ÿ_सपà¥à¤Ÿà¥‡à¤‚बर_ऑकà¥à¤Ÿà¥‹à¤¬à¤°_नोवà¥à¤¹à¥‡à¤‚बर_डिसेंबर".split("_"),monthsShort:"जाने._फेबà¥à¤°à¥._मारà¥à¤š._à¤à¤ªà¥à¤°à¤¿._मे._जून._जà¥à¤²à¥ˆ._ऑग._सपà¥à¤Ÿà¥‡à¤‚._ऑकà¥à¤Ÿà¥‹._नोवà¥à¤¹à¥‡à¤‚._डिसें.".split("_"),weekdays:"रविवार_सोमवार_मंगळवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगळ_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि".split("_"),weekdaysMin:"र_सो_मं_बà¥_गà¥_शà¥_श".split("_"),longDateFormat:{LT:"A h:mm वाजता",LTS:"A h:mm:ss वाजता",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[आज] LT",nextDay:"[उदà¥à¤¯à¤¾] LT",nextWeek:"dddd, LT",lastDay:"[काल] LT",lastWeek:"[मागील] dddd, LT",sameElse:"L"},relativeTime:{future:"%s नंतर",past:"%s पूरà¥à¤µà¥€",s:"सेकंद",m:"à¤à¤• मिनिट",mm:"%d मिनिटे",h:"à¤à¤• तास",hh:"%d तास",d:"à¤à¤• दिवस",dd:"%d दिवस",M:"à¤à¤• महिना",MM:"%d महिने",y:"à¤à¤• वरà¥à¤·",yy:"%d वरà¥à¤·à¥‡"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/रातà¥à¤°à¥€|सकाळी|दà¥à¤ªà¤¾à¤°à¥€|सायंकाळी/,meridiemHour:function(a,b){return 12===a&&(a=0),"रातà¥à¤°à¥€"===b?4>a?a:a+12:"सकाळी"===b?a:"दà¥à¤ªà¤¾à¤°à¥€"===b?a>=10?a:a+12:"सायंकाळी"===b?a+12:void 0},meridiem:function(a){return 4>a?"रातà¥à¤°à¥€":10>a?"सकाळी":17>a?"दà¥à¤ªà¤¾à¤°à¥€":20>a?"सायंकाळी":"रातà¥à¤°à¥€"},week:{dow:0,doy:6}})}),function(a){a(vb)}(function(a){return a.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"LT.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] LT",LLLL:"dddd, D MMMM YYYY [pukul] LT"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(a,b){return 12===a&&(a=0),"pagi"===b?a:"tengahari"===b?a>=11?a:a+12:"petang"===b||"malam"===b?a+12:void 0},meridiem:function(a){return 11>a?"pagi":15>a?"tengahari":19>a?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){var b={1:"á",2:"á‚",3:"áƒ",4:"á„",5:"á…",6:"á†",7:"á‡",8:"áˆ",9:"á‰",0:"á€"},c={"á":"1","á‚":"2","áƒ":"3","á„":"4","á…":"5","á†":"6","á‡":"7","áˆ":"8","á‰":"9","á€":"0"};return a.defineLocale("my",{months:"ဇန်နá€á€«á€›á€®_ဖေဖော်á€á€«á€›á€®_မá€á€º_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုá€á€º_စက်á€á€„်ဘာ_အောက်á€á€­á€¯á€˜á€¬_နိုá€á€„်ဘာ_ဒီဇင်ဘာ".split("_"),monthsShort:"ဇန်_ဖေ_မá€á€º_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ".split("_"),weekdays:"á€á€”င်္ဂနွေ_á€á€”င်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပá€á€±á€¸_သောကြာ_စနေ".split("_"),weekdaysShort:"နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),weekdaysMin:"နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[ယနေ.] LT [မှာ]",nextDay:"[မနက်ဖြန်] LT [မှာ]",nextWeek:"dddd LT [မှာ]",lastDay:"[မနေ.က] LT [မှာ]",lastWeek:"[ပြီးá€á€²á€·á€žá€±á€¬] dddd LT [မှာ]",sameElse:"L"},relativeTime:{future:"လာမည့် %s မှာ",past:"လွန်á€á€²á€·á€žá€±á€¬ %s က",s:"စက္ကန်.အနည်းငယ်",m:"á€á€…်မိနစ်",mm:"%d မိနစ်",h:"á€á€…်နာရီ",hh:"%d နာရီ",d:"á€á€…်ရက်",dd:"%d ရက်",M:"á€á€…်လ",MM:"%d လ",y:"á€á€…်နှစ်",yy:"%d နှစ်"},preparse:function(a){return a.replace(/[áá‚áƒá„á…á†á‡áˆá‰á€]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tirs_ons_tors_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"H.mm",LTS:"LT.ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i gÃ¥r kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"for %s siden",s:"noen sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en mÃ¥ned",MM:"%d mÃ¥neder",y:"ett Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return a.defineLocale("ne",{months:"जनवरी_फेबà¥à¤°à¥à¤µà¤°à¥€_मारà¥à¤š_अपà¥à¤°à¤¿à¤²_मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ_अगषà¥à¤Ÿ_सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°_अकà¥à¤Ÿà¥‹à¤¬à¤°_नोभेमà¥à¤¬à¤°_डिसेमà¥à¤¬à¤°".split("_"),monthsShort:"जन._फेबà¥à¤°à¥._मारà¥à¤š_अपà¥à¤°à¤¿._मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ._अग._सेपà¥à¤Ÿ._अकà¥à¤Ÿà¥‹._नोभे._डिसे.".split("_"),weekdays:"आइतबार_सोमबार_मङà¥à¤—लबार_बà¥à¤§à¤¬à¤¾à¤°_बिहिबार_शà¥à¤•à¥à¤°à¤¬à¤¾à¤°_शनिबार".split("_"),weekdaysShort:"आइत._सोम._मङà¥à¤—ल._बà¥à¤§._बिहि._शà¥à¤•à¥à¤°._शनि.".split("_"),weekdaysMin:"आइ._सो._मङà¥_बà¥._बि._शà¥._श.".split("_"),longDateFormat:{LT:"Aको h:mm बजे",LTS:"Aको h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/राती|बिहान|दिउà¤à¤¸à¥‹|बेलà¥à¤•à¤¾|साà¤à¤|राती/,meridiemHour:function(a,b){return 12===a&&(a=0),"राती"===b?3>a?a:a+12:"बिहान"===b?a:"दिउà¤à¤¸à¥‹"===b?a>=10?a:a+12:"बेलà¥à¤•à¤¾"===b||"साà¤à¤"===b?a+12:void 0},meridiem:function(a){return 3>a?"राती":10>a?"बिहान":15>a?"दिउà¤à¤¸à¥‹":18>a?"बेलà¥à¤•à¤¾":20>a?"साà¤à¤":"राती"},calendar:{sameDay:"[आज] LT",nextDay:"[भोली] LT",nextWeek:"[आउà¤à¤¦à¥‹] dddd[,] LT",lastDay:"[हिजो] LT",lastWeek:"[गà¤à¤•à¥‹] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%sमा",past:"%s अगाडी",s:"केही समय",m:"à¤à¤• मिनेट",mm:"%d मिनेट",h:"à¤à¤• घणà¥à¤Ÿà¤¾",hh:"%d घणà¥à¤Ÿà¤¾",d:"à¤à¤• दिन",dd:"%d दिन",M:"à¤à¤• महिना",MM:"%d महिना",y:"à¤à¤• बरà¥à¤·",yy:"%d बरà¥à¤·"},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){var b="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),c="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_");return a.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(a,d){return/-MMM-/.test(d)?c[a.month()]:b[a.month()]},weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_mÃ¥ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_mÃ¥n_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_mÃ¥_ty_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I gÃ¥r klokka] LT",lastWeek:"[FøregÃ¥ande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"for %s sidan",s:"nokre sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",M:"ein mÃ¥nad",MM:"%d mÃ¥nader",y:"eit Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a){return 5>a%10&&a%10>1&&~~(a/10)%10!==1}function c(a,c,d){var e=a+" ";switch(d){case"m":return c?"minuta":"minutÄ™";case"mm":return e+(b(a)?"minuty":"minut");case"h":return c?"godzina":"godzinÄ™";case"hh":return e+(b(a)?"godziny":"godzin");case"MM":return e+(b(a)?"miesiÄ…ce":"miesiÄ™cy");case"yy":return e+(b(a)?"lata":"lat")}}var d="styczeÅ„_luty_marzec_kwiecieÅ„_maj_czerwiec_lipiec_sierpieÅ„_wrzesieÅ„_październik_listopad_grudzieÅ„".split("_"),e="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrzeÅ›nia_października_listopada_grudnia".split("_");return a.defineLocale("pl",{months:function(a,b){return/D MMMM/.test(b)?e[a.month()]:d[a.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziaÅ‚ek_wtorek_Å›roda_czwartek_piÄ…tek_sobota".split("_"),weekdaysShort:"nie_pon_wt_Å›r_czw_pt_sb".split("_"),weekdaysMin:"N_Pn_Wt_Åšr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[DziÅ› o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszÅ‚Ä… niedzielÄ™ o] LT";case 3:return"[W zeszÅ‚Ä… Å›rodÄ™ o] LT";case 6:return"[W zeszÅ‚Ä… sobotÄ™ o] LT";default:return"[W zeszÅ‚y] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:c,mm:c,h:c,hh:c,d:"1 dzieÅ„",dd:"%d dni",M:"miesiÄ…c",MM:c,y:"rok",yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("pt-br",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] LT",LLLL:"dddd, D [de] MMMM [de] YYYY [às] LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº"})}),function(a){a(vb)}(function(a){return a.defineLocale("pt",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d={mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"},e=" ";return(a%100>=20||a>=100&&a%100===0)&&(e=" de "),a+e+d[c]}return a.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),weekdays:"duminică_luni_marÈ›i_miercuri_joi_vineri_sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",m:"un minut",mm:b,h:"o oră",hh:b,d:"o zi",dd:b,M:"o lună",MM:b,y:"un an",yy:b},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){function b(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:c?"минута_минуты_минут":"минуту_минуты_минут",hh:"чаÑ_чаÑа_чаÑов",dd:"день_днÑ_дней",MM:"меÑÑц_меÑÑца_меÑÑцев",yy:"год_года_лет"};return"m"===d?c?"минута":"минуту":a+" "+b(e[d],+a)}function d(a,b){var c={nominative:"Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь".split("_"),accusative:"ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function e(a,b){var c={nominative:"Ñнв_фев_март_апр_май_июнь_июль_авг_Ñен_окт_ноÑ_дек".split("_"),accusative:"Ñнв_фев_мар_апр_маÑ_июнÑ_июлÑ_авг_Ñен_окт_ноÑ_дек".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function f(a,b){var c={nominative:"воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота".split("_"),accusative:"воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу".split("_")},d=/\[ ?[Вв] ?(?:прошлую|Ñледующую|Ñту)? ?\] ?dddd/.test(b)?"accusative":"nominative";return c[d][a.day()]}return a.defineLocale("ru",{months:d,monthsShort:e,weekdays:f,weekdaysShort:"вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),weekdaysMin:"вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),monthsParse:[/^Ñнв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[й|Ñ]/i,/^июн/i,/^июл/i,/^авг/i,/^Ñен/i,/^окт/i,/^ноÑ/i,/^дек/i],longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., LT",LLLL:"dddd, D MMMM YYYY г., LT"},calendar:{sameDay:"[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT",nextDay:"[Завтра в] LT",lastDay:"[Вчера в] LT",nextWeek:function(){return 2===this.day()?"[Во] dddd [в] LT":"[Ð’] dddd [в] LT"},lastWeek:function(a){if(a.week()===this.week())return 2===this.day()?"[Во] dddd [в] LT":"[Ð’] dddd [в] LT";switch(this.day()){case 0:return"[Ð’ прошлое] dddd [в] LT";case 1:case 2:case 4:return"[Ð’ прошлый] dddd [в] LT";case 3:case 5:case 6:return"[Ð’ прошлую] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"неÑколько Ñекунд",m:c,mm:c,h:"чаÑ",hh:c,d:"день",dd:c,M:"меÑÑц",MM:c,y:"год",yy:c},meridiemParse:/ночи|утра|днÑ|вечера/i,isPM:function(a){return/^(днÑ|вечера)$/.test(a)},meridiem:function(a){return 4>a?"ночи":12>a?"утра":17>a?"днÑ":"вечера"},ordinalParse:/\d{1,2}-(й|го|Ñ)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":return a+"-й";case"D":return a+"-го";case"w":case"W":return a+"-Ñ";default:return a}},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){function b(a){return a>1&&5>a}function c(a,c,d,e){var f=a+" ";switch(d){case"s":return c||e?"pár sekúnd":"pár sekundami";case"m":return c?"minúta":e?"minútu":"minútou";case"mm":return c||e?f+(b(a)?"minúty":"minút"):f+"minútami";break;case"h":return c?"hodina":e?"hodinu":"hodinou";case"hh":return c||e?f+(b(a)?"hodiny":"hodín"):f+"hodinami";break;case"d":return c||e?"deň":"dňom";case"dd":return c||e?f+(b(a)?"dni":"dní"):f+"dňami";break;case"M":return c||e?"mesiac":"mesiacom";case"MM":return c||e?f+(b(a)?"mesiace":"mesiacov"):f+"mesiacmi";break;case"y":return c||e?"rok":"rokom";case"yy":return c||e?f+(b(a)?"roky":"rokov"):f+"rokmi"}}var d="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),e="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");return a.defineLocale("sk",{months:d,monthsShort:e,monthsParse:function(a,b){var c,d=[];for(c=0;12>c;c++)d[c]=new RegExp("^"+a[c]+"$|^"+b[c]+"$","i");return d}(d,e),weekdays:"nedeľa_pondelok_utorok_streda_Å¡tvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_Å¡t_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_Å¡t_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo Å¡tvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[vÄera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT";case 1:case 2:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 4:case 5:return"[minulý] dddd [o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d=a+" ";switch(c){case"m":return b?"ena minuta":"eno minuto";case"mm":return d+=1===a?"minuta":2===a?"minuti":3===a||4===a?"minute":"minut";case"h":return b?"ena ura":"eno uro";case"hh":return d+=1===a?"ura":2===a?"uri":3===a||4===a?"ure":"ur";case"dd":return d+=1===a?"dan":"dni";case"MM":return d+=1===a?"mesec":2===a?"meseca":3===a||4===a?"mesece":"mesecev";case"yy":return d+=1===a?"leto":2===a?"leti":3===a||4===a?"leta":"let"}}return a.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),weekdays:"nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._Äet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_Äe_pe_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[vÄeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[prejÅ¡nja] dddd [ob] LT";case 1:case 2:case 4:case 5:return"[prejÅ¡nji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"Äez %s",past:"%s nazaj",s:"nekaj sekund",m:b,mm:b,h:b,hh:b,d:"en dan",dd:b,M:"en mesec",MM:b,y:"eno leto",yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"),weekdays:"E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë".split("_"),weekdaysShort:"Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_Më_E_P_Sh".split("_"),meridiemParse:/PD|MD/,isPM:function(a){return"M"===a.charAt(0)},meridiem:function(a){return 12>a?"PD":"MD"},longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Sot në] LT",nextDay:"[Nesër në] LT",nextWeek:"dddd [në] LT",lastDay:"[Dje në] LT",lastWeek:"dddd [e kaluar në] LT",sameElse:"L"},relativeTime:{future:"në %s",past:"%s më parë",s:"disa sekonda",m:"një minutë",mm:"%d minuta",h:"një orë",hh:"%d orë",d:"një ditë",dd:"%d ditë",M:"një muaj",MM:"%d muaj",y:"një vit",yy:"%d vite"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){var b={words:{m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један Ñат","једног Ñата"],hh:["Ñат","Ñата","Ñати"],dd:["дан","дана","дана"],MM:["меÑец","меÑеца","меÑеци"],yy:["година","године","година"]},correctGrammaticalCase:function(a,b){return 1===a?b[0]:a>=2&&4>=a?b[1]:b[2]},translate:function(a,c,d){var e=b.words[d];return 1===d.length?c?e[0]:e[1]:a+" "+b.correctGrammaticalCase(a,e)}};return a.defineLocale("sr-cyrl",{months:["јануар","фебруар","март","април","мај","јун","јул","авгуÑÑ‚","Ñептембар","октобар","новембар","децембар"],monthsShort:["јан.","феб.","мар.","апр.","мај","јун","јул","авг.","Ñеп.","окт.","нов.","дец."],weekdays:["недеља","понедељак","уторак","Ñреда","четвртак","петак","Ñубота"],weekdaysShort:["нед.","пон.","уто.","Ñре.","чет.","пет.","Ñуб."],weekdaysMin:["не","по","ут","ÑÑ€","че","пе","Ñу"],longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Ð´Ð°Ð½Ð°Ñ Ñƒ] LT",nextDay:"[Ñутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [Ñреду] [у] LT";case 6:return"[у] [Ñуботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){var a=["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [Ñреде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [Ñуботе] [у] LT"];return a[this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико Ñекунди",m:b.translate,mm:b.translate,h:b.translate,hh:b.translate,d:"дан",dd:b.translate,M:"меÑец",MM:b.translate,y:"годину",yy:b.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){var b={words:{m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(a,b){return 1===a?b[0]:a>=2&&4>=a?b[1]:b[2]},translate:function(a,c,d){var e=b.words[d];return 1===d.length?c?e[0]:e[1]:a+" "+b.correctGrammaticalCase(a,e)}};return a.defineLocale("sr",{months:["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar"],monthsShort:["jan.","feb.","mar.","apr.","maj","jun","jul","avg.","sep.","okt.","nov.","dec."],weekdays:["nedelja","ponedeljak","utorak","sreda","Äetvrtak","petak","subota"],weekdaysShort:["ned.","pon.","uto.","sre.","Äet.","pet.","sub."],weekdaysMin:["ne","po","ut","sr","Äe","pe","su"],longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄe u] LT",lastWeek:function(){var a=["[proÅ¡le] [nedelje] [u] LT","[proÅ¡log] [ponedeljka] [u] LT","[proÅ¡log] [utorka] [u] LT","[proÅ¡le] [srede] [u] LT","[proÅ¡log] [Äetvrtka] [u] LT","[proÅ¡log] [petka] [u] LT","[proÅ¡le] [subote] [u] LT"];return a[this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",m:b.translate,mm:b.translate,h:b.translate,hh:b.translate,d:"dan",dd:b.translate,M:"mesec",MM:b.translate,y:"godinu",yy:b.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_mÃ¥ndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mÃ¥n_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_mÃ¥_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[IgÃ¥r] LT",nextWeek:"dddd LT",lastWeek:"[Förra] dddd[en] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"nÃ¥gra sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en mÃ¥nad",MM:"%d mÃ¥nader",y:"ett Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}(e|a)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"e":1===b?"a":2===b?"a":"e";return a+c},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("ta",{months:"ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯".split("_"),monthsShort:"ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯".split("_"),weekdays:"ஞாயிறà¯à®±à¯à®•à¯à®•à®¿à®´à®®à¯ˆ_திஙà¯à®•à®Ÿà¯à®•à®¿à®´à®®à¯ˆ_செவà¯à®µà®¾à®¯à¯à®•à®¿à®´à®®à¯ˆ_பà¯à®¤à®©à¯à®•à®¿à®´à®®à¯ˆ_வியாழகà¯à®•à®¿à®´à®®à¯ˆ_வெளà¯à®³à®¿à®•à¯à®•à®¿à®´à®®à¯ˆ_சனிகà¯à®•à®¿à®´à®®à¯ˆ".split("_"),weekdaysShort:"ஞாயிறà¯_திஙà¯à®•à®³à¯_செவà¯à®µà®¾à®¯à¯_பà¯à®¤à®©à¯_வியாழனà¯_வெளà¯à®³à®¿_சனி".split("_"),weekdaysMin:"ஞா_தி_செ_பà¯_வி_வெ_ச".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[இனà¯à®±à¯] LT",nextDay:"[நாளை] LT",nextWeek:"dddd, LT",lastDay:"[நேறà¯à®±à¯] LT",lastWeek:"[கடநà¯à®¤ வாரமà¯] dddd, LT",sameElse:"L"},relativeTime:{future:"%s இலà¯",past:"%s à®®à¯à®©à¯",s:"ஒர௠சில விநாடிகளà¯",m:"ஒர௠நிமிடமà¯",mm:"%d நிமிடஙà¯à®•à®³à¯",h:"ஒர௠மணி நேரமà¯",hh:"%d மணி நேரமà¯",d:"ஒர௠நாளà¯",dd:"%d நாடà¯à®•à®³à¯",M:"ஒர௠மாதமà¯",MM:"%d மாதஙà¯à®•à®³à¯",y:"ஒர௠வரà¯à®Ÿà®®à¯",yy:"%d ஆணà¯à®Ÿà¯à®•à®³à¯"},ordinalParse:/\d{1,2}வதà¯/,ordinal:function(a){return a+"வதà¯"},meridiemParse:/யாமமà¯|வைகறை|காலை|நணà¯à®ªà®•à®²à¯|எறà¯à®ªà®¾à®Ÿà¯|மாலை/,meridiem:function(a){return 2>a?" யாமமà¯":6>a?" வைகறை":10>a?" காலை":14>a?" நணà¯à®ªà®•à®²à¯":18>a?" எறà¯à®ªà®¾à®Ÿà¯":22>a?" மாலை":" யாமமà¯"},meridiemHour:function(a,b){return 12===a&&(a=0),"யாமமà¯"===b?2>a?a:a+12:"வைகறை"===b||"காலை"===b?a:"நணà¯à®ªà®•à®²à¯"===b&&a>=10?a:a+12},week:{dow:0,doy:6}})}),function(a){a(vb)}(function(a){return a.defineLocale("th",{months:"มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม".split("_"),monthsShort:"มà¸à¸£à¸²_à¸à¸¸à¸¡à¸ à¸²_มีนา_เมษา_พฤษภา_มิถุนา_à¸à¸£à¸à¸Žà¸²_สิงหา_à¸à¸±à¸™à¸¢à¸²_ตุลา_พฤศจิà¸à¸²_ธันวา".split("_"),weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),longDateFormat:{LT:"H นาฬิà¸à¸² m นาที",LTS:"LT s วินาที",L:"YYYY/MM/DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา LT",LLLL:"วันddddที่ D MMMM YYYY เวลา LT"},meridiemParse:/à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง|หลังเที่ยง/,isPM:function(a){return"หลังเที่ยง"===a +},meridiem:function(a){return 12>a?"à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่à¹à¸¥à¹‰à¸§ เวลา] LT",sameElse:"L"},relativeTime:{future:"อีภ%s",past:"%sที่à¹à¸¥à¹‰à¸§",s:"ไม่à¸à¸µà¹ˆà¸§à¸´à¸™à¸²à¸—ี",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"}})}),function(a){a(vb)}(function(a){return a.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY LT",LLLL:"dddd, MMMM DD, YYYY LT"},calendar:{sameDay:"[Ngayon sa] LT",nextDay:"[Bukas sa] LT",nextWeek:"dddd [sa] LT",lastDay:"[Kahapon sa] LT",lastWeek:"dddd [huling linggo] LT",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},ordinalParse:/\d{1,2}/,ordinal:function(a){return a},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){var b={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"};return a.defineLocale("tr",{months:"Ocak_Åžubat_Mart_Nisan_Mayıs_Haziran_Temmuz_AÄŸustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_ÇarÅŸamba_PerÅŸembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[haftaya] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen hafta] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinalParse:/\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/,ordinal:function(a){if(0===a)return a+"'ıncı";var c=a%10,d=a%100-c,e=a>=100?100:null;return a+(b[c]||b[d]||b[e])},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("tzm-latn",{months:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",m:"minuá¸",mm:"%d minuá¸",h:"saÉ›a",hh:"%d tassaÉ›in",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})}),function(a){a(vb)}(function(a){return a.defineLocale("tzm",{months:"ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”".split("_"),monthsShort:"ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”".split("_"),weekdays:"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysShort:"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysMin:"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[ⴰⵙⴷⵅ â´´] LT",nextDay:"[ⴰⵙⴽⴰ â´´] LT",nextWeek:"dddd [â´´] LT",lastDay:"[ⴰⵚⴰâµâµœ â´´] LT",lastWeek:"dddd [â´´] LT",sameElse:"L"},relativeTime:{future:"â´·â´°â´·âµ… âµ™ ⵢⴰⵠ%s",past:"ⵢⴰⵠ%s",s:"ⵉⵎⵉⴽ",m:"ⵎⵉâµâµ“â´º",mm:"%d ⵎⵉâµâµ“â´º",h:"ⵙⴰⵄⴰ",hh:"%d ⵜⴰⵙⵙⴰⵄⵉâµ",d:"ⴰⵙⵙ",dd:"%d oⵙⵙⴰâµ",M:"â´°âµ¢oⵓⵔ",MM:"%d ⵉⵢⵢⵉⵔâµ",y:"ⴰⵙⴳⴰⵙ",yy:"%d ⵉⵙⴳⴰⵙâµ"},week:{dow:6,doy:12}})}),function(a){a(vb)}(function(a){function b(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:"хвилина_хвилини_хвилин",hh:"година_години_годин",dd:"день_дні_днів",MM:"міÑÑць_міÑÑці_міÑÑців",yy:"рік_роки_років"};return"m"===d?c?"хвилина":"хвилину":"h"===d?c?"година":"годину":a+" "+b(e[d],+a)}function d(a,b){var c={nominative:"Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень".split("_"),accusative:"ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ".split("_")},d=/D[oD]? *MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function e(a,b){var c={nominative:"неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота".split("_"),accusative:"неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу".split("_"),genitive:"неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи".split("_")},d=/(\[[ВвУу]\]) ?dddd/.test(b)?"accusative":/\[?(?:минулої|наÑтупної)? ?\] ?dddd/.test(b)?"genitive":"nominative";return c[d][a.day()]}function f(a){return function(){return a+"о"+(11===this.hours()?"б":"")+"] LT"}}return a.defineLocale("uk",{months:d,monthsShort:"Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд".split("_"),weekdays:e,weekdaysShort:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),weekdaysMin:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY Ñ€.",LLL:"D MMMM YYYY Ñ€., LT",LLLL:"dddd, D MMMM YYYY Ñ€., LT"},calendar:{sameDay:f("[Сьогодні "),nextDay:f("[Завтра "),lastDay:f("[Вчора "),nextWeek:f("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return f("[Минулої] dddd [").call(this);case 1:case 2:case 4:return f("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька Ñекунд",m:c,mm:c,h:"годину",hh:c,d:"день",dd:c,M:"міÑÑць",MM:c,y:"рік",yy:c},meridiemParse:/ночі|ранку|днÑ|вечора/,isPM:function(a){return/^(днÑ|вечора)$/.test(a)},meridiem:function(a){return 4>a?"ночі":12>a?"ранку":17>a?"днÑ":"вечора"},ordinalParse:/\d{1,2}-(й|го)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":case"w":case"W":return a+"-й";case"D":return a+"-го";default:return a}},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("uz",{months:"Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь".split("_"),monthsShort:"Ñнв_фев_мар_апр_май_июн_июл_авг_Ñен_окт_ноÑ_дек".split("_"),weekdays:"Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"),weekdaysShort:"Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"),weekdaysMin:"Як_Ду_Се_Чо_Па_Жу_Ша".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"D MMMM YYYY, dddd LT"},calendar:{sameDay:"[Бугун Ñоат] LT [да]",nextDay:"[Эртага] LT [да]",nextWeek:"dddd [куни Ñоат] LT [да]",lastDay:"[Кеча Ñоат] LT [да]",lastWeek:"[Утган] dddd [куни Ñоат] LT [да]",sameElse:"L"},relativeTime:{future:"Якин %s ичида",past:"Бир неча %s олдин",s:"фурÑат",m:"бир дакика",mm:"%d дакика",h:"бир Ñоат",hh:"%d Ñоат",d:"бир кун",dd:"%d кун",M:"бир ой",MM:"%d ой",y:"бир йил",yy:"%d йил"},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("vi",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),weekdays:"chủ nhật_thứ hai_thứ ba_thứ tÆ°_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY LT",LLLL:"dddd, D MMMM [năm] YYYY LT",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY LT",llll:"ddd, D MMM YYYY LT"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tá»›i lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần rồi lúc] LT",sameElse:"L"},relativeTime:{future:"%s tá»›i",past:"%s trÆ°á»›c",s:"vài giây",m:"má»™t phút",mm:"%d phút",h:"má»™t giá»",hh:"%d giá»",d:"má»™t ngày",dd:"%d ngày",M:"má»™t tháng",MM:"%d tháng",y:"má»™t năm",yy:"%d năm"},ordinalParse:/\d{1,2}/,ordinal:function(a){return a},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"æ—¥_一_二_三_å››_五_å…­".split("_"),longDateFormat:{LT:"Ah点mm",LTS:"Ah点m分s秒",L:"YYYY-MM-DD",LL:"YYYYå¹´MMMDæ—¥",LLL:"YYYYå¹´MMMDæ—¥LT",LLLL:"YYYYå¹´MMMDæ—¥ddddLT",l:"YYYY-MM-DD",ll:"YYYYå¹´MMMDæ—¥",lll:"YYYYå¹´MMMDæ—¥LT",llll:"YYYYå¹´MMMDæ—¥ddddLT"},meridiemParse:/凌晨|早上|上åˆ|中åˆ|下åˆ|晚上/,meridiemHour:function(a,b){return 12===a&&(a=0),"凌晨"===b||"早上"===b||"上åˆ"===b?a:"下åˆ"===b||"晚上"===b?a+12:a>=11?a:a+12},meridiem:function(a,b){var c=100*a+b;return 600>c?"凌晨":900>c?"早上":1130>c?"上åˆ":1230>c?"中åˆ":1800>c?"下åˆ":"晚上"},calendar:{sameDay:function(){return 0===this.minutes()?"[今天]Ah[点整]":"[今天]LT"},nextDay:function(){return 0===this.minutes()?"[明天]Ah[点整]":"[明天]LT"},lastDay:function(){return 0===this.minutes()?"[昨天]Ah[点整]":"[昨天]LT"},nextWeek:function(){var b,c;return b=a().startOf("week"),c=this.unix()-b.unix()>=604800?"[下]":"[本]",0===this.minutes()?c+"dddAh点整":c+"dddAh点mm"},lastWeek:function(){var b,c;return b=a().startOf("week"),c=this.unix()=11?a:a+12:"下åˆ"===b||"晚上"===b?a+12:void 0},meridiem:function(a,b){var c=100*a+b;return 900>c?"早上":1130>c?"上åˆ":1230>c?"中åˆ":1800>c?"下åˆ":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},ordinalParse:/\d{1,2}(æ—¥|月|週)/,ordinal:function(a,b){switch(b){case"d":case"D":case"DDD":return a+"æ—¥";case"M":return a+"月";case"w":case"W":return a+"週";default:return a}},relativeTime:{future:"%så…§",past:"%så‰",s:"幾秒",m:"一分é˜",mm:"%d分é˜",h:"一å°æ™‚",hh:"%då°æ™‚",d:"一天",dd:"%d天",M:"一個月",MM:"%d個月",y:"一年",yy:"%då¹´"}})}),vb.locale("en"),Lb?module.exports=vb:"function"==typeof define&&define.amd?(define(function(a,b,c){return c.config&&c.config()&&c.config().noGlobal===!0&&(zb.moment=wb),vb}),ub(!0)):ub()}).call(this); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/min/moment.min.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/min/moment.min.js new file mode 100644 index 0000000..024d488 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/min/moment.min.js @@ -0,0 +1,7 @@ +//! moment.js +//! version : 2.9.0 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com +(function(a){function b(a,b,c){switch(arguments.length){case 2:return null!=a?a:b;case 3:return null!=a?a:null!=b?b:c;default:throw new Error("Implement me")}}function c(a,b){return Bb.call(a,b)}function d(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function e(a){vb.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+a)}function f(a,b){var c=!0;return o(function(){return c&&(e(a),c=!1),b.apply(this,arguments)},b)}function g(a,b){sc[a]||(e(b),sc[a]=!0)}function h(a,b){return function(c){return r(a.call(this,c),b)}}function i(a,b){return function(c){return this.localeData().ordinal(a.call(this,c),b)}}function j(a,b){var c,d,e=12*(b.year()-a.year())+(b.month()-a.month()),f=a.clone().add(e,"months");return 0>b-f?(c=a.clone().add(e-1,"months"),d=(b-f)/(f-c)):(c=a.clone().add(e+1,"months"),d=(b-f)/(c-f)),-(e+d)}function k(a,b,c){var d;return null==c?b:null!=a.meridiemHour?a.meridiemHour(b,c):null!=a.isPM?(d=a.isPM(c),d&&12>b&&(b+=12),d||12!==b||(b=0),b):b}function l(){}function m(a,b){b!==!1&&H(a),p(this,a),this._d=new Date(+a._d),uc===!1&&(uc=!0,vb.updateOffset(this),uc=!1)}function n(a){var b=A(a),c=b.year||0,d=b.quarter||0,e=b.month||0,f=b.week||0,g=b.day||0,h=b.hour||0,i=b.minute||0,j=b.second||0,k=b.millisecond||0;this._milliseconds=+k+1e3*j+6e4*i+36e5*h,this._days=+g+7*f,this._months=+e+3*d+12*c,this._data={},this._locale=vb.localeData(),this._bubble()}function o(a,b){for(var d in b)c(b,d)&&(a[d]=b[d]);return c(b,"toString")&&(a.toString=b.toString),c(b,"valueOf")&&(a.valueOf=b.valueOf),a}function p(a,b){var c,d,e;if("undefined"!=typeof b._isAMomentObject&&(a._isAMomentObject=b._isAMomentObject),"undefined"!=typeof b._i&&(a._i=b._i),"undefined"!=typeof b._f&&(a._f=b._f),"undefined"!=typeof b._l&&(a._l=b._l),"undefined"!=typeof b._strict&&(a._strict=b._strict),"undefined"!=typeof b._tzm&&(a._tzm=b._tzm),"undefined"!=typeof b._isUTC&&(a._isUTC=b._isUTC),"undefined"!=typeof b._offset&&(a._offset=b._offset),"undefined"!=typeof b._pf&&(a._pf=b._pf),"undefined"!=typeof b._locale&&(a._locale=b._locale),Kb.length>0)for(c in Kb)d=Kb[c],e=b[d],"undefined"!=typeof e&&(a[d]=e);return a}function q(a){return 0>a?Math.ceil(a):Math.floor(a)}function r(a,b,c){for(var d=""+Math.abs(a),e=a>=0;d.lengthd;d++)(c&&a[d]!==b[d]||!c&&C(a[d])!==C(b[d]))&&g++;return g+f}function z(a){if(a){var b=a.toLowerCase().replace(/(.)s$/,"$1");a=lc[a]||mc[b]||b}return a}function A(a){var b,d,e={};for(d in a)c(a,d)&&(b=z(d),b&&(e[b]=a[d]));return e}function B(b){var c,d;if(0===b.indexOf("week"))c=7,d="day";else{if(0!==b.indexOf("month"))return;c=12,d="month"}vb[b]=function(e,f){var g,h,i=vb._locale[b],j=[];if("number"==typeof e&&(f=e,e=a),h=function(a){var b=vb().utc().set(d,a);return i.call(vb._locale,b,e||"")},null!=f)return h(f);for(g=0;c>g;g++)j.push(h(g));return j}}function C(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=b>=0?Math.floor(b):Math.ceil(b)),c}function D(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function E(a,b,c){return jb(vb([a,11,31+b-c]),b,c).week}function F(a){return G(a)?366:365}function G(a){return a%4===0&&a%100!==0||a%400===0}function H(a){var b;a._a&&-2===a._pf.overflow&&(b=a._a[Db]<0||a._a[Db]>11?Db:a._a[Eb]<1||a._a[Eb]>D(a._a[Cb],a._a[Db])?Eb:a._a[Fb]<0||a._a[Fb]>24||24===a._a[Fb]&&(0!==a._a[Gb]||0!==a._a[Hb]||0!==a._a[Ib])?Fb:a._a[Gb]<0||a._a[Gb]>59?Gb:a._a[Hb]<0||a._a[Hb]>59?Hb:a._a[Ib]<0||a._a[Ib]>999?Ib:-1,a._pf._overflowDayOfYear&&(Cb>b||b>Eb)&&(b=Eb),a._pf.overflow=b)}function I(b){return null==b._isValid&&(b._isValid=!isNaN(b._d.getTime())&&b._pf.overflow<0&&!b._pf.empty&&!b._pf.invalidMonth&&!b._pf.nullInput&&!b._pf.invalidFormat&&!b._pf.userInvalidated,b._strict&&(b._isValid=b._isValid&&0===b._pf.charsLeftOver&&0===b._pf.unusedTokens.length&&b._pf.bigHour===a)),b._isValid}function J(a){return a?a.toLowerCase().replace("_","-"):a}function K(a){for(var b,c,d,e,f=0;f0;){if(d=L(e.slice(0,b).join("-")))return d;if(c&&c.length>=b&&y(e,c,!0)>=b-1)break;b--}f++}return null}function L(a){var b=null;if(!Jb[a]&&Lb)try{b=vb.locale(),require("./locale/"+a),vb.locale(b)}catch(c){}return Jb[a]}function M(a,b){var c,d;return b._isUTC?(c=b.clone(),d=(vb.isMoment(a)||x(a)?+a:+vb(a))-+c,c._d.setTime(+c._d+d),vb.updateOffset(c,!1),c):vb(a).local()}function N(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function O(a){var b,c,d=a.match(Pb);for(b=0,c=d.length;c>b;b++)d[b]=rc[d[b]]?rc[d[b]]:N(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 P(a,b){return a.isValid()?(b=Q(b,a.localeData()),nc[b]||(nc[b]=O(b)),nc[b](a)):a.localeData().invalidDate()}function Q(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(Qb.lastIndex=0;d>=0&&Qb.test(a);)a=a.replace(Qb,c),Qb.lastIndex=0,d-=1;return a}function R(a,b){var c,d=b._strict;switch(a){case"Q":return _b;case"DDDD":return bc;case"YYYY":case"GGGG":case"gggg":return d?cc:Tb;case"Y":case"G":case"g":return ec;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return d?dc:Ub;case"S":if(d)return _b;case"SS":if(d)return ac;case"SSS":if(d)return bc;case"DDD":return Sb;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Wb;case"a":case"A":return b._locale._meridiemParse;case"x":return Zb;case"X":return $b;case"Z":case"ZZ":return Xb;case"T":return Yb;case"SSSS":return Vb;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return d?ac:Rb;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return Rb;case"Do":return d?b._locale._ordinalParse:b._locale._ordinalParseLenient;default:return c=new RegExp($(Z(a.replace("\\","")),"i"))}}function S(a){a=a||"";var b=a.match(Xb)||[],c=b[b.length-1]||[],d=(c+"").match(jc)||["-",0,0],e=+(60*d[1])+C(d[2]);return"+"===d[0]?e:-e}function T(a,b,c){var d,e=c._a;switch(a){case"Q":null!=b&&(e[Db]=3*(C(b)-1));break;case"M":case"MM":null!=b&&(e[Db]=C(b)-1);break;case"MMM":case"MMMM":d=c._locale.monthsParse(b,a,c._strict),null!=d?e[Db]=d:c._pf.invalidMonth=b;break;case"D":case"DD":null!=b&&(e[Eb]=C(b));break;case"Do":null!=b&&(e[Eb]=C(parseInt(b.match(/\d{1,2}/)[0],10)));break;case"DDD":case"DDDD":null!=b&&(c._dayOfYear=C(b));break;case"YY":e[Cb]=vb.parseTwoDigitYear(b);break;case"YYYY":case"YYYYY":case"YYYYYY":e[Cb]=C(b);break;case"a":case"A":c._meridiem=b;break;case"h":case"hh":c._pf.bigHour=!0;case"H":case"HH":e[Fb]=C(b);break;case"m":case"mm":e[Gb]=C(b);break;case"s":case"ss":e[Hb]=C(b);break;case"S":case"SS":case"SSS":case"SSSS":e[Ib]=C(1e3*("0."+b));break;case"x":c._d=new Date(C(b));break;case"X":c._d=new Date(1e3*parseFloat(b));break;case"Z":case"ZZ":c._useUTC=!0,c._tzm=S(b);break;case"dd":case"ddd":case"dddd":d=c._locale.weekdaysParse(b),null!=d?(c._w=c._w||{},c._w.d=d):c._pf.invalidWeekday=b;break;case"w":case"ww":case"W":case"WW":case"d":case"e":case"E":a=a.substr(0,1);case"gggg":case"GGGG":case"GGGGG":a=a.substr(0,2),b&&(c._w=c._w||{},c._w[a]=C(b));break;case"gg":case"GG":c._w=c._w||{},c._w[a]=vb.parseTwoDigitYear(b)}}function U(a){var c,d,e,f,g,h,i;c=a._w,null!=c.GG||null!=c.W||null!=c.E?(g=1,h=4,d=b(c.GG,a._a[Cb],jb(vb(),1,4).year),e=b(c.W,1),f=b(c.E,1)):(g=a._locale._week.dow,h=a._locale._week.doy,d=b(c.gg,a._a[Cb],jb(vb(),g,h).year),e=b(c.w,1),null!=c.d?(f=c.d,g>f&&++e):f=null!=c.e?c.e+g:g),i=kb(d,e,f,h,g),a._a[Cb]=i.year,a._dayOfYear=i.dayOfYear}function V(a){var c,d,e,f,g=[];if(!a._d){for(e=X(a),a._w&&null==a._a[Eb]&&null==a._a[Db]&&U(a),a._dayOfYear&&(f=b(a._a[Cb],e[Cb]),a._dayOfYear>F(f)&&(a._pf._overflowDayOfYear=!0),d=fb(f,0,a._dayOfYear),a._a[Db]=d.getUTCMonth(),a._a[Eb]=d.getUTCDate()),c=0;3>c&&null==a._a[c];++c)a._a[c]=g[c]=e[c];for(;7>c;c++)a._a[c]=g[c]=null==a._a[c]?2===c?1:0:a._a[c];24===a._a[Fb]&&0===a._a[Gb]&&0===a._a[Hb]&&0===a._a[Ib]&&(a._nextDay=!0,a._a[Fb]=0),a._d=(a._useUTC?fb:eb).apply(null,g),null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()-a._tzm),a._nextDay&&(a._a[Fb]=24)}}function W(a){var b;a._d||(b=A(a._i),a._a=[b.year,b.month,b.day||b.date,b.hour,b.minute,b.second,b.millisecond],V(a))}function X(a){var b=new Date;return a._useUTC?[b.getUTCFullYear(),b.getUTCMonth(),b.getUTCDate()]:[b.getFullYear(),b.getMonth(),b.getDate()]}function Y(b){if(b._f===vb.ISO_8601)return void ab(b);b._a=[],b._pf.empty=!0;var c,d,e,f,g,h=""+b._i,i=h.length,j=0;for(e=Q(b._f,b._locale).match(Pb)||[],c=0;c0&&b._pf.unusedInput.push(g),h=h.slice(h.indexOf(d)+d.length),j+=d.length),rc[f]?(d?b._pf.empty=!1:b._pf.unusedTokens.push(f),T(f,d,b)):b._strict&&!d&&b._pf.unusedTokens.push(f);b._pf.charsLeftOver=i-j,h.length>0&&b._pf.unusedInput.push(h),b._pf.bigHour===!0&&b._a[Fb]<=12&&(b._pf.bigHour=a),b._a[Fb]=k(b._locale,b._a[Fb],b._meridiem),V(b),H(b)}function Z(a){return a.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e})}function $(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function _(a){var b,c,e,f,g;if(0===a._f.length)return a._pf.invalidFormat=!0,void(a._d=new Date(0/0));for(f=0;fg)&&(e=g,c=b));o(a,c||b)}function ab(a){var b,c,d=a._i,e=fc.exec(d);if(e){for(a._pf.iso=!0,b=0,c=hc.length;c>b;b++)if(hc[b][1].exec(d)){a._f=hc[b][0]+(e[6]||" ");break}for(b=0,c=ic.length;c>b;b++)if(ic[b][1].exec(d)){a._f+=ic[b][0];break}d.match(Xb)&&(a._f+="Z"),Y(a)}else a._isValid=!1}function bb(a){ab(a),a._isValid===!1&&(delete a._isValid,vb.createFromInputFallback(a))}function cb(a,b){var c,d=[];for(c=0;ca&&h.setFullYear(a),h}function fb(a){var b=new Date(Date.UTC.apply(null,arguments));return 1970>a&&b.setUTCFullYear(a),b}function gb(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 hb(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function ib(a,b,c){var d=vb.duration(a).abs(),e=Ab(d.as("s")),f=Ab(d.as("m")),g=Ab(d.as("h")),h=Ab(d.as("d")),i=Ab(d.as("M")),j=Ab(d.as("y")),k=e0,k[4]=c,hb.apply({},k)}function jb(a,b,c){var d,e=c-b,f=c-a.day();return f>e&&(f-=7),e-7>f&&(f+=7),d=vb(a).add(f,"d"),{week:Math.ceil(d.dayOfYear()/7),year:d.year()}}function kb(a,b,c,d,e){var f,g,h=fb(a,0,1).getUTCDay();return h=0===h?7:h,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:F(a-1)+g}}function lb(b){var c,d=b._i,e=b._f;return b._locale=b._locale||vb.localeData(b._l),null===d||e===a&&""===d?vb.invalid({nullInput:!0}):("string"==typeof d&&(b._i=d=b._locale.preparse(d)),vb.isMoment(d)?new m(d,!0):(e?w(e)?_(b):Y(b):db(b),c=new m(b),c._nextDay&&(c.add(1,"d"),c._nextDay=a),c))}function mb(a,b){var c,d;if(1===b.length&&w(b[0])&&(b=b[0]),!b.length)return vb();for(c=b[0],d=1;d=0?"+":"-";return b+r(Math.abs(a),6)},gg:function(){return r(this.weekYear()%100,2)},gggg:function(){return r(this.weekYear(),4)},ggggg:function(){return r(this.weekYear(),5)},GG:function(){return r(this.isoWeekYear()%100,2)},GGGG:function(){return r(this.isoWeekYear(),4)},GGGGG:function(){return r(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.localeData().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.localeData().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 C(this.milliseconds()/100)},SS:function(){return r(C(this.milliseconds()/10),2)},SSS:function(){return r(this.milliseconds(),3)},SSSS:function(){return r(this.milliseconds(),3)},Z:function(){var a=this.utcOffset(),b="+";return 0>a&&(a=-a,b="-"),b+r(C(a/60),2)+":"+r(C(a)%60,2)},ZZ:function(){var a=this.utcOffset(),b="+";return 0>a&&(a=-a,b="-"),b+r(C(a/60),2)+r(C(a)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},x:function(){return this.valueOf()},X:function(){return this.unix()},Q:function(){return this.quarter()}},sc={},tc=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"],uc=!1;pc.length;)xb=pc.pop(),rc[xb+"o"]=i(rc[xb],xb);for(;qc.length;)xb=qc.pop(),rc[xb+xb]=h(rc[xb],2);rc.DDDD=h(rc.DDD,3),o(l.prototype,{set:function(a){var b,c;for(c in a)b=a[c],"function"==typeof b?this[c]=b:this["_"+c]=b;this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)},_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,b,c){var d,e,f;for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),d=0;12>d;d++){if(e=vb.utc([2e3,d]),c&&!this._longMonthsParse[d]&&(this._longMonthsParse[d]=new RegExp("^"+this.months(e,"").replace(".","")+"$","i"),this._shortMonthsParse[d]=new RegExp("^"+this.monthsShort(e,"").replace(".","")+"$","i")),c||this._monthsParse[d]||(f="^"+this.months(e,"")+"|^"+this.monthsShort(e,""),this._monthsParse[d]=new RegExp(f.replace(".",""),"i")),c&&"MMMM"===b&&this._longMonthsParse[d].test(a))return d;if(c&&"MMM"===b&&this._shortMonthsParse[d].test(a))return d;if(!c&&this._monthsParse[d].test(a))return d}},_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=vb([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:{LTS:"h:mm:ss A",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,c){var d=this._calendar[a];return"function"==typeof d?d.apply(b,[c]):d},_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",_ordinalParse:/\d{1,2}/,preparse:function(a){return a},postformat:function(a){return a},week:function(a){return jb(a,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},firstDayOfWeek:function(){return this._week.dow},firstDayOfYear:function(){return this._week.doy},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),vb=function(b,c,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._i=b,g._f=c,g._l=e,g._strict=f,g._isUTC=!1,g._pf=d(),lb(g)},vb.suppressDeprecationWarnings=!1,vb.createFromInputFallback=f("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(a){a._d=new Date(a._i+(a._useUTC?" UTC":""))}),vb.min=function(){var a=[].slice.call(arguments,0);return mb("isBefore",a)},vb.max=function(){var a=[].slice.call(arguments,0);return mb("isAfter",a)},vb.utc=function(b,c,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=b,g._f=c,g._strict=f,g._pf=d(),lb(g).utc()},vb.unix=function(a){return vb(1e3*a)},vb.duration=function(a,b){var d,e,f,g,h=a,i=null;return vb.isDuration(a)?h={ms:a._milliseconds,d:a._days,M:a._months}:"number"==typeof a?(h={},b?h[b]=a:h.milliseconds=a):(i=Nb.exec(a))?(d="-"===i[1]?-1:1,h={y:0,d:C(i[Eb])*d,h:C(i[Fb])*d,m:C(i[Gb])*d,s:C(i[Hb])*d,ms:C(i[Ib])*d}):(i=Ob.exec(a))?(d="-"===i[1]?-1:1,f=function(a){var b=a&&parseFloat(a.replace(",","."));return(isNaN(b)?0:b)*d},h={y:f(i[2]),M:f(i[3]),d:f(i[4]),h:f(i[5]),m:f(i[6]),s:f(i[7]),w:f(i[8])}):null==h?h={}:"object"==typeof h&&("from"in h||"to"in h)&&(g=t(vb(h.from),vb(h.to)),h={},h.ms=g.milliseconds,h.M=g.months),e=new n(h),vb.isDuration(a)&&c(a,"_locale")&&(e._locale=a._locale),e},vb.version=yb,vb.defaultFormat=gc,vb.ISO_8601=function(){},vb.momentProperties=Kb,vb.updateOffset=function(){},vb.relativeTimeThreshold=function(b,c){return oc[b]===a?!1:c===a?oc[b]:(oc[b]=c,!0)},vb.lang=f("moment.lang is deprecated. Use moment.locale instead.",function(a,b){return vb.locale(a,b)}),vb.locale=function(a,b){var c;return a&&(c="undefined"!=typeof b?vb.defineLocale(a,b):vb.localeData(a),c&&(vb.duration._locale=vb._locale=c)),vb._locale._abbr},vb.defineLocale=function(a,b){return null!==b?(b.abbr=a,Jb[a]||(Jb[a]=new l),Jb[a].set(b),vb.locale(a),Jb[a]):(delete Jb[a],null)},vb.langData=f("moment.langData is deprecated. Use moment.localeData instead.",function(a){return vb.localeData(a)}),vb.localeData=function(a){var b;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return vb._locale;if(!w(a)){if(b=L(a))return b;a=[a]}return K(a)},vb.isMoment=function(a){return a instanceof m||null!=a&&c(a,"_isAMomentObject")},vb.isDuration=function(a){return a instanceof n};for(xb=tc.length-1;xb>=0;--xb)B(tc[xb]);vb.normalizeUnits=function(a){return z(a)},vb.invalid=function(a){var b=vb.utc(0/0);return null!=a?o(b._pf,a):b._pf.userInvalidated=!0,b},vb.parseZone=function(){return vb.apply(null,arguments).parseZone()},vb.parseTwoDigitYear=function(a){return C(a)+(C(a)>68?1900:2e3)},vb.isDate=x,o(vb.fn=m.prototype,{clone:function(){return vb(this)},valueOf:function(){return+this._d-6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().locale("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=vb(this).utc();return 00:!1},parsingFlags:function(){return o({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(a){return this.utcOffset(0,a)},local:function(a){return this._isUTC&&(this.utcOffset(0,a),this._isUTC=!1,a&&this.subtract(this._dateUtcOffset(),"m")),this},format:function(a){var b=P(this,a||vb.defaultFormat);return this.localeData().postformat(b)},add:u(1,"add"),subtract:u(-1,"subtract"),diff:function(a,b,c){var d,e,f=M(a,this),g=6e4*(f.utcOffset()-this.utcOffset());return b=z(b),"year"===b||"month"===b||"quarter"===b?(e=j(this,f),"quarter"===b?e/=3:"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:q(e)},from:function(a,b){return vb.duration({to:this,from:a}).locale(this.locale()).humanize(!b)},fromNow:function(a){return this.from(vb(),a)},calendar:function(a){var b=a||vb(),c=M(b,this).startOf("day"),d=this.diff(c,"days",!0),e=-6>d?"sameElse":-1>d?"lastWeek":0>d?"lastDay":1>d?"sameDay":2>d?"nextDay":7>d?"nextWeek":"sameElse";return this.format(this.localeData().calendar(e,this,vb(b)))},isLeapYear:function(){return G(this.year())},isDST:function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},day:function(a){var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=gb(a,this.localeData()),this.add(a-b,"d")):b},month:qb("Month",!0),startOf:function(a){switch(a=z(a)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===a?this.weekday(0):"isoWeek"===a&&this.isoWeekday(1),"quarter"===a&&this.month(3*Math.floor(this.month()/3)),this},endOf:function(b){return b=z(b),b===a||"millisecond"===b?this:this.startOf(b).add(1,"isoWeek"===b?"week":b).subtract(1,"ms")},isAfter:function(a,b){var c;return b=z("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=vb.isMoment(a)?a:vb(a),+this>+a):(c=vb.isMoment(a)?+a:+vb(a),c<+this.clone().startOf(b))},isBefore:function(a,b){var c;return b=z("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=vb.isMoment(a)?a:vb(a),+a>+this):(c=vb.isMoment(a)?+a:+vb(a),+this.clone().endOf(b)a?this:a}),max:f("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(a){return a=vb.apply(null,arguments),a>this?this:a}),zone:f("moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779",function(a,b){return null!=a?("string"!=typeof a&&(a=-a),this.utcOffset(a,b),this):-this.utcOffset()}),utcOffset:function(a,b){var c,d=this._offset||0;return null!=a?("string"==typeof a&&(a=S(a)),Math.abs(a)<16&&(a=60*a),!this._isUTC&&b&&(c=this._dateUtcOffset()),this._offset=a,this._isUTC=!0,null!=c&&this.add(c,"m"),d!==a&&(!b||this._changeInProgress?v(this,vb.duration(a-d,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,vb.updateOffset(this,!0),this._changeInProgress=null)),this):this._isUTC?d:this._dateUtcOffset()},isLocal:function(){return!this._isUTC},isUtcOffset:function(){return this._isUTC},isUtc:function(){return this._isUTC&&0===this._offset},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.utcOffset(this._tzm):"string"==typeof this._i&&this.utcOffset(S(this._i)),this},hasAlignedHourOffset:function(a){return a=a?vb(a).utcOffset():0,(this.utcOffset()-a)%60===0},daysInMonth:function(){return D(this.year(),this.month())},dayOfYear:function(a){var b=Ab((vb(this).startOf("day")-vb(this).startOf("year"))/864e5)+1;return null==a?b:this.add(a-b,"d")},quarter:function(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)},weekYear:function(a){var b=jb(this,this.localeData()._week.dow,this.localeData()._week.doy).year;return null==a?b:this.add(a-b,"y")},isoWeekYear:function(a){var b=jb(this,1,4).year;return null==a?b:this.add(a-b,"y")},week:function(a){var b=this.localeData().week(this);return null==a?b:this.add(7*(a-b),"d")},isoWeek:function(a){var b=jb(this,1,4).week;return null==a?b:this.add(7*(a-b),"d")},weekday:function(a){var b=(this.day()+7-this.localeData()._week.dow)%7;return null==a?b:this.add(a-b,"d")},isoWeekday:function(a){return null==a?this.day()||7:this.day(this.day()%7?a:a-7)},isoWeeksInYear:function(){return E(this.year(),1,4)},weeksInYear:function(){var a=this.localeData()._week;return E(this.year(),a.dow,a.doy)},get:function(a){return a=z(a),this[a]()},set:function(a,b){var c;if("object"==typeof a)for(c in a)this.set(c,a[c]);else a=z(a),"function"==typeof this[a]&&this[a](b);return this},locale:function(b){var c;return b===a?this._locale._abbr:(c=vb.localeData(b),null!=c&&(this._locale=c),this)},lang:f("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(b){return b===a?this.localeData():this.locale(b)}),localeData:function(){return this._locale},_dateUtcOffset:function(){return 15*-Math.round(this._d.getTimezoneOffset()/15)}}),vb.fn.millisecond=vb.fn.milliseconds=qb("Milliseconds",!1),vb.fn.second=vb.fn.seconds=qb("Seconds",!1),vb.fn.minute=vb.fn.minutes=qb("Minutes",!1),vb.fn.hour=vb.fn.hours=qb("Hours",!0),vb.fn.date=qb("Date",!0),vb.fn.dates=f("dates accessor is deprecated. Use date instead.",qb("Date",!0)),vb.fn.year=qb("FullYear",!0),vb.fn.years=f("years accessor is deprecated. Use year instead.",qb("FullYear",!0)),vb.fn.days=vb.fn.day,vb.fn.months=vb.fn.month,vb.fn.weeks=vb.fn.week,vb.fn.isoWeeks=vb.fn.isoWeek,vb.fn.quarters=vb.fn.quarter,vb.fn.toJSON=vb.fn.toISOString,vb.fn.isUTC=vb.fn.isUtc,o(vb.duration.fn=n.prototype,{_bubble:function(){var a,b,c,d=this._milliseconds,e=this._days,f=this._months,g=this._data,h=0;g.milliseconds=d%1e3,a=q(d/1e3),g.seconds=a%60,b=q(a/60),g.minutes=b%60,c=q(b/60),g.hours=c%24,e+=q(c/24),h=q(rb(e)),e-=q(sb(h)),f+=q(e/30),e%=30,h+=q(f/12),f%=12,g.days=e,g.months=f,g.years=h},abs:function(){return this._milliseconds=Math.abs(this._milliseconds),this._days=Math.abs(this._days),this._months=Math.abs(this._months),this._data.milliseconds=Math.abs(this._data.milliseconds),this._data.seconds=Math.abs(this._data.seconds),this._data.minutes=Math.abs(this._data.minutes),this._data.hours=Math.abs(this._data.hours),this._data.months=Math.abs(this._data.months),this._data.years=Math.abs(this._data.years),this},weeks:function(){return q(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*C(this._months/12) +},humanize:function(a){var b=ib(this,!a,this.localeData());return a&&(b=this.localeData().pastFuture(+this,b)),this.localeData().postformat(b)},add:function(a,b){var c=vb.duration(a,b);return this._milliseconds+=c._milliseconds,this._days+=c._days,this._months+=c._months,this._bubble(),this},subtract:function(a,b){var c=vb.duration(a,b);return this._milliseconds-=c._milliseconds,this._days-=c._days,this._months-=c._months,this._bubble(),this},get:function(a){return a=z(a),this[a.toLowerCase()+"s"]()},as:function(a){var b,c;if(a=z(a),"month"===a||"year"===a)return b=this._days+this._milliseconds/864e5,c=this._months+12*rb(b),"month"===a?c:c/12;switch(b=this._days+Math.round(sb(this._months/12)),a){case"week":return b/7+this._milliseconds/6048e5;case"day":return b+this._milliseconds/864e5;case"hour":return 24*b+this._milliseconds/36e5;case"minute":return 24*b*60+this._milliseconds/6e4;case"second":return 24*b*60*60+this._milliseconds/1e3;case"millisecond":return Math.floor(24*b*60*60*1e3)+this._milliseconds;default:throw new Error("Unknown unit "+a)}},lang:vb.fn.lang,locale:vb.fn.locale,toIsoString:f("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",function(){return this.toISOString()}),toISOString:function(){var a=Math.abs(this.years()),b=Math.abs(this.months()),c=Math.abs(this.days()),d=Math.abs(this.hours()),e=Math.abs(this.minutes()),f=Math.abs(this.seconds()+this.milliseconds()/1e3);return this.asSeconds()?(this.asSeconds()<0?"-":"")+"P"+(a?a+"Y":"")+(b?b+"M":"")+(c?c+"D":"")+(d||e||f?"T":"")+(d?d+"H":"")+(e?e+"M":"")+(f?f+"S":""):"P0D"},localeData:function(){return this._locale},toJSON:function(){return this.toISOString()}}),vb.duration.fn.toString=vb.duration.fn.toISOString;for(xb in kc)c(kc,xb)&&tb(xb.toLowerCase());vb.duration.fn.asMilliseconds=function(){return this.as("ms")},vb.duration.fn.asSeconds=function(){return this.as("s")},vb.duration.fn.asMinutes=function(){return this.as("m")},vb.duration.fn.asHours=function(){return this.as("h")},vb.duration.fn.asDays=function(){return this.as("d")},vb.duration.fn.asWeeks=function(){return this.as("weeks")},vb.duration.fn.asMonths=function(){return this.as("M")},vb.duration.fn.asYears=function(){return this.as("y")},vb.locale("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var b=a%10,c=1===C(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}),Lb?module.exports=vb:"function"==typeof define&&define.amd?(define(function(a,b,c){return c.config&&c.config()&&c.config().noGlobal===!0&&(zb.moment=wb),vb}),ub(!0)):ub()}).call(this); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/moment.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/moment.js new file mode 100644 index 0000000..c635ec0 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/moment.js @@ -0,0 +1,3043 @@ +//! moment.js +//! version : 2.9.0 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com + +(function (undefined) { + /************************************ + Constants + ************************************/ + + var moment, + VERSION = '2.9.0', + // the global-scope this is NOT the global object in Node.js + globalScope = (typeof global !== 'undefined' && (typeof window === 'undefined' || window === global.window)) ? global : this, + oldGlobalMoment, + round = Math.round, + hasOwnProperty = Object.prototype.hasOwnProperty, + i, + + YEAR = 0, + MONTH = 1, + DATE = 2, + HOUR = 3, + MINUTE = 4, + SECOND = 5, + MILLISECOND = 6, + + // internal storage for locale config files + locales = {}, + + // extra moment internal properties (plugins register props here) + momentProperties = [], + + // check for nodeJS + hasModule = (typeof module !== 'undefined' && module && module.exports), + + // ASP.NET json date format regex + aspNetJsonRegex = /^\/?Date\((\-?\d+)/i, + aspNetTimeSpanJsonRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/, + + // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html + // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere + isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/, + + // format tokens + formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|x|X|zz?|ZZ?|.)/g, + localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, + + // parsing token regexes + parseTokenOneOrTwoDigits = /\d\d?/, // 0 - 99 + parseTokenOneToThreeDigits = /\d{1,3}/, // 0 - 999 + parseTokenOneToFourDigits = /\d{1,4}/, // 0 - 9999 + parseTokenOneToSixDigits = /[+\-]?\d{1,6}/, // -999,999 - 999,999 + parseTokenDigits = /\d+/, // nonzero number of digits + parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i, // any word (or two) characters or numbers including two/three word month in arabic. + parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z + parseTokenT = /T/i, // T (ISO separator) + parseTokenOffsetMs = /[\+\-]?\d+/, // 1234567890123 + parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123 + + //strict parsing regexes + parseTokenOneDigit = /\d/, // 0 - 9 + parseTokenTwoDigits = /\d\d/, // 00 - 99 + parseTokenThreeDigits = /\d{3}/, // 000 - 999 + parseTokenFourDigits = /\d{4}/, // 0000 - 9999 + parseTokenSixDigits = /[+-]?\d{6}/, // -999,999 - 999,999 + parseTokenSignedNumber = /[+-]?\d+/, // -inf - inf + + // iso 8601 regex + // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) + isoRegex = /^\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)?)?$/, + + isoFormat = 'YYYY-MM-DDTHH:mm:ssZ', + + isoDates = [ + ['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}/] + ], + + // iso time formats and regexes + isoTimes = [ + ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d+/], + ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/], + ['HH:mm', /(T| )\d\d:\d\d/], + ['HH', /(T| )\d\d/] + ], + + // timezone chunker '+10:00' > ['10', '00'] or '-1530' > ['-', '15', '30'] + parseTimezoneChunker = /([\+\-]|\d\d)/gi, + + // getter and setter names + proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'), + unitMillisecondFactors = { + 'Milliseconds' : 1, + 'Seconds' : 1e3, + 'Minutes' : 6e4, + 'Hours' : 36e5, + 'Days' : 864e5, + 'Months' : 2592e6, + 'Years' : 31536e6 + }, + + unitAliases = { + ms : 'millisecond', + s : 'second', + m : 'minute', + h : 'hour', + d : 'day', + D : 'date', + w : 'week', + W : 'isoWeek', + M : 'month', + Q : 'quarter', + y : 'year', + DDD : 'dayOfYear', + e : 'weekday', + E : 'isoWeekday', + gg: 'weekYear', + GG: 'isoWeekYear' + }, + + camelFunctions = { + dayofyear : 'dayOfYear', + isoweekday : 'isoWeekday', + isoweek : 'isoWeek', + weekyear : 'weekYear', + isoweekyear : 'isoWeekYear' + }, + + // format function strings + formatFunctions = {}, + + // default relative time thresholds + relativeTimeThresholds = { + s: 45, // seconds to minute + m: 45, // minutes to hour + h: 22, // hours to day + d: 26, // days to month + M: 11 // months to year + }, + + // tokens to ordinalize and pad + ordinalizeTokens = 'DDD w W M D d'.split(' '), + paddedTokens = 'M D H h m s w W'.split(' '), + + formatTokenFunctions = { + M : function () { + return this.month() + 1; + }, + MMM : function (format) { + return this.localeData().monthsShort(this, format); + }, + MMMM : function (format) { + return this.localeData().months(this, format); + }, + D : function () { + return this.date(); + }, + DDD : function () { + return this.dayOfYear(); + }, + d : function () { + return this.day(); + }, + dd : function (format) { + return this.localeData().weekdaysMin(this, format); + }, + ddd : function (format) { + return this.localeData().weekdaysShort(this, format); + }, + dddd : function (format) { + return this.localeData().weekdays(this, format); + }, + w : function () { + return this.week(); + }, + W : function () { + return this.isoWeek(); + }, + YY : function () { + return leftZeroFill(this.year() % 100, 2); + }, + YYYY : function () { + return leftZeroFill(this.year(), 4); + }, + YYYYY : function () { + return leftZeroFill(this.year(), 5); + }, + YYYYYY : function () { + var y = this.year(), sign = y >= 0 ? '+' : '-'; + return sign + leftZeroFill(Math.abs(y), 6); + }, + gg : function () { + return leftZeroFill(this.weekYear() % 100, 2); + }, + gggg : function () { + return leftZeroFill(this.weekYear(), 4); + }, + ggggg : function () { + return leftZeroFill(this.weekYear(), 5); + }, + GG : function () { + return leftZeroFill(this.isoWeekYear() % 100, 2); + }, + GGGG : function () { + return leftZeroFill(this.isoWeekYear(), 4); + }, + GGGGG : function () { + return leftZeroFill(this.isoWeekYear(), 5); + }, + e : function () { + return this.weekday(); + }, + E : function () { + return this.isoWeekday(); + }, + a : function () { + return this.localeData().meridiem(this.hours(), this.minutes(), true); + }, + A : function () { + return this.localeData().meridiem(this.hours(), this.minutes(), false); + }, + 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 toInt(this.milliseconds() / 100); + }, + SS : function () { + return leftZeroFill(toInt(this.milliseconds() / 10), 2); + }, + SSS : function () { + return leftZeroFill(this.milliseconds(), 3); + }, + SSSS : function () { + return leftZeroFill(this.milliseconds(), 3); + }, + Z : function () { + var a = this.utcOffset(), + b = '+'; + if (a < 0) { + a = -a; + b = '-'; + } + return b + leftZeroFill(toInt(a / 60), 2) + ':' + leftZeroFill(toInt(a) % 60, 2); + }, + ZZ : function () { + var a = this.utcOffset(), + b = '+'; + if (a < 0) { + a = -a; + b = '-'; + } + return b + leftZeroFill(toInt(a / 60), 2) + leftZeroFill(toInt(a) % 60, 2); + }, + z : function () { + return this.zoneAbbr(); + }, + zz : function () { + return this.zoneName(); + }, + x : function () { + return this.valueOf(); + }, + X : function () { + return this.unix(); + }, + Q : function () { + return this.quarter(); + } + }, + + deprecations = {}, + + lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin'], + + updateInProgress = false; + + // Pick the first defined of two or three arguments. dfl comes from + // default. + function dfl(a, b, c) { + switch (arguments.length) { + case 2: return a != null ? a : b; + case 3: return a != null ? a : b != null ? b : c; + default: throw new Error('Implement me'); + } + } + + function hasOwnProp(a, b) { + return hasOwnProperty.call(a, b); + } + + function defaultParsingFlags() { + // We need to deep clone this object, and es5 standard is not very + // helpful. + return { + empty : false, + unusedTokens : [], + unusedInput : [], + overflow : -2, + charsLeftOver : 0, + nullInput : false, + invalidMonth : null, + invalidFormat : false, + userInvalidated : false, + iso: false + }; + } + + function printMsg(msg) { + if (moment.suppressDeprecationWarnings === false && + typeof console !== 'undefined' && console.warn) { + console.warn('Deprecation warning: ' + msg); + } + } + + function deprecate(msg, fn) { + var firstTime = true; + return extend(function () { + if (firstTime) { + printMsg(msg); + firstTime = false; + } + return fn.apply(this, arguments); + }, fn); + } + + function deprecateSimple(name, msg) { + if (!deprecations[name]) { + printMsg(msg); + deprecations[name] = true; + } + } + + function padToken(func, count) { + return function (a) { + return leftZeroFill(func.call(this, a), count); + }; + } + function ordinalizeToken(func, period) { + return function (a) { + return this.localeData().ordinal(func.call(this, a), period); + }; + } + + function monthDiff(a, b) { + // difference in months + var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), + // b is in (anchor - 1 month, anchor + 1 month) + anchor = a.clone().add(wholeMonthDiff, 'months'), + anchor2, adjust; + + if (b - anchor < 0) { + anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor - anchor2); + } else { + anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor2 - anchor); + } + + return -(wholeMonthDiff + adjust); + } + + while (ordinalizeTokens.length) { + i = ordinalizeTokens.pop(); + formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i); + } + while (paddedTokens.length) { + i = paddedTokens.pop(); + formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2); + } + formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3); + + + function meridiemFixWrap(locale, hour, meridiem) { + var isPm; + + if (meridiem == null) { + // nothing to do + return hour; + } + if (locale.meridiemHour != null) { + return locale.meridiemHour(hour, meridiem); + } else if (locale.isPM != null) { + // Fallback + isPm = locale.isPM(meridiem); + if (isPm && hour < 12) { + hour += 12; + } + if (!isPm && hour === 12) { + hour = 0; + } + return hour; + } else { + // thie is not supposed to happen + return hour; + } + } + + /************************************ + Constructors + ************************************/ + + function Locale() { + } + + // Moment prototype object + function Moment(config, skipOverflow) { + if (skipOverflow !== false) { + checkOverflow(config); + } + copyConfig(this, config); + this._d = new Date(+config._d); + // Prevent infinite loop in case updateOffset creates new moment + // objects. + if (updateInProgress === false) { + updateInProgress = true; + moment.updateOffset(this); + updateInProgress = false; + } + } + + // Duration Constructor + function Duration(duration) { + var normalizedInput = normalizeObjectUnits(duration), + years = normalizedInput.year || 0, + quarters = normalizedInput.quarter || 0, + months = normalizedInput.month || 0, + weeks = normalizedInput.week || 0, + days = normalizedInput.day || 0, + hours = normalizedInput.hour || 0, + minutes = normalizedInput.minute || 0, + seconds = normalizedInput.second || 0, + milliseconds = normalizedInput.millisecond || 0; + + // representation for dateAddRemove + this._milliseconds = +milliseconds + + seconds * 1e3 + // 1000 + minutes * 6e4 + // 1000 * 60 + hours * 36e5; // 1000 * 60 * 60 + // Because of dateAddRemove treats 24 hours as different from a + // day when working around DST, we need to store them separately + this._days = +days + + weeks * 7; + // It is impossible translate months into days without knowing + // which months you are are talking about, so we have to store + // it separately. + this._months = +months + + quarters * 3 + + years * 12; + + this._data = {}; + + this._locale = moment.localeData(); + + this._bubble(); + } + + /************************************ + Helpers + ************************************/ + + + function extend(a, b) { + for (var i in b) { + if (hasOwnProp(b, i)) { + a[i] = b[i]; + } + } + + if (hasOwnProp(b, 'toString')) { + a.toString = b.toString; + } + + if (hasOwnProp(b, 'valueOf')) { + a.valueOf = b.valueOf; + } + + return a; + } + + function copyConfig(to, from) { + var i, prop, val; + + if (typeof from._isAMomentObject !== 'undefined') { + to._isAMomentObject = from._isAMomentObject; + } + if (typeof from._i !== 'undefined') { + to._i = from._i; + } + if (typeof from._f !== 'undefined') { + to._f = from._f; + } + if (typeof from._l !== 'undefined') { + to._l = from._l; + } + if (typeof from._strict !== 'undefined') { + to._strict = from._strict; + } + if (typeof from._tzm !== 'undefined') { + to._tzm = from._tzm; + } + if (typeof from._isUTC !== 'undefined') { + to._isUTC = from._isUTC; + } + if (typeof from._offset !== 'undefined') { + to._offset = from._offset; + } + if (typeof from._pf !== 'undefined') { + to._pf = from._pf; + } + if (typeof from._locale !== 'undefined') { + to._locale = from._locale; + } + + if (momentProperties.length > 0) { + for (i in momentProperties) { + prop = momentProperties[i]; + val = from[prop]; + if (typeof val !== 'undefined') { + to[prop] = val; + } + } + } + + return to; + } + + function absRound(number) { + if (number < 0) { + return Math.ceil(number); + } else { + return Math.floor(number); + } + } + + // left zero fill a number + // see http://jsperf.com/left-zero-filling for performance comparison + function leftZeroFill(number, targetLength, forceSign) { + var output = '' + Math.abs(number), + sign = number >= 0; + + while (output.length < targetLength) { + output = '0' + output; + } + return (sign ? (forceSign ? '+' : '') : '-') + output; + } + + function positiveMomentsDifference(base, other) { + var res = {milliseconds: 0, months: 0}; + + res.months = other.month() - base.month() + + (other.year() - base.year()) * 12; + if (base.clone().add(res.months, 'M').isAfter(other)) { + --res.months; + } + + res.milliseconds = +other - +(base.clone().add(res.months, 'M')); + + return res; + } + + function momentsDifference(base, other) { + var res; + other = makeAs(other, base); + if (base.isBefore(other)) { + res = positiveMomentsDifference(base, other); + } else { + res = positiveMomentsDifference(other, base); + res.milliseconds = -res.milliseconds; + res.months = -res.months; + } + + return res; + } + + // TODO: remove 'name' arg after deprecation is removed + function createAdder(direction, name) { + return function (val, period) { + var dur, tmp; + //invert the arguments, but complain about it + if (period !== null && !isNaN(+period)) { + deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period).'); + tmp = val; val = period; period = tmp; + } + + val = typeof val === 'string' ? +val : val; + dur = moment.duration(val, period); + addOrSubtractDurationFromMoment(this, dur, direction); + return this; + }; + } + + function addOrSubtractDurationFromMoment(mom, duration, isAdding, updateOffset) { + var milliseconds = duration._milliseconds, + days = duration._days, + months = duration._months; + updateOffset = updateOffset == null ? true : updateOffset; + + if (milliseconds) { + mom._d.setTime(+mom._d + milliseconds * isAdding); + } + if (days) { + rawSetter(mom, 'Date', rawGetter(mom, 'Date') + days * isAdding); + } + if (months) { + rawMonthSetter(mom, rawGetter(mom, 'Month') + months * isAdding); + } + if (updateOffset) { + moment.updateOffset(mom, days || months); + } + } + + // check if is an array + function isArray(input) { + return Object.prototype.toString.call(input) === '[object Array]'; + } + + function isDate(input) { + return Object.prototype.toString.call(input) === '[object Date]' || + input instanceof Date; + } + + // compare two arrays, return the number of differences + function compareArrays(array1, array2, dontConvert) { + var len = Math.min(array1.length, array2.length), + lengthDiff = Math.abs(array1.length - array2.length), + diffs = 0, + i; + for (i = 0; i < len; i++) { + if ((dontConvert && array1[i] !== array2[i]) || + (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { + diffs++; + } + } + return diffs + lengthDiff; + } + + function normalizeUnits(units) { + if (units) { + var lowered = units.toLowerCase().replace(/(.)s$/, '$1'); + units = unitAliases[units] || camelFunctions[lowered] || lowered; + } + return units; + } + + function normalizeObjectUnits(inputObject) { + var normalizedInput = {}, + normalizedProp, + prop; + + for (prop in inputObject) { + if (hasOwnProp(inputObject, prop)) { + normalizedProp = normalizeUnits(prop); + if (normalizedProp) { + normalizedInput[normalizedProp] = inputObject[prop]; + } + } + } + + return normalizedInput; + } + + function makeList(field) { + var count, setter; + + if (field.indexOf('week') === 0) { + count = 7; + setter = 'day'; + } + else if (field.indexOf('month') === 0) { + count = 12; + setter = 'month'; + } + else { + return; + } + + moment[field] = function (format, index) { + var i, getter, + method = moment._locale[field], + results = []; + + if (typeof format === 'number') { + index = format; + format = undefined; + } + + getter = function (i) { + var m = moment().utc().set(setter, i); + return method.call(moment._locale, m, format || ''); + }; + + if (index != null) { + return getter(index); + } + else { + for (i = 0; i < count; i++) { + results.push(getter(i)); + } + return results; + } + }; + } + + function toInt(argumentForCoercion) { + var coercedNumber = +argumentForCoercion, + value = 0; + + if (coercedNumber !== 0 && isFinite(coercedNumber)) { + if (coercedNumber >= 0) { + value = Math.floor(coercedNumber); + } else { + value = Math.ceil(coercedNumber); + } + } + + return value; + } + + function daysInMonth(year, month) { + return new Date(Date.UTC(year, month + 1, 0)).getUTCDate(); + } + + function weeksInYear(year, dow, doy) { + return weekOfYear(moment([year, 11, 31 + dow - doy]), dow, doy).week; + } + + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; + } + + function isLeapYear(year) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; + } + + function checkOverflow(m) { + var overflow; + if (m._a && m._pf.overflow === -2) { + overflow = + m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH : + m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE : + m._a[HOUR] < 0 || m._a[HOUR] > 24 || + (m._a[HOUR] === 24 && (m._a[MINUTE] !== 0 || + m._a[SECOND] !== 0 || + m._a[MILLISECOND] !== 0)) ? HOUR : + m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE : + m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND : + m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND : + -1; + + if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { + overflow = DATE; + } + + m._pf.overflow = overflow; + } + } + + function isValid(m) { + if (m._isValid == null) { + m._isValid = !isNaN(m._d.getTime()) && + m._pf.overflow < 0 && + !m._pf.empty && + !m._pf.invalidMonth && + !m._pf.nullInput && + !m._pf.invalidFormat && + !m._pf.userInvalidated; + + if (m._strict) { + m._isValid = m._isValid && + m._pf.charsLeftOver === 0 && + m._pf.unusedTokens.length === 0 && + m._pf.bigHour === undefined; + } + } + return m._isValid; + } + + function normalizeLocale(key) { + return key ? key.toLowerCase().replace('_', '-') : key; + } + + // pick the locale from the array + // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each + // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root + function chooseLocale(names) { + var i = 0, j, next, locale, split; + + while (i < names.length) { + split = normalizeLocale(names[i]).split('-'); + j = split.length; + next = normalizeLocale(names[i + 1]); + next = next ? next.split('-') : null; + while (j > 0) { + locale = loadLocale(split.slice(0, j).join('-')); + if (locale) { + return locale; + } + if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { + //the next array item is better than a shallower substring of this one + break; + } + j--; + } + i++; + } + return null; + } + + function loadLocale(name) { + var oldLocale = null; + if (!locales[name] && hasModule) { + try { + oldLocale = moment.locale(); + require('./locale/' + name); + // because defineLocale currently also sets the global locale, we want to undo that for lazy loaded locales + moment.locale(oldLocale); + } catch (e) { } + } + return locales[name]; + } + + // Return a moment from input, that is local/utc/utcOffset equivalent to + // model. + function makeAs(input, model) { + var res, diff; + if (model._isUTC) { + res = model.clone(); + diff = (moment.isMoment(input) || isDate(input) ? + +input : +moment(input)) - (+res); + // Use low-level api, because this fn is low-level api. + res._d.setTime(+res._d + diff); + moment.updateOffset(res, false); + return res; + } else { + return moment(input).local(); + } + } + + /************************************ + Locale + ************************************/ + + + extend(Locale.prototype, { + + set : function (config) { + var prop, i; + for (i in config) { + prop = config[i]; + if (typeof prop === 'function') { + this[i] = prop; + } else { + this['_' + i] = prop; + } + } + // Lenient ordinal parsing accepts just a number in addition to + // number + (possibly) stuff coming from _ordinalParseLenient. + this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + /\d{1,2}/.source); + }, + + _months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + months : function (m) { + return this._months[m.month()]; + }, + + _monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + monthsShort : function (m) { + return this._monthsShort[m.month()]; + }, + + monthsParse : function (monthName, format, strict) { + var i, mom, regex; + + if (!this._monthsParse) { + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + } + + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = moment.utc([2000, i]); + if (strict && !this._longMonthsParse[i]) { + this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); + this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); + } + if (!strict && !this._monthsParse[i]) { + regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); + this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { + return i; + } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { + return i; + } else if (!strict && this._monthsParse[i].test(monthName)) { + return i; + } + } + }, + + _weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdays : function (m) { + return this._weekdays[m.day()]; + }, + + _weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysShort : function (m) { + return this._weekdaysShort[m.day()]; + }, + + _weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + weekdaysMin : function (m) { + return this._weekdaysMin[m.day()]; + }, + + weekdaysParse : function (weekdayName) { + var i, mom, regex; + + if (!this._weekdaysParse) { + this._weekdaysParse = []; + } + + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + if (!this._weekdaysParse[i]) { + mom = moment([2000, 1]).day(i); + regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); + this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (this._weekdaysParse[i].test(weekdayName)) { + return i; + } + } + }, + + _longDateFormat : { + LTS : 'h:mm:ss A', + 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 (key) { + var output = this._longDateFormat[key]; + if (!output && this._longDateFormat[key.toUpperCase()]) { + output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) { + return val.slice(1); + }); + this._longDateFormat[key] = output; + } + return output; + }, + + isPM : function (input) { + // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays + // Using charAt should be more compatible. + return ((input + '').toLowerCase().charAt(0) === 'p'); + }, + + _meridiemParse : /[ap]\.?m?\.?/i, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'pm' : 'PM'; + } else { + return isLower ? '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 (key, mom, now) { + var output = this._calendar[key]; + return typeof output === 'function' ? output.apply(mom, [now]) : output; + }, + + _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 (number, withoutSuffix, string, isFuture) { + var output = this._relativeTime[string]; + return (typeof output === 'function') ? + output(number, withoutSuffix, string, isFuture) : + output.replace(/%d/i, number); + }, + + pastFuture : function (diff, output) { + var format = this._relativeTime[diff > 0 ? 'future' : 'past']; + return typeof format === 'function' ? format(output) : format.replace(/%s/i, output); + }, + + ordinal : function (number) { + return this._ordinal.replace('%d', number); + }, + _ordinal : '%d', + _ordinalParse : /\d{1,2}/, + + preparse : function (string) { + return string; + }, + + postformat : function (string) { + return string; + }, + + week : function (mom) { + return weekOfYear(mom, this._week.dow, this._week.doy).week; + }, + + _week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + }, + + firstDayOfWeek : function () { + return this._week.dow; + }, + + firstDayOfYear : function () { + return this._week.doy; + }, + + _invalidDate: 'Invalid date', + invalidDate: function () { + return this._invalidDate; + } + }); + + /************************************ + Formatting + ************************************/ + + + function removeFormattingTokens(input) { + if (input.match(/\[[\s\S]/)) { + return input.replace(/^\[|\]$/g, ''); + } + return input.replace(/\\/g, ''); + } + + function makeFormatFunction(format) { + var array = format.match(formattingTokens), i, length; + + for (i = 0, length = array.length; i < length; i++) { + if (formatTokenFunctions[array[i]]) { + array[i] = formatTokenFunctions[array[i]]; + } else { + array[i] = removeFormattingTokens(array[i]); + } + } + + return function (mom) { + var output = ''; + for (i = 0; i < length; i++) { + output += array[i] instanceof Function ? array[i].call(mom, format) : array[i]; + } + return output; + }; + } + + // format date using native date object + function formatMoment(m, format) { + if (!m.isValid()) { + return m.localeData().invalidDate(); + } + + format = expandFormat(format, m.localeData()); + + if (!formatFunctions[format]) { + formatFunctions[format] = makeFormatFunction(format); + } + + return formatFunctions[format](m); + } + + function expandFormat(format, locale) { + var i = 5; + + function replaceLongDateFormatTokens(input) { + return locale.longDateFormat(input) || input; + } + + localFormattingTokens.lastIndex = 0; + while (i >= 0 && localFormattingTokens.test(format)) { + format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); + localFormattingTokens.lastIndex = 0; + i -= 1; + } + + return format; + } + + + /************************************ + Parsing + ************************************/ + + + // get the regex to find the next token + function getParseRegexForToken(token, config) { + var a, strict = config._strict; + switch (token) { + case 'Q': + return parseTokenOneDigit; + case 'DDDD': + return parseTokenThreeDigits; + case 'YYYY': + case 'GGGG': + case 'gggg': + return strict ? parseTokenFourDigits : parseTokenOneToFourDigits; + case 'Y': + case 'G': + case 'g': + return parseTokenSignedNumber; + case 'YYYYYY': + case 'YYYYY': + case 'GGGGG': + case 'ggggg': + return strict ? parseTokenSixDigits : parseTokenOneToSixDigits; + case 'S': + if (strict) { + return parseTokenOneDigit; + } + /* falls through */ + case 'SS': + if (strict) { + return parseTokenTwoDigits; + } + /* falls through */ + case 'SSS': + if (strict) { + return parseTokenThreeDigits; + } + /* falls through */ + case 'DDD': + return parseTokenOneToThreeDigits; + case 'MMM': + case 'MMMM': + case 'dd': + case 'ddd': + case 'dddd': + return parseTokenWord; + case 'a': + case 'A': + return config._locale._meridiemParse; + case 'x': + return parseTokenOffsetMs; + case 'X': + return parseTokenTimestampMs; + case 'Z': + case 'ZZ': + return parseTokenTimezone; + case 'T': + return parseTokenT; + case 'SSSS': + return parseTokenDigits; + case 'MM': + case 'DD': + case 'YY': + case 'GG': + case 'gg': + case 'HH': + case 'hh': + case 'mm': + case 'ss': + case 'ww': + case 'WW': + return strict ? parseTokenTwoDigits : parseTokenOneOrTwoDigits; + case 'M': + case 'D': + case 'd': + case 'H': + case 'h': + case 'm': + case 's': + case 'w': + case 'W': + case 'e': + case 'E': + return parseTokenOneOrTwoDigits; + case 'Do': + return strict ? config._locale._ordinalParse : config._locale._ordinalParseLenient; + default : + a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), 'i')); + return a; + } + } + + function utcOffsetFromString(string) { + string = string || ''; + var possibleTzMatches = (string.match(parseTokenTimezone) || []), + tzChunk = possibleTzMatches[possibleTzMatches.length - 1] || [], + parts = (tzChunk + '').match(parseTimezoneChunker) || ['-', 0, 0], + minutes = +(parts[1] * 60) + toInt(parts[2]); + + return parts[0] === '+' ? minutes : -minutes; + } + + // function to convert string input to date + function addTimeToArrayFromToken(token, input, config) { + var a, datePartArray = config._a; + + switch (token) { + // QUARTER + case 'Q': + if (input != null) { + datePartArray[MONTH] = (toInt(input) - 1) * 3; + } + break; + // MONTH + case 'M' : // fall through to MM + case 'MM' : + if (input != null) { + datePartArray[MONTH] = toInt(input) - 1; + } + break; + case 'MMM' : // fall through to MMMM + case 'MMMM' : + a = config._locale.monthsParse(input, token, config._strict); + // if we didn't find a month name, mark the date as invalid. + if (a != null) { + datePartArray[MONTH] = a; + } else { + config._pf.invalidMonth = input; + } + break; + // DAY OF MONTH + case 'D' : // fall through to DD + case 'DD' : + if (input != null) { + datePartArray[DATE] = toInt(input); + } + break; + case 'Do' : + if (input != null) { + datePartArray[DATE] = toInt(parseInt( + input.match(/\d{1,2}/)[0], 10)); + } + break; + // DAY OF YEAR + case 'DDD' : // fall through to DDDD + case 'DDDD' : + if (input != null) { + config._dayOfYear = toInt(input); + } + + break; + // YEAR + case 'YY' : + datePartArray[YEAR] = moment.parseTwoDigitYear(input); + break; + case 'YYYY' : + case 'YYYYY' : + case 'YYYYYY' : + datePartArray[YEAR] = toInt(input); + break; + // AM / PM + case 'a' : // fall through to A + case 'A' : + config._meridiem = input; + // config._isPm = config._locale.isPM(input); + break; + // HOUR + case 'h' : // fall through to hh + case 'hh' : + config._pf.bigHour = true; + /* falls through */ + case 'H' : // fall through to HH + case 'HH' : + datePartArray[HOUR] = toInt(input); + break; + // MINUTE + case 'm' : // fall through to mm + case 'mm' : + datePartArray[MINUTE] = toInt(input); + break; + // SECOND + case 's' : // fall through to ss + case 'ss' : + datePartArray[SECOND] = toInt(input); + break; + // MILLISECOND + case 'S' : + case 'SS' : + case 'SSS' : + case 'SSSS' : + datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000); + break; + // UNIX OFFSET (MILLISECONDS) + case 'x': + config._d = new Date(toInt(input)); + break; + // UNIX TIMESTAMP WITH MS + case 'X': + config._d = new Date(parseFloat(input) * 1000); + break; + // TIMEZONE + case 'Z' : // fall through to ZZ + case 'ZZ' : + config._useUTC = true; + config._tzm = utcOffsetFromString(input); + break; + // WEEKDAY - human + case 'dd': + case 'ddd': + case 'dddd': + a = config._locale.weekdaysParse(input); + // if we didn't get a weekday name, mark the date as invalid + if (a != null) { + config._w = config._w || {}; + config._w['d'] = a; + } else { + config._pf.invalidWeekday = input; + } + break; + // WEEK, WEEK DAY - numeric + case 'w': + case 'ww': + case 'W': + case 'WW': + case 'd': + case 'e': + case 'E': + token = token.substr(0, 1); + /* falls through */ + case 'gggg': + case 'GGGG': + case 'GGGGG': + token = token.substr(0, 2); + if (input) { + config._w = config._w || {}; + config._w[token] = toInt(input); + } + break; + case 'gg': + case 'GG': + config._w = config._w || {}; + config._w[token] = moment.parseTwoDigitYear(input); + } + } + + function dayOfYearFromWeekInfo(config) { + var w, weekYear, week, weekday, dow, doy, temp; + + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + dow = 1; + doy = 4; + + // TODO: We need to take the current isoWeekYear, but that depends on + // how we interpret now (local, utc, fixed offset). So create + // a now version of current config (take local/utc/offset flags, and + // create now). + weekYear = dfl(w.GG, config._a[YEAR], weekOfYear(moment(), 1, 4).year); + week = dfl(w.W, 1); + weekday = dfl(w.E, 1); + } else { + dow = config._locale._week.dow; + doy = config._locale._week.doy; + + weekYear = dfl(w.gg, config._a[YEAR], weekOfYear(moment(), dow, doy).year); + week = dfl(w.w, 1); + + if (w.d != null) { + // weekday -- low day numbers are considered next week + weekday = w.d; + if (weekday < dow) { + ++week; + } + } else if (w.e != null) { + // local weekday -- counting starts from begining of week + weekday = w.e + dow; + } else { + // default to begining of week + weekday = dow; + } + } + temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow); + + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } + + // convert an array to a date. + // the array should mirror the parameters below + // note: all values past the year are optional and will default to the lowest possible value. + // [year, month, day , hour, minute, second, millisecond] + function dateFromConfig(config) { + var i, date, input = [], currentDate, yearToUse; + + if (config._d) { + return; + } + + currentDate = currentDateArray(config); + + //compute day of the year from weeks and weekdays + if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { + dayOfYearFromWeekInfo(config); + } + + //if the day of the year is set, figure out what it is + if (config._dayOfYear) { + yearToUse = dfl(config._a[YEAR], currentDate[YEAR]); + + if (config._dayOfYear > daysInYear(yearToUse)) { + config._pf._overflowDayOfYear = true; + } + + date = makeUTCDate(yearToUse, 0, config._dayOfYear); + config._a[MONTH] = date.getUTCMonth(); + config._a[DATE] = date.getUTCDate(); + } + + // Default to current date. + // * if no year, month, day of month are given, default to today + // * if day of month is given, default month and year + // * if month is given, default only year + // * if year is given, don't default anything + for (i = 0; i < 3 && config._a[i] == null; ++i) { + config._a[i] = input[i] = currentDate[i]; + } + + // Zero out whatever was not defaulted, including time + for (; i < 7; i++) { + config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; + } + + // Check for 24:00:00.000 + if (config._a[HOUR] === 24 && + config._a[MINUTE] === 0 && + config._a[SECOND] === 0 && + config._a[MILLISECOND] === 0) { + config._nextDay = true; + config._a[HOUR] = 0; + } + + config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input); + // Apply timezone offset from input. The actual utcOffset can be changed + // with parseZone. + if (config._tzm != null) { + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); + } + + if (config._nextDay) { + config._a[HOUR] = 24; + } + } + + function dateFromObject(config) { + var normalizedInput; + + if (config._d) { + return; + } + + normalizedInput = normalizeObjectUnits(config._i); + config._a = [ + normalizedInput.year, + normalizedInput.month, + normalizedInput.day || normalizedInput.date, + normalizedInput.hour, + normalizedInput.minute, + normalizedInput.second, + normalizedInput.millisecond + ]; + + dateFromConfig(config); + } + + function currentDateArray(config) { + var now = new Date(); + if (config._useUTC) { + return [ + now.getUTCFullYear(), + now.getUTCMonth(), + now.getUTCDate() + ]; + } else { + return [now.getFullYear(), now.getMonth(), now.getDate()]; + } + } + + // date from string and format string + function makeDateFromStringAndFormat(config) { + if (config._f === moment.ISO_8601) { + parseISO(config); + return; + } + + config._a = []; + config._pf.empty = true; + + // This array is used to make a Date, either with `new Date` or `Date.UTC` + var string = '' + config._i, + i, parsedInput, tokens, token, skipped, + stringLength = string.length, + totalParsedInputLength = 0; + + tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; + + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; + if (parsedInput) { + skipped = string.substr(0, string.indexOf(parsedInput)); + if (skipped.length > 0) { + config._pf.unusedInput.push(skipped); + } + string = string.slice(string.indexOf(parsedInput) + parsedInput.length); + totalParsedInputLength += parsedInput.length; + } + // don't parse if it's not a known token + if (formatTokenFunctions[token]) { + if (parsedInput) { + config._pf.empty = false; + } + else { + config._pf.unusedTokens.push(token); + } + addTimeToArrayFromToken(token, parsedInput, config); + } + else if (config._strict && !parsedInput) { + config._pf.unusedTokens.push(token); + } + } + + // add remaining unparsed input length to the string + config._pf.charsLeftOver = stringLength - totalParsedInputLength; + if (string.length > 0) { + config._pf.unusedInput.push(string); + } + + // clear _12h flag if hour is <= 12 + if (config._pf.bigHour === true && config._a[HOUR] <= 12) { + config._pf.bigHour = undefined; + } + // handle meridiem + config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], + config._meridiem); + dateFromConfig(config); + checkOverflow(config); + } + + function unescapeFormat(s) { + return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { + return p1 || p2 || p3 || p4; + }); + } + + // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript + function regexpEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + } + + // date from string and array of format strings + function makeDateFromStringAndArray(config) { + var tempConfig, + bestMoment, + + scoreToBeat, + i, + currentScore; + + if (config._f.length === 0) { + config._pf.invalidFormat = true; + config._d = new Date(NaN); + return; + } + + for (i = 0; i < config._f.length; i++) { + currentScore = 0; + tempConfig = copyConfig({}, config); + if (config._useUTC != null) { + tempConfig._useUTC = config._useUTC; + } + tempConfig._pf = defaultParsingFlags(); + tempConfig._f = config._f[i]; + makeDateFromStringAndFormat(tempConfig); + + if (!isValid(tempConfig)) { + continue; + } + + // if there is any input that was not parsed add a penalty for that format + currentScore += tempConfig._pf.charsLeftOver; + + //or tokens + currentScore += tempConfig._pf.unusedTokens.length * 10; + + tempConfig._pf.score = currentScore; + + if (scoreToBeat == null || currentScore < scoreToBeat) { + scoreToBeat = currentScore; + bestMoment = tempConfig; + } + } + + extend(config, bestMoment || tempConfig); + } + + // date from iso format + function parseISO(config) { + var i, l, + string = config._i, + match = isoRegex.exec(string); + + if (match) { + config._pf.iso = true; + for (i = 0, l = isoDates.length; i < l; i++) { + if (isoDates[i][1].exec(string)) { + // match[5] should be 'T' or undefined + config._f = isoDates[i][0] + (match[6] || ' '); + break; + } + } + for (i = 0, l = isoTimes.length; i < l; i++) { + if (isoTimes[i][1].exec(string)) { + config._f += isoTimes[i][0]; + break; + } + } + if (string.match(parseTokenTimezone)) { + config._f += 'Z'; + } + makeDateFromStringAndFormat(config); + } else { + config._isValid = false; + } + } + + // date from iso format or fallback + function makeDateFromString(config) { + parseISO(config); + if (config._isValid === false) { + delete config._isValid; + moment.createFromInputFallback(config); + } + } + + function map(arr, fn) { + var res = [], i; + for (i = 0; i < arr.length; ++i) { + res.push(fn(arr[i], i)); + } + return res; + } + + function makeDateFromInput(config) { + var input = config._i, matched; + if (input === undefined) { + config._d = new Date(); + } else if (isDate(input)) { + config._d = new Date(+input); + } else if ((matched = aspNetJsonRegex.exec(input)) !== null) { + config._d = new Date(+matched[1]); + } else if (typeof input === 'string') { + makeDateFromString(config); + } else if (isArray(input)) { + config._a = map(input.slice(0), function (obj) { + return parseInt(obj, 10); + }); + dateFromConfig(config); + } else if (typeof(input) === 'object') { + dateFromObject(config); + } else if (typeof(input) === 'number') { + // from milliseconds + config._d = new Date(input); + } else { + moment.createFromInputFallback(config); + } + } + + function makeDate(y, m, d, h, M, s, ms) { + //can't just apply() to create a date: + //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply + var date = new Date(y, m, d, h, M, s, ms); + + //the date constructor doesn't accept years < 1970 + if (y < 1970) { + date.setFullYear(y); + } + return date; + } + + function makeUTCDate(y) { + var date = new Date(Date.UTC.apply(null, arguments)); + if (y < 1970) { + date.setUTCFullYear(y); + } + return date; + } + + function parseWeekday(input, locale) { + if (typeof input === 'string') { + if (!isNaN(input)) { + input = parseInt(input, 10); + } + else { + input = locale.weekdaysParse(input); + if (typeof input !== 'number') { + return null; + } + } + } + return input; + } + + /************************************ + Relative Time + ************************************/ + + + // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize + function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { + return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); + } + + function relativeTime(posNegDuration, withoutSuffix, locale) { + var duration = moment.duration(posNegDuration).abs(), + seconds = round(duration.as('s')), + minutes = round(duration.as('m')), + hours = round(duration.as('h')), + days = round(duration.as('d')), + months = round(duration.as('M')), + years = round(duration.as('y')), + + args = seconds < relativeTimeThresholds.s && ['s', seconds] || + minutes === 1 && ['m'] || + minutes < relativeTimeThresholds.m && ['mm', minutes] || + hours === 1 && ['h'] || + hours < relativeTimeThresholds.h && ['hh', hours] || + days === 1 && ['d'] || + days < relativeTimeThresholds.d && ['dd', days] || + months === 1 && ['M'] || + months < relativeTimeThresholds.M && ['MM', months] || + years === 1 && ['y'] || ['yy', years]; + + args[2] = withoutSuffix; + args[3] = +posNegDuration > 0; + args[4] = locale; + return substituteTimeAgo.apply({}, args); + } + + + /************************************ + Week of Year + ************************************/ + + + // firstDayOfWeek 0 = sun, 6 = sat + // the day of the week that starts the week + // (usually sunday or monday) + // firstDayOfWeekOfYear 0 = sun, 6 = sat + // the first week is the week that contains the first + // of this day of the week + // (eg. ISO weeks use thursday (4)) + function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) { + var end = firstDayOfWeekOfYear - firstDayOfWeek, + daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(), + adjustedMoment; + + + if (daysToDayOfWeek > end) { + daysToDayOfWeek -= 7; + } + + if (daysToDayOfWeek < end - 7) { + daysToDayOfWeek += 7; + } + + adjustedMoment = moment(mom).add(daysToDayOfWeek, 'd'); + return { + week: Math.ceil(adjustedMoment.dayOfYear() / 7), + year: adjustedMoment.year() + }; + } + + //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday + function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) { + var d = makeUTCDate(year, 0, 1).getUTCDay(), daysToAdd, dayOfYear; + + d = d === 0 ? 7 : d; + weekday = weekday != null ? weekday : firstDayOfWeek; + daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0); + dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1; + + return { + year: dayOfYear > 0 ? year : year - 1, + dayOfYear: dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear + }; + } + + /************************************ + Top Level Functions + ************************************/ + + function makeMoment(config) { + var input = config._i, + format = config._f, + res; + + config._locale = config._locale || moment.localeData(config._l); + + if (input === null || (format === undefined && input === '')) { + return moment.invalid({nullInput: true}); + } + + if (typeof input === 'string') { + config._i = input = config._locale.preparse(input); + } + + if (moment.isMoment(input)) { + return new Moment(input, true); + } else if (format) { + if (isArray(format)) { + makeDateFromStringAndArray(config); + } else { + makeDateFromStringAndFormat(config); + } + } else { + makeDateFromInput(config); + } + + res = new Moment(config); + if (res._nextDay) { + // Adding is smart enough around DST + res.add(1, 'd'); + res._nextDay = undefined; + } + + return res; + } + + moment = function (input, format, locale, strict) { + var c; + + if (typeof(locale) === 'boolean') { + strict = locale; + locale = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c = {}; + c._isAMomentObject = true; + c._i = input; + c._f = format; + c._l = locale; + c._strict = strict; + c._isUTC = false; + c._pf = defaultParsingFlags(); + + return makeMoment(c); + }; + + moment.suppressDeprecationWarnings = false; + + moment.createFromInputFallback = deprecate( + 'moment construction falls back to js Date. This is ' + + 'discouraged and will be removed in upcoming major ' + + 'release. Please refer to ' + + 'https://github.com/moment/moment/issues/1407 for more info.', + function (config) { + config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); + } + ); + + // Pick a moment m from moments so that m[fn](other) is true for all + // other. This relies on the function fn to be transitive. + // + // moments should either be an array of moment objects or an array, whose + // first element is an array of moment objects. + function pickBy(fn, moments) { + var res, i; + if (moments.length === 1 && isArray(moments[0])) { + moments = moments[0]; + } + if (!moments.length) { + return moment(); + } + res = moments[0]; + for (i = 1; i < moments.length; ++i) { + if (moments[i][fn](res)) { + res = moments[i]; + } + } + return res; + } + + moment.min = function () { + var args = [].slice.call(arguments, 0); + + return pickBy('isBefore', args); + }; + + moment.max = function () { + var args = [].slice.call(arguments, 0); + + return pickBy('isAfter', args); + }; + + // creating with utc + moment.utc = function (input, format, locale, strict) { + var c; + + if (typeof(locale) === 'boolean') { + strict = locale; + locale = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c = {}; + c._isAMomentObject = true; + c._useUTC = true; + c._isUTC = true; + c._l = locale; + c._i = input; + c._f = format; + c._strict = strict; + c._pf = defaultParsingFlags(); + + return makeMoment(c).utc(); + }; + + // creating with unix timestamp (in seconds) + moment.unix = function (input) { + return moment(input * 1000); + }; + + // duration + moment.duration = function (input, key) { + var duration = input, + // matching against regexp is expensive, do it on demand + match = null, + sign, + ret, + parseIso, + diffRes; + + if (moment.isDuration(input)) { + duration = { + ms: input._milliseconds, + d: input._days, + M: input._months + }; + } else if (typeof input === 'number') { + duration = {}; + if (key) { + duration[key] = input; + } else { + duration.milliseconds = input; + } + } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + duration = { + y: 0, + d: toInt(match[DATE]) * sign, + h: toInt(match[HOUR]) * sign, + m: toInt(match[MINUTE]) * sign, + s: toInt(match[SECOND]) * sign, + ms: toInt(match[MILLISECOND]) * sign + }; + } else if (!!(match = isoDurationRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + parseIso = function (inp) { + // We'd normally use ~~inp for this, but unfortunately it also + // converts floats to ints. + // inp may be undefined, so careful calling replace on it. + var res = inp && parseFloat(inp.replace(',', '.')); + // apply sign while we're at it + return (isNaN(res) ? 0 : res) * sign; + }; + duration = { + y: parseIso(match[2]), + M: parseIso(match[3]), + d: parseIso(match[4]), + h: parseIso(match[5]), + m: parseIso(match[6]), + s: parseIso(match[7]), + w: parseIso(match[8]) + }; + } else if (duration == null) {// checks for null or undefined + duration = {}; + } else if (typeof duration === 'object' && + ('from' in duration || 'to' in duration)) { + diffRes = momentsDifference(moment(duration.from), moment(duration.to)); + + duration = {}; + duration.ms = diffRes.milliseconds; + duration.M = diffRes.months; + } + + ret = new Duration(duration); + + if (moment.isDuration(input) && hasOwnProp(input, '_locale')) { + ret._locale = input._locale; + } + + return ret; + }; + + // version number + moment.version = VERSION; + + // default format + moment.defaultFormat = isoFormat; + + // constant that refers to the ISO standard + moment.ISO_8601 = function () {}; + + // Plugins that add properties should also add the key here (null value), + // so we can properly clone ourselves. + moment.momentProperties = momentProperties; + + // This function will be called whenever a moment is mutated. + // It is intended to keep the offset in sync with the timezone. + moment.updateOffset = function () {}; + + // This function allows you to set a threshold for relative time strings + moment.relativeTimeThreshold = function (threshold, limit) { + if (relativeTimeThresholds[threshold] === undefined) { + return false; + } + if (limit === undefined) { + return relativeTimeThresholds[threshold]; + } + relativeTimeThresholds[threshold] = limit; + return true; + }; + + moment.lang = deprecate( + 'moment.lang is deprecated. Use moment.locale instead.', + function (key, value) { + return moment.locale(key, value); + } + ); + + // This function will load locale and then set the global locale. If + // no arguments are passed in, it will simply return the current global + // locale key. + moment.locale = function (key, values) { + var data; + if (key) { + if (typeof(values) !== 'undefined') { + data = moment.defineLocale(key, values); + } + else { + data = moment.localeData(key); + } + + if (data) { + moment.duration._locale = moment._locale = data; + } + } + + return moment._locale._abbr; + }; + + moment.defineLocale = function (name, values) { + if (values !== null) { + values.abbr = name; + if (!locales[name]) { + locales[name] = new Locale(); + } + locales[name].set(values); + + // backwards compat for now: also set the locale + moment.locale(name); + + return locales[name]; + } else { + // useful for testing + delete locales[name]; + return null; + } + }; + + moment.langData = deprecate( + 'moment.langData is deprecated. Use moment.localeData instead.', + function (key) { + return moment.localeData(key); + } + ); + + // returns locale data + moment.localeData = function (key) { + var locale; + + if (key && key._locale && key._locale._abbr) { + key = key._locale._abbr; + } + + if (!key) { + return moment._locale; + } + + if (!isArray(key)) { + //short-circuit everything else + locale = loadLocale(key); + if (locale) { + return locale; + } + key = [key]; + } + + return chooseLocale(key); + }; + + // compare moment object + moment.isMoment = function (obj) { + return obj instanceof Moment || + (obj != null && hasOwnProp(obj, '_isAMomentObject')); + }; + + // for typechecking Duration objects + moment.isDuration = function (obj) { + return obj instanceof Duration; + }; + + for (i = lists.length - 1; i >= 0; --i) { + makeList(lists[i]); + } + + moment.normalizeUnits = function (units) { + return normalizeUnits(units); + }; + + moment.invalid = function (flags) { + var m = moment.utc(NaN); + if (flags != null) { + extend(m._pf, flags); + } + else { + m._pf.userInvalidated = true; + } + + return m; + }; + + moment.parseZone = function () { + return moment.apply(null, arguments).parseZone(); + }; + + moment.parseTwoDigitYear = function (input) { + return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); + }; + + moment.isDate = isDate; + + /************************************ + Moment Prototype + ************************************/ + + + extend(moment.fn = Moment.prototype, { + + clone : function () { + return moment(this); + }, + + valueOf : function () { + return +this._d - ((this._offset || 0) * 60000); + }, + + unix : function () { + return Math.floor(+this / 1000); + }, + + toString : function () { + return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); + }, + + toDate : function () { + return this._offset ? new Date(+this) : this._d; + }, + + toISOString : function () { + var m = moment(this).utc(); + if (0 < m.year() && m.year() <= 9999) { + if ('function' === typeof Date.prototype.toISOString) { + // native implementation is ~50x faster, use it when we can + return this.toDate().toISOString(); + } else { + return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } + } else { + return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } + }, + + toArray : function () { + var m = this; + return [ + m.year(), + m.month(), + m.date(), + m.hours(), + m.minutes(), + m.seconds(), + m.milliseconds() + ]; + }, + + isValid : function () { + return isValid(this); + }, + + isDSTShifted : function () { + if (this._a) { + return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0; + } + + return false; + }, + + parsingFlags : function () { + return extend({}, this._pf); + }, + + invalidAt: function () { + return this._pf.overflow; + }, + + utc : function (keepLocalTime) { + return this.utcOffset(0, keepLocalTime); + }, + + local : function (keepLocalTime) { + if (this._isUTC) { + this.utcOffset(0, keepLocalTime); + this._isUTC = false; + + if (keepLocalTime) { + this.subtract(this._dateUtcOffset(), 'm'); + } + } + return this; + }, + + format : function (inputString) { + var output = formatMoment(this, inputString || moment.defaultFormat); + return this.localeData().postformat(output); + }, + + add : createAdder(1, 'add'), + + subtract : createAdder(-1, 'subtract'), + + diff : function (input, units, asFloat) { + var that = makeAs(input, this), + zoneDiff = (that.utcOffset() - this.utcOffset()) * 6e4, + anchor, diff, output, daysAdjust; + + units = normalizeUnits(units); + + if (units === 'year' || units === 'month' || units === 'quarter') { + output = monthDiff(this, that); + if (units === 'quarter') { + output = output / 3; + } else if (units === 'year') { + output = output / 12; + } + } else { + diff = this - that; + output = units === 'second' ? diff / 1e3 : // 1000 + units === 'minute' ? diff / 6e4 : // 1000 * 60 + units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60 + units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst + units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst + diff; + } + return asFloat ? output : absRound(output); + }, + + from : function (time, withoutSuffix) { + return moment.duration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); + }, + + fromNow : function (withoutSuffix) { + return this.from(moment(), withoutSuffix); + }, + + calendar : function (time) { + // We want to compare the start of today, vs this. + // Getting start-of-today depends on whether we're locat/utc/offset + // or not. + var now = time || moment(), + sod = makeAs(now, this).startOf('day'), + diff = this.diff(sod, 'days', true), + format = diff < -6 ? 'sameElse' : + diff < -1 ? 'lastWeek' : + diff < 0 ? 'lastDay' : + diff < 1 ? 'sameDay' : + diff < 2 ? 'nextDay' : + diff < 7 ? 'nextWeek' : 'sameElse'; + return this.format(this.localeData().calendar(format, this, moment(now))); + }, + + isLeapYear : function () { + return isLeapYear(this.year()); + }, + + isDST : function () { + return (this.utcOffset() > this.clone().month(0).utcOffset() || + this.utcOffset() > this.clone().month(5).utcOffset()); + }, + + day : function (input) { + var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); + if (input != null) { + input = parseWeekday(input, this.localeData()); + return this.add(input - day, 'd'); + } else { + return day; + } + }, + + month : makeAccessor('Month', true), + + startOf : function (units) { + units = normalizeUnits(units); + // the following switch intentionally omits break keywords + // to utilize falling through the cases. + switch (units) { + case 'year': + this.month(0); + /* falls through */ + case 'quarter': + case 'month': + this.date(1); + /* falls through */ + case 'week': + case 'isoWeek': + case 'day': + this.hours(0); + /* falls through */ + case 'hour': + this.minutes(0); + /* falls through */ + case 'minute': + this.seconds(0); + /* falls through */ + case 'second': + this.milliseconds(0); + /* falls through */ + } + + // weeks are a special case + if (units === 'week') { + this.weekday(0); + } else if (units === 'isoWeek') { + this.isoWeekday(1); + } + + // quarters are also special + if (units === 'quarter') { + this.month(Math.floor(this.month() / 3) * 3); + } + + return this; + }, + + endOf: function (units) { + units = normalizeUnits(units); + if (units === undefined || units === 'millisecond') { + return this; + } + return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); + }, + + isAfter: function (input, units) { + var inputMs; + units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); + if (units === 'millisecond') { + input = moment.isMoment(input) ? input : moment(input); + return +this > +input; + } else { + inputMs = moment.isMoment(input) ? +input : +moment(input); + return inputMs < +this.clone().startOf(units); + } + }, + + isBefore: function (input, units) { + var inputMs; + units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); + if (units === 'millisecond') { + input = moment.isMoment(input) ? input : moment(input); + return +this < +input; + } else { + inputMs = moment.isMoment(input) ? +input : +moment(input); + return +this.clone().endOf(units) < inputMs; + } + }, + + isBetween: function (from, to, units) { + return this.isAfter(from, units) && this.isBefore(to, units); + }, + + isSame: function (input, units) { + var inputMs; + units = normalizeUnits(units || 'millisecond'); + if (units === 'millisecond') { + input = moment.isMoment(input) ? input : moment(input); + return +this === +input; + } else { + inputMs = +moment(input); + return +(this.clone().startOf(units)) <= inputMs && inputMs <= +(this.clone().endOf(units)); + } + }, + + min: deprecate( + 'moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548', + function (other) { + other = moment.apply(null, arguments); + return other < this ? this : other; + } + ), + + max: deprecate( + 'moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548', + function (other) { + other = moment.apply(null, arguments); + return other > this ? this : other; + } + ), + + zone : deprecate( + 'moment().zone is deprecated, use moment().utcOffset instead. ' + + 'https://github.com/moment/moment/issues/1779', + function (input, keepLocalTime) { + if (input != null) { + if (typeof input !== 'string') { + input = -input; + } + + this.utcOffset(input, keepLocalTime); + + return this; + } else { + return -this.utcOffset(); + } + } + ), + + // keepLocalTime = true means only change the timezone, without + // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> + // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset + // +0200, so we adjust the time as needed, to be valid. + // + // Keeping the time actually adds/subtracts (one hour) + // from the actual represented time. That is why we call updateOffset + // a second time. In case it wants us to change the offset again + // _changeInProgress == true case, then we have to adjust, because + // there is no such time in the given timezone. + utcOffset : function (input, keepLocalTime) { + var offset = this._offset || 0, + localAdjust; + if (input != null) { + if (typeof input === 'string') { + input = utcOffsetFromString(input); + } + if (Math.abs(input) < 16) { + input = input * 60; + } + if (!this._isUTC && keepLocalTime) { + localAdjust = this._dateUtcOffset(); + } + this._offset = input; + this._isUTC = true; + if (localAdjust != null) { + this.add(localAdjust, 'm'); + } + if (offset !== input) { + if (!keepLocalTime || this._changeInProgress) { + addOrSubtractDurationFromMoment(this, + moment.duration(input - offset, 'm'), 1, false); + } else if (!this._changeInProgress) { + this._changeInProgress = true; + moment.updateOffset(this, true); + this._changeInProgress = null; + } + } + + return this; + } else { + return this._isUTC ? offset : this._dateUtcOffset(); + } + }, + + isLocal : function () { + return !this._isUTC; + }, + + isUtcOffset : function () { + return this._isUTC; + }, + + isUtc : function () { + return this._isUTC && this._offset === 0; + }, + + zoneAbbr : function () { + return this._isUTC ? 'UTC' : ''; + }, + + zoneName : function () { + return this._isUTC ? 'Coordinated Universal Time' : ''; + }, + + parseZone : function () { + if (this._tzm) { + this.utcOffset(this._tzm); + } else if (typeof this._i === 'string') { + this.utcOffset(utcOffsetFromString(this._i)); + } + return this; + }, + + hasAlignedHourOffset : function (input) { + if (!input) { + input = 0; + } + else { + input = moment(input).utcOffset(); + } + + return (this.utcOffset() - input) % 60 === 0; + }, + + daysInMonth : function () { + return daysInMonth(this.year(), this.month()); + }, + + dayOfYear : function (input) { + var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1; + return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); + }, + + quarter : function (input) { + return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); + }, + + weekYear : function (input) { + var year = weekOfYear(this, this.localeData()._week.dow, this.localeData()._week.doy).year; + return input == null ? year : this.add((input - year), 'y'); + }, + + isoWeekYear : function (input) { + var year = weekOfYear(this, 1, 4).year; + return input == null ? year : this.add((input - year), 'y'); + }, + + week : function (input) { + var week = this.localeData().week(this); + return input == null ? week : this.add((input - week) * 7, 'd'); + }, + + isoWeek : function (input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add((input - week) * 7, 'd'); + }, + + weekday : function (input) { + var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; + return input == null ? weekday : this.add(input - weekday, 'd'); + }, + + isoWeekday : function (input) { + // behaves the same as moment#day except + // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) + // as a setter, sunday should belong to the previous week. + return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7); + }, + + isoWeeksInYear : function () { + return weeksInYear(this.year(), 1, 4); + }, + + weeksInYear : function () { + var weekInfo = this.localeData()._week; + return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); + }, + + get : function (units) { + units = normalizeUnits(units); + return this[units](); + }, + + set : function (units, value) { + var unit; + if (typeof units === 'object') { + for (unit in units) { + this.set(unit, units[unit]); + } + } + else { + units = normalizeUnits(units); + if (typeof this[units] === 'function') { + this[units](value); + } + } + return this; + }, + + // If passed a locale key, it will set the locale for this + // instance. Otherwise, it will return the locale configuration + // variables for this instance. + locale : function (key) { + var newLocaleData; + + if (key === undefined) { + return this._locale._abbr; + } else { + newLocaleData = moment.localeData(key); + if (newLocaleData != null) { + this._locale = newLocaleData; + } + return this; + } + }, + + lang : deprecate( + 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', + function (key) { + if (key === undefined) { + return this.localeData(); + } else { + return this.locale(key); + } + } + ), + + localeData : function () { + return this._locale; + }, + + _dateUtcOffset : function () { + // On Firefox.24 Date#getTimezoneOffset returns a floating point. + // https://github.com/moment/moment/pull/1871 + return -Math.round(this._d.getTimezoneOffset() / 15) * 15; + } + + }); + + function rawMonthSetter(mom, value) { + var dayOfMonth; + + // TODO: Move this out of here! + if (typeof value === 'string') { + value = mom.localeData().monthsParse(value); + // TODO: Another silent failure? + if (typeof value !== 'number') { + return mom; + } + } + + dayOfMonth = Math.min(mom.date(), + daysInMonth(mom.year(), value)); + mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); + return mom; + } + + function rawGetter(mom, unit) { + return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit](); + } + + function rawSetter(mom, unit, value) { + if (unit === 'Month') { + return rawMonthSetter(mom, value); + } else { + return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); + } + } + + function makeAccessor(unit, keepTime) { + return function (value) { + if (value != null) { + rawSetter(this, unit, value); + moment.updateOffset(this, keepTime); + return this; + } else { + return rawGetter(this, unit); + } + }; + } + + moment.fn.millisecond = moment.fn.milliseconds = makeAccessor('Milliseconds', false); + moment.fn.second = moment.fn.seconds = makeAccessor('Seconds', false); + moment.fn.minute = moment.fn.minutes = makeAccessor('Minutes', false); + // Setting the hour should keep the time, because the user explicitly + // specified which hour he wants. So trying to maintain the same hour (in + // a new timezone) makes sense. Adding/subtracting hours does not follow + // this rule. + moment.fn.hour = moment.fn.hours = makeAccessor('Hours', true); + // moment.fn.month is defined separately + moment.fn.date = makeAccessor('Date', true); + moment.fn.dates = deprecate('dates accessor is deprecated. Use date instead.', makeAccessor('Date', true)); + moment.fn.year = makeAccessor('FullYear', true); + moment.fn.years = deprecate('years accessor is deprecated. Use year instead.', makeAccessor('FullYear', true)); + + // add plural methods + moment.fn.days = moment.fn.day; + moment.fn.months = moment.fn.month; + moment.fn.weeks = moment.fn.week; + moment.fn.isoWeeks = moment.fn.isoWeek; + moment.fn.quarters = moment.fn.quarter; + + // add aliased format methods + moment.fn.toJSON = moment.fn.toISOString; + + // alias isUtc for dev-friendliness + moment.fn.isUTC = moment.fn.isUtc; + + /************************************ + Duration Prototype + ************************************/ + + + function daysToYears (days) { + // 400 years have 146097 days (taking into account leap year rules) + return days * 400 / 146097; + } + + function yearsToDays (years) { + // years * 365 + absRound(years / 4) - + // absRound(years / 100) + absRound(years / 400); + return years * 146097 / 400; + } + + extend(moment.duration.fn = Duration.prototype, { + + _bubble : function () { + var milliseconds = this._milliseconds, + days = this._days, + months = this._months, + data = this._data, + seconds, minutes, hours, years = 0; + + // The following code bubbles up values, see the tests for + // examples of what that means. + data.milliseconds = milliseconds % 1000; + + seconds = absRound(milliseconds / 1000); + data.seconds = seconds % 60; + + minutes = absRound(seconds / 60); + data.minutes = minutes % 60; + + hours = absRound(minutes / 60); + data.hours = hours % 24; + + days += absRound(hours / 24); + + // Accurately convert days to years, assume start from year 0. + years = absRound(daysToYears(days)); + days -= absRound(yearsToDays(years)); + + // 30 days to a month + // TODO (iskren): Use anchor date (like 1st Jan) to compute this. + months += absRound(days / 30); + days %= 30; + + // 12 months -> 1 year + years += absRound(months / 12); + months %= 12; + + data.days = days; + data.months = months; + data.years = years; + }, + + abs : function () { + this._milliseconds = Math.abs(this._milliseconds); + this._days = Math.abs(this._days); + this._months = Math.abs(this._months); + + this._data.milliseconds = Math.abs(this._data.milliseconds); + this._data.seconds = Math.abs(this._data.seconds); + this._data.minutes = Math.abs(this._data.minutes); + this._data.hours = Math.abs(this._data.hours); + this._data.months = Math.abs(this._data.months); + this._data.years = Math.abs(this._data.years); + + return this; + }, + + weeks : function () { + return absRound(this.days() / 7); + }, + + valueOf : function () { + return this._milliseconds + + this._days * 864e5 + + (this._months % 12) * 2592e6 + + toInt(this._months / 12) * 31536e6; + }, + + humanize : function (withSuffix) { + var output = relativeTime(this, !withSuffix, this.localeData()); + + if (withSuffix) { + output = this.localeData().pastFuture(+this, output); + } + + return this.localeData().postformat(output); + }, + + add : function (input, val) { + // supports only 2.0-style add(1, 's') or add(moment) + var dur = moment.duration(input, val); + + this._milliseconds += dur._milliseconds; + this._days += dur._days; + this._months += dur._months; + + this._bubble(); + + return this; + }, + + subtract : function (input, val) { + var dur = moment.duration(input, val); + + this._milliseconds -= dur._milliseconds; + this._days -= dur._days; + this._months -= dur._months; + + this._bubble(); + + return this; + }, + + get : function (units) { + units = normalizeUnits(units); + return this[units.toLowerCase() + 's'](); + }, + + as : function (units) { + var days, months; + units = normalizeUnits(units); + + if (units === 'month' || units === 'year') { + days = this._days + this._milliseconds / 864e5; + months = this._months + daysToYears(days) * 12; + return units === 'month' ? months : months / 12; + } else { + // handle milliseconds separately because of floating point math errors (issue #1867) + days = this._days + Math.round(yearsToDays(this._months / 12)); + switch (units) { + case 'week': return days / 7 + this._milliseconds / 6048e5; + case 'day': return days + this._milliseconds / 864e5; + case 'hour': return days * 24 + this._milliseconds / 36e5; + case 'minute': return days * 24 * 60 + this._milliseconds / 6e4; + case 'second': return days * 24 * 60 * 60 + this._milliseconds / 1000; + // Math.floor prevents floating point math errors here + case 'millisecond': return Math.floor(days * 24 * 60 * 60 * 1000) + this._milliseconds; + default: throw new Error('Unknown unit ' + units); + } + } + }, + + lang : moment.fn.lang, + locale : moment.fn.locale, + + toIsoString : deprecate( + 'toIsoString() is deprecated. Please use toISOString() instead ' + + '(notice the capitals)', + function () { + return this.toISOString(); + } + ), + + toISOString : function () { + // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js + var years = Math.abs(this.years()), + months = Math.abs(this.months()), + days = Math.abs(this.days()), + hours = Math.abs(this.hours()), + minutes = Math.abs(this.minutes()), + seconds = Math.abs(this.seconds() + this.milliseconds() / 1000); + + if (!this.asSeconds()) { + // this is the same as C#'s (Noda) and python (isodate)... + // but not other JS (goog.date) + return 'P0D'; + } + + return (this.asSeconds() < 0 ? '-' : '') + + 'P' + + (years ? years + 'Y' : '') + + (months ? months + 'M' : '') + + (days ? days + 'D' : '') + + ((hours || minutes || seconds) ? 'T' : '') + + (hours ? hours + 'H' : '') + + (minutes ? minutes + 'M' : '') + + (seconds ? seconds + 'S' : ''); + }, + + localeData : function () { + return this._locale; + }, + + toJSON : function () { + return this.toISOString(); + } + }); + + moment.duration.fn.toString = moment.duration.fn.toISOString; + + function makeDurationGetter(name) { + moment.duration.fn[name] = function () { + return this._data[name]; + }; + } + + for (i in unitMillisecondFactors) { + if (hasOwnProp(unitMillisecondFactors, i)) { + makeDurationGetter(i.toLowerCase()); + } + } + + moment.duration.fn.asMilliseconds = function () { + return this.as('ms'); + }; + moment.duration.fn.asSeconds = function () { + return this.as('s'); + }; + moment.duration.fn.asMinutes = function () { + return this.as('m'); + }; + moment.duration.fn.asHours = function () { + return this.as('h'); + }; + moment.duration.fn.asDays = function () { + return this.as('d'); + }; + moment.duration.fn.asWeeks = function () { + return this.as('weeks'); + }; + moment.duration.fn.asMonths = function () { + return this.as('M'); + }; + moment.duration.fn.asYears = function () { + return this.as('y'); + }; + + /************************************ + Default Locale + ************************************/ + + + // Set default locale, other locale will inherit from English. + moment.locale('en', { + ordinalParse: /\d{1,2}(th|st|nd|rd)/, + ordinal : function (number) { + var b = number % 10, + output = (toInt(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); + + /* EMBED_LOCALES */ + + /************************************ + Exposing Moment + ************************************/ + + function makeGlobal(shouldDeprecate) { + /*global ender:false */ + if (typeof ender !== 'undefined') { + return; + } + oldGlobalMoment = globalScope.moment; + if (shouldDeprecate) { + globalScope.moment = deprecate( + 'Accessing Moment through the global scope is ' + + 'deprecated, and will be removed in an upcoming ' + + 'release.', + moment); + } else { + globalScope.moment = moment; + } + } + + // CommonJS module is defined + if (hasModule) { + module.exports = moment; + } else if (typeof define === 'function' && define.amd) { + define(function (require, exports, module) { + if (module.config && module.config() && module.config().noGlobal === true) { + // release the global variable + globalScope.moment = oldGlobalMoment; + } + + return moment; + }); + makeGlobal(true); + } else { + makeGlobal(); + } +}).call(this); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/package.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/package.js new file mode 100644 index 0000000..aba8d50 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/package.js @@ -0,0 +1,11 @@ +var profile = { + resourceTags: { + ignore: function(filename, mid){ + // only include moment/moment + return mid != "moment/moment"; + }, + amd: function(filename, mid){ + return /\.js$/.test(filename); + } + } +}; diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/package.json b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/package.json new file mode 100644 index 0000000..8b47326 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/node_modules/moment/package.json @@ -0,0 +1,121 @@ +{ + "name": "moment", + "version": "2.9.0", + "description": "Parse, validate, manipulate, and display dates", + "homepage": "http://momentjs.com", + "author": { + "name": "Iskren Ivov Chernev", + "email": "iskren.chernev@gmail.com", + "url": "https://github.com/ichernev" + }, + "contributors": [ + { + "name": "Tim Wood", + "email": "washwithcare@gmail.com", + "url": "http://timwoodcreates.com/" + }, + { + "name": "Rocky Meza", + "url": "http://rockymeza.com" + }, + { + "name": "Matt Johnson", + "email": "mj1856@hotmail.com", + "url": "http://codeofmatt.com" + }, + { + "name": "Isaac Cambron", + "email": "isaac@isaaccambron.com", + "url": "http://isaaccambron.com" + }, + { + "name": "Andre Polykanine", + "email": "andre@oire.org", + "url": "https://github.com/oire" + } + ], + "keywords": [ + "moment", + "date", + "time", + "parse", + "format", + "validate", + "i18n", + "l10n", + "ender" + ], + "main": "./moment.js", + "engines": { + "node": "*" + }, + "repository": { + "type": "git", + "url": "https://github.com/moment/moment.git" + }, + "bugs": { + "url": "https://github.com/moment/moment/issues" + }, + "licenses": [ + { + "type": "MIT" + } + ], + "devDependencies": { + "uglify-js": "latest", + "grunt": "latest", + "nodeunit": "latest", + "benchmark": "latest", + "grunt-contrib-clean": "latest", + "grunt-contrib-jshint": "latest", + "grunt-contrib-nodeunit": "latest", + "grunt-contrib-concat": "latest", + "grunt-contrib-uglify": "latest", + "grunt-contrib-watch": "latest", + "grunt-env": "latest", + "grunt-jscs": "latest", + "grunt-karma": "latest", + "grunt-nuget": "latest", + "grunt-benchmark": "latest", + "grunt-string-replace": "latest", + "grunt-exec": "latest", + "load-grunt-tasks": "latest", + "karma": "latest", + "karma-chrome-launcher": "latest", + "karma-firefox-launcher": "latest", + "karma-nodeunit": "latest", + "karma-sauce-launcher": "latest", + "spacejam": "latest" + }, + "scripts": { + "test": "grunt test:node" + }, + "ender": "./ender.js", + "dojoBuild": "package.js", + "jspm": { + "files": [ + "moment.js", + "locale" + ], + "map": { + "moment": "./moment" + }, + "buildConfig": { + "uglify": true + } + }, + "spm": { + "main": "moment.js", + "output": [ + "locale/*.js" + ] + }, + "readme": "[![NPM version][npm-version-image]][npm-url] [![NPM downloads][npm-downloads-image]][npm-url] [![MIT License][license-image]][license-url] [![Build Status][travis-image]][travis-url]\n\nA lightweight JavaScript date library for parsing, validating, manipulating, and formatting dates.\n\n## [Documentation](http://momentjs.com/docs/)\n\n## Upgrading to 2.0.0\n\nThere are a number of small backwards incompatible changes with version 2.0.0. [See the full descriptions here](https://gist.github.com/timrwood/e72f2eef320ed9e37c51#backwards-incompatible-changes)\n\n * Changed language ordinal method to return the number + ordinal instead of just the ordinal.\n\n * Changed two digit year parsing cutoff to match strptime.\n\n * Removed `moment#sod` and `moment#eod` in favor of `moment#startOf` and `moment#endOf`.\n\n * Removed `moment.humanizeDuration()` in favor of `moment.duration().humanize()`.\n\n * Removed the lang data objects from the top level namespace.\n\n * Duplicate `Date` passed to `moment()` instead of referencing it.\n\n## [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md)\n\n## [Contributing](https://github.com/moment/moment/blob/develop/CONTRIBUTING.md)\n\n## License\n\nMoment.js is freely distributable under the terms of the [MIT license](https://github.com/moment/moment/blob/develop/LICENSE).\n\n[license-image]: http://img.shields.io/badge/license-MIT-blue.svg?style=flat\n[license-url]: LICENSE\n\n[npm-url]: https://npmjs.org/package/moment\n[npm-version-image]: http://img.shields.io/npm/v/moment.svg?style=flat\n[npm-downloads-image]: http://img.shields.io/npm/dm/moment.svg?style=flat\n\n[travis-url]: http://travis-ci.org/moment/moment\n[travis-image]: http://img.shields.io/travis/moment/moment/develop.svg?style=flat\n", + "readmeFilename": "README.md", + "_id": "moment@2.9.0", + "dist": { + "shasum": "77ec1175fa294f42627f10c8e6de6302c036f6d5" + }, + "_from": "moment@2.x.x", + "_resolved": "https://registry.npmjs.org/moment/-/moment-2.9.0.tgz" +} diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/package.json b/node_modules/hapi/node_modules/h2o2/node_modules/joi/package.json new file mode 100644 index 0000000..1bbd4b4 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/package.json @@ -0,0 +1,44 @@ +{ + "name": "joi", + "description": "Object schema validation", + "version": "5.1.0", + "repository": { + "type": "git", + "url": "git://github.com/hapijs/joi" + }, + "main": "index", + "keywords": [ + "schema", + "validation" + ], + "engines": { + "node": ">=0.10.30" + }, + "dependencies": { + "hoek": "^2.2.x", + "topo": "1.x.x", + "isemail": "1.x.x", + "moment": "2.x.x" + }, + "devDependencies": { + "code": "1.x.x", + "lab": "5.x.x" + }, + "scripts": { + "test": "lab -t 100 -a code", + "test-cov-html": "lab -r html -o coverage.html -a code" + }, + "licenses": [ + { + "type": "BSD", + "url": "http://github.com/hapijs/joi/raw/master/LICENSE" + } + ], + "readme": "![joi Logo](https://raw.github.com/hapijs/joi/master/images/joi.png)\n\nObject schema description language and validator for JavaScript objects.\n\n[![npm version](https://badge.fury.io/js/joi.svg)](http://badge.fury.io/js/joi)\n[![Build Status](https://secure.travis-ci.org/hapijs/joi.svg)](http://travis-ci.org/hapijs/joi)\n[![Dependencies Status](https://david-dm.org/hapijs/joi.svg)](https://david-dm.org/hapijs/joi)\n[![DevDependencies Status](https://david-dm.org/hapijs/joi/dev-status.svg)](https://david-dm.org/hapijs/joi#info=devDependencies)\n\nLead Maintainer: [Nicolas Morel](https://github.com/marsup)\n\n## Table of Contents\n\n\n- [Example](#example)\n- [Usage](#usage)\n - [`validate(value, schema, [options], [callback])`](#validatevalue-schema-options-callback)\n - [`compile(schema)`](#compileschema)\n - [`assert(value, schema, [message])`](#assertvalue-schema-message)\n - [`any`](#any)\n - [`any.allow(value)`](#anyallowvalue)\n - [`any.valid(value)`](#anyvalidvalue)\n - [`any.invalid(value)`](#anyinvalidvalue)\n - [`any.required()`](#anyrequired)\n - [`any.optional()`](#anyoptional)\n - [`any.forbidden()`](#anyforbidden)\n - [`any.description(desc)`](#anydescriptiondesc)\n - [`any.notes(notes)`](#anynotesnotes)\n - [`any.tags(tags)`](#anytagstags)\n - [`any.meta(meta)`](#anymetameta)\n - [`any.example(value)`](#anyexamplevalue)\n - [`any.unit(name)`](#anyunitname)\n - [`any.options(options)`](#anyoptionsoptions)\n - [`any.strict()`](#anystrict)\n - [`any.default(value)`](#anydefaultvalue)\n - [`any.concat(schema)`](#anyconcatschema)\n - [`any.when(ref, options)`](#anywhenref-options)\n - [`any.label(name)`](#anylabelname)\n - [`any.raw(isRaw)`](#anyrawisraw)\n - [`array`](#array)\n - [`array.sparse(enabled)`](#arraysparseenabled)\n - [`array.includes(type)`](#arrayincludestype)\n - [`array.excludes(type)`](#arrayexcludestype)\n - [`array.min(limit)`](#arrayminlimit)\n - [`array.max(limit)`](#arraymaxlimit)\n - [`array.length(limit)`](#arraylengthlimit)\n - [`array.unique()`](#arrayunique)\n - [`binary`](#binary)\n - [`binary.encoding(encoding)`](#binaryencodingencoding)\n - [`binary.min(limit)`](#binaryminlimit)\n - [`binary.max(limit)`](#binarymaxlimit)\n - [`binary.length(limit)`](#binarylengthlimit)\n - [`boolean()`](#boolean)\n - [`date`](#date)\n - [`date.min(date)`](#datemindate)\n - [`date.max(date)`](#datemaxdate)\n - [`date.format(format)`](#dateformatformat)\n - [`date.iso()`](#dateiso)\n - [`func`](#func)\n - [`number`](#number)\n - [`number.min(limit)`](#numberminlimit)\n - [`number.max(limit)`](#numbermaxlimit)\n - [`number.greater(limit)`](#numbergreaterlimit)\n - [`number.less(limit)`](#numberlesslimit)\n - [`number.integer()`](#numberinteger)\n - [`number.precision(limit)`](#numberprecisionlimit)\n - [`object`](#object)\n - [`object.keys([schema])`](#objectkeysschema)\n - [`object.min(limit)`](#objectminlimit)\n - [`object.max(limit)`](#objectmaxlimit)\n - [`object.length(limit)`](#objectlengthlimit)\n - [`object.pattern(regex, schema)`](#objectpatternregex-schema)\n - [`object.and(peers)`](#objectandpeers)\n - [`object.nand(peers)`](#objectnandpeers)\n - [`object.or(peers)`](#objectorpeers)\n - [`object.xor(peers)`](#objectxorpeers)\n - [`object.with(key, peers)`](#objectwithkey-peers)\n - [`object.without(key, peers)`](#objectwithoutkey-peers)\n - [`object.rename(from, to, [options])`](#objectrenamefrom-to-options)\n - [`object.assert(ref, schema, [message])`](#objectassertref-schema-message)\n - [`object.unknown([allow])`](#objectunknownallow)\n - [`object.type(constructor, [name])`](#objecttypeconstructorname)\n - [`object.requiredKeys(children)`](#objectrequiredkeyschildren)\n - [`object.optionalKeys(children)`](#objectoptionalkeyschildren)\n - [`string`](#string)\n - [`string.insensitive()`](#stringinsensitive)\n - [`string.min(limit, [encoding])`](#stringminlimit-encoding)\n - [`string.max(limit, [encoding])`](#stringmaxlimit-encoding)\n - [`string.creditCard()`](#stringcreditCard)\n - [`string.length(limit, [encoding])`](#stringlengthlimit-encoding)\n - [`string.regex(pattern, [name])`](#stringregexpattern-name)\n - [`string.alphanum()`](#stringalphanum)\n - [`string.token()`](#stringtoken)\n - [`string.email()`](#stringemail)\n - [`string.guid()`](#stringguid)\n - [`string.hostname()`](#stringhostname)\n - [`string.lowercase()`](#stringlowercase)\n - [`string.uppercase()`](#stringuppercase)\n - [`string.trim()`](#stringtrim)\n - [`alternatives`](#alternatives)\n - [`alternatives.try(schemas)`](#alternativestryschemas)\n - [`alternatives.when(ref, options)`](#alternativeswhenref-options)\n - [`ref(key, [options])`](#refkey-options)\n\n# Example\n\n```javascript\nvar Joi = require('joi');\n\nvar schema = Joi.object().keys({\n username: Joi.string().alphanum().min(3).max(30).required(),\n password: Joi.string().regex(/[a-zA-Z0-9]{3,30}/),\n access_token: [Joi.string(), Joi.number()],\n birthyear: Joi.number().integer().min(1900).max(2013),\n email: Joi.string().email()\n}).with('username', 'birthyear').without('password', 'access_token');\n\nJoi.validate({ username: 'abc', birthyear: 1994 }, schema, function (err, value) { }); // err === null -> valid\n```\n\nThe above schema defines the following constraints:\n* `username`\n * a required string\n * must contain only alphanumeric characters\n * at least 3 characters long but no more than 30\n * must be accompanied by `birthyear`\n* `password`\n * an optional string\n * must satisfy the custom regex\n * cannot appear together with `access_token`\n* `access_token`\n * an optional, unconstrained string or number\n* `birthyear`\n * an integer between 1900 and 2013\n* `email`\n * a valid email address string\n\n# Usage\n\nUsage is a two steps process. First, a schema is constructed using the provided types and constraints:\n\n```javascript\nvar schema = {\n a: Joi.string()\n};\n```\n\nNote that **joi** schema objects are immutable which means every additional rule added (e.g. `.min(5)`) will return a\nnew schema object.\n\nThen the value is validated against the schema:\n\n```javascript\nJoi.validate({ a: 'a string' }, schema, function (err, value) { });\n```\n\nIf the value is valid, `null` is returned, otherwise an `Error` object.\n\nThe schema can be a plain JavaScript object where every key is assigned a **joi** type, or it can be a **joi** type directly:\n\n```javascript\nvar schema = Joi.string().min(10);\n```\n\nIf the schema is a **joi** type, the `schema.validate(value, callback)` can be called directly on the type. When passing a non-type schema object,\nthe module converts it internally to an object() type equivalent to:\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.string()\n});\n```\n\nWhen validating a schema:\n* Keys are optional by default.\n* Strings are utf-8 encoded by default.\n* Rules are defined in an additive fashion and evaluated in order after whitelist and blacklist checks.\n\n### `validate(value, schema, [options], [callback])`\n\nValidates a value using the given schema and options where:\n- `value` - the value being validated.\n- `schema` - the validation schema. Can be a **joi** type object or a plain object where every key is assigned a **joi** type object.\n- `options` - an optional object with the following optional keys:\n - `abortEarly` - when `true`, stops validation on the first error, otherwise returns all the errors found. Defaults to `true`.\n - `convert` - when `true`, attempts to cast values to the required types (e.g. a string to a number). Defaults to `true`.\n - `allowUnknown` - when `true`, allows object to contain unknown keys which are ignored. Defaults to `false`.\n - `skipFunctions` - when `true`, ignores unknown keys with a function value. Defaults to `false`.\n - `stripUnknown` - when `true`, unknown keys are deleted (only when value is an object). Defaults to `false`.\n - `language` - overrides individual error messages, when `'label'` is set, it overrides the key name in the error message. Defaults to no override (`{}`).\n - `presence` - sets the default presence requirements. Supported modes: `'optional'`, `'required'`, and `'forbidden'`.\n Defaults to `'optional'`.\n - `context` - provides an external data set to be used in [references](#refkey-options). Can only be set as an external option to\n `validate()` and not using `any.options()`.\n- `callback` - the optional synchronous callback method using the signature `function(err, value)` where:\n - `err` - if validation failed, the error reason, otherwise `null`.\n - `value` - the validated value with any type conversions and other modifiers applied (the input is left unchanged). `value` can be\n incomplete if validation failed and `abortEarly` is `true`. If callback is not provided, then returns an object with error\n and value properties.\n\n```javascript\nvar schema = {\n a: Joi.number()\n};\n\nvar value = {\n a: '123'\n};\n\nJoi.validate(value, schema, function (err, value) { });\n// err -> null\n// value.a -> 123 (number, not string)\n\n// or\nvar result = Joi.validate(value, schema);\n// result.error -> null\n// result.value -> { \"a\" : 123 }\n```\n\n### `compile(schema)`\n\nConverts literal schema definition to **joi** schema object (or returns the same back if already a **joi** schema object) where:\n- `schema` - the schema definition to compile.\n\n```javascript\nvar definition = ['key', 5, { a: true, b: [/^a/, 'boom'] }];\nvar schema = Joi.compile(definition);\n\n// Same as:\n\nvar schema = Joi.alternatives().try([\n Joi.string().valid('key'),\n Joi.number().valid(5),\n Joi.object().keys({\n a: Joi.boolean().valid(true),\n b: Joi.alternatives().try([\n Joi.string().regex(/^a/),\n Joi.string().valid('boom')\n ])\n })\n]);\n```\n\n### `assert(value, schema, [message])`\n\nValidates a value against a schema and throws if validation fails where:\n- `value` - the value to validate.\n- `schema` - the schema object.\n- `message` - optional message sting prefix added in front of the error message.\n\n```javascript\nJoi.assert('x', Joi.number());\n```\n\n### `any`\n\nGenerates a schema object that matches any data type.\n\n```javascript\nvar any = Joi.any();\nany.validate('a', function (err, value) { });\n```\n\n#### `any.allow(value)`\n\nWhitelists a value where:\n- `value` - the allowed value which can be of any type and will be matched against the validated value before applying any other rules.\n `value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options).\n\n```javascript\nvar schema = {\n a: Joi.any().allow('a'),\n b: Joi.any().allow('b', 'B'),\n c: Joi.any().allow(['c', 'C'])\n};\n```\n\n#### `any.valid(value)`\n\nAdds the provided values into the allowed whitelist and marks them as the only valid values allowed where:\n- `value` - the allowed value which can be of any type and will be matched against the validated value before applying any other rules.\n `value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options).\n\n```javascript\nvar schema = {\n a: Joi.any().valid('a'),\n b: Joi.any().valid('b', 'B'),\n c: Joi.any().valid(['c', 'C'])\n};\n```\n\n#### `any.invalid(value)`\n\nBlacklists a value where:\n- `value` - the forbidden value which can be of any type and will be matched against the validated value before applying any other rules.\n `value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options).\n\n```javascript\nvar schema = {\n a: Joi.any().invalid('a'),\n b: Joi.any().invalid('b', 'B'),\n c: Joi.any().invalid(['c', 'C'])\n};\n```\n\n#### `any.required()`\n\nMarks a key as required which will not allow `undefined` as value. All keys are optional by default.\n\n```javascript\nvar schema = Joi.any().required();\n```\n\n#### `any.optional()`\n\nMarks a key as optional which will allow `undefined` as values. Used to annotate the schema for readability as all keys are optional by default.\n\n```javascript\nvar schema = Joi.any().optional();\n```\n\n#### `any.forbidden()`\n\nMarks a key as forbidden which will not allow any value except `undefined`. Used to explicitly forbid keys.\n\n```javascript\nvar schema = {\n a: Joi.any().forbidden()\n};\n```\n\n#### `any.description(desc)`\n\nAnnotates the key where:\n- `desc` - the description string.\n\n```javascript\nvar schema = Joi.any().description('this key will match anything you give it');\n```\n\n#### `any.notes(notes)`\n\nAnnotates the key where:\n- `notes` - the notes string or array of strings.\n\n```javascript\nvar schema = Joi.any().notes(['this is special', 'this is important']);\n```\n\n#### `any.tags(tags)`\n\nAnnotates the key where:\n- `tags` - the tag string or array of strings.\n\n```javascript\nvar schema = Joi.any().tags(['api', 'user']);\n```\n\n#### `any.meta(meta)`\n\nAttaches metadata to the key where:\n- `meta` - the meta object to attach.\n\n```javascript\nvar schema = Joi.any().meta({ index: true });\n```\n\n#### `any.example(value)`\n\nAnnotates the key where:\n- `value` - an example value.\n\nIf the example fails to pass validation, the function will throw.\n\n```javascript\nvar schema = Joi.string().min(4).example('abcd');\n```\n\n#### `any.unit(name)`\n\nAnnotates the key where:\n- `name` - the unit name of the value.\n\n```javascript\nvar schema = Joi.number().unit('milliseconds');\n```\n\n#### `any.options(options)`\n\nOverrides the global `validate()` options for the current key and any sub-key where:\n- `options` - an object with the same optional keys as [`Joi.validate(value, schema, options, callback)`](#joivalidatevalue-schema-options-callback).\n\n```javascript\nvar schema = Joi.any().options({ convert: false });\n```\n\n#### `any.strict()`\n\nSets the `options.convert` options to `false` which prevent type casting for the current key and any child keys.\n\n```javascript\nvar schema = Joi.any().strict();\n```\n\n#### `any.default(value)`\n\nSets a default value if the original value is undefined where:\n- `value` - the value. `value` supports [references](#refkey-options).\n\nNote that if `value` is an object, any changes to the object after `default()` is called will change the reference\nand any future assignment.\n\n```javascript\nvar schema = {\n username: Joi.string().default('new_user')\n};\nJoi.validate({}, schema, function (err, value) { });\n// value === { username: \"new_user\" }\n```\n\n#### `any.concat(schema)`\n\nReturns a new type that is the result of adding the rules of one type to another where:\n- `schema` - a **joi** type to merge into the current schema. Can only be of the same type as the context type or `any`.\n\n```javascript\nvar a = Joi.string().valid('a');\nvar b = Joi.string().valid('b');\nvar ab = a.concat(b);\n```\n\n#### `any.when(ref, options)`\n\nConverts the type into an [`alternatives`](#alternatives) type where the conditions are merged into the type definition where:\n- `ref` - the key name or [reference](#refkey-options).\n- `options` - an object with:\n - `is` - the required condition **joi** type.\n - `then` - the alternative schema type if the condition is true. Required if `otherwise` is missing.\n - `otherwise` - the alternative schema type if the condition is false. Required if `then` is missing.\n\n```javascript\nvar schema = {\n a: Joi.any().valid('x').when('b', { is: 5, then: Joi.valid('y'), otherwise: Joi.valid('z') }),\n b: Joi.any()\n};\n```\n\nAlternatively, if you want to specify a specific type such as `string`, `array`, etc, you can do so like this:\n\n```javascript\nvar schema = {\n a: Joi.valid('a', 'b', 'other'),\n other: Joi.string()\n .when('a', { is: 'other', then: Joi.required() }),\n};\n```\n\n#### `any.label(name)`\n\nOverrides the key name in error messages.\n- `name` - the name of the key.\n\n```javascript\nvar schema = {\n first_name: Joi.string().label('First Name')\n};\n```\n\n#### `any.raw(isRaw)`\n\nOutputs the original untouched value instead of the casted value.\n- `isRaw` - whether to enable raw mode or not. Defaults to true.\n\n```javascript\nvar schema = {\n timestamp: Joi.date().format('YYYYMMDD').raw()\n};\n```\n\n### `array`\n\nGenerates a schema object that matches an array data type. Note that undefined values inside arrays are not allowed by default but can be by using `sparse()`.\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar array = Joi.array().includes(Joi.string().valid('a', 'b'));\narray.validate(['a', 'b', 'a'], function (err, value) { });\n```\n\n#### `array.sparse(enabled)`\n\nAllow this array to be sparse. `enabled` can be used with a falsy value to go back to the default behavior.\n\n```javascript\nvar schema = Joi.array().sparse(); // undefined values are now allowed\nschema = schema.sparse(false); // undefined values are now denied\n```\n\n#### `array.single(enabled)`\n\nAllow single values to be checked against rules as if it were provided as an array.\n\n`enabled` can be used with a falsy value to go back to the default behavior.\n\n```javascript\nvar schema = Joi.array().includes(Joi.number()).single();\nschema.validate([4]); // returns `{ error: null, value: [ 4 ] }`\nschema.validate(4); // returns `{ error: null, value: [ 4 ] }`\n```\n\n#### `array.includes(type)`\n\nList the types allowed for the array values where:\n- `type` - a **joi** schema object to validate each array item against. `type` can be an array of values, or multiple values can be passed as individual arguments.\n\n```javascript\nvar schema = Joi.array().includes(Joi.string(), Joi.number());\n```\n\n#### `array.excludes(type)`\n\nList the types forbidden for the array values where:\n- `type` - a **joi** schema object to validate each array item against. `type` can be an array of values, or multiple values can be passed as individual arguments.\n\n```javascript\nvar schema = Joi.array().excludes(Joi.object());\n```\n\n#### `array.min(limit)`\n\nSpecifies the minimum number of items in the array where:\n- `limit` - the lowest number of array items allowed.\n\n```javascript\nvar schema = Joi.array().min(2);\n```\n\n#### `array.max(limit)`\n\nSpecifies the maximum number of items in the array where:\n- `limit` - the highest number of array items allowed.\n\n```javascript\nvar schema = Joi.array().max(10);\n```\n\n#### `array.length(limit)`\n\nSpecifies the exact number of items in the array where:\n- `limit` - the number of array items allowed.\n\n```javascript\nvar schema = Joi.array().length(5);\n```\n\n#### `array.unique()`\n\nRequires the array values to be unique.\n\nBe aware that a deep equality is performed on elements of the array having a type of `object`, a performance penalty is to be expected for this kind of operation.\n\n```javascript\nvar schema = Joi.array().unique();\n```\n\n### `boolean`\n\nGenerates a schema object that matches a boolean data type (as well as the strings 'true', 'false', 'yes', and 'no'). Can also be called via `bool()`.\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar boolean = Joi.boolean();\nboolean.validate(true, function (err, value) { });\n```\n\n### `binary`\n\nGenerates a schema object that matches a Buffer data type (as well as the strings which will be converted to Buffers).\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar schema = Joi.binary();\n```\n\n#### `binary.encoding(encoding)`\n\nSets the string encoding format if a string input is converted to a buffer where:\n- `encoding` - the encoding scheme.\n\n```javascript\nvar schema = Joi.binary().encoding('base64');\n```\n\n#### `binary.min(limit)`\n\nSpecifies the minimum length of the buffer where:\n- `limit` - the lowest size of the buffer.\n\n```javascript\nvar schema = Joi.binary().min(2);\n```\n\n#### `binary.max(limit)`\n\nSpecifies the maximum length of the buffer where:\n- `limit` - the highest size of the buffer.\n\n```javascript\nvar schema = Joi.binary().max(10);\n```\n\n#### `binary.length(limit)`\n\nSpecifies the exact length of the buffer:\n- `limit` - the size of buffer allowed.\n\n```javascript\nvar schema = Joi.binary().length(5);\n```\n\n### `date`\n\nGenerates a schema object that matches a date type (as well as a JavaScript date string or number of milliseconds).\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar date = Joi.date();\ndate.validate('12-21-2012', function (err, value) { });\n```\n\n#### `date.min(date)`\n\nSpecifies the oldest date allowed where:\n- `date` - the oldest date allowed.\n\n```javascript\nvar schema = Joi.date().min('1-1-1974');\n```\n\nNotes: `'now'` can be passed in lieu of `date` so as to always compare relatively to the current date, allowing to explicitly ensure a date is either in the past or in the future.\n\n```javascript\nvar schema = Joi.date().min('now');\n```\n\nIt can also be a reference to another field.\n\n```javascript\nvar schema = Joi.object({\n from: Joi.date().required(),\n to: Joi.date().min(Joi.ref('from')).required()\n});\n```\n\n#### `date.max(date)`\n\nSpecifies the latest date allowed where:\n- `date` - the latest date allowed.\n\n```javascript\nvar schema = Joi.date().max('12-31-2020');\n```\n\nNotes: `'now'` can be passed in lieu of `date` so as to always compare relatively to the current date, allowing to explicitly ensure a date is either in the past or in the future.\n\n```javascript\nvar schema = Joi.date().max('now');\n```\n\nIt can also be a reference to another field.\n\n```javascript\nvar schema = Joi.object({\n from: Joi.date().max(Joi.ref('to')).required(),\n to: Joi.date().required()\n});\n```\n\n#### `date.format(format)`\n\nSpecifies the allowed date format:\n- `format` - string or array of strings that follow the `moment.js` [format](http://momentjs.com/docs/#/parsing/string-format/).\n\n```javascript\nvar schema = Joi.date().format('YYYY/MM/DD');\n```\n\n#### `date.iso()`\n\nRequires the string value to be in valid ISO 8601 date format.\n\n```javascript\nvar schema = Joi.date().iso();\n```\n\n### `func`\n\nGenerates a schema object that matches a function type.\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar func = Joi.func();\nfunc.validate(function () {}, function (err, value) { });\n```\n\n### `number`\n\nGenerates a schema object that matches a number data type (as well as strings that can be converted to numbers).\n\n`Infinity` and `-Infinity` are invalid by default, you can change that behavior by calling `allow(Infinity, -Infinity)`.\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar number = Joi.number();\nnumber.validate(5, function (err, value) { });\n```\n\n#### `number.min(limit)`\n\nSpecifies the minimum value where:\n- `limit` - the minimum value allowed.\n\n```javascript\nvar schema = Joi.number().min(2);\n```\n\n#### `number.max(limit)`\n\nSpecifies the maximum value where:\n- `limit` - the maximum value allowed.\n\n```javascript\nvar schema = Joi.number().max(10);\n```\n\n#### `number.greater(limit)`\n\nSpecifies that the value must be greater than `limit`.\n\n```javascript\nvar schema = Joi.number().greater(5);\n```\n\n#### `number.less(limit)`\n\nSpecifies that the value must be less than `limit`.\n\n```javascript\nvar schema = Joi.number().less(10);\n```\n\n#### `number.integer()`\n\nRequires the number to be an integer (no floating point).\n\n```javascript\nvar schema = Joi.number().integer();\n```\n\n#### `number.precision(limit)`\n\nSpecifies the maximum number of decimal places where:\n- `limit` - the maximum number of decimal places allowed.\n\n```javascript\nvar schema = Joi.number().precision(2);\n```\n\n### `object`\n\nGenerates a schema object that matches an object data type (as well as JSON strings that parsed into objects). Defaults\nto allowing any child key.\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar object = Joi.object().keys({\n a: Joi.number().min(1).max(10).integer(),\n b: 'some string'\n});\n\nobject.validate({ a: 5 }, function (err, value) { });\n```\n\n#### `object.keys([schema])`\n\nSets or extends the allowed object keys where:\n- `schema` - optional object where each key is assigned a **joi** type object. If `schema` is `{}` no keys allowed.\n If `schema` is `null` or `undefined`, any key allowed. If `schema` is an object with keys, the keys are added to any\n previously defined keys (but narrows the selection if all keys previously allowed). Defaults to 'undefined' which\n allows any child key.\n\n```javascript\nvar base = Joi.object().keys({\n a: Joi.number(),\n b: Joi.string()\n});\n// Validate keys a, b and c.\nvar extended = base.keys({\n c: Joi.boolean()\n});\n```\n\n#### `object.min(limit)`\n\nSpecifies the minimum number of keys in the object where:\n- `limit` - the lowest number of keys allowed.\n\n```javascript\nvar schema = Joi.object().min(2);\n```\n\n#### `object.max(limit)`\n\nSpecifies the maximum number of keys in the object where:\n- `limit` - the highest number of object keys allowed.\n\n```javascript\nvar schema = Joi.object().max(10);\n```\n\n#### `object.length(limit)`\n\nSpecifies the exact number of keys in the object where:\n- `limit` - the number of object keys allowed.\n\n```javascript\nvar schema = Joi.object().length(5);\n```\n\n#### `object.pattern(regex, schema)`\n\nSpecify validation rules for unknown keys matching a pattern where:\n- `regex` - a regular expression tested against the unknown key names.\n- `schema` - the schema object matching keys much validate against.\n\n```javascrip\nvar schema = Joi.object({\n a: Joi.string()\n}).pattern(/\\w\\d/, Joi.boolean());\n```\n\n#### `object.and(peers)`\n\nDefines an all-or-nothing relationship between keys where if one of the peers is present, all of them are required as\nwell where:\n- `peers` - the key names of which if one present, all are required. `peers` can be a single string value, an\n array of string values, or each peer provided as an argument.\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.any(),\n b: Joi.any()\n}).and('a', 'b');\n```\n\n#### `object.nand(peers)`\n\nDefines a relationship between keys where not all peers can be present at the\nsame time where:\n- `peers` - the key names of which if one present, the others may not all be present. `peers` can be a single string value, an\n array of string values, or each peer provided as an argument.\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.any(),\n b: Joi.any()\n}).nand('a', 'b');\n```\n\n#### `object.or(peers)`\n\nDefines a relationship between keys where one of the peers is required (and more than one is allowed) where:\n- `peers` - the key names of which at least one must appear. `peers` can be a single string value, an\n array of string values, or each peer provided as an argument.\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.any(),\n b: Joi.any()\n}).or('a', 'b');\n```\n\n#### `object.xor(peers)`\n\nDefines an exclusive relationship between a set of keys where one of them is required but not at the same time where:\n- `peers` - the exclusive key names that must not appear together but where one of them is required. `peers` can be a single string value, an\n array of string values, or each peer provided as an argument.\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.any(),\n b: Joi.any()\n}).xor('a', 'b');\n```\n\n#### `object.with(key, peers)`\n\nRequires the presence of other keys whenever the specified key is present where:\n- `key` - the reference key.\n- `peers` - the required peer key names that must appear together with `key`. `peers` can be a single string value or an array of string values.\n\nNote that unlike [`object.and()`](#objectandpeers), `with()` creates a dependency only between the `key` and each of the `peers`, not\nbetween the `peers` themselves.\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.any(),\n b: Joi.any()\n}).with('a', 'b');\n```\n\n#### `object.without(key, peers)`\n\nForbids the presence of other keys whenever the specified is present where:\n- `key` - the reference key.\n- `peers` - the forbidden peer key names that must not appear together with `key`. `peers` can be a single string value or an array of string values.\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.any(),\n b: Joi.any()\n}).without('a', ['b']);\n```\n\n#### `object.rename(from, to, [options])`\n\nRenames a key to another name (deletes the renamed key) where:\n- `from` - the original key name.\n- `to` - the new key name.\n- `options` - an optional object with the following optional keys:\n - `alias` - if `true`, does not delete the old key name, keeping both the new and old keys in place. Defaults to `false`.\n - `multiple` - if `true`, allows renaming multiple keys to the same destination where the last rename wins. Defaults to `false`.\n - `override` - if `true`, allows renaming a key over an existing key. Defaults to `false`.\n\nKeys are renamed before any other validation rules are applied.\n\n```javascript\nvar object = Joi.object().keys({\n a: Joi.number()\n}).rename('b', 'a');\n\nobject.validate({ b: 5 }, function (err, value) { });\n```\n\n#### `object.assert(ref, schema, [message])`\n\nVerifies an assertion where:\n- `ref` - the key name or [reference](#refkey-options).\n- `schema` - the validation rules required to satisfy the assertion. If the `schema` includes references, they are resolved against\n the object value, not the value of the `ref` target.\n- `message` - optional human-readable message used when the assertion fails. Defaults to 'failed to pass the assertion test'.\n\n```javascript\nvar schema = Joi.object().keys({\n a: {\n b: Joi.string(),\n c: Joi.number()\n },\n d: {\n e: Joi.any()\n }\n}).assert('d.e', Joi.ref('a.c'), 'equal to a.c');\n```\n\n#### `object.unknown([allow])`\n\nOverrides the handling of unknown keys for the scope of the current object only (does not apply to children) where:\n- `allow` - if `false`, unknown keys are not allowed, otherwise unknown keys are ignored.\n\n```javascript\nvar schema = Joi.object({ a: Joi.any() }).unknown();\n```\n\n#### `object.type(constructor, [name])`\n\nRequires the object to be an instance of a given constructor where:\n- `constructor` - the constructor function that the object must be an instance of.\n- `name` - an alternate name to use in validation errors. This is useful when the constructor function does not have a name.\n\n```javascript\nvar schema = Joi.object().type(RegExp);\n```\n\n#### `object.requiredKeys(children)`\n\nSets the specified children to required.\n- `children` - can be a single string value, an array of string values, or each child provided as an argument.\n\n```javascript\nvar schema = Joi.object().keys({ a: { b: Joi.number() }, c: { d: Joi.string() } });\nvar requiredSchema = schema.requiredKeys('', 'a.b', 'c', 'c.d');\n```\n\nNote that in this example `''` means the current object, `a` is not required but `b` is, as well as `c` and `d`.\n\n#### `object.optionalKeys(children)`\n\nSets the specified children to optional.\n- `children` - can be a single string value, an array of string values, or each child provided as an argument.\n\n```javascript\nvar schema = Joi.object().keys({ a: { b: Joi.number().required() }, c: { d: Joi.string().required() } });\nvar requiredSchema = schema.optionalKeys('a.b', 'c.d');\n```\n\nThe behavior is exactly the same as `requiredKeys`.\n\n### `string`\n\nGenerates a schema object that matches a string data type. Note that empty strings are not allowed by default and must be enabled with `allow('')`.\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar schema = Joi.string().min(1).max(10);\nschema.validate('12345', function (err, value) { });\n```\n\n#### `string.insensitive()`\n\nAllows the value to match any whitelist of blacklist item in a case insensitive comparison.\n\n```javascript\nvar schema = Joi.string().valid('a').insensitive();\n```\n\n#### `string.min(limit, [encoding])`\n\nSpecifies the minimum number string characters where:\n- `limit` - the minimum number of string characters required.\n- `encoding` - is specified, the string length is calculated in bytes using the provided encoding.\n\n```javascript\nvar schema = Joi.string().min(2);\n```\n\n#### `string.max(limit, [encoding])`\n\nSpecifies the maximum number of string characters where:\n- `limit` - the maximum number of string characters allowed.\n- `encoding` - is specified, the string length is calculated in bytes using the provided encoding.\n\n```javascript\nvar schema = Joi.string().max(10);\n```\n\n#### `string.creditCard()`\n\nRequires the number to be a credit card number (Using [Lunh\nAlgorithm](http://en.wikipedia.org/wiki/Luhn_algorithm)).\n\n```javascript\nvar schema = Joi.string().creditCard();\n```\n\n#### `string.length(limit, [encoding])`\n\nSpecifies the exact string length required where:\n- `limit` - the required string length.\n- `encoding` - is specified, the string length is calculated in bytes using the provided encoding.\n\n```javascript\nvar schema = Joi.string().length(5);\n```\n\n#### `string.regex(pattern, [name])`\n\nDefines a regular expression rule where:\n- `pattern` - a regular expression object the string value must match against.\n- `name` - optional name for patterns (useful with multiple patterns). Defaults to 'required'.\n\n```javascript\nvar schema = Joi.string().regex(/^[abc]+$/);\n```\n\n#### `string.alphanum()`\n\nRequires the string value to only contain a-z, A-Z, and 0-9.\n\n```javascript\nvar schema = Joi.string().alphanum();\n```\n\n#### `string.token()`\n\nRequires the string value to only contain a-z, A-Z, 0-9, and underscore _.\n\n```javascript\nvar schema = Joi.string().token();\n```\n\n#### `string.email()`\n\nRequires the string value to be a valid email address.\n\n```javascript\nvar schema = Joi.string().email();\n```\n\n#### `string.guid()`\n\nRequires the string value to be a valid GUID.\n\n```javascript\nvar schema = Joi.string().guid();\n```\n\n#### `string.hostname()`\n\nRequires the string value to be a valid hostname as per [RFC1123](http://tools.ietf.org/html/rfc1123).\n\n```javascript\nvar schema = Joi.string().hostname();\n```\n\n#### `string.lowercase()`\n\nRequires the string value to be all lowercase. If the validation `convert` option is on (enabled by default), the string\nwill be forced to lowercase.\n\n```javascript\nvar schema = Joi.string().lowercase();\n```\n\n#### `string.uppercase()`\n\nRequires the string value to be all uppercase. If the validation `convert` option is on (enabled by default), the string\nwill be forced to uppercase.\n\n```javascript\nvar schema = Joi.string().uppercase();\n```\n\n#### `string.trim()`\n\nRequires the string value to contain no whitespace before or after. If the validation `convert` option is on (enabled by\ndefault), the string will be trimmed.\n\n```javascript\nvar schema = Joi.string().trim();\n```\n\n### `alternatives`\n\nGenerates a type that will match one of the provided alternative schemas via the [`try()`](#alternativestryschemas)\nmethod. If no schemas are added, the type will not match any value except for `undefined`.\n\nSupports the same methods of the [`any()`](#any) type.\n\nAlternatives can be expressed using the shorter `[]` notation.\n\n```javascript\nvar alt = Joi.alternatives().try(Joi.number(), Joi.string());\n// Same as [Joi.number(), Joi.string()]\n```\n\n#### `alternatives.try(schemas)`\n\nAdds an alternative schema type for attempting to match against the validated value where:\n- `schema` - an array of alternative **joi** types. Also supports providing each type as a separate argument.\n\n```javascript\nvar alt = Joi.alternatives().try(Joi.number(), Joi.string());\nalt.validate('a', function (err, value) { });\n```\n\n#### `alternatives.when(ref, options)`\n\nAdds a conditional alternative schema type based on another key (not the same as `any.when()`) value where:\n- `ref` - the key name or [reference](#refkey-options).\n- `options` - an object with:\n - `is` - the required condition **joi** type.\n - `then` - the alternative schema type to **try** if the condition is true. Required if `otherwise` is missing.\n - `otherwise` - the alternative schema type to **try** if the condition is false. Required if `then` is missing.\n\n```javascript\nvar schema = {\n a: Joi.alternatives().when('b', { is: 5, then: Joi.string(), otherwise: Joi.number() }),\n b: Joi.any()\n};\n```\n\nNote that `when()` only adds additional alternatives to try and does not impact the overall type. Setting\na `required()` rule on a single alternative will not apply to the overall key. For example,\nthis definition of `a`:\n\n```javascript\nvar schema = {\n a: Joi.alternatives().when('b', { is: true, then: Joi.required() }),\n b: Joi.boolean()\n};\n```\n\nDoes not turn `a` into a required key when `b` is `true`. Instead, it tells the validator to try and match the\nvalue to anything that's not `undefined`. However, since `Joi.alternatives()` by itself allows `undefined`, the rule\ndoes not accomplish turning `a` to a required value. This rule is the same as `Joi.alternatives([Joi.required()])`\nwhen `b` is `true` which will allow any value including `undefined`.\n\nTo accomplish the desired result above use:\n\n```javascript\nvar schema = {\n a: Joi.when('b', { is: true, then: Joi.required() }),\n b: Joi.boolean()\n};\n```\n\n### `ref(key, [options])`\n\nGenerates a reference to the value of the named key. References are resolved at validation time and in order of dependency\nso that if one key validation depends on another, the dependent key is validated second after the reference is validated.\nReferences support the following arguments:\n- `key` - the reference target. References cannot point up the object tree, only to sibling keys, but they can point to\n their siblings' children (e.g. 'a.b.c') using the `.` separator. If a `key` starts with `$` is signifies a context reference\n which is looked up in the `context` option object.\n- `options` - optional settings:\n - `separator` - overrides the default `.` hierarchy separator.\n - `contextPrefix` - overrides the default `$` context prefix signifier.\n\nNote that references can only be used where explicitly supported such as in `valid()` or `invalid()` rules. If upwards\n(parents) references are needed, use [`object.assert()`](#objectassertref-schema-message).\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.ref('b.c'),\n b: {\n c: Joi.any()\n },\n c: Joi.ref('$x')\n});\n\nJoi.validate({ a: 5, b: { c: 5 } }, schema, { context: { x: 5 } }, function (err, value) {});\n```\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/hapijs/joi/issues" + }, + "_id": "joi@5.1.0", + "_from": "joi@5.x.x" +} diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/alternatives.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/alternatives.js new file mode 100755 index 0000000..e82ca88 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/alternatives.js @@ -0,0 +1,454 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('..'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('alternatives', function () { + + it('fails when no alternatives are provided', function (done) { + + Joi.alternatives().validate('a', function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('value not matching any of the allowed alternatives'); + done(); + }); + }); + + it('allows undefined when no alternatives are provided', function (done) { + + Joi.alternatives().validate(undefined, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('applies modifiers when higher priority converts', function (done) { + + var schema = Joi.object({ + a: [ + Joi.number(), + Joi.string() + ] + }); + + schema.validate({ a: '5' }, function (err, value) { + + expect(err).to.not.exist(); + expect(value.a).to.equal(5); + done(); + }); + }); + + it('applies modifiers when lower priority valid is a match', function (done) { + + var schema = Joi.object({ + a: [ + Joi.number(), + Joi.valid('5') + ] + }); + + schema.validate({ a: '5' }, function (err, value) { + + expect(err).to.not.exist(); + expect(value.a).to.equal(5); + done(); + }); + }); + + it('does not apply modifier if alternative fails', function (done) { + + var schema = Joi.object({ + a: [ + Joi.object({ c: Joi.any(), d: Joi.number() }).rename('b', 'c'), + { b: Joi.any(), d: Joi.string() } + ] + }); + + var input = { a: { b: 'any', d: 'string' } }; + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + expect(value.a.b).to.equal('any'); + done(); + }); + }); + + describe('#try', function () { + + it('throws when missing alternatives', function (done) { + + expect(function () { + + Joi.alternatives().try(); + }).to.throw('Cannot add other alternatives without at least one schema'); + done(); + }); + }); + + describe('#when', function () { + + it('throws on invalid ref (not string)', function (done) { + + expect(function () { + + Joi.alternatives().when(5, { is: 6, then: Joi.number() }); + }).to.throw('Invalid reference: 5'); + done(); + }); + + it('validates conditional alternatives', function (done) { + + var schema = { + a: Joi.alternatives().when('b', { is: 5, then: 'x', otherwise: 'y' }) + .try('z'), + b: Joi.any() + }; + + Helper.validate(schema, [ + [{ a: 'x', b: 5 }, true], + [{ a: 'x', b: 6 }, false], + [{ a: 'y', b: 5 }, false], + [{ a: 'y', b: 6 }, true], + [{ a: 'z', b: 5 }, true], + [{ a: 'z', b: 6 }, true] + ], done); + }); + + it('validates conditional alternatives (empty key)', function (done) { + + var schema = { + a: Joi.alternatives().when('', { is: 5, then: 'x', otherwise: 'y' }) + .try('z'), + '': Joi.any() + }; + + Helper.validate(schema, [ + [{ a: 'x', '': 5 }, true], + [{ a: 'x', '': 6 }, false], + [{ a: 'y', '': 5 }, false], + [{ a: 'y', '': 6 }, true], + [{ a: 'z', '': 5 }, true], + [{ a: 'z', '': 6 }, true] + ], done); + }); + + it('validates only then', function (done) { + + var schema = { + a: Joi.alternatives().when(Joi.ref('b'), { is: 5, then: 'x' }) + .try('z'), + b: Joi.any() + }; + + Helper.validate(schema, [ + [{ a: 'x', b: 5 }, true], + [{ a: 'x', b: 6 }, false], + [{ a: 'y', b: 5 }, false], + [{ a: 'y', b: 6 }, false], + [{ a: 'z', b: 5 }, true], + [{ a: 'z', b: 6 }, true] + ], done); + }); + + it('validates only otherwise', function (done) { + + var schema = { + a: Joi.alternatives().when('b', { is: 5, otherwise: 'y' }) + .try('z'), + b: Joi.any() + }; + + Helper.validate(schema, [ + [{ a: 'x', b: 5 }, false], + [{ a: 'x', b: 6 }, false], + [{ a: 'y', b: 5 }, false], + [{ a: 'y', b: 6 }, true], + [{ a: 'z', b: 5 }, true], + [{ a: 'z', b: 6 }, true] + ], done); + }); + + it('validates when is has ref', function (done) { + + var schema = { + a: Joi.alternatives().when('b', { is: Joi.ref('c'), then: 'x' }), + b: Joi.any(), + c: Joi.number() + }; + + Helper.validate(schema, [ + [{ a: 'x', b: 5, c: '5' }, true], + [{ a: 'x', b: 5, c: '1' }, false], + [{ a: 'x', b: '5', c: '5' }, false], + [{ a: 'y', b: 5, c: 5 }, false], + [{ a: 'y' }, false] + ], done); + }); + + it('validates when then has ref', function (done) { + + var schema = { + a: Joi.alternatives().when('b', { is: 5, then: Joi.ref('c') }), + b: Joi.any(), + c: Joi.number() + }; + + Helper.validate(schema, [ + [{ a: 'x', b: 5, c: '1' }, false], + [{ a: 1, b: 5, c: '1' }, true], + [{ a: '1', b: 5, c: '1' }, false] + ], done); + }); + + it('validates when otherwise has ref', function (done) { + + var schema = { + a: Joi.alternatives().when('b', { is: 6, otherwise: Joi.ref('c') }), + b: Joi.any(), + c: Joi.number() + }; + + Helper.validate(schema, [ + [{ a: 'x', b: 5, c: '1' }, false], + [{ a: 1, b: 5, c: '1' }, true], + [{ a: '1', b: 5, c: '1' }, false] + ], done); + }); + + it('validates when empty value', function (done) { + + var schema = { + a: Joi.alternatives().when('b', { is: true, then: Joi.required() }), + b: Joi.boolean().default(false) + }; + + Helper.validate(schema, [ + [{ b: false }, true], + [{ b: true }, true] // true because required() only applies to the one alternative + ], done); + }); + }); + + describe('#describe', function () { + + it('describes when', function (done) { + + var schema = { + a: Joi.alternatives().when('b', { is: 5, then: 'x', otherwise: 'y' }) + .try('z'), + b: Joi.any() + }; + + var outcome = { + type: 'object', + children: { + b: { + type: 'any' + }, + a: { + type: 'alternatives', + alternatives: [ + { + ref: 'ref:b', + is: { + type: 'number', + flags: { + allowOnly: true + }, + valids: [5], + invalids: [Infinity, -Infinity] + }, + then: { + type: 'string', + flags: { + allowOnly: true + }, + valids: ['x'], + invalids: [''] + }, + otherwise: { + type: 'string', + flags: { + allowOnly: true + }, + valids: ['y'], + invalids: [''] + } + }, + { + type: 'string', + flags: { + allowOnly: true + }, + valids: ['z'], + invalids: [''] + } + ] + } + } + }; + + expect(Joi.describe(schema)).to.deep.equal(outcome); + done(); + }); + + it('describes when (only then)', function (done) { + + var schema = { + a: Joi.alternatives().when('b', { is: 5, then: 'x' }) + .try('z'), + b: Joi.any() + }; + + var outcome = { + type: 'object', + children: { + b: { + type: 'any' + }, + a: { + type: 'alternatives', + alternatives: [ + { + ref: 'ref:b', + is: { + type: 'number', + flags: { + allowOnly: true + }, + valids: [5], + invalids: [Infinity, -Infinity] + }, + then: { + type: 'string', + flags: { + allowOnly: true + }, + valids: ['x'], + invalids: [''] + } + }, + { + type: 'string', + flags: { + allowOnly: true + }, + valids: ['z'], + invalids: [''] + } + ] + } + } + }; + + expect(Joi.describe(schema)).to.deep.equal(outcome); + done(); + }); + + it('describes when (only otherwise)', function (done) { + + var schema = { + a: Joi.alternatives().when('b', { is: 5, otherwise: 'y' }) + .try('z'), + b: Joi.any() + }; + + var outcome = { + type: 'object', + children: { + b: { + type: 'any' + }, + a: { + type: 'alternatives', + alternatives: [ + { + ref: 'ref:b', + is: { + type: 'number', + flags: { + allowOnly: true + }, + valids: [5], + invalids: [Infinity, -Infinity] + }, + otherwise: { + type: 'string', + flags: { + allowOnly: true + }, + valids: ['y'], + invalids: [''] + } + }, + { + type: 'string', + flags: { + allowOnly: true + }, + valids: ['z'], + invalids: [''] + } + ] + } + } + }; + + expect(Joi.describe(schema)).to.deep.equal(outcome); + done(); + }); + + it('describes inherited fields (from any)', function (done) { + + var schema = Joi.alternatives() + .try('a') + .description('d') + .example('a') + .meta('b') + .meta('c') + .notes('f') + .tags('g'); + + var outcome = { + type: 'alternatives', + description: 'd', + notes: ['f'], + tags: ['g'], + meta: ['b', 'c'], + examples: ['a'], + alternatives: [{ + type: 'string', + flags: { + allowOnly: true + }, + valids: ['a'], + invalids: [''] + }] + }; + + expect(Joi.describe(schema)).to.deep.equal(outcome); + done(); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/any.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/any.js new file mode 100755 index 0000000..3a89bf6 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/any.js @@ -0,0 +1,960 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('any', function () { + + describe('#equal', function () { + + it('validates valid values', function (done) { + + Helper.validate(Joi.equal(4), [ + [4, true], + [5, false] + ], done); + }); + }); + + describe('#not', function () { + + it('validates invalid values', function (done) { + + Helper.validate(Joi.not(5), [ + [4, true], + [5, false] + ], done); + }); + }); + + describe('#exist', function () { + + it('validates required values', function (done) { + + Helper.validate(Joi.exist(), [ + [4, true], + [undefined, false] + ], done); + }); + }); + + describe('#strict', function () { + + it('validates without converting', function (done) { + + var schema = Joi.object({ + array: Joi.array().includes(Joi.string().min(5), Joi.number().min(3)) + }).strict(); + + Helper.validate(schema, [ + [{ array: ['12345'] }, true], + [{ array: ['1'] }, false], + [{ array: [3] }, true], + [{ array: ['12345', 3] }, true] + ], done); + }); + }); + + describe('#options', function () { + + it('adds to existing options', function (done) { + + var schema = Joi.object({ b: Joi.number().strict().options({ convert: true }) }); + var input = { b: '2' }; + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + expect(value.b).to.equal(2); + done(); + }); + }); + }); + + describe('#label', function () { + + it('adds to existing options', function (done) { + + var schema = Joi.object({ b: Joi.string().email().label('Custom label') }); + var input = { b: 'not_a_valid_email' }; + schema.validate(input, function (err, value) { + + expect(err).to.exist(); + expect(err.details[0].message).to.equal('Custom label must be a valid email'); + done(); + }); + }); + + it('throws when label is missing', function (done) { + + expect(function () { + + Joi.label(); + }).to.throw('Label name must be a non-empty string'); + done(); + }); + + it('can describe a label', function (done) { + + var schema = Joi.object().label('lbl').describe(); + expect(schema).to.deep.equal({ type: 'object', label: 'lbl' }); + done(); + }); + }); + + describe('#strict', function () { + + it('adds to existing options', function (done) { + + var schema = Joi.object({ b: Joi.number().options({ convert: true }).strict() }); + var input = { b: '2' }; + schema.validate(input, function (err, value) { + + expect(err).to.exist(); + expect(value.b).to.equal('2'); + done(); + }); + }); + }); + + describe('#raw', function () { + + it('gives the raw input', function (done) { + + var tests = [ + [Joi.array(), '[1,2,3]'], + [Joi.binary(), 'abc'], + [Joi.boolean(), 'false'], + [Joi.date().format('YYYYMMDD'), '19700101'], + [Joi.number(), '12'], + [Joi.object(), '{ "a": 1 }'], + [Joi.any().strict(), 'abc'] + ]; + + tests.forEach(function (test) { + + var baseSchema = test[0]; + var input = test[1]; + var schemas = [ + baseSchema.raw(), + baseSchema.raw(true), + baseSchema.options({ raw: true }) + ]; + + schemas.forEach(function (schema) { + + schema.raw().validate(input, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.equal(input); + }); + }); + }); + + done(); + }); + }); + + describe('#default', function () { + + it('sets the value', function (done) { + + var schema = Joi.object({ foo: Joi.string().default('test') }); + var input = {}; + + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + expect(value.foo).to.equal('test'); + done(); + }); + }); + + it('should not overide a value when value is given', function (done) { + + var schema = Joi.object({ foo: Joi.string().default('bar') }); + var input = { foo: 'test' }; + + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + expect(value.foo).to.equal('test'); + done(); + }); + }); + + it('sets value based on condition (outer)', function (done) { + + var schema = Joi.object({ + a: Joi.boolean(), + b: Joi.boolean().default(false).when('a', { is: true, then: Joi.required(), otherwise: Joi.forbidden() }) + }); + + schema.validate({ a: false }, function (err, value) { + + expect(err).to.not.exist(); + expect(value.b).to.equal(false); + done(); + }); + }); + + it('sets value based on condition (inner)', function (done) { + + var schema = Joi.object({ + a: Joi.boolean(), + b: Joi.boolean().when('a', { is: true, then: Joi.default(false), otherwise: Joi.forbidden() }) + }); + + schema.validate({ a: true }, function (err, value) { + + expect(err).to.not.exist(); + expect(value.b).to.equal(false); + done(); + }); + }); + }); + + describe('#optional', function () { + + it('validates optional with default required', function (done) { + + var schema = Joi.object({ + a: Joi.any(), + b: Joi.any(), + c: { + d: Joi.any() + } + }).options({ presence: 'required' }); + + Helper.validate(schema, [ + [{ a: 5 }, false], + [{ a: 5, b: 6 }, false], + [{ a: 5, b: 6, c: {} }, false], + [{ a: 5, b: 6, c: { d: 7 } }, true], + [{}, false], + [{ b: 5 }, false] + ], done); + }); + }); + + describe('#forbidden', function () { + + it('validates forbidden', function (done) { + + var schema = { + a: Joi.number(), + b: Joi.forbidden() + }; + + Helper.validate(schema, [ + [{ a: 5 }, true], + [{ a: 5, b: 6 }, false], + [{ a: 'a' }, false], + [{}, true], + [{ b: undefined }, true], + [{ b: null }, false] + ], done); + }); + }); + + describe('#description', function () { + + it('sets the description', function (done) { + + var b = Joi.description('my description'); + expect(b._description).to.equal('my description'); + done(); + }); + + it('throws when description is missing', function (done) { + + expect(function () { + + Joi.description(); + }).to.throw('Description must be a non-empty string'); + done(); + }); + }); + + describe('#notes', function () { + + it('sets the notes', function (done) { + + var b = Joi.notes(['a']).notes('my notes'); + expect(b._notes).to.deep.equal(['a', 'my notes']); + done(); + }); + + it('throws when notes are missing', function (done) { + + expect(function () { + + Joi.notes(); + }).to.throw('Notes must be a non-empty string or array'); + done(); + }); + + it('throws when notes are invalid', function (done) { + + expect(function () { + + Joi.notes(5); + }).to.throw('Notes must be a non-empty string or array'); + done(); + }); + }); + + describe('#tags', function () { + + it('sets the tags', function (done) { + + var b = Joi.tags(['tag1', 'tag2']).tags('tag3'); + expect(b._tags).to.include('tag1'); + expect(b._tags).to.include('tag2'); + expect(b._tags).to.include('tag3'); + done(); + }); + + it('throws when tags are missing', function (done) { + + expect(function () { + + Joi.tags(); + }).to.throw('Tags must be a non-empty string or array'); + done(); + }); + + it('throws when tags are invalid', function (done) { + + expect(function () { + + Joi.tags(5); + }).to.throw('Tags must be a non-empty string or array'); + done(); + }); + }); + + describe('#meta', function () { + + it('sets the meta', function (done) { + + var meta = { prop: 'val', prop2: 3 }; + var b = Joi.meta(meta); + expect(b.describe().meta).to.deep.equal([meta]); + + b = b.meta({ other: true }); + expect(b.describe().meta).to.deep.equal([meta, { + other: true + }]); + + done(); + }); + + it('throws when meta is missing', function (done) { + + expect(function () { + + Joi.meta(); + }).to.throw('Meta cannot be undefined'); + done(); + }); + }); + + describe('#example', function () { + + it('sets an example', function (done) { + + var schema = Joi.valid(5, 6, 7).example(5); + expect(schema._examples).to.include(5); + expect(schema.describe().examples).to.deep.equal([5]); + done(); + }); + + it('throws when tags are missing', function (done) { + + expect(function () { + + Joi.example(); + }).to.throw('Missing example'); + done(); + }); + + it('throws when example fails own rules', function (done) { + + expect(function () { + + var schema = Joi.valid(5, 6, 7).example(4); + }).to.throw('Bad example: value must be one of 5, 6, 7'); + done(); + }); + }); + + describe('#unit', function () { + + it('sets the unit', function (done) { + + var b = Joi.unit('milliseconds'); + expect(b._unit).to.equal('milliseconds'); + expect(b.describe().unit).to.equal('milliseconds'); + done(); + }); + + it('throws when unit is missing', function (done) { + + expect(function () { + + Joi.unit(); + }).to.throw('Unit name must be a non-empty string'); + done(); + }); + }); + + describe('#_validate', function () { + + it('checks value after conversion', function (done) { + + var schema = Joi.number().invalid(2); + Joi.validate('2', schema, { abortEarly: false }, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + }); + + describe('#concat', function () { + + it('throws when schema is not any', function (done) { + + expect(function () { + + Joi.string().concat(Joi.number()); + }).to.throw('Cannot merge with another type: number'); + done(); + }); + + it('throws when schema is missing', function (done) { + + expect(function () { + + Joi.string().concat(); + }).to.throw('Invalid schema object'); + done(); + }); + + it('throws when schema is invalid', function (done) { + + expect(function () { + + Joi.string().concat(1); + }).to.throw('Invalid schema object'); + done(); + }); + + it('merges two schemas (settings)', function (done) { + + var a = Joi.number().options({ convert: true }); + var b = Joi.options({ convert: false }); + + Helper.validate(a, [ + [1, true], ['1', true] + ]); + + Helper.validate(a.concat(b), [ + [1, true], ['1', false] + ], done); + }); + + it('merges two schemas (valid)', function (done) { + + var a = Joi.string().valid('a'); + var b = Joi.string().valid('b'); + + Helper.validate(a, [ + ['a', true], + ['b', false] + ]); + + Helper.validate(b, [ + ['b', true], + ['a', false] + ]); + + Helper.validate(a.concat(b), [ + ['a', true], + ['b', true] + ], done); + }); + + it('merges two schemas (invalid)', function (done) { + + var a = Joi.string().invalid('a'); + var b = Joi.invalid('b'); + + Helper.validate(a, [ + ['b', true], ['a', false] + ]); + + Helper.validate(b, [ + ['a', true], ['b', false] + ]); + + Helper.validate(a.concat(b), [ + ['a', false], ['b', false] + ], done); + }); + + it('merges two schemas (valid/invalid)', function (done) { + + var a = Joi.string().valid('a').invalid('b'); + var b = Joi.string().valid('b').invalid('a'); + + Helper.validate(a, [ + ['a', true], + ['b', false] + ]); + + Helper.validate(b, [ + ['b', true], + ['a', false] + ]); + + Helper.validate(a.concat(b), [ + ['a', false], + ['b', true] + ], done); + }); + + it('merges two schemas (tests)', function (done) { + + var a = Joi.number().min(5); + var b = Joi.number().max(10); + + Helper.validate(a, [ + [4, false], [11, true] + ]); + + Helper.validate(b, [ + [6, true], [11, false] + ]); + + Helper.validate(a.concat(b), [ + [4, false], [6, true], [11, false] + ], done); + }); + + it('merges two schemas (flags)', function (done) { + + var a = Joi.string().valid('a'); + var b = Joi.string().insensitive(); + + Helper.validate(a, [ + ['a', true], ['A', false], ['b', false] + ]); + + Helper.validate(a.concat(b), [ + ['a', true], ['A', true], ['b', false] + ], done); + }); + + it('overrides and append information', function (done) { + + var a = Joi.description('a').unit('a').tags('a').example('a'); + var b = Joi.description('b').unit('b').tags('b').example('b'); + + var desc = a.concat(b).describe(); + expect(desc).to.deep.equal({ + type: 'any', + description: 'b', + tags: ['a', 'b'], + examples: ['a', 'b'], + unit: 'b' + }); + done(); + }); + + it('merges two objects (any key + specific key)', function (done) { + + var a = Joi.object(); + var b = Joi.object({ b: 1 }); + + Helper.validate(a, [ + [{ b: 1 }, true], [{ b: 2 }, true] + ]); + + Helper.validate(b, [ + [{ b: 1 }, true], [{ b: 2 }, false] + ]); + + Helper.validate(a.concat(b), [ + [{ b: 1 }, true], [{ b: 2 }, false] + ]); + + Helper.validate(b.concat(a), [ + [{ b: 1 }, true], [{ b: 2 }, false] + ], done); + }); + + it('merges two objects (no key + any key)', function (done) { + + var a = Joi.object({}); + var b = Joi.object(); + + Helper.validate(a, [ + [{}, true], [{ b: 2 }, false] + ]); + + Helper.validate(b, [ + [{}, true], [{ b: 2 }, true] + ]); + + Helper.validate(a.concat(b), [ + [{}, true], [{ b: 2 }, false] + ]); + + Helper.validate(b.concat(a), [ + [{}, true], [{ b: 2 }, false] + ], done); + }); + + it('merges two objects (key + key)', function (done) { + + var a = Joi.object({ a: 1 }); + var b = Joi.object({ b: 2 }); + + Helper.validate(a, [ + [{ a: 1 }, true], [{ b: 2 }, false] + ]); + + Helper.validate(b, [ + [{ a: 1 }, false], [{ b: 2 }, true] + ]); + + Helper.validate(a.concat(b), [ + [{ a: 1 }, true], [{ b: 2 }, true] + ]); + + Helper.validate(b.concat(a), [ + [{ a: 1 }, true], [{ b: 2 }, true] + ], done); + }); + + it('merges two objects (renames)', function (done) { + + var a = Joi.object({ a: 1 }).rename('c', 'a'); + var b = Joi.object({ b: 2 }).rename('d', 'b'); + + a.concat(b).validate({ c: 1, d: 2 }, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal({ a: 1, b: 2 }); + done(); + }); + }); + + it('merges two objects (deps)', function (done) { + + var a = Joi.object({ a: 1 }); + var b = Joi.object({ b: 2 }).and('b', 'a'); + + a.concat(b).validate({ a: 1, b: 2 }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('merges two alternatives with references', function (done) { + + var schema = { + a: { c: Joi.number() }, + b: Joi.alternatives(Joi.ref('a.c')).concat(Joi.alternatives(Joi.ref('c'))), + c: Joi.number() + }; + + Helper.validate(schema, [ + [{ a: {} }, true], + [{ a: { c: '5' }, b: 5 }, true], + [{ a: { c: '5' }, b: 6, c: '6' }, true], + [{ a: { c: '5' }, b: 7, c: '6' }, false] + ], done); + }); + + it('merges meta properly', function (done) { + + var metaA = { a: 1 }; + var metaB = { b: 1 }; + var a = Joi.any().meta(metaA); + var b = Joi.any().meta(metaB); + var c = Joi.any(); + var d = Joi.any(); + + expect(a.concat(b)._meta).to.deep.equal([{ a: 1 }, { b: 1 }]); + expect(a.concat(c)._meta).to.deep.equal([metaA]); + expect(b.concat(c)._meta).to.deep.equal([metaB]); + expect(c.concat(d)._meta).to.deep.equal([]); + + done(); + }); + }); + + describe('#when', function () { + + it('throws when options are invalid', function (done) { + + expect(function () { + + Joi.when('a'); + }).to.throw('Invalid options'); + done(); + }); + + it('forks type into alternatives', function (done) { + + var schema = { + a: Joi.any(), + b: Joi.string().valid('x').when('a', { is: 5, then: Joi.valid('y'), otherwise: Joi.valid('z') }) + }; + + Helper.validate(schema, [ + [{ a: 5, b: 'x' }, true], + [{ a: 5, b: 'y' }, true], + [{ a: 5, b: 'z' }, false], + [{ a: 1, b: 'x' }, true], + [{ a: 1, b: 'y' }, false], + [{ a: 1, b: 'z' }, true], + [{ a: 5, b: 'a' }, false], + [{ b: 'a' }, false] + ], done); + }); + + it('forks type into alternatives (only then)', function (done) { + + var schema = { + a: Joi.any(), + b: Joi.string().valid('x').when('a', { is: 5, then: Joi.valid('y') }) + }; + + Helper.validate(schema, [ + [{ a: 5, b: 'x' }, true], + [{ a: 5, b: 'y' }, true], + [{ a: 5, b: 'z' }, false], + [{ a: 1, b: 'x' }, true], + [{ a: 1, b: 'y' }, false], + [{ a: 1, b: 'z' }, false], + [{ a: 5, b: 'a' }, false], + [{ b: 'a' }, false] + ], done); + }); + + it('forks type into alternatives (only otherwise)', function (done) { + + var schema = { + a: Joi.any(), + b: Joi.string().valid('x').when('a', { is: 5, otherwise: Joi.valid('z') }) + }; + + Helper.validate(schema, [ + [{ a: 5, b: 'x' }, true], + [{ a: 5, b: 'y' }, false], + [{ a: 5, b: 'z' }, false], + [{ a: 1, b: 'x' }, true], + [{ a: 1, b: 'y' }, false], + [{ a: 1, b: 'z' }, true], + [{ a: 5, b: 'a' }, false], + [{ b: 'a' }, false] + ], done); + }); + + it('makes peer required', function (done) { + + var schema = { + a: Joi.when('b', { is: 5, then: Joi.required() }), + b: Joi.any() + }; + + Helper.validate(schema, [ + [{ b: 5 }, false], + [{ b: 6 }, true], + [{ a: 'b' }, true], + [{ b: 5, a: 'x' }, true] + ], done) + }); + }); + + describe('#requiredKeys', function () { + + it('should set keys as required', function (done) { + + var schema = Joi.object({ a: 0, b: 0, c: { d: 0, e: { f: 0 } }, g: { h: 0 } }) + .requiredKeys('a', 'b', 'c.d', 'c.e.f', 'g'); + Helper.validate(schema, [ + [{}, false], + [{ a: 0 }, false], + [{ a: 0, b: 0 }, false], + [{ a: 0, b: 0, g: {} }, true], + [{ a: 0, b: 0, c: {}, g: {} }, false], + [{ a: 0, b: 0, c: { d: 0 }, g: {} }, true], + [{ a: 0, b: 0, c: { d: 0, e: {} }, g: {} }, false], + [{ a: 0, b: 0, c: { d: 0, e: { f: 0 } }, g: {} }, true] + ], done); + }); + + it('should work on types other than objects', function (done) { + + var schemas = [Joi.array(), Joi.binary(), Joi.boolean(), Joi.date(), Joi.func(), Joi.number(), Joi.string()]; + schemas.forEach(function (schema) { + + expect(function () { + + schema.applyFunctionToChildren([''], 'required'); + }).to.not.throw(); + + expect(function () { + + schema.applyFunctionToChildren(['', 'a'], 'required'); + }).to.throw(); + + expect(function () { + + schema.applyFunctionToChildren(['a'], 'required'); + }).to.throw(); + }); + + done(); + }); + + it('should throw on unknown key', function (done) { + + expect(function() { + Joi.object({ a: 0, b: 0 }).requiredKeys('a', 'c', 'b', 'd', 'd.e.f'); + }).to.throw(Error, 'unknown key(s) c, d'); + expect(function() { + Joi.object({ a: 0, b: 0 }).requiredKeys('a', 'b', 'a.c.d'); + }).to.throw(Error, 'unknown key(s) a.c.d'); + done(); + }); + + it('should throw on empty object', function (done) { + + expect(function() { + Joi.object().requiredKeys('a', 'c', 'b', 'd'); + }).to.throw(Error, 'unknown key(s) a, b, c, d'); + done(); + }); + + it('should not modify original object', function (done) { + + var schema = Joi.object({ a: 0 }); + var requiredSchema = schema.requiredKeys('a'); + schema.validate({}, function (err) { + + expect(err).to.not.exist(); + + requiredSchema.validate({}, function (err) { + + expect(err).to.exist(); + done(); + }); + }); + }); + }); + + describe('#optionalKeys', function () { + + it('should set keys as optional', function (done) { + + var schema = Joi.object({ a: Joi.number().required(), b: Joi.number().required() }).optionalKeys('a', 'b'); + Helper.validate(schema, [ + [{}, true], + [{ a: 0 }, true], + [{ a: 0, b: 0 }, true] + ], done); + }); + }); + + describe('Set', function () { + + describe('#add', function () { + + it('throws when adding a non ref function', function (done) { + + expect(function () { + + Joi.valid(function () { }); + }).to.throw('Value cannot be an object or function'); + done(); + }); + + it('throws when adding an object function', function (done) { + + expect(function () { + + Joi.valid({}); + }).to.throw('Value cannot be an object or function'); + done(); + }); + }); + + describe('#has', function () { + + it('compares date to null', function (done) { + + var any = Joi.any().clone(); + any._valids.add(null); + expect(any._valids.has(new Date())).to.equal(false); + done(); + }); + + it('compares buffer to null', function (done) { + + var any = Joi.any().clone(); + any._valids.add(null); + expect(any._valids.has(new Buffer(''))).to.equal(false); + done(); + }); + }); + + describe('#values', function () { + + it('returns array', function (done) { + + var a = Joi.any().valid('x').invalid('y'); + var b = a.invalid('x'); + expect(a._valids.values().length).to.equal(1); + expect(b._valids.values().length).to.equal(0); + expect(a._invalids.values().length).to.equal(1); + expect(b._invalids.values().length).to.equal(2); + done(); + }); + }); + + describe('#toString', function () { + + it('includes undefined', function (done) { + + var b = Joi.any().allow(undefined); + expect(b._valids.toString(true)).to.equal('undefined'); + done(); + }); + }); + }); +}); + diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/array.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/array.js new file mode 100755 index 0000000..7c1d549 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/array.js @@ -0,0 +1,593 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('array', function () { + + it('converts a string to an array', function (done) { + + Joi.array().validate('[1,2,3]', function (err, value) { + + expect(err).to.not.exist(); + expect(value.length).to.equal(3); + done(); + }); + }); + + it('errors on non-array string', function (done) { + + Joi.array().validate('{ "something": false }', function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('value must be an array'); + done(); + }); + }); + + it('errors on number', function (done) { + + Joi.array().validate(3, function (err, value) { + + expect(err).to.exist(); + expect(value).to.equal(3); + done(); + }); + }); + + it('converts a non-array string with number type', function (done) { + + Joi.array().validate('3', function (err, value) { + + expect(err).to.exist(); + expect(value).to.equal('3'); + done(); + }); + }); + + it('errors on a non-array string', function (done) { + + Joi.array().validate('asdf', function (err, value) { + + expect(err).to.exist(); + expect(value).to.equal('asdf'); + done(); + }); + }); + + describe('#includes', function () { + + it('converts members', function (done) { + + var schema = Joi.array().includes(Joi.number()); + var input = ['1', '2', '3']; + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal([1, 2, 3]); + done(); + }); + }); + + it('allows zero size', function (done) { + + var schema = Joi.object({ + test: Joi.array().includes(Joi.object({ + foo: Joi.string().required() + })) + }); + var input = { test: [] }; + + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('returns the first error when only one inclusion', function (done) { + + var schema = Joi.object({ + test: Joi.array().includes(Joi.object({ + foo: Joi.string().required() + })) + }); + var input = { test: [{ foo: 'a' }, { bar: 2 }] }; + + schema.validate(input, function (err, value) { + + expect(err.message).to.equal('test at position 1 fails because foo is required'); + done(); + }); + }); + + it('validates multiple types added in two calls', function (done) { + + var schema = Joi.array() + .includes(Joi.number()) + .includes(Joi.string()); + + Helper.validate(schema, [ + [[1, 2, 3], true], + [[50, 100, 1000], true], + [[1, 'a', 5, 10], true], + [['joi', 'everydaylowprices', 5000], true] + ], done); + }); + }); + + describe('#min', function () { + + it('validates array size', function (done) { + + var schema = Joi.array().min(2); + Helper.validate(schema, [ + [[1, 2], true], + [[1], false] + ], done); + }); + + it('throws when limit is not a number', function (done) { + + expect(function () { + + Joi.array().min('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('throws when limit is not an integer', function (done) { + + expect(function () { + + Joi.array().min(1.2); + }).to.throw('limit must be a positive integer'); + done(); + }); + }); + + describe('#max', function () { + + it('validates array size', function (done) { + + var schema = Joi.array().max(1); + Helper.validate(schema, [ + [[1, 2], false], + [[1], true] + ], done); + }); + + it('throws when limit is not a number', function (done) { + + expect(function () { + + Joi.array().max('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('throws when limit is not an integer', function (done) { + + expect(function () { + + Joi.array().max(1.2); + }).to.throw('limit must be a positive integer'); + done(); + }); + }); + + describe('#length', function () { + + it('validates array size', function (done) { + + var schema = Joi.array().length(2); + Helper.validate(schema, [ + [[1, 2], true], + [[1], false] + ], done); + }); + + it('throws when limit is not a number', function (done) { + + expect(function () { + + Joi.array().length('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('throws when limit is not an integer', function (done) { + + expect(function () { + + Joi.array().length(1.2); + }).to.throw('limit must be a positive integer'); + done(); + }); + }); + + describe('#validate', function () { + + it('should, by default, allow undefined, allow empty array', function (done) { + + Helper.validate(Joi.array(), [ + [undefined, true], + [[], true] + ], done); + }); + + it('should, when .required(), deny undefined', function (done) { + + Helper.validate(Joi.array().required(), [ + [undefined, false] + ], done); + }); + + it('allows empty arrays', function (done) { + + Helper.validate(Joi.array(), [ + [undefined, true], + [[], true] + ], done); + }); + + it('excludes values when excludes is called', function (done) { + + Helper.validate(Joi.array().excludes(Joi.string()), [ + [['2', '1'], false], + [['1'], false], + [[2], true] + ], done); + }); + + it('allows types to be excluded', function (done) { + + var schema = Joi.array().excludes(Joi.number()); + + var n = [1, 2, 'hippo']; + schema.validate(n, function (err, value) { + + expect(err).to.exist(); + + var m = ['x', 'y', 'z']; + schema.validate(m, function (err2, value) { + + expect(err2).to.not.exist(); + done(); + }); + }); + }); + + it('validates array of Numbers', function (done) { + + Helper.validate(Joi.array().includes(Joi.number()), [ + [[1, 2, 3], true], + [[50, 100, 1000], true], + [['a', 1, 2], false], + [['1', '2', 4], true] + ], done); + }); + + it('validates array of mixed Numbers & Strings', function (done) { + + Helper.validate(Joi.array().includes(Joi.number(), Joi.string()), [ + [[1, 2, 3], true], + [[50, 100, 1000], true], + [[1, 'a', 5, 10], true], + [['joi', 'everydaylowprices', 5000], true] + ], done); + }); + + it('validates array of objects with schema', function (done) { + + Helper.validate(Joi.array().includes(Joi.object({ h1: Joi.number().required() })), [ + [[{ h1: 1 }, { h1: 2 }, { h1: 3 }], true], + [[{ h2: 1, h3: 'somestring' }, { h1: 2 }, { h1: 3 }], false], + [[1, 2, [1]], false] + ], done); + }); + + it('errors on array of unallowed mixed types (Array)', function (done) { + + Helper.validate(Joi.array().includes(Joi.number()), [ + [[1, 2, 3], true], + [[1, 2, [1]], false] + ], done); + }); + + it('errors on invalid number rule using includes', function (done) { + + var schema = Joi.object({ + arr: Joi.array().includes(Joi.number().integer()) + }); + + var input = { arr: [1, 2, 2.1] }; + schema.validate(input, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('arr at position 2 fails because 2 must be an integer'); + done(); + }); + }); + + it('validates an array within an object', function (done) { + + var schema = Joi.object({ + array: Joi.array().includes(Joi.string().min(5), Joi.number().min(3)) + }).options({ convert: false }); + + Helper.validate(schema, [ + [{ array: ['12345'] }, true], + [{ array: ['1'] }, false], + [{ array: [3] }, true], + [{ array: ['12345', 3] }, true] + ], done); + }); + + it('should not change original value', function (done) { + + var schema = Joi.array().includes(Joi.number()).unique(); + var input = ['1', '2']; + + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal([1, 2]); + expect(input).to.deep.equal(['1', '2']); + done(); + }); + }); + + describe('#describe', function () { + + it('returns an empty description when no rules are applied', function (done) { + + var schema = Joi.array(); + var desc = schema.describe(); + expect(desc).to.deep.equal({ + type: 'array', + flags: { sparse: false } + }); + done(); + }); + + it('returns an updated description when sparse rule is applied', function (done) { + + var schema = Joi.array().sparse(); + var desc = schema.describe(); + expect(desc).to.deep.equal({ + type: 'array', + flags: { sparse: true } + }); + done(); + }); + + it('returns an includes array only if includes are specified', function (done) { + + var schema = Joi.array().includes().max(5); + var desc = schema.describe(); + expect(desc.includes).to.not.exist(); + done(); + }); + + it('returns a recursively defined array of includes when specified', function (done) { + + var schema = Joi.array().includes(Joi.number(), Joi.string()).excludes(Joi.boolean()); + var desc = schema.describe(); + expect(desc.includes).to.have.length(2); + expect(desc.excludes).to.have.length(1); + expect(desc).to.deep.equal({ + type: 'array', + flags: { sparse: false }, + includes: [{ type: 'number', invalids: [Infinity, -Infinity] }, { type: 'string', invalids: [''] }], + excludes: [{ type: 'boolean' }] + }); + + done(); + }); + }); + }); + + describe('#unique', function() { + + it('errors if duplicate numbers, strings, objects, binaries, functions, dates and booleans', function(done) { + var buffer = new Buffer('hello world'); + var func = function() {}; + var now = new Date(); + var schema = Joi.array().sparse().unique(); + + Helper.validate(schema, [ + [[2, 2], false], + [[02, 2], false], + [[0x2, 2], false], + [['duplicate', 'duplicate'], false], + [[{ a: 'b' }, { a: 'b' }], false], + [[buffer, buffer], false], + [[func, func], false], + [[now, now], false], + [[true, true], false], + [[undefined, undefined], false] + ], done); + }); + + it('ignores duplicates if they are of different types', function(done) { + var schema = Joi.array().unique(); + + Helper.validate(schema, [ + [[2, '2'], true] + ], done); + }); + + it('validates without duplicates', function(done) { + var buffer = new Buffer('hello world'); + var buffer2 = new Buffer('Hello world'); + var func = function() {}; + var func2 = function() {}; + var now = new Date(); + var now2 = new Date(+now + 100); + var schema = Joi.array().unique(); + + Helper.validate(schema, [ + [[1, 2], true], + [['s1', 's2'], true], + [[{ a: 'b' }, { a: 'c' }], true], + [[buffer, buffer2], true], + [[func, func2], true], + [[now, now2], true], + [[true, false], true] + ], done); + }); + }); + + describe('#sparse', function () { + + it('errors on undefined value', function (done) { + + var schema = Joi.array().includes(Joi.number()); + + Helper.validate(schema, [ + [[undefined], false], + [[2, undefined], false] + ], done); + }); + + it('validates on undefined value with sparse', function (done) { + + var schema = Joi.array().includes(Joi.number()).sparse(); + + Helper.validate(schema, [ + [[undefined], true], + [[2, undefined], true] + ], done); + }); + + it('switches the sparse flag', function (done) { + + var schema = Joi.array().sparse(); + var desc = schema.describe(); + expect(desc).to.deep.equal({ + type: 'array', + flags: { sparse: true } + }); + done(); + }); + + it('switches the sparse flag with explicit value', function (done) { + + var schema = Joi.array().sparse(true); + var desc = schema.describe(); + expect(desc).to.deep.equal({ + type: 'array', + flags: { sparse: true } + }); + done(); + }); + + it('switches the sparse flag back', function (done) { + + var schema = Joi.array().sparse().sparse(false); + var desc = schema.describe(); + expect(desc).to.deep.equal({ + type: 'array', + flags: { sparse: false } + }); + done(); + }); + }); + + describe('#single', function() { + + it('should allow a single element', function(done) { + + var schema = Joi.array().includes(Joi.number()).excludes(Joi.boolean()).single(); + + Helper.validate(schema, [ + [[1, 2, 3], true], + [1, true], + [['a'], false, null, 'value at position 0 fails because value must be a number'], + ['a', false, null, 'single value of value fails because value must be a number'], + [true, false, null, 'single value of value contains an excluded value'] + ], done); + }); + + it('should allow a single element with multiple types', function(done) { + + var schema = Joi.array().includes(Joi.number(), Joi.string()).single(); + + Helper.validate(schema, [ + [[1, 2, 3], true], + [1, true], + [[1, 'a'], true], + ['a', true], + [true, false, null, 'single value of value does not match any of the allowed types'] + ], done); + }); + + it('should allow nested arrays', function(done) { + + var schema = Joi.array().includes(Joi.array().includes(Joi.number())).single(); + + Helper.validate(schema, [ + [[[1],[2],[3]], true], + [[1, 2, 3], true], + [[['a']], false, null, 'value at position 0 fails because value at position 0 fails because value must be a number'], + [['a'], false, null, 'value at position 0 fails because value must be an array'], + ['a', false, null, 'single value of value fails because value must be an array'], + [1, false, null, 'single value of value fails because value must be an array'], + [true, false, null, 'single value of value fails because value must be an array'] + ], done); + }); + + it('should allow nested arrays with multiple types', function (done) { + + var schema = Joi.array().includes(Joi.array().includes(Joi.number(), Joi.boolean())).single(); + + Helper.validate(schema, [ + [[[1, true]], true], + [[1, true], true], + [[[1, 'a']], false, null, 'value at position 0 fails because value at position 1 does not match any of the allowed types'], + [[1, 'a'], false, null, 'value at position 0 fails because value must be an array'] + ], done); + }); + + it('switches the single flag with explicit value', function (done) { + + var schema = Joi.array().single(true); + var desc = schema.describe(); + expect(desc).to.deep.equal({ + type: 'array', + flags: { sparse: false, single: true } + }); + done(); + }); + + it('switches the single flag back', function (done) { + + var schema = Joi.array().single().single(false); + var desc = schema.describe(); + expect(desc).to.deep.equal({ + type: 'array', + flags: { sparse: false, single: false } + }); + done(); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/binary.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/binary.js new file mode 100755 index 0000000..7a89a4c --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/binary.js @@ -0,0 +1,194 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('binary', function () { + + it('converts a string to a buffer', function (done) { + + Joi.binary().validate('test', function (err, value) { + + expect(err).to.not.exist(); + expect(value instanceof Buffer).to.equal(true); + expect(value.length).to.equal(4); + expect(value.toString('utf8')).to.equal('test'); + done(); + }); + }); + + it('validates allowed buffer content', function (done) { + + var hello = new Buffer('hello'); + var schema = Joi.binary().valid(hello); + + Helper.validate(schema, [ + ['hello', true], + [hello, true], + [new Buffer('hello'), true], + ['goodbye', false], + [new Buffer('goodbye'), false], + [new Buffer('HELLO'), false] + ], done); + }); + + describe('#validate', function () { + + it('returns an error when a non-buffer or non-string is used', function (done) { + + Joi.binary().validate(5, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('value must be a buffer or a string'); + done(); + }); + }); + + it('accepts a buffer object', function (done) { + + var schema = { + buffer: Joi.binary + }; + + Joi.binary().validate(new Buffer('hello world'), function (err, value) { + + expect(err).to.not.exist(); + expect(value.toString('utf8')).to.equal('hello world'); + done(); + }); + }); + }); + + describe('#encoding', function () { + + it('applies encoding', function (done) { + + var schema = Joi.binary().encoding('base64'); + var input = new Buffer('abcdef'); + schema.validate(input.toString('base64'), function (err, value) { + + expect(err).to.not.exist(); + expect(value instanceof Buffer).to.equal(true); + expect(value.toString()).to.equal('abcdef'); + done(); + }); + }); + + it('throws when encoding is invalid', function (done) { + + expect(function () { + + Joi.binary().encoding('base6'); + }).to.throw('Invalid encoding: base6'); + done(); + }); + }); + + describe('#min', function () { + + it('validates buffer size', function (done) { + + var schema = Joi.binary().min(5); + Helper.validate(schema, [ + [new Buffer('testing'), true], + [new Buffer('test'), false] + ], done); + }); + + it('throws when min is not a number', function (done) { + + expect(function () { + + Joi.binary().min('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('throws when min is not an integer', function (done) { + + expect(function () { + + Joi.binary().min(1.2); + }).to.throw('limit must be a positive integer'); + done(); + }); + }); + + describe('#max', function () { + + it('validates buffer size', function (done) { + + var schema = Joi.binary().max(5); + Helper.validate(schema, [ + [new Buffer('testing'), false], + [new Buffer('test'), true] + ], done); + }); + + it('throws when max is not a number', function (done) { + + expect(function () { + + Joi.binary().max('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('throws when max is not an integer', function (done) { + + expect(function () { + + Joi.binary().max(1.2); + }).to.throw('limit must be a positive integer'); + done(); + }); + }); + + describe('#length', function () { + + it('validates buffer size', function (done) { + + var schema = Joi.binary().length(4); + Helper.validate(schema, [ + [new Buffer('test'), true], + [new Buffer('testing'), false] + ], done); + }); + + it('throws when length is not a number', function (done) { + + expect(function () { + + Joi.binary().length('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('throws when length is not an integer', function (done) { + + expect(function () { + + Joi.binary().length(1.2); + }).to.throw('limit must be a positive integer'); + done(); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/boolean.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/boolean.js new file mode 100755 index 0000000..5be2e97 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/boolean.js @@ -0,0 +1,132 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('boolean', function () { + + it('converts a string to a boolean', function (done) { + + Joi.boolean().validate('true', function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.equal(true); + done(); + }); + }); + + it('errors on a number', function (done) { + + Joi.boolean().validate(1, function (err, value) { + + expect(err).to.exist(); + expect(value).to.equal(1); + done(); + }); + }); + + describe('#validate', function () { + + it('converts string values and validates', function (done) { + + var rule = Joi.boolean(); + Helper.validate(rule, [ + ['1234', false], + [false, true], + [true, true], + [null, false], + ['on', true], + ['off', true], + ['true', true], + ['false', true], + ['yes', true], + ['no', true] + ], done); + }); + + it('should handle work with required', function (done) { + + var rule = Joi.boolean().required(); + Helper.validate(rule, [ + ['1234', false], + ['true', true], + [false, true], + [true, true], + [null, false] + ], done); + }); + + it('should handle work with allow', function (done) { + + var rule = Joi.boolean().allow(false); + Helper.validate(rule, [ + ['1234', false], + [false, true], + [null, false] + ], done); + }); + + it('should handle work with invalid', function (done) { + + var rule = Joi.boolean().invalid(false); + Helper.validate(rule, [ + ['1234', false], + [false, false], + [true, true], + [null, false] + ], done); + }); + + it('should handle work with invalid and null allowed', function (done) { + + var rule = Joi.boolean().invalid(false).allow(null); + Helper.validate(rule, [ + ['1234', false], + [false, false], + [true, true], + [null, true] + ], done); + }); + + it('should handle work with allow and invalid', function (done) { + + var rule = Joi.boolean().invalid(true).allow(false); + Helper.validate(rule, [ + ['1234', false], + [false, true], + [true, false], + [null, false] + ], done); + }); + + it('should handle work with allow, invalid, and null allowed', function (done) { + + var rule = Joi.boolean().invalid(true).allow(false).allow(null); + Helper.validate(rule, [ + ['1234', false], + [false, true], + [true, false], + [null, true] + ], done); + }); + }); +}); + diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/date.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/date.js new file mode 100755 index 0000000..6eb9d21 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/date.js @@ -0,0 +1,291 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('date', function () { + + it('fails on boolean', function (done) { + + var schema = Joi.date(); + Helper.validate(schema, [ + [true, false], + [false, false] + ], done); + }); + + it('matches specific date', function (done) { + + var now = Date.now(); + Joi.date().valid(new Date(now)).validate(new Date(now), function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('errors on invalid input and convert disabled', function (done) { + + Joi.date().options({ convert: false }).validate('1-1-2013 UTC', function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('value must be a number of milliseconds or valid date string'); + done(); + }); + }); + + it('validates date', function (done) { + + Joi.date().validate(new Date(), function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('validates millisecond date as a string', function (done) { + + var now = new Date(); + var mili = now.getTime(); + + Joi.date().validate(mili.toString(), function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal(now); + done(); + }); + }); + + describe('#validate', function () { + + describe('min', function () { + + it('validates min', function (done) { + + Helper.validate(Joi.date().min('1-1-2000 UTC'), [ + ['1-1-2001 UTC', true], + ['1-1-2000 UTC', true], + [0, false], + ["0", false], + ["-1", false], + ['1-1-1999 UTC', false] + ], done); + }); + + it('accepts "now" as the min date', function(done) { + + var future = new Date(Date.now() + 1000000); + + Joi.date().min('now').validate(future, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal(future); + done(); + }); + }); + + it('errors if .min("now") is used with a past date', function(done) { + + var past = new Date(Date.now() - 1000000); + + Joi.date().min('now').validate(past, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('accepts references as min date', function(done) { + + var schema = Joi.object({ a: Joi.date(), b: Joi.date().min(Joi.ref('a')) }); + var now = Date.now(); + + Helper.validate(schema, [ + [{ a: now, b: now }, true], + [{ a: now, b: now + 1e3 }, true], + [{ a: now, b: now - 1e3 }, false] + ], done); + }); + + it('errors if reference is not a date', function(done) { + + var schema = Joi.object({ a: Joi.string(), b: Joi.date().min(Joi.ref('a')) }); + + Helper.validate(schema, [ + [{ a: 'abc', b: new Date() }, false, null, 'b references a which is not a date'], + [{ a: '123', b: new Date() }, true], + [{ a: (Date.now() + 1e3).toString(), b: new Date() }, false, null, /^b must be larger than or equal to/] + ], done); + }); + }); + + describe('max', function () { + + it('validates max', function (done) { + + Helper.validate(Joi.date().max('1-1-1970 UTC'), [ + ['1-1-1971 UTC', false], + ['1-1-1970 UTC', true], + [0, true], + [1, false], + ["0", true], + ["-1", true], + ['1-1-2014 UTC', false] + ], done); + }); + + it('accepts "now" as the max date', function(done) { + + var past = new Date(Date.now() - 1000000); + + Joi.date().max('now').validate(past, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal(past); + done(); + }); + }); + + it('errors if .max("now") is used with a future date', function(done) { + + var future = new Date(Date.now() + 1000000); + + Joi.date().max('now').validate(future, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('accepts references as max date', function(done) { + + var schema = Joi.object({ a: Joi.date(), b: Joi.date().max(Joi.ref('a')) }); + var now = Date.now(); + + Helper.validate(schema, [ + [{ a: now, b: now }, true], + [{ a: now, b: now + 1e3 }, false], + [{ a: now, b: now - 1e3 }, true] + ], done); + }); + + it('errors if reference is not a date', function(done) { + + var schema = Joi.object({ a: Joi.string(), b: Joi.date().max(Joi.ref('a')) }); + + Helper.validate(schema, [ + [{ a: 'abc', b: new Date() }, false, null, 'b references a which is not a date'], + [{ a: '100000000000000', b: new Date() }, true], + [{ a: (Date.now() - 1e3).toString(), b: new Date() }, false, null, /^b must be less than or equal to/] + ], done); + }); + }); + + it('validates only valid dates', function (done) { + + Helper.validate(Joi.date(), [ + ['1-1-2013 UTC', true], + ['not a valid date', false], + [new Date('not a valid date'), false] + ], done); + }); + + describe('#iso', function() { + + it('validates isoDate', function (done) { + + Helper.validate(Joi.date().iso(), [ + ['2013-06-07T14:21:46.295Z', true], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', true], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', true], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', true], + ['2013-06-07T14:21:46-07:00', true], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', true], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', true], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', true], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false] + ], done); + }); + + it('validates isoDate with a friendly error message', function (done) { + + var schema = { item: Joi.date().iso() }; + Joi.compile(schema).validate({ item: 'something' }, function (err, value) { + + expect(err.message).to.contain('must be a valid ISO 8601 date'); + done(); + }); + }); + + it('validates isoDate after clone', function (done) { + + var schema = { item: Joi.date().iso().clone() }; + Joi.compile(schema).validate({ item: '2013-06-07T14:21:46.295Z' }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + }); + + describe('#format', function () { + + it('validates custom format', function (done) { + + Helper.validate(Joi.date().format('DD#YYYY$MM'), [ + ['07#2013$06', true], + ['2013-06-07', false] + ], done); + }); + + it('validates several custom formats', function (done) { + + Helper.validate(Joi.date().format(['DD#YYYY$MM', 'YY|DD|MM']), [ + ['13|07|06', true], + ['2013-06-07', false] + ], done); + }); + + it('fails with bad formats', function (done) { + + expect(function () { + + Joi.date().format(true); + }).to.throw('Invalid format.'); + + expect(function () { + + Joi.date().format(['YYYYMMDD', true]); + }).to.throw('Invalid format.'); + done(); + }); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/errors.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/errors.js new file mode 100755 index 0000000..3b343ed --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/errors.js @@ -0,0 +1,270 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('errors', function () { + + it('supports custom errors when validating types', function (done) { + + var schema = Joi.object({ + email: Joi.string().email(), + date: Joi.date(), + alphanum: Joi.string().alphanum(), + min: Joi.string().min(3), + max: Joi.string().max(3), + required: Joi.string().required(), + xor: Joi.string(), + renamed: Joi.string().valid('456'), + notEmpty: Joi.string().required() + }).rename('renamed', 'required').without('required', 'xor').without('xor', 'required'); + + var input = { + email: 'invalid-email', + date: 'invalid-date', + alphanum: '\b\n\f\r\t', + min: 'ab', + max: 'abcd', + required: 'hello', + xor: '123', + renamed: '456', + notEmpty: '' + }; + + var lang = { + any: { + empty: '3' + }, + date: { + base: '18' + }, + string: { + base: '13', + min: '14', + max: '15', + alphanum: '16', + email: '19' + }, + object: { + without: '7', + rename: { + override: '11' + } + } + }; + + Joi.validate(input, schema, { abortEarly: false, language: lang }, function (err, value) { + + expect(err).to.exist(); + expect(err.name).to.equal('ValidationError'); + expect(err.message).to.equal('value 11. required 7. xor 7. email 19. date 18. alphanum 16. min 14. max 15. notEmpty 3'); + done(); + }); + }); + + it('does not prefix with key when language uses context.key', function (done) { + + Joi.valid('sad').options({ language: { any: { allowOnly: 'my hero {{key}} is not {{valids}}' } } }).validate(5, function (err, value) { + + expect(err.message).to.equal('my hero value is not sad'); + done(); + }); + }); + + it('escapes unsafe keys', function (done) { + + var schema = { + 'a()': Joi.number() + }; + + Joi.validate({ 'a()': 'x' }, schema, function (err, value) { + + expect(err.message).to.equal('a() must be a number'); + + Joi.validate({ 'b()': 'x' }, schema, function (err, value) { + + expect(err.message).to.equal('b() is not allowed'); + done(); + }); + }); + }); + + it('returns error type in validation error', function (done) { + + var input = { + notNumber: '', + notString: true, + notBoolean: 9 + }; + + var schema = { + notNumber: Joi.number().required(), + notString: Joi.string().required(), + notBoolean: Joi.boolean().required() + } + + Joi.validate(input, schema, { abortEarly: false }, function (err, value) { + + expect(err).to.exist(); + expect(err.details).to.have.length(3); + expect(err.details[0].type).to.equal('number.base'); + expect(err.details[1].type).to.equal('string.base'); + expect(err.details[2].type).to.equal('boolean.base'); + done(); + }); + }); + + it('returns a full path to an error value on an array (includes)', function (done) { + + var schema = Joi.array().includes(Joi.array().includes({ x: Joi.number() })); + var input = [ + [{ x: 1 }], + [{ x: 1 }, { x: 'a' }] + ]; + + schema.validate(input, function (err, value) { + + expect(err).to.exist(); + expect(err.details[0].path).to.equal('1.1.x'); + done(); + }); + }); + + it('returns a full path to an error value on an array (excludes)', function (done) { + + var schema = Joi.array().includes(Joi.array().excludes({ x: Joi.string() })); + var input = [ + [{ x: 1 }], + [{ x: 1 }, { x: 'a' }] + ]; + + schema.validate(input, function (err, value) { + + expect(err).to.exist(); + expect(err.details[0].path).to.equal('1.1'); + done(); + }); + }); + + it('returns a full path to an error value on an object', function (done) { + + var schema = { + x: Joi.array().includes({ x: Joi.number() }) + }; + + var input = { + x: [{ x: 1 }, { x: 'a' }] + }; + + Joi.validate(input, schema, function (err, value) { + + expect(err).to.exist(); + expect(err.details[0].path).to.equal('x.1.x'); + done(); + }); + }); + + it('overrides root key language', function (done) { + + Joi.string().options({ language: { root: 'blah' } }).validate(4, function (err, value) { + + expect(err.message).to.equal('blah must be a string'); + done(); + }); + }); + + it('overrides label key language', function (done) { + + Joi.string().options({ language: { root: 'blah', label: 'bleh' } }).validate(4, function (err, value) { + + expect(err.message).to.equal('bleh must be a string'); + done(); + }); + }); + + it('provides context with the error', function (done) { + + Joi.object({ length: Joi.number().min(3).required() }).validate({ length: 1 }, function (err) { + + expect(err.details).to.deep.equal([{ + message: 'length must be larger than or equal to 3', + path: 'length', + type: 'number.min', + context: { + limit: 3, + key: 'length' + } + }]); + done(); + }); + }); + + describe('#annotate', function () { + + it('annotates error', function (done) { + + var object = { + a: 'm', + y: { + b: { + c: 10 + } + } + }; + + var schema = { + a: Joi.string().valid('a', 'b', 'c', 'd'), + y: Joi.object({ + u: Joi.string().valid(['e', 'f', 'g', 'h']).required(), + b: Joi.string().valid('i', 'j').allow(false), + d: Joi.object({ + x: Joi.string().valid('k', 'l').required(), + c: Joi.number() + }) + }) + }; + + Joi.validate(object, schema, { abortEarly: false }, function (err, value) { + + expect(err).to.exist(); + expect(err.annotate()).to.equal('{\n \"y\": {\n \"b\" \u001b[31m[1]\u001b[0m: {\n \"c\": 10\n },\n \u001b[41m\"u\"\u001b[0m\u001b[31m [2]: -- missing --\u001b[0m\n },\n \"a\" \u001b[31m[3]\u001b[0m: \"m\"\n}\n\u001b[31m\n[1] a must be one of a, b, c, d\n[2] u is required\n[3] b must be a string\u001b[0m'); + done(); + }); + }); + + it('displays alternatives fail as a single line', function (done) { + + var schema = { + x: [ + Joi.string(), + Joi.number(), + Joi.date() + ] + }; + + Joi.validate({ x: true }, schema, function (err, value) { + + expect(err).to.exist(); + expect(err.annotate()).to.equal('{\n \"x\" \u001b[31m[1, 2, 3]\u001b[0m: true\n}\n\u001b[31m\n[1] x must be a string\n[2] x must be a number\n[3] x must be a number of milliseconds or valid date string\u001b[0m'); + done(); + }); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/function.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/function.js new file mode 100755 index 0000000..f98d57d --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/function.js @@ -0,0 +1,34 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('func', function () { + + it('should validate a function', function (done) { + + Helper.validate(Joi.func().required(), [ + [function () { }, true], + ['', false] + ], done); + }); +}); + diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/helper.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/helper.js new file mode 100755 index 0000000..50c12ba --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/helper.js @@ -0,0 +1,70 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +exports.validate = function (schema, config, callback) { + + return exports.validateOptions(schema, config, null, callback); +} + + +exports.validateOptions = function (schema, config, options, callback) { + + var compiled = Joi.compile(schema); + for (var i = 0, il = config.length; i < il; ++i) { + + var item = config[i]; + var result = Joi.validate(item[0], compiled, item[2] || options); + + var err = result.error; + var value = result.value; + + if (err !== null && item[1]) { + console.log(err); + } + + if (err === null && !item[1]) { + console.log(item[0]); + } + + expect(err === null).to.equal(item[1]); + + if (item.length >= 4) { + var comparator = item[3]; + if (item[1]) { + expect(value).to.deep.equal(comparator); + } + else { + if (comparator instanceof RegExp) { + expect(err.message).to.match(comparator); + } + else { + expect(err.message).to.deep.equal(comparator); + } + } + } + } + + if (callback) { + callback(); + } +}; + diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/index.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/index.js new file mode 100755 index 0000000..9a05886 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/index.js @@ -0,0 +1,1472 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Path = require('path'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('Joi', function () { + + it('validates object', function (done) { + + var schema = Joi.object({ + a: Joi.number().min(0).max(3), + b: Joi.string().valid('a', 'b', 'c'), + c: Joi.string().email().optional() + }).without('a', 'none'); + + var obj = { + a: 1, + b: 'a', + c: 'joe@example.com' + }; + + schema.validate(obj, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('keeps schema immutable', function (done) { + + var a = Joi.string(); + var b = a.valid('b'); + + Helper.validate(a, [ + ['a', true], + ['b', true], + [5, false] + ], function () { + + Helper.validate(b, [ + ['a', false], + ['b', true], + [5, false] + ], done); + }); + + }); + + it('validates null', function (done) { + + Joi.string().validate(null, function (err, value) { + + expect(err).to.exist(); + expect(err.annotate()).to.equal('{\n \u001b[41m\"value\"\u001b[0m\u001b[31m [1]: -- missing --\u001b[0m\n}\n\u001b[31m\n[1] value must be a string\u001b[0m'); + done(); + }); + }); + + it('validates null schema', function (done) { + + Helper.validate(null, [ + ['a', false], + [null, true] + ], done); + }); + + it('validates number literal', function (done) { + + Helper.validate(5, [ + [6, false], + [5, true] + ], done); + }); + + it('validates string literal', function (done) { + + Helper.validate('5', [ + ['6', false], + ['5', true] + ], done); + }); + + it('validates boolean literal', function (done) { + + Helper.validate(true, [ + [false, false], + [true, true] + ], done); + }); + + it('validates date literal', function (done) { + + var now = Date.now(); + Helper.validate(new Date(now), [ + [new Date(now), true], + [now, true], + [now * 2, false] + ], done); + }); + + it('validates complex literal', function (done) { + + var schema = ['key', 5, { a: true, b: [/^a/, 'boom'] }]; + Helper.validate(schema, [ + ['key', true], + [5, true], + ['other', false], + [6, false], + [{ c: 5 }, false], + [{}, true], + [{ b: 'abc' }, true], + [{ a: true, b: 'boom' }, true], + [{ a: 5, b: 'a' }, false] + ], done); + }); + + it('validates a compiled complex literal', function (done) { + + var schema = Joi.compile(['key', 5, { a: true, b: [/^a/, 'boom'] }]); + Helper.validate(schema, [ + ['key', true], + [5, true], + ['other', false], + [6, false], + [{ c: 5 }, false], + [{}, true], + [{ b: 'abc' }, true], + [{ a: true, b: 'boom' }, true], + [{ a: 5, b: 'a' }, false] + ], done); + }); + + it('validates regex directly', function (done) { + + Joi.compile(/^5$/).validate('5', function (err, value) { + + expect(err).to.not.exist(); + Joi.compile(/.{2}/).validate('6', function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + }); + + it('validated with', function (done) { + + var schema = Joi.object({ + txt: Joi.string(), + upc: Joi.string() + }).with('txt', 'upc'); + + Joi.validate({ txt: 'a' }, schema, { abortEarly: false }, function (err, value) { + + expect(err.message).to.equal('txt missing required peer upc'); + + Helper.validate(schema, [ + [{ upc: 'test' }, true], + [{ txt: 'test' }, false], + [{ txt: 'test', upc: null }, false], + [{ txt: 'test', upc: '' }, false], + [{ txt: 'test', upc: undefined }, false], + [{ txt: 'test', upc: 'test' }, true] + ], done); + }); + }); + + it('validated without', function (done) { + + var schema = Joi.object({ + txt: Joi.string(), + upc: Joi.string() + }).without('txt', 'upc'); + + Joi.validate({ txt: 'a', upc: 'b' }, schema, { abortEarly: false }, function (err, value) { + + expect(err.message).to.equal('txt conflict with forbidden peer upc'); + + Helper.validate(schema, [ + [{ upc: 'test' }, true], + [{ txt: 'test' }, true], + [{ txt: 'test', upc: null }, false], + [{ txt: 'test', upc: '' }, false], + [{ txt: 'test', upc: undefined }, true], + [{ txt: 'test', upc: 'test' }, false] + ], done); + }); + }); + + it('validates xor', function (done) { + + var schema = Joi.object({ + txt: Joi.string(), + upc: Joi.string() + }).xor('txt', 'upc'); + + Joi.validate({}, schema, { abortEarly: false }, function (err, value) { + + expect(err.message).to.equal('value must contain at least one of txt, upc'); + + Helper.validate(schema, [ + [{ upc: null }, false], + [{ upc: 'test' }, true], + [{ txt: null }, false], + [{ txt: 'test' }, true], + [{ txt: 'test', upc: null }, false], + [{ txt: 'test', upc: '' }, false], + [{ txt: '', upc: 'test' }, false], + [{ txt: null, upc: 'test' }, false], + [{ txt: undefined, upc: 'test' }, true], + [{ txt: 'test', upc: undefined }, true], + [{ txt: 'test', upc: '' }, false], + [{ txt: 'test', upc: null }, false], + [{ txt: '', upc: undefined }, false], + [{ txt: '', upc: '' }, false], + [{ txt: 'test', upc: 'test' }, false] + ], done); + }); + }); + + it('validates multiple peers xor', function (done) { + + var schema = Joi.object({ + txt: Joi.string(), + upc: Joi.string(), + code: Joi.string() + }).xor('txt', 'upc', 'code'); + + Helper.validate(schema, [ + [{ upc: 'test' }, true], + [{ txt: 'test' }, true], + [{}, false] + ], done); + }); + + it('validates xor with number types', function (done) { + + var schema = Joi.object({ + code: Joi.number(), + upc: Joi.number() + }).xor('code', 'upc'); + + Helper.validate(schema, [ + [{ upc: 123 }, true], + [{ code: 456 }, true], + [{ code: 456, upc: 123 }, false], + [{}, false] + ], done); + }); + + it('validates xor when empty value of peer allowed', function (done) { + + var schema = Joi.object({ + code: Joi.string(), + upc: Joi.string().allow('') + }).xor('code', 'upc'); + + Helper.validate(schema, [ + [{ upc: '' }, true], + [{ upc: '123' }, true], + [{ code: '456' }, true], + [{ code: '456', upc: '' }, false], + [{}, false] + ], done); + }); + + it('validates or', function (done) { + + var schema = Joi.object({ + txt: Joi.string(), + upc: Joi.string().allow(null, ''), + code: Joi.number() + }).or('txt', 'upc', 'code'); + + Joi.validate({}, schema, { abortEarly: false }, function (err, value) { + + expect(err.message).to.equal('value must contain at least one of txt, upc, code'); + + Helper.validate(schema, [ + [{ upc: null }, true], + [{ upc: 'test' }, true], + [{ txt: null }, false], + [{ txt: 'test' }, true], + [{ code: null }, false], + [{ code: 123 }, true], + [{ txt: 'test', upc: null }, true], + [{ txt: 'test', upc: '' }, true], + [{ txt: '', upc: 'test' }, false], + [{ txt: null, upc: 'test' }, false], + [{ txt: undefined, upc: 'test' }, true], + [{ txt: 'test', upc: undefined }, true], + [{ txt: 'test', upc: '' }, true], + [{ txt: 'test', upc: null }, true], + [{ txt: '', upc: undefined }, false], + [{ txt: '', upc: undefined, code: 999 }, false], + [{ txt: '', upc: undefined, code: undefined }, false], + [{ txt: '', upc: '' }, false], + [{ txt: 'test', upc: 'test' }, true], + [{ txt: 'test', upc: 'test', code: 322 }, true] + ], done); + }); + }); + + it('validates and', function (done) { + + var schema = Joi.object({ + txt: Joi.string(), + upc: Joi.string().allow(null, ''), + code: Joi.number() + }).and('txt', 'upc', 'code'); + + Joi.validate({ txt: 'x' }, schema, { abortEarly: false }, function (err, value) { + + expect(err.message).to.equal('value contains txt without its required peers upc, code'); + + Helper.validate(schema, [ + [{}, true], + [{ upc: null }, false], + [{ upc: 'test' }, false], + [{ txt: null }, false], + [{ txt: 'test' }, false], + [{ code: null }, false], + [{ code: 123 }, false], + [{ txt: 'test', upc: null }, false], + [{ txt: 'test', upc: '' }, false], + [{ txt: '', upc: 'test' }, false], + [{ txt: null, upc: 'test' }, false], + [{ txt: undefined, upc: 'test' }, false], + [{ txt: 'test', upc: undefined }, false], + [{ txt: 'test', upc: '' }, false], + [{ txt: 'test', upc: null }, false], + [{ txt: '', upc: undefined }, false], + [{ txt: '', upc: undefined, code: 999 }, false], + [{ txt: '', upc: undefined, code: undefined }, false], + [{ txt: '', upc: '' }, false], + [{ txt: 'test', upc: 'test' }, false], + [{ txt: 'test', upc: 'test', code: 322 }, true], + [{ txt: 'test', upc: null, code: 322 }, true] + ], done); + }); + }); + + it('validates nand()', function (done) { + + var schema = Joi.object({ + txt: Joi.string(), + upc: Joi.string().allow(null, ''), + code: Joi.number() + }).nand('txt', 'upc', 'code'); + + Joi.validate({ txt: 'x', upc: 'y', code: 123 }, schema, { abortEarly: false }, function (err, value) { + + expect(err.message).to.equal('value txt must not exist simultaneously with upc, code'); + + Helper.validate(schema, [ + [{}, true], + [{ upc: null }, true], + [{ upc: 'test' }, true], + [{ txt: 'test' }, true], + [{ code: 123 }, true], + [{ txt: 'test', upc: null }, true], + [{ txt: 'test', upc: '' }, true], + [{ txt: undefined, upc: 'test' }, true], + [{ txt: 'test', upc: undefined }, true], + [{ txt: 'test', upc: '' }, true], + [{ txt: 'test', upc: null }, true], + [{ txt: 'test', upc: undefined, code: 999 }, true], + [{ txt: 'test', upc: 'test' }, true], + [{ txt: 'test', upc: 'test', code: 322 }, false], + [{ txt: 'test', upc: null, code: 322 }, false] + ], done); + }); + }); + + it('validates an array of valid types', function (done) { + + var schema = Joi.object({ + auth: [ + Joi.object({ + mode: Joi.string().valid('required', 'optional', 'try').allow(null) + }).allow(null), + Joi.string(), + Joi.boolean() + ] + }); + + schema.validate({ auth: { mode: 'none' } }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('mode must be one of required, optional, try, null. auth must be a string. auth must be a boolean'); + + Helper.validate(schema, [ + [{ auth: { mode: 'try' } }, true], + [{ something: undefined }, false], + [{ auth: { something: undefined } }, false], + [{ auth: null }, true], + [{ auth: undefined }, true], + [{}, true], + [{ auth: true }, true], + [{ auth: 123 }, false] + ], done); + }); + }); + + it('validates alternatives', function (done) { + + var schema = Joi.object({ + auth: Joi.alternatives( + Joi.object({ + mode: Joi.string().valid('required', 'optional', 'try').allow(null) + }).allow(null), + Joi.string(), + Joi.boolean() + ) + }); + + schema.validate({ auth: { mode: 'none' } }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('mode must be one of required, optional, try, null. auth must be a string. auth must be a boolean'); + + Helper.validate(schema, [ + [{ auth: { mode: 'try' } }, true], + [{ something: undefined }, false], + [{ auth: { something: undefined } }, false], + [{ auth: null }, true], + [{ auth: undefined }, true], + [{}, true], + [{ auth: true }, true], + [{ auth: 123 }, false] + ], done); + }); + }); + + it('validates required alternatives', function (done) { + + var schema = { + a: Joi.alternatives( + Joi.string().required(), + Joi.boolean().required() + ) + }; + + Helper.validate(schema, [ + [{ a: null }, false], + [{ a: undefined }, true], + [{}, true], + [{ a: true }, true], + [{ a: 'true' }, true], + [{ a: 123 }, false], + [{ a: { c: 1 } }, false], + [{ b: undefined }, false] + ], done); + }); + + it('validates required [] alternatives', function (done) { + + var schema = { + a: [ + Joi.string().required(), + Joi.boolean().required() + ] + }; + + Helper.validate(schema, [ + [{ a: null }, false], + [{ a: undefined }, true], + [{}, true], + [{ a: true }, true], + [{ a: 'true' }, true], + [{ a: 123 }, false], + [{ a: { c: 1 } }, false], + [{ b: undefined }, false] + ], done); + }); + + it('validates an array of string with valid', function (done) { + + var schema = { + brand: Joi.array().includes(Joi.string().valid('amex', 'visa')) + }; + + Helper.validate(schema, [ + [{ brand: ['amex'] }, true], + [{ brand: ['visa', 'mc'] }, false] + ], done); + }); + + it('validates pre and post convert value', function (done) { + + var schema = Joi.number().valid(5); + + Helper.validate(schema, [ + [5, true], + ['5', true] + ], done); + }); + + it('does not change object when validation fails', function (done) { + + var schema = Joi.object({ + a: Joi.number().valid(2) + }); + + var obj = { + a: '5' + }; + + schema.validate(obj, function (err, value) { + + expect(err).to.exist(); + expect(value.a).to.equal('5'); + done(); + }); + }); + + it('does not set optional keys when missing', function (done) { + + var schema = Joi.object({ + a: Joi.number() + }); + + var obj = {}; + + schema.validate(obj, function (err, value) { + + expect(err).to.not.exist(); + expect(value.hasOwnProperty('a')).to.equal(false); + done(); + }); + }); + + it('invalidates pre and post convert value', function (done) { + + var schema = Joi.number().invalid(5); + + Helper.validate(schema, [ + [5, false], + ['5', false] + ], done); + }); + + it('invalidates missing peers', function (done) { + + var schema = Joi.object({ + username: Joi.string(), + password: Joi.string() + }).with('username', 'password').without('password', 'access_token'); + + schema.validate({ username: 'bob' }, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('validates config where the root item is a joi type', function (done) { + + Joi.boolean().allow(null).validate(true, function (err, value) { + + expect(err).to.be.null(); + Joi.object().validate({ auth: { mode: 'try' } }, function (err, value) { + + expect(err).to.be.null(); + + Joi.object().validate(true, function (err, value) { + + expect(err.message).to.contain('value must be an object'); + + Joi.string().validate(true, function (err, value) { + + expect(err.message).to.contain('value must be a string'); + + Joi.string().email().validate('test@test.com', function (err, value) { + + expect(err).to.be.null(); + Joi.object({ param: Joi.string().required() }).validate({ param: 'item' }, function (err, value) { + + expect(err).to.be.null(); + done(); + }); + }); + }); + }); + }); + }); + }); + + it('converts string to number', function (done) { + + var schema = Joi.object({ + a: Joi.number() + }); + + var input = { a: '5' }; + schema.validate(input, function (err, value) { + + expect(err).to.be.null(); + expect(value.a).to.equal(5); + expect(input.a).to.equal('5'); + done(); + }); + }); + + it('allows unknown keys in objects if no schema was given', function (done) { + + Joi.object().validate({ foo: 'bar' }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('fails on unknown keys in objects if a schema was given', function (done) { + + Joi.object({}).validate({ foo: 'bar' }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('foo is not allowed'); + + Joi.compile({}).validate({ foo: 'bar' }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('foo is not allowed'); + + Joi.compile({ other: Joi.number() }).validate({ foo: 'bar' }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('foo is not allowed'); + + done(); + }); + }); + }); + }); + + it('validates an unknown option', function (done) { + + var config = { + auth: Joi.object({ + mode: Joi.string().valid('required', 'optional', 'try').allow(null) + }).allow(null) + }; + + Joi.compile(config).validate({ auth: { unknown: true } }, function (err, value) { + + expect(err).to.not.be.null(); + expect(err.message).to.contain('unknown is not allowed'); + + Joi.compile(config).validate({ something: false }, function (err, value) { + + expect(err).to.not.be.null(); + expect(err.message).to.contain('something is not allowed'); + + done(); + }); + }); + }); + + it('validates required key with multiple options', function (done) { + + var config = { + module: Joi.alternatives([ + Joi.object({ + compile: Joi.func().required(), + execute: Joi.func() + }), + Joi.string() + ]).required() + }; + + Joi.compile(config).validate({}, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.contain('module is required'); + + Joi.compile(config).validate({ module: 'test' }, function (err, value) { + + expect(err).to.be.null(); + + Joi.compile(config).validate({ module: {} }, function (err, value) { + + expect(err).to.not.be.null(); + expect(err.message).to.contain('compile is required'); + expect(err.message).to.contain('module must be a string'); + + Joi.compile(config).validate({ module: { compile: function () { } } }, function (err, value) { + + expect(err).to.be.null(); + done(); + }); + }); + }); + }); + }); + + it('validates key with required alternatives', function (done) { + + var config = { + module: Joi.alt().try( + Joi.object({ + compile: Joi.func().required(), + execute: Joi.func() + }).required(), + Joi.string().required() + ) + }; + + Joi.compile(config).validate({}, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('validates required key with alternatives', function (done) { + + var config = { + module: Joi.alt().try( + Joi.object({ + compile: Joi.func().required(), + execute: Joi.func() + }), + Joi.string() + ).required() + }; + + Joi.compile(config).validate({}, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.contain('module is required'); + done(); + }); + }); + + it('does not require optional numbers', function (done) { + + var config = { + position: Joi.number(), + suggestion: Joi.string() + }; + + Joi.compile(config).validate({ suggestion: 'something' }, function (err, value) { + + expect(err).to.be.null(); + + Joi.compile(config).validate({ position: 1 }, function (err, value) { + + expect(err).to.be.null(); + done(); + }) + }); + }); + + it('does not require optional objects', function (done) { + + var config = { + position: Joi.number(), + suggestion: Joi.object() + }; + + Joi.compile(config).validate({ suggestion: {} }, function (err, value) { + + expect(err).to.be.null(); + + Joi.compile(config).validate({ position: 1 }, function (err, value) { + + expect(err).to.be.null(); + done(); + }); + }); + }); + + it('validates object successfully when config has an array of types', function (done) { + + var schema = { + f: [Joi.number(), Joi.boolean()], + g: [Joi.string(), Joi.object()] + }; + + var obj = { + f: true, + g: 'test' + }; + + Joi.compile(schema).validate(obj, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('validates object successfully when config allows for optional key and key is missing', function (done) { + + var schema = { + h: Joi.number(), + i: Joi.string(), + j: Joi.object() + }; + + var obj = { + h: 12, + i: 'test' + }; + + Joi.compile(schema).validate(obj, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('fails validation', function (done) { + + var schema = { + a: Joi.number().min(0).max(3), + b: Joi.string().valid('a', 'b', 'c'), + c: Joi.string().email().optional() + }; + + var obj = { + a: 10, + b: 'a', + c: 'joe@example.com' + }; + + Joi.compile(schema).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('fails validation when the wrong types are supplied', function (done) { + + var schema = { + a: Joi.number().min(0).max(3), + b: Joi.string().valid('a', 'b', 'c'), + c: Joi.string().email().optional() + }; + + var obj = { + a: 'a', + b: 'a', + c: 'joe@example.com' + }; + + Joi.compile(schema).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('fails validation when missing a required parameter', function (done) { + + var obj = { + c: 10 + }; + + Joi.compile({ a: Joi.string().required() }).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('fails validation when missing a required parameter within an object config', function (done) { + + var obj = { + a: {} + }; + + Joi.compile({ a: Joi.object({ b: Joi.string().required() }) }).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('fails validation when parameter is required to be an object but is given as string', function (done) { + + var obj = { + a: 'a string' + }; + + Joi.compile({ a: Joi.object({ b: Joi.string().required() }) }).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('validates when parameter is required to be an object and is given correctly as a json string', function (done) { + + var schema = { + a: Joi.object({ + b: Joi.string().required() + }) + }; + + var input = { + a: '{"b":"string"}' + }; + + Joi.validate(input, schema, function (err, value) { + + expect(err).to.not.exist(); + expect(input.a).to.equal('{"b":"string"}'); + expect(value.a.b).to.equal('string'); + done(); + }); + }); + + it('fails validation when parameter is required to be an object but is given as a json string that is incorrect (number instead of string)', function (done) { + + var obj = { + a: '{"b":2}' + }; + + Joi.object({ a: Joi.object({ b: Joi.string().required() }) }).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('fails validation when parameter is required to be an Array but is given as string', function (done) { + + var obj = { + a: "an array" + }; + + Joi.object({ a: Joi.array() }).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('validates when parameter is required to be an Array and is given correctly as a json string', function (done) { + + var obj = { + a: '[1,2]' + }; + + Joi.object({ a: Joi.array() }).validate(obj, function (err, value) { + + expect(err).to.be.null(); + done(); + }); + }); + + it('fails validation when parameter is required to be an Array but is given as a json that is incorrect (object instead of array)', function (done) { + + var obj = { + a: '{"b":2}' + }; + + Joi.object({ a: Joi.object({ b: Joi.string().required() }) }).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('fails validation when config is an array and fails', function (done) { + + var schema = { + d: [Joi.string(), Joi.boolean()], + e: [Joi.number(), Joi.object()] + }; + + var obj = { + d: 10, + e: 'a' + }; + + Joi.compile(schema).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('fails validation when config is an array and fails with extra keys', function (done) { + + var schema = { + d: [Joi.string(), Joi.boolean()], + e: [Joi.number(), Joi.object()] + }; + + var obj = { + a: 10, + b: 'a' + }; + + Joi.compile(schema).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('fails validation with extra keys', function (done) { + + var schema = { + a: Joi.number(), + }; + + var obj = { + a: 1, + b: 'a', + }; + + Joi.compile(schema).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('validates missing optional key with string condition', function (done) { + + var schema = { + key: Joi.string().alphanum(false).min(8) + }; + + Joi.compile(schema).validate({}, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('validates with extra keys and remove them when stripUnknown is set', function (done) { + + var schema = { + a: Joi.number().min(0).max(3), + b: Joi.string().valid('a', 'b', 'c'), + c: Joi.string().email().optional() + }; + + var obj = { + a: 1, + b: 'a', + d: 'c' + }; + + Joi.validate(obj, schema, { stripUnknown: true, allowUnknown: true }, function (err, value) { + + expect(err).to.be.null(); + expect(value).to.deep.equal({ a: 1, b: 'a' }); + done(); + }); + }); + + it('fails to validate with incorrect property when asked to strip unkown keys without aborting early', function (done) { + + var schema = { + a: Joi.number().min(0).max(3), + b: Joi.string().valid('a', 'b', 'c'), + c: Joi.string().email().optional() + }; + + var obj = { + a: 1, + b: 'f', + d: 'c' + }; + + Joi.validate(obj, schema, { stripUnknown: true, abortEarly: false }, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('should pass validation with extra keys when allowUnknown is set', function (done) { + + var schema = { + a: Joi.number().min(0).max(3), + b: Joi.string().valid('a', 'b', 'c'), + c: Joi.string().email().optional() + }; + + var obj = { + a: 1, + b: 'a', + d: 'c' + }; + + Joi.validate(obj, schema, { allowUnknown: true }, function (err, value) { + + expect(err).to.be.null(); + expect(value).to.deep.equal({ a: 1, b: 'a', d: 'c' }); + done(); + }); + }); + + it('should pass validation with extra keys set', function (done) { + + var localConfig = Joi.object({ + a: Joi.number().min(0).max(3), + b: Joi.string().valid('a', 'b', 'c'), + }).options({ allowUnknown: true }); + + var obj = { + a: 1, + b: 'a', + d: 'c' + }; + + localConfig.validate(obj, function (err, value) { + + expect(err).to.be.null(); + expect(value).to.deep.equal({ a: 1, b: 'a', d: 'c' }); + + localConfig.validate(value, function (err, value) { + + expect(err).to.be.null(); + expect(value).to.deep.equal({ a: 1, b: 'a', d: 'c' }); + done(); + }); + }); + }); + + + it('should pass validation with extra keys and remove them when skipExtraKeys is set locally', function (done) { + + var localConfig = Joi.object({ + a: Joi.number().min(0).max(3), + b: Joi.string().valid('a', 'b', 'c') + }).options({ stripUnknown: true, allowUnknown: true }); + + var obj = { + a: 1, + b: 'a', + d: 'c' + }; + + localConfig.validate(obj, function (err, value) { + + expect(err).to.be.null(); + expect(value).to.deep.equal({ a: 1, b: 'a' }); + + localConfig.validate(value, function (err, value) { + + expect(err).to.be.null(); + expect(value).to.deep.equal({ a: 1, b: 'a' }); + done(); + }); + }); + }); + + it('should work when the skipFunctions setting is enabled', function (done) { + + var schema = Joi.object({ username: Joi.string() }).options({ skipFunctions: true }); + var input = { username: 'test', func: function () { } }; + Joi.validate(input, schema, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('should work when the skipFunctions setting is disabled', function (done) { + + var schema = { username: Joi.string() }; + var input = { username: 'test', func: function () { } }; + + Joi.validate(input, schema, { skipFunctions: false }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.contain('func is not allowed'); + done(); + }); + }); + + it('should not convert values when convert is false', function (done) { + + var schema = { + arr: Joi.array().includes(Joi.string()) + }; + + var input = { arr: 'foo' }; + Joi.validate(input, schema, { convert: false }, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('full errors when abortEarly is false', function (done) { + + var schema = { + a: Joi.string(), + b: Joi.string() + }; + + var input = { a: 1, b: 2 }; + + Joi.validate(input, schema, function (errOne, value) { + + Joi.validate(input, schema, { abortEarly: false }, function (errFull, value) { + + expect(errOne).to.exist(); + expect(errFull).to.exist(); + expect(errFull.details.length).to.be.greaterThan(errOne.details.length); + done(); + }); + }); + }); + + it('validates using the root any object', function (done) { + + var any = Joi; + any.validate('abc', function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('validates using the root any object (no callback)', function (done) { + + var any = Joi; + var result = any.validate('abc'); + expect(result.error).to.not.exist(); + expect(result.value).to.equal('abc'); + done(); + }); + + it('accepts no options', function (done) { + + Joi.validate('test', Joi.string(), function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('accepts no options (no callback)', function (done) { + + var result = Joi.validate('test', Joi.string()); + expect(result.error).to.not.exist(); + expect(result.value).to.equal('test'); + done(); + }); + + it('accepts options', function (done) { + + Joi.validate('5', Joi.number(), { convert: false }, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('accepts options (no callback)', function (done) { + + var result = Joi.validate('5', Joi.number(), { convert: false }); + expect(result.error).to.exist(); + done(); + }); + + it('accepts null options', function (done) { + + Joi.validate('test', Joi.string(), null, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('accepts undefined options', function (done) { + + Joi.validate('test', Joi.string(), undefined, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + describe('#describe', function () { + + var schema = Joi.object({ + sub: { + email: Joi.string().email(), + date: Joi.date(), + child: Joi.object({ + alphanum: Joi.string().alphanum() + }), + }, + min: [Joi.number(), Joi.string().min(3)], + max: Joi.string().max(3), + required: Joi.string().required(), + xor: Joi.string(), + renamed: Joi.string().valid('456'), + notEmpty: Joi.string().required().description('a').notes('b').tags('c') + }).rename('renamed', 'required').without('required', 'xor').without('xor', 'required'); + + var result = { + type: 'object', + children: { + sub: { + type: 'object', + children: { + email: { + type: 'string', + invalids: [''], + rules: [{ name: 'email' }] + }, + date: { + type: 'date' + }, + child: { + type: 'object', + children: { + alphanum: { + type: 'string', + invalids: [''], + rules: [{ name: 'alphanum' }] + } + } + } + } + }, + min: { + type: 'alternatives', + alternatives: [ + { + type: 'number', + invalids: [Infinity, -Infinity] + }, + { + type: 'string', + invalids: [''], + rules: [{ name: 'min', arg: 3 }] + } + ] + }, + max: { + type: 'string', + invalids: [''], + rules: [{ name: 'max', arg: 3 }] + }, + required: { + type: 'string', + flags: { + presence: 'required' + }, + invalids: [ ''] + }, + xor: { + type: 'string', + invalids: [''] + }, + renamed: { + type: 'string', + flags: { + allowOnly: true + }, + valids: ['456'], + invalids: [''] + }, + notEmpty: { + type: 'string', + flags: { + presence: 'required' + }, + description: 'a', + notes: ['b'], + tags: ['c'], + invalids: [''] + } + }, + dependencies: [ + { + type: 'without', + key: 'required', + peers: ['xor'] + }, + { + type: 'without', + key: 'xor', + peers: ['required'] + } + ] + }; + + it('describes schema (direct)', function (done) { + + var description = schema.describe(); + expect(description).to.deep.equal(result); + done(); + }); + + it('describes schema (root)', function (done) { + + var description = Joi.describe(schema); + expect(description).to.deep.equal(result); + done(); + }); + + it('describes schema (any)', function (done) { + + var any = Joi; + var description = any.describe(); + expect(description).to.deep.equal({ + type: 'any' + }); + done(); + }); + + it('describes schema without invalids', function (done) { + + var description = Joi.allow(null).describe(); + expect(description.invalids).to.not.exist(); + done(); + }) + }); + + describe('#assert', function () { + + it('throws on invalid value', function (done) { + + expect(function () { + + Joi.assert('x', Joi.number()); + }).to.throw('"x"\n\u001b[31m\n[1] value must be a number\u001b[0m'); + done(); + }); + + it('does not throw on valid value', function (done) { + + expect(function () { + + Joi.assert('4', Joi.number()); + }).to.not.throw(); + done(); + }); + + it('throws on invalid value with message', function (done) { + + expect(function () { + + Joi.assert('x', Joi.number(), 'the reason is'); + }).to.throw('the reason is "x"\n\u001b[31m\n[1] value must be a number\u001b[0m'); + done(); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/number.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/number.js new file mode 100755 index 0000000..84d05b1 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/number.js @@ -0,0 +1,589 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('number', function () { + + it('fails on boolean', function (done) { + + var schema = Joi.number(); + Helper.validate(schema, [ + [true, false], + [false, false] + ], done); + }); + + describe('#validate', function () { + + it('should, by default, allow undefined', function (done) { + + Helper.validate(Joi.number(), [ + [undefined, true] + ], done); + }); + + it('should, when .required(), deny undefined', function (done) { + + Helper.validate(Joi.number().required(), [ + [undefined, false] + ], done); + }); + + it('should return false for denied value', function (done) { + + var text = Joi.number().invalid(50); + text.validate(50, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('should validate integer', function (done) { + + var t = Joi.number().integer(); + Helper.validate(t, [ + [100, true], + [0, true], + [null, false], + [1.02, false], + [0.01, false] + ], done); + }); + + it('should return false for Infinity', function(done) { + + var t = Joi.number(); + Helper.validate(t, [ + [Infinity, false], + [-Infinity, false] + ], done); + }); + + it('should return true for allowed Infinity', function(done) { + + var t = Joi.number().allow(Infinity, -Infinity); + Helper.validate(t, [ + [Infinity, true], + [-Infinity, true] + ], done); + }); + + it('can accept string numbers', function (done) { + + var t = Joi.number(); + Helper.validate(t, [ + ['1', true], + ['100', true], + ['1e3', true], + ['1 some text', false], + ['\t\r', false], + [' ', false], + [' 2', true], + ['\t\r43', true], + ['43 ', true], + ['', false] + ], done); + }); + + it('required validates correctly', function (done) { + + var t = Joi.number().required(); + Helper.validate(t, [ + [NaN, false], + ['100', true] + ], done); + }); + + it('converts an object string to a number', function (done) { + + var config = { a: Joi.number() }; + var obj = { a: '123' }; + + Joi.compile(config).validate(obj, function (err, value) { + + expect(err).to.not.exist(); + expect(value.a).to.equal(123); + done(); + }); + }); + + it('converts a string to a number', function (done) { + + Joi.number().validate('1', function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.equal(1); + done(); + }); + }); + + it('errors on null', function (done) { + + Joi.number().validate(null, function (err, value) { + + expect(err).to.exist(); + expect(value).to.equal(null); + done(); + }); + }); + + it('should handle combination of min and max', function (done) { + + var rule = Joi.number().min(8).max(10); + Helper.validate(rule, [ + [1, false], + [11, false], + [8, true], + [9, true], + [null, false] + ], done); + }); + + it('should handle combination of min, max, and null allowed', function (done) { + + var rule = Joi.number().min(8).max(10).allow(null); + Helper.validate(rule, [ + [1, false], + [11, false], + [8, true], + [9, true], + [null, true] + ], done); + }); + + it('should handle combination of min and positive', function (done) { + + var rule = Joi.number().min(-3).positive(); + Helper.validate(rule, [ + [1, true], + [-2, false], + [8, true], + [null, false] + ], done); + }); + + it('should handle combination of max and positive', function (done) { + + var rule = Joi.number().max(5).positive(); + Helper.validate(rule, [ + [4, true], + [-2, false], + [8, false], + [null, false] + ], done); + }); + + it('should handle combination of min and negative', function (done) { + + var rule = Joi.number().min(-3).negative(); + Helper.validate(rule, [ + [4, false], + [-2, true], + [-4, false], + [null, false] + ], done); + }); + + it('should handle combination of negative and positive', function (done) { + + var rule = Joi.number().negative().positive(); + Helper.validate(rule, [ + [4, false], + [-2, false], + [0, false], + [null, false] + ], done); + }); + + it('should handle combination of negative and allow', function (done) { + + var rule = Joi.number().negative().allow(1); + Helper.validate(rule, [ + [1, true], + [-10, true], + [8, false], + [0, false], + [null, false] + ], done); + }); + + it('should handle combination of positive and allow', function (done) { + + var rule = Joi.number().positive().allow(-1); + Helper.validate(rule, [ + [1, true], + [-1, true], + [8, true], + [-10, false], + [null, false] + ], done); + }); + + it('should handle combination of positive, allow, and null allowed', function (done) { + + var rule = Joi.number().positive().allow(-1).allow(null); + Helper.validate(rule, [ + [1, true], + [-1, true], + [8, true], + [-10, false], + [null, true] + ], done); + }); + + it('should handle combination of negative, allow, and null allowed', function (done) { + + var rule = Joi.number().negative().allow(1).allow(null); + Helper.validate(rule, [ + [1, true], + [-10, true], + [8, false], + [0, false], + [null, true] + ], done); + }); + + it('should handle combination of positive, allow, null allowed, and invalid', function (done) { + + var rule = Joi.number().positive().allow(-1).allow(null).invalid(1); + Helper.validate(rule, [ + [1, false], + [-1, true], + [8, true], + [-10, false], + [null, true] + ], done); + }); + + it('should handle combination of negative, allow, null allowed, and invalid', function (done) { + + var rule = Joi.number().negative().allow(1).allow(null).invalid(-5); + Helper.validate(rule, [ + [1, true], + [-10, true], + [-5, false], + [8, false], + [0, false], + [null, true] + ], done); + }); + + it('should handle combination of min, max, and allow', function (done) { + + var rule = Joi.number().min(8).max(10).allow(1); + Helper.validate(rule, [ + [1, true], + [11, false], + [8, true], + [9, true], + [null, false] + ], done); + }); + + it('should handle combination of min, max, allow, and null allowed', function (done) { + + var rule = Joi.number().min(8).max(10).allow(1).allow(null); + Helper.validate(rule, [ + [1, true], + [11, false], + [8, true], + [9, true], + [null, true] + ], done); + }); + + it('should handle combination of min, max, allow, and invalid', function (done) { + + var rule = Joi.number().min(8).max(10).allow(1).invalid(9); + Helper.validate(rule, [ + [1, true], + [11, false], + [8, true], + [9, false], + [null, false] + ], done); + }); + + it('should handle combination of min, max, allow, invalid, and null allowed', function (done) { + + var rule = Joi.number().min(8).max(10).allow(1).invalid(9).allow(null); + Helper.validate(rule, [ + [1, true], + [11, false], + [8, true], + [9, false], + [null, true] + ], done); + }); + + it('should handle combination of min, max, and integer', function (done) { + + var rule = Joi.number().min(8).max(10).integer(); + Helper.validate(rule, [ + [1, false], + [11, false], + [8, true], + [9, true], + [9.1, false], + [null, false] + ], done); + }); + + it('should handle combination of min, max, integer, and allow', function (done) { + + var rule = Joi.number().min(8).max(10).integer().allow(9.1); + Helper.validate(rule, [ + [1, false], + [11, false], + [8, true], + [9, true], + [9.1, true], + [9.2, false], + [null, false] + ], done); + }); + + it('should handle combination of min, max, integer, allow, and invalid', function (done) { + + var rule = Joi.number().min(8).max(10).integer().allow(9.1).invalid(8); + Helper.validate(rule, [ + [1, false], + [11, false], + [8, false], + [9, true], + [9.1, true], + [9.2, false], + [null, false] + ], done); + }); + + it('should handle combination of min, max, integer, allow, invalid, and null allowed', function (done) { + + var rule = Joi.number().min(8).max(10).integer().allow(9.1).invalid(8).allow(null); + Helper.validate(rule, [ + [1, false], + [11, false], + [8, false], + [9, true], + [9.1, true], + [9.2, false], + [null, true] + ], done); + }); + + it('should handle limiting the number of decimal places', function (done) { + + var rule = Joi.number().precision(1).options({ convert: false }); + Helper.validate(rule, [ + [1, true], + [9.1, true], + [9.21, false], + [9.9999, false], + [9.999e99, true], + [9.9e-99, false], + [9.9e3, true], + [null, false] + ], done); + }); + + it('should handle combination of min, max, integer, allow, invalid, null allowed and precision', function (done) { + + var rule = Joi.number().min(8).max(10).integer().allow(9.1).invalid(8).allow(null).precision(1).options({ convert: false }); + Helper.validate(rule, [ + [1, false], + [11, false], + [8, false], + [9, true], + [9.1, true], + [9.11, false], + [9.2, false], + [9.22, false], + [null, true] + ], done); + }); + + it('should handle combination of greater and less', function (done) { + + var rule = Joi.number().greater(5).less(10); + Helper.validate(rule, [ + [0, false], + [11, false], + [5, false], + [10, false], + [8, true], + [5.01, true], + [9.99, true], + [null, false] + ], done); + }); + + it('should handle combination of greater, less, and integer', function (done) { + + var rule = Joi.number().integer().greater(5).less(10); + Helper.validate(rule, [ + [0, false], + [11, false], + [5, false], + [10, false], + [6, true], + [9, true], + [5.01, false], + [9.99, false] + ], done); + }); + + it('should handle combination of greater, less, and null allowed', function (done) { + + var rule = Joi.number().greater(5).less(10).allow(null); + Helper.validate(rule, [ + [0, false], + [11, false], + [5, false], + [10, false], + [8, true], + [5.01, true], + [9.99, true], + [null, true] + ], done); + }); + + it('should handle combination of greater, less, invalid, and allow', function (done) { + + var rule = Joi.number().greater(5).less(10).invalid(6).allow(-3); + Helper.validate(rule, [ + [0, false], + [11, false], + [5, false], + [10, false], + [6, false], + [8, true], + [5.01, true], + [9.99, true], + [-3, true], + [null, false] + ], done); + }); + }); + + it('should instantiate separate copies on invocation', function (done) { + + var result1 = Joi.number().min(5); + var result2 = Joi.number().max(5); + + expect(Object.keys(result1)).to.not.equal(Object.keys(result2)); + done(); + }); + + it('should show resulting object with #valueOf', function (done) { + + var result = Joi.number().min(5); + expect(result.valueOf()).to.exist(); + done(); + }); + + describe('error message', function () { + + it('should display correctly for int type', function (done) { + + var t = Joi.number().integer(); + Joi.compile(t).validate('1.1', function (err, value) { + + expect(err.message).to.contain('integer'); + done(); + }); + }); + }); + + describe('#min', function () { + + it('throws when limit is not a number', function (done) { + + expect(function () { + + Joi.number().min('a'); + }).to.throw('limit must be an integer'); + done(); + }); + + it('supports 64bit numbers', function (done) { + + var schema = Joi.number().min(1394035612500); + var input = 1394035612552 + + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.equal(input); + done(); + }); + }); + }); + + describe('#max', function () { + + it('throws when limit is not a number', function (done) { + + expect(function () { + + Joi.number().max('a'); + }).to.throw('limit must be an integer'); + done(); + }); + }); + + describe('#precision', function (done) { + + it('converts numbers', function (done) { + + var rule = Joi.number().precision(4); + Helper.validate(rule, [ + [1.5, true, null, 1.5], + [0.12345, true, null, 0.1235], + [123456, true, null, 123456], + [123456.123456, true, null, 123456.1235], + ["123456.123456", true, null, 123456.1235], + ["abc", false], + [NaN, false] + ], done); + }); + }); + + describe('#describe', function () { + + it('should describe a minimum of 0', function (done) { + + var schema = Joi.number().min(0); + expect(schema.describe()).to.deep.equal({ + "type": "number", + "invalids": [Infinity, -Infinity], + "rules": [ + { + "name": "min", + "arg": 0 + } + ] + }); + done(); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/object.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/object.js new file mode 100755 index 0000000..021401b --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/object.js @@ -0,0 +1,1058 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('object', function () { + + it('converts a json string to an object', function (done) { + + Joi.object().validate('{"hi":true}', function (err, value) { + + expect(err).to.not.exist(); + expect(value.hi).to.equal(true); + done(); + }); + }); + + it('errors on non-object string', function (done) { + + Joi.object().validate('a string', function (err, value) { + + expect(err).to.exist(); + expect(value).to.equal('a string'); + done(); + }); + }); + + it('validates an object', function (done) { + + var schema = Joi.object().required(); + Helper.validate(schema, [ + [{}, true], + [{ hi: true }, true], + ['', false] + ], done); + }); + + it('return object reference when no rules specified', function (done) { + + var schema = Joi.object({ + a: Joi.object() + }); + + var item = { x: 5 }; + schema.validate({ a: item }, function (err, value) { + + expect(value.a).to.equal(item); + done(); + }); + }); + + it('retains ignored values', function (done) { + + var schema = Joi.object(); + schema.validate({ a: 5 }, function (err, value) { + + expect(value.a).to.equal(5); + done(); + }); + }); + + it('retains skipped values', function (done) { + + var schema = Joi.object({ b: 5 }).unknown(true); + schema.validate({ b: '5', a: 5 }, function (err, value) { + + expect(value.a).to.equal(5); + expect(value.b).to.equal(5); + done(); + }); + }); + + it('allows any key when schema is undefined', function (done) { + + Joi.object().validate({ a: 4 }, function (err, value) { + + expect(err).to.not.exist(); + + Joi.object(undefined).validate({ a: 4 }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + }); + + it('allows any key when schema is null', function (done) { + + Joi.object(null).validate({ a: 4 }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('throws on invalid object schema', function (done) { + + expect(function () { + + Joi.object(4); + }).to.throw('Object schema must be a valid object'); + done(); + }); + + it('throws on joi object schema', function (done) { + + expect(function () { + + Joi.object(Joi.object()); + }).to.throw('Object schema cannot be a joi schema'); + done(); + }); + + it('skips conversion when value is undefined', function (done) { + + Joi.object({ a: Joi.object() }).validate(undefined, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.not.exist(); + done(); + }); + }); + + it('errors on array', function (done) { + + Joi.object().validate([1, 2, 3], function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('should prevent extra keys from existing by default', function (done) { + + var schema = Joi.object({ item: Joi.string().required() }).required(); + Helper.validate(schema, [ + [{ item: 'something' }, true], + [{ item: 'something', item2: 'something else' }, false], + ['', false] + ], done); + }); + + it('should validate count when min is set', function (done) { + + var schema = Joi.object().min(3); + Helper.validate(schema, [ + [{ item: 'something' }, false], + [{ item: 'something', item2: 'something else' }, false], + [{ item: 'something', item2: 'something else', item3: 'something something else' }, true], + ['', false] + ], done); + }); + + it('should validate count when max is set', function (done) { + + var schema = Joi.object().max(2); + Helper.validate(schema, [ + [{ item: 'something' }, true], + [{ item: 'something', item2: 'something else' }, true], + [{ item: 'something', item2: 'something else', item3: 'something something else' }, false], + ['', false] + ], done); + }); + + it('should validate count when min and max is set', function (done) { + + var schema = Joi.object().max(3).min(2); + Helper.validate(schema, [ + [{ item: 'something' }, false], + [{ item: 'something', item2: 'something else' }, true], + [{ item: 'something', item2: 'something else', item3: 'something something else' }, true], + [{ item: 'something', item2: 'something else', item3: 'something something else', item4: 'item4' }, false], + ['', false] + ], done); + }); + + it('should validate count when length is set', function (done) { + + var schema = Joi.object().length(2); + Helper.validate(schema, [ + [{ item: 'something' }, false], + [{ item: 'something', item2: 'something else' }, true], + [{ item: 'something', item2: 'something else', item3: 'something something else' }, false], + ['', false] + ], done); + }); + + it('should validate constructor when type is set', function (done) { + + var schema = Joi.object().type(RegExp); + Helper.validate(schema, [ + [{ item: 'something' }, false], + ['', false], + [new Date(), false], + [/abcd/, true], + [new RegExp(), true] + ], done); + }); + + it('should traverse an object and validate all properties in the top level', function (done) { + + var schema = Joi.object({ + num: Joi.number() + }); + + Helper.validate(schema, [ + [{ num: 1 }, true], + [{ num: [1, 2, 3] }, false] + ], done); + }); + + it('should traverse an object and child objects and validate all properties', function (done) { + + var schema = Joi.object({ + num: Joi.number(), + obj: Joi.object({ + item: Joi.string() + }) + }); + + Helper.validate(schema, [ + [{ num: 1 }, true], + [{ num: [1, 2, 3] }, false], + [{ num: 1, obj: { item: 'something' } }, true], + [{ num: 1, obj: { item: 123 } }, false] + ], done); + }); + + it('should traverse an object several levels', function (done) { + + var schema = Joi.object({ + obj: Joi.object({ + obj: Joi.object({ + obj: Joi.object({ + item: Joi.boolean() + }) + }) + }) + }); + + Helper.validate(schema, [ + [{ num: 1 }, false], + [{ obj: {} }, true], + [{ obj: { obj: {} } }, true], + [{ obj: { obj: { obj: {} } } }, true], + [{ obj: { obj: { obj: { item: true } } } }, true], + [{ obj: { obj: { obj: { item: 10 } } } }, false] + ], done); + }); + + it('should traverse an object several levels with required levels', function (done) { + + var schema = Joi.object({ + obj: Joi.object({ + obj: Joi.object({ + obj: Joi.object({ + item: Joi.boolean() + }) + }).required() + }) + }); + + Helper.validate(schema, [ + [null, false], + [undefined, true], + [{}, true], + [{ obj: {} }, false], + [{ obj: { obj: {} } }, true], + [{ obj: { obj: { obj: {} } } }, true], + [{ obj: { obj: { obj: { item: true } } } }, true], + [{ obj: { obj: { obj: { item: 10 } } } }, false] + ], done); + }); + + it('should traverse an object several levels with required levels (without Joi.obj())', function (done) { + + var schema = { + obj: { + obj: { + obj: { + item: Joi.boolean().required() + } + } + } + }; + + Helper.validate(schema, [ + [null, false], + [undefined, true], + [{}, true], + [{ obj: {} }, true], + [{ obj: { obj: {} } }, true], + [{ obj: { obj: { obj: {} } } }, false], + [{ obj: { obj: { obj: { item: true } } } }, true], + [{ obj: { obj: { obj: { item: 10 } } } }, false] + ], done); + }); + + it('errors on unknown keys when functions allows', function (done) { + + var schema = Joi.object({ a: Joi.number() }).options({ skipFunctions: true }); + var obj = { a: 5, b: 'value' }; + schema.validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('validates both valid() and with()', function (done) { + + var schema = Joi.object({ + first: Joi.valid('value'), + second: Joi.any() + }).with('first', 'second'); + + Helper.validate(schema, [ + [{ first: 'value' }, false] + ], done); + }); + + describe('#keys', function () { + + it('allows any key', function (done) { + + var a = Joi.object({ a: 4 }); + var b = a.keys(); + a.validate({ b: 3 }, function (err, value) { + + expect(err).to.exist(); + b.validate({ b: 3 }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + }); + + it('forbids all keys', function (done) { + + var a = Joi.object(); + var b = a.keys({}); + a.validate({ b: 3 }, function (err, value) { + + expect(err).to.not.exist(); + b.validate({ b: 3 }, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + }); + + it('adds to existing keys', function (done) { + + var a = Joi.object({ a: 1 }); + var b = a.keys({ b: 2 }); + a.validate({ a: 1, b: 2 }, function (err, value) { + + expect(err).to.exist(); + b.validate({ a: 1, b: 2 }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + }); + }); + + describe('#unknown', function () { + + it('allows local unknown without applying to children', function (done) { + + var schema = Joi.object({ + a: { + b: Joi.number() + } + }).unknown(); + + Helper.validate(schema, [ + [{ a: { b: 5 } }, true], + [{ a: { b: 'x' } }, false], + [{ a: { b: 5 }, c: 'ignore' }, true], + [{ a: { b: 5, c: 'ignore' } }, false] + ], done); + }); + + it('forbids local unknown without applying to children', function (done) { + + var schema = Joi.object({ + a: Joi.object({ + b: Joi.number() + }).unknown() + }).options({ allowUnknown: false }); + + Helper.validate(schema, [ + [{ a: { b: 5 } }, true], + [{ a: { b: 'x' } }, false], + [{ a: { b: 5 }, c: 'ignore' }, false], + [{ a: { b: 5, c: 'ignore' } }, true] + ], done); + }); + }); + + describe('#rename', function () { + + it('allows renaming multiple times with multiple enabled', function (done) { + + var schema = Joi.object({ + test: Joi.string() + }).rename('test1', 'test').rename('test2', 'test', { multiple: true }); + + Joi.compile(schema).validate({ test1: 'a', test2: 'b' }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('errors renaming multiple times with multiple disabled', function (done) { + + var schema = Joi.object({ + test: Joi.string() + }).rename('test1', 'test').rename('test2', 'test'); + + Joi.compile(schema).validate({ test1: 'a', test2: 'b' }, function (err, value) { + + expect(err.message).to.equal('value cannot rename child test2 because multiple renames are disabled and another key was already renamed to test'); + done(); + }); + }); + + it('errors multiple times when abortEarly is false', function (done) { + + Joi.object().rename('a', 'b').rename('c', 'b').rename('d', 'b').options({ abortEarly: false }).validate({ a: 1, c: 1, d: 1 }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('value cannot rename child c because multiple renames are disabled and another key was already renamed to b. value cannot rename child d because multiple renames are disabled and another key was already renamed to b'); + done(); + }); + }); + + it('aliases a key', function (done) { + + var schema = Joi.object({ + a: Joi.number(), + b: Joi.number() + }).rename('a', 'b', { alias: true }); + + var obj = { a: 10 }; + + Joi.compile(schema).validate(obj, function (err, value) { + + expect(err).to.not.exist(); + expect(value.a).to.equal(10); + expect(value.b).to.equal(10); + done(); + }); + }); + + it('with override disabled should not allow overwriting existing value', function (done) { + + var schema = Joi.object({ + test1: Joi.string() + }).rename('test', 'test1'); + + schema.validate({ test: 'b', test1: 'a' }, function (err, value) { + + expect(err.message).to.equal('value cannot rename child test because override is disabled and target test1 exists'); + done(); + }); + }); + + it('with override enabled should allow overwriting existing value', function (done) { + + var schema = Joi.object({ + test1: Joi.string() + }).rename('test', 'test1', { override: true }); + + schema.validate({ test: 'b', test1: 'a' }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('renames when data is nested in an array via includes', function (done) { + + var schema = { + arr: Joi.array().includes(Joi.object({ + one: Joi.string(), + two: Joi.string() + }).rename('uno', 'one').rename('dos', 'two')) + }; + + var data = { arr: [{ uno: '1', dos: '2' }] }; + Joi.object(schema).validate(data, function (err, value) { + + expect(err).to.not.exist(); + expect(value.arr[0].one).to.equal('1'); + expect(value.arr[0].two).to.equal('2'); + done(); + }); + }); + + it('applies rename and validation in the correct order regardless of key order', function (done) { + + var schema1 = Joi.object({ + a: Joi.number() + }).rename('b', 'a'); + + var input1 = { b: '5' }; + + schema1.validate(input1, function (err1, value1) { + + expect(err1).to.not.exist(); + expect(value1.b).to.not.exist(); + expect(value1.a).to.equal(5); + + var schema2 = Joi.object({ a: Joi.number(), b: Joi.any() }).rename('b', 'a'); + var input2 = { b: '5' }; + + schema2.validate(input2, function (err2, value2) { + + expect(err2).to.not.exist(); + expect(value2.b).to.not.exist(); + expect(value2.a).to.equal(5); + + done(); + }); + }); + }); + + it('sets the default value after key is renamed', function (done) { + + var schema = Joi.object({ + foo2: Joi.string().default('test') + }).rename('foo', 'foo2'); + + var input = {}; + + Joi.validate(input, schema, function (err, value) { + + expect(err).to.not.exist(); + expect(value.foo2).to.equal('test'); + + done(); + }); + }); + + it('should be able to rename keys that are empty strings', function (done) { + + var schema = Joi.object().rename('', 'notEmpty'); + var input = { + '': 'something' + }; + + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + expect(value['']).to.not.exist(); + expect(value.notEmpty).to.equal('something'); + done(); + }); + }); + + it('should not create new keys when they key in question does not exist', function (done) { + + var schema = Joi.object().rename('b', '_b'); + + var input = { + a: 'something' + }; + + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + expect(Object.keys(value)).to.include('a'); + expect(value.a).to.equal('something'); + done(); + }); + }); + }); + + describe('#describe', function () { + + it('return empty description when no schema defined', function (done) { + + var schema = Joi.object(); + var desc = schema.describe(); + expect(desc).to.deep.equal({ + type: 'object' + }); + done(); + }); + + it('respects the shallow parameter', function (done) { + + var schema = Joi.object({ + name: Joi.string(), + child: Joi.object({ + name: Joi.string() + }) + }); + + expect(Object.keys(schema.describe(true))).to.not.include('children'); + expect(Object.keys(schema.describe())).to.include('children'); + + done(); + }); + + it('describes patterns', function (done) { + + var schema = Joi.object({ + a: Joi.string() + }).pattern(/\w\d/i, Joi.boolean()); + + expect(schema.describe()).to.deep.equal({ + type: 'object', + children: { + a: { + type: 'string', + invalids: [''] + } + }, + patterns: [ + { + regex: '/\\w\\d/i', + rule: { + type: 'boolean' + } + } + ] + }); + + done(); + }); + }); + + describe('#length', function () { + + it('throws when length is not a number', function (done) { + + expect(function () { + + Joi.object().length('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + }); + + describe('#min', function () { + + it('throws when limit is not a number', function (done) { + + expect(function () { + + Joi.object().min('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + }); + + describe('#max', function () { + + it('throws when limit is not a number', function (done) { + + expect(function () { + + Joi.object().max('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + }); + + describe('#pattern', function () { + + it('validates unknown keys using a pattern', function (done) { + + var schema = Joi.object({ + a: Joi.number() + }).pattern(/\d+/, Joi.boolean()).pattern(/\w\w+/, 'x'); + + Joi.validate({ bb: 'y', 5: 'x' }, schema, { abortEarly: false }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('5 must be a boolean. bb must be one of x'); + + Helper.validate(schema, [ + [{ a: 5 }, true], + [{ a: 'x' }, false], + [{ b: 'x' }, false], + [{ bb: 'x' }, true], + [{ 5: 'x' }, false], + [{ 5: false }, true], + [{ 5: undefined }, true] + ], done) + }); + }); + + it('validates unknown keys using a pattern (nested)', function (done) { + + var schema = { + x: Joi.object({ + a: Joi.number() + }).pattern(/\d+/, Joi.boolean()).pattern(/\w\w+/, 'x') + }; + + Joi.validate({ x: { bb: 'y', 5: 'x' } }, schema, { abortEarly: false }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('5 must be a boolean. bb must be one of x'); + done(); + }); + }); + + it('errors when using a pattern on empty schema with unknown(false) and pattern mismatch', function (done) { + + var schema = Joi.object().pattern(/\d/, Joi.number()).unknown(false); + + Joi.validate({ a: 5 }, schema, { abortEarly: false }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('a is not allowed'); + done(); + }); + }); + + it('removes global flag from patterns', function (done) { + + var schema = Joi.object().pattern(/a/g, Joi.number()); + + Joi.validate({ a1: 5, a2: 6 }, schema, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + }); + + describe('#with', function () { + + it('should throw an error when a parameter is not a string', function (done) { + + try { + Joi.object().with({}); + var error = false; + } + catch (e) { + error = true; + } + expect(error).to.equal(true); + + try { + Joi.object().with(123); + error = false; + } + catch (e) { + error = true; + } + expect(error).to.equal(true); + done(); + }); + + it('should validate correctly when key is an empty string', function (done) { + + var schema = Joi.object().with('', 'b'); + Helper.validate(schema, [ + [{ c: 'hi', d: 'there' }, true], + ]); + done(); + }); + }); + + describe('#without', function () { + + it('should throw an error when a parameter is not a string', function (done) { + + try { + Joi.object().without({}); + var error = false; + } + catch (e) { + error = true; + } + expect(error).to.equal(true); + + try { + Joi.object().without(123); + error = false; + } + catch (e) { + error = true; + } + expect(error).to.equal(true); + + + done(); + }); + + it('should validate correctly when key is an empty string', function (done) { + + var schema = Joi.object().without('', 'b'); + Helper.validate(schema, [ + [{ a: 'hi', b: 'there' }, true] + ]); + done(); + }); + }); + + describe('#xor', function () { + + it('should throw an error when a parameter is not a string', function (done) { + + try { + Joi.object().xor({}); + var error = false; + } + catch (e) { + error = true; + } + expect(error).to.equal(true); + + try { + Joi.object().xor(123); + error = false; + } + catch (e) { + error = true; + } + expect(error).to.equal(true); + done(); + }); + }); + + describe('#or', function () { + + it('should throw an error when a parameter is not a string', function (done) { + + try { + Joi.object().or({}); + var error = false; + } + catch (e) { + error = true; + } + expect(error).to.equal(true); + + try { + Joi.object().or(123); + error = false; + } + catch (e) { + error = true; + } + expect(error).to.equal(true); + done(); + }); + + it('errors multiple levels deep', function (done) { + + Joi.object({ + a: { + b: Joi.object().or('x', 'y') + } + }).validate({ a: { b: { c: 1 } } }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('value must contain at least one of x, y'); + done(); + }); + }); + }); + + describe('#assert', function () { + + it('validates upwards reference', function (done) { + + var schema = Joi.object({ + a: { + b: Joi.string(), + c: Joi.number() + }, + d: { + e: Joi.any() + } + }).assert(Joi.ref('d/e', { separator: '/' }), Joi.ref('a.c'), 'equal to a.c'); + + schema.validate({ a: { b: 'x', c: 5 }, d: { e: 6 } }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('value validation failed because d.e failed to equal to a.c'); + + Helper.validate(schema, [ + [{ a: { b: 'x', c: 5 }, d: { e: 5 } }, true] + ], done); + }); + }); + + it('validates upwards reference with implicit context', function (done) { + + var schema = Joi.object({ + a: { + b: Joi.string(), + c: Joi.number() + }, + d: { + e: Joi.any() + } + }).assert('d.e', Joi.ref('a.c'), 'equal to a.c'); + + schema.validate({ a: { b: 'x', c: 5 }, d: { e: 6 } }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('value validation failed because d.e failed to equal to a.c'); + + Helper.validate(schema, [ + [{ a: { b: 'x', c: 5 }, d: { e: 5 } }, true] + ], done); + }); + }); + + it('throws when context is at root level', function (done) { + + expect(function () { + + var schema = Joi.object({ + a: { + b: Joi.string(), + c: Joi.number() + }, + d: { + e: Joi.any() + } + }).assert('a', Joi.ref('d.e'), 'equal to d.e'); + }).to.throw('Cannot use assertions for root level references - use direct key rules instead'); + done(); + }); + + it('allows root level context ref', function (done) { + + expect(function () { + + var schema = Joi.object({ + a: { + b: Joi.string(), + c: Joi.number() + }, + d: { + e: Joi.any() + } + }).assert('$a', Joi.ref('d.e'), 'equal to d.e'); + }).to.not.throw(); + done(); + }); + + it('provides a default message for failed assertions', function (done) { + + var schema = Joi.object({ + a: { + b: Joi.string(), + c: Joi.number() + }, + d: { + e: Joi.any() + } + }).assert('d.e', Joi.boolean()); + + schema.validate({ + d: { + e:[] + } + }, function (err) { + + expect(err).to.exist(); + expect(err.message).to.equal('value validation failed because d.e failed to pass the assertion test'); + done(); + }); + }); + }); + + describe('#type', function () { + + it('uses constructor name for default type name', function (done) { + + function Foo () {} + + var schema = Joi.object().type(Foo); + schema.validate({}, function (err) { + + expect(err).to.exist(); + expect(err.message).to.equal('value must be an instance of Foo'); + done(); + }); + }); + + it('uses custom type name if supplied', function (done) { + + var Foo = function () {}; + + var schema = Joi.object().type(Foo, 'Bar'); + schema.validate({}, function (err) { + + expect(err).to.exist(); + expect(err.message).to.equal('value must be an instance of Bar'); + done(); + }); + }); + + it('overrides constructor name with custom name', function (done) { + + function Foo () {} + + var schema = Joi.object().type(Foo, 'Bar'); + schema.validate({}, function (err) { + + expect(err).to.exist(); + expect(err.message).to.equal('value must be an instance of Bar'); + done(); + }); + }); + + it('throws when constructor is not a function', function (done) { + + expect(function () { + + var schema = Joi.object().type(''); + }).to.throw('type must be a constructor function'); + done(); + }); + + it('uses the constructor name in the schema description', function (done) { + + var description = Joi.object().type(RegExp).describe(); + + expect(description.rules).to.deep.include({ name: 'type', arg: 'RegExp' }); + done(); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/ref.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/ref.js new file mode 100755 index 0000000..3cc1ae8 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/ref.js @@ -0,0 +1,389 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('ref', function () { + + it('uses ref as a valid value', function (done) { + + var schema = Joi.object({ + a: Joi.ref('b'), + b: Joi.any() + }); + + schema.validate({ a: 5, b: 6 }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('a must be one of ref:b'); + + Helper.validate(schema, [ + [{ a: 5 }, false], + [{ b: 5 }, true], + [{ a: 5, b: 5 }, true], + [{ a: '5', b: '5' }, true] + ], done); + }); + }); + + it('uses ref as a valid value (empty key)', function (done) { + + var schema = Joi.object({ + a: Joi.ref(''), + '': Joi.any() + }); + + schema.validate({ a: 5, '': 6 }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('a must be one of ref:'); + + Helper.validate(schema, [ + [{ a: 5 }, false], + [{ '': 5 }, true], + [{ a: 5, '': 5 }, true], + [{ a: '5', '': '5' }, true] + ], done); + }); + }); + + it('uses ref with nested keys as a valid value', function (done) { + + var schema = Joi.object({ + a: Joi.ref('b.c'), + b: { + c: Joi.any() + } + }); + + schema.validate({ a: 5, b: { c: 6 } }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('a must be one of ref:b.c'); + + Helper.validate(schema, [ + [{ a: 5 }, false], + [{ b: { c: 5 } }, true], + [{ a: 5, b: 5 }, false], + [{ a: '5', b: { c: '5' } }, true] + ], done); + }); + }); + + it('uses ref with combined nested keys in sub child', function (done) { + + var ref = Joi.ref('b.c'); + expect(ref.root).to.equal('b'); + + var schema = Joi.object({ + a: ref, + b: { + c: Joi.any() + } + }); + + var input = { a: 5, b: { c: 5 } }; + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + + var parent = Joi.object({ + e: schema + }); + + parent.validate({ e: input }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + }); + + it('uses ref reach options', function (done) { + + var ref = Joi.ref('b/c', { separator: '/' }); + expect(ref.root).to.equal('b'); + + var schema = Joi.object({ + a: ref, + b: { + c: Joi.any() + } + }); + + schema.validate({ a: 5, b: { c: 5 } }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('ignores the order in which keys are defined', function (done) { + + var ab = Joi.object({ + a: { + c: Joi.number() + }, + b: Joi.ref('a.c') + }); + + ab.validate({ a: { c: '5' }, b: 5 }, function (err, value) { + + expect(err).to.not.exist(); + + var ba = Joi.object({ + b: Joi.ref('a.c'), + a: { + c: Joi.number() + } + }); + + ba.validate({ a: { c: '5' }, b: 5 }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + }); + + it('uses ref as default value', function (done) { + + var schema = Joi.object({ + a: Joi.default(Joi.ref('b')), + b: Joi.any() + }); + + schema.validate({ b: 6 }, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal({ a: 6, b: 6 }); + done(); + }); + }); + + it('uses ref as default value regardless of order', function (done) { + + var ab = Joi.object({ + a: Joi.default(Joi.ref('b')), + b: Joi.number() + }); + + ab.validate({ b: '6' }, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal({ a: 6, b: 6 }); + + var ba = Joi.object({ + b: Joi.number(), + a: Joi.default(Joi.ref('b')) + }); + + ba.validate({ b: '6' }, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal({ a: 6, b: 6 }); + done(); + }); + }); + }); + + it('ignores the order in which keys are defined with alternatives', function (done) { + + var a = { c: Joi.number() }; + var b = [Joi.ref('a.c'), Joi.ref('c')]; + var c = Joi.number(); + + Helper.validate({ a: a, b: b, c: c }, [ + [{ a: {} }, true], + [{ a: { c: '5' }, b: 5 }, true], + [{ a: { c: '5' }, b: 6, c: '6' }, true], + [{ a: { c: '5' }, b: 7, c: '6' }, false] + ]); + + Helper.validate({ b: b, a: a, c: c }, [ + [{ a: {} }, true], + [{ a: { c: '5' }, b: 5 }, true], + [{ a: { c: '5' }, b: 6, c: '6' }, true], + [{ a: { c: '5' }, b: 7, c: '6' }, false] + ]); + + Helper.validate({ b: b, c: c, a: a }, [ + [{ a: {} }, true], + [{ a: { c: '5' }, b: 5 }, true], + [{ a: { c: '5' }, b: 6, c: '6' }, true], + [{ a: { c: '5' }, b: 7, c: '6' }, false] + ]); + + Helper.validate({ a: a, c: c, b: b }, [ + [{ a: {} }, true], + [{ a: { c: '5' }, b: 5 }, true], + [{ a: { c: '5' }, b: 6, c: '6' }, true], + [{ a: { c: '5' }, b: 7, c: '6' }, false] + ]); + + Helper.validate({ c: c, a: a, b: b }, [ + [{ a: {} }, true], + [{ a: { c: '5' }, b: 5 }, true], + [{ a: { c: '5' }, b: 6, c: '6' }, true], + [{ a: { c: '5' }, b: 7, c: '6' }, false] + ]); + + Helper.validate({ c: c, b: b, a: a }, [ + [{ a: {} }, true], + [{ a: { c: '5' }, b: 5 }, true], + [{ a: { c: '5' }, b: 6, c: '6' }, true], + [{ a: { c: '5' }, b: 7, c: '6' }, false] + ], done); + }); + + it('uses context as default value', function (done) { + + var schema = Joi.object({ + a: Joi.default(Joi.ref('$x')), + b: Joi.any() + }); + + Joi.validate({ b: 6 }, schema, { context: { x: 22 } }, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal({ a: 22, b: 6 }); + done(); + }); + }); + + it('uses context as default value with custom prefix', function (done) { + + var schema = Joi.object({ + a: Joi.default(Joi.ref('%x', { contextPrefix: '%' })), + b: Joi.any() + }); + + Joi.validate({ b: 6 }, schema, { context: { x: 22 } }, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal({ a: 22, b: 6 }); + done(); + }); + }); + + it('uses context as a valid value', function (done) { + + var schema = Joi.object({ + a: Joi.ref('$x'), + b: Joi.any() + }); + + Joi.validate({ a: 5, b: 6 }, schema, { context: { x: 22 } }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('a must be one of context:x'); + + Helper.validateOptions(schema, [ + [{ a: 5 }, false], + [{ a: 22 }, true], + [{ b: 5 }, true], + [{ a: 22, b: 5 }, true], + [{ a: '22', b: '5' }, false] + ], { context: { x: 22 } }, done); + }); + }); + + it('uses context in when condition', function (done) { + + var schema = { + a: Joi.boolean().when('$x', { is: Joi.exist(), otherwise: Joi.forbidden() }) + }; + + Helper.validate(schema, [ + [{}, true], + [{ a: 'x' }, false], + [{ a: true }, false], + [{}, true, { context: {} }], + [{ a: 'x' }, false, { context: {} }], + [{ a: true }, false, { context: {} }], + [{}, true, { context: { x: 1 } }], + [{ a: 'x' }, false, { context: { x: 1 } }], + [{ a: true }, true, { context: { x: 1 } }] + ], done); + }); + + it('uses nested context in when condition', function (done) { + + var schema = { + a: Joi.boolean().when('$x.y', { is: Joi.exist(), otherwise: Joi.forbidden() }) + }; + + Helper.validate(schema, [ + [{}, true], + [{ a: 'x' }, false], + [{ a: true }, false], + [{}, true, { context: {} }], + [{ a: 'x' }, false, { context: {} }], + [{ a: true }, false, { context: {} }], + [{}, true, { context: { x: 1 } }], + [{ a: 'x' }, false, { context: { x: 1 } }], + [{ a: true }, false, { context: { x: 1 } }], + [{}, true, { context: { x: {} } }], + [{ a: 'x' }, false, { context: { x: {} } }], + [{ a: true }, false, { context: { x: {} } }], + [{}, true, { context: { x: { y: 1 } } }], + [{ a: 'x' }, false, { context: { x: { y: 1 } } }], + [{ a: true }, true, { context: { x: { y: 1 } } }] + ], done); + }); + + it('describes schema with ref', function (done) { + + var desc = Joi.compile(Joi.ref('a.b')).describe(); + expect(Joi.isRef(desc.valids[0])).to.be.true(); + done(); + }); + + describe('#create', function () { + + it('throws when key is missing', function (done) { + + expect(function () { + + Joi.ref(5); + }).to.throw('Invalid reference key: 5'); + done(); + }); + + it('finds root with default separator', function (done) { + + expect(Joi.ref('a.b.c').root).to.equal('a'); + done(); + }); + + it('finds root with default separator and options', function (done) { + + expect(Joi.ref('a.b.c', {}).root).to.equal('a'); + done(); + }); + + it('finds root with custom separator', function (done) { + + expect(Joi.ref('a+b+c', { separator: '+' }).root).to.equal('a'); + done(); + }); + }); +}); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/string.js b/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/string.js new file mode 100755 index 0000000..c9c61c0 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/node_modules/joi/test/string.js @@ -0,0 +1,1797 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('string', function () { + + it('fails on boolean', function (done) { + + var schema = Joi.string(); + Helper.validate(schema, [ + [true, false], + [false, false] + ], done); + }); + + describe('#valid', function () { + + it('should throw error on input not matching type', function (done) { + + expect(function () { + + Joi.string().valid({}); + }).to.throw(); + done(); + }); + + it('should not throw on input matching type', function (done) { + + expect(function () { + + Joi.string().valid('joi'); + }).to.not.throw(); + done(); + }); + + it('validates case sensitive values', function (done) { + + Helper.validate(Joi.string().valid('a', 'b'), [ + ['a', true], + ['b', true], + ['A', false], + ['B', false] + ], done); + }); + + it('validates case insensitive values', function (done) { + + Helper.validate(Joi.string().valid('a', 'b').insensitive(), [ + ['a', true], + ['b', true], + ['A', true], + ['B', true], + [4, false] + ], done); + }); + + it('validates case insensitive values with non-strings', function (done) { + + Helper.validate(Joi.string().valid('a', 'b', 5).insensitive(), [ + ['a', true], + ['b', true], + ['A', true], + ['B', true], + [4, false], + [5, true] + ], done); + }); + }); + + describe('#invalid', function () { + + it('should throw error on input not matching type', function (done) { + + expect(function () { + + Joi.string().invalid({}); + }).to.throw(); + done(); + }); + + it('should not throw on input matching type', function (done) { + + expect(function () { + + Joi.string().invalid('joi'); + }).to.not.throw(); + done(); + }); + + it('invalidates case sensitive values', function (done) { + + Helper.validate(Joi.string().invalid('a', 'b'), [ + ['a', false], + ['b', false], + ['A', true], + ['B', true] + ], done); + }); + + it('invalidates case insensitive values', function (done) { + + Helper.validate(Joi.string().invalid('a', 'b').insensitive(), [ + ['a', false], + ['b', false], + ['A', false], + ['B', false] + ], done); + }); + }); + + describe('#min', function () { + + it('throws when limit is not a number', function (done) { + + expect(function () { + + Joi.string().min('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('throws when limit is not an integer', function (done) { + + expect(function () { + + Joi.string().min(1.2); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('enforces a limit using byte count', function (done) { + + var schema = Joi.string().min(2, 'utf8'); + Helper.validate(schema, [ + ['\u00bd', true], + ['a', false] + ], done); + }); + }); + + describe('#max', function () { + + it('throws when limit is not a number', function (done) { + + expect(function () { + + Joi.string().max('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('throws when limit is not an integer', function (done) { + + expect(function () { + + Joi.string().max(1.2); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('enforces a limit using byte count', function (done) { + + var schema = Joi.string().max(1, 'utf8'); + Helper.validate(schema, [ + ['\u00bd', false], + ['a', true] + ], done); + }); + }); + + describe('#creditCard', function () { + + it('should validate credit card', function (done) { + + var t = Joi.string().creditCard(); + t.validate('4111111111111112', function (err, value) { + + expect(err.message).to.equal('value must be a credit card'); + + Helper.validate(t, [ + ['378734493671000', true], // american express + ['371449635398431', true], // american express + ['378282246310005', true], // american express + ['341111111111111', true], // american express + ['5610591081018250', true], // australian bank + ['5019717010103742', true], // dankort pbs + ['38520000023237', true], // diners club + ['30569309025904', true], // diners club + ['6011000990139424', true], // discover + ['6011111111111117', true], // discover + ['6011601160116611', true], // discover + ['3566002020360505', true], // jbc + ['3530111333300000', true], // jbc + ['5105105105105100', true], // mastercard + ['5555555555554444', true], // mastercard + ['5431111111111111', true], // mastercard + ['6331101999990016', true], // switch/solo paymentech + ['4222222222222', true], // visa + ['4012888888881881', true], // visa + ['4111111111111111', true], // visa + ['4111111111111112', false], + [null, false], + ], done); + }); + }); + }); + + describe('#length', function () { + + it('throws when limit is not a number', function (done) { + + expect(function () { + + Joi.string().length('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('throws when limit is not an integer', function (done) { + + expect(function () { + + Joi.string().length(1.2); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('enforces a limit using byte count', function (done) { + + var schema = Joi.string().length(2, 'utf8'); + Helper.validate(schema, [ + ['\u00bd', true], + ['a', false] + ], done); + }); + }); + + describe('#hostname', function () { + + it('validates hostnames', function (done) { + + var schema = Joi.string().hostname(); + Helper.validate(schema, [ + ['www.example.com', true], + ['domain.local', true], + ['3domain.local', true], + ['hostname', true], + ['host:name', false], + ['-', false], + ['2387628', true], + ['01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789', false], + ['::1', true], + ['0:0:0:0:0:0:0:1', true], + ['0:?:0:0:0:0:0:1', false] + ], done); + }); + }); + + describe('#lowercase', function () { + + it('only allows strings that are entirely lowercase', function (done) { + + var schema = Joi.string().lowercase(); + Helper.validateOptions(schema, [ + ['this is all lowercase', true], + ['5', true], + ['lower\tcase', true], + ['Uppercase', false], + ['MixEd cAsE', false], + [1, false] + ], { convert: false }, done); + }); + + it('coerce string to lowercase before validation', function (done) { + + var schema = Joi.string().lowercase(); + schema.validate('UPPER TO LOWER', function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.equal('upper to lower'); + done(); + }); + }); + + it('should work in combination with a trim', function (done) { + + var schema = Joi.string().lowercase().trim(); + Helper.validate(schema, [ + [' abc', true], + [' ABC', true], + ['ABC', true], + [1, false] + ], done); + }); + }); + + describe('#uppercase', function () { + + it('only allow strings that are entirely uppercase', function (done) { + + var schema = Joi.string().uppercase(); + Helper.validateOptions(schema, [ + ['THIS IS ALL UPPERCASE', true], + ['5', true], + ['UPPER\nCASE', true], + ['lOWERCASE', false], + ['MixEd cAsE', false], + [1, false] + ], { convert: false }, done); + }); + + it('coerce string to uppercase before validation', function (done) { + + var schema = Joi.string().uppercase(); + schema.validate('lower to upper', function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.equal('LOWER TO UPPER'); + done(); + }); + }); + + it('works in combination with a forced trim', function (done) { + + var schema = Joi.string().uppercase().trim(); + Helper.validate(schema, [ + [' abc', true], + [' ABC', true], + ['ABC', true], + [1, false] + ], done); + }); + }); + + describe('#trim', function () { + + it('only allow strings that have no leading or trailing whitespace', function (done) { + + var schema = Joi.string().trim(); + Helper.validateOptions(schema, [ + [' something', false], + ['something ', false], + ['something\n', false], + ['some thing', true], + ['something', true] + ], { convert: false }, done); + }); + + it('removes leading and trailing whitespace before validation', function (done) { + + var schema = Joi.string().trim(); + schema.validate(' trim this ', function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.equal('trim this'); + done(); + }); + }); + + it('removes leading and trailing whitespace before validation', function (done) { + + var schema = Joi.string().trim().allow(''); + schema.validate(' ', function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.equal(''); + done(); + }); + }); + + it('should work in combination with min', function (done) { + + var schema = Joi.string().min(4).trim(); + Helper.validate(schema, [ + [' a ', false], + ['abc ', false], + ['abcd ', true] + ], done); + }); + + it('should work in combination with max', function (done) { + + var schema = Joi.string().max(4).trim(); + Helper.validate(schema, [ + [' abcde ', false], + ['abc ', true], + ['abcd ', true] + ], done); + }); + + it('should work in combination with length', function (done) { + + var schema = Joi.string().length(4).trim(); + Helper.validate(schema, [ + [' ab ', false], + ['abc ', false], + ['abcd ', true] + ], done); + }); + + it('should work in combination with a case change', function (done) { + + var schema = Joi.string().trim().lowercase(); + Helper.validate(schema, [ + [' abc', true], + [' ABC', true], + ['ABC', true] + ], done); + }); + }); + + describe('#regex', function () { + + it('should not include a pattern name by default', function (done) { + + var schema = Joi.string().regex(/[a-z]+/).regex(/[0-9]+/); + schema.validate('abcd', function (err, value) { + + expect(err.message).to.contain('required pattern'); + done(); + }); + }); + + it('should include a pattern name if specified', function (done) { + + var schema = Joi.string().regex(/[a-z]+/, 'letters').regex(/[0-9]+/, 'numbers'); + schema.validate('abcd', function (err, value) { + + expect(err.message).to.contain('numbers pattern'); + done(); + }); + }); + }); + + describe('#validate', function () { + + it('should, by default, allow undefined, deny empty string', function (done) { + + Helper.validate(Joi.string(), [ + [undefined, true], + ['', false] + ], done); + }); + + it('should, when .required(), deny undefined, deny empty string', function (done) { + + Helper.validate(Joi.string().required(), [ + [undefined, false], + ['', false] + ], done); + }); + + it('should, when .required(), print a friend error message for an empty string', function (done) { + + var schema = Joi.string().required(); + Joi.compile(schema).validate('', function (err, value) { + + expect(err.message).to.contain('be empty'); + done(); + }); + }); + + it('should, when .required(), validate non-empty strings', function (done) { + + var schema = Joi.string().required(); + Helper.validate(schema, [ + ['test', true], + ['0', true], + [null, false] + ], done); + }); + + it('validates invalid values', function (done) { + + var schema = Joi.string().invalid('a', 'b', 'c'); + Helper.validate(schema, [ + ['x', true], + ['a', false], + ['c', false] + ], done); + }); + + it('should invalidate invalid values', function (done) { + + var schema = Joi.string().valid('a', 'b', 'c'); + Helper.validate(schema, [ + ['x', false], + ['a', true], + ['c', true] + ], done); + }); + + it('validates array arguments correctly', function (done) { + + var schema = Joi.string().valid(['a', 'b', 'c']); + Helper.validate(schema, [ + ['x', false], + ['a', true], + ['c', true] + ], done); + }); + + it('validates minimum length when min is used', function (done) { + + var schema = Joi.string().min(3); + Helper.validate(schema, [ + ['test', true], + ['0', false], + [null, false] + ], done); + }); + + it('validates minimum length when min is 0', function (done) { + + var schema = Joi.string().min(0).required(); + Helper.validate(schema, [ + ['0', true], + [null, false], + [undefined, false] + ], done); + }); + + it('should return false with minimum length and a null value passed in', function (done) { + + var schema = Joi.string().min(3); + Helper.validate(schema, [ + [null, false] + ], done); + }); + + it('null allowed overrides min length requirement', function (done) { + + var schema = Joi.string().min(3).allow(null); + Helper.validate(schema, [ + [null, true] + ], done); + }); + + it('validates maximum length when max is used', function (done) { + + var schema = Joi.string().max(3); + Helper.validate(schema, [ + ['test', false], + ['0', true], + [null, false] + ], done); + }); + + it('should return true with max and not required when value is undefined', function (done) { + + var schema = Joi.string().max(3); + Helper.validate(schema, [ + [undefined, true] + ], done); + }); + + it('validates length requirements', function (done) { + + var schema = Joi.string().length(3); + Helper.validate(schema, [ + ['test', false], + ['0', false], + [null, false], + ['abc', true] + ], done); + }); + + it('validates regex', function (done) { + + var schema = Joi.string().regex(/^[0-9][-][a-z]+$/); + Helper.validate(schema, [ + ['van', false], + ['0-www', true] + ], done); + }); + + it('validates regex (ignoring global flag)', function (done) { + + var schema = Joi.string().regex(/a/g); + Helper.validate(schema, [ + ['ab', true], + ['ac', true] + ], done); + }); + + it('validates token', function (done) { + + var schema = Joi.string().token(); + Helper.validate(schema, [ + ['w0rld_of_w4lm4rtl4bs', true], + ['w0rld of_w4lm4rtl4bs', false], + ['abcd#f?h1j orly?', false] + ], done); + }); + + it('validates alphanum', function (done) { + + var schema = Joi.string().alphanum(); + Helper.validate(schema, [ + ['w0rld of w4lm4rtl4bs', false], + ['w0rldofw4lm4rtl4bs', true], + ['abcd#f?h1j orly?', false] + ], done); + }); + + it('validates email', function (done) { + + var schema = Joi.string().email(); + Helper.validate(schema, [ + ['joe@example.com', true], + ['"joe"@example.com', true], + ['@iaminvalid.com', false], + ['joe@[IPv6:2a00:1450:4001:c02::1b]', true], + ['12345678901234567890123456789012345678901234567890123456789012345@walmartlabs.com', false], + ['123456789012345678901234567890123456789012345678901234567890@12345678901234567890123456789012345678901234567890123456789.12345678901234567890123456789012345678901234567890123456789.12345678901234567890123456789012345678901234567890123456789.12345.toolong.com', false] + ], done); + }); + + it('validates email with a friendly error message', function (done) { + + var schema = { item: Joi.string().email() }; + Joi.compile(schema).validate({ item: 'something' }, function (err, value) { + + expect(err.message).to.contain('must be a valid email'); + done(); + }); + }); + + it('should return false for denied value', function (done) { + + var text = Joi.string().invalid('joi'); + text.validate('joi', function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('should return true for allowed value', function (done) { + + var text = Joi.string().allow('hapi'); + text.validate('result', function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('validates with one validator (min)', function (done) { + + var text = Joi.string().min(3); + text.validate('joi', function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('validates with two validators (min, required)', function (done) { + + var text = Joi.string().min(3).required(); + text.validate('joi', function (err, value) { + + expect(err).to.not.exist(); + + text.validate('', function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + }); + + it('validates null with allow(null)', function (done) { + + Helper.validate(Joi.string().allow(null), [ + [null, true] + ], done); + }); + + it('validates "" (empty string) with allow(\'\')', function (done) { + + Helper.validate(Joi.string().allow(''), [ + ['', true], + ['', true] + ], done); + }); + + it('validates combination of required and min', function (done) { + + var rule = Joi.string().required().min(3); + Helper.validate(rule, [ + ['x', false], + ['123', true], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of required and max', function (done) { + + var rule = Joi.string().required().max(3); + Helper.validate(rule, [ + ['x', true], + ['123', true], + ['1234', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of allow(\'\') and min', function (done) { + + var rule = Joi.string().allow('').min(3); + Helper.validate(rule, [ + ['x', false], + ['123', true], + ['1234', true], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of allow(\'\') and max', function (done) { + + var rule = Joi.string().allow('').max(3); + Helper.validate(rule, [ + ['x', true], + ['123', true], + ['1234', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of null allowed and max', function (done) { + var rule = Joi.string().allow(null).max(3); + Helper.validate(rule, [ + ['x', true], + ['123', true], + ['1234', false], + ['', false], + [null, true] + ], done); + }); + + it('validates combination of min and max', function (done) { + + var rule = Joi.string().min(2).max(3); + Helper.validate(rule, [ + ['x', false], + ['123', true], + ['1234', false], + ['12', true], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of min, max, and allow(\'\')', function (done) { + + var rule = Joi.string().min(2).max(3).allow(''); + Helper.validate(rule, [ + ['x', false], + ['123', true], + ['1234', false], + ['12', true], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of min, max, and required', function (done) { + + var rule = Joi.string().min(2).max(3).required(); + Helper.validate(rule, [ + ['x', false], + ['123', true], + ['1234', false], + ['12', true], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of min, max, and regex', function (done) { + + var rule = Joi.string().min(2).max(3).regex(/^a/); + Helper.validate(rule, [ + ['x', false], + ['123', false], + ['1234', false], + ['12', false], + ['ab', true], + ['abc', true], + ['abcd', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of min, max, regex, and allow(\'\')', function (done) { + + var rule = Joi.string().min(2).max(3).regex(/^a/).allow(''); + Helper.validate(rule, [ + ['x', false], + ['123', false], + ['1234', false], + ['12', false], + ['ab', true], + ['abc', true], + ['abcd', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of min, max, regex, and required', function (done) { + + var rule = Joi.string().min(2).max(3).regex(/^a/).required(); + Helper.validate(rule, [ + ['x', false], + ['123', false], + ['1234', false], + ['12', false], + ['ab', true], + ['abc', true], + ['abcd', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of min, max, and alphanum', function (done) { + + var rule = Joi.string().min(2).max(3).alphanum(); + Helper.validate(rule, [ + ['x', false], + ['123', true], + ['1234', false], + ['12', true], + ['ab', true], + ['abc', true], + ['abcd', false], + ['*ab', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of min, max, alphanum, and allow(\'\')', function (done) { + + var rule = Joi.string().min(2).max(3).alphanum().allow(''); + Helper.validate(rule, [ + ['x', false], + ['123', true], + ['1234', false], + ['12', true], + ['ab', true], + ['abc', true], + ['abcd', false], + ['*ab', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of min, max, alphanum, and required', function (done) { + + var rule = Joi.string().min(2).max(3).alphanum().required(); + Helper.validate(rule, [ + ['x', false], + ['123', true], + ['1234', false], + ['12', true], + ['ab', true], + ['abc', true], + ['abcd', false], + ['*ab', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of min, max, alphanum, and regex', function (done) { + + var rule = Joi.string().min(2).max(3).alphanum().regex(/^a/); + Helper.validate(rule, [ + ['x', false], + ['123', false], + ['1234', false], + ['12', false], + ['ab', true], + ['abc', true], + ['a2c', true], + ['abcd', false], + ['*ab', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of min, max, alphanum, required, and regex', function (done) { + + var rule = Joi.string().min(2).max(3).alphanum().required().regex(/^a/); + Helper.validate(rule, [ + ['x', false], + ['123', false], + ['1234', false], + ['12', false], + ['ab', true], + ['abc', true], + ['a2c', true], + ['abcd', false], + ['*ab', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of min, max, alphanum, allow(\'\'), and regex', function (done) { + + var rule = Joi.string().min(2).max(3).alphanum().allow('').regex(/^a/); + Helper.validate(rule, [ + ['x', false], + ['123', false], + ['1234', false], + ['12', false], + ['ab', true], + ['abc', true], + ['a2c', true], + ['abcd', false], + ['*ab', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of email and min', function (done) { + + var rule = Joi.string().email().min(8); + Helper.validate(rule, [ + ['x@x.com', false], + ['123@x.com', true], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of email, min, and max', function (done) { + + var rule = Joi.string().email().min(8).max(10); + Helper.validate(rule, [ + ['x@x.com', false], + ['123@x.com', true], + ['1234@x.com', true], + ['12345@x.com', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, and invalid', function (done) { + + var rule = Joi.string().email().min(8).max(10).invalid('123@x.com'); + Helper.validate(rule, [ + ['x@x.com', false], + ['123@x.com', false], + ['1234@x.com', true], + ['12345@x.com', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, and allow', function (done) { + + var rule = Joi.string().email().min(8).max(10).allow('x@x.com'); + Helper.validate(rule, [ + ['x@x.com', true], + ['123@x.com', true], + ['1234@x.com', true], + ['12345@x.com', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, allow, and invalid', function (done) { + + var rule = Joi.string().email().min(8).max(10).allow('x@x.com').invalid('123@x.com'); + Helper.validate(rule, [ + ['x@x.com', true], + ['123@x.com', false], + ['1234@x.com', true], + ['12345@x.com', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, allow, invalid, and allow(\'\')', function (done) { + + var rule = Joi.string().email().min(8).max(10).allow('x@x.com').invalid('123@x.com').allow(''); + Helper.validate(rule, [ + ['x@x.com', true], + ['123@x.com', false], + ['1234@x.com', true], + ['12345@x.com', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, allow, and allow(\'\')', function (done) { + + var rule = Joi.string().email().min(8).max(10).allow('x@x.com').allow(''); + Helper.validate(rule, [ + ['x@x.com', true], + ['123@x.com', true], + ['1234@x.com', true], + ['12345@x.com', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, allow, invalid, and regex', function (done) { + + var rule = Joi.string().email().min(8).max(10).allow('x@x.com').invalid('123@x.com').regex(/^1/); + Helper.validate(rule, [ + ['x@x.com', true], + ['123@x.com', false], + ['1234@x.com', true], + ['12345@x.com', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, allow, invalid, regex, and allow(\'\')', function (done) { + + var rule = Joi.string().email().min(8).max(10).allow('x@x.com').invalid('123@x.com').regex(/^1/).allow(''); + Helper.validate(rule, [ + ['x@x.com', true], + ['123@x.com', false], + ['1234@x.com', true], + ['12345@x.com', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, and allow(\'\')', function (done) { + + var rule = Joi.string().email().min(8).max(10).allow(''); + Helper.validate(rule, [ + ['x@x.com', false], + ['123@x.com', true], + ['1234@x.com', true], + ['12345@x.com', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, and regex', function (done) { + + var rule = Joi.string().email().min(8).max(10).regex(/^1234/); + Helper.validate(rule, [ + ['x@x.com', false], + ['123@x.com', false], + ['1234@x.com', true], + ['12345@x.com', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, regex, and allow(\'\')', function (done) { + + var rule = Joi.string().email().min(8).max(10).regex(/^1234/).allow(''); + Helper.validate(rule, [ + ['x@x.com', false], + ['123@x.com', false], + ['1234@x.com', true], + ['12345@x.com', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, regex, and required', function (done) { + + var rule = Joi.string().email().min(8).max(10).regex(/^1234/).required(); + Helper.validate(rule, [ + ['x@x.com', false], + ['123@x.com', false], + ['1234@x.com', true], + ['12345@x.com', false], + ['', false], + [null, false] + ], done); + }); + + it('validates isoDate', function (done) { + + Helper.validate(Joi.string().isoDate(), [ + ['2013-06-07T14:21:46.295Z', true], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', true], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', true], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', true], + ['2013-06-07T14:21:46-07:00', true], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', true], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', true], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', true], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false] + ], done); + }); + + it('validates isoDate with a friendly error message', function (done) { + + var schema = { item: Joi.string().isoDate() }; + Joi.compile(schema).validate({ item: 'something' }, function (err, value) { + + expect(err.message).to.contain('must be a valid ISO 8601 date'); + done(); + }); + }); + + it('validates combination of isoDate and min', function (done) { + + var rule = Joi.string().isoDate().min(23); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', true], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', true], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', true], + ['2013-06-07T14:21:46Z', false], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', true], + ['2013-06-07T14:21:46-07:00', true], + ['2013-06-07T14:21Z', false], + ['2013-06-07T14:21+07:00', false], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', false], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min and max', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', false], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', true], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', true], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max and invalid', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).invalid('2013-06-07T14:21+07:00'); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', false], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', false], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', true], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max and allow', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).allow('2013-06-07T14:21:46.295+07:00'); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', true], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', true], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', true], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max, allow and invalid', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).allow('2013-06-07T14:21:46.295+07:00').invalid('2013-06-07T14:21+07:00'); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', true], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', false], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', true], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max, allow, invalid and allow(\'\')', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).allow('2013-06-07T14:21:46.295+07:00').invalid('2013-06-07T14:21+07:00').allow(''); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', true], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', false], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', true], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max, allow, invalid and allow(\'\')', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).allow('2013-06-07T14:21:46.295+07:00').allow(''); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', true], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', true], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', true], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max, allow, invalid and regex', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).allow('2013-06-07T14:21:46.295+07:00').invalid('2013-06-07T14:21Z').regex(/Z$/); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', true], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', false], + ['2013-06-07T14:21+07:00', false], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', false], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max, allow, invalid, regex and allow(\'\')', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).allow('2013-06-07T14:21:46.295+07:00').invalid('2013-06-07T14:21Z').regex(/Z$/).allow(''); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', true], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', false], + ['2013-06-07T14:21+07:00', false], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', false], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max and allow(\'\')', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).allow(''); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', false], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', true], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', true], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max and regex', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).regex(/Z$/); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', false], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', false], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', false], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max, regex and allow(\'\')', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).regex(/Z$/).allow(''); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', false], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', false], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', false], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max, regex and required', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).regex(/Z$/).required(); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', false], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', false], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', false], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', false], + [null, false] + ], done); + }); + + it('validates guid', function (done) { + + Helper.validate(Joi.string().guid(), [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', true], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], + ['69593D62-71EA-4548-85E4-04FC71357423', true], + ['677E2553DD4D43B09DA77414DB1EB8EA', true], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', true], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', true], + ['b4b2fb69c6244e5eb0698e0c6ec66618', true], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false] + ], done); + }); + + it('validates guid with a friendly error message', function (done) { + + var schema = { item: Joi.string().guid() }; + Joi.compile(schema).validate({ item: 'something' }, function (err, value) { + + expect(err.message).to.contain('must be a valid GUID'); + done(); + }); + }); + + it('validates combination of guid and min', function (done) { + + var rule = Joi.string().guid().min(36); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', true], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', false], + ['69593D62-71EA-4548-85E4-04FC71357423', true], + ['677E2553DD4D43B09DA77414DB1EB8EA', false], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', true], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', false], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', true], + ['b4b2fb69c6244e5eb0698e0c6ec66618', false], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of guid, min and max', function (done) { + + var rule = Joi.string().guid().min(32).max(34); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', true], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', true], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max and invalid', function (done) { + + var rule = Joi.string().guid().min(32).max(34).invalid('b4b2fb69c6244e5eb0698e0c6ec66618'); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', true], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', false], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max and allow', function (done) { + + var rule = Joi.string().guid().min(32).max(34).allow('{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D'); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', true], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', true], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', true], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max, allow and invalid', function (done) { + + var rule = Joi.string().guid().min(32).max(34).allow('{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D').invalid('b4b2fb69c6244e5eb0698e0c6ec66618'); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', true], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', false], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', true], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max, allow, invalid and allow(\'\')', function (done) { + + var rule = Joi.string().guid().min(32).max(34).allow('{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D').invalid('b4b2fb69c6244e5eb0698e0c6ec66618').allow(''); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', true], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', false], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', true], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max, allow and allow(\'\')', function (done) { + + var rule = Joi.string().guid().min(32).max(34).allow('{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D').allow(''); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', true], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', true], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', true], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max, allow, invalid and regex', function (done) { + + var rule = Joi.string().guid().min(32).max(34).allow('{D1A5279D-B27D-4CD4-A05E-EFDD53D08').invalid('b4b2fb69c6244e5eb0698e0c6ec66618').regex(/^{7e908/); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', false], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', false], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', false], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08', true], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max, allow, invalid, regex and allow(\'\')', function (done) { + + var rule = Joi.string().guid().min(32).max(34).allow('{D1A5279D-B27D-4CD4-A05E-EFDD53D08').invalid('b4b2fb69c6244e5eb0698e0c6ec66618').regex(/^{7e908/).allow(''); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', false], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', false], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', false], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08', true], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max and allow(\'\')', function (done) { + + var rule = Joi.string().guid().min(32).max(34).allow(''); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', true], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', true], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max and regex', function (done) { + + var rule = Joi.string().guid().min(32).max(34).regex(/^{7e9081/i); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', false], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', false], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', false], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max, regex and allow(\'\')', function (done) { + + var rule = Joi.string().guid().min(32).max(34).regex(/^{7e9081/i).allow(''); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', false], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', false], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', false], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max, regex and required', function (done) { + + var rule = Joi.string().guid().min(32).max(34).regex(/^{7e9081/i).required(); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', false], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', false], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', false], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', false], + [null, false] + ], done); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/h2o2/package.json b/node_modules/hapi/node_modules/h2o2/package.json new file mode 100755 index 0000000..8612174 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/package.json @@ -0,0 +1,51 @@ +{ + "name": "h2o2", + "description": "Proxy handler plugin for hapi.js", + "version": "4.0.0", + "repository": { + "type": "git", + "url": "git://github.com/hapijs/h2o2" + }, + "main": "index", + "keywords": [ + "HTTP", + "proxy", + "handler", + "hapi", + "plugin" + ], + "engines": { + "node": ">=0.10.32" + }, + "dependencies": { + "boom": "2.x.x", + "hoek": "2.x.x", + "joi": "5.x.x", + "wreck": "5.x.x" + }, + "devDependencies": { + "code": "1.x.x", + "hapi": "8.x.x", + "lab": "5.x.x" + }, + "scripts": { + "test": "make test-cov" + }, + "licenses": [ + { + "type": "BSD", + "url": "http://github.com/hapijs/h2o2/raw/master/LICENSE" + } + ], + "readme": "#h2o2\n\nProxy handler plugin for hapi.js.\n\n[![Build Status](https://secure.travis-ci.org/hapijs/h2o2.png)](http://travis-ci.org/hapijs/h2o2)\n\nLead Maintainer - [Eran Hammer](https://github.com/hueniverse)\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/hapijs/h2o2/issues" + }, + "_id": "h2o2@4.0.0", + "dist": { + "shasum": "90ae8d1ee7efb362f558d8c9d7686c061c9487f1" + }, + "_from": "h2o2@4.0.0", + "_resolved": "https://registry.npmjs.org/h2o2/-/h2o2-4.0.0.tgz" +} diff --git a/node_modules/hapi/node_modules/h2o2/test/index.js b/node_modules/hapi/node_modules/h2o2/test/index.js new file mode 100755 index 0000000..64f9732 --- /dev/null +++ b/node_modules/hapi/node_modules/h2o2/test/index.js @@ -0,0 +1,1573 @@ +// Load modules + +var Fs = require('fs'); +var Http = require('http'); +var Net = require('net'); +var Zlib = require('zlib'); +var Boom = require('boom'); +var Code = require('code'); +var H2o2 = require('..'); +var Hapi = require('hapi'); +var Hoek = require('hoek'); +var Lab = require('lab'); +var Wreck = require('wreck'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('H2o2', function () { + + var provisionServer = function (options) { + + var server = new Hapi.Server({ minimal: true }); + server.connection(options); + server.register(H2o2, Hoek.ignore); + return server; + }; + + it('overrides maxSockets', { parallel: false }, function (done) { + + var orig = Wreck.request; + Wreck.request = function (method, uri, options, callback) { + + Wreck.request = orig; + expect(options.agent.maxSockets).to.equal(213); + done(); + }; + + var server = provisionServer(); + server.route({ method: 'GET', path: '/', handler: { proxy: { host: 'localhost', maxSockets: 213 } } }); + server.inject('/', function (res) { }); + }); + + it('uses node default with maxSockets set to false', { parallel: false }, function (done) { + + var orig = Wreck.request; + Wreck.request = function (method, uri, options, callback) { + + Wreck.request = orig; + expect(options.agent).to.equal(undefined); + done(); + }; + + var server = provisionServer(); + server.route({ method: 'GET', path: '/', handler: { proxy: { host: 'localhost', maxSockets: false } } }); + server.inject('/', function (res) { }); + }); + + it('forwards on the response when making a GET request', function (done) { + + var profile = function (request, reply) { + + reply({ id: 'fa0dbda9b1b', name: 'John Doe' }).state('test', '123'); + }; + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/profile', handler: profile, config: { cache: { expiresIn: 2000 } } }); + upstream.start(function () { + + var server = provisionServer(); + server.route({ method: 'GET', path: '/profile', handler: { proxy: { host: 'localhost', port: upstream.info.port, xforward: true, passThrough: true } } }); + server.state('auto', { autoValue: 'xyz' }); + + server.inject('/profile', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.payload).to.contain('John Doe'); + expect(res.headers['set-cookie']).to.deep.equal(['test=123', 'auto=xyz']); + expect(res.headers['cache-control']).to.equal('max-age=2, must-revalidate, private'); + + server.inject('/profile', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.payload).to.contain('John Doe'); + done(); + }); + }); + }); + }); + + it('throws when used with explicit route payload config other than data or steam', function (done) { + + var server = provisionServer(); + expect(function () { + + server.route({ + method: 'POST', + path: '/', + config: { + handler: { + proxy: { host: 'example.com' } + }, + payload: { + output: 'file' + } + } + }); + }).to.throw('Cannot proxy if payload is parsed or if output is not stream or data'); + done(); + }); + + it('throws when setup with invalid options', function (done) { + + var server = provisionServer(); + expect(function () { + + server.route({ + method: 'POST', + path: '/', + config: { + handler: { + proxy: { some: 'key' } + } + } + }); + }).to.throw(/value must contain at least one of host, mapUri, uri/); + done(); + }); + + it('throws when used with explicit route payload parse config set to false', function (done) { + + var server = provisionServer(); + expect(function () { + + server.route({ + method: 'POST', + path: '/', + config: { + handler: { + proxy: { host: 'example.com' } + }, + payload: { + parse: true + } + } + }); + }).to.throw('Cannot proxy if payload is parsed or if output is not stream or data'); + done(); + }); + + it('allows when used with explicit route payload output data config', function (done) { + + var server = provisionServer(); + expect(function () { + + server.route({ + method: 'POST', + path: '/', + config: { + handler: { + proxy: { host: 'example.com' } + }, + payload: { + output: 'data' + } + } + }); + }).to.not.throw(); + done(); + }); + + it('uses protocol without ":"', function (done) { + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/', handler: function (request, reply) { reply('ok'); } }); + upstream.start(function () { + + var server = provisionServer(); + server.route({ method: 'GET', path: '/', handler: { proxy: { host: 'localhost', port: upstream.info.port, protocol: 'http' } } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.payload).to.equal('ok'); + done(); + }); + }); + }); + + it('forwards upstream headers', function (done) { + + var headers = function (request, reply) { + + reply({ status: 'success' }) + .header('Custom1', 'custom header value 1') + .header('X-Custom2', 'custom header value 2'); + }; + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/headers', handler: headers }); + upstream.start(function () { + + var server = provisionServer({ routes: { cors: true } }); + server.route({ method: 'GET', path: '/headers', handler: { proxy: { host: 'localhost', port: upstream.info.port, passThrough: true } } }); + + server.inject('/headers', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.payload).to.equal('{\"status\":\"success\"}'); + expect(res.headers.custom1).to.equal('custom header value 1'); + expect(res.headers['x-custom2']).to.equal('custom header value 2'); + done(); + }); + }); + }); + + it('overrides upstream cors headers', function (done) { + + var headers = function (request, reply) { + + reply().header('access-control-allow-headers', 'Invalid, List, Of, Values'); + }; + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/', handler: headers }); + upstream.start(function () { + + var server = provisionServer({ routes: { cors: { credentials: true, override: true } } }); + server.route({ method: 'GET', path: '/', handler: { proxy: { host: 'localhost', port: upstream.info.port, passThrough: true } } }); + + server.inject('/', function (res) { + + expect(res.headers['access-control-allow-headers']).to.equal('Authorization, Content-Type, If-None-Match'); + done(); + }); + }); + }); + + it('merges upstream headers', function (done) { + + var headers = function (request, reply) { + + reply({ status: 'success' }) + .vary('X-Custom3'); + }; + + var onResponse = function (err, res, request, reply, settings, ttl) { + + reply(res).vary('Something'); + }; + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/headers', handler: headers }); + upstream.start(function () { + + var server = provisionServer(); + server.route({ method: 'GET', path: '/headers', handler: { proxy: { host: 'localhost', port: upstream.info.port, passThrough: true, onResponse: onResponse } } }); + + server.inject({ url: '/headers', headers: { 'accept-encoding': 'gzip' } }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.headers.vary).to.equal('X-Custom3,accept-encoding,Something'); + done(); + }); + }); + }); + + it('forwards gzipped content', function (done) { + + var gzipHandler = function (request, reply) { + + reply('123456789012345678901234567890123456789012345678901234567890'); + }; + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/gzip', handler: gzipHandler }); + upstream.start(function () { + + var server = provisionServer(); + server.route({ method: 'GET', path: '/gzip', handler: { proxy: { host: 'localhost', port: upstream.info.port, passThrough: true } } }); + + Zlib.gzip(new Buffer('123456789012345678901234567890123456789012345678901234567890'), function (err, zipped) { + + expect(err).to.not.exist(); + + server.inject({ url: '/gzip', headers: { 'accept-encoding': 'gzip' } }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(new Buffer(res.payload, 'binary')).to.deep.equal(zipped); + done(); + }); + }); + }); + }); + + it('forwards gzipped stream', function (done) { + + var gzipStreamHandler = function (request, reply) { + + reply.file(__dirname + '/../package.json'); + }; + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/gzipstream', handler: gzipStreamHandler }); + upstream.start(function () { + + var server = provisionServer(); + server.route({ method: 'GET', path: '/gzipstream', handler: { proxy: { host: 'localhost', port: upstream.info.port, passThrough: true } } }); + + server.inject({ url: '/gzipstream', headers: { 'accept-encoding': 'gzip' } }, function (res) { + + expect(res.statusCode).to.equal(200); + + Fs.readFile(__dirname + '/../package.json', { encoding: 'utf8' }, function (err, file) { + + Zlib.unzip(new Buffer(res.payload, 'binary'), function (err, unzipped) { + + expect(err).to.not.exist(); + expect(unzipped.toString('utf8')).to.deep.equal(file); + done(); + }); + }); + }); + }); + }); + + it('does not forward upstream headers without passThrough', function (done) { + + var headers = function (request, reply) { + + reply({ status: 'success' }) + .header('Custom1', 'custom header value 1') + .header('X-Custom2', 'custom header value 2') + .header('access-control-allow-headers', 'Invalid, List, Of, Values'); + }; + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/noHeaders', handler: headers }); + upstream.start(function () { + + var server = provisionServer(); + server.route({ method: 'GET', path: '/noHeaders', handler: { proxy: { host: 'localhost', port: upstream.info.port } } }); + + server.inject('/noHeaders', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.payload).to.equal('{\"status\":\"success\"}'); + expect(res.headers.custom1).to.not.exist(); + expect(res.headers['x-custom2']).to.not.exist(); + done(); + }); + }); + }); + + it('request a cached proxy route', function (done) { + + var activeCount = 0; + var activeItem = function (request, reply) { + + reply({ + id: '55cf687663', + name: 'Active Items', + count: activeCount++ + }); + }; + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/item', handler: activeItem }); + upstream.start(function () { + + var server = provisionServer(); + server.route({ method: 'GET', path: '/item', handler: { proxy: { host: 'localhost', port: upstream.info.port, protocol: 'http:' } }, config: { cache: { expiresIn: 500 } } }); + + server.inject('/item', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.payload).to.contain('Active Items'); + var counter = res.result.count; + + server.inject('/item', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result.count).to.equal(counter); + done(); + }); + }); + }); + }); + + it('forwards on the status code when making a POST request', function (done) { + + var item = function (request, reply) { + + reply({ id: '55cf687663', name: 'Items' }).created('http://example.com'); + }; + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'POST', path: '/item', handler: item }); + upstream.start(function () { + + var server = provisionServer(); + server.route({ method: 'POST', path: '/item', handler: { proxy: { host: 'localhost', port: upstream.info.port } } }); + + server.inject({ url: '/item', method: 'POST' }, function (res) { + + expect(res.statusCode).to.equal(201); + expect(res.payload).to.contain('Items'); + done(); + }); + }); + }); + + it('sends the correct status code when a request is unauthorized', function (done) { + + var unauthorized = function (request, reply) { + + reply(Boom.unauthorized('Not authorized')); + }; + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/unauthorized', handler: unauthorized }); + upstream.start(function () { + + var server = provisionServer(); + server.route({ method: 'GET', path: '/unauthorized', handler: { proxy: { host: 'localhost', port: upstream.info.port } }, config: { cache: { expiresIn: 500 } } }); + + server.inject('/unauthorized', function (res) { + + expect(res.statusCode).to.equal(401); + done(); + }); + }); + }); + + it('sends a 404 status code when a proxied route does not exist', function (done) { + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.start(function () { + + var server = provisionServer(); + server.route({ method: 'POST', path: '/notfound', handler: { proxy: { host: 'localhost', port: upstream.info.port } } }); + + server.inject('/notfound', function (res) { + + expect(res.statusCode).to.equal(404); + done(); + }); + }); + }); + + it('overrides status code when a custom onResponse returns an error', function (done) { + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.start(function () { + + var onResponseWithError = function (err, res, request, reply, settings, ttl) { + + reply(Boom.forbidden('Forbidden')); + }; + + var server = provisionServer(); + server.route({ method: 'GET', path: '/onResponseError', handler: { proxy: { host: 'localhost', port: upstream.info.port, onResponse: onResponseWithError } } }); + + server.inject('/onResponseError', function (res) { + + expect(res.statusCode).to.equal(403); + done(); + }); + }); + }); + + it('adds cookie to response', function (done) { + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.start(function () { + + var on = function (err, res, request, reply, settings, ttl) { + + reply(res).state('a', 'b'); + }; + + var server = provisionServer(); + server.route({ method: 'GET', path: '/', handler: { proxy: { host: 'localhost', port: upstream.info.port, onResponse: on } } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(404); + expect(res.headers['set-cookie'][0]).to.equal('a=b'); + done(); + }); + }); + }); + + it('binds onResponse to route bind config', function (done) { + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.start(function () { + + var onResponseWithError = function (err, res, request, reply, settings, ttl) { + + reply(this.c); + }; + + var handler = { + proxy: { + host: 'localhost', + port: upstream.info.port, + onResponse: onResponseWithError + } + }; + + var server = provisionServer(); + server.route({ method: 'GET', path: '/onResponseError', config: { handler: handler, bind: { c: 6 } } }); + + server.inject('/onResponseError', function (res) { + + expect(res.result).to.equal(6); + done(); + }); + }); + }); + + it('binds onResponse to route bind config in plugin', function (done) { + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.start(function () { + + var server = provisionServer(); + + var plugin = function (server, options, next) { + + var onResponseWithError = function (err, res, request, reply, settings, ttl) { + + reply(this.c); + }; + + var handler = { + proxy: { + host: 'localhost', + port: upstream.info.port, + onResponse: onResponseWithError + } + }; + + server.route({ method: 'GET', path: '/', config: { handler: handler, bind: { c: 6 } } }); + return next(); + }; + + plugin.attributes = { + name: 'test' + }; + + server.register(plugin, function (err) { + + expect(err).to.not.exist(); + + server.inject('/', function (res) { + + expect(res.result).to.equal(6); + done(); + }); + }); + }); + }); + + it('binds onResponse to plugin bind', function (done) { + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.start(function () { + + var server = provisionServer(); + + var plugin = function (server, options, next) { + + var onResponseWithError = function (err, res, request, reply, settings, ttl) { + + reply(this.c); + }; + + var handler = { + proxy: { + host: 'localhost', + port: upstream.info.port, + onResponse: onResponseWithError + } + }; + + server.bind({ c: 7 }); + server.route({ method: 'GET', path: '/', config: { handler: handler } }); + return next(); + }; + + plugin.attributes = { + name: 'test' + }; + + server.register(plugin, function (err) { + + expect(err).to.not.exist(); + + server.inject('/', function (res) { + + expect(res.result).to.equal(7); + done(); + }); + }); + }); + }); + + it('binds onResponse to route bind config in plugin when plugin also has bind', function (done) { + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.start(function () { + + var server = provisionServer(); + + var plugin = function (server, options, next) { + + var onResponseWithError = function (err, res, request, reply, settings, ttl) { + + reply(this.c); + }; + + var handler = { + proxy: { + host: 'localhost', + port: upstream.info.port, + onResponse: onResponseWithError + } + }; + + server.bind({ c: 7 }); + server.route({ method: 'GET', path: '/', config: { handler: handler, bind: { c: 4 } } }); + return next(); + }; + + plugin.attributes = { + name: 'test' + }; + + server.register(plugin, function (err) { + + expect(err).to.not.exist(); + + server.inject('/', function (res) { + + expect(res.result).to.equal(4); + done(); + }); + }); + }); + }); + + it('calls the onResponse function if the upstream is unreachable', function (done) { + + var dummy = new Hapi.Server(); + dummy.connection(); + dummy.start(function () { + + var dummyPort = dummy.info.port; + dummy.stop(); + + var failureResponse = function (err, res, request, reply, settings, ttl) { + + reply(err); + }; + + var server = provisionServer(); + server.route({ method: 'GET', path: '/failureResponse', handler: { proxy: { host: 'localhost', port: dummyPort, onResponse: failureResponse } }, config: { cache: { expiresIn: 500 } } }); + + server.inject('/failureResponse', function (res) { + + expect(res.statusCode).to.equal(502); + done(); + }); + }); + }); + + it('sets x-forwarded-* headers', function (done) { + + var handler = function (request, reply) { + + reply(request.raw.req.headers); + }; + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/', handler: handler }); + upstream.start(function () { + + var mapUri = function (request, callback) { + + return callback(null, 'http://127.0.0.1:' + upstream.info.port + '/'); + }; + + var server = provisionServer({ host: '127.0.0.1' }); + server.route({ method: 'GET', path: '/', handler: { proxy: { mapUri: mapUri, xforward: true } } }); + + server.start(function () { + + Wreck.get('http://127.0.0.1:' + server.info.port + '/', function (err, res, body) { + + expect(res.statusCode).to.equal(200); + var result = JSON.parse(body); + + var expectedClientAddress = '127.0.0.1'; + if (Net.isIPv6(server.listener.address().address)) { + expectedClientAddress = '::ffff:127.0.0.1'; + } + + expect(result['x-forwarded-for']).to.equal(expectedClientAddress); + expect(result['x-forwarded-port']).to.match(/\d+/); + expect(result['x-forwarded-proto']).to.equal('http'); + + server.stop(); + upstream.stop(); + done(); + }); + }); + }); + }); + + it('adds x-forwarded-* headers to existing', function (done) { + + var handler = function (request, reply) { + + reply(request.raw.req.headers); + }; + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/', handler: handler }); + upstream.start(function () { + + var mapUri = function (request, callback) { + + var headers = { + 'x-forwarded-for': 'testhost', + 'x-forwarded-port': 1337, + 'x-forwarded-proto': 'https' + }; + + return callback(null, 'http://127.0.0.1:' + upstream.info.port + '/', headers); + }; + + var server = provisionServer({ host: '127.0.0.1' }); + server.route({ method: 'GET', path: '/', handler: { proxy: { mapUri: mapUri, xforward: true } } }); + + server.start(function () { + + Wreck.get('http://127.0.0.1:' + server.info.port + '/', function (err, res, body) { + + expect(res.statusCode).to.equal(200); + var result = JSON.parse(body); + + var expectedClientAddress = '127.0.0.1'; + if (Net.isIPv6(server.listener.address().address)) { + expectedClientAddress = '::ffff:127.0.0.1'; + } + + expect(result['x-forwarded-for']).to.equal('testhost,' + expectedClientAddress); + expect(result['x-forwarded-port']).to.match(/1337\,\d+/); + expect(result['x-forwarded-proto']).to.equal('https,http'); + + server.stop(); + upstream.stop(); + done(); + }); + }); + }); + }); + + it('does not clobber existing x-forwarded-* headers', function (done) { + + var handler = function (request, reply) { + + reply(request.raw.req.headers); + }; + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/', handler: handler }); + upstream.start(function () { + + var mapUri = function (request, callback) { + + var headers = { + 'x-forwarded-for': 'testhost', + 'x-forwarded-port': 1337, + 'x-forwarded-proto': 'https' + }; + + return callback(null, 'http://127.0.0.1:' + upstream.info.port + '/', headers); + }; + + var server = provisionServer(); + server.route({ method: 'GET', path: '/', handler: { proxy: { mapUri: mapUri, xforward: true } } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + var result = JSON.parse(res.payload); + expect(result['x-forwarded-for']).to.equal('testhost'); + expect(result['x-forwarded-port']).to.equal('1337'); + expect(result['x-forwarded-proto']).to.equal('https'); + done(); + }); + }); + }); + + it('forwards on a POST body', function (done) { + + var echoPostBody = function (request, reply) { + + reply(request.payload.echo + request.raw.req.headers['x-super-special']); + }; + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'POST', path: '/echo', handler: echoPostBody }); + upstream.start(function () { + + var mapUri = function (request, callback) { + + return callback(null, 'http://127.0.0.1:' + upstream.info.port + request.path + (request.url.search || ''), { 'x-super-special': '@' }); + }; + + var server = provisionServer(); + server.route({ method: 'POST', path: '/echo', handler: { proxy: { mapUri: mapUri } } }); + + server.inject({ url: '/echo', method: 'POST', payload: '{"echo":true}' }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.payload).to.equal('true@'); + done(); + }); + }); + }); + + it('replies with an error when it occurs in mapUri', function (done) { + + var mapUriWithError = function (request, callback) { + + return callback(new Error('myerror')); + }; + + var server = provisionServer(); + server.route({ method: 'GET', path: '/maperror', handler: { proxy: { mapUri: mapUriWithError } } }); + + server.inject('/maperror', function (res) { + + expect(res.statusCode).to.equal(500); + done(); + }); + }); + + it('maxs out redirects to same endpoint', function (done) { + + var redirectHandler = function (request, reply) { + + reply.redirect('/redirect?x=1'); + }; + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/redirect', handler: redirectHandler }); + upstream.start(function () { + + var server = provisionServer(); + server.route({ method: 'GET', path: '/redirect', handler: { proxy: { host: 'localhost', port: upstream.info.port, passThrough: true, redirects: 2 } } }); + + server.inject('/redirect?x=1', function (res) { + + expect(res.statusCode).to.equal(502); + done(); + }); + }); + }); + + it('errors on redirect missing location header', function (done) { + + var redirectHandler = function (request, reply) { + + reply().code(302); + }; + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/redirect', handler: redirectHandler }); + upstream.start(function () { + + var server = provisionServer(); + server.route({ method: 'GET', path: '/redirect', handler: { proxy: { host: 'localhost', port: upstream.info.port, passThrough: true, redirects: 2 } } }); + + server.inject('/redirect?x=3', function (res) { + + expect(res.statusCode).to.equal(502); + done(); + }); + }); + }); + + it('errors on redirection to bad host', function (done) { + + var server = provisionServer(); + server.route({ method: 'GET', path: '/nowhere', handler: { proxy: { host: 'no.such.domain.x8' } } }); + + server.inject('/nowhere', function (res) { + + expect(res.statusCode).to.equal(502); + done(); + }); + }); + + it('errors on redirection to bad host (https)', function (done) { + + var server = provisionServer(); + server.route({ method: 'GET', path: '/nowhere', handler: { proxy: { host: 'no.such.domain.x8', protocol: 'https' } } }); + + server.inject('/nowhere', function (res) { + + expect(res.statusCode).to.equal(502); + done(); + }); + }); + + it('redirects to another endpoint', function (done) { + + var redirectHandler = function (request, reply) { + + reply.redirect('/profile'); + }; + + var profile = function (request, reply) { + + reply({ id: 'fa0dbda9b1b', name: 'John Doe' }).state('test', '123'); + }; + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/redirect', handler: redirectHandler }); + upstream.route({ method: 'GET', path: '/profile', handler: profile, config: { cache: { expiresIn: 2000 } } }); + upstream.start(function () { + + var server = provisionServer(); + server.route({ method: 'GET', path: '/redirect', handler: { proxy: { host: 'localhost', port: upstream.info.port, passThrough: true, redirects: 2 } } }); + server.state('auto', { autoValue: 'xyz' }); + + server.inject('/redirect', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.payload).to.contain('John Doe'); + expect(res.headers['set-cookie']).to.deep.equal(['test=123', 'auto=xyz']); + done(); + }); + }); + }); + + it('redirects to another endpoint with relative location', function (done) { + + var redirectHandler = function (request, reply) { + + reply().header('Location', '//localhost:' + request.server.info.port + '/profile').code(302); + }; + + var profile = function (request, reply) { + + reply({ id: 'fa0dbda9b1b', name: 'John Doe' }).state('test', '123'); + }; + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/redirect', handler: redirectHandler }); + upstream.route({ method: 'GET', path: '/profile', handler: profile, config: { cache: { expiresIn: 2000 } } }); + upstream.start(function () { + + var server = provisionServer(); + server.route({ method: 'GET', path: '/redirect', handler: { proxy: { host: 'localhost', port: upstream.info.port, passThrough: true, redirects: 2 } } }); + server.state('auto', { autoValue: 'xyz' }); + + server.inject('/redirect?x=2', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.payload).to.contain('John Doe'); + expect(res.headers['set-cookie']).to.deep.equal(['test=123', 'auto=xyz']); + done(); + }); + }); + }); + + it('redirects to a post endpoint with stream', function (done) { + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'POST', path: '/post1', handler: function (request, reply) { reply.redirect('/post2').rewritable(false); } }); + upstream.route({ method: 'POST', path: '/post2', handler: function (request, reply) { reply(request.payload); } }); + upstream.start(function () { + + var server = provisionServer(); + server.route({ method: 'POST', path: '/post1', handler: { proxy: { host: 'localhost', port: upstream.info.port, redirects: 3 } }, config: { payload: { output: 'stream' } } }); + + server.inject({ method: 'POST', url: '/post1', payload: 'test', headers: { 'content-type': 'text/plain' } }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.payload).to.equal('test'); + done(); + }); + }); + }); + + it('errors when proxied request times out', function (done) { + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/timeout1', handler: function (request, reply) { setTimeout(function () { reply('Ok'); }, 10); } }); + upstream.start(function () { + + var server = provisionServer(); + server.route({ method: 'GET', path: '/timeout1', handler: { proxy: { host: 'localhost', port: upstream.info.port, timeout: 5 } } }); + + server.inject('/timeout1', function (res) { + + expect(res.statusCode).to.equal(504); + done(); + }); + }); + }); + + it('uses default timeout when nothing is set', function (done) { + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/timeout2', handler: function (request, reply) { setTimeout(function () { reply('Ok'); }, 10); } }); + upstream.start(function () { + + var server = provisionServer(); + server.route({ method: 'GET', path: '/timeout2', handler: { proxy: { host: 'localhost', port: upstream.info.port } } }); + + server.inject('/timeout2', function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + }); + + it('uses rejectUnauthorized to allow proxy to self signed ssl server', function (done) { + + var tlsOptions = { + key: '-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA0UqyXDCqWDKpoNQQK/fdr0OkG4gW6DUafxdufH9GmkX/zoKz\ng/SFLrPipzSGINKWtyMvo7mPjXqqVgE10LDI3VFV8IR6fnART+AF8CW5HMBPGt/s\nfQW4W4puvBHkBxWSW1EvbecgNEIS9hTGvHXkFzm4xJ2e9DHp2xoVAjREC73B7JbF\nhc5ZGGchKw+CFmAiNysU0DmBgQcac0eg2pWoT+YGmTeQj6sRXO67n2xy/hA1DuN6\nA4WBK3wM3O4BnTG0dNbWUEbe7yAbV5gEyq57GhJIeYxRvveVDaX90LoAqM4cUH06\n6rciON0UbDHV2LP/JaH5jzBjUyCnKLLo5snlbwIDAQABAoIBAQDJm7YC3pJJUcxb\nc8x8PlHbUkJUjxzZ5MW4Zb71yLkfRYzsxrTcyQA+g+QzA4KtPY8XrZpnkgm51M8e\n+B16AcIMiBxMC6HgCF503i16LyyJiKrrDYfGy2rTK6AOJQHO3TXWJ3eT3BAGpxuS\n12K2Cq6EvQLCy79iJm7Ks+5G6EggMZPfCVdEhffRm2Epl4T7LpIAqWiUDcDfS05n\nNNfAGxxvALPn+D+kzcSF6hpmCVrFVTf9ouhvnr+0DpIIVPwSK/REAF3Ux5SQvFuL\njPmh3bGwfRtcC5d21QNrHdoBVSN2UBLmbHUpBUcOBI8FyivAWJhRfKnhTvXMFG8L\nwaXB51IZAoGBAP/E3uz6zCyN7l2j09wmbyNOi1AKvr1WSmuBJveITouwblnRSdvc\nsYm4YYE0Vb94AG4n7JIfZLKtTN0xvnCo8tYjrdwMJyGfEfMGCQQ9MpOBXAkVVZvP\ne2k4zHNNsfvSc38UNSt7K0HkVuH5BkRBQeskcsyMeu0qK4wQwdtiCoBDAoGBANF7\nFMppYxSW4ir7Jvkh0P8bP/Z7AtaSmkX7iMmUYT+gMFB5EKqFTQjNQgSJxS/uHVDE\nSC5co8WGHnRk7YH2Pp+Ty1fHfXNWyoOOzNEWvg6CFeMHW2o+/qZd4Z5Fep6qCLaa\nFvzWWC2S5YslEaaP8DQ74aAX4o+/TECrxi0z2lllAoGAdRB6qCSyRsI/k4Rkd6Lv\nw00z3lLMsoRIU6QtXaZ5rN335Awyrfr5F3vYxPZbOOOH7uM/GDJeOJmxUJxv+cia\nPQDflpPJZU4VPRJKFjKcb38JzO6C3Gm+po5kpXGuQQA19LgfDeO2DNaiHZOJFrx3\nm1R3Zr/1k491lwokcHETNVkCgYBPLjrZl6Q/8BhlLrG4kbOx+dbfj/euq5NsyHsX\n1uI7bo1Una5TBjfsD8nYdUr3pwWltcui2pl83Ak+7bdo3G8nWnIOJ/WfVzsNJzj7\n/6CvUzR6sBk5u739nJbfgFutBZBtlSkDQPHrqA7j3Ysibl3ZIJlULjMRKrnj6Ans\npCDwkQKBgQCM7gu3p7veYwCZaxqDMz5/GGFUB1My7sK0hcT7/oH61yw3O8pOekee\nuctI1R3NOudn1cs5TAy/aypgLDYTUGQTiBRILeMiZnOrvQQB9cEf7TFgDoRNCcDs\nV/ZWiegVB/WY7H0BkCekuq5bHwjgtJTpvHGqQ9YD7RhE8RSYOhdQ/Q==\n-----END RSA PRIVATE KEY-----\n', + cert: '-----BEGIN CERTIFICATE-----\nMIIDBjCCAe4CCQDvLNml6smHlTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJV\nUzETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0\ncyBQdHkgTHRkMB4XDTE0MDEyNTIxMjIxOFoXDTE1MDEyNTIxMjIxOFowRTELMAkG\nA1UEBhMCVVMxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0\nIFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nANFKslwwqlgyqaDUECv33a9DpBuIFug1Gn8Xbnx/RppF/86Cs4P0hS6z4qc0hiDS\nlrcjL6O5j416qlYBNdCwyN1RVfCEen5wEU/gBfAluRzATxrf7H0FuFuKbrwR5AcV\nkltRL23nIDRCEvYUxrx15Bc5uMSdnvQx6dsaFQI0RAu9weyWxYXOWRhnISsPghZg\nIjcrFNA5gYEHGnNHoNqVqE/mBpk3kI+rEVzuu59scv4QNQ7jegOFgSt8DNzuAZ0x\ntHTW1lBG3u8gG1eYBMquexoSSHmMUb73lQ2l/dC6AKjOHFB9Ouq3IjjdFGwx1diz\n/yWh+Y8wY1Mgpyiy6ObJ5W8CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAoSc6Skb4\ng1e0ZqPKXBV2qbx7hlqIyYpubCl1rDiEdVzqYYZEwmst36fJRRrVaFuAM/1DYAmT\nWMhU+yTfA+vCS4tql9b9zUhPw/IDHpBDWyR01spoZFBF/hE1MGNpCSXXsAbmCiVf\naxrIgR2DNketbDxkQx671KwF1+1JOMo9ffXp+OhuRo5NaGIxhTsZ+f/MA4y084Aj\nDI39av50sTRTWWShlN+J7PtdQVA5SZD97oYbeUeL7gI18kAJww9eUdmT0nEjcwKs\nxsQT1fyKbo7AlZBY4KSlUMuGnn0VnAsB9b+LxtXlDfnjyM8bVQx1uAfRo0DO8p/5\n3J5DTjAU55deBQ==\n-----END CERTIFICATE-----\n' + }; + + var upstream = new Hapi.Server(); + upstream.connection({ tls: tlsOptions }); + upstream.route({ method: 'GET', path: '/', handler: function (request, reply) { reply('Ok'); } }); + upstream.start(function () { + + var mapSslUri = function (request, callback) { + + return callback(null, 'https://127.0.0.1:' + upstream.info.port); + }; + + var server = provisionServer(); + server.route({ method: 'GET', path: '/allow', handler: { proxy: { mapUri: mapSslUri, rejectUnauthorized: false } } }); + server.inject('/allow', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.payload).to.equal('Ok'); + done(); + }); + }); + }); + + it('uses rejectUnauthorized to not allow proxy to self signed ssl server', function (done) { + + var tlsOptions = { + key: '-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA0UqyXDCqWDKpoNQQK/fdr0OkG4gW6DUafxdufH9GmkX/zoKz\ng/SFLrPipzSGINKWtyMvo7mPjXqqVgE10LDI3VFV8IR6fnART+AF8CW5HMBPGt/s\nfQW4W4puvBHkBxWSW1EvbecgNEIS9hTGvHXkFzm4xJ2e9DHp2xoVAjREC73B7JbF\nhc5ZGGchKw+CFmAiNysU0DmBgQcac0eg2pWoT+YGmTeQj6sRXO67n2xy/hA1DuN6\nA4WBK3wM3O4BnTG0dNbWUEbe7yAbV5gEyq57GhJIeYxRvveVDaX90LoAqM4cUH06\n6rciON0UbDHV2LP/JaH5jzBjUyCnKLLo5snlbwIDAQABAoIBAQDJm7YC3pJJUcxb\nc8x8PlHbUkJUjxzZ5MW4Zb71yLkfRYzsxrTcyQA+g+QzA4KtPY8XrZpnkgm51M8e\n+B16AcIMiBxMC6HgCF503i16LyyJiKrrDYfGy2rTK6AOJQHO3TXWJ3eT3BAGpxuS\n12K2Cq6EvQLCy79iJm7Ks+5G6EggMZPfCVdEhffRm2Epl4T7LpIAqWiUDcDfS05n\nNNfAGxxvALPn+D+kzcSF6hpmCVrFVTf9ouhvnr+0DpIIVPwSK/REAF3Ux5SQvFuL\njPmh3bGwfRtcC5d21QNrHdoBVSN2UBLmbHUpBUcOBI8FyivAWJhRfKnhTvXMFG8L\nwaXB51IZAoGBAP/E3uz6zCyN7l2j09wmbyNOi1AKvr1WSmuBJveITouwblnRSdvc\nsYm4YYE0Vb94AG4n7JIfZLKtTN0xvnCo8tYjrdwMJyGfEfMGCQQ9MpOBXAkVVZvP\ne2k4zHNNsfvSc38UNSt7K0HkVuH5BkRBQeskcsyMeu0qK4wQwdtiCoBDAoGBANF7\nFMppYxSW4ir7Jvkh0P8bP/Z7AtaSmkX7iMmUYT+gMFB5EKqFTQjNQgSJxS/uHVDE\nSC5co8WGHnRk7YH2Pp+Ty1fHfXNWyoOOzNEWvg6CFeMHW2o+/qZd4Z5Fep6qCLaa\nFvzWWC2S5YslEaaP8DQ74aAX4o+/TECrxi0z2lllAoGAdRB6qCSyRsI/k4Rkd6Lv\nw00z3lLMsoRIU6QtXaZ5rN335Awyrfr5F3vYxPZbOOOH7uM/GDJeOJmxUJxv+cia\nPQDflpPJZU4VPRJKFjKcb38JzO6C3Gm+po5kpXGuQQA19LgfDeO2DNaiHZOJFrx3\nm1R3Zr/1k491lwokcHETNVkCgYBPLjrZl6Q/8BhlLrG4kbOx+dbfj/euq5NsyHsX\n1uI7bo1Una5TBjfsD8nYdUr3pwWltcui2pl83Ak+7bdo3G8nWnIOJ/WfVzsNJzj7\n/6CvUzR6sBk5u739nJbfgFutBZBtlSkDQPHrqA7j3Ysibl3ZIJlULjMRKrnj6Ans\npCDwkQKBgQCM7gu3p7veYwCZaxqDMz5/GGFUB1My7sK0hcT7/oH61yw3O8pOekee\nuctI1R3NOudn1cs5TAy/aypgLDYTUGQTiBRILeMiZnOrvQQB9cEf7TFgDoRNCcDs\nV/ZWiegVB/WY7H0BkCekuq5bHwjgtJTpvHGqQ9YD7RhE8RSYOhdQ/Q==\n-----END RSA PRIVATE KEY-----\n', + cert: '-----BEGIN CERTIFICATE-----\nMIIDBjCCAe4CCQDvLNml6smHlTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJV\nUzETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0\ncyBQdHkgTHRkMB4XDTE0MDEyNTIxMjIxOFoXDTE1MDEyNTIxMjIxOFowRTELMAkG\nA1UEBhMCVVMxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0\nIFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nANFKslwwqlgyqaDUECv33a9DpBuIFug1Gn8Xbnx/RppF/86Cs4P0hS6z4qc0hiDS\nlrcjL6O5j416qlYBNdCwyN1RVfCEen5wEU/gBfAluRzATxrf7H0FuFuKbrwR5AcV\nkltRL23nIDRCEvYUxrx15Bc5uMSdnvQx6dsaFQI0RAu9weyWxYXOWRhnISsPghZg\nIjcrFNA5gYEHGnNHoNqVqE/mBpk3kI+rEVzuu59scv4QNQ7jegOFgSt8DNzuAZ0x\ntHTW1lBG3u8gG1eYBMquexoSSHmMUb73lQ2l/dC6AKjOHFB9Ouq3IjjdFGwx1diz\n/yWh+Y8wY1Mgpyiy6ObJ5W8CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAoSc6Skb4\ng1e0ZqPKXBV2qbx7hlqIyYpubCl1rDiEdVzqYYZEwmst36fJRRrVaFuAM/1DYAmT\nWMhU+yTfA+vCS4tql9b9zUhPw/IDHpBDWyR01spoZFBF/hE1MGNpCSXXsAbmCiVf\naxrIgR2DNketbDxkQx671KwF1+1JOMo9ffXp+OhuRo5NaGIxhTsZ+f/MA4y084Aj\nDI39av50sTRTWWShlN+J7PtdQVA5SZD97oYbeUeL7gI18kAJww9eUdmT0nEjcwKs\nxsQT1fyKbo7AlZBY4KSlUMuGnn0VnAsB9b+LxtXlDfnjyM8bVQx1uAfRo0DO8p/5\n3J5DTjAU55deBQ==\n-----END CERTIFICATE-----\n' + }; + + var upstream = new Hapi.Server(); + upstream.connection({ tls: tlsOptions }); + upstream.route({ method: 'GET', path: '/', handler: function (request, reply) { reply('Ok'); } }); + upstream.start(function () { + + var mapSslUri = function (request, callback) { + + return callback(null, 'https://127.0.0.1:' + upstream.info.port); + }; + + var server = provisionServer(); + server.route({ method: 'GET', path: '/reject', handler: { proxy: { mapUri: mapSslUri, rejectUnauthorized: true } } }); + server.inject('/reject', function (res) { + + expect(res.statusCode).to.equal(502); + done(); + }); + }); + }); + + it('the default rejectUnauthorized should not allow proxied server cert to be self signed', function (done) { + + var tlsOptions = { + key: '-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA0UqyXDCqWDKpoNQQK/fdr0OkG4gW6DUafxdufH9GmkX/zoKz\ng/SFLrPipzSGINKWtyMvo7mPjXqqVgE10LDI3VFV8IR6fnART+AF8CW5HMBPGt/s\nfQW4W4puvBHkBxWSW1EvbecgNEIS9hTGvHXkFzm4xJ2e9DHp2xoVAjREC73B7JbF\nhc5ZGGchKw+CFmAiNysU0DmBgQcac0eg2pWoT+YGmTeQj6sRXO67n2xy/hA1DuN6\nA4WBK3wM3O4BnTG0dNbWUEbe7yAbV5gEyq57GhJIeYxRvveVDaX90LoAqM4cUH06\n6rciON0UbDHV2LP/JaH5jzBjUyCnKLLo5snlbwIDAQABAoIBAQDJm7YC3pJJUcxb\nc8x8PlHbUkJUjxzZ5MW4Zb71yLkfRYzsxrTcyQA+g+QzA4KtPY8XrZpnkgm51M8e\n+B16AcIMiBxMC6HgCF503i16LyyJiKrrDYfGy2rTK6AOJQHO3TXWJ3eT3BAGpxuS\n12K2Cq6EvQLCy79iJm7Ks+5G6EggMZPfCVdEhffRm2Epl4T7LpIAqWiUDcDfS05n\nNNfAGxxvALPn+D+kzcSF6hpmCVrFVTf9ouhvnr+0DpIIVPwSK/REAF3Ux5SQvFuL\njPmh3bGwfRtcC5d21QNrHdoBVSN2UBLmbHUpBUcOBI8FyivAWJhRfKnhTvXMFG8L\nwaXB51IZAoGBAP/E3uz6zCyN7l2j09wmbyNOi1AKvr1WSmuBJveITouwblnRSdvc\nsYm4YYE0Vb94AG4n7JIfZLKtTN0xvnCo8tYjrdwMJyGfEfMGCQQ9MpOBXAkVVZvP\ne2k4zHNNsfvSc38UNSt7K0HkVuH5BkRBQeskcsyMeu0qK4wQwdtiCoBDAoGBANF7\nFMppYxSW4ir7Jvkh0P8bP/Z7AtaSmkX7iMmUYT+gMFB5EKqFTQjNQgSJxS/uHVDE\nSC5co8WGHnRk7YH2Pp+Ty1fHfXNWyoOOzNEWvg6CFeMHW2o+/qZd4Z5Fep6qCLaa\nFvzWWC2S5YslEaaP8DQ74aAX4o+/TECrxi0z2lllAoGAdRB6qCSyRsI/k4Rkd6Lv\nw00z3lLMsoRIU6QtXaZ5rN335Awyrfr5F3vYxPZbOOOH7uM/GDJeOJmxUJxv+cia\nPQDflpPJZU4VPRJKFjKcb38JzO6C3Gm+po5kpXGuQQA19LgfDeO2DNaiHZOJFrx3\nm1R3Zr/1k491lwokcHETNVkCgYBPLjrZl6Q/8BhlLrG4kbOx+dbfj/euq5NsyHsX\n1uI7bo1Una5TBjfsD8nYdUr3pwWltcui2pl83Ak+7bdo3G8nWnIOJ/WfVzsNJzj7\n/6CvUzR6sBk5u739nJbfgFutBZBtlSkDQPHrqA7j3Ysibl3ZIJlULjMRKrnj6Ans\npCDwkQKBgQCM7gu3p7veYwCZaxqDMz5/GGFUB1My7sK0hcT7/oH61yw3O8pOekee\nuctI1R3NOudn1cs5TAy/aypgLDYTUGQTiBRILeMiZnOrvQQB9cEf7TFgDoRNCcDs\nV/ZWiegVB/WY7H0BkCekuq5bHwjgtJTpvHGqQ9YD7RhE8RSYOhdQ/Q==\n-----END RSA PRIVATE KEY-----\n', + cert: '-----BEGIN CERTIFICATE-----\nMIIDBjCCAe4CCQDvLNml6smHlTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJV\nUzETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0\ncyBQdHkgTHRkMB4XDTE0MDEyNTIxMjIxOFoXDTE1MDEyNTIxMjIxOFowRTELMAkG\nA1UEBhMCVVMxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0\nIFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nANFKslwwqlgyqaDUECv33a9DpBuIFug1Gn8Xbnx/RppF/86Cs4P0hS6z4qc0hiDS\nlrcjL6O5j416qlYBNdCwyN1RVfCEen5wEU/gBfAluRzATxrf7H0FuFuKbrwR5AcV\nkltRL23nIDRCEvYUxrx15Bc5uMSdnvQx6dsaFQI0RAu9weyWxYXOWRhnISsPghZg\nIjcrFNA5gYEHGnNHoNqVqE/mBpk3kI+rEVzuu59scv4QNQ7jegOFgSt8DNzuAZ0x\ntHTW1lBG3u8gG1eYBMquexoSSHmMUb73lQ2l/dC6AKjOHFB9Ouq3IjjdFGwx1diz\n/yWh+Y8wY1Mgpyiy6ObJ5W8CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAoSc6Skb4\ng1e0ZqPKXBV2qbx7hlqIyYpubCl1rDiEdVzqYYZEwmst36fJRRrVaFuAM/1DYAmT\nWMhU+yTfA+vCS4tql9b9zUhPw/IDHpBDWyR01spoZFBF/hE1MGNpCSXXsAbmCiVf\naxrIgR2DNketbDxkQx671KwF1+1JOMo9ffXp+OhuRo5NaGIxhTsZ+f/MA4y084Aj\nDI39av50sTRTWWShlN+J7PtdQVA5SZD97oYbeUeL7gI18kAJww9eUdmT0nEjcwKs\nxsQT1fyKbo7AlZBY4KSlUMuGnn0VnAsB9b+LxtXlDfnjyM8bVQx1uAfRo0DO8p/5\n3J5DTjAU55deBQ==\n-----END CERTIFICATE-----\n' + }; + + var upstream = new Hapi.Server(); + upstream.connection({ tls: tlsOptions }); + upstream.route({ method: 'GET', path: '/', handler: function (request, reply) { reply('Ok'); } }); + upstream.start(function () { + + var mapSslUri = function (request, callback) { + + return callback(null, 'https://127.0.0.1:' + upstream.info.port); + }; + + var server = provisionServer(); + server.route({ method: 'GET', path: '/sslDefault', handler: { proxy: { mapUri: mapSslUri } } }); + server.inject('/sslDefault', function (res) { + + expect(res.statusCode).to.equal(502); + done(); + }); + }); + }); + + it('times out when proxy timeout is less than server', { parallel: false }, function (done) { + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/timeout2', handler: function (request, reply) { setTimeout(function () { reply('Ok'); }, 10); } }); + upstream.start(function () { + + var server = provisionServer({ routes: { timeout: { server: 8 } } }); + server.route({ method: 'GET', path: '/timeout2', handler: { proxy: { host: 'localhost', port: upstream.info.port, timeout: 2 } } }); + server.inject('/timeout2', function (res) { + + expect(res.statusCode).to.equal(504); + done(); + }); + }); + }); + + it('times out when server timeout is less than proxy', function (done) { + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/timeout1', handler: function (request, reply) { setTimeout(function () { reply('Ok'); }, 10); } }); + upstream.start(function () { + + var server = provisionServer({ routes: { timeout: { server: 5 } } }); + server.route({ method: 'GET', path: '/timeout1', handler: { proxy: { host: 'localhost', port: upstream.info.port, timeout: 15 } } }); + server.inject('/timeout1', function (res) { + + expect(res.statusCode).to.equal(503); + done(); + }); + }); + }); + + it('proxies via uri template', function (done) { + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/item', handler: function (request, reply) { reply({ a: 1 }); } }); + upstream.start(function () { + + var server = provisionServer(); + server.route({ method: 'GET', path: '/handlerTemplate', handler: { proxy: { uri: '{protocol}://localhost:' + upstream.info.port + '/item' } } }); + + server.inject('/handlerTemplate', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.payload).to.contain('"a":1'); + done(); + }); + }); + }); + + it('passes upstream caching headers', function (done) { + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/cachedItem', handler: function (request, reply) { reply({ a: 1 }); }, config: { cache: { expiresIn: 2000 } } }); + upstream.start(function () { + + var server = provisionServer(); + server.route({ method: 'GET', path: '/cachedItem', handler: { proxy: { host: 'localhost', port: upstream.info.port, ttl: 'upstream' } } }); + server.state('auto', { autoValue: 'xyz' }); + + server.inject('/cachedItem', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.headers['cache-control']).to.equal('max-age=2, must-revalidate, private'); + done(); + }); + }); + }); + + it('ignores when no upstream caching headers to pass', function (done) { + + var upstream = Http.createServer(function (req, res) { + + res.end('not much'); + }); + + upstream.listen(0, function () { + + var server = provisionServer(); + server.route({ method: 'GET', path: '/', handler: { proxy: { host: 'localhost', port: upstream.address().port, ttl: 'upstream' } } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.headers['cache-control']).to.equal('no-cache'); + done(); + }); + }); + }); + + it('ignores when upstream caching header is invalid', function (done) { + + var upstream = Http.createServer(function (req, res) { + + res.writeHeader(200, { 'cache-control': 'some crap that does not work' }); + res.end('not much'); + }); + + upstream.listen(0, function () { + + var server = provisionServer(); + server.route({ method: 'GET', path: '/', handler: { proxy: { host: 'localhost', port: upstream.address().port, ttl: 'upstream' } } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.headers['cache-control']).to.equal('no-cache'); + // expect(res.headers['cache-control']).to.not.exist; + done(); + }); + }); + }); + + it('overrides response code with 304', function (done) { + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/item', handler: function (request, reply) { reply({ a: 1 }); } }); + upstream.start(function () { + + var onResponse304 = function (err, res, request, reply, settings, ttl) { + + reply(res).code(304); + }; + + var server = provisionServer(); + server.route({ method: 'GET', path: '/304', handler: { proxy: { uri: 'http://localhost:' + upstream.info.port + '/item', onResponse: onResponse304 } } }); + + server.inject('/304', function (res) { + + expect(res.statusCode).to.equal(304); + expect(res.payload).to.equal(''); + done(); + }); + }); + }); + + it('cleans up when proxy response replaced in onPreResponse', function (done) { + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/item', handler: function (request, reply) { reply({ a: 1 }); } }); + upstream.start(function () { + + var server = provisionServer(); + server.ext('onPreResponse', function (request, reply) { + + reply({ something: 'else' }); + }); + + server.route({ method: 'GET', path: '/item', handler: { proxy: { host: 'localhost', port: upstream.info.port } } }); + + server.inject('/item', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result.something).to.equal('else'); + done(); + }); + }); + }); + + it('retails accept-encoding header', function (done) { + + var profile = function (request, reply) { + + reply(request.headers['accept-encoding']); + }; + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/', handler: profile, config: { cache: { expiresIn: 2000 } } }); + upstream.start(function () { + + var server = provisionServer(); + server.route({ method: 'GET', path: '/', handler: { proxy: { host: 'localhost', port: upstream.info.port, acceptEncoding: true, passThrough: true } } }); + + server.inject({ url: '/', headers: { 'accept-encoding': '*/*' } }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.payload).to.equal('*/*'); + done(); + }); + }); + }); + + it('removes accept-encoding header', function (done) { + + var profile = function (request, reply) { + + reply(request.headers['accept-encoding']); + }; + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/', handler: profile, config: { cache: { expiresIn: 2000 } } }); + upstream.start(function () { + + var server = provisionServer(); + server.route({ method: 'GET', path: '/', handler: { proxy: { host: 'localhost', port: upstream.info.port, acceptEncoding: false, passThrough: true } } }); + + server.inject({ url: '/', headers: { 'accept-encoding': '*/*' } }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.payload).to.equal(''); + done(); + }); + }); + }); + + it('does not send multiple Content-Type headers on passthrough', { parallel: false }, function (done) { + + var server = provisionServer(); + + var requestFn = Wreck.request; + Wreck.request = function (method, url, options, cb) { + + Wreck.request = requestFn; + expect(options.headers['content-type']).to.equal('application/json'); + expect(options.headers['Content-Type']).to.not.exist(); + cb(new Error('placeholder')); + }; + server.route({ method: 'GET', path: '/test', handler: { proxy: { uri: 'http://localhost', passThrough: true } } }); + server.inject({ method: 'GET', url: '/test', headers: { 'Content-Type': 'application/json' } }, function (res) { + + done(); + }); + }); + + it('allows passing in an agent through to Wreck', { parallel: false }, function (done) { + + var server = provisionServer(); + var agent = { name: 'myagent' }; + + var requestFn = Wreck.request; + Wreck.request = function (method, url, options, cb) { + + Wreck.request = requestFn; + expect(options.agent).to.equal(agent); + done(); + + }; + server.route({ method: 'GET', path: '/agenttest', handler: { proxy: { uri: 'http://localhost', agent: agent } } }); + server.inject({ method: 'GET', url: '/agenttest', headers: {} }, function (res) { }); + }); + + it('excludes request cookies defined locally', function (done) { + + var handler = function (request, reply) { + + reply(request.state); + }; + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/', handler: handler }); + upstream.start(function () { + + var server = provisionServer(); + server.state('a'); + + server.route({ method: 'GET', path: '/', handler: { proxy: { host: 'localhost', port: upstream.info.port, passThrough: true } } }); + + server.inject({ url: '/', headers: { cookie: 'a=1;b=2' } }, function (res) { + + expect(res.statusCode).to.equal(200); + var cookies = JSON.parse(res.payload); + expect(cookies).to.deep.equal({ b: '2' }); + done(); + }); + }); + }); + + it('includes request cookies defined locally (route level)', function (done) { + + var handler = function (request, reply) { + + reply(request.state); + }; + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/', handler: handler }); + upstream.start(function () { + + var server = provisionServer(); + server.state('a', { passThrough: true }); + + server.route({ method: 'GET', path: '/', handler: { proxy: { host: 'localhost', port: upstream.info.port, passThrough: true, localStatePassThrough: true } } }); + + server.inject({ url: '/', headers: { cookie: 'a=1;b=2' } }, function (res) { + + expect(res.statusCode).to.equal(200); + var cookies = JSON.parse(res.payload); + expect(cookies).to.deep.equal({ a: '1', b: '2' }); + done(); + }); + }); + }); + + it('includes request cookies defined locally (cookie level)', function (done) { + + var handler = function (request, reply) { + + reply(request.state); + }; + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/', handler: handler }); + upstream.start(function () { + + var server = provisionServer(); + server.state('a', { passThrough: true }); + + server.route({ method: 'GET', path: '/', handler: { proxy: { host: 'localhost', port: upstream.info.port, passThrough: true } } }); + + server.inject({ url: '/', headers: { cookie: 'a=1;b=2' } }, function (res) { + + expect(res.statusCode).to.equal(200); + var cookies = JSON.parse(res.payload); + expect(cookies).to.deep.equal({ a: '1', b: '2' }); + done(); + }); + }); + }); + + it('errors on invalid cookie header', function (done) { + + var server = provisionServer({ routes: { state: { failAction: 'ignore' } } }); + server.state('a', { passThrough: true }); + + server.route({ method: 'GET', path: '/', handler: { proxy: { host: 'localhost', port: 8080, passThrough: true } } }); + + server.inject({ url: '/', headers: { cookie: 'a' } }, function (res) { + + expect(res.statusCode).to.equal(400); + done(); + }); + }); + + it('drops cookies when all defined locally', function (done) { + + var handler = function (request, reply) { + + reply(request.state); + }; + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/', handler: handler }); + upstream.start(function () { + + var server = provisionServer(); + server.state('a'); + + server.route({ method: 'GET', path: '/', handler: { proxy: { host: 'localhost', port: upstream.info.port, passThrough: true } } }); + + server.inject({ url: '/', headers: { cookie: 'a=1' } }, function (res) { + + expect(res.statusCode).to.equal(200); + var cookies = JSON.parse(res.payload); + expect(cookies).to.deep.equal({}); + done(); + }); + }); + }); + + it('excludes request cookies defined locally (state override)', function (done) { + + var handler = function (request, reply) { + + return reply(request.state); + }; + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/', handler: handler }); + upstream.start(function () { + + var server = provisionServer(); + server.state('a', { passThrough: false }); + + server.route({ method: 'GET', path: '/', handler: { proxy: { host: 'localhost', port: upstream.info.port, passThrough: true } } }); + + server.inject({ url: '/', headers: { cookie: 'a=1;b=2' } }, function (res) { + + expect(res.statusCode).to.equal(200); + var cookies = JSON.parse(res.payload); + expect(cookies).to.deep.equal({ b: '2' }); + done(); + }); + }); + }); + + it('uses reply decorator', function (done) { + + var upstream = new Hapi.Server(); + upstream.connection(); + upstream.route({ method: 'GET', path: '/', handler: function (request, reply) { reply('ok'); } }); + upstream.start(function () { + + var server = provisionServer(); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply.proxy({ host: 'localhost', port: upstream.info.port, xforward: true, passThrough: true }); } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.payload).to.equal('ok'); + done(); + }); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/heavy/.npmignore b/node_modules/hapi/node_modules/heavy/.npmignore new file mode 100644 index 0000000..7e1574d --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/.npmignore @@ -0,0 +1,18 @@ +.idea +*.iml +npm-debug.log +dump.rdb +node_modules +results.tap +results.xml +npm-shrinkwrap.json +config.json +.DS_Store +*/.DS_Store +*/*/.DS_Store +._* +*/._* +*/*/._* +coverage.* +lib-cov +complexity.md diff --git a/node_modules/hapi/node_modules/heavy/.travis.yml b/node_modules/hapi/node_modules/heavy/.travis.yml new file mode 100755 index 0000000..047f7e3 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/.travis.yml @@ -0,0 +1,5 @@ +language: node_js + +node_js: + - 0.10 + diff --git a/node_modules/hapi/node_modules/heavy/CONTRIBUTING.md b/node_modules/hapi/node_modules/heavy/CONTRIBUTING.md new file mode 100755 index 0000000..a45f42e --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/CONTRIBUTING.md @@ -0,0 +1,16 @@ +# How to contribute +We welcome contributions from the community and are pleased to have them. Please follow this guide when logging issues or making code changes. + +## Logging Issues +All issues should be created using the [new issue form](https://github.com/hapijs/heavy/issues/new). Clearly describe the issue including steps +to reproduce if there are any. Also, make sure to indicate the earliest version that has the issue being reported. + +## Patching Code + +Code changes are welcome and should follow the guidelines below. + +* Fork the repository on GitHub. +* Fix the issue ensuring that your code follows the [style guide](https://github.com/hapijs/contrib/blob/master/Style.md). +* Add tests for your new code ensuring that you have 100% code coverage (we can help you reach 100% but will not merge without it). + * Run `npm test` to generate a report of test coverage +* [Pull requests](http://help.github.com/send-pull-requests/) should be made to the [master branch](https://github.com/hapijs/heavy/tree/master). diff --git a/node_modules/hapi/node_modules/heavy/LICENSE b/node_modules/hapi/node_modules/heavy/LICENSE new file mode 100755 index 0000000..2421c2e --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2013-2014, Walmart and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/heavy/graphs/contributors diff --git a/node_modules/hapi/node_modules/heavy/Makefile b/node_modules/hapi/node_modules/heavy/Makefile new file mode 100755 index 0000000..83aaf0c --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/Makefile @@ -0,0 +1,8 @@ +test: + @node node_modules/lab/bin/lab -a code +test-cov: + @node node_modules/lab/bin/lab -a code -t 100 -L +test-cov-html: + @node node_modules/lab/bin/lab -a code -r html -o coverage.html + +.PHONY: test test-cov test-cov-html diff --git a/node_modules/hapi/node_modules/heavy/README.md b/node_modules/hapi/node_modules/heavy/README.md new file mode 100644 index 0000000..7636f7f --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/README.md @@ -0,0 +1,7 @@ +#heavy + +Measure process load. + +[![Build Status](https://secure.travis-ci.org/hapijs/heavy.png)](http://travis-ci.org/hapijs/heavy) + +Lead Maintainer - [Kevin Decker](https://github.com/kpdecker) diff --git a/node_modules/hapi/node_modules/heavy/index.js b/node_modules/hapi/node_modules/heavy/index.js new file mode 100755 index 0000000..bb0a047 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/index.js @@ -0,0 +1 @@ +module.exports = require('./lib'); diff --git a/node_modules/hapi/node_modules/heavy/lib/index.js b/node_modules/hapi/node_modules/heavy/lib/index.js new file mode 100755 index 0000000..c9dac03 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/lib/index.js @@ -0,0 +1,144 @@ +// Load modules + +var Boom = require('boom'); +var Hoek = require('hoek'); +var Joi = require('joi'); + + +// Declare internals + +var internals = {}; + + +internals.schema = { + process: Joi.object({ + sampleInterval: Joi.number().min(0) + }), + policy: Joi.object({ + maxHeapUsedBytes: Joi.number().min(0), + maxEventLoopDelay: Joi.number().min(0), + maxRssBytes: Joi.number().min(0) + }) +}; + + +internals.defaults = { + process: { + sampleInterval: 0 // Frequency of load sampling in milliseconds (zero is no sampling) + }, + policy: { + maxHeapUsedBytes: 0, // Reject requests when V8 heap is over size in bytes (zero is no max) + maxRssBytes: 0, // Reject requests when process RSS is over size in bytes (zero is no max) + maxEventLoopDelay: 0 // Milliseconds of delay after which requests are rejected (zero is no max) + } +}; + + +exports = module.exports = internals.Heavy = function (options) { + + options = options || {}; + + Joi.assert(options, internals.schema.process, 'Invalid load monitoring options'); + this.settings = Hoek.applyToDefaults(internals.defaults, options); + + this._eventLoopTimer = null; + this._loadBench = new Hoek.Bench(); + this.load = { + eventLoopDelay: 0, + heapUsed: 0, + rss: 0 + }; +}; + + +internals.Heavy.prototype.start = function () { + + var self = this; + + if (!this.settings.sampleInterval) { + return; + } + + var loopSample = function () { + + self._loadBench.reset(); + var measure = function () { + + var mem = process.memoryUsage(); + + // Retain the same this.load object to keep external references valid + + self.load.eventLoopDelay = (self._loadBench.elapsed() - self.settings.sampleInterval); + self.load.heapUsed = mem.heapUsed; + self.load.rss = mem.rss; + + loopSample(); + }; + + self._eventLoopTimer = setTimeout(measure, self.settings.sampleInterval); + }; + + loopSample(); +}; + + +internals.Heavy.prototype.stop = function () { + + clearTimeout(this._eventLoopTimer); + this._eventLoopTimer = null; +}; + + +internals.Heavy.prototype.policy = function (options) { + + return new internals.Policy(this, options); +}; + + +internals.Policy = function (process, options) { + + options = options || {}; + + Joi.assert(options, internals.schema.policy, 'Invalid load monitoring options'); + Hoek.assert(process.settings.sampleInterval || (!options.maxEventLoopDelay && !options.maxHeapUsedBytes && !options.maxRssBytes), 'Load sample interval must be set to enable load limits'); + + this._process = process; + this.settings = Hoek.applyToDefaults(internals.defaults.policy, options); +}; + + +internals.Policy.prototype.check = function () { + + if (!this._process.settings.sampleInterval) { + return null; + } + + Hoek.assert(this._process._eventLoopTimer, 'Cannot check load when sampler is not started'); + + var elapsed = this._process._loadBench.elapsed(); + var load = this._process.load; + + if (elapsed > this._process.settings.sampleInterval) { + load.eventLoopDelay = Math.max(load.eventLoopDelay, elapsed - this._process.settings.sampleInterval); + } + + if (this.settings.maxEventLoopDelay && + load.eventLoopDelay > this.settings.maxEventLoopDelay) { + + return Boom.serverTimeout('Server under heavy load (event loop)', load); + } + + if (this.settings.maxHeapUsedBytes && + load.heapUsed > this.settings.maxHeapUsedBytes) { + + return Boom.serverTimeout('Server under heavy load (heap)', load); + } + + if (this.settings.maxRssBytes && + load.rss > this.settings.maxRssBytes) { + + return Boom.serverTimeout('Server under heavy load (rss)', load); + } + + return null; +}; diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/.npmignore b/node_modules/hapi/node_modules/heavy/node_modules/joi/.npmignore new file mode 100644 index 0000000..2dfb3b9 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/.npmignore @@ -0,0 +1,20 @@ +.c9 +.idea +*.iml +npm-debug.log +dump.rdb +node_modules +results.tap +results.xml +npm-shrinkwrap.json +config.json +.DS_Store +*/.DS_Store +*/*/.DS_Store +._* +*/._* +*/*/._* +coverage.* +lib-cov +complexity.md +sandbox.js diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/.travis.yml b/node_modules/hapi/node_modules/heavy/node_modules/joi/.travis.yml new file mode 100755 index 0000000..afcae46 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/.travis.yml @@ -0,0 +1,22 @@ +# Travis optimizations, see http://docs.travis-ci.com/user/workers/container-based-infrastructure/ +sudo: false +cache: + directories: + - node_modules + +language: node_js + +node_js: + - "0.10" + - "0.11" + +deploy: + provider: npm + email: marsup@gmail.com + api_key: + secure: IuIigctAboFy2AGAcv/jUgRaVEQr23FX8ao+MM5fvmVpRZ/isHNQdJ2y1AAnCu5mCU+FgjNaXw/sB37J3Le5emMKhZMivXMTwAuLIbusEiQI6lzXflE7/+QK59jEcf/e5o6guTCf3CLMKo/yCrROYc/5sBuZuUqX2yDS6acGmZs= + on: + branch: master + tags: true + repo: hapijs/joi + node: "0.10" diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/CONTRIBUTING.md b/node_modules/hapi/node_modules/heavy/node_modules/joi/CONTRIBUTING.md new file mode 100755 index 0000000..713d376 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/CONTRIBUTING.md @@ -0,0 +1,14 @@ +# How to contribute +We welcome contributions from the community and are pleased to have them. Please follow this guide when logging issues or making code changes. + +## Logging Issues +All issues should be created using the [new issue form](https://github.com/hapijs/joi/issues/new). Clearly describe the issue including steps to reproduce if there are any. Also, make sure to indicate the earliest version that has the issue being reported. + +## Patching Code +Code changes are welcome and should follow the guidelines below. + +* Fork the repository on GitHub. +* Fix the issue ensuring that your code follows the [style guide](https://github.com/hapijs/contrib/blob/master/Style.md). +* Add tests for your new code ensuring that you have 100% code coverage (we can help you reach 100% but will not merge without it). + * Run `npm test` to generate a report of test coverage +* [Pull requests](http://help.github.com/send-pull-requests/) should be made to the [master branch](https://github.com/hapijs/joi/tree/master). diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/LICENSE b/node_modules/hapi/node_modules/heavy/node_modules/joi/LICENSE new file mode 100755 index 0000000..03afbde --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2012-2014, Walmart and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/joi/graphs/contributors \ No newline at end of file diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/README.md b/node_modules/hapi/node_modules/heavy/node_modules/joi/README.md new file mode 100755 index 0000000..de221ba --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/README.md @@ -0,0 +1,1240 @@ +![joi Logo](https://raw.github.com/hapijs/joi/master/images/joi.png) + +Object schema description language and validator for JavaScript objects. + +[![npm version](https://badge.fury.io/js/joi.svg)](http://badge.fury.io/js/joi) +[![Build Status](https://secure.travis-ci.org/hapijs/joi.svg)](http://travis-ci.org/hapijs/joi) +[![Dependencies Status](https://david-dm.org/hapijs/joi.svg)](https://david-dm.org/hapijs/joi) +[![DevDependencies Status](https://david-dm.org/hapijs/joi/dev-status.svg)](https://david-dm.org/hapijs/joi#info=devDependencies) + +Lead Maintainer: [Nicolas Morel](https://github.com/marsup) + +## Table of Contents + + +- [Example](#example) +- [Usage](#usage) + - [`validate(value, schema, [options], [callback])`](#validatevalue-schema-options-callback) + - [`compile(schema)`](#compileschema) + - [`assert(value, schema, [message])`](#assertvalue-schema-message) + - [`any`](#any) + - [`any.allow(value)`](#anyallowvalue) + - [`any.valid(value)`](#anyvalidvalue) + - [`any.invalid(value)`](#anyinvalidvalue) + - [`any.required()`](#anyrequired) + - [`any.optional()`](#anyoptional) + - [`any.forbidden()`](#anyforbidden) + - [`any.description(desc)`](#anydescriptiondesc) + - [`any.notes(notes)`](#anynotesnotes) + - [`any.tags(tags)`](#anytagstags) + - [`any.meta(meta)`](#anymetameta) + - [`any.example(value)`](#anyexamplevalue) + - [`any.unit(name)`](#anyunitname) + - [`any.options(options)`](#anyoptionsoptions) + - [`any.strict()`](#anystrict) + - [`any.default(value)`](#anydefaultvalue) + - [`any.concat(schema)`](#anyconcatschema) + - [`any.when(ref, options)`](#anywhenref-options) + - [`any.label(name)`](#anylabelname) + - [`any.raw(isRaw)`](#anyrawisraw) + - [`array`](#array) + - [`array.sparse(enabled)`](#arraysparseenabled) + - [`array.includes(type)`](#arrayincludestype) + - [`array.excludes(type)`](#arrayexcludestype) + - [`array.min(limit)`](#arrayminlimit) + - [`array.max(limit)`](#arraymaxlimit) + - [`array.length(limit)`](#arraylengthlimit) + - [`array.unique()`](#arrayunique) + - [`binary`](#binary) + - [`binary.encoding(encoding)`](#binaryencodingencoding) + - [`binary.min(limit)`](#binaryminlimit) + - [`binary.max(limit)`](#binarymaxlimit) + - [`binary.length(limit)`](#binarylengthlimit) + - [`boolean()`](#boolean) + - [`date`](#date) + - [`date.min(date)`](#datemindate) + - [`date.max(date)`](#datemaxdate) + - [`date.format(format)`](#dateformatformat) + - [`date.iso()`](#dateiso) + - [`func`](#func) + - [`number`](#number) + - [`number.min(limit)`](#numberminlimit) + - [`number.max(limit)`](#numbermaxlimit) + - [`number.greater(limit)`](#numbergreaterlimit) + - [`number.less(limit)`](#numberlesslimit) + - [`number.integer()`](#numberinteger) + - [`number.precision(limit)`](#numberprecisionlimit) + - [`object`](#object) + - [`object.keys([schema])`](#objectkeysschema) + - [`object.min(limit)`](#objectminlimit) + - [`object.max(limit)`](#objectmaxlimit) + - [`object.length(limit)`](#objectlengthlimit) + - [`object.pattern(regex, schema)`](#objectpatternregex-schema) + - [`object.and(peers)`](#objectandpeers) + - [`object.nand(peers)`](#objectnandpeers) + - [`object.or(peers)`](#objectorpeers) + - [`object.xor(peers)`](#objectxorpeers) + - [`object.with(key, peers)`](#objectwithkey-peers) + - [`object.without(key, peers)`](#objectwithoutkey-peers) + - [`object.rename(from, to, [options])`](#objectrenamefrom-to-options) + - [`object.assert(ref, schema, [message])`](#objectassertref-schema-message) + - [`object.unknown([allow])`](#objectunknownallow) + - [`object.type(constructor, [name])`](#objecttypeconstructorname) + - [`object.requiredKeys(children)`](#objectrequiredkeyschildren) + - [`object.optionalKeys(children)`](#objectoptionalkeyschildren) + - [`string`](#string) + - [`string.insensitive()`](#stringinsensitive) + - [`string.min(limit, [encoding])`](#stringminlimit-encoding) + - [`string.max(limit, [encoding])`](#stringmaxlimit-encoding) + - [`string.creditCard()`](#stringcreditCard) + - [`string.length(limit, [encoding])`](#stringlengthlimit-encoding) + - [`string.regex(pattern, [name])`](#stringregexpattern-name) + - [`string.alphanum()`](#stringalphanum) + - [`string.token()`](#stringtoken) + - [`string.email()`](#stringemail) + - [`string.guid()`](#stringguid) + - [`string.hostname()`](#stringhostname) + - [`string.lowercase()`](#stringlowercase) + - [`string.uppercase()`](#stringuppercase) + - [`string.trim()`](#stringtrim) + - [`alternatives`](#alternatives) + - [`alternatives.try(schemas)`](#alternativestryschemas) + - [`alternatives.when(ref, options)`](#alternativeswhenref-options) + - [`ref(key, [options])`](#refkey-options) + +# Example + +```javascript +var Joi = require('joi'); + +var schema = Joi.object().keys({ + username: Joi.string().alphanum().min(3).max(30).required(), + password: Joi.string().regex(/[a-zA-Z0-9]{3,30}/), + access_token: [Joi.string(), Joi.number()], + birthyear: Joi.number().integer().min(1900).max(2013), + email: Joi.string().email() +}).with('username', 'birthyear').without('password', 'access_token'); + +Joi.validate({ username: 'abc', birthyear: 1994 }, schema, function (err, value) { }); // err === null -> valid +``` + +The above schema defines the following constraints: +* `username` + * a required string + * must contain only alphanumeric characters + * at least 3 characters long but no more than 30 + * must be accompanied by `birthyear` +* `password` + * an optional string + * must satisfy the custom regex + * cannot appear together with `access_token` +* `access_token` + * an optional, unconstrained string or number +* `birthyear` + * an integer between 1900 and 2013 +* `email` + * a valid email address string + +# Usage + +Usage is a two steps process. First, a schema is constructed using the provided types and constraints: + +```javascript +var schema = { + a: Joi.string() +}; +``` + +Note that **joi** schema objects are immutable which means every additional rule added (e.g. `.min(5)`) will return a +new schema object. + +Then the value is validated against the schema: + +```javascript +Joi.validate({ a: 'a string' }, schema, function (err, value) { }); +``` + +If the value is valid, `null` is returned, otherwise an `Error` object. + +The schema can be a plain JavaScript object where every key is assigned a **joi** type, or it can be a **joi** type directly: + +```javascript +var schema = Joi.string().min(10); +``` + +If the schema is a **joi** type, the `schema.validate(value, callback)` can be called directly on the type. When passing a non-type schema object, +the module converts it internally to an object() type equivalent to: + +```javascript +var schema = Joi.object().keys({ + a: Joi.string() +}); +``` + +When validating a schema: +* Keys are optional by default. +* Strings are utf-8 encoded by default. +* Rules are defined in an additive fashion and evaluated in order after whitelist and blacklist checks. + +### `validate(value, schema, [options], [callback])` + +Validates a value using the given schema and options where: +- `value` - the value being validated. +- `schema` - the validation schema. Can be a **joi** type object or a plain object where every key is assigned a **joi** type object. +- `options` - an optional object with the following optional keys: + - `abortEarly` - when `true`, stops validation on the first error, otherwise returns all the errors found. Defaults to `true`. + - `convert` - when `true`, attempts to cast values to the required types (e.g. a string to a number). Defaults to `true`. + - `allowUnknown` - when `true`, allows object to contain unknown keys which are ignored. Defaults to `false`. + - `skipFunctions` - when `true`, ignores unknown keys with a function value. Defaults to `false`. + - `stripUnknown` - when `true`, unknown keys are deleted (only when value is an object). Defaults to `false`. + - `language` - overrides individual error messages, when `'label'` is set, it overrides the key name in the error message. Defaults to no override (`{}`). + - `presence` - sets the default presence requirements. Supported modes: `'optional'`, `'required'`, and `'forbidden'`. + Defaults to `'optional'`. + - `context` - provides an external data set to be used in [references](#refkey-options). Can only be set as an external option to + `validate()` and not using `any.options()`. +- `callback` - the optional synchronous callback method using the signature `function(err, value)` where: + - `err` - if validation failed, the error reason, otherwise `null`. + - `value` - the validated value with any type conversions and other modifiers applied (the input is left unchanged). `value` can be + incomplete if validation failed and `abortEarly` is `true`. If callback is not provided, then returns an object with error + and value properties. + +```javascript +var schema = { + a: Joi.number() +}; + +var value = { + a: '123' +}; + +Joi.validate(value, schema, function (err, value) { }); +// err -> null +// value.a -> 123 (number, not string) + +// or +var result = Joi.validate(value, schema); +// result.error -> null +// result.value -> { "a" : 123 } +``` + +### `compile(schema)` + +Converts literal schema definition to **joi** schema object (or returns the same back if already a **joi** schema object) where: +- `schema` - the schema definition to compile. + +```javascript +var definition = ['key', 5, { a: true, b: [/^a/, 'boom'] }]; +var schema = Joi.compile(definition); + +// Same as: + +var schema = Joi.alternatives().try([ + Joi.string().valid('key'), + Joi.number().valid(5), + Joi.object().keys({ + a: Joi.boolean().valid(true), + b: Joi.alternatives().try([ + Joi.string().regex(/^a/), + Joi.string().valid('boom') + ]) + }) +]); +``` + +### `assert(value, schema, [message])` + +Validates a value against a schema and throws if validation fails where: +- `value` - the value to validate. +- `schema` - the schema object. +- `message` - optional message sting prefix added in front of the error message. + +```javascript +Joi.assert('x', Joi.number()); +``` + +### `any` + +Generates a schema object that matches any data type. + +```javascript +var any = Joi.any(); +any.validate('a', function (err, value) { }); +``` + +#### `any.allow(value)` + +Whitelists a value where: +- `value` - the allowed value which can be of any type and will be matched against the validated value before applying any other rules. + `value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options). + +```javascript +var schema = { + a: Joi.any().allow('a'), + b: Joi.any().allow('b', 'B'), + c: Joi.any().allow(['c', 'C']) +}; +``` + +#### `any.valid(value)` + +Adds the provided values into the allowed whitelist and marks them as the only valid values allowed where: +- `value` - the allowed value which can be of any type and will be matched against the validated value before applying any other rules. + `value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options). + +```javascript +var schema = { + a: Joi.any().valid('a'), + b: Joi.any().valid('b', 'B'), + c: Joi.any().valid(['c', 'C']) +}; +``` + +#### `any.invalid(value)` + +Blacklists a value where: +- `value` - the forbidden value which can be of any type and will be matched against the validated value before applying any other rules. + `value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options). + +```javascript +var schema = { + a: Joi.any().invalid('a'), + b: Joi.any().invalid('b', 'B'), + c: Joi.any().invalid(['c', 'C']) +}; +``` + +#### `any.required()` + +Marks a key as required which will not allow `undefined` as value. All keys are optional by default. + +```javascript +var schema = Joi.any().required(); +``` + +#### `any.optional()` + +Marks a key as optional which will allow `undefined` as values. Used to annotate the schema for readability as all keys are optional by default. + +```javascript +var schema = Joi.any().optional(); +``` + +#### `any.forbidden()` + +Marks a key as forbidden which will not allow any value except `undefined`. Used to explicitly forbid keys. + +```javascript +var schema = { + a: Joi.any().forbidden() +}; +``` + +#### `any.description(desc)` + +Annotates the key where: +- `desc` - the description string. + +```javascript +var schema = Joi.any().description('this key will match anything you give it'); +``` + +#### `any.notes(notes)` + +Annotates the key where: +- `notes` - the notes string or array of strings. + +```javascript +var schema = Joi.any().notes(['this is special', 'this is important']); +``` + +#### `any.tags(tags)` + +Annotates the key where: +- `tags` - the tag string or array of strings. + +```javascript +var schema = Joi.any().tags(['api', 'user']); +``` + +#### `any.meta(meta)` + +Attaches metadata to the key where: +- `meta` - the meta object to attach. + +```javascript +var schema = Joi.any().meta({ index: true }); +``` + +#### `any.example(value)` + +Annotates the key where: +- `value` - an example value. + +If the example fails to pass validation, the function will throw. + +```javascript +var schema = Joi.string().min(4).example('abcd'); +``` + +#### `any.unit(name)` + +Annotates the key where: +- `name` - the unit name of the value. + +```javascript +var schema = Joi.number().unit('milliseconds'); +``` + +#### `any.options(options)` + +Overrides the global `validate()` options for the current key and any sub-key where: +- `options` - an object with the same optional keys as [`Joi.validate(value, schema, options, callback)`](#joivalidatevalue-schema-options-callback). + +```javascript +var schema = Joi.any().options({ convert: false }); +``` + +#### `any.strict()` + +Sets the `options.convert` options to `false` which prevent type casting for the current key and any child keys. + +```javascript +var schema = Joi.any().strict(); +``` + +#### `any.default(value)` + +Sets a default value if the original value is undefined where: +- `value` - the value. `value` supports [references](#refkey-options). + +Note that if `value` is an object, any changes to the object after `default()` is called will change the reference +and any future assignment. + +```javascript +var schema = { + username: Joi.string().default('new_user') +}; +Joi.validate({}, schema, function (err, value) { }); +// value === { username: "new_user" } +``` + +#### `any.concat(schema)` + +Returns a new type that is the result of adding the rules of one type to another where: +- `schema` - a **joi** type to merge into the current schema. Can only be of the same type as the context type or `any`. + +```javascript +var a = Joi.string().valid('a'); +var b = Joi.string().valid('b'); +var ab = a.concat(b); +``` + +#### `any.when(ref, options)` + +Converts the type into an [`alternatives`](#alternatives) type where the conditions are merged into the type definition where: +- `ref` - the key name or [reference](#refkey-options). +- `options` - an object with: + - `is` - the required condition **joi** type. + - `then` - the alternative schema type if the condition is true. Required if `otherwise` is missing. + - `otherwise` - the alternative schema type if the condition is false. Required if `then` is missing. + +```javascript +var schema = { + a: Joi.any().valid('x').when('b', { is: 5, then: Joi.valid('y'), otherwise: Joi.valid('z') }), + b: Joi.any() +}; +``` + +Alternatively, if you want to specify a specific type such as `string`, `array`, etc, you can do so like this: + +```javascript +var schema = { + a: Joi.valid('a', 'b', 'other'), + other: Joi.string() + .when('a', { is: 'other', then: Joi.required() }), +}; +``` + +#### `any.label(name)` + +Overrides the key name in error messages. +- `name` - the name of the key. + +```javascript +var schema = { + first_name: Joi.string().label('First Name') +}; +``` + +#### `any.raw(isRaw)` + +Outputs the original untouched value instead of the casted value. +- `isRaw` - whether to enable raw mode or not. Defaults to true. + +```javascript +var schema = { + timestamp: Joi.date().format('YYYYMMDD').raw() +}; +``` + +### `array` + +Generates a schema object that matches an array data type. Note that undefined values inside arrays are not allowed by default but can be by using `sparse()`. + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var array = Joi.array().includes(Joi.string().valid('a', 'b')); +array.validate(['a', 'b', 'a'], function (err, value) { }); +``` + +#### `array.sparse(enabled)` + +Allow this array to be sparse. `enabled` can be used with a falsy value to go back to the default behavior. + +```javascript +var schema = Joi.array().sparse(); // undefined values are now allowed +schema = schema.sparse(false); // undefined values are now denied +``` + +#### `array.single(enabled)` + +Allow single values to be checked against rules as if it were provided as an array. + +`enabled` can be used with a falsy value to go back to the default behavior. + +```javascript +var schema = Joi.array().includes(Joi.number()).single(); +schema.validate([4]); // returns `{ error: null, value: [ 4 ] }` +schema.validate(4); // returns `{ error: null, value: [ 4 ] }` +``` + +#### `array.includes(type)` + +List the types allowed for the array values where: +- `type` - a **joi** schema object to validate each array item against. `type` can be an array of values, or multiple values can be passed as individual arguments. + +```javascript +var schema = Joi.array().includes(Joi.string(), Joi.number()); +``` + +#### `array.excludes(type)` + +List the types forbidden for the array values where: +- `type` - a **joi** schema object to validate each array item against. `type` can be an array of values, or multiple values can be passed as individual arguments. + +```javascript +var schema = Joi.array().excludes(Joi.object()); +``` + +#### `array.min(limit)` + +Specifies the minimum number of items in the array where: +- `limit` - the lowest number of array items allowed. + +```javascript +var schema = Joi.array().min(2); +``` + +#### `array.max(limit)` + +Specifies the maximum number of items in the array where: +- `limit` - the highest number of array items allowed. + +```javascript +var schema = Joi.array().max(10); +``` + +#### `array.length(limit)` + +Specifies the exact number of items in the array where: +- `limit` - the number of array items allowed. + +```javascript +var schema = Joi.array().length(5); +``` + +#### `array.unique()` + +Requires the array values to be unique. + +Be aware that a deep equality is performed on elements of the array having a type of `object`, a performance penalty is to be expected for this kind of operation. + +```javascript +var schema = Joi.array().unique(); +``` + +### `boolean` + +Generates a schema object that matches a boolean data type (as well as the strings 'true', 'false', 'yes', and 'no'). Can also be called via `bool()`. + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var boolean = Joi.boolean(); +boolean.validate(true, function (err, value) { }); +``` + +### `binary` + +Generates a schema object that matches a Buffer data type (as well as the strings which will be converted to Buffers). + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var schema = Joi.binary(); +``` + +#### `binary.encoding(encoding)` + +Sets the string encoding format if a string input is converted to a buffer where: +- `encoding` - the encoding scheme. + +```javascript +var schema = Joi.binary().encoding('base64'); +``` + +#### `binary.min(limit)` + +Specifies the minimum length of the buffer where: +- `limit` - the lowest size of the buffer. + +```javascript +var schema = Joi.binary().min(2); +``` + +#### `binary.max(limit)` + +Specifies the maximum length of the buffer where: +- `limit` - the highest size of the buffer. + +```javascript +var schema = Joi.binary().max(10); +``` + +#### `binary.length(limit)` + +Specifies the exact length of the buffer: +- `limit` - the size of buffer allowed. + +```javascript +var schema = Joi.binary().length(5); +``` + +### `date` + +Generates a schema object that matches a date type (as well as a JavaScript date string or number of milliseconds). + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var date = Joi.date(); +date.validate('12-21-2012', function (err, value) { }); +``` + +#### `date.min(date)` + +Specifies the oldest date allowed where: +- `date` - the oldest date allowed. + +```javascript +var schema = Joi.date().min('1-1-1974'); +``` + +Notes: `'now'` can be passed in lieu of `date` so as to always compare relatively to the current date, allowing to explicitly ensure a date is either in the past or in the future. + +```javascript +var schema = Joi.date().min('now'); +``` + +It can also be a reference to another field. + +```javascript +var schema = Joi.object({ + from: Joi.date().required(), + to: Joi.date().min(Joi.ref('from')).required() +}); +``` + +#### `date.max(date)` + +Specifies the latest date allowed where: +- `date` - the latest date allowed. + +```javascript +var schema = Joi.date().max('12-31-2020'); +``` + +Notes: `'now'` can be passed in lieu of `date` so as to always compare relatively to the current date, allowing to explicitly ensure a date is either in the past or in the future. + +```javascript +var schema = Joi.date().max('now'); +``` + +It can also be a reference to another field. + +```javascript +var schema = Joi.object({ + from: Joi.date().max(Joi.ref('to')).required(), + to: Joi.date().required() +}); +``` + +#### `date.format(format)` + +Specifies the allowed date format: +- `format` - string or array of strings that follow the `moment.js` [format](http://momentjs.com/docs/#/parsing/string-format/). + +```javascript +var schema = Joi.date().format('YYYY/MM/DD'); +``` + +#### `date.iso()` + +Requires the string value to be in valid ISO 8601 date format. + +```javascript +var schema = Joi.date().iso(); +``` + +### `func` + +Generates a schema object that matches a function type. + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var func = Joi.func(); +func.validate(function () {}, function (err, value) { }); +``` + +### `number` + +Generates a schema object that matches a number data type (as well as strings that can be converted to numbers). + +`Infinity` and `-Infinity` are invalid by default, you can change that behavior by calling `allow(Infinity, -Infinity)`. + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var number = Joi.number(); +number.validate(5, function (err, value) { }); +``` + +#### `number.min(limit)` + +Specifies the minimum value where: +- `limit` - the minimum value allowed. + +```javascript +var schema = Joi.number().min(2); +``` + +#### `number.max(limit)` + +Specifies the maximum value where: +- `limit` - the maximum value allowed. + +```javascript +var schema = Joi.number().max(10); +``` + +#### `number.greater(limit)` + +Specifies that the value must be greater than `limit`. + +```javascript +var schema = Joi.number().greater(5); +``` + +#### `number.less(limit)` + +Specifies that the value must be less than `limit`. + +```javascript +var schema = Joi.number().less(10); +``` + +#### `number.integer()` + +Requires the number to be an integer (no floating point). + +```javascript +var schema = Joi.number().integer(); +``` + +#### `number.precision(limit)` + +Specifies the maximum number of decimal places where: +- `limit` - the maximum number of decimal places allowed. + +```javascript +var schema = Joi.number().precision(2); +``` + +### `object` + +Generates a schema object that matches an object data type (as well as JSON strings that parsed into objects). Defaults +to allowing any child key. + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var object = Joi.object().keys({ + a: Joi.number().min(1).max(10).integer(), + b: 'some string' +}); + +object.validate({ a: 5 }, function (err, value) { }); +``` + +#### `object.keys([schema])` + +Sets or extends the allowed object keys where: +- `schema` - optional object where each key is assigned a **joi** type object. If `schema` is `{}` no keys allowed. + If `schema` is `null` or `undefined`, any key allowed. If `schema` is an object with keys, the keys are added to any + previously defined keys (but narrows the selection if all keys previously allowed). Defaults to 'undefined' which + allows any child key. + +```javascript +var base = Joi.object().keys({ + a: Joi.number(), + b: Joi.string() +}); +// Validate keys a, b and c. +var extended = base.keys({ + c: Joi.boolean() +}); +``` + +#### `object.min(limit)` + +Specifies the minimum number of keys in the object where: +- `limit` - the lowest number of keys allowed. + +```javascript +var schema = Joi.object().min(2); +``` + +#### `object.max(limit)` + +Specifies the maximum number of keys in the object where: +- `limit` - the highest number of object keys allowed. + +```javascript +var schema = Joi.object().max(10); +``` + +#### `object.length(limit)` + +Specifies the exact number of keys in the object where: +- `limit` - the number of object keys allowed. + +```javascript +var schema = Joi.object().length(5); +``` + +#### `object.pattern(regex, schema)` + +Specify validation rules for unknown keys matching a pattern where: +- `regex` - a regular expression tested against the unknown key names. +- `schema` - the schema object matching keys much validate against. + +```javascrip +var schema = Joi.object({ + a: Joi.string() +}).pattern(/\w\d/, Joi.boolean()); +``` + +#### `object.and(peers)` + +Defines an all-or-nothing relationship between keys where if one of the peers is present, all of them are required as +well where: +- `peers` - the key names of which if one present, all are required. `peers` can be a single string value, an + array of string values, or each peer provided as an argument. + +```javascript +var schema = Joi.object().keys({ + a: Joi.any(), + b: Joi.any() +}).and('a', 'b'); +``` + +#### `object.nand(peers)` + +Defines a relationship between keys where not all peers can be present at the +same time where: +- `peers` - the key names of which if one present, the others may not all be present. `peers` can be a single string value, an + array of string values, or each peer provided as an argument. + +```javascript +var schema = Joi.object().keys({ + a: Joi.any(), + b: Joi.any() +}).nand('a', 'b'); +``` + +#### `object.or(peers)` + +Defines a relationship between keys where one of the peers is required (and more than one is allowed) where: +- `peers` - the key names of which at least one must appear. `peers` can be a single string value, an + array of string values, or each peer provided as an argument. + +```javascript +var schema = Joi.object().keys({ + a: Joi.any(), + b: Joi.any() +}).or('a', 'b'); +``` + +#### `object.xor(peers)` + +Defines an exclusive relationship between a set of keys where one of them is required but not at the same time where: +- `peers` - the exclusive key names that must not appear together but where one of them is required. `peers` can be a single string value, an + array of string values, or each peer provided as an argument. + +```javascript +var schema = Joi.object().keys({ + a: Joi.any(), + b: Joi.any() +}).xor('a', 'b'); +``` + +#### `object.with(key, peers)` + +Requires the presence of other keys whenever the specified key is present where: +- `key` - the reference key. +- `peers` - the required peer key names that must appear together with `key`. `peers` can be a single string value or an array of string values. + +Note that unlike [`object.and()`](#objectandpeers), `with()` creates a dependency only between the `key` and each of the `peers`, not +between the `peers` themselves. + +```javascript +var schema = Joi.object().keys({ + a: Joi.any(), + b: Joi.any() +}).with('a', 'b'); +``` + +#### `object.without(key, peers)` + +Forbids the presence of other keys whenever the specified is present where: +- `key` - the reference key. +- `peers` - the forbidden peer key names that must not appear together with `key`. `peers` can be a single string value or an array of string values. + +```javascript +var schema = Joi.object().keys({ + a: Joi.any(), + b: Joi.any() +}).without('a', ['b']); +``` + +#### `object.rename(from, to, [options])` + +Renames a key to another name (deletes the renamed key) where: +- `from` - the original key name. +- `to` - the new key name. +- `options` - an optional object with the following optional keys: + - `alias` - if `true`, does not delete the old key name, keeping both the new and old keys in place. Defaults to `false`. + - `multiple` - if `true`, allows renaming multiple keys to the same destination where the last rename wins. Defaults to `false`. + - `override` - if `true`, allows renaming a key over an existing key. Defaults to `false`. + +Keys are renamed before any other validation rules are applied. + +```javascript +var object = Joi.object().keys({ + a: Joi.number() +}).rename('b', 'a'); + +object.validate({ b: 5 }, function (err, value) { }); +``` + +#### `object.assert(ref, schema, [message])` + +Verifies an assertion where: +- `ref` - the key name or [reference](#refkey-options). +- `schema` - the validation rules required to satisfy the assertion. If the `schema` includes references, they are resolved against + the object value, not the value of the `ref` target. +- `message` - optional human-readable message used when the assertion fails. Defaults to 'failed to pass the assertion test'. + +```javascript +var schema = Joi.object().keys({ + a: { + b: Joi.string(), + c: Joi.number() + }, + d: { + e: Joi.any() + } +}).assert('d.e', Joi.ref('a.c'), 'equal to a.c'); +``` + +#### `object.unknown([allow])` + +Overrides the handling of unknown keys for the scope of the current object only (does not apply to children) where: +- `allow` - if `false`, unknown keys are not allowed, otherwise unknown keys are ignored. + +```javascript +var schema = Joi.object({ a: Joi.any() }).unknown(); +``` + +#### `object.type(constructor, [name])` + +Requires the object to be an instance of a given constructor where: +- `constructor` - the constructor function that the object must be an instance of. +- `name` - an alternate name to use in validation errors. This is useful when the constructor function does not have a name. + +```javascript +var schema = Joi.object().type(RegExp); +``` + +#### `object.requiredKeys(children)` + +Sets the specified children to required. +- `children` - can be a single string value, an array of string values, or each child provided as an argument. + +```javascript +var schema = Joi.object().keys({ a: { b: Joi.number() }, c: { d: Joi.string() } }); +var requiredSchema = schema.requiredKeys('', 'a.b', 'c', 'c.d'); +``` + +Note that in this example `''` means the current object, `a` is not required but `b` is, as well as `c` and `d`. + +#### `object.optionalKeys(children)` + +Sets the specified children to optional. +- `children` - can be a single string value, an array of string values, or each child provided as an argument. + +```javascript +var schema = Joi.object().keys({ a: { b: Joi.number().required() }, c: { d: Joi.string().required() } }); +var requiredSchema = schema.optionalKeys('a.b', 'c.d'); +``` + +The behavior is exactly the same as `requiredKeys`. + +### `string` + +Generates a schema object that matches a string data type. Note that empty strings are not allowed by default and must be enabled with `allow('')`. + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var schema = Joi.string().min(1).max(10); +schema.validate('12345', function (err, value) { }); +``` + +#### `string.insensitive()` + +Allows the value to match any whitelist of blacklist item in a case insensitive comparison. + +```javascript +var schema = Joi.string().valid('a').insensitive(); +``` + +#### `string.min(limit, [encoding])` + +Specifies the minimum number string characters where: +- `limit` - the minimum number of string characters required. +- `encoding` - is specified, the string length is calculated in bytes using the provided encoding. + +```javascript +var schema = Joi.string().min(2); +``` + +#### `string.max(limit, [encoding])` + +Specifies the maximum number of string characters where: +- `limit` - the maximum number of string characters allowed. +- `encoding` - is specified, the string length is calculated in bytes using the provided encoding. + +```javascript +var schema = Joi.string().max(10); +``` + +#### `string.creditCard()` + +Requires the number to be a credit card number (Using [Lunh +Algorithm](http://en.wikipedia.org/wiki/Luhn_algorithm)). + +```javascript +var schema = Joi.string().creditCard(); +``` + +#### `string.length(limit, [encoding])` + +Specifies the exact string length required where: +- `limit` - the required string length. +- `encoding` - is specified, the string length is calculated in bytes using the provided encoding. + +```javascript +var schema = Joi.string().length(5); +``` + +#### `string.regex(pattern, [name])` + +Defines a regular expression rule where: +- `pattern` - a regular expression object the string value must match against. +- `name` - optional name for patterns (useful with multiple patterns). Defaults to 'required'. + +```javascript +var schema = Joi.string().regex(/^[abc]+$/); +``` + +#### `string.alphanum()` + +Requires the string value to only contain a-z, A-Z, and 0-9. + +```javascript +var schema = Joi.string().alphanum(); +``` + +#### `string.token()` + +Requires the string value to only contain a-z, A-Z, 0-9, and underscore _. + +```javascript +var schema = Joi.string().token(); +``` + +#### `string.email()` + +Requires the string value to be a valid email address. + +```javascript +var schema = Joi.string().email(); +``` + +#### `string.guid()` + +Requires the string value to be a valid GUID. + +```javascript +var schema = Joi.string().guid(); +``` + +#### `string.hostname()` + +Requires the string value to be a valid hostname as per [RFC1123](http://tools.ietf.org/html/rfc1123). + +```javascript +var schema = Joi.string().hostname(); +``` + +#### `string.lowercase()` + +Requires the string value to be all lowercase. If the validation `convert` option is on (enabled by default), the string +will be forced to lowercase. + +```javascript +var schema = Joi.string().lowercase(); +``` + +#### `string.uppercase()` + +Requires the string value to be all uppercase. If the validation `convert` option is on (enabled by default), the string +will be forced to uppercase. + +```javascript +var schema = Joi.string().uppercase(); +``` + +#### `string.trim()` + +Requires the string value to contain no whitespace before or after. If the validation `convert` option is on (enabled by +default), the string will be trimmed. + +```javascript +var schema = Joi.string().trim(); +``` + +### `alternatives` + +Generates a type that will match one of the provided alternative schemas via the [`try()`](#alternativestryschemas) +method. If no schemas are added, the type will not match any value except for `undefined`. + +Supports the same methods of the [`any()`](#any) type. + +Alternatives can be expressed using the shorter `[]` notation. + +```javascript +var alt = Joi.alternatives().try(Joi.number(), Joi.string()); +// Same as [Joi.number(), Joi.string()] +``` + +#### `alternatives.try(schemas)` + +Adds an alternative schema type for attempting to match against the validated value where: +- `schema` - an array of alternative **joi** types. Also supports providing each type as a separate argument. + +```javascript +var alt = Joi.alternatives().try(Joi.number(), Joi.string()); +alt.validate('a', function (err, value) { }); +``` + +#### `alternatives.when(ref, options)` + +Adds a conditional alternative schema type based on another key (not the same as `any.when()`) value where: +- `ref` - the key name or [reference](#refkey-options). +- `options` - an object with: + - `is` - the required condition **joi** type. + - `then` - the alternative schema type to **try** if the condition is true. Required if `otherwise` is missing. + - `otherwise` - the alternative schema type to **try** if the condition is false. Required if `then` is missing. + +```javascript +var schema = { + a: Joi.alternatives().when('b', { is: 5, then: Joi.string(), otherwise: Joi.number() }), + b: Joi.any() +}; +``` + +Note that `when()` only adds additional alternatives to try and does not impact the overall type. Setting +a `required()` rule on a single alternative will not apply to the overall key. For example, +this definition of `a`: + +```javascript +var schema = { + a: Joi.alternatives().when('b', { is: true, then: Joi.required() }), + b: Joi.boolean() +}; +``` + +Does not turn `a` into a required key when `b` is `true`. Instead, it tells the validator to try and match the +value to anything that's not `undefined`. However, since `Joi.alternatives()` by itself allows `undefined`, the rule +does not accomplish turning `a` to a required value. This rule is the same as `Joi.alternatives([Joi.required()])` +when `b` is `true` which will allow any value including `undefined`. + +To accomplish the desired result above use: + +```javascript +var schema = { + a: Joi.when('b', { is: true, then: Joi.required() }), + b: Joi.boolean() +}; +``` + +### `ref(key, [options])` + +Generates a reference to the value of the named key. References are resolved at validation time and in order of dependency +so that if one key validation depends on another, the dependent key is validated second after the reference is validated. +References support the following arguments: +- `key` - the reference target. References cannot point up the object tree, only to sibling keys, but they can point to + their siblings' children (e.g. 'a.b.c') using the `.` separator. If a `key` starts with `$` is signifies a context reference + which is looked up in the `context` option object. +- `options` - optional settings: + - `separator` - overrides the default `.` hierarchy separator. + - `contextPrefix` - overrides the default `$` context prefix signifier. + +Note that references can only be used where explicitly supported such as in `valid()` or `invalid()` rules. If upwards +(parents) references are needed, use [`object.assert()`](#objectassertref-schema-message). + +```javascript +var schema = Joi.object().keys({ + a: Joi.ref('b.c'), + b: { + c: Joi.any() + }, + c: Joi.ref('$x') +}); + +Joi.validate({ a: 5, b: { c: 5 } }, schema, { context: { x: 5 } }, function (err, value) {}); +``` diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/examples/conditionalRequire.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/examples/conditionalRequire.js new file mode 100644 index 0000000..8ed0a6a --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/examples/conditionalRequire.js @@ -0,0 +1,43 @@ +// This is an example of a survey to obtain the reputation of Parisians +// It contains examples of how to conditionally require keys based on values of other keys + +var Joi = require("../"); + +// This is a valid value for integer rating 1 - 5 +var intRating = Joi.number().integer().min(1).max(5); + +var schema = Joi.object().keys({ + // Do you know any French people? yes or no (required) + q1: Joi.boolean().required(), + // Do you know any Parisians? yes or no (required if answered yes in q1) + q2: Joi.boolean() + .when('q1', { is: true, then: Joi.required() }), + // How many french in paris do you know? 1-6, 6-10, 11-50 or 50+ (required if answered yes in q2) + q3: Joi.string() + .when('q2', { is: true, then: Joi.valid('1-5', '6-10', '11-50', '50+').required() }), + // Rate 20% of most friendly Parisians, from how many people you know answered in q3, individually on 1-5 rating + q4: Joi.array() + .when('q3', {is: '1-5', then: Joi.array().min(0).max(1).includes(intRating).required() }) + .when('q3', {is: '6-10', then: Joi.array().min(1).max(2).includes(intRating).required() }) + .when('q3', {is: '11-50', then: Joi.array().min(2).max(10).includes(intRating).required() }) + .when('q3', {is: '50+' , then: Joi.array().min(10).includes(intRating).required() }), + // Rate remaining 80% of Parisians, from how many people you know answered in q3, individually on 1-5 rating + q5: Joi.array() + .when('q3', {is: '1-5', then: Joi.array().min(1).max(4).includes(intRating).required() }) + .when('q3', {is: '6-10', then: Joi.array().min(4).max(8).includes(intRating).required() }) + .when('q3', {is: '11-50', then: Joi.array().min(8).max(40).includes(intRating).required() }) + .when('q3', {is: '50+' , then: Joi.array().min(40).includes(intRating).required().required() }), + // Rate the reputation of Parisians in general, 1-5 rating + q6: intRating.required() +}); + +var response = { + q1: true, + q2: true, + q3: '1-5', + q4: [5], + q4: [1], + q6: 2 +}; + +Joi.assert(response, schema); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/examples/customMessage.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/examples/customMessage.js new file mode 100755 index 0000000..38cd28a --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/examples/customMessage.js @@ -0,0 +1,22 @@ +var Joi = require('../'); + + +var schema = Joi.object().options({ abortEarly: false }).keys({ + email: Joi.string().email().required().label('User Email'), + password: Joi.string().min(8).required(), + password_confirmation: Joi.any().valid(Joi.ref('password')).required().options({ language: { any: { allowOnly: 'must match password' }, label: 'Password Confirmation' } }).label('This label is not used because language.label takes precedence'), + first_name: Joi.string().required(), + last_name: Joi.string().required(), + company: Joi.string().optional() +}); + + +var data = { + email: 'not_a_valid_email_to_show_custom_label', + password: 'abcd1234', + password_confirmation: 'abc1', + first_name: 'Joe', + last_name: 'Doe' +}; + +Joi.assert(data, schema); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/examples/multipleWhen.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/examples/multipleWhen.js new file mode 100755 index 0000000..b13cba9 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/examples/multipleWhen.js @@ -0,0 +1,17 @@ +var Joi = require('../'); + + +var schema = { + type: Joi.string().required(), + subtype: Joi.alternatives() + .when('type', {is: 'video', then: Joi.valid('mp4', 'wav')}) + .when('type', {is: 'audio', then: Joi.valid('mp3')}) + .when('type', {is: 'image', then: Joi.valid('jpg', 'png')}) + .when('type', {is: 'pdf' , then: Joi.valid('document')}) +}; + + +Joi.assert({ type: 'video', subtype: 'mp4' }, schema); // Pass +Joi.assert({ type: 'video', subtype: 'wav' }, schema); // Pass +Joi.assert({ type: 'other', subtype: 'something' }, schema); // Fail +Joi.assert({ type: 'audio', subtype: 'mp4' }, schema); // Fail diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/images/joi.png b/node_modules/hapi/node_modules/heavy/node_modules/joi/images/joi.png new file mode 100755 index 0000000000000000000000000000000000000000..d240833802bcd4e4e0becde614466a3f36f09480 GIT binary patch literal 30662 zcmX7vcQ~8x+s0GnYZJSrc8n5x?>%A`v8l$MReR6cilQirqE?Wau}AH__nt-7s=eaP z?|A=+=RZfD`@Zh$I`7YUCiab%3Lzdf9smF!gs3X&qMv`!pBkM1(0}C&nN!gZ+z+b8 z9smG7+5bMz09oH&004N}4hjly-q^c(x_a2VeqewoC@_3*ceQnJwgCWqmvZ#%pn3N!ilUX?!ae-WA4YG!xxzKVV#{v)4h_AE5w zS*K^Rs5(w4IY8DwQN9=;tNbi9=PRoo;5#PZ-LRGAHsB2x;2m4Y?`c42&P`^(Gl1zA zMv7ZmZrS23X(%@Inl2RRL8EfX*=>ehmPJ0Klsg z6Zsl|831@Uz|8Cmh{yzxEB`Z;JmW+F_c+iim02U%1QJsUGsWR@!!|VJrehz2P;rtA z!!Tf3vfN#MnJ@Xn1c^7!M*x8D$rR|fJ%98aBSMUg2`3_nEV%x3{P)CUX}OKs9WVbN z3jl0-22Y~EJhjxJ690v|pbA)yG40>tfA_kMx2++Ttp|KRSTa2S@V~WD%KzN7xVXEs zv!K=^ZwebS3_{s;S#%mcI^PCMK3rdJv~PjJ_|3yqFmE=xMlLjpUX7>VMp&-=PEvVj zz<+w6oo4ERST-4PkZKE3^FZ_ph!V&VIo-TQyJf3yvEBAM=E5ha3qeiP}Io|Qi z$kGaS>exr6ejwuR(r+Y^`apaK!^!={-WrCBDK~&a24h@`d1e`B#GHsjl^J=%_)8U& zG#+?*^i0N@XQh-y{g`w~{8BQ--%uh3K~ zLLH%8fIngF$(NNx`8|8Wy^dPylW_jtM7cfjQj)YnKX2#$3v7WNXI}2UZux3aFm9^V za5Yl}L3tl_l|jYxme@8_UMLrH{^Oyn!`k-9&1qD#pHy|TncKT<-}iz*A!rm5|z?5`bu z?t3G)@zz#L5(Ip8#5<(dPcfYxoWvixyoUiFyg2rr?^e2#rQsqNUmRv&5TXOE@=!a zXHRcYZ?y!kgi=#V{1U+pcPgUEZ&CE=cwch-HMjk3Xs(89$(mo=-rcJpo=51T%U#K( z3W3powFIF5mI=mQNcIZ3xk}RV^e><3D42K4Dip!eU>Tbc$xV}zg|o^D%EX@>`pmXL z+b(@BeTA(5u`;r%YyQzZ&eGLvDt=uop&_BsKRPm6Fglkhlr6iv`{JO^>M=yI?#g59Z$>ZaBOnj_*_%L^dGGIEG;bVv6=#{(?!MxYG#sVG_-2)06I=hoH_<3o(PU{uH z+6vlXcJ+JAJXSo(hL!VG4MjfiYuE{u^p&)G-nR6%q{tfonz6-*NN2-9!?1R@YpzA) zxSDpd$4}SS$T^Erhlx5tcVDWTWjTkM_FQ;-qj#A1`EdR)SSQ7F4x@f!X zn0O|ICu0^A%sA+@{;6_k`ltL&ZWZza^$HY$cbg*E%09Ph5NfPui|0~ic{8~1ONqDf zeN0LI>?RLq)J#R%{jvLP>pfgy6Ip}meIMVzLzjj<=v4c;0?U{S4=G=~4>e(*=fJM9 zvoW;o7>ykgOE1sm96cJT9a{b@^6ez=>4>z8bTb866s2y+MQilCt-?{PM$*l18E=~c zi!;jLzY595I3$P5taka4VFn_&jn!Y%DeUd9q3~bz&zuhN_3?HigAP~bkIc1=c#PNU zVRunEG}08YaR~Bdstk&d1@;x+U7Bdup^nUzFLh<*Jx$i*wo|qTzt^~OO^MRs8NV}# z-V-h^)e){6)E!-3DJ}D4jIuAcd_*cV6?RBAw%U{oj*UvlKz~3lpm$K=`^|J0wElr!XN2Dj`{;c^ws4UYHe-o56_ES5D4mvCygioj1 z{Tu(3la><{%zeA^Zn*#%uxB;4?nvx<(hT(6oKkv<-;-#S7&H6V==rZ^d6&$v(J&tb@)nIqF$Fbp-MIW}~%2w@GiwoH!xkZK5=vf(4)XKuiN{C~p&-e4m6_xA%B0r9! zk}s2p6|j;rlZK-RqYiULrNzXyWZWMQ9!eC(t;bn&sZa%|VFVQ=Pw>s`;r!U-*U9{h ze;KJAE`ddle>x9e{#@?s>Z5BP^cCQHdtq>Y^vh?(hxVj!omhJ(kRgQq$^N$bQg5Q< zKJ{g4>J#Skujda|0$j^zy~$vus;dbA__F{2p&tQ&+b8t%008jf1pxlM0|3Oo0svI5 zDHgrT0D$uuL{SdvyY#osC-Bv^-`-QMbS*6{gK9YDFAm)wJq2&MOp)8}i5~6hQhR^R zwglNScD6*D%#M9x^|%wsN63zln$r`6 z&zX}MGSy)F|78^yuyerSOgKzHQp{(t7w*!kDLof6AU=V(vUJErcAZMA-voZ#v#%ibC)l}6db$Mi0zF4=|SrhYt~;QGho^r z^MRV4nH_R-Df5xBon)KjcAH_b;0sZtmB+&lyQX0E=g;Nou}s4+n&mi>F*`3MU-kd; zb}^gpEi-tn&k+;);Et)q%J&H~t2iId5m&$vHzkG(hL9HN;w~diKPeW}>muIk3i+v@ zY;nurbdyJvQ(hv6%ME$TzYOml9~``#YJ&1*@+Y#U4qAnGes>XLo`pMLNo{4?2v)DPvBwpnsCG+hzu7XDZ~1~IgHab!M#524O?aNszU*wEb??E;Rk#RZf&K$yi@(UK;Cswt1;Pt@?r_ENI=eaU${XO+A>So*Ki? z8X~W+FKDhZ??uoZV`k4BhM32#fEgPMAuHFL9usMT4?~^?Pjo8vA*{?P8R`^f^U2~Z z;y_GZO&T5Yh1LO$-!HLg27`^!W`bVS(K z^ts~xo)=A)`JNdL+1f8+ci7*&=MH0iYZx)Q7eCuPh^4V4O&o?fYNDDd&MPsGXVhoR=&A z%#sT9!Yw_6)HAMzWNxQV4w{b=v)9}`Zx&3wPgX4aVg0###U`ge3#X4itiPygj>XmVD3PM4{n6QP_4(GuZ*XCXE*U5tH8Js@{n%hYuU<-}h z&z>148+8N=(fl;gE;Cwc+`ct0rw{qt^u*hE(#gEdR?^NjI7J-x$Klv-!AwxIH7a8C zw>xH7(%!8vB7V=WF_$WJOj%a;OHULQk%AU;l~KbF4{#L-@?#ppp9$625aqI7CdZGw zY-=+`a-UeJaS<_?tBtgY`Q~buLFLGm6m_f*k(zf)UYv$>GQ!RO&iZpv8-+=dElv+R zI~_6MH(bW)NutOEb`>lpk5yMWAa|+Jk66~XLNF&GG9{hQ6cqZ?44>j?1IObBmKmz! zj}}6K#*1G&Wi?cj9@^m*XZ7pyBu;_>U#NBelTSY2jUPCTZ~SNNbfODp;cc6X*^ z-sAfnnZUnybI5P|&1*K-VKYBXftc3D;lTf}iO(0ugGbk!g2qp-xsM+`mc7|C)WPP> zVky`&FwSzpF z%Sf4r-}4>w8ESSYXi5)RbG{z<%V}T|lw;ORQxhx+Gc`4FaB}J<#z2prirLax$FH*- zNE@r(Xm*?ua22V(>;XLPEn8K{9bMzGax^T4JuU+02Xr@G$jQ(K3j)GbG$YQ!h*3~^;7u>~NeB}K=D%nqouTaFSa!vxUDhn44_%1~pT76&tHO&X zQ-&v(mg4A7Mm45Cfj`v8*%&V*CfJz9$nVIDfUCfT{q_A`827o+d(Dlx(MQb#HJ;0z zo$k)lw)s|qa=;Xgmq6u!zfcajA`|Aufp4ylO~|9~rFb2u>N1?R{0DiD$E(DU&T-T9 zT@Wemt9}PWF)L+m71{PSdg2wZ+h--h_6aeZvXr@V@>w#NaTL%?P*V|w?~-ZDe7DT- zVMXyfJ0AS~_m|4#Gj6N7V~DHE;dHJ(uT`udy#n?WEgB6CErGxr(R!1FF@zSvr~|Jb z=~onBH}3@j5e6R^u4zl>J(XbxpYD7;^rt_tKRM-`wN0}k%LuJ%F5bG8&OO`^72eh5 z=xIV3C%JSR-f4Ct7j5vHc7yJrIdCg0xp zjvIX#>yW#?`>6igA;XicUaG4U7f6JYAu-O0@7{7Fs;?3!R~v}Qvsn8Uhhvu`jQ+H| z10@$lME^9AyNYe0YByyeEf!qUl$B-V+f_VWCR#}%c$M3}w;8~#KcBD5%@~7GQ=uqT zb@vLt;_wF$@LRl|{=}j9AH`ep_7helpO<1PxrNB=cg%ptz9Lw}{1l@8c z($Ti?Bx`)3^tyJQfWk(ZiDl#g&dbPTB$86Tv%*+3F`gYS0yYs7m^bV{@5maJf4;eX z=Q?PCa_zV$(VwM5K!>bGcV~L!75*F@#8!R>HuSwtkTx(*PyQ2B(H_0MFasAF+T}0O zja6&Xs5I%V24jpXkSckav*l=|Iyo@TFR8I+E9ulBE)NY*o6Bp#0okD8o7~|Q>Wy2^ zNF|+}^SpcNS;y1l(d?h7T3y(0fq4Inpn9VUBz|~{^*lnV?`qE*mrd)N^~KGLT{SG8 z(@DY{MgB1OfNyTdT9C_&C{OP?oe`?$sHjBxubDZEXDuDq0izVNJzXXX)~o?0p9ikZ zB3S_O8J z8=#K*e#p_E`0bsu_15k2al7^s(nYQ26WmcCrSviB<3|;;cz;vjIe2fqw$v>Maij+} znD9!l8P1q$aDF|%T9tr873~o+-L@wcm$mLzHk`GcNO?vx;N;~SH!k$ZlOc7vMXb%O zm7aal!@QCTobNqHe@`WYz%E%9fWs=CfP3&j3m1>nHEyaf%}TA^HT_E9VS3)}xXgKCPrSs{+P{VF zar$v<{-+Y%nt|WVJxXn>ZQE@9$2i>^9iw9!=H~|?cdZP7`Sr%jif8Eo zYa10Ci(6b=!cG~#kd6gBkSv<|QOjj*vNV81rjGqq{gGlHh3=7-J}UQwrbw5eQh3cq zFIKuut@|wAb(MNM7CcE579W`@Ph#Q4F+L-L`xDG|N6 zqK~#VJ5KnX{}s_VRmdE25w(Ti;(MG)%MSlnW2z?y{7jK~b_QuM0uvYv75zrl$40U_ zH<^KO0u^;+Q+nAg!4P)18k5%I3@(__a#q9E&Mx!oH)}`7IQe|wEWN^o$RPQFbE31l z1RPdj*5r8W_4s_a$p4*vJ}`>03>p`a|2iCaMYqslp{t*eOvb!u&F@tJlxzY&ydUOcO64T)M)t@=^|EbeW-4sJq^`*CF9`f zjU+Cb8a3HsEmZFu}|}3E4ih(5^74hksME>6^|RS(w?m z$hu0rGBO(5JUR&!Xz@OJIy2{?TVafw$}5GdsS9JrUde(o7tJOrZPS8-!Gsw zIc+p^cmIQR*Fv|`3hP1-O;6YRwVKRPQ{h_6cUZC3DS^`Co88f3A2tB}iL}gldA;Wa zT^O&C?cwZ9oOn^m45@0BJKeZ1n6IYAEC(Vt4f<=-RnS*Xtt#!9yd6AMTEK8%g{Kb~!p&UpsriKM^4Kc#!F! zsIxJV-+geEi0twbd9S4Nr4}!Le2lzQ-w8XlY^M~?F*-Zb(?!G5@AerKi$n^Gi;DxQ zT(Z@gZ6VJ9%_G z)_XdQ?2zGYe1Zo`hpaDo9cmpfwjKHeKd`MeAHzotbt~uIUR@G&zq>{}f~I3jY8Jt3 zHVezkJxL5O&NPmcSFu&IoRNw;4D%_4m2HGEacjf7{JrwYmem6@P*Ca5L;sJR%?J^k zzX9#(8ZVa(D&Hb(YK>XhN+_Ym1qjEptt+YES zn=ASNf$3=hLdZ;)b8>Hd%Wc9F>etnM`_rk))nB@Y&rYU`7PqJOm6glFe=QD4VvLWB z05P9s6(_3|y&?B& zuvjN`oQ*`V#bnJS(bMA&+nkfkdwFYXCf35b{lhy|roH;KzAd;9SDyT!G#wVW{*g%L zz>kXoEf)eodTJ_aO*Df*v(}Py>Ru(IYWcV5j6JCXUG&l@+33K8~i2)|t z1Fkup@(P8J#Cr>73^r2SsRO|RcDO|DGV1sc(b3GA%=_V$kKC$~l1}NYMsCRa>rcfc z$9m90XJb|va4VpFqh;+MgXdc7`$uZCd71L&%@vLc58P~(d&8V=?C94!_(`|z>-Ib7 zRls7aC>X$$0~*ILfIc}zm}3HEV+PAcSllXj`7%1a9@*xRBJUTGXIY#gZy9H4uzxd` z3K{}m+5h;Kg8PwHg2>JObU(G`yA;=f$=Bg}UNIr1A~WMZ3-vOM$9?6?8CRG55;=Jp z#G2F4zJ4}HNovyTIK>TY-^Atr*Z%?s8if<<=Z`l}+y9*ayPBoRfPKwcQ!gnSxk;FD z3am}*pH7QKEb>OI^}fWV8EVell>(P*NH9tC6IL!wMnTEEZv-RR=z`{^FLyGgGo4{N zt~{9UyLRL51csLm<7u#oV#nUtToAkFz^HitV4r&u7TAV^&vJ4YkL= zJ>+#fMbnR6U3iX~rs=iML2SylZtH%_)h%cQr zH^((jo_M3pTy=7vAl&R*>})%@m3w#+xa{K33@*=+vvvB5vHhXQ6=oXv zbi3y*IkPr-OKbdvn24CxT#PSyeC``pgq} zd`Kp;8rZLrL@RM+9}sX4Tb(HVf~T6|Syfw`69MCumevwZ68=46v$36-5%+uF zp>MxtUZY;7AIx3f4pO^VU_}wp{_<#3aTGeQ^E4#W1dGDF^jR<;7&?EpG{ItkV~nRS zYdx5_w)7~C^r6=J?Wmyy!wO0zlKwO9IFL!jitke!@ws;1-9M{_75Dp}uj6WDa02^l zz@%lM#BGK_ezc_c{MoX)6RlYxcKkDrLU)El6H9B#WoEC5X_v~WqY?$i-Qg)99S(g_ zH%n*vlpk{I_&}xne1b)EvmvZDD|?s8ntxKLM(SU&&%=o~K$;ICRb%SDA0=Xdy9VNgCc z5KG1|@dCd9PJQ4R>htWGl}Z6A>1)@#+Ld@FL$DR-vWoFM z0vOSl*kZZcS>rOC!IK7pIFr+TkL(utcpw}ve;luBB)TN!F zrzdi?(QA43oc|;8?P9oU_q8C4HdH%OoII{<_;X*YZ-~Sv;(;G5DASbJL-aeObapl-Czs zbSRqXaT%ZeR2ciyRgKN?)%e)hR{xgmyjcLD`RXdPTtA!_l&Sjt@IO7hR5bWoT3TXH zi~Cyql2ev_MuUu@qatL3_@w1}vWEU9q5A7j%5ZjGf6GsbUA~IIKRIf=7FbN0f^Ki| zP4gfuG0DB36>*JI0b!qc6aQ2Bh;Zg~Of5HkXPhpVLdMl}(bDkNL;uIw&OISICc)6t zUAnYn!k)(Io2$}f_Iuf9b-0?Dt;4YV*5~oxPt?+0e_x-OzTTNxgIp*Xo7RVo&Sy9n ziaJbbYK%Bcw}H96@sz29wl8UDx{*hs?8QLeNtEBwl2=O-t(2(eR?k9lk-Go*l9vac zT(w$}+Gt&|$+CMu;J9nd7*??C1jv~zBfN^M4G-~h%jj7yEroV#L}v;noRY*hv9-)) zx!~|t#N6jmUxdq|x?)m-8uMA1XI$qsi6V)9n&02ak}~MX;9g!3qolXz-(LCZiv;v- zyXj<4=4OoyaX7WO7`x}k{-vk%DBVkIwUeh6~s%xtjp{9 z>Q7tS(a{lm9RFi?zE$nCUM|EWAd+D1iGb>Z|YPfDodZ`MQSvXHN zU|k!yQ`j-SCv*MeyMelgluVC|j4-HAqV$27;^GovrMu%uaK%k2l*6Atb4fx>%qyF{ zwHfC(dopqD{5nj5%xk`F9WNtE;Km-=WmM_Ms%Zh=t(Y9mCceN_~fL;ZFDIuCM9(5 z{*|=g2%5ao`f7c+zM>6?5?EZZn|i%kzcT;MW2_4tz!lg@xJALcvc56-P(Q(#SWys5v_U*=W-T0VJyd};b0on z!5%Tgh))U4BA*aoiXd&L*;-^we5s4LaeZmDD)U*D1$_yKruYB0m$!QVxY^y0QkqXt zF)>;0SK=eLh7dh=vVwY$F5vRMAqq}=7YBtDP`Kz5Cnp}vECg+n1zi6vYHLeawaY|G|DS6YfHK@A}gbThs9!jZvGeP~vtgsGbQzYQAc& zw2XT-sxgi@+P6pZ+aALWN}8xK)MKh|?sX4F(5)+m^sAGQG4C+0&fhmTex1+SU#)Lm zi`;rZ_<$!0%X??vvctv!PiNoO-p)9X0&k?lPDIRLKpe>rBcYCKMWPOR->P1ZH!e`* zIWDfWwz?VzaAzk_uVRJG8di`ezM}VEuho{i)JwPdIqTJ?py$O$5c$bv(R>i9HZ7PS z?~tB;O!?)Fob2~E*_*L!bbAxO6n^kKnDw({kLqw|RCCclQdEnljEWNq25y2oe|^Mm zIy7DHsVV%P28YLZ{HrWr=a-P+^z!Dpt4#`d&`W0@o@sI77UwS+_>?Oe3mQ%uIj363 zUZF7^@p=2hw5Ts2f3>sUlBzsb{bNY3UCrDX8K2uYiF)iT3X4zot1oWYVd{`VSSR*8 zK`EtVv9Gy-2CAZ^Q6f1DqBoy@DdzSq zp#71y{a;atO~1#u-pC%!ZfXr!uMGMSdzLz`{SEwZCenUIJCzCjBGHaBbD3CDYzvPo zkQ7L=7~|@U@67r6Pm=UBptHe}RHVAf2xA2qx)-u6hMTQbq6+ea3h5?@a)y13>68O9 z01Jli^quArG9#UrWyGJL!WUe9oIo75gtDN)TCS!q}-rL2l=FEe#hM1b`;OU&l z5dm$eTG2 zCSzU_9={q3YhS+=mTH(~wW@TUol?k?MevCP@#^&gvv#T~3%BDF+>t|Iy7tR(8Wrk~ ztF(Dm3D2(DMu6;lx{iIHo?|yM{CEodKveJE#T9{q3LxC~A!_fo@qN&-(+*QK49Y{( z2PextxxTpYbbi~~Xqt{mlBeqTW|lnoxT7^mDuC$S99Udp`7|gGP0gaBliap$_=?$- z*GM%mJEWSQc3g{1Qf%SOk@_ESVp#W!$X-J=i$0HwD2M)-a(G~njoUQ}l&=2jfG?9pYX`eMcZ@Dis$wh1aXEi_dIDt7UBcgp*;PLGOQ zfj1bI`0Un`_>6oZh&6+=Ab+E|1amBDni|${%~pCd2x(IY=MSUTw`xk%G&GdywM^C! zR%c3n=jfhdvNCv{aXVkXK9}q2tI?JX~zG9@9N?k+bFV zlCFzaiGyXhXv8b4?nDy~EDEwVmYWuQ)t?XL*z}`YG$T^dIekvAGj*zgHX+cI*IBrK zl3B&brv-{?R5n=Lvj3Wa_lR37S#{^>wv z@P}T)?+1Z=2M#heHc{`L8~i3S?&8L_pQWC$82p~+bKXI z3qgj5k$4C*5#CixaBotpceFGXPCVKY<3>8vH`F(nRW~-M;9xwVBYH@eLK<;4m44&8 z#`?BOA*tE5x!ZSkD&x7CnJ>3*&bBMFiXqMKf&XpX%l#~1cj#7qQ=V03Sv^A+^&@2v zBnNyg0U#8S${rPb&%WpkCKHg-+_(p&KooW4zbGcsiIG|)MIsJg;C@7*P#qs=�bm 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

Hr1>gKd}HOXUrnp$Jk^n( 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 0, 'limit must be a positive integer'); + + return this._test('min', limit, function (value, state, options) { + + if (value.length >= limit) { + return null; + } + + return Errors.create('array.min', { limit: limit }, state, options); + }); +}; + + +internals.Array.prototype.max = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('max', limit, function (value, state, options) { + + if (value.length <= limit) { + return null; + } + + return Errors.create('array.max', { limit: limit }, state, options); + }); +}; + + +internals.Array.prototype.length = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('length', limit, function (value, state, options) { + + if (value.length === limit) { + return null; + } + + return Errors.create('array.length', { limit: limit }, state, options); + }); +}; + + +internals.Array.prototype.unique = function () { + + return this._test('unique', undefined, function (value, state, options) { + + var found = { + string: {}, + number: {}, + undefined: {}, + boolean: {}, + object: [], + function: [] + }; + + for (var i = 0, il = value.length; i < il; ++i) { + var item = value[i]; + var type = typeof item; + var records = found[type]; + + // All available types are supported, so it's not possible to reach 100% coverage without ignoring this line. + // I still want to keep the test for future js versions with new types (eg. Symbol). + if (/* $lab:coverage:off$ */ records /* $lab:coverage:on$ */) { + if (Array.isArray(records)) { + for (var r = 0, rl = records.length; r < rl; ++r) { + if (Hoek.deepEqual(records[r], item)) { + return Errors.create('array.unique', { pos: i }, state, options); + } + } + + records.push(item); + } + else { + if (records[item]) { + return Errors.create('array.unique', { pos: i }, state, options); + } + + records[item] = true; + } + } + } + }); +}; + + +internals.Array.prototype.sparse = function (enabled) { + + var obj = this.clone(); + obj._flags.sparse = enabled === undefined ? true : !!enabled; + return obj; +}; + + +internals.Array.prototype.single = function (enabled) { + + var obj = this.clone(); + obj._flags.single = enabled === undefined ? true : !!enabled; + return obj; +} + + +module.exports = new internals.Array(); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/binary.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/binary.js new file mode 100755 index 0000000..83715b8 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/binary.js @@ -0,0 +1,98 @@ +// Load modules + +var Any = require('./any'); +var Errors = require('./errors'); +var Hoek = require('hoek'); + + +// Declare internals + +var internals = {}; + + +internals.Binary = function () { + + Any.call(this); + this._type = 'binary'; +}; + +Hoek.inherits(internals.Binary, Any); + + +internals.Binary.prototype._base = function (value, state, options) { + + var result = { + value: value + }; + + if (typeof value === 'string' && + options.convert) { + + try { + var converted = new Buffer(value, this._flags.encoding); + result.value = converted; + } + catch (e) { } + } + + result.errors = Buffer.isBuffer(result.value) ? null : Errors.create('binary.base', null, state, options); + return result; +}; + + +internals.Binary.prototype.encoding = function (encoding) { + + Hoek.assert(Buffer.isEncoding(encoding), 'Invalid encoding:', encoding); + + var obj = this.clone(); + obj._flags.encoding = encoding; + return obj; +}; + + +internals.Binary.prototype.min = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('min', limit, function (value, state, options) { + + if (value.length >= limit) { + return null; + } + + return Errors.create('binary.min', { limit: limit }, state, options); + }); +}; + + +internals.Binary.prototype.max = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('max', limit, function (value, state, options) { + + if (value.length <= limit) { + return null; + } + + return Errors.create('binary.max', { limit: limit }, state, options); + }); +}; + + +internals.Binary.prototype.length = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('length', limit, function (value, state, options) { + + if (value.length === limit) { + return null; + } + + return Errors.create('binary.length', { limit: limit }, state, options); + }); +}; + + +module.exports = new internals.Binary(); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/boolean.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/boolean.js new file mode 100755 index 0000000..b182a01 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/boolean.js @@ -0,0 +1,41 @@ +// Load modules + +var Any = require('./any'); +var Errors = require('./errors'); +var Hoek = require('hoek'); + + +// Declare internals + +var internals = {}; + + +internals.Boolean = function () { + + Any.call(this); + this._type = 'boolean'; +}; + +Hoek.inherits(internals.Boolean, Any); + + +internals.Boolean.prototype._base = function (value, state, options) { + + var result = { + value: value + }; + + if (typeof value === 'string' && + options.convert) { + + var lower = value.toLowerCase(); + result.value = (lower === 'true' || lower === 'yes' || lower === 'on' ? true + : (lower === 'false' || lower === 'no' || lower === 'off' ? false : value)); + } + + result.errors = (typeof result.value === 'boolean') ? null : Errors.create('boolean.base', null, state, options); + return result; +}; + + +module.exports = new internals.Boolean(); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/cast.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/cast.js new file mode 100755 index 0000000..41fd99b --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/cast.js @@ -0,0 +1,74 @@ +// Load modules + +var Hoek = require('hoek'); +var Ref = require('./ref'); +// Type modules are delay-loaded to prevent circular dependencies + + +// Declare internals + +var internals = { + any: null, + date: require('./date'), + string: require('./string'), + number: require('./number'), + boolean: require('./boolean'), + alt: null, + object: null +}; + + +exports.schema = function (config) { + + internals.any = internals.any || new (require('./any'))(); + internals.alt = internals.alt || require('./alternatives'); + internals.object = internals.object || require('./object'); + + if (config && + typeof config === 'object') { + + if (config.isJoi) { + return config; + } + + if (Array.isArray(config)) { + return internals.alt.try(config); + } + + if (config instanceof RegExp) { + return internals.string.regex(config); + } + + if (config instanceof Date) { + return internals.date.valid(config); + } + + return internals.object.keys(config); + } + + if (typeof config === 'string') { + return internals.string.valid(config); + } + + if (typeof config === 'number') { + return internals.number.valid(config); + } + + if (typeof config === 'boolean') { + return internals.boolean.valid(config); + } + + if (Ref.isRef(config)) { + return internals.any.valid(config); + } + + Hoek.assert(config === null, 'Invalid schema content:', config); + + return internals.any.valid(null); +}; + + +exports.ref = function (id) { + + return Ref.isRef(id) ? id : Ref.create(id); +}; \ No newline at end of file diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/date.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/date.js new file mode 100755 index 0000000..1fa8f7b --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/date.js @@ -0,0 +1,168 @@ +// Load modules + +var Any = require('./any'); +var Errors = require('./errors'); +var Ref = require('./ref'); +var Hoek = require('hoek'); +var Moment = require('moment'); + + +// Declare internals + +var internals = {}; + +internals.isoDate = /^((\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\d))$/; +internals.invalidDate = new Date(''); +internals.isIsoDate = (function() { + + var isoString = internals.isoDate.toString(); + + return function (date) { + + return date && (date.toString() === isoString); + }; +})(); + +internals.Date = function () { + + Any.call(this); + this._type = 'date'; +}; + +Hoek.inherits(internals.Date, Any); + + +internals.Date.prototype._base = function (value, state, options) { + + var result = { + value: (options.convert && internals.toDate(value, this._flags.format)) || value + }; + + if (result.value instanceof Date && !isNaN(result.value.getTime())) { + result.errors = null; + } + else { + result.errors = Errors.create(internals.isIsoDate(this._flags.format) ? 'date.isoDate' : 'date.base', null, state, options); + } + + return result; +}; + + +internals.toDate = function (value, format) { + + if (value instanceof Date) { + return value; + } + + if (typeof value === 'string' || + Hoek.isInteger(value)) { + + if (typeof value === 'string' && + /^[+-]?\d+$/.test(value)) { + + value = parseInt(value, 10); + } + + var date; + if (format) { + if (internals.isIsoDate(format)) { + date = format.test(value) ? new Date(value) : internals.invalidDate; + } + else { + date = Moment(value, format, true); + date = date.isValid() ? date.toDate() : internals.invalidDate; + } + } + else { + date = new Date(value); + } + + if (!isNaN(date.getTime())) { + return date; + } + } + + return null; +}; + + +internals.compare = function (type, compare) { + + return function (date) { + + var isNow = date === 'now'; + var isRef = Ref.isRef(date); + + if (!isNow && !isRef) { + date = internals.toDate(date); + } + + Hoek.assert(date, 'Invalid date format'); + + return this._test(type, date, function (value, state, options) { + + var compareTo; + if (isNow) { + compareTo = Date.now(); + } + else if (isRef) { + compareTo = internals.toDate(date(state.parent)); + + if (!compareTo) { + return Errors.create('date.ref', { ref: date.key }, state, options); + } + + compareTo = compareTo.getTime(); + } + else { + compareTo = date.getTime(); + } + + if (compare(value.getTime(), compareTo)) { + return null; + } + + return Errors.create('date.' + type, { limit: new Date(compareTo) }, state, options); + }); + }; +}; + + +internals.Date.prototype.min = internals.compare('min', function (value, date) { + + return value >= date; +}); + + +internals.Date.prototype.max = internals.compare('max', function (value, date) { + + return value <= date; +}); + + +internals.Date.prototype.format = function (format) { + + Hoek.assert(typeof format === 'string' || (Array.isArray(format) && format.every(function (f) { + + return typeof f === 'string'; + })), 'Invalid format.'); + + var obj = this.clone(); + obj._flags.format = format; + return obj; +}; + +internals.Date.prototype.iso = function () { + + var obj = this.clone(); + obj._flags.format = internals.isoDate; + return obj; +}; + +internals.Date.prototype._isIsoDate = function (value) { + + return internals.isoDate.test(value); +}; + +module.exports = new internals.Date(); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/errors.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/errors.js new file mode 100755 index 0000000..034642a --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/errors.js @@ -0,0 +1,159 @@ +// Load modules + +var Hoek = require('hoek'); +var Language = require('./language'); + + +// Declare internals + +var internals = {}; + + +internals.Err = function (type, context, state, options) { + + this.type = type; + this.context = context || {}; + this.context.key = state.key; + this.path = state.path; + this.options = options; +}; + + +internals.Err.prototype.toString = function () { + + var self = this; + + var localized = this.options.language; + this.context.key = localized.label || this.context.key || localized.root || Language.errors.root; + + var format = Hoek.reach(localized, this.type) || Hoek.reach(Language.errors, this.type); + var hasKey = /\{\{\!?key\}\}/.test(format); + format = (hasKey ? format : '{{!key}} ' + format); + var message = format.replace(/\{\{(\!?)([^}]+)\}\}/g, function ($0, isSecure, name) { + + var value = Hoek.reach(self.context, name); + var normalized = Array.isArray(value) ? value.join(', ') : value.toString(); + return (isSecure ? Hoek.escapeHtml(normalized) : normalized); + }); + + return message; +}; + + +exports.create = function (type, context, state, options) { + + return new internals.Err(type, context, state, options); +}; + + +exports.process = function (errors, object) { + + if (!errors || !errors.length) { + return null; + } + + var details = []; + for (var i = 0, il = errors.length; i < il; ++i) { + var item = errors[i]; + details.push({ + message: item.toString(), + path: internals.getPath(item), + type: item.type, + context: item.context + }); + } + + // Construct error + + var message = ''; + details.forEach(function (error) { + + message += (message ? '. ' : '') + error.message; + }); + + var error = new Error(message); + error.name = 'ValidationError'; + error.details = details; + error._object = object; + error.annotate = internals.annotate; + return error; +}; + + +internals.getPath = function (item) { + + var recursePath = function (it) { + + var reachedItem = Hoek.reach(it, 'context.reason.0'); + if (reachedItem && reachedItem.context) { + return recursePath(reachedItem); + } + + return it.path; + }; + + return recursePath(item) || item.context.key; +}; + + +internals.annotate = function () { + + var obj = Hoek.clone(this._object || {}); + + var lookup = {}; + var el = this.details.length; + for (var e = el - 1; e >= 0; --e) { // Reverse order to process deepest child first + var pos = el - e; + var error = this.details[e]; + var path = error.path.split('.'); + var ref = obj; + for (var i = 0, il = path.length; i < il && ref; ++i) { + var seg = path[i]; + if (i + 1 < il) { + ref = ref[seg]; + } + else { + var value = ref[seg]; + if (value !== undefined) { + delete ref[seg]; + var label = seg + '_$key$_' + pos + '_$end$_'; + ref[label] = value; + lookup[error.path] = label; + } + else if (lookup[error.path]) { + var replacement = lookup[error.path]; + var appended = replacement.replace('_$end$_', ', ' + pos + '_$end$_'); + ref[appended] = ref[replacement]; + lookup[error.path] = appended; + delete ref[replacement]; + } + else { + ref['_$miss$_' + seg + '|' + pos + '_$end$_'] = '__missing__'; + } + } + } + } + + var annotated = JSON.stringify(obj, null, 2); + + annotated = annotated.replace(/_\$key\$_([, \d]+)_\$end\$_\"/g, function ($0, $1) { + + return '" \u001b[31m[' + $1 + ']\u001b[0m'; + }); + + var message = annotated.replace(/\"_\$miss\$_([^\|]+)\|(\d+)_\$end\$_\"\: \"__missing__\"/g, function ($0, $1, $2) { + + return '\u001b[41m"' + $1 + '"\u001b[0m\u001b[31m [' + $2 + ']: -- missing --\u001b[0m'; + }); + + message += '\n\u001b[31m'; + + for (e = 0; e < el; ++e) { + message += '\n[' + (e + 1) + '] ' + this.details[e].message; + } + + message += '\u001b[0m'; + + return message; +}; + diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/function.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/function.js new file mode 100755 index 0000000..a11f72c --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/function.js @@ -0,0 +1,31 @@ +// Load modules + +var Any = require('./any'); +var Errors = require('./errors'); +var Hoek = require('hoek'); + + +// Declare internals + +var internals = {}; + + +internals.Function = function () { + + Any.call(this); + this._type = 'func'; +}; + +Hoek.inherits(internals.Function, Any); + + +internals.Function.prototype._base = function (value, state, options) { + + return { + value: value, + errors: (typeof value === 'function') ? null : Errors.create('function.base', null, state, options) + }; +}; + + +module.exports = new internals.Function(); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/index.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/index.js new file mode 100755 index 0000000..2db8d5d --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/index.js @@ -0,0 +1,129 @@ +// Load modules + +var Hoek = require('hoek'); +var Any = require('./any'); +var Cast = require('./cast'); +var Ref = require('./ref'); + + +// Declare internals + +var internals = { + alternatives: require('./alternatives'), + array: require('./array'), + boolean: require('./boolean'), + binary: require('./binary'), + date: require('./date'), + func: require('./function'), + number: require('./number'), + object: require('./object'), + string: require('./string') +}; + + +internals.root = function () { + + var any = new Any(); + + var root = any.clone(); + root.any = function () { + + return any; + }; + + root.alternatives = root.alt = function () { + + return arguments.length ? internals.alternatives.try.apply(internals.alternatives, arguments) : internals.alternatives; + }; + + root.array = function () { + + return internals.array; + }; + + root.boolean = root.bool = function () { + + return internals.boolean; + }; + + root.binary = function () { + + return internals.binary; + }; + + root.date = function () { + + return internals.date; + }; + + root.func = function () { + + return internals.func; + }; + + root.number = function () { + + return internals.number; + }; + + root.object = function () { + + return arguments.length ? internals.object.keys.apply(internals.object, arguments) : internals.object; + }; + + root.string = function () { + + return internals.string; + }; + + root.ref = function () { + + return Ref.create.apply(null, arguments); + }; + + root.isRef = function (ref) { + + return Ref.isRef(ref); + }; + + root.validate = function (value /*, [schema], [options], callback */) { + + var last = arguments[arguments.length - 1]; + var callback = typeof last === 'function' ? last : null; + + var count = arguments.length - (callback ? 1 : 0); + if (count === 1) { + return any.validate(value, callback); + } + + var options = count === 3 ? arguments[2] : {}; + var schema = Cast.schema(arguments[1]); + + return schema._validateWithOptions(value, options, callback); + }; + + root.describe = function () { + + var schema = arguments.length ? Cast.schema(arguments[0]) : any; + return schema.describe(); + }; + + root.compile = function (schema) { + + return Cast.schema(schema); + }; + + root.assert = function (value, schema, message) { + + message = (message ? message + ' ' : ''); + var error = root.validate(value, schema).error; + if (error) { + throw new Error(message + error.annotate()); + } + }; + + return root; +}; + + +module.exports = internals.root(); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/language.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/language.js new file mode 100755 index 0000000..64246b2 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/language.js @@ -0,0 +1,106 @@ +// Load modules + + +// Declare internals + +var internals = {}; + + +exports.errors = { + root: 'value', + any: { + unknown: 'is not allowed', + invalid: 'contains an invalid value', + empty: 'is not allowed to be empty', + required: 'is required', + allowOnly: 'must be one of {{valids}}' + }, + alternatives: { + base: 'not matching any of the allowed alternatives' + }, + array: { + base: 'must be an array', + includes: 'at position {{pos}} does not match any of the allowed types', + includesSingle: 'single value of {{!key}} does not match any of the allowed types', + includesOne: 'at position {{pos}} fails because {{reason}}', + includesOneSingle: 'single value of {{!key}} fails because {{reason}}', + excludes: 'at position {{pos}} contains an excluded value', + excludesSingle: 'single value of {{!key}} contains an excluded value', + min: 'must contain at least {{limit}} items', + max: 'must contain less than or equal to {{limit}} items', + length: 'must contain {{limit}} items', + sparse: 'must not be a sparse array', + unique: 'position {{pos}} contains a duplicate value' + }, + boolean: { + base: 'must be a boolean' + }, + binary: { + base: 'must be a buffer or a string', + min: 'must be at least {{limit}} bytes', + max: 'must be less than or equal to {{limit}} bytes', + length: 'must be {{limit}} bytes' + }, + date: { + base: 'must be a number of milliseconds or valid date string', + min: 'must be larger than or equal to {{limit}}', + max: 'must be less than or equal to {{limit}}', + isoDate: 'must be a valid ISO 8601 date', + ref: 'references {{ref}} which is not a date' + }, + function: { + base: 'must be a Function' + }, + object: { + base: 'must be an object', + min: 'must have at least {{limit}} children', + max: 'must have less than or equal to {{limit}} children', + length: 'must have {{limit}} children', + allowUnknown: 'is not allowed', + with: 'missing required peer {{peer}}', + without: 'conflict with forbidden peer {{peer}}', + missing: 'must contain at least one of {{peers}}', + xor: 'contains a conflict between exclusive peers {{peers}}', + or: 'must contain at least one of {{peers}}', + and: 'contains {{present}} without its required peers {{missing}}', + nand: '{{main}} must not exist simultaneously with {{peers}}', + assert: 'validation failed because {{ref}} failed to {{message}}', + rename: { + multiple: 'cannot rename child {{from}} because multiple renames are disabled and another key was already renamed to {{to}}', + override: 'cannot rename child {{from}} because override is disabled and target {{to}} exists' + }, + type: 'must be an instance of {{type}}' + }, + number: { + base: 'must be a number', + min: 'must be larger than or equal to {{limit}}', + max: 'must be less than or equal to {{limit}}', + less: 'must be less than {{limit}}', + greater: 'must be greater than {{limit}}', + float: 'must be a float or double', + integer: 'must be an integer', + negative: 'must be a negative number', + positive: 'must be a positive number', + precision: 'must have no more than {{limit}} decimal places' + }, + string: { + base: 'must be a string', + min: 'length must be at least {{limit}} characters long', + max: 'length must be less than or equal to {{limit}} characters long', + length: 'length must be {{limit}} characters long', + alphanum: 'must only contain alpha-numeric characters', + token: 'must only contain alpha-numeric and underscore characters', + regex: { + base: 'fails to match the required pattern', + name: 'fails to match the {{name}} pattern' + }, + email: 'must be a valid email', + isoDate: 'must be a valid ISO 8601 date', + guid: 'must be a valid GUID', + hostname: 'must be a valid hostname', + lowercase: 'must only contain lowercase characters', + uppercase: 'must only contain uppercase characters', + trim: 'must not have leading or trailing whitespace', + creditCard: 'must be a credit card' + } +}; diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/number.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/number.js new file mode 100755 index 0000000..0d2f693 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/number.js @@ -0,0 +1,170 @@ +// Load modules + +var Any = require('./any'); +var Errors = require('./errors'); +var Hoek = require('hoek'); + + +// Declare internals + +var internals = {}; + + +internals.Number = function () { + + Any.call(this); + this._type = 'number'; + this._invalids.add(Infinity); + this._invalids.add(-Infinity); +}; + +Hoek.inherits(internals.Number, Any); + + +internals.Number.prototype._base = function (value, state, options) { + + var result = { + errors: null, + value: value + }; + + if (typeof value === 'string' && + options.convert) { + + var number = parseFloat(value); + result.value = (isNaN(number) || !isFinite(value)) ? NaN : number; + } + + var isNumber = typeof result.value === 'number' && !isNaN(result.value); + + if (options.convert && 'precision' in this._flags && isNumber) { + // This is conceptually equivalent to using toFixed but it should be much faster + var precision = Math.pow(10, this._flags.precision); + result.value = Math.round(result.value * precision) / precision; + } + + result.errors = isNumber ? null : Errors.create('number.base', null, state, options); + return result; +}; + + +internals.Number.prototype.min = function (limit) { + + Hoek.assert(Hoek.isInteger(limit), 'limit must be an integer'); + + return this._test('min', limit, function (value, state, options) { + + if (value >= limit) { + return null; + } + + return Errors.create('number.min', { limit: limit }, state, options); + }); +}; + + +internals.Number.prototype.max = function (limit) { + + Hoek.assert(Hoek.isInteger(limit), 'limit must be an integer'); + + return this._test('max', limit, function (value, state, options) { + + if (value <= limit) { + return null; + } + + return Errors.create('number.max', { limit: limit }, state, options); + }); +}; + + +internals.Number.prototype.greater = function (limit) { + + Hoek.assert(Hoek.isInteger(limit), 'limit must be an integer'); + + return this._test('greater', limit, function (value, state, options) { + + if (value > limit) { + return null; + } + + return Errors.create('number.greater', { limit: limit }, state, options); + }); +}; + + +internals.Number.prototype.less = function (limit) { + + Hoek.assert(Hoek.isInteger(limit), 'limit must be an integer'); + + return this._test('less', limit, function (value, state, options) { + + if (value < limit) { + return null; + } + + return Errors.create('number.less', { limit: limit }, state, options); + }); +}; + + +internals.Number.prototype.integer = function () { + + return this._test('integer', undefined, function (value, state, options) { + + return Hoek.isInteger(value) ? null : Errors.create('number.integer', null, state, options); + }); +}; + + +internals.Number.prototype.negative = function () { + + return this._test('negative', undefined, function (value, state, options) { + + if (value < 0) { + return null; + } + + return Errors.create('number.negative', null, state, options); + }); +}; + + +internals.Number.prototype.positive = function () { + + return this._test('positive', undefined, function (value, state, options) { + + if (value > 0) { + return null; + } + + return Errors.create('number.positive', null, state, options); + }); +}; + + +internals.precisionRx = /(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/; + + +internals.Number.prototype.precision = function (limit) { + + Hoek.assert(Hoek.isInteger(limit), 'limit must be an integer'); + Hoek.assert(!('precision' in this._flags), 'precision already set'); + + var obj = this._test('precision', limit, function (value, state, options){ + + var places = value.toString().match(internals.precisionRx); + var decimals = Math.max((places[1] ? places[1].length : 0) - (places[2] ? parseInt(places[2], 10) : 0), 0); + if (decimals <= limit) { + return null; + } + + return Errors.create('number.precision', {limit: limit}, state, options); + }); + + obj._flags.precision = limit; + return obj; +}; + + +module.exports = new internals.Number(); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/object.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/object.js new file mode 100755 index 0000000..99acacf --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/object.js @@ -0,0 +1,685 @@ +// Load modules + +var Hoek = require('hoek'); +var Topo = require('topo'); +var Any = require('./any'); +var Cast = require('./cast'); +var Errors = require('./errors'); + + +// Declare internals + +var internals = {}; + + +internals.Object = function () { + + Any.call(this); + this._type = 'object'; + this._inner.children = null; + this._inner.renames = []; + this._inner.dependencies = []; + this._inner.patterns = []; +}; + +Hoek.inherits(internals.Object, Any); + + +internals.Object.prototype._base = function (value, state, options) { + + var target = value; + var errors = []; + var finish = function () { + + return { + value: target, + errors: errors.length ? errors : null + }; + }; + + if (typeof value === 'string' && + options.convert) { + + try { + value = JSON.parse(value); + } + catch (err) { } + } + + if (!value || + typeof value !== 'object' || + Array.isArray(value)) { + + errors.push(Errors.create('object.base', null, state, options)); + return finish(); + } + + // Skip if there are no other rules to test + + if (!this._inner.renames.length && + !this._inner.dependencies.length && + !this._inner.children && // null allows any keys + !this._inner.patterns.length) { + + target = value; + return finish(); + } + + // Ensure target is a local copy (parsed) or shallow copy + + if (target === value) { + target = Object.create(Object.getPrototypeOf(value)); + var valueKeys = Object.keys(value); + for (var t = 0, tl = valueKeys.length; t < tl; ++t) { + target[valueKeys[t]] = value[valueKeys[t]]; + } + } + else { + target = value; + } + + // Rename keys + + var renamed = {}; + for (var r = 0, rl = this._inner.renames.length; r < rl; ++r) { + var item = this._inner.renames[r]; + + if (target[item.from] === undefined) { + continue; + } + + if (!item.options.multiple && + renamed[item.to]) { + + errors.push(Errors.create('object.rename.multiple', { from: item.from, to: item.to }, state, options)); + if (options.abortEarly) { + return finish(); + } + } + + if (target.hasOwnProperty(item.to) && + !item.options.override && + !renamed[item.to]) { + + errors.push(Errors.create('object.rename.override', { from: item.from, to: item.to }, state, options)); + if (options.abortEarly) { + return finish(); + } + } + + target[item.to] = target[item.from]; + renamed[item.to] = true; + + if (!item.options.alias) { + delete target[item.from]; + } + } + + // Validate dependencies + + for (var d = 0, dl = this._inner.dependencies.length; d < dl; ++d) { + var dep = this._inner.dependencies[d]; + var err = internals[dep.type](dep.key !== null && value[dep.key], dep.peers, target, { key: dep.key, path: (state.path ? state.path + '.' : '') + dep.key }, options); + if (err) { + errors.push(err); + if (options.abortEarly) { + return finish(); + } + } + } + + // Validate schema + + if (!this._inner.children && // null allows any keys + !this._inner.patterns.length) { + + return finish(); + } + + var unprocessed = Hoek.mapToObject(Object.keys(target)); + var key; + + if (this._inner.children) { + for (var i = 0, il = this._inner.children.length; i < il; ++i) { + var child = this._inner.children[i]; + var key = child.key; + var item = target[key]; + + delete unprocessed[key]; + + var localState = { key: key, path: (state.path ? state.path + '.' : '') + key, parent: target, reference: state.reference }; + var result = child.schema._validate(item, localState, options); + if (result.errors) { + errors = errors.concat(result.errors); + if (options.abortEarly) { + return finish(); + } + } + + if (result.value !== undefined) { + target[key] = result.value; + } + } + } + + // Unknown keys + + var unprocessedKeys = Object.keys(unprocessed); + if (unprocessedKeys.length && + this._inner.patterns.length) { + + for (i = 0, il = unprocessedKeys.length; i < il; ++i) { + var key = unprocessedKeys[i]; + + for (var p = 0, pl = this._inner.patterns.length; p < pl; ++p) { + var pattern = this._inner.patterns[p]; + + if (pattern.regex.test(key)) { + delete unprocessed[key]; + + var item = target[key]; + var localState = { key: key, path: (state.path ? state.path + '.' : '') + key, parent: target, reference: state.reference }; + var result = pattern.rule._validate(item, localState, options); + if (result.errors) { + errors = errors.concat(result.errors); + if (options.abortEarly) { + return finish(); + } + } + + if (result.value !== undefined) { + target[key] = result.value; + } + } + } + } + + unprocessedKeys = Object.keys(unprocessed); + } + + if (unprocessedKeys.length) { + if (options.stripUnknown || + options.skipFunctions) { + + var hasFunctions = false; + for (var k = 0, kl = unprocessedKeys.length; k < kl; ++k) { + key = unprocessedKeys[k]; + + if (options.stripUnknown) { + delete target[key]; + } + else if (typeof target[key] === 'function') { + delete unprocessed[key]; + hasFunctions = true; + } + } + + if (options.stripUnknown) { + return finish(); + } + + if (hasFunctions) { + unprocessedKeys = Object.keys(unprocessed); + } + } + + if (unprocessedKeys.length && + (this._flags.allowUnknown !== undefined ? !this._flags.allowUnknown : !options.allowUnknown)) { + + for (var e = 0, el = unprocessedKeys.length; e < el; ++e) { + errors.push(Errors.create('object.allowUnknown', null, { key: unprocessedKeys[e], path: state.path }, options)); + } + } + } + + return finish(); +}; + + +internals.Object.prototype.keys = function (schema) { + + Hoek.assert(schema === null || schema === undefined || typeof schema === 'object', 'Object schema must be a valid object'); + Hoek.assert(!schema || !schema.isJoi, 'Object schema cannot be a joi schema'); + + var obj = this.clone(); + + if (!schema) { + obj._inner.children = null; + return obj; + } + + var children = Object.keys(schema); + + if (!children.length) { + obj._inner.children = []; + return obj; + } + + var topo = new Topo(); + if (obj._inner.children) { + for (var i = 0, il = obj._inner.children.length; i < il; ++i) { + var child = obj._inner.children[i]; + topo.add(child, { after: child._refs, group: child.key }); + } + } + + for (var c = 0, cl = children.length; c < cl; ++c) { + var key = children[c]; + var child = schema[key]; + var cast = Cast.schema(child); + topo.add({ key: key, schema: cast }, { after: cast._refs, group: key }); + } + + obj._inner.children = topo.nodes; + + return obj; +}; + + +internals.Object.prototype.unknown = function (allow) { + + var obj = this.clone(); + obj._flags.allowUnknown = (allow !== false); + return obj; +}; + + +internals.Object.prototype.length = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('length', limit, function (value, state, options) { + + if (Object.keys(value).length === limit) { + return null; + } + + return Errors.create('object.length', { limit: limit }, state, options); + }); +}; + + +internals.Object.prototype.min = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('min', limit, function (value, state, options) { + + if (Object.keys(value).length >= limit) { + return null; + } + + return Errors.create('object.min', { limit: limit }, state, options); + }); +}; + + +internals.Object.prototype.max = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('max', limit, function (value, state, options) { + + if (Object.keys(value).length <= limit) { + return null; + } + + return Errors.create('object.max', { limit: limit }, state, options); + }); +}; + + +internals.Object.prototype.pattern = function (pattern, schema) { + + Hoek.assert(pattern instanceof RegExp, 'Invalid regular expression'); + Hoek.assert(schema !== undefined, 'Invalid rule'); + + pattern = new RegExp(pattern.source, pattern.ignoreCase ? 'i' : undefined); // Future version should break this and forbid unsupported regex flags + + var obj = this.clone(); + obj._inner.patterns.push({ regex: pattern, rule: Cast.schema(schema) }); + return obj; +}; + + +internals.Object.prototype.with = function (key, peers) { + + return this._dependency('with', key, peers); +}; + + +internals.Object.prototype.without = function (key, peers) { + + return this._dependency('without', key, peers); +}; + + +internals.Object.prototype.xor = function () { + + var peers = Hoek.flatten(Array.prototype.slice.call(arguments)); + return this._dependency('xor', null, peers); +}; + + +internals.Object.prototype.or = function () { + + var peers = Hoek.flatten(Array.prototype.slice.call(arguments)); + return this._dependency('or', null, peers); +}; + + +internals.Object.prototype.and = function () { + + var peers = Hoek.flatten(Array.prototype.slice.call(arguments)); + return this._dependency('and', null, peers); +}; + + +internals.Object.prototype.nand = function () { + + var peers = Hoek.flatten(Array.prototype.slice.call(arguments)); + return this._dependency('nand', null, peers); +}; + + +internals.Object.prototype.requiredKeys = function (children) { + + children = Hoek.flatten(Array.prototype.slice.call(arguments)); + return this.applyFunctionToChildren(children, 'required'); +}; + + +internals.Object.prototype.optionalKeys = function (children) { + + children = Hoek.flatten(Array.prototype.slice.call(arguments)); + return this.applyFunctionToChildren(children, 'optional'); +}; + + +internals.renameDefaults = { + alias: false, // Keep old value in place + multiple: false, // Allow renaming multiple keys into the same target + override: false // Overrides an existing key +}; + + +internals.Object.prototype.rename = function (from, to, options) { + + Hoek.assert(typeof from === 'string', 'Rename missing the from argument'); + Hoek.assert(typeof to === 'string', 'Rename missing the to argument'); + Hoek.assert(to !== from, 'Cannot rename key to same name:', from); + + for (var i = 0, il = this._inner.renames.length; i < il; ++i) { + Hoek.assert(this._inner.renames[i].from !== from, 'Cannot rename the same key multiple times'); + } + + var obj = this.clone(); + + obj._inner.renames.push({ + from: from, + to: to, + options: Hoek.applyToDefaults(internals.renameDefaults, options || {}) + }); + + return obj; +}; + + +internals.groupChildren = function (children) { + + children.sort(); + + var grouped = {}; + + for (var c = 0, lc = children.length; c < lc; c++) { + var child = children[c]; + Hoek.assert(typeof child === 'string', 'children must be strings'); + var group = child.split('.')[0]; + var childGroup = grouped[group] = (grouped[group] || []); + childGroup.push(child.substring(group.length + 1)); + } + + return grouped; +}; + + +internals.Object.prototype.applyFunctionToChildren = function (children, fn, args, root) { + + children = [].concat(children); + Hoek.assert(children.length > 0, 'expected at least one children'); + + var groupedChildren = internals.groupChildren(children); + var obj; + + if ('' in groupedChildren) { + obj = this[fn].apply(this, args); + delete groupedChildren['']; + } + else { + obj = this.clone(); + } + + if (obj._inner.children) { + root = root ? (root + '.') : ''; + + for (var i = 0, il = obj._inner.children.length; i < il; ++i) { + var child = obj._inner.children[i]; + var group = groupedChildren[child.key]; + + if (group) { + obj._inner.children[i] = { + key: child.key, + _refs: child._refs, + schema: child.schema.applyFunctionToChildren(group, fn, args, root + child.key) + }; + + delete groupedChildren[child.key]; + } + } + } + + var remaining = Object.keys(groupedChildren); + Hoek.assert(remaining.length === 0, 'unknown key(s)', remaining.join(', ')); + + return obj; +}; + + +internals.Object.prototype._dependency = function (type, key, peers) { + + peers = [].concat(peers); + for (var i = 0, li = peers.length; i < li; i++) { + Hoek.assert(typeof peers[i] === 'string', type, 'peers must be a string or array of strings'); + } + + var obj = this.clone(); + obj._inner.dependencies.push({ type: type, key: key, peers: peers }); + return obj; +}; + + +internals.with = function (value, peers, parent, state, options) { + + if (value === undefined) { + return null; + } + + for (var i = 0, il = peers.length; i < il; ++i) { + var peer = peers[i]; + if (!parent.hasOwnProperty(peer) || + parent[peer] === undefined) { + + return Errors.create('object.with', { peer: peer }, state, options); + } + } + + return null; +}; + + +internals.without = function (value, peers, parent, state, options) { + + if (value === undefined) { + return null; + } + + for (var i = 0, il = peers.length; i < il; ++i) { + var peer = peers[i]; + if (parent.hasOwnProperty(peer) && + parent[peer] !== undefined) { + + return Errors.create('object.without', { peer: peer }, state, options); + } + } + + return null; +}; + + +internals.xor = function (value, peers, parent, state, options) { + + var present = []; + for (var i = 0, il = peers.length; i < il; ++i) { + var peer = peers[i]; + if (parent.hasOwnProperty(peer) && + parent[peer] !== undefined) { + + present.push(peer); + } + } + + if (present.length === 1) { + return null; + } + + if (present.length === 0) { + return Errors.create('object.missing', { peers: peers }, state, options); + } + + return Errors.create('object.xor', { peers: peers }, state, options); +}; + + +internals.or = function (value, peers, parent, state, options) { + + for (var i = 0, il = peers.length; i < il; ++i) { + var peer = peers[i]; + if (parent.hasOwnProperty(peer) && + parent[peer] !== undefined) { + return null; + } + } + + return Errors.create('object.missing', { peers: peers }, state, options); +}; + + +internals.and = function (value, peers, parent, state, options) { + + var missing = []; + var present = []; + var count = peers.length; + for (var i = 0; i < count; ++i) { + var peer = peers[i]; + if (!parent.hasOwnProperty(peer) || + parent[peer] === undefined) { + + missing.push(peer); + } + else { + present.push(peer); + } + } + + var aon = (missing.length === count || present.length === count); + return !aon ? Errors.create('object.and', { present: present, missing: missing }, state, options) : null; +}; + + +internals.nand = function (value, peers, parent, state, options) { + + var present = []; + for (var i = 0, il = peers.length; i < il; ++i) { + var peer = peers[i]; + if (parent.hasOwnProperty(peer) && + parent[peer] !== undefined) { + + present.push(peer); + } + } + + var values = Hoek.clone(peers); + var main = values.splice(0,1); + var allPresent = (present.length === peers.length); + return allPresent ? Errors.create('object.nand', { main: main, peers: values }, state, options) : null; +}; + + +internals.Object.prototype.describe = function (shallow) { + + var description = Any.prototype.describe.call(this); + + if (this._inner.children && + !shallow) { + + description.children = {}; + for (var i = 0, il = this._inner.children.length; i < il; ++i) { + var child = this._inner.children[i]; + description.children[child.key] = child.schema.describe(); + } + } + + if (this._inner.dependencies.length) { + description.dependencies = Hoek.clone(this._inner.dependencies); + } + + if (this._inner.patterns.length) { + description.patterns = []; + + for (var p = 0, pl = this._inner.patterns.length; p < pl; ++p) { + var pattern = this._inner.patterns[p]; + description.patterns.push({ regex: pattern.regex.toString(), rule: pattern.rule.describe() }); + } + } + + return description; +}; + + +internals.Object.prototype.assert = function (ref, schema, message) { + + ref = Cast.ref(ref); + Hoek.assert(ref.isContext || ref.depth > 1, 'Cannot use assertions for root level references - use direct key rules instead'); + message = message || 'pass the assertion test'; + + var cast = Cast.schema(schema); + + return this._test('assert', { cast: cast, ref: ref }, function (value, state, options) { + + var result = cast._validate(ref(value), null, options, value); + if (!result.errors) { + return null; + } + + return Errors.create('object.assert', { ref: ref.path.join('.'), message: message }, state, options); + }); +}; + + +internals.Object.prototype.type = function (constructor, name) { + + Hoek.assert(typeof constructor === 'function', 'type must be a constructor function'); + name = name || constructor.name; + + return this._test('type', name, function (value, state, options) { + + if (value instanceof constructor) { + return null; + } + + return Errors.create('object.type', { type: name }, state, options); + }); +}; + + +module.exports = new internals.Object(); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/ref.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/ref.js new file mode 100755 index 0000000..7bc1842 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/ref.js @@ -0,0 +1,51 @@ +// Load modules + +var Hoek = require('hoek'); + + +// Declare internals + +var internals = {}; + + +exports.create = function (key, options) { + + Hoek.assert(typeof key === 'string', 'Invalid reference key:', key); + + var settings = Hoek.clone(options); // options can be reused and modified + + var ref = function (value, validationOptions) { + + return Hoek.reach(ref.isContext ? validationOptions.context : value, ref.key, settings); + }; + + ref.isContext = (key[0] === ((settings && settings.contextPrefix) || '$')); + ref.key = (ref.isContext ? key.slice(1) : key); + ref.path = ref.key.split((settings && settings.separator) || '.'); + ref.depth = ref.path.length; + ref.root = ref.path[0]; + ref.isJoi = true; + + ref.toString = function () { + + return (ref.isContext ? 'context:' : 'ref:') + ref.key; + }; + + return ref; +}; + + +exports.isRef = function (ref) { + + return typeof ref === 'function' && ref.isJoi; +}; + + +exports.push = function (array, ref) { + + if (exports.isRef(ref) && + !ref.isContext) { + + array.push(ref.root); + } +}; \ No newline at end of file diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/string.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/string.js new file mode 100755 index 0000000..1b22802 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/lib/string.js @@ -0,0 +1,282 @@ +// Load modules + +var Net = require('net'); +var Hoek = require('hoek'); +var Isemail = require('isemail'); +var Any = require('./any'); +var JoiDate = require('./date'); +var Errors = require('./errors'); + +// Declare internals + +var internals = {}; + + +internals.String = function () { + + Any.call(this); + this._type = 'string'; + this._invalids.add(''); +}; + +Hoek.inherits(internals.String, Any); + + +internals.String.prototype._base = function (value, state, options) { + + if (typeof value === 'string' && + options.convert) { + + if (this._flags.case) { + value = (this._flags.case === 'upper' ? value.toLocaleUpperCase() : value.toLocaleLowerCase()); + } + + if (this._flags.trim) { + value = value.trim(); + } + } + + return { + value: value, + errors: (typeof value === 'string') ? null : Errors.create('string.base', null, state, options) + }; +}; + + +internals.String.prototype.insensitive = function () { + + var obj = this.clone(); + obj._flags.insensitive = true; + return obj; +}; + + +internals.String.prototype.min = function (limit, encoding) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + Hoek.assert(!encoding || Buffer.isEncoding(encoding), 'Invalid encoding:', encoding); + + return this._test('min', limit, function (value, state, options) { + + var length = encoding ? Buffer.byteLength(value, encoding) : value.length; + if (length >= limit) { + return null; + } + + return Errors.create('string.min', { limit: limit }, state, options); + }); +}; + + +internals.String.prototype.max = function (limit, encoding) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + Hoek.assert(!encoding || Buffer.isEncoding(encoding), 'Invalid encoding:', encoding); + + return this._test('max', limit, function (value, state, options) { + + var length = encoding ? Buffer.byteLength(value, encoding) : value.length; + if (length <= limit) { + return null; + } + + return Errors.create('string.max', { limit: limit }, state, options); + }); +}; + + +internals.String.prototype.creditCard = function () { + + return this._test('creditCard', undefined, function (value, state, options) { + + var i = value.length; + var sum = 0; + var mul = 1; + var char; + + while (i--) { + char = value.charAt(i) * mul; + sum += char - (char > 9) * 9; + mul ^= 3; + } + + var check = (sum % 10 === 0) && (sum > 0); + return check ? null : Errors.create('string.creditCard', null, state, options); + }); +}; + + +internals.String.prototype.length = function (limit, encoding) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + Hoek.assert(!encoding || Buffer.isEncoding(encoding), 'Invalid encoding:', encoding); + + return this._test('length', limit, function (value, state, options) { + + var length = encoding ? Buffer.byteLength(value, encoding) : value.length; + if (length === limit) { + return null; + } + + return Errors.create('string.length', { limit: limit }, state, options); + }); +}; + + +internals.String.prototype.regex = function (pattern, name) { + + Hoek.assert(pattern instanceof RegExp, 'pattern must be a RegExp'); + + pattern = new RegExp(pattern.source, pattern.ignoreCase ? 'i' : undefined); // Future version should break this and forbid unsupported regex flags + + return this._test('regex', pattern, function (value, state, options) { + + if (pattern.test(value)) { + return null; + } + + return Errors.create((name ? 'string.regex.name' : 'string.regex.base'), { name: name }, state, options); + }); +}; + + +internals.String.prototype.alphanum = function () { + + return this._test('alphanum', undefined, function (value, state, options) { + + if (/^[a-zA-Z0-9]+$/.test(value)) { + return null; + } + + return Errors.create('string.alphanum', null, state, options); + }); +}; + + +internals.String.prototype.token = function () { + + return this._test('token', undefined, function (value, state, options) { + + if (/^\w+$/.test(value)) { + return null; + } + + return Errors.create('string.token', null, state, options); + }); +}; + + +internals.String.prototype.email = function () { + + return this._test('email', undefined, function (value, state, options) { + + if (Isemail(value)) { + return null; + } + + return Errors.create('string.email', null, state, options); + }); +}; + + +internals.String.prototype.isoDate = function () { + + return this._test('isoDate', undefined, function (value, state, options) { + + if (JoiDate._isIsoDate(value)) { + return null; + } + + return Errors.create('string.isoDate', null, state, options); + }); +}; + + +internals.String.prototype.guid = function () { + + var regex = /^[A-F0-9]{8}(?:-?[A-F0-9]{4}){3}-?[A-F0-9]{12}$/i; + var regex2 = /^\{[A-F0-9]{8}(?:-?[A-F0-9]{4}){3}-?[A-F0-9]{12}\}$/i; + + return this._test('guid', undefined, function (value, state, options) { + + if (regex.test(value) || regex2.test(value)) { + return null; + } + + return Errors.create('string.guid', null, state, options); + }); +}; + + +internals.String.prototype.hostname = function () { + + var regex = /^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$/; + + return this._test('hostname', undefined, function (value, state, options) { + + if ((value.length <= 255 && regex.test(value)) || + Net.isIPv6(value)) { + + return null; + } + + return Errors.create("string.hostname", null, state, options); + }); +}; + + +internals.String.prototype.lowercase = function () { + + var obj = this._test('lowercase', undefined, function (value, state, options) { + + if (options.convert || + value === value.toLocaleLowerCase()) { + + return null; + } + + return Errors.create('string.lowercase', null, state, options); + }); + + obj._flags.case = 'lower'; + return obj; +}; + + +internals.String.prototype.uppercase = function (options) { + + var obj = this._test('uppercase', undefined, function (value, state, options) { + + if (options.convert || + value === value.toLocaleUpperCase()) { + + return null; + } + + return Errors.create('string.uppercase', null, state, options); + }); + + obj._flags.case = 'upper'; + return obj; +}; + + +internals.String.prototype.trim = function () { + + var obj = this._test('trim', undefined, function (value, state, options) { + + if (options.convert || + value === value.trim()) { + + return null; + } + + return Errors.create('string.trim', null, state, options); + }); + + obj._flags.trim = true; + return obj; +}; + + +module.exports = new internals.String(); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/.npmignore b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/.npmignore new file mode 100644 index 0000000..5761e0a --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/.npmignore @@ -0,0 +1,2 @@ +isemail.sublime-* +node_modules diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/.travis.yml b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/.travis.yml new file mode 100644 index 0000000..1bc77fb --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/.travis.yml @@ -0,0 +1,8 @@ +language: node_js +node_js: + - "0.8" + - "0.10" +notifications: + hipchat: + rooms: + secure: lzNdJmq9QLPpKWKiFE+w1DNUhw+jp1OF1SIMlxSnT++H8M7NLVWchXzPIyoaE4enmy8n2JxMA9FGTaQvOER+G9UswuyOO2nUDjlt/I949SeN9DyVAf4XAwXnKbhXcmGuCho2odO7VeKPmrJXgoxbJYy3Ne0lS7zLU6rEkNJotIg= diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/LICENSE b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/LICENSE new file mode 100644 index 0000000..67e5251 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/LICENSE @@ -0,0 +1,11 @@ +Copyright © 2008-2011, Dominic Sayers +Copyright © 2013, GlobeSherpa +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +- Neither the name of Dominic Sayers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/Makefile b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/Makefile new file mode 100644 index 0000000..86b2d13 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/Makefile @@ -0,0 +1,4 @@ +test: + npm test + +.PHONY: test diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/README.md b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/README.md new file mode 100644 index 0000000..7e3f979 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/README.md @@ -0,0 +1,92 @@ +isemail +======= + +[![Build Status](https://travis-ci.org/globesherpa/node-isemail.png)](https://travis-ci.org/globesherpa/node-isemail) +[![Coverage Status](https://coveralls.io/repos/globesherpa/node-isemail/badge.png?branch=master)](https://coveralls.io/r/globesherpa/node-isemail?branch=master) + +This first version of `isemail` is a port of the PHP `is_email` function by Dominic Sayers. + +Future versions will improve upon the current version, optimizing it for efficient usage and DRYing the code. + +Install +------- + +```sh +$ npm install isemail +``` + +Test +---- + +The tests were pulled from is_email's extensive [test suite][tests] on October 15, 2013. Many thanks to the contributors! + +Run any of the following. + +```sh +$ mocha +$ npm test +$ make test +``` + +_remember to_ `npm install`! + +API +--- + +### isEmail(email, [options], [callback]) + +Determines whether the `email` is valid or not, for various definitions thereof. Optionally accepts an `options` object and a `callback` function. Options may include `errorLevel` and `checkDNS`. The `callback` function will always be called if specified, and the result of the operation supplied as the only parameter to the callback function. If `isEmail` is not asked to check for the existence of the domain (`checkDNS`), it will also synchronously return the result of the operation. + +Use `errorLevel` to specify the type of result for `isEmail`. Passing a `false` literal will result in a true or false boolean indicating whether the email address is sufficiently defined for use in sending an email. Passing a `true` literal will result in a more granular numeric status, with zero being a perfectly valid email address. Passing a number will return `0` if the numeric status is below the `errorLevel` and the numeric status otherwise. + +The `tldWhitelist` option can be either an object lookup table or an array of valid top-level domains. If the email address has a top-level domain that is not in the whitelist, the email will be marked as invalid. + +The `minDomainAtoms` option is an optional positive integer that specifies the minimum number of domain atoms that must be included for the email address to be considered valid. Be careful with the option, as some top-level domains, like `io`, directly support email addresses. + +#### Examples + +```js +$ node +> var isEmail = require('isemail'); +undefined +> var log = console.log.bind(console, 'result'); +undefined +> isEmail('test@iana.org'); +true +> isEmail('test@iana.org', log); +result true +true +> isEmail('test@iana.org', {checkDNS: true}); +undefined +> isEmail('test@iana.org', {checkDNS: true}, log); +undefined +result true +> isEmail('test@iana.org', {errorLevel: true}); +0 +> isEmail('test@iana.org', {errorLevel: true}, log); +result 0 +0 +> isEmail('test@e.com'); +true +> isEmail('test@e.com', {checkDNS: true, errorLevel: true}, log); +undefined +result 6 +> isEmail('test@e.com', {checkDNS: true, errorLevel: 7}, log); +undefined +result 0 +> isEmail('test@e.com', {checkDNS: true, errorLevel: 6}, log); +undefined +result 6 +``` + +TODO +==== + +Add tests for library usage, not just functionality comparisons. + +License +======= + +[BSD License](http://www.opensource.org/licenses/bsd-license.php) + +[tests]: http://isemail.info/_system/is_email/test/?all‎ "is_email test suite" diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/dns-no-mx.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/dns-no-mx.js new file mode 100755 index 0000000..c868304 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/dns-no-mx.js @@ -0,0 +1,80 @@ +#!/usr/bin/env node + +var dns = require('dns'); + +function check(domain, callback) { + var done = false, count = 3; + + dns.resolveCname(domain, handleRecords); + dns.resolve4(domain, handleRecords); + dns.resolve6(domain, handleRecords); + + function handleRecords(err, records) { + if (done) return; + count--; + if (!err && records && records.length) { + done = true; + return dns.resolveMx(domain, handleMail); + } + if (count === 0) { + done = true; + // ain't got time for node style callbacks + callback(false); + } + } + + function handleMail(err, records) { + if ((!err || err.code === dns.NODATA) && records && records.length) { + return callback(false); + } + callback(true); + } +} + +function spin(max, concurrent) { + if (!(max >= 0)) { + max = 1; + } + if (!(concurrent > 0)) { + concurrent = 4; + } + var active = 0, domain = domains(4, ['com', 'org', 'net']); + (function next() { + active++; + var d = domain(); + check(d, function(nomx) { + active--; + if (nomx) { + console.log(d); + if (!--max) { + process.exit(); + } + } + if (active < concurrent) { + next(); + } + }); + if (active < concurrent) { + next(); + } + })(); +} + +spin(1, 16); + +function domains(length, tops) { + var index = 0, end = Math.pow(26, length) * tops.length; + tops = tops.slice(); + return function next() { + if (index === end) return; + var active = index++, domain = ''; + var main = tops[active % tops.length]; + active = (active / tops.length) | 0; + for (var i = 0; i < length; i++) { + domain = String.fromCharCode(97 + active % 26) + domain; + active = (active / 26) | 0; + } + domain += '.' + main; + return domain; + }; +} diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/index.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/index.js new file mode 100644 index 0000000..d7a780e --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/index.js @@ -0,0 +1 @@ +module.exports = require('./lib/isemail'); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/lib/isemail.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/lib/isemail.js new file mode 100644 index 0000000..e948bbd --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/lib/isemail.js @@ -0,0 +1,1279 @@ +/** + * To validate an email address according to RFCs 5321, 5322 and others + * + * Copyright © 2008-2011, Dominic Sayers + * Test schema documentation Copyright © 2011, Daniel Marschall + * Port for Node.js Copyright © 2013, GlobeSherpa + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Neither the name of Dominic Sayers nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @author Dominic Sayers + * @author Eli Skeggs + * @copyright 2008-2011 Dominic Sayers + * @copyright 2013-2014 GlobeSherpa + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://www.dominicsayers.com/isemail + * @link https://github.com/globesherpa/isemail + * @version 1.1.1 - Optimization pass, simplify constants, style, dead code. + */ + +// lazy-loaded +var dns, HAS_REQUIRE = typeof require !== 'undefined'; + +// categories +var ISEMAIL_VALID_CATEGORY = 1; +var ISEMAIL_DNSWARN = 7; +var ISEMAIL_RFC5321 = 15; +var ISEMAIL_CFWS = 31; +var ISEMAIL_DEPREC = 63; +var ISEMAIL_RFC5322 = 127; +var ISEMAIL_ERR = 255; + +// diagnoses +// address is valid +var ISEMAIL_VALID = 0; +// address is valid but a DNS check was not successful +var ISEMAIL_DNSWARN_NO_MX_RECORD = 5; +var ISEMAIL_DNSWARN_NO_RECORD = 6; +// address is valid for SMTP but has unusual elements +var ISEMAIL_RFC5321_TLD = 9; +var ISEMAIL_RFC5321_TLDNUMERIC = 10; +var ISEMAIL_RFC5321_QUOTEDSTRING = 11; +var ISEMAIL_RFC5321_ADDRESSLITERAL = 12; +var ISEMAIL_RFC5321_IPV6DEPRECATED = 13; +// address is valid within the message but cannot be used unmodified for the +// envelope +var ISEMAIL_CFWS_COMMENT = 17; +var ISEMAIL_CFWS_FWS = 18; +// address contains deprecated elements but may still be valid in restricted +// contexts +var ISEMAIL_DEPREC_LOCALPART = 33; +var ISEMAIL_DEPREC_FWS = 34; +var ISEMAIL_DEPREC_QTEXT = 35; +var ISEMAIL_DEPREC_QP = 36; +var ISEMAIL_DEPREC_COMMENT = 37; +var ISEMAIL_DEPREC_CTEXT = 38; +var ISEMAIL_DEPREC_CFWS_NEAR_AT = 49; +// the address is only valid according to the broad definition of RFC 5322, but +// otherwise invalid +var ISEMAIL_RFC5322_DOMAIN = 65; +var ISEMAIL_RFC5322_TOOLONG = 66; +var ISEMAIL_RFC5322_LOCAL_TOOLONG = 67; +var ISEMAIL_RFC5322_DOMAIN_TOOLONG = 68; +var ISEMAIL_RFC5322_LABEL_TOOLONG = 69; +var ISEMAIL_RFC5322_DOMAINLITERAL = 70; +var ISEMAIL_RFC5322_DOMLIT_OBSDTEXT = 71; +var ISEMAIL_RFC5322_IPV6_GRPCOUNT = 72; +var ISEMAIL_RFC5322_IPV6_2X2XCOLON = 73; +var ISEMAIL_RFC5322_IPV6_BADCHAR = 74; +var ISEMAIL_RFC5322_IPV6_MAXGRPS = 75; +var ISEMAIL_RFC5322_IPV6_COLONSTRT = 76; +var ISEMAIL_RFC5322_IPV6_COLONEND = 77; +// address is invalid for any purpose +var ISEMAIL_ERR_EXPECTING_DTEXT = 129; +var ISEMAIL_ERR_NOLOCALPART = 130; +var ISEMAIL_ERR_NODOMAIN = 131; +var ISEMAIL_ERR_CONSECUTIVEDOTS = 132; +var ISEMAIL_ERR_ATEXT_AFTER_CFWS = 133; +var ISEMAIL_ERR_ATEXT_AFTER_QS = 134; +var ISEMAIL_ERR_ATEXT_AFTER_DOMLIT = 135; +var ISEMAIL_ERR_EXPECTING_QPAIR = 136; +var ISEMAIL_ERR_EXPECTING_ATEXT = 137; +var ISEMAIL_ERR_EXPECTING_QTEXT = 138; +var ISEMAIL_ERR_EXPECTING_CTEXT = 139; +var ISEMAIL_ERR_BACKSLASHEND = 140; +var ISEMAIL_ERR_DOT_START = 141; +var ISEMAIL_ERR_DOT_END = 142; +var ISEMAIL_ERR_DOMAINHYPHENSTART = 143; +var ISEMAIL_ERR_DOMAINHYPHENEND = 144; +var ISEMAIL_ERR_UNCLOSEDQUOTEDSTR = 145; +var ISEMAIL_ERR_UNCLOSEDCOMMENT = 146; +var ISEMAIL_ERR_UNCLOSEDDOMLIT = 147; +var ISEMAIL_ERR_FWS_CRLF_X2 = 148; +var ISEMAIL_ERR_FWS_CRLF_END = 149; +var ISEMAIL_ERR_CR_NO_LF = 150; +var ISEMAIL_ERR_UNKNOWN_TLD = 160; +var ISEMAIL_ERR_TOOSHORT_DOMAIN = 161; + +// function control +var THRESHOLD = 16; +// email parts +var COMPONENT_LOCALPART = 0; +var COMPONENT_DOMAIN = 1; +var COMPONENT_LITERAL = 2; +var CONTEXT_COMMENT = 3; +var CONTEXT_FWS = 4; +var CONTEXT_QUOTEDSTRING = 5; +var CONTEXT_QUOTEDPAIR = 6; + +// US-ASCII visible characters not valid for atext +// (http://tools.ietf.org/html/rfc5322#section-3.2.3) +var SPECIALS = '()<>[]:;@\\,."'; + +function optimizeLookup(string) { + var body = '', min = 0x100, max = 0, lookup = new Array(min); + for (var i = min - 1; i >= 0; i--) { + lookup[i] = false; + } + for (var i = 0; i < string.length; i++) { + var chr = string.charCodeAt(i); + if (chr < min) { + min = chr; + } + if (chr > max) { + max = chr; + } + lookup[chr] = true; + } + lookup.length = max; + var body = 'var lookup = ' + JSON.stringify(lookup) + ';\n'; + body += 'return function(code) {\n'; + body += ' if (code < ' + min + ' || code > ' + max + ') {\n'; + body += ' return false;\n'; + body += ' }\n'; + body += ' return lookup[code];\n'; + body += '}'; + return (new Function(body))(); +} + +var specialsLookup = optimizeLookup(SPECIALS); + +// matches valid IPv4 addresses from the end of a string +var IPv4_REGEX = + /\b(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/; +var IPv6_REGEX = /^[a-fA-F\d]{0,4}$/; +var IPv6_REGEX_TEST = IPv6_REGEX.test.bind(IPv6_REGEX); + +var hasOwn = Object.prototype.hasOwnProperty; + +/** + * Get the largest number in the array. + * + * Returns -Infinity if the array is empty. + * + * @param {Array.} array The array to scan. + * @return {number} The largest number contained. + */ +function maxValue(array) { + var v = -Infinity, i = 0, n = array.length; + + for (; i < n; i++) { + if (array[i] > v) { + v = array[i]; + } + } + + return v; +} + +/** + * Check that an email address conforms to RFCs 5321, 5322 and others + * + * As of Version 3.0, we are now distinguishing clearly between a Mailbox + * as defined by RFC 5321 and an addr-spec as defined by RFC 5322. Depending + * on the context, either can be regarded as a valid email address. The + * RFC 5321 Mailbox specification is more restrictive (comments, white space + * and obsolete forms are not allowed). + * + * @param {string} email The email address to check. + * @param {boolean} checkDNS If true then will check DNS for MX records. If true + * this isEmail _will_ be asynchronous. + * @param {*} errorLevel Determines the boundary between valid and invalid + * addresses. Status codes above this number will be returned as-is, status + * codes below will be returned as ISEMAIL_VALID. Thus the calling program can + * simply look for ISEMAIL_VALID if it is only interested in whether an + * address is valid or not. The errorLevel will determine how "picky" + * isEmail() is about the address. If omitted or passed as false then + * isEmail() will return true or false rather than an integer error or + * warning. NB Note the difference between errorLevel = false and + * errorLevel = 0. + * @return {*} + */ +function isEmail(email, options, callback) { + if (typeof options === 'function') { + callback = options; + options = {}; + } + options || (options = {}); + + var threshold, diagnose; + if (typeof options.errorLevel === 'number') { + diagnose = true; + threshold = options.errorLevel; + } else { + diagnose = !!options.errorLevel; + threshold = ISEMAIL_VALID; + } + + if (options.tldWhitelist && typeof options.tldWhitelist !== 'object') { + throw new TypeError('expected array or object tldWhitelist'); + } + + if (options.minDomainAtoms && (options.minDomainAtoms !== + ((+options.minDomainAtoms) | 0) || options.minDomainAtoms < 0)) { + throw new TypeError('expected positive integer minDomainAtoms'); + } + + var maxResult = ISEMAIL_VALID; + + function updateResult(value) { + if (value > maxResult) { + maxResult = value; + } + } + + var context = { + now: COMPONENT_LOCALPART, + prev: COMPONENT_LOCALPART, + stack: [COMPONENT_LOCALPART] + }; + + var token = '', prevToken = '', charCode = 0; + var parseData = {local: '', domain: ''}; + var atomList = {local: [''], domain: ['']}; + + var elementCount = 0, elementLength = 0, crlfCount = 0; + var hyphenFlag = false, assertEnd = false; + + for (var i = 0; i < email.length; i++) { + token = email[i]; + + switch (context.now) { + // local-part + case COMPONENT_LOCALPART: + // http://tools.ietf.org/html/rfc5322#section-3.4.1 + // local-part = dot-atom / quoted-string / obs-local-part + // + // dot-atom = [CFWS] dot-atom-text [CFWS] + // + // dot-atom-text = 1*atext *("." 1*atext) + // + // quoted-string = [CFWS] + // DQUOTE *([FWS] qcontent) [FWS] DQUOTE + // [CFWS] + // + // obs-local-part = word *("." word) + // + // word = atom / quoted-string + // + // atom = [CFWS] 1*atext [CFWS] + switch (token) { + // comment + case '(': + if (elementLength === 0) { + // comments are OK at the beginning of an element + updateResult(elementCount === 0 ? ISEMAIL_CFWS_COMMENT : + ISEMAIL_DEPREC_COMMENT); + } else { + updateResult(ISEMAIL_CFWS_COMMENT); + // can't start a comment in an element, should be end + assertEnd = true; + } + context.stack.push(context.now); + context.now = CONTEXT_COMMENT; + break; + // next dot-atom element + case '.': + if (elementLength === 0) { + // another dot, already? + updateResult(elementCount === 0 ? ISEMAIL_ERR_DOT_START : + ISEMAIL_ERR_CONSECUTIVEDOTS); + } else { + // the entire local-part can be a quoted string for RFC 5321 + // if it's just one atom that is quoted then it's an RFC 5322 obsolete + // form + if (assertEnd) { + updateResult(ISEMAIL_DEPREC_LOCALPART); + } + + // CFWS & quoted strings are OK again now we're at the beginning of an + // element (although they are obsolete forms) + assertEnd = false; + elementLength = 0; + elementCount++; + parseData.local += token; + atomList.local[elementCount] = ''; // TODO: push? + } + break; + // quoted string + case '"': + if (elementLength === 0) { + // the entire local-part can be a quoted string for RFC 5321 + // if it's just one atom that is quoted then it's an RFC 5322 obsolete + // form + updateResult(elementCount === 0 ? ISEMAIL_RFC5321_QUOTEDSTRING : + ISEMAIL_DEPREC_LOCALPART); + + parseData.local += token; + atomList.local[elementCount] += token; + elementLength++; + assertEnd = true; // quoted string must be the entire element + context.stack.push(context.now); + context.now = CONTEXT_QUOTEDSTRING; + } else { + updateResult(ISEMAIL_ERR_EXPECTING_ATEXT); + } + break; + // folding white space + case '\r': + if ((++i === email.length) || email[i] !== '\n') { + // fatal error + updateResult(ISEMAIL_ERR_CR_NO_LF); + break; + } + case ' ': + case '\t': + if (elementLength === 0) { + updateResult(elementCount === 0 ? ISEMAIL_CFWS_FWS : + ISEMAIL_DEPREC_FWS); + } else { + // we can't start FWS in the middle of an element, better be end + assertEnd = true; + } + + context.stack.push(context.now); + context.now = CONTEXT_FWS; + prevToken = token; + break; + // @ + case '@': + // at this point we should have a valid local-part + /* istanbul ignore next: logically unreachable */ + if (context.stack.length !== 1) { + throw new Error('unexpected item on context stack'); + } + + if (parseData.local.length === 0) { + // fatal error + updateResult(ISEMAIL_ERR_NOLOCALPART); + } else if (elementLength === 0) { + // fatal error + updateResult(ISEMAIL_ERR_DOT_END); + // http://tools.ietf.org/html/rfc5321#section-4.5.3.1.1 + // the maximum total length of a user name or other local-part is 64 + // octets + } else if (parseData.local.length > 64) { + updateResult(ISEMAIL_RFC5322_LOCAL_TOOLONG); + // http://tools.ietf.org/html/rfc5322#section-3.4.1 + // comments and folding white space + // SHOULD NOT be used around the "@" in the addr-spec + // + // http://tools.ietf.org/html/rfc2119 + // 4. SHOULD NOT this phrase, or the phrase "NOT RECOMMENDED" mean that + // there may exist valid reasons in particular circumstances when the + // particular behavior is acceptable or even useful, but the full + // implications should be understood and the case carefully weighed + // before implementing any behavior described with this label + } else if ((context.prev === CONTEXT_COMMENT) || + (context.prev === CONTEXT_FWS)) { + updateResult(ISEMAIL_DEPREC_CFWS_NEAR_AT); + } + + // clear everything down for the domain parsing + context.now = COMPONENT_DOMAIN; // where we are + context.stack[0] = COMPONENT_DOMAIN; // where we have been + elementCount = 0; + elementLength = 0; + assertEnd = false; // CFWS can only appear at the end of the element + break; + // atext + default: + // http://tools.ietf.org/html/rfc5322#section-3.2.3 + // atext = ALPHA / DIGIT / ; Printable US-ASCII + // "!" / "#" / ; characters not including + // "$" / "%" / ; specials. Used for atoms. + // "&" / "'" / + // "*" / "+" / + // "-" / "/" / + // "=" / "?" / + // "^" / "_" / + // "`" / "{" / + // "|" / "}" / + // "~" + if (assertEnd) { + // we have encountered atext where it is no longer valid + switch (context.prev) { + case CONTEXT_COMMENT: + case CONTEXT_FWS: + updateResult(ISEMAIL_ERR_ATEXT_AFTER_CFWS); + break; + case CONTEXT_QUOTEDSTRING: + updateResult(ISEMAIL_ERR_ATEXT_AFTER_QS); + break; + /* istanbul ignore next: logically unreachable */ + default: + throw new Error('more atext found where none is allowed, ' + + 'but unrecognized prev context: ' + context.prev); + } + } else { + context.prev = context.now; + charCode = token.charCodeAt(0); + + if (charCode < 33 || charCode > 126 || charCode === 10 || + specialsLookup(charCode)) { + // fatal error + updateResult(ISEMAIL_ERR_EXPECTING_ATEXT); + } + + parseData.local += token; + atomList.local[elementCount] += token; + elementLength++; + } + } + break; + case COMPONENT_DOMAIN: + // http://tools.ietf.org/html/rfc5322#section-3.4.1 + // domain = dot-atom / domain-literal / obs-domain + // + // dot-atom = [CFWS] dot-atom-text [CFWS] + // + // dot-atom-text = 1*atext *("." 1*atext) + // + // domain-literal = [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS] + // + // dtext = %d33-90 / ; Printable US-ASCII + // %d94-126 / ; characters not including + // obs-dtext ; "[", "]", or "\" + // + // obs-domain = atom *("." atom) + // + // atom = [CFWS] 1*atext [CFWS] + + // http://tools.ietf.org/html/rfc5321#section-4.1.2 + // Mailbox = Local-part "@" ( Domain / address-literal ) + // + // Domain = sub-domain *("." sub-domain) + // + // address-literal = "[" ( IPv4-address-literal / + // IPv6-address-literal / + // General-address-literal ) "]" + // ; See Section 4.1.3 + + // http://tools.ietf.org/html/rfc5322#section-3.4.1 + // Note: A liberal syntax for the domain portion of addr-spec is + // given here. However, the domain portion contains addressing + // information specified by and used in other protocols (e.g., + // [RFC1034], [RFC1035], [RFC1123], [RFC5321]). It is therefore + // incumbent upon implementations to conform to the syntax of + // addresses for the context in which they are used. + // is_email() author's note: it's not clear how to interpret this in + // the context of a general email address validator. The conclusion I + // have reached is this: "addressing information" must comply with + // RFC 5321 (and in turn RFC 1035), anything that is "semantically + // invisible" must comply only with RFC 5322. + switch (token) { + // comment + case '(': + if (elementLength === 0) { + // comments at the start of the domain are deprecated in the text + // comments at the start of a subdomain are obs-domain + // (http://tools.ietf.org/html/rfc5322#section-3.4.1) + updateResult(elementCount === 0 ? ISEMAIL_DEPREC_CFWS_NEAR_AT : + ISEMAIL_DEPREC_COMMENT); + } else { + updateResult(ISEMAIL_CFWS_COMMENT); + assertEnd = true; // can't start a comment mid-element, better be end + } + + context.stack.push(context.now); + context.now = CONTEXT_COMMENT; + break; + // next dot-atom element + case '.': + if (elementLength === 0) { + // another dot, already? fatal error + updateResult(elementCount === 0 ? ISEMAIL_ERR_DOT_START : + ISEMAIL_ERR_CONSECUTIVEDOTS); + } else if (hyphenFlag) { + // previous subdomain ended in a hyphen + updateResult(ISEMAIL_ERR_DOMAINHYPHENEND); // fatal error + } else if (elementLength > 63) { + // Nowhere in RFC 5321 does it say explicitly that the + // domain part of a Mailbox must be a valid domain according + // to the DNS standards set out in RFC 1035, but this *is* + // implied in several places. For instance, wherever the idea + // of host routing is discussed the RFC says that the domain + // must be looked up in the DNS. This would be nonsense unless + // the domain was designed to be a valid DNS domain. Hence we + // must conclude that the RFC 1035 restriction on label length + // also applies to RFC 5321 domains. + // + // http://tools.ietf.org/html/rfc1035#section-2.3.4 + // labels 63 octets or less + + updateResult(ISEMAIL_RFC5322_LABEL_TOOLONG); + } + + // CFWS is OK again now we're at the beginning of an element (although + // it may be obsolete CFWS) + assertEnd = false; + elementLength = 0; + elementCount++; + atomList.domain[elementCount] = ''; + parseData.domain += token; + + break; + // domain literal + case '[': + if (parseData.domain.length === 0) { + // domain literal must be the only component + assertEnd = true; + elementLength++; + context.stack.push(context.now); + context.now = COMPONENT_LITERAL; + parseData.domain += token; + atomList.domain[elementCount] += token; + parseData.literal = ''; + } else { + // fatal error + updateResult(ISEMAIL_ERR_EXPECTING_ATEXT); + } + break; + // folding white space + case '\r': + if ((++i === email.length) || email[i] !== '\n') { + // fatal error + updateResult(ISEMAIL_ERR_CR_NO_LF); + break; + } + case ' ': + case '\t': + if (elementLength === 0) { + updateResult(elementCount === 0 ? ISEMAIL_DEPREC_CFWS_NEAR_AT : + ISEMAIL_DEPREC_FWS); + } else { + // we can't start FWS in the middle of an element, so this better be + // the end + updateResult(ISEMAIL_CFWS_FWS); + assertEnd = true; + } + + context.stack.push(context.now); + context.now = CONTEXT_FWS; + prevToken = token; + break; + // atext + default: + // RFC 5322 allows any atext... + // http://tools.ietf.org/html/rfc5322#section-3.2.3 + // atext = ALPHA / DIGIT / ; Printable US-ASCII + // "!" / "#" / ; characters not including + // "$" / "%" / ; specials. Used for atoms. + // "&" / "'" / + // "*" / "+" / + // "-" / "/" / + // "=" / "?" / + // "^" / "_" / + // "`" / "{" / + // "|" / "}" / + // "~" + + // But RFC 5321 only allows letter-digit-hyphen to comply with DNS rules + // (RFCs 1034 & 1123) + // http://tools.ietf.org/html/rfc5321#section-4.1.2 + // sub-domain = Let-dig [Ldh-str] + // + // Let-dig = ALPHA / DIGIT + // + // Ldh-str = *( ALPHA / DIGIT / "-" ) Let-dig + // + if (assertEnd) { + // we have encountered atext where it is no longer valid + switch (context.prev) { + case CONTEXT_COMMENT: + case CONTEXT_FWS: + updateResult(ISEMAIL_ERR_ATEXT_AFTER_CFWS); + break; + case COMPONENT_LITERAL: + updateResult(ISEMAIL_ERR_ATEXT_AFTER_DOMLIT); + break; + /* istanbul ignore next: logically unreachable */ + default: + throw new Error('more atext found where none is allowed, ' + + 'but unrecognized prev context: ' + context.prev); + } + } + + charCode = token.charCodeAt(0); + // assume this token isn't a hyphen unless we discover it is + hyphenFlag = false; + + if (charCode < 33 || charCode > 126 || specialsLookup(charCode)) { + // fatal error + updateResult(ISEMAIL_ERR_EXPECTING_ATEXT); + } else if (token === '-') { + if (elementLength === 0) { + // hyphens can't be at the beginning of a subdomain + updateResult(ISEMAIL_ERR_DOMAINHYPHENSTART); // fatal error + } + + hyphenFlag = true; + } else if (!((charCode > 47 && charCode < 58) || + (charCode > 64 && charCode < 91) || + (charCode > 96 && charCode < 123))) { + // not an RFC 5321 subdomain, but still OK by RFC 5322 + updateResult(ISEMAIL_RFC5322_DOMAIN); + } + + parseData.domain += token; + atomList.domain[elementCount] += token; + elementLength++; + } + break; + // domain literal + case COMPONENT_LITERAL: + // http://tools.ietf.org/html/rfc5322#section-3.4.1 + // domain-literal = [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS] + // + // dtext = %d33-90 / ; Printable US-ASCII + // %d94-126 / ; characters not including + // obs-dtext ; "[", "]", or "\" + // + // obs-dtext = obs-NO-WS-CTL / quoted-pair + switch (token) { + // end of domain literal + case ']': + if (maxResult < ISEMAIL_DEPREC) { + // Could be a valid RFC 5321 address literal, so let's check + + // http://tools.ietf.org/html/rfc5321#section-4.1.2 + // address-literal = "[" ( IPv4-address-literal / + // IPv6-address-literal / + // General-address-literal ) "]" + // ; See Section 4.1.3 + // + // http://tools.ietf.org/html/rfc5321#section-4.1.3 + // IPv4-address-literal = Snum 3("." Snum) + // + // IPv6-address-literal = "IPv6:" IPv6-addr + // + // General-address-literal = Standardized-tag ":" 1*dcontent + // + // Standardized-tag = Ldh-str + // ; Standardized-tag MUST be specified in a + // ; Standards-Track RFC and registered with IANA + // + // dcontent = %d33-90 / ; Printable US-ASCII + // %d94-126 ; excl. "[", "\", "]" + // + // Snum = 1*3DIGIT + // ; representing a decimal integer + // ; value in the range 0 through 255 + // + // IPv6-addr = IPv6-full / IPv6-comp / IPv6v4-full / IPv6v4-comp + // + // IPv6-hex = 1*4HEXDIG + // + // IPv6-full = IPv6-hex 7(":" IPv6-hex) + // + // IPv6-comp = [IPv6-hex *5(":" IPv6-hex)] "::" + // [IPv6-hex *5(":" IPv6-hex)] + // ; The "::" represents at least 2 16-bit groups of + // ; zeros. No more than 6 groups in addition to the + // ; "::" may be present. + // + // IPv6v4-full = IPv6-hex 5(":" IPv6-hex) ":" IPv4-address-literal + // + // IPv6v4-comp = [IPv6-hex *3(":" IPv6-hex)] "::" + // [IPv6-hex *3(":" IPv6-hex) ":"] + // IPv4-address-literal + // ; The "::" represents at least 2 16-bit groups of + // ; zeros. No more than 4 groups in addition to the + // ; "::" and IPv4-address-literal may be present. + // + // is_email() author's note: We can't use ip2long() to validate + // IPv4 addresses because it accepts abbreviated addresses + // (xxx.xxx.xxx), expanding the last group to complete the address. + // filter_var() validates IPv6 address inconsistently (up to PHP 5.3.3 + // at least) -- see http://bugs.php.net/bug.php?id=53236 for example + + // TODO: var here? + var maxGroups = 8, matchesIP, index = false; + var addressLiteral = parseData.literal; + + // maybe extract IPv4 part from the end of the address-literal + if (matchesIP = IPv4_REGEX.exec(addressLiteral)) { + if ((index = matchesIP.index) !== 0) { + // convert IPv4 part to IPv6 format for futher testing + addressLiteral = addressLiteral.slice(0, matchesIP.index) + '0:0'; + } + } + + if (index === 0) { + // nothing there except a valid IPv4 address, so... + updateResult(ISEMAIL_RFC5321_ADDRESSLITERAL); + } else if (addressLiteral.slice(0, 5).toLowerCase() !== 'ipv6:') { + updateResult(ISEMAIL_RFC5322_DOMAINLITERAL); + } else { + var match = addressLiteral.substr(5); + matchesIP = match.split(':'); + index = match.indexOf('::'); + + if (!~index) { + // need exactly the right number of groups + if (matchesIP.length !== maxGroups) { + updateResult(ISEMAIL_RFC5322_IPV6_GRPCOUNT); + } + } else if (index !== match.lastIndexOf('::')) { + updateResult(ISEMAIL_RFC5322_IPV6_2X2XCOLON); + } else { + if (index === 0 || index === match.length - 2) { + // RFC 4291 allows :: at the start or end of an address with + // 7 other groups in addition + maxGroups++; + } + + if (matchesIP.length > maxGroups) { + updateResult(ISEMAIL_RFC5322_IPV6_MAXGRPS); + } else if (matchesIP.length === maxGroups) { + // eliding a single "::" + updateResult(ISEMAIL_RFC5321_IPV6DEPRECATED); + } + } + + // IPv6 testing strategy + if (match[0] === ':' && match[1] !== ':') { + updateResult(ISEMAIL_RFC5322_IPV6_COLONSTRT); + } else if (match[match.length - 1] === ':' && + match[match.length - 2] !== ':') { + updateResult(ISEMAIL_RFC5322_IPV6_COLONEND); + } else if (matchesIP.every(IPv6_REGEX_TEST)) { + updateResult(ISEMAIL_RFC5321_ADDRESSLITERAL); + } else { + updateResult(ISEMAIL_RFC5322_IPV6_BADCHAR); + } + } + } else { + updateResult(ISEMAIL_RFC5322_DOMAINLITERAL); + } + + parseData.domain += token; + atomList.domain[elementCount] += token; + elementLength++; + context.prev = context.now; + context.now = context.stack.pop(); + break; + case '\\': + updateResult(ISEMAIL_RFC5322_DOMLIT_OBSDTEXT); + context.stack.push(context.now); + context.now = CONTEXT_QUOTEDPAIR; + break; + // folding white space + case '\r': + if ((++i === email.length) || email[i] !== '\n') { + // fatal error + updateResult(ISEMAIL_ERR_CR_NO_LF); + break; + } + case ' ': + case '\t': + updateResult(ISEMAIL_CFWS_FWS); + + context.stack.push(context.now); + context.now = CONTEXT_FWS; + prevToken = token; + break; + // dtext + default: + // http://tools.ietf.org/html/rfc5322#section-3.4.1 + // dtext = %d33-90 / ; Printable US-ASCII + // %d94-126 / ; characters not including + // obs-dtext ; "[", "]", or "\" + // + // obs-dtext = obs-NO-WS-CTL / quoted-pair + // + // obs-NO-WS-CTL = %d1-8 / ; US-ASCII control + // %d11 / ; characters that do not + // %d12 / ; include the carriage + // %d14-31 / ; return, line feed, and + // %d127 ; white space characters + charCode = token.charCodeAt(0); + + // CR, LF, SP & HTAB have already been parsed above + if (charCode > 127 || charCode === 0 || token === '[') { + // fatal error + updateResult(ISEMAIL_ERR_EXPECTING_DTEXT); + break; + } else if (charCode < 33 || charCode === 127) { + updateResult(ISEMAIL_RFC5322_DOMLIT_OBSDTEXT); + } + + parseData.literal += token; + parseData.domain += token; + atomList.domain[elementCount] += token; + elementLength++; + } + break; + // quoted string + case CONTEXT_QUOTEDSTRING: + // http://tools.ietf.org/html/rfc5322#section-3.2.4 + // quoted-string = [CFWS] + // DQUOTE *([FWS] qcontent) [FWS] DQUOTE + // [CFWS] + // + // qcontent = qtext / quoted-pair + switch (token) { + // quoted pair + case '\\': + context.stack.push(context.now); + context.now = CONTEXT_QUOTEDPAIR; + break; + // folding white space + // inside a quoted string, spaces are allowed as regular characters + // it's only FWS if we include HTAB or CRLF + case '\r': + if ((++i === email.length) || email[i] !== '\n') { + // fatal error + updateResult(ISEMAIL_ERR_CR_NO_LF); + break; + } + case '\t': + // http://tools.ietf.org/html/rfc5322#section-3.2.2 + // Runs of FWS, comment, or CFWS that occur between lexical tokens in + // a structured header field are semantically interpreted as a single + // space character. + + // http://tools.ietf.org/html/rfc5322#section-3.2.4 + // the CRLF in any FWS/CFWS that appears within the quoted-string [is] + // semantically "invisible" and therefore not part of the + // quoted-string + + parseData.local += ' '; + atomList.local[elementCount] += ' '; + elementLength++; + + updateResult(ISEMAIL_CFWS_FWS); + context.stack.push(context.now); + context.now = CONTEXT_FWS; + prevToken = token; + break; + // end of quoted string + case '"': + parseData.local += token; + atomList.local[elementCount] += token; + elementLength++; + context.prev = context.now; + context.now = context.stack.pop(); + break; + // qtext + default: + // http://tools.ietf.org/html/rfc5322#section-3.2.4 + // qtext = %d33 / ; Printable US-ASCII + // %d35-91 / ; characters not including + // %d93-126 / ; "\" or the quote character + // obs-qtext + // + // obs-qtext = obs-NO-WS-CTL + // + // obs-NO-WS-CTL = %d1-8 / ; US-ASCII control + // %d11 / ; characters that do not + // %d12 / ; include the carriage + // %d14-31 / ; return, line feed, and + // %d127 ; white space characters + charCode = token.charCodeAt(0); + + if (charCode > 127 || charCode === 0 || charCode === 10) { + updateResult(ISEMAIL_ERR_EXPECTING_QTEXT); + } else if (charCode < 32 || charCode === 127) { + updateResult(ISEMAIL_DEPREC_QTEXT); + } + + parseData.local += token; + atomList.local[elementCount] += token; + elementLength++; + } + + // http://tools.ietf.org/html/rfc5322#section-3.4.1 + // If the string can be represented as a dot-atom (that is, it contains + // no characters other than atext characters or "." surrounded by atext + // characters), then the dot-atom form SHOULD be used and the quoted- + // string form SHOULD NOT be used. + + break; + // quoted pair + case CONTEXT_QUOTEDPAIR: + // http://tools.ietf.org/html/rfc5322#section-3.2.1 + // quoted-pair = ("\" (VCHAR / WSP)) / obs-qp + // + // VCHAR = %d33-126 ; visible (printing) characters + // WSP = SP / HTAB ; white space + // + // obs-qp = "\" (%d0 / obs-NO-WS-CTL / LF / CR) + // + // obs-NO-WS-CTL = %d1-8 / ; US-ASCII control + // %d11 / ; characters that do not + // %d12 / ; include the carriage + // %d14-31 / ; return, line feed, and + // %d127 ; white space characters + // + // i.e. obs-qp = "\" (%d0-8, %d10-31 / %d127) + charCode = token.charCodeAt(0); + + if (charCode > 127) { + // fatal error + updateResult(ISEMAIL_ERR_EXPECTING_QPAIR); + } else if ((charCode < 31 && charCode !== 9) || charCode === 127) { + // SP & HTAB are allowed + updateResult(ISEMAIL_DEPREC_QP); + } + + // At this point we know where this qpair occurred so + // we could check to see if the character actually + // needed to be quoted at all. + // http://tools.ietf.org/html/rfc5321#section-4.1.2 + // the sending system SHOULD transmit the + // form that uses the minimum quoting possible. + + // TODO: check whether the character needs to be quoted (escaped) + // in this context + + context.prev = context.now; + context.now = context.stack.pop(); // end of qpair + token = '\\' + token; + + switch (context.now) { + case CONTEXT_COMMENT: break; + case CONTEXT_QUOTEDSTRING: + parseData.local += token; + atomList.local[elementCount] += token; + + // the maximum sizes specified by RFC 5321 are octet counts, + // so we must include the backslash + elementLength += 2; + break; + case COMPONENT_LITERAL: + parseData.domain += token; + atomList.domain[elementCount] += token; + + // the maximum sizes specified by RFC 5321 are octet counts, + // so we must include the backslash + elementLength += 2; + break; + /* istanbul ignore next: logically unreachable */ + default: + throw new Error('quoted pair logic invoked in an invalid context: ' + + context.now); + } + break; + // comment + case CONTEXT_COMMENT: + // http://tools.ietf.org/html/rfc5322#section-3.2.2 + // comment = "(" *([FWS] ccontent) [FWS] ")" + // + // ccontent = ctext / quoted-pair / comment + switch (token) { + // nested comment + case '(': + // nested comments are ok + context.stack.push(context.now); + context.now = CONTEXT_COMMENT; + break; + // end of comment + case ')': + context.prev = context.now; + context.now = context.stack.pop(); + + break; + // quoted pair + case '\\': + context.stack.push(context.now); + context.now = CONTEXT_QUOTEDPAIR; + break; + // folding white space + case '\r': + if ((++i === email.length) || email[i] !== '\n') { + // fatal error + updateResult(ISEMAIL_ERR_CR_NO_LF); + break; + } + case ' ': + case '\t': + updateResult(ISEMAIL_CFWS_FWS); + + context.stack.push(context.now); + context.now = CONTEXT_FWS; + prevToken = token; + break; + // ctext + default: + // http://tools.ietf.org/html/rfc5322#section-3.2.3 + // ctext = %d33-39 / ; Printable US-ASCII + // %d42-91 / ; characters not including + // %d93-126 / ; "(", ")", or "\" + // obs-ctext + // + // obs-ctext = obs-NO-WS-CTL + // + // obs-NO-WS-CTL = %d1-8 / ; US-ASCII control + // %d11 / ; characters that do not + // %d12 / ; include the carriage + // %d14-31 / ; return, line feed, and + // %d127 ; white space characters + charCode = token.charCodeAt(0); + + if (charCode > 127 || charCode === 0 || charCode === 10) { + // fatal error + updateResult(ISEMAIL_ERR_EXPECTING_CTEXT); + break; + } else if (charCode < 32 || charCode === 127) { + updateResult(ISEMAIL_DEPREC_CTEXT); + } + } + break; + // folding white space + case CONTEXT_FWS: + // http://tools.ietf.org/html/rfc5322#section-3.2.2 + // FWS = ([*WSP CRLF] 1*WSP) / obs-FWS + // ; Folding white space + + // But note the erratum: + // http://www.rfc-editor.org/errata_search.php?rfc=5322&eid=1908: + // In the obsolete syntax, any amount of folding white space MAY be + // inserted where the obs-FWS rule is allowed. This creates the + // possibility of having two consecutive "folds" in a line, and + // therefore the possibility that a line which makes up a folded header + // field could be composed entirely of white space. + // + // obs-FWS = 1*([CRLF] WSP) + + if (prevToken === '\r') { + if (token === '\r') { + // fatal error + updateResult(ISEMAIL_ERR_FWS_CRLF_X2); + break; + } + + if (++crlfCount > 1) { + // multiple folds = obsolete FWS + updateResult(ISEMAIL_DEPREC_FWS); + } else { + crlfCount = 1; + } + } + + switch (token) { + case '\r': + if ((++i === email.length) || email[i] !== '\n') { + // fatal error + updateResult(ISEMAIL_ERR_CR_NO_LF); + } + break; + case ' ': + case '\t': + break; + default: + if (prevToken === '\r') { + // fatal error + updateResult(ISEMAIL_ERR_FWS_CRLF_END); + } + + crlfCount = 0; + + context.prev = context.now; + context.now = context.stack.pop(); // end of FWS + + i--; // look at this token again in the parent context + } + prevToken = token; + break; + // unexpected context + /* istanbul ignore next: logically unreachable */ + default: + throw new Error('unknown context: ' + context.now); + } // primary state machine + + if (maxResult > ISEMAIL_RFC5322) { + // fatal error, no point continuing + break; + } + } // token loop + + // check for errors + if (maxResult < ISEMAIL_RFC5322) { + // fatal errors + if (context.now === CONTEXT_QUOTEDSTRING) { + updateResult(ISEMAIL_ERR_UNCLOSEDQUOTEDSTR); + } else if (context.now === CONTEXT_QUOTEDPAIR) { + updateResult(ISEMAIL_ERR_BACKSLASHEND); + } else if (context.now === CONTEXT_COMMENT) { + updateResult(ISEMAIL_ERR_UNCLOSEDCOMMENT); + } else if (context.now === COMPONENT_LITERAL) { + updateResult(ISEMAIL_ERR_UNCLOSEDDOMLIT); + } else if (token === '\r') { + updateResult(ISEMAIL_ERR_FWS_CRLF_END); + } else if (parseData.domain.length === 0) { + updateResult(ISEMAIL_ERR_NODOMAIN); + } else if (elementLength === 0) { + updateResult(ISEMAIL_ERR_DOT_END); + } else if (hyphenFlag) { + updateResult(ISEMAIL_ERR_DOMAINHYPHENEND); + + // other errors + } else if (parseData.domain.length > 255) { + // http://tools.ietf.org/html/rfc5321#section-4.5.3.1.2 + // The maximum total length of a domain name or number is 255 octets. + updateResult(ISEMAIL_RFC5322_DOMAIN_TOOLONG); + } else if (parseData.local.length + parseData.domain.length + /* '@' */ 1 > + 254) { + // http://tools.ietf.org/html/rfc5321#section-4.1.2 + // Forward-path = Path + // + // Path = "<" [ A-d-l ":" ] Mailbox ">" + // + // http://tools.ietf.org/html/rfc5321#section-4.5.3.1.3 + // The maximum total length of a reverse-path or forward-path is 256 + // octets (including the punctuation and element separators). + // + // Thus, even without (obsolete) routing information, the Mailbox can + // only be 254 characters long. This is confirmed by this verified + // erratum to RFC 3696: + // + // http://www.rfc-editor.org/errata_search.php?rfc=3696&eid=1690 + // However, there is a restriction in RFC 2821 on the length of an + // address in MAIL and RCPT commands of 254 characters. Since addresses + // that do not fit in those fields are not normally useful, the upper + // limit on address lengths should normally be considered to be 254. + updateResult(ISEMAIL_RFC5322_TOOLONG); + } else if (elementLength > 63) { + // http://tools.ietf.org/html/rfc1035#section-2.3.4 + // labels 63 octets or less + updateResult(ISEMAIL_RFC5322_LABEL_TOOLONG); + } else if (options.minDomainAtoms && atomList.domain.length < + options.minDomainAtoms) { + updateResult(ISEMAIL_ERR_TOOSHORT_DOMAIN); + } else if (options.tldWhitelist) { + var tldAtom = atomList.domain[elementCount], tldValid = false, n; + if (Array.isArray(options.tldWhitelist)) { + for (i = 0, n = options.tldWhitelist.length; i < n; i++) { + if (tldAtom === options.tldWhitelist[i]) { + tldValid = true; + break; + } + } + } else { + tldValid = hasOwn.call(options.tldWhitelist, tldAtom); + } + if (!tldValid) { + updateResult(ISEMAIL_ERR_UNKNOWN_TLD); + } + } + } // check for errors + + var dnsPositive = false; + + if (options.checkDNS && maxResult < ISEMAIL_DNSWARN && HAS_REQUIRE) { + dns || (dns = require('dns')); + // http://tools.ietf.org/html/rfc5321#section-2.3.5 + // Names that can + // be resolved to MX RRs or address (i.e., A or AAAA) RRs (as discussed + // in Section 5) are permitted, as are CNAME RRs whose targets can be + // resolved, in turn, to MX or address RRs. + // + // http://tools.ietf.org/html/rfc5321#section-5.1 + // The lookup first attempts to locate an MX record associated with the + // name. If a CNAME record is found, the resulting name is processed as + // if it were the initial name. ... If an empty list of MXs is returned, + // the address is treated as if it was associated with an implicit MX + // RR, with a preference of 0, pointing to that host. + // + // isEmail() author's note: We will regard the existence of a CNAME to be + // sufficient evidence of the domain's existence. For performance reasons + // we will not repeat the DNS lookup for the CNAME's target, but we will + // raise a warning because we didn't immediately find an MX record. + if (elementCount === 0) { + // checking TLD DNS only works if you explicitly check from the root + parseData.domain += '.'; + } + + var dnsDomain = parseData.domain; + dns.resolveMx(dnsDomain, function(err, records) { + if ((err && err.code !== dns.NODATA) || (!err && !records)) { + updateResult(ISEMAIL_DNSWARN_NO_RECORD); + return finish(); + } + if (records && records.length) { + dnsPositive = true; + return finish(); + } + var done = false, count = 3; + updateResult(ISEMAIL_DNSWARN_NO_MX_RECORD); + dns.resolveCname(dnsDomain, handleRecords); + dns.resolve4(dnsDomain, handleRecords); + dns.resolve6(dnsDomain, handleRecords); + function handleRecords(err, records) { + if (done) return; + count--; + if (!err && records && records.length) { + done = true; + return finish(); + } + if (count === 0) { + // no usable records for the domain can be found + updateResult(ISEMAIL_DNSWARN_NO_RECORD); + done = true; + finish(); + } + } + }); + } else if (options.checkDNS) { + // guarantee asynchronicity + typeof process !== 'undefined' && process && + typeof process.nextTick === 'function' + ? process.nextTick(finish) + : setTimeout(finish, 1); + } else { + return finish(); + } // checkDNS + + function finish() { + if (!dnsPositive && maxResult < ISEMAIL_DNSWARN) { + if (elementCount === 0) { + updateResult(ISEMAIL_RFC5321_TLD); + } else { + var charCode = atomList.domain[elementCount].charCodeAt(0); + if (charCode >= 48 && charCode <= 57) { + updateResult(ISEMAIL_RFC5321_TLDNUMERIC); + } + } + } + + if (maxResult < threshold) { + maxResult = ISEMAIL_VALID; + } + + if (!diagnose) { + maxResult = maxResult < THRESHOLD; + } + + if (typeof callback === 'function') { + callback(maxResult); + } + + return maxResult; + } // finish +} // isEmail + +module.exports = isEmail; diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/package.json b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/package.json new file mode 100644 index 0000000..ba3eac0 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/package.json @@ -0,0 +1,52 @@ +{ + "name": "isemail", + "version": "1.1.1", + "author": { + "name": "Eli Skeggs", + "email": "skeggse@gmail.com" + }, + "description": "validate an email address according to RFCs 5321, 5322, and others", + "main": "./index", + "scripts": { + "test": "./node_modules/.bin/mocha" + }, + "repository": { + "type": "git", + "url": "https://github.com/globesherpa/node-isemail.git" + }, + "homepage": "https://github.com/globesherpa/node-isemail", + "bugs": { + "url": "https://github.com/globesherpa/node-isemail/issues" + }, + "keywords": [ + "isemail", + "validation", + "check", + "checking", + "verification", + "email", + "address", + "email address" + ], + "devDependencies": { + "mocha": "~1.13.0", + "chai": "~1.9.1" + }, + "licenses": [ + { + "type": "BSD", + "url": "http://www.opensource.org/licenses/bsd-license.php" + } + ], + "engines": { + "node": "*" + }, + "readme": "isemail\n=======\n\n[![Build Status](https://travis-ci.org/globesherpa/node-isemail.png)](https://travis-ci.org/globesherpa/node-isemail)\n[![Coverage Status](https://coveralls.io/repos/globesherpa/node-isemail/badge.png?branch=master)](https://coveralls.io/r/globesherpa/node-isemail?branch=master)\n\nThis first version of `isemail` is a port of the PHP `is_email` function by Dominic Sayers.\n\nFuture versions will improve upon the current version, optimizing it for efficient usage and DRYing the code.\n\nInstall\n-------\n\n```sh\n$ npm install isemail\n```\n\nTest\n----\n\nThe tests were pulled from is_email's extensive [test suite][tests] on October 15, 2013. Many thanks to the contributors!\n\nRun any of the following.\n\n```sh\n$ mocha\n$ npm test\n$ make test\n```\n\n_remember to_ `npm install`!\n\nAPI\n---\n\n### isEmail(email, [options], [callback])\n\nDetermines whether the `email` is valid or not, for various definitions thereof. Optionally accepts an `options` object and a `callback` function. Options may include `errorLevel` and `checkDNS`. The `callback` function will always be called if specified, and the result of the operation supplied as the only parameter to the callback function. If `isEmail` is not asked to check for the existence of the domain (`checkDNS`), it will also synchronously return the result of the operation.\n\nUse `errorLevel` to specify the type of result for `isEmail`. Passing a `false` literal will result in a true or false boolean indicating whether the email address is sufficiently defined for use in sending an email. Passing a `true` literal will result in a more granular numeric status, with zero being a perfectly valid email address. Passing a number will return `0` if the numeric status is below the `errorLevel` and the numeric status otherwise.\n\nThe `tldWhitelist` option can be either an object lookup table or an array of valid top-level domains. If the email address has a top-level domain that is not in the whitelist, the email will be marked as invalid.\n\nThe `minDomainAtoms` option is an optional positive integer that specifies the minimum number of domain atoms that must be included for the email address to be considered valid. Be careful with the option, as some top-level domains, like `io`, directly support email addresses.\n\n#### Examples\n\n```js\n$ node\n> var isEmail = require('isemail');\nundefined\n> var log = console.log.bind(console, 'result');\nundefined\n> isEmail('test@iana.org');\ntrue\n> isEmail('test@iana.org', log);\nresult true\ntrue\n> isEmail('test@iana.org', {checkDNS: true});\nundefined\n> isEmail('test@iana.org', {checkDNS: true}, log);\nundefined\nresult true\n> isEmail('test@iana.org', {errorLevel: true});\n0\n> isEmail('test@iana.org', {errorLevel: true}, log);\nresult 0\n0\n> isEmail('test@e.com');\ntrue\n> isEmail('test@e.com', {checkDNS: true, errorLevel: true}, log);\nundefined\nresult 6\n> isEmail('test@e.com', {checkDNS: true, errorLevel: 7}, log);\nundefined\nresult 0\n> isEmail('test@e.com', {checkDNS: true, errorLevel: 6}, log);\nundefined\nresult 6\n```\n\nTODO\n====\n\nAdd tests for library usage, not just functionality comparisons.\n\nLicense\n=======\n\n[BSD License](http://www.opensource.org/licenses/bsd-license.php)\n\n[tests]: http://isemail.info/_system/is_email/test/?all‎ \"is_email test suite\"\n", + "readmeFilename": "README.md", + "_id": "isemail@1.1.1", + "dist": { + "shasum": "1dc5963b585bcbfc8e794ab5f3dd1c4c7ab93cb8" + }, + "_from": "isemail@1.x.x", + "_resolved": "https://registry.npmjs.org/isemail/-/isemail-1.1.1.tgz" +} diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/test/isemail.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/test/isemail.js new file mode 100644 index 0000000..3bdfe7a --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/test/isemail.js @@ -0,0 +1,279 @@ +var expect = require('chai').expect; + +// diagnoses +var diagnoses = { + ISEMAIL_VALID: 0, + ISEMAIL_DNSWARN_NO_MX_RECORD: 5, + ISEMAIL_DNSWARN_NO_RECORD: 6, + ISEMAIL_RFC5321_TLD: 9, + ISEMAIL_RFC5321_TLDNUMERIC: 10, + ISEMAIL_RFC5321_QUOTEDSTRING: 11, + ISEMAIL_RFC5321_ADDRESSLITERAL: 12, + ISEMAIL_RFC5321_IPV6DEPRECATED: 13, + ISEMAIL_CFWS_COMMENT: 17, + ISEMAIL_CFWS_FWS: 18, + ISEMAIL_DEPREC_LOCALPART: 33, + ISEMAIL_DEPREC_FWS: 34, + ISEMAIL_DEPREC_QTEXT: 35, + ISEMAIL_DEPREC_QP: 36, + ISEMAIL_DEPREC_COMMENT: 37, + ISEMAIL_DEPREC_CTEXT: 38, + ISEMAIL_DEPREC_CFWS_NEAR_AT: 49, + ISEMAIL_RFC5322_DOMAIN: 65, + ISEMAIL_RFC5322_TOOLONG: 66, + ISEMAIL_RFC5322_LOCAL_TOOLONG: 67, + ISEMAIL_RFC5322_DOMAIN_TOOLONG: 68, + ISEMAIL_RFC5322_LABEL_TOOLONG: 69, + ISEMAIL_RFC5322_DOMAINLITERAL: 70, + ISEMAIL_RFC5322_DOMLIT_OBSDTEXT: 71, + ISEMAIL_RFC5322_IPV6_GRPCOUNT: 72, + ISEMAIL_RFC5322_IPV6_2X2XCOLON: 73, + ISEMAIL_RFC5322_IPV6_BADCHAR: 74, + ISEMAIL_RFC5322_IPV6_MAXGRPS: 75, + ISEMAIL_RFC5322_IPV6_COLONSTRT: 76, + ISEMAIL_RFC5322_IPV6_COLONEND: 77, + ISEMAIL_ERR_EXPECTING_DTEXT: 129, + ISEMAIL_ERR_NOLOCALPART: 130, + ISEMAIL_ERR_NODOMAIN: 131, + ISEMAIL_ERR_CONSECUTIVEDOTS: 132, + ISEMAIL_ERR_ATEXT_AFTER_CFWS: 133, + ISEMAIL_ERR_ATEXT_AFTER_QS: 134, + ISEMAIL_ERR_ATEXT_AFTER_DOMLIT: 135, + ISEMAIL_ERR_EXPECTING_QPAIR: 136, + ISEMAIL_ERR_EXPECTING_ATEXT: 137, + ISEMAIL_ERR_EXPECTING_QTEXT: 138, + ISEMAIL_ERR_EXPECTING_CTEXT: 139, + ISEMAIL_ERR_BACKSLASHEND: 140, + ISEMAIL_ERR_DOT_START: 141, + ISEMAIL_ERR_DOT_END: 142, + ISEMAIL_ERR_DOMAINHYPHENSTART: 143, + ISEMAIL_ERR_DOMAINHYPHENEND: 144, + ISEMAIL_ERR_UNCLOSEDQUOTEDSTR: 145, + ISEMAIL_ERR_UNCLOSEDCOMMENT: 146, + ISEMAIL_ERR_UNCLOSEDDOMLIT: 147, + ISEMAIL_ERR_FWS_CRLF_X2: 148, + ISEMAIL_ERR_FWS_CRLF_END: 149, + ISEMAIL_ERR_CR_NO_LF: 150, + ISEMAIL_ERR_UNKNOWN_TLD: 160, + ISEMAIL_ERR_TOOSHORT_TLD: 161 +}; + +// expectations +var expectations = [ + ['', diagnoses.ISEMAIL_ERR_NODOMAIN], + ['test', diagnoses.ISEMAIL_ERR_NODOMAIN], + ['@', diagnoses.ISEMAIL_ERR_NOLOCALPART], + ['test@', diagnoses.ISEMAIL_ERR_NODOMAIN], + ['test@io', diagnoses.ISEMAIL_VALID], + ['@io', diagnoses.ISEMAIL_ERR_NOLOCALPART], + ['@iana.org', diagnoses.ISEMAIL_ERR_NOLOCALPART], + ['test@iana.org', diagnoses.ISEMAIL_VALID], + ['test@nominet.org.uk', diagnoses.ISEMAIL_VALID], + ['test@about.museum', diagnoses.ISEMAIL_VALID], + ['a@iana.org', diagnoses.ISEMAIL_VALID], + ['test@e.com', diagnoses.ISEMAIL_DNSWARN_NO_RECORD], + ['test@iana.a', diagnoses.ISEMAIL_DNSWARN_NO_RECORD], + ['test.test@iana.org', diagnoses.ISEMAIL_VALID], + ['.test@iana.org', diagnoses.ISEMAIL_ERR_DOT_START], + ['test.@iana.org', diagnoses.ISEMAIL_ERR_DOT_END], + ['test..iana.org', diagnoses.ISEMAIL_ERR_CONSECUTIVEDOTS], + ['test_exa-mple.com', diagnoses.ISEMAIL_ERR_NODOMAIN], + ['!#$%&`*+/=?^`{|}~@iana.org', diagnoses.ISEMAIL_VALID], + ['test\\@test@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['123@iana.org', diagnoses.ISEMAIL_VALID], + ['test@123.com', diagnoses.ISEMAIL_VALID], + ['test@iana.123', diagnoses.ISEMAIL_RFC5321_TLDNUMERIC], + ['test@255.255.255.255', diagnoses.ISEMAIL_RFC5321_TLDNUMERIC], + ['abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@iana.org', diagnoses.ISEMAIL_VALID], + ['abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklmn@iana.org', diagnoses.ISEMAIL_RFC5322_LOCAL_TOOLONG], + ['test@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm', diagnoses.ISEMAIL_RFC5322_LABEL_TOOLONG], + ['test@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.com', diagnoses.ISEMAIL_DNSWARN_NO_RECORD], + ['test@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm.com', diagnoses.ISEMAIL_RFC5322_LABEL_TOOLONG], + ['test@mason-dixon.com', diagnoses.ISEMAIL_VALID], + ['test@-iana.org', diagnoses.ISEMAIL_ERR_DOMAINHYPHENSTART], + ['test@iana-.com', diagnoses.ISEMAIL_ERR_DOMAINHYPHENEND], + ['test@aaad.com', diagnoses.ISEMAIL_DNSWARN_NO_MX_RECORD], + ['test@iana.co-uk', diagnoses.ISEMAIL_DNSWARN_NO_RECORD], + ['test@.iana.org', diagnoses.ISEMAIL_ERR_DOT_START], + ['test@iana.org.', diagnoses.ISEMAIL_ERR_DOT_END], + ['test@iana..com', diagnoses.ISEMAIL_ERR_CONSECUTIVEDOTS], + ['a@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.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.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.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.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v', diagnoses.ISEMAIL_DNSWARN_NO_RECORD], + ['abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghi', diagnoses.ISEMAIL_DNSWARN_NO_RECORD], + ['abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghij', diagnoses.ISEMAIL_RFC5322_TOOLONG], + ['a@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.hij', diagnoses.ISEMAIL_RFC5322_TOOLONG], + ['a@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.hijk', diagnoses.ISEMAIL_RFC5322_DOMAIN_TOOLONG], + ['"test"@iana.org', diagnoses.ISEMAIL_RFC5321_QUOTEDSTRING], + ['""@iana.org', diagnoses.ISEMAIL_RFC5321_QUOTEDSTRING], + ['"""@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['"\\a"@iana.org', diagnoses.ISEMAIL_RFC5321_QUOTEDSTRING], + ['"\\""@iana.org', diagnoses.ISEMAIL_RFC5321_QUOTEDSTRING], + ['"\\"@iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDQUOTEDSTR], + ['"\\\\"@iana.org', diagnoses.ISEMAIL_RFC5321_QUOTEDSTRING], + ['test"@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['"test@iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDQUOTEDSTR], + ['"test"test@iana.org', diagnoses.ISEMAIL_ERR_ATEXT_AFTER_QS], + ['test"text"@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['"test""test"@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['"test"."test"@iana.org', diagnoses.ISEMAIL_DEPREC_LOCALPART], + ['"test\\ test"@iana.org', diagnoses.ISEMAIL_RFC5321_QUOTEDSTRING], + ['"test".test@iana.org', diagnoses.ISEMAIL_DEPREC_LOCALPART], + ['"test\0"@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_QTEXT], + ['"test\\\0"@iana.org', diagnoses.ISEMAIL_DEPREC_QP], + ['"test\r\n test"@iana.org', diagnoses.ISEMAIL_CFWS_FWS], + ['"abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz abcdefghj"@iana.org', diagnoses.ISEMAIL_RFC5322_LOCAL_TOOLONG], + ['"abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz abcdefg\\h"@iana.org', diagnoses.ISEMAIL_RFC5322_LOCAL_TOOLONG], + ['test@[255.255.255.255]', diagnoses.ISEMAIL_RFC5321_ADDRESSLITERAL], + ['test@a[255.255.255.255]', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['test@[255.255.255]', diagnoses.ISEMAIL_RFC5322_DOMAINLITERAL], + ['test@[255.255.255.255.255]', diagnoses.ISEMAIL_RFC5322_DOMAINLITERAL], + ['test@[255.255.255.256]', diagnoses.ISEMAIL_RFC5322_DOMAINLITERAL], + ['test@[1111:2222:3333:4444:5555:6666:7777:8888]', diagnoses.ISEMAIL_RFC5322_DOMAINLITERAL], + ['test@[IPv6:1111:2222:3333:4444:5555:6666:7777]', diagnoses.ISEMAIL_RFC5322_IPV6_GRPCOUNT], + ['test@[IPv6:1111:2222:3333:4444:5555:6666:7777:8888]', diagnoses.ISEMAIL_RFC5321_ADDRESSLITERAL], + ['test@[IPv6:1111:2222:3333:4444:5555:6666:7777:8888:9999]', diagnoses.ISEMAIL_RFC5322_IPV6_GRPCOUNT], + ['test@[IPv6:1111:2222:3333:4444:5555:6666:7777:888G]', diagnoses.ISEMAIL_RFC5322_IPV6_BADCHAR], + ['test@[IPv6:1111:2222:3333:4444:5555:6666::8888]', diagnoses.ISEMAIL_RFC5321_IPV6DEPRECATED], + ['test@[IPv6:1111:2222:3333:4444:5555::8888]', diagnoses.ISEMAIL_RFC5321_ADDRESSLITERAL], + ['test@[IPv6:1111:2222:3333:4444:5555:6666::7777:8888]', diagnoses.ISEMAIL_RFC5322_IPV6_MAXGRPS], + ['test@[IPv6::3333:4444:5555:6666:7777:8888]', diagnoses.ISEMAIL_RFC5322_IPV6_COLONSTRT], + ['test@[IPv6:::3333:4444:5555:6666:7777:8888]', diagnoses.ISEMAIL_RFC5321_ADDRESSLITERAL], + ['test@[IPv6:1111::4444:5555::8888]', diagnoses.ISEMAIL_RFC5322_IPV6_2X2XCOLON], + ['test@[IPv6:::]', diagnoses.ISEMAIL_RFC5321_ADDRESSLITERAL], + ['test@[IPv6:1111:2222:3333:4444:5555:255.255.255.255]', diagnoses.ISEMAIL_RFC5322_IPV6_GRPCOUNT], + ['test@[IPv6:1111:2222:3333:4444:5555:6666:255.255.255.255]', diagnoses.ISEMAIL_RFC5321_ADDRESSLITERAL], + ['test@[IPv6:1111:2222:3333:4444:5555:6666:7777:255.255.255.255]', diagnoses.ISEMAIL_RFC5322_IPV6_GRPCOUNT], + ['test@[IPv6:1111:2222:3333:4444::255.255.255.255]', diagnoses.ISEMAIL_RFC5321_ADDRESSLITERAL], + ['test@[IPv6:1111:2222:3333:4444:5555:6666::255.255.255.255]', diagnoses.ISEMAIL_RFC5322_IPV6_MAXGRPS], + ['test@[IPv6:1111:2222:3333:4444:::255.255.255.255]', diagnoses.ISEMAIL_RFC5322_IPV6_2X2XCOLON], + ['test@[IPv6::255.255.255.255]', diagnoses.ISEMAIL_RFC5322_IPV6_COLONSTRT], + [' test @iana.org', diagnoses.ISEMAIL_DEPREC_CFWS_NEAR_AT], + ['test@ iana .com', diagnoses.ISEMAIL_DEPREC_CFWS_NEAR_AT], + ['test . test@iana.org', diagnoses.ISEMAIL_DEPREC_FWS], + ['\r\n test@iana.org', diagnoses.ISEMAIL_CFWS_FWS], + ['\r\n \r\n test@iana.org', diagnoses.ISEMAIL_DEPREC_FWS], + ['(comment)test@iana.org', diagnoses.ISEMAIL_CFWS_COMMENT], + ['((comment)test@iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDCOMMENT], + ['(comment(comment))test@iana.org', diagnoses.ISEMAIL_CFWS_COMMENT], + ['test@(comment)iana.org', diagnoses.ISEMAIL_DEPREC_CFWS_NEAR_AT], + ['test(comment)test@iana.org', diagnoses.ISEMAIL_ERR_ATEXT_AFTER_CFWS], + ['test@(comment)[255.255.255.255]', diagnoses.ISEMAIL_DEPREC_CFWS_NEAR_AT], + ['(comment)abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@iana.org', diagnoses.ISEMAIL_CFWS_COMMENT], + ['test@(comment)abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.com', diagnoses.ISEMAIL_DEPREC_CFWS_NEAR_AT], + ['(comment)test@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghik.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghik.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijk.abcdefghijklmnopqrstuvwxyzabcdefghijk.abcdefghijklmnopqrstu', diagnoses.ISEMAIL_CFWS_COMMENT], + ['test@iana.org\n', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['test@xn--hxajbheg2az3al.xn--jxalpdlp', diagnoses.ISEMAIL_DNSWARN_NO_RECORD], + ['xn--test@iana.org', diagnoses.ISEMAIL_VALID], + ['test@iana.org-', diagnoses.ISEMAIL_ERR_DOMAINHYPHENEND], + ['"test@iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDQUOTEDSTR], + ['(test@iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDCOMMENT], + ['test@(iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDCOMMENT], + ['test@[1.2.3.4', diagnoses.ISEMAIL_ERR_UNCLOSEDDOMLIT], + ['"test\\"@iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDQUOTEDSTR], + ['(comment\\)test@iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDCOMMENT], + ['test@iana.org(comment\\)', diagnoses.ISEMAIL_ERR_UNCLOSEDCOMMENT], + ['test@iana.org(comment\\', diagnoses.ISEMAIL_ERR_BACKSLASHEND], + ['test@[RFC-5322-domain-literal]', diagnoses.ISEMAIL_RFC5322_DOMAINLITERAL], + ['test@[RFC-5322]-domain-literal]', diagnoses.ISEMAIL_ERR_ATEXT_AFTER_DOMLIT], + ['test@[RFC-5322-[domain-literal]', diagnoses.ISEMAIL_ERR_EXPECTING_DTEXT], + ['test@[RFC-5322-\\\x07-domain-literal]', diagnoses.ISEMAIL_RFC5322_DOMLIT_OBSDTEXT], + ['test@[RFC-5322-\\\t-domain-literal]', diagnoses.ISEMAIL_RFC5322_DOMLIT_OBSDTEXT], + ['test@[RFC-5322-\\]-domain-literal]', diagnoses.ISEMAIL_RFC5322_DOMLIT_OBSDTEXT], + ['test@[RFC-5322-\x7f-domain-literal]', diagnoses.ISEMAIL_RFC5322_DOMLIT_OBSDTEXT], + ['test@[RFC-5322-domain-literal\\]', diagnoses.ISEMAIL_ERR_UNCLOSEDDOMLIT], + ['test@[RFC-5322-domain-literal\\', diagnoses.ISEMAIL_ERR_BACKSLASHEND], + ['test@[RFC 5322 domain literal]', diagnoses.ISEMAIL_RFC5322_DOMAINLITERAL], + ['test@[RFC-5322-domain-literal] (comment)', diagnoses.ISEMAIL_RFC5322_DOMAINLITERAL], + ['\x7f@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['test@\x7f.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['"\x7f"@iana.org', diagnoses.ISEMAIL_DEPREC_QTEXT], + ['"\\\x7f"@iana.org', diagnoses.ISEMAIL_DEPREC_QP], + ['(\x7f)test@iana.org', diagnoses.ISEMAIL_DEPREC_CTEXT], + ['test@iana.org\r', diagnoses.ISEMAIL_ERR_CR_NO_LF], + ['\rtest@iana.org', diagnoses.ISEMAIL_ERR_CR_NO_LF], + ['"\rtest"@iana.org', diagnoses.ISEMAIL_ERR_CR_NO_LF], + ['(\r)test@iana.org', diagnoses.ISEMAIL_ERR_CR_NO_LF], + ['test@iana.org(\r)', diagnoses.ISEMAIL_ERR_CR_NO_LF], + ['\ntest@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['"\n"@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_QTEXT], + ['"\\\n"@iana.org', diagnoses.ISEMAIL_DEPREC_QP], + ['(\n)test@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_CTEXT], + ['\x07@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['test@\x07.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['"\x07"@iana.org', diagnoses.ISEMAIL_DEPREC_QTEXT], + ['"\\\x07"@iana.org', diagnoses.ISEMAIL_DEPREC_QP], + ['(\x07)test@iana.org', diagnoses.ISEMAIL_DEPREC_CTEXT], + ['\r\ntest@iana.org', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], + ['\r\n \r\ntest@iana.org', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], + [' \r\ntest@iana.org', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], + [' \r\n test@iana.org', diagnoses.ISEMAIL_CFWS_FWS], + [' \r\n \r\ntest@iana.org', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], + [' \r\n\r\ntest@iana.org', diagnoses.ISEMAIL_ERR_FWS_CRLF_X2], + [' \r\n\r\n test@iana.org', diagnoses.ISEMAIL_ERR_FWS_CRLF_X2], + ['test@iana.org\r\n ', diagnoses.ISEMAIL_CFWS_FWS], + ['test@iana.org\r\n \r\n ', diagnoses.ISEMAIL_DEPREC_FWS], + ['test@iana.org\r\n', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], + ['test@iana.org \r', diagnoses.ISEMAIL_ERR_CR_NO_LF], + ['test@iana.org\r\n \r\n', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], + ['test@iana.org \r\n', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], + ['test@iana.org \r\n ', diagnoses.ISEMAIL_CFWS_FWS], + ['test@iana.org \r\n \r\n', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], + ['test@iana.org \r\n\r\n', diagnoses.ISEMAIL_ERR_FWS_CRLF_X2], + ['test@iana.org \r\n\r\n ', diagnoses.ISEMAIL_ERR_FWS_CRLF_X2], + ['test@iana. org', diagnoses.ISEMAIL_DEPREC_FWS], + ['test@[\r', diagnoses.ISEMAIL_ERR_CR_NO_LF], + ['test@[\r\n', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], + [' test@iana.org', diagnoses.ISEMAIL_CFWS_FWS], + ['test@iana.org ', diagnoses.ISEMAIL_CFWS_FWS], + ['test@[IPv6:1::2:]', diagnoses.ISEMAIL_RFC5322_IPV6_COLONEND], + ['"test\\©"@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_QPAIR], + ['test@iana/icann.org', diagnoses.ISEMAIL_RFC5322_DOMAIN], + ['test.(comment)test@iana.org', diagnoses.ISEMAIL_DEPREC_COMMENT], + ['test@iana.(comment)org', diagnoses.ISEMAIL_DEPREC_COMMENT], + ['test@iana(comment)iana.org', diagnoses.ISEMAIL_ERR_ATEXT_AFTER_CFWS], + ['(comment\r\n comment)test@iana.org', diagnoses.ISEMAIL_CFWS_FWS], + ['test@org', diagnoses.ISEMAIL_RFC5321_TLD], + ['test@example.com', diagnoses.ISEMAIL_DNSWARN_NO_MX_RECORD], + ['test@nic.no', diagnoses.ISEMAIL_DNSWARN_NO_RECORD] +]; + +var tldExpectations = [ + ['shouldbe@invalid', diagnoses.ISEMAIL_ERR_UNKNOWN_TLD], + ['shouldbe@example.com', diagnoses.ISEMAIL_VALID] +]; + +describe('isEmail', function() { + var isEmail = require('..'); + + expectations.forEach(function(obj, i) { + var email = obj[0], result = obj[1]; + it('should handle test ' + (i + 1), function(done) { + isEmail(email, {errorLevel: 0, checkDNS: true}, function(res) { + expect(res).to.equal(result); + done(); + }); + }); + }); + + tldExpectations.forEach(function(obj, i) { + var email = obj[0], result = obj[1]; + it('should handle tld test ' + (i + 1), function() { + var res = isEmail(email, {errorLevel: 0, tldWhitelist: {com: true}}); + expect(res).to.equal(result); + + res = isEmail(email, {errorLevel: 0, tldWhitelist: ['com']}); + expect(res).to.equal(result); + }); + }); + + it('should handle domain atom test 1', function() { + var res = isEmail('shouldbe@invalid', {errorLevel: 0, minDomainAtoms: 2}); + + expect(res).to.equal(diagnoses.ISEMAIL_ERR_TOOSHORT_TLD); + }); + + it('should handle domain atom test 2', function() { + var res = isEmail('valid@example.com', {errorLevel: 0, minDomainAtoms: 2}); + + expect(res).to.equal(diagnoses.ISEMAIL_VALID); + }); +}); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/test/mocha.opts b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/test/mocha.opts new file mode 100644 index 0000000..84dcd68 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/isemail/test/mocha.opts @@ -0,0 +1,2 @@ +--reporter dot +--check-leaks diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/LICENSE b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/LICENSE new file mode 100644 index 0000000..bd17246 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2011-2014 Tim Wood, Iskren Chernev, Moment.js contributors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/README.md b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/README.md new file mode 100644 index 0000000..6c25b5e --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/README.md @@ -0,0 +1,39 @@ +[![NPM version][npm-version-image]][npm-url] [![NPM downloads][npm-downloads-image]][npm-url] [![MIT License][license-image]][license-url] [![Build Status][travis-image]][travis-url] + +A lightweight JavaScript date library for parsing, validating, manipulating, and formatting dates. + +## [Documentation](http://momentjs.com/docs/) + +## Upgrading to 2.0.0 + +There are a number of small backwards incompatible changes with version 2.0.0. [See the full descriptions here](https://gist.github.com/timrwood/e72f2eef320ed9e37c51#backwards-incompatible-changes) + + * Changed language ordinal method to return the number + ordinal instead of just the ordinal. + + * Changed two digit year parsing cutoff to match strptime. + + * Removed `moment#sod` and `moment#eod` in favor of `moment#startOf` and `moment#endOf`. + + * Removed `moment.humanizeDuration()` in favor of `moment.duration().humanize()`. + + * Removed the lang data objects from the top level namespace. + + * Duplicate `Date` passed to `moment()` instead of referencing it. + +## [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md) + +## [Contributing](https://github.com/moment/moment/blob/develop/CONTRIBUTING.md) + +## License + +Moment.js is freely distributable under the terms of the [MIT license](https://github.com/moment/moment/blob/develop/LICENSE). + +[license-image]: http://img.shields.io/badge/license-MIT-blue.svg?style=flat +[license-url]: LICENSE + +[npm-url]: https://npmjs.org/package/moment +[npm-version-image]: http://img.shields.io/npm/v/moment.svg?style=flat +[npm-downloads-image]: http://img.shields.io/npm/dm/moment.svg?style=flat + +[travis-url]: http://travis-ci.org/moment/moment +[travis-image]: http://img.shields.io/travis/moment/moment/develop.svg?style=flat diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/ender.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/ender.js new file mode 100644 index 0000000..71462a7 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/ender.js @@ -0,0 +1 @@ +$.ender({ moment: require('moment') }) diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/af.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/af.js new file mode 100644 index 0000000..9c7ad95 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/af.js @@ -0,0 +1,71 @@ +// moment.js locale configuration +// locale : afrikaans (af) +// author : Werner Mollentze : https://github.com/wernerm + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('af', { + months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'), + weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'), + weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'), + meridiemParse: /vm|nm/i, + isPM : function (input) { + return /^nm$/i.test(input); + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower ? 'vm' : 'VM'; + } else { + return isLower ? 'nm' : 'NM'; + } + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Vandag om] LT', + nextDay : '[Môre om] LT', + nextWeek : 'dddd [om] LT', + lastDay : '[Gister om] LT', + lastWeek : '[Laas] dddd [om] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'oor %s', + past : '%s gelede', + s : '\'n paar sekondes', + m : '\'n minuut', + mm : '%d minute', + h : '\'n uur', + hh : '%d ure', + d : '\'n dag', + dd : '%d dae', + M : '\'n maand', + MM : '%d maande', + y : '\'n jaar', + yy : '%d jaar' + }, + ordinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter + }, + week : { + dow : 1, // Maandag is die eerste dag van die week. + doy : 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ar-ma.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ar-ma.js new file mode 100644 index 0000000..7add172 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ar-ma.js @@ -0,0 +1,57 @@ +// moment.js locale configuration +// locale : Moroccan Arabic (ar-ma) +// author : ElFadili Yassine : https://github.com/ElFadiliY +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ar-ma', { + months : 'يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + monthsShort : 'يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'ÙÙŠ %s', + past : 'منذ %s', + s : 'ثوان', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ar-sa.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ar-sa.js new file mode 100644 index 0000000..731f97b --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ar-sa.js @@ -0,0 +1,101 @@ +// moment.js locale configuration +// locale : Arabic Saudi Arabia (ar-sa) +// author : Suhail Alkowaileet : https://github.com/xsoh + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': 'Ù¡', + '2': 'Ù¢', + '3': 'Ù£', + '4': 'Ù¤', + '5': 'Ù¥', + '6': 'Ù¦', + '7': 'Ù§', + '8': 'Ù¨', + '9': 'Ù©', + '0': 'Ù ' + }, numberMap = { + 'Ù¡': '1', + 'Ù¢': '2', + 'Ù£': '3', + 'Ù¤': '4', + 'Ù¥': '5', + 'Ù¦': '6', + 'Ù§': '7', + 'Ù¨': '8', + 'Ù©': '9', + 'Ù ': '0' + }; + + return moment.defineLocale('ar-sa', { + months : 'يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + monthsShort : 'يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + meridiemParse: /ص|Ù…/, + isPM : function (input) { + return 'Ù…' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'Ù…'; + } + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'ÙÙŠ %s', + past : 'منذ %s', + s : 'ثوان', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + preparse: function (string) { + return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return numberMap[match]; + }).replace(/ØŒ/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, 'ØŒ'); + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ar-tn.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ar-tn.js new file mode 100644 index 0000000..b1ddb4f --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ar-tn.js @@ -0,0 +1,55 @@ +// moment.js locale configuration +// locale : Tunisian Arabic (ar-tn) + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ar-tn', { + months: 'جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + monthsShort: 'جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin: 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS: 'LT:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd D MMMM YYYY LT' + }, + calendar: { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'ÙÙŠ %s', + past: 'منذ %s', + s: 'ثوان', + m: 'دقيقة', + mm: '%d دقائق', + h: 'ساعة', + hh: '%d ساعات', + d: 'يوم', + dd: '%d أيام', + M: 'شهر', + MM: '%d أشهر', + y: 'سنة', + yy: '%d سنوات' + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ar.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ar.js new file mode 100644 index 0000000..828e618 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ar.js @@ -0,0 +1,134 @@ +// moment.js locale configuration +// Locale: Arabic (ar) +// Author: Abdel Said: https://github.com/abdelsaid +// Changes in months, weekdays: Ahmed Elkhatib +// Native plural forms: forabi https://github.com/forabi + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': 'Ù¡', + '2': 'Ù¢', + '3': 'Ù£', + '4': 'Ù¤', + '5': 'Ù¥', + '6': 'Ù¦', + '7': 'Ù§', + '8': 'Ù¨', + '9': 'Ù©', + '0': 'Ù ' + }, numberMap = { + 'Ù¡': '1', + 'Ù¢': '2', + 'Ù£': '3', + 'Ù¤': '4', + 'Ù¥': '5', + 'Ù¦': '6', + 'Ù§': '7', + 'Ù¨': '8', + 'Ù©': '9', + 'Ù ': '0' + }, pluralForm = function (n) { + return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5; + }, plurals = { + s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'], + m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'], + h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'], + d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'], + M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'], + y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام'] + }, pluralize = function (u) { + return function (number, withoutSuffix, string, isFuture) { + var f = pluralForm(number), + str = plurals[u][pluralForm(number)]; + if (f === 2) { + str = str[withoutSuffix ? 0 : 1]; + } + return str.replace(/%d/i, number); + }; + }, months = [ + 'كانون الثاني يناير', + 'شباط Ùبراير', + 'آذار مارس', + 'نيسان أبريل', + 'أيار مايو', + 'حزيران يونيو', + 'تموز يوليو', + 'آب أغسطس', + 'أيلول سبتمبر', + 'تشرين الأول أكتوبر', + 'تشرين الثاني نوÙمبر', + 'كانون الأول ديسمبر' + ]; + + return moment.defineLocale('ar', { + months : months, + monthsShort : months, + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + meridiemParse: /ص|Ù…/, + isPM : function (input) { + return 'Ù…' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'Ù…'; + } + }, + calendar : { + sameDay: '[اليوم عند الساعة] LT', + nextDay: '[غدًا عند الساعة] LT', + nextWeek: 'dddd [عند الساعة] LT', + lastDay: '[أمس عند الساعة] LT', + lastWeek: 'dddd [عند الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'بعد %s', + past : 'منذ %s', + s : pluralize('s'), + m : pluralize('m'), + mm : pluralize('m'), + h : pluralize('h'), + hh : pluralize('h'), + d : pluralize('d'), + dd : pluralize('d'), + M : pluralize('M'), + MM : pluralize('M'), + y : pluralize('y'), + yy : pluralize('y') + }, + preparse: function (string) { + return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return numberMap[match]; + }).replace(/ØŒ/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, 'ØŒ'); + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/az.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/az.js new file mode 100644 index 0000000..7624fee --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/az.js @@ -0,0 +1,107 @@ +// moment.js locale configuration +// locale : azerbaijani (az) +// author : topchiyev : https://github.com/topchiyev + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var suffixes = { + 1: '-inci', + 5: '-inci', + 8: '-inci', + 70: '-inci', + 80: '-inci', + + 2: '-nci', + 7: '-nci', + 20: '-nci', + 50: '-nci', + + 3: '-üncü', + 4: '-üncü', + 100: '-üncü', + + 6: '-ncı', + + 9: '-uncu', + 10: '-uncu', + 30: '-uncu', + + 60: '-ıncı', + 90: '-ıncı' + }; + return moment.defineLocale('az', { + months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'), + monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'), + weekdays : 'Bazar_Bazar ertÉ™si_ÇərÅŸÉ™nbÉ™ axÅŸamı_ÇərÅŸÉ™nbÉ™_CümÉ™ axÅŸamı_CümÉ™_ŞənbÉ™'.split('_'), + weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'), + weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[bugün saat] LT', + nextDay : '[sabah saat] LT', + nextWeek : '[gÉ™lÉ™n hÉ™ftÉ™] dddd [saat] LT', + lastDay : '[dünÉ™n] LT', + lastWeek : '[keçən hÉ™ftÉ™] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s sonra', + past : '%s É™vvÉ™l', + s : 'birneçə saniyyÉ™', + m : 'bir dÉ™qiqÉ™', + mm : '%d dÉ™qiqÉ™', + h : 'bir saat', + hh : '%d saat', + d : 'bir gün', + dd : '%d gün', + M : 'bir ay', + MM : '%d ay', + y : 'bir il', + yy : '%d il' + }, + meridiemParse: /gecÉ™|sÉ™hÉ™r|gündüz|axÅŸam/, + isPM : function (input) { + return /^(gündüz|axÅŸam)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'gecÉ™'; + } else if (hour < 12) { + return 'sÉ™hÉ™r'; + } else if (hour < 17) { + return 'gündüz'; + } else { + return 'axÅŸam'; + } + }, + ordinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/, + ordinal : function (number) { + if (number === 0) { // special case for zero + return number + '-ıncı'; + } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + + return number + (suffixes[a] || suffixes[b] || suffixes[c]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/be.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/be.js new file mode 100644 index 0000000..d888e21 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/be.js @@ -0,0 +1,154 @@ +// moment.js locale configuration +// locale : belarusian (be) +// author : Dmitry Demidov : https://github.com/demidov91 +// author: Praleska: http://praleska.pro/ +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін', + 'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін', + 'dd': 'дзень_дні_дзён', + 'MM': 'меÑÑц_меÑÑцы_меÑÑцаў', + 'yy': 'год_гады_гадоў' + }; + if (key === 'm') { + return withoutSuffix ? 'хвіліна' : 'хвіліну'; + } + else if (key === 'h') { + return withoutSuffix ? 'гадзіна' : 'гадзіну'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñтудзень_люты_Ñакавік_краÑавік_травень_чÑрвень_ліпень_жнівень_вераÑень_каÑтрычнік_ліÑтапад_Ñнежань'.split('_'), + 'accusative': 'ÑтудзенÑ_лютага_Ñакавіка_краÑавіка_траўнÑ_чÑрвенÑ_ліпенÑ_жніўнÑ_вераÑнÑ_каÑтрычніка_ліÑтапада_ÑнежнÑ'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'нÑдзелÑ_панÑдзелак_аўторак_Ñерада_чацвер_пÑтніца_Ñубота'.split('_'), + 'accusative': 'нÑдзелю_панÑдзелак_аўторак_Ñераду_чацвер_пÑтніцу_Ñуботу'.split('_') + }, + + nounCase = (/\[ ?[Вв] ?(?:мінулую|наÑтупную)? ?\] ?dddd/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.defineLocale('be', { + months : monthsCaseReplace, + monthsShort : 'Ñтуд_лют_Ñак_краÑ_трав_чÑрв_ліп_жнів_вер_каÑÑ‚_ліÑÑ‚_Ñнеж'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'нд_пн_ат_ÑÑ€_чц_пт_Ñб'.split('_'), + weekdaysMin : 'нд_пн_ат_ÑÑ€_чц_пт_Ñб'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY г.', + LLL : 'D MMMM YYYY г., LT', + LLLL : 'dddd, D MMMM YYYY г., LT' + }, + calendar : { + sameDay: '[Ð¡Ñ‘Ð½Ð½Ñ Ñž] LT', + nextDay: '[Заўтра Ñž] LT', + lastDay: '[Учора Ñž] LT', + nextWeek: function () { + return '[У] dddd [Ñž] LT'; + }, + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return '[У мінулую] dddd [Ñž] LT'; + case 1: + case 2: + case 4: + return '[У мінулы] dddd [Ñž] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'праз %s', + past : '%s таму', + s : 'некалькі Ñекунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : relativeTimeWithPlural, + hh : relativeTimeWithPlural, + d : 'дзень', + dd : relativeTimeWithPlural, + M : 'меÑÑц', + MM : relativeTimeWithPlural, + y : 'год', + yy : relativeTimeWithPlural + }, + meridiemParse: /ночы|раніцы|днÑ|вечара/, + isPM : function (input) { + return /^(днÑ|вечара)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночы'; + } else if (hour < 12) { + return 'раніцы'; + } else if (hour < 17) { + return 'днÑ'; + } else { + return 'вечара'; + } + }, + + ordinalParse: /\d{1,2}-(Ñ–|Ñ‹|га)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-Ñ–' : number + '-Ñ‹'; + case 'D': + return number + '-га'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/bg.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/bg.js new file mode 100644 index 0000000..540e17b --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/bg.js @@ -0,0 +1,88 @@ +// moment.js locale configuration +// locale : bulgarian (bg) +// author : Krasen Borisov : https://github.com/kraz + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('bg', { + months : 'Ñнуари_февруари_март_април_май_юни_юли_авгуÑÑ‚_Ñептември_октомври_ноември_декември'.split('_'), + monthsShort : 'Ñнр_фев_мар_апр_май_юни_юли_авг_Ñеп_окт_ное_дек'.split('_'), + weekdays : 'неделÑ_понеделник_вторник_ÑÑ€Ñда_четвъртък_петък_Ñъбота'.split('_'), + weekdaysShort : 'нед_пон_вто_ÑÑ€Ñ_чет_пет_Ñъб'.split('_'), + weekdaysMin : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'D.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Ð”Ð½ÐµÑ Ð²] LT', + nextDay : '[Утре в] LT', + nextWeek : 'dddd [в] LT', + lastDay : '[Вчера в] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[Ð’ изминалата] dddd [в] LT'; + case 1: + case 2: + case 4: + case 5: + return '[Ð’ изминалиÑ] dddd [в] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'Ñлед %s', + past : 'преди %s', + s : 'нÑколко Ñекунди', + m : 'минута', + mm : '%d минути', + h : 'чаÑ', + hh : '%d чаÑа', + d : 'ден', + dd : '%d дни', + M : 'меÑец', + MM : '%d меÑеца', + y : 'година', + yy : '%d години' + }, + ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/bn.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/bn.js new file mode 100644 index 0000000..5b4ab51 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/bn.js @@ -0,0 +1,111 @@ +// moment.js locale configuration +// locale : Bengali (bn) +// author : Kaushik Gandhi : https://github.com/kaushikgandhi + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': '১', + '2': '২', + '3': '৩', + '4': '৪', + '5': '৫', + '6': '৬', + '7': '৭', + '8': '৮', + '9': '৯', + '0': '০' + }, + numberMap = { + '১': '1', + '২': '2', + '৩': '3', + '৪': '4', + '৫': '5', + '৬': '6', + '৭': '7', + '৮': '8', + '৯': '9', + '০': '0' + }; + + return moment.defineLocale('bn', { + months : 'জানà§à§Ÿà¦¾à¦°à§€_ফেবà§à§Ÿà¦¾à¦°à§€_মারà§à¦š_à¦à¦ªà§à¦°à¦¿à¦²_মে_জà§à¦¨_জà§à¦²à¦¾à¦‡_অগাসà§à¦Ÿ_সেপà§à¦Ÿà§‡à¦®à§à¦¬à¦°_অকà§à¦Ÿà§‹à¦¬à¦°_নভেমà§à¦¬à¦°_ডিসেমà§à¦¬à¦°'.split('_'), + monthsShort : 'জানà§_ফেব_মারà§à¦š_à¦à¦ªà¦°_মে_জà§à¦¨_জà§à¦²_অগ_সেপà§à¦Ÿ_অকà§à¦Ÿà§‹_নভ_ডিসেমà§'.split('_'), + weekdays : 'রবিবার_সোমবার_মঙà§à¦—লবার_বà§à¦§à¦¬à¦¾à¦°_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿à¦¬à¦¾à¦°_শà§à¦•à§à¦°à§à¦¬à¦¾à¦°_শনিবার'.split('_'), + weekdaysShort : 'রবি_সোম_মঙà§à¦—ল_বà§à¦§_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿_শà§à¦•à§à¦°à§_শনি'.split('_'), + weekdaysMin : 'রব_সম_মঙà§à¦—_বà§_বà§à¦°à¦¿à¦¹_শà§_শনি'.split('_'), + longDateFormat : { + LT : 'A h:mm সময়', + LTS : 'A h:mm:ss সময়', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[আজ] LT', + nextDay : '[আগামীকাল] LT', + nextWeek : 'dddd, LT', + lastDay : '[গতকাল] LT', + lastWeek : '[গত] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s পরে', + past : '%s আগে', + s : 'কà¦à¦• সেকেনà§à¦¡', + m : 'à¦à¦• মিনিট', + mm : '%d মিনিট', + h : 'à¦à¦• ঘনà§à¦Ÿà¦¾', + hh : '%d ঘনà§à¦Ÿà¦¾', + d : 'à¦à¦• দিন', + dd : '%d দিন', + M : 'à¦à¦• মাস', + MM : '%d মাস', + y : 'à¦à¦• বছর', + yy : '%d বছর' + }, + preparse: function (string) { + return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /রাত|শকাল|দà§à¦ªà§à¦°|বিকেল|রাত/, + isPM: function (input) { + return /^(দà§à¦ªà§à¦°|বিকেল|রাত)$/.test(input); + }, + //Bengali is a vast language its spoken + //in different forms in various parts of the world. + //I have just generalized with most common one used + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'রাত'; + } else if (hour < 10) { + return 'শকাল'; + } else if (hour < 17) { + return 'দà§à¦ªà§à¦°'; + } else if (hour < 20) { + return 'বিকেল'; + } else { + return 'রাত'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/bo.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/bo.js new file mode 100644 index 0000000..b8e7001 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/bo.js @@ -0,0 +1,108 @@ +// moment.js locale configuration +// locale : tibetan (bo) +// author : Thupten N. Chakrishar : https://github.com/vajradog + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': '༡', + '2': '༢', + '3': '༣', + '4': '༤', + '5': '༥', + '6': '༦', + '7': '༧', + '8': '༨', + '9': '༩', + '0': '༠' + }, + numberMap = { + '༡': '1', + '༢': '2', + '༣': '3', + '༤': '4', + '༥': '5', + '༦': '6', + '༧': '7', + '༨': '8', + '༩': '9', + '༠': '0' + }; + + return moment.defineLocale('bo', { + months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), + monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), + weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'), + weekdaysShort : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), + weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), + longDateFormat : { + LT : 'A h:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[དི་རིང] LT', + nextDay : '[སང་ཉིན] LT', + nextWeek : '[བདུན་ཕྲག་རྗེས་མ], LT', + lastDay : '[à½à¼‹à½¦à½„] LT', + lastWeek : '[བདུན་ཕྲག་མà½à½ à¼‹à½˜] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s ལ་', + past : '%s སྔན་ལ', + s : 'ལམ་སང', + m : 'སà¾à½¢à¼‹à½˜à¼‹à½‚ཅིག', + mm : '%d སà¾à½¢à¼‹à½˜', + h : 'ཆུ་ཚོད་གཅིག', + hh : '%d ཆུ་ཚོད', + d : 'ཉིན་གཅིག', + dd : '%d ཉིན་', + M : 'ཟླ་བ་གཅིག', + MM : '%d ཟླ་བ', + y : 'ལོ་གཅིག', + yy : '%d ལོ' + }, + preparse: function (string) { + return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/, + isPM: function (input) { + return /^(ཉིན་གུང|དགོང་དག|མཚན་མོ)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'མཚན་མོ'; + } else if (hour < 10) { + return 'ཞོགས་ཀས'; + } else if (hour < 17) { + return 'ཉིན་གུང'; + } else if (hour < 20) { + return 'དགོང་དག'; + } else { + return 'མཚན་མོ'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/br.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/br.js new file mode 100644 index 0000000..1f8dd61 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/br.js @@ -0,0 +1,109 @@ +// moment.js locale configuration +// locale : breton (br) +// author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function relativeTimeWithMutation(number, withoutSuffix, key) { + var format = { + 'mm': 'munutenn', + 'MM': 'miz', + 'dd': 'devezh' + }; + return number + ' ' + mutation(format[key], number); + } + + function specialMutationForYears(number) { + switch (lastNumber(number)) { + case 1: + case 3: + case 4: + case 5: + case 9: + return number + ' bloaz'; + default: + return number + ' vloaz'; + } + } + + function lastNumber(number) { + if (number > 9) { + return lastNumber(number % 10); + } + return number; + } + + function mutation(text, number) { + if (number === 2) { + return softMutation(text); + } + return text; + } + + function softMutation(text) { + var mutationTable = { + 'm': 'v', + 'b': 'v', + 'd': 'z' + }; + if (mutationTable[text.charAt(0)] === undefined) { + return text; + } + return mutationTable[text.charAt(0)] + text.substring(1); + } + + return moment.defineLocale('br', { + months : 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'), + monthsShort : 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'), + weekdays : 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'), + weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'), + weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'), + longDateFormat : { + LT : 'h[e]mm A', + LTS : 'h[e]mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D [a viz] MMMM YYYY', + LLL : 'D [a viz] MMMM YYYY LT', + LLLL : 'dddd, D [a viz] MMMM YYYY LT' + }, + calendar : { + sameDay : '[Hiziv da] LT', + nextDay : '[Warc\'hoazh da] LT', + nextWeek : 'dddd [da] LT', + lastDay : '[Dec\'h da] LT', + lastWeek : 'dddd [paset da] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'a-benn %s', + past : '%s \'zo', + s : 'un nebeud segondennoù', + m : 'ur vunutenn', + mm : relativeTimeWithMutation, + h : 'un eur', + hh : '%d eur', + d : 'un devezh', + dd : relativeTimeWithMutation, + M : 'ur miz', + MM : relativeTimeWithMutation, + y : 'ur bloaz', + yy : specialMutationForYears + }, + ordinalParse: /\d{1,2}(añ|vet)/, + ordinal : function (number) { + var output = (number === 1) ? 'añ' : 'vet'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/bs.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/bs.js new file mode 100644 index 0000000..c59f46b --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/bs.js @@ -0,0 +1,140 @@ +// moment.js locale configuration +// locale : bosnian (bs) +// author : Nedim Cholich : https://github.com/frontyard +// based on (hr) translation by Bojan Marković + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } + } + + return moment.defineLocale('bs', { + months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'), + monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'), + weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota'.split('_'), + weekdaysShort : 'ned._pon._uto._sri._Äet._pet._sub.'.split('_'), + weekdaysMin : 'ne_po_ut_sr_Äe_pe_su'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD. MM. YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[proÅ¡lu] dddd [u] LT'; + case 6: + return '[proÅ¡le] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[proÅ¡li] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'par sekundi', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'dan', + dd : translate, + M : 'mjesec', + MM : translate, + y : 'godinu', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ca.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ca.js new file mode 100644 index 0000000..4f0d3fe --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ca.js @@ -0,0 +1,77 @@ +// moment.js locale configuration +// locale : catalan (ca) +// author : Juan G. Hurtado : https://github.com/juanghurtado + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ca', { + months : 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'), + monthsShort : 'gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.'.split('_'), + weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'), + weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'), + weekdaysMin : 'Dg_Dl_Dt_Dc_Dj_Dv_Ds'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay : function () { + return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextDay : function () { + return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastDay : function () { + return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'fa %s', + s : 'uns segons', + m : 'un minut', + mm : '%d minuts', + h : 'una hora', + hh : '%d hores', + d : 'un dia', + dd : '%d dies', + M : 'un mes', + MM : '%d mesos', + y : 'un any', + yy : '%d anys' + }, + ordinalParse: /\d{1,2}(r|n|t|è|a)/, + ordinal : function (number, period) { + var output = (number === 1) ? 'r' : + (number === 2) ? 'n' : + (number === 3) ? 'r' : + (number === 4) ? 't' : 'è'; + if (period === 'w' || period === 'W') { + output = 'a'; + } + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/cs.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/cs.js new file mode 100644 index 0000000..b61658d --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/cs.js @@ -0,0 +1,157 @@ +// moment.js locale configuration +// locale : czech (cs) +// author : petrbela : https://github.com/petrbela + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var months = 'leden_únor_bÅ™ezen_duben_kvÄ›ten_Äerven_Äervenec_srpen_září_říjen_listopad_prosinec'.split('_'), + monthsShort = 'led_úno_bÅ™e_dub_kvÄ›_Ävn_Ävc_srp_zář_říj_lis_pro'.split('_'); + + function plural(n) { + return (n > 1) && (n < 5) && (~~(n / 10) !== 1); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami'; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minuty' : 'minut'); + } else { + return result + 'minutami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodin'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'den' : 'dnem'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dny' : 'dní'); + } else { + return result + 'dny'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mÄ›síc' : 'mÄ›sícem'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'mÄ›síce' : 'mÄ›síců'); + } else { + return result + 'mÄ›síci'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokem'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'let'); + } else { + return result + 'lety'; + } + break; + } + } + + return moment.defineLocale('cs', { + months : months, + monthsShort : monthsShort, + monthsParse : (function (months, monthsShort) { + var i, _monthsParse = []; + for (i = 0; i < 12; i++) { + // use custom parser to solve problem with July (Äervenec) + _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); + } + return _monthsParse; + }(months, monthsShort)), + weekdays : 'nedÄ›le_pondÄ›lí_úterý_stÅ™eda_Ätvrtek_pátek_sobota'.split('_'), + weekdaysShort : 'ne_po_út_st_Ät_pá_so'.split('_'), + weekdaysMin : 'ne_po_út_st_Ät_pá_so'.split('_'), + longDateFormat : { + LT: 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[dnes v] LT', + nextDay: '[zítra v] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedÄ›li v] LT'; + case 1: + case 2: + return '[v] dddd [v] LT'; + case 3: + return '[ve stÅ™edu v] LT'; + case 4: + return '[ve Ätvrtek v] LT'; + case 5: + return '[v pátek v] LT'; + case 6: + return '[v sobotu v] LT'; + } + }, + lastDay: '[vÄera v] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulou nedÄ›li v] LT'; + case 1: + case 2: + return '[minulé] dddd [v] LT'; + case 3: + return '[minulou stÅ™edu v] LT'; + case 4: + case 5: + return '[minulý] dddd [v] LT'; + case 6: + return '[minulou sobotu v] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pÅ™ed %s', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse : /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/cv.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/cv.js new file mode 100644 index 0000000..ea8e314 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/cv.js @@ -0,0 +1,61 @@ +// moment.js locale configuration +// locale : chuvash (cv) +// author : Anatoly Mironov : https://github.com/mirontoli + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('cv', { + months : 'кăрлач_нарăÑ_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав'.split('_'), + monthsShort : 'кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш'.split('_'), + weekdays : 'вырÑарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_Ñрнекун_шăматкун'.split('_'), + weekdaysShort : 'выр_тун_ытл_юн_кĕç_Ñрн_шăм'.split('_'), + weekdaysMin : 'вр_тн_Ñ‹Ñ‚_юн_кç_ÑÑ€_шм'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD-MM-YYYY', + LL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]', + LLL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT', + LLLL : 'dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT' + }, + calendar : { + sameDay: '[ПаÑн] LT [Ñехетре]', + nextDay: '[Ыран] LT [Ñехетре]', + lastDay: '[Ĕнер] LT [Ñехетре]', + nextWeek: '[ÇитеÑ] dddd LT [Ñехетре]', + lastWeek: '[Иртнĕ] dddd LT [Ñехетре]', + sameElse: 'L' + }, + relativeTime : { + future : function (output) { + var affix = /Ñехет$/i.exec(output) ? 'рен' : /çул$/i.exec(output) ? 'тан' : 'ран'; + return output + affix; + }, + past : '%s каÑлла', + s : 'пĕр-ик çеккунт', + m : 'пĕр минут', + mm : '%d минут', + h : 'пĕр Ñехет', + hh : '%d Ñехет', + d : 'пĕр кун', + dd : '%d кун', + M : 'пĕр уйăх', + MM : '%d уйăх', + y : 'пĕр çул', + yy : '%d çул' + }, + ordinalParse: /\d{1,2}-мĕш/, + ordinal : '%d-мĕш', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/cy.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/cy.js new file mode 100644 index 0000000..72b2f91 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/cy.js @@ -0,0 +1,79 @@ +// moment.js locale configuration +// locale : Welsh (cy) +// author : Robert Allen + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('cy', { + months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'), + monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'), + weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'), + weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'), + weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'), + // time formats are the same as en-gb + longDateFormat: { + LT: 'HH:mm', + LTS : 'LT:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd, D MMMM YYYY LT' + }, + calendar: { + sameDay: '[Heddiw am] LT', + nextDay: '[Yfory am] LT', + nextWeek: 'dddd [am] LT', + lastDay: '[Ddoe am] LT', + lastWeek: 'dddd [diwethaf am] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'mewn %s', + past: '%s yn ôl', + s: 'ychydig eiliadau', + m: 'munud', + mm: '%d munud', + h: 'awr', + hh: '%d awr', + d: 'diwrnod', + dd: '%d diwrnod', + M: 'mis', + MM: '%d mis', + y: 'blwyddyn', + yy: '%d flynedd' + }, + ordinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/, + // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh + ordinal: function (number) { + var b = number, + output = '', + lookup = [ + '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed + 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed + ]; + + if (b > 20) { + if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) { + output = 'fed'; // not 30ain, 70ain or 90ain + } else { + output = 'ain'; + } + } else if (b > 0) { + output = lookup[b]; + } + + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/da.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/da.js new file mode 100644 index 0000000..686ce00 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/da.js @@ -0,0 +1,58 @@ +// moment.js locale configuration +// locale : danish (da) +// author : Ulrik Nielsen : https://github.com/mrbase + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('da', { + months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), + weekdaysShort : 'søn_man_tir_ons_tor_fre_lør'.split('_'), + weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd [d.] D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[I dag kl.] LT', + nextDay : '[I morgen kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[I gÃ¥r kl.] LT', + lastWeek : '[sidste] dddd [kl] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'om %s', + past : '%s siden', + s : 'fÃ¥ sekunder', + m : 'et minut', + mm : '%d minutter', + h : 'en time', + hh : '%d timer', + d : 'en dag', + dd : '%d dage', + M : 'en mÃ¥ned', + MM : '%d mÃ¥neder', + y : 'et Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/de-at.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/de-at.js new file mode 100644 index 0000000..c982638 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/de-at.js @@ -0,0 +1,74 @@ +// moment.js locale configuration +// locale : austrian german (de-at) +// author : lluchs : https://github.com/lluchs +// author: Menelion Elensúle: https://github.com/Oire +// author : Martin Groller : https://github.com/MadMG + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + return moment.defineLocale('de-at', { + months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[Heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[Morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[Gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/de.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/de.js new file mode 100644 index 0000000..f6d89a9 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/de.js @@ -0,0 +1,73 @@ +// moment.js locale configuration +// locale : german (de) +// author : lluchs : https://github.com/lluchs +// author: Menelion Elensúle: https://github.com/Oire + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + return moment.defineLocale('de', { + months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[Heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[Morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[Gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/el.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/el.js new file mode 100644 index 0000000..6dc769e --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/el.js @@ -0,0 +1,94 @@ +// moment.js locale configuration +// locale : modern greek (el) +// author : Aggelos Karalias : https://github.com/mehiel + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('el', { + monthsNominativeEl : 'ΙανουάÏιος_ΦεβÏουάÏιος_ΜάÏτιος_ΑπÏίλιος_Μάιος_ΙοÏνιος_ΙοÏλιος_ΑÏγουστος_ΣεπτέμβÏιος_ΟκτώβÏιος_ÎοέμβÏιος_ΔεκέμβÏιος'.split('_'), + monthsGenitiveEl : 'ΙανουαÏίου_ΦεβÏουαÏίου_ΜαÏτίου_ΑπÏιλίου_ΜαÎου_Ιουνίου_Ιουλίου_ΑυγοÏστου_ΣεπτεμβÏίου_ΟκτωβÏίου_ÎοεμβÏίου_ΔεκεμβÏίου'.split('_'), + months : function (momentToFormat, format) { + if (/D/.test(format.substring(0, format.indexOf('MMMM')))) { // if there is a day number before 'MMMM' + return this._monthsGenitiveEl[momentToFormat.month()]; + } else { + return this._monthsNominativeEl[momentToFormat.month()]; + } + }, + monthsShort : 'Ιαν_Φεβ_ΜαÏ_ΑπÏ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Îοε_Δεκ'.split('_'), + weekdays : 'ΚυÏιακή_ΔευτέÏα_ΤÏίτη_ΤετάÏτη_Πέμπτη_ΠαÏασκευή_Σάββατο'.split('_'), + weekdaysShort : 'ΚυÏ_Δευ_ΤÏι_Τετ_Πεμ_ΠαÏ_Σαβ'.split('_'), + weekdaysMin : 'Κυ_Δε_ΤÏ_Τε_Πε_Πα_Σα'.split('_'), + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'μμ' : 'ΜΜ'; + } else { + return isLower ? 'πμ' : 'ΠΜ'; + } + }, + isPM : function (input) { + return ((input + '').toLowerCase()[0] === 'μ'); + }, + meridiemParse : /[ΠΜ]\.?Îœ?\.?/i, + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendarEl : { + sameDay : '[ΣήμεÏα {}] LT', + nextDay : '[ΑÏÏιο {}] LT', + nextWeek : 'dddd [{}] LT', + lastDay : '[Χθες {}] LT', + lastWeek : function () { + switch (this.day()) { + case 6: + return '[το Ï€ÏοηγοÏμενο] dddd [{}] LT'; + default: + return '[την Ï€ÏοηγοÏμενη] dddd [{}] LT'; + } + }, + sameElse : 'L' + }, + calendar : function (key, mom) { + var output = this._calendarEl[key], + hours = mom && mom.hours(); + + if (typeof output === 'function') { + output = output.apply(mom); + } + + return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις')); + }, + relativeTime : { + future : 'σε %s', + past : '%s Ï€Ïιν', + s : 'λίγα δευτεÏόλεπτα', + m : 'ένα λεπτό', + mm : '%d λεπτά', + h : 'μία ÏŽÏα', + hh : '%d ÏŽÏες', + d : 'μία μέÏα', + dd : '%d μέÏες', + M : 'ένας μήνας', + MM : '%d μήνες', + y : 'ένας χÏόνος', + yy : '%d χÏόνια' + }, + ordinalParse: /\d{1,2}η/, + ordinal: '%dη', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/en-au.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/en-au.js new file mode 100644 index 0000000..a382b0a --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/en-au.js @@ -0,0 +1,64 @@ +// moment.js locale configuration +// locale : australian english (en-au) + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('en-au', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + 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' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/en-ca.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/en-ca.js new file mode 100644 index 0000000..2dec8a6 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/en-ca.js @@ -0,0 +1,61 @@ +// moment.js locale configuration +// locale : canadian english (en-ca) +// author : Jonathan Abourbih : https://github.com/jonbca + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('en-ca', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'YYYY-MM-DD', + LL : 'D MMMM, YYYY', + LLL : 'D MMMM, YYYY LT', + LLLL : 'dddd, D MMMM, YYYY LT' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + 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' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/en-gb.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/en-gb.js new file mode 100644 index 0000000..4ea2b29 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/en-gb.js @@ -0,0 +1,65 @@ +// moment.js locale configuration +// locale : great britain english (en-gb) +// author : Chris Gedrim : https://github.com/chrisgedrim + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('en-gb', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + 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' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/eo.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/eo.js new file mode 100644 index 0000000..9e3d045 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/eo.js @@ -0,0 +1,71 @@ +// moment.js locale configuration +// locale : esperanto (eo) +// author : Colin Dean : https://github.com/colindean +// komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko. +// Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni! + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('eo', { + months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aÅ­gusto_septembro_oktobro_novembro_decembro'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aÅ­g_sep_okt_nov_dec'.split('_'), + weekdays : 'Dimanĉo_Lundo_Mardo_Merkredo_Ä´aÅ­do_Vendredo_Sabato'.split('_'), + weekdaysShort : 'Dim_Lun_Mard_Merk_Ä´aÅ­_Ven_Sab'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Ä´a_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'D[-an de] MMMM, YYYY', + LLL : 'D[-an de] MMMM, YYYY LT', + LLLL : 'dddd, [la] D[-an de] MMMM, YYYY LT' + }, + meridiemParse: /[ap]\.t\.m/i, + isPM: function (input) { + return input.charAt(0).toLowerCase() === 'p'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'p.t.m.' : 'P.T.M.'; + } else { + return isLower ? 'a.t.m.' : 'A.T.M.'; + } + }, + calendar : { + sameDay : '[HodiaÅ­ je] LT', + nextDay : '[MorgaÅ­ je] LT', + nextWeek : 'dddd [je] LT', + lastDay : '[HieraÅ­ je] LT', + lastWeek : '[pasinta] dddd [je] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'je %s', + past : 'antaÅ­ %s', + s : 'sekundoj', + m : 'minuto', + mm : '%d minutoj', + h : 'horo', + hh : '%d horoj', + d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo + dd : '%d tagoj', + M : 'monato', + MM : '%d monatoj', + y : 'jaro', + yy : '%d jaroj' + }, + ordinalParse: /\d{1,2}a/, + ordinal : '%da', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/es.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/es.js new file mode 100644 index 0000000..b6e30b1 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/es.js @@ -0,0 +1,77 @@ +// moment.js locale configuration +// locale : spanish (es) +// author : Julio Napurí : https://github.com/julionc + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), + monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); + + return moment.defineLocale('es', { + months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return monthsShort[m.month()]; + } else { + return monthsShortDot[m.month()]; + } + }, + weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), + weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), + weekdaysMin : 'Do_Lu_Ma_Mi_Ju_Vi_Sá'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY LT', + LLLL : 'dddd, D [de] MMMM [de] YYYY LT' + }, + calendar : { + sameDay : function () { + return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextDay : function () { + return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastDay : function () { + return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'hace %s', + s : 'unos segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'una hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un año', + yy : '%d años' + }, + ordinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/et.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/et.js new file mode 100644 index 0000000..7dbcee7 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/et.js @@ -0,0 +1,78 @@ +// moment.js locale configuration +// locale : estonian (et) +// author : Henry Kehlmann : https://github.com/madhenry +// improvements : Illimar Tambek : https://github.com/ragulka + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'], + 'm' : ['ühe minuti', 'üks minut'], + 'mm': [number + ' minuti', number + ' minutit'], + 'h' : ['ühe tunni', 'tund aega', 'üks tund'], + 'hh': [number + ' tunni', number + ' tundi'], + 'd' : ['ühe päeva', 'üks päev'], + 'M' : ['kuu aja', 'kuu aega', 'üks kuu'], + 'MM': [number + ' kuu', number + ' kuud'], + 'y' : ['ühe aasta', 'aasta', 'üks aasta'], + 'yy': [number + ' aasta', number + ' aastat'] + }; + if (withoutSuffix) { + return format[key][2] ? format[key][2] : format[key][1]; + } + return isFuture ? format[key][0] : format[key][1]; + } + + return moment.defineLocale('et', { + months : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'), + monthsShort : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'), + weekdays : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'), + weekdaysShort : 'P_E_T_K_N_R_L'.split('_'), + weekdaysMin : 'P_E_T_K_N_R_L'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[Täna,] LT', + nextDay : '[Homme,] LT', + nextWeek : '[Järgmine] dddd LT', + lastDay : '[Eile,] LT', + lastWeek : '[Eelmine] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s pärast', + past : '%s tagasi', + s : processRelativeTime, + m : processRelativeTime, + mm : processRelativeTime, + h : processRelativeTime, + hh : processRelativeTime, + d : processRelativeTime, + dd : '%d päeva', + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/eu.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/eu.js new file mode 100644 index 0000000..c455c46 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/eu.js @@ -0,0 +1,62 @@ +// moment.js locale configuration +// locale : euskara (eu) +// author : Eneko Illarramendi : https://github.com/eillarra + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('eu', { + months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'), + monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'), + weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'), + weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'), + weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY[ko] MMMM[ren] D[a]', + LLL : 'YYYY[ko] MMMM[ren] D[a] LT', + LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] LT', + l : 'YYYY-M-D', + ll : 'YYYY[ko] MMM D[a]', + lll : 'YYYY[ko] MMM D[a] LT', + llll : 'ddd, YYYY[ko] MMM D[a] LT' + }, + calendar : { + sameDay : '[gaur] LT[etan]', + nextDay : '[bihar] LT[etan]', + nextWeek : 'dddd LT[etan]', + lastDay : '[atzo] LT[etan]', + lastWeek : '[aurreko] dddd LT[etan]', + sameElse : 'L' + }, + relativeTime : { + future : '%s barru', + past : 'duela %s', + s : 'segundo batzuk', + m : 'minutu bat', + mm : '%d minutu', + h : 'ordu bat', + hh : '%d ordu', + d : 'egun bat', + dd : '%d egun', + M : 'hilabete bat', + MM : '%d hilabete', + y : 'urte bat', + yy : '%d urte' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/fa.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/fa.js new file mode 100644 index 0000000..6d76575 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/fa.js @@ -0,0 +1,103 @@ +// moment.js locale configuration +// locale : Persian (fa) +// author : Ebrahim Byagowi : https://github.com/ebraminio + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': 'Û±', + '2': 'Û²', + '3': 'Û³', + '4': 'Û´', + '5': 'Ûµ', + '6': 'Û¶', + '7': 'Û·', + '8': 'Û¸', + '9': 'Û¹', + '0': 'Û°' + }, numberMap = { + 'Û±': '1', + 'Û²': '2', + 'Û³': '3', + 'Û´': '4', + 'Ûµ': '5', + 'Û¶': '6', + 'Û·': '7', + 'Û¸': '8', + 'Û¹': '9', + 'Û°': '0' + }; + + return moment.defineLocale('fa', { + months : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + monthsShort : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysMin : 'ÛŒ_د_س_Ú†_Ù¾_ج_Ø´'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + meridiemParse: /قبل از ظهر|بعد از ظهر/, + isPM: function (input) { + return /بعد از ظهر/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'قبل از ظهر'; + } else { + return 'بعد از ظهر'; + } + }, + calendar : { + sameDay : '[امروز ساعت] LT', + nextDay : '[Ùردا ساعت] LT', + nextWeek : 'dddd [ساعت] LT', + lastDay : '[دیروز ساعت] LT', + lastWeek : 'dddd [پیش] [ساعت] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'در %s', + past : '%s پیش', + s : 'چندین ثانیه', + m : 'یک دقیقه', + mm : '%d دقیقه', + h : 'یک ساعت', + hh : '%d ساعت', + d : 'یک روز', + dd : '%d روز', + M : 'یک ماه', + MM : '%d ماه', + y : 'یک سال', + yy : '%d سال' + }, + preparse: function (string) { + return string.replace(/[Û°-Û¹]/g, function (match) { + return numberMap[match]; + }).replace(/ØŒ/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, 'ØŒ'); + }, + ordinalParse: /\d{1,2}Ù…/, + ordinal : '%dÙ…', + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/fi.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/fi.js new file mode 100644 index 0000000..f884c3e --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/fi.js @@ -0,0 +1,107 @@ +// moment.js locale configuration +// locale : finnish (fi) +// author : Tarmo Aidantausta : https://github.com/bleadof + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '), + numbersFuture = [ + 'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden', + numbersPast[7], numbersPast[8], numbersPast[9] + ]; + + function translate(number, withoutSuffix, key, isFuture) { + var result = ''; + switch (key) { + case 's': + return isFuture ? 'muutaman sekunnin' : 'muutama sekunti'; + case 'm': + return isFuture ? 'minuutin' : 'minuutti'; + case 'mm': + result = isFuture ? 'minuutin' : 'minuuttia'; + break; + case 'h': + return isFuture ? 'tunnin' : 'tunti'; + case 'hh': + result = isFuture ? 'tunnin' : 'tuntia'; + break; + case 'd': + return isFuture ? 'päivän' : 'päivä'; + case 'dd': + result = isFuture ? 'päivän' : 'päivää'; + break; + case 'M': + return isFuture ? 'kuukauden' : 'kuukausi'; + case 'MM': + result = isFuture ? 'kuukauden' : 'kuukautta'; + break; + case 'y': + return isFuture ? 'vuoden' : 'vuosi'; + case 'yy': + result = isFuture ? 'vuoden' : 'vuotta'; + break; + } + result = verbalNumber(number, isFuture) + ' ' + result; + return result; + } + + function verbalNumber(number, isFuture) { + return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number; + } + + return moment.defineLocale('fi', { + months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'), + monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'), + weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'), + weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'), + weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD.MM.YYYY', + LL : 'Do MMMM[ta] YYYY', + LLL : 'Do MMMM[ta] YYYY, [klo] LT', + LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] LT', + l : 'D.M.YYYY', + ll : 'Do MMM YYYY', + lll : 'Do MMM YYYY, [klo] LT', + llll : 'ddd, Do MMM YYYY, [klo] LT' + }, + calendar : { + sameDay : '[tänään] [klo] LT', + nextDay : '[huomenna] [klo] LT', + nextWeek : 'dddd [klo] LT', + lastDay : '[eilen] [klo] LT', + lastWeek : '[viime] dddd[na] [klo] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s päästä', + past : '%s sitten', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/fo.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/fo.js new file mode 100644 index 0000000..6b940e8 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/fo.js @@ -0,0 +1,58 @@ +// moment.js locale configuration +// locale : faroese (fo) +// author : Ragnar Johannesen : https://github.com/ragnar123 + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('fo', { + months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'), + weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'), + weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D. MMMM, YYYY LT' + }, + calendar : { + sameDay : '[à dag kl.] LT', + nextDay : '[à morgin kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[à gjár kl.] LT', + lastWeek : '[síðstu] dddd [kl] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'um %s', + past : '%s síðani', + s : 'fá sekund', + m : 'ein minutt', + mm : '%d minuttir', + h : 'ein tími', + hh : '%d tímar', + d : 'ein dagur', + dd : '%d dagar', + M : 'ein mánaði', + MM : '%d mánaðir', + y : 'eitt ár', + yy : '%d ár' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/fr-ca.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/fr-ca.js new file mode 100644 index 0000000..6cac1b8 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/fr-ca.js @@ -0,0 +1,56 @@ +// moment.js locale configuration +// locale : canadian french (fr-ca) +// author : Jonathan Abourbih : https://github.com/jonbca + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('fr-ca', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Aujourd\'hui à] LT', + nextDay: '[Demain à] LT', + nextWeek: 'dddd [à] LT', + lastDay: '[Hier à] LT', + lastWeek: 'dddd [dernier à] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + ordinalParse: /\d{1,2}(er|)/, + ordinal : function (number) { + return number + (number === 1 ? 'er' : ''); + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/fr.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/fr.js new file mode 100644 index 0000000..4a7cbcc --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/fr.js @@ -0,0 +1,60 @@ +// moment.js locale configuration +// locale : french (fr) +// author : John Fischer : https://github.com/jfroffice + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('fr', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Aujourd\'hui à] LT', + nextDay: '[Demain à] LT', + nextWeek: 'dddd [à] LT', + lastDay: '[Hier à] LT', + lastWeek: 'dddd [dernier à] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + ordinalParse: /\d{1,2}(er|)/, + ordinal : function (number) { + return number + (number === 1 ? 'er' : ''); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/fy.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/fy.js new file mode 100644 index 0000000..f86c249 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/fy.js @@ -0,0 +1,69 @@ +// moment.js locale configuration +// locale : frisian (fy) +// author : Robin van der Vliet : https://github.com/robin0van0der0v + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'); + + return moment.defineLocale('fy', { + months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'), + weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'), + weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[hjoed om] LT', + nextDay: '[moarn om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[juster om] LT', + lastWeek: '[ôfrûne] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'oer %s', + past : '%s lyn', + s : 'in pear sekonden', + m : 'ien minút', + mm : '%d minuten', + h : 'ien oere', + hh : '%d oeren', + d : 'ien dei', + dd : '%d dagen', + M : 'ien moanne', + MM : '%d moannen', + y : 'ien jier', + yy : '%d jierren' + }, + ordinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/gl.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/gl.js new file mode 100644 index 0000000..5ff9e3f --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/gl.js @@ -0,0 +1,73 @@ +// moment.js locale configuration +// locale : galician (gl) +// author : Juan G. Hurtado : https://github.com/juanghurtado + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('gl', { + months : 'Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro'.split('_'), + monthsShort : 'Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.'.split('_'), + weekdays : 'Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado'.split('_'), + weekdaysShort : 'Dom._Lun._Mar._Mér._Xov._Ven._Sáb.'.split('_'), + weekdaysMin : 'Do_Lu_Ma_Mé_Xo_Ve_Sá'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay : function () { + return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextDay : function () { + return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextWeek : function () { + return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + lastDay : function () { + return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT'; + }, + lastWeek : function () { + return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : function (str) { + if (str === 'uns segundos') { + return 'nuns segundos'; + } + return 'en ' + str; + }, + past : 'hai %s', + s : 'uns segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'unha hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un ano', + yy : '%d anos' + }, + ordinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/he.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/he.js new file mode 100644 index 0000000..d2f4b13 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/he.js @@ -0,0 +1,80 @@ +// moment.js locale configuration +// locale : Hebrew (he) +// author : Tomer Cohen : https://github.com/tomer +// author : Moshe Simantov : https://github.com/DevelopmentIL +// author : Tal Ater : https://github.com/TalAter + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('he', { + months : 'ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר'.split('_'), + monthsShort : 'ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳'.split('_'), + weekdays : 'ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'), + weekdaysShort : '×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'), + weekdaysMin : '×_ב_×’_ד_×”_ו_ש'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [ב]MMMM YYYY', + LLL : 'D [ב]MMMM YYYY LT', + LLLL : 'dddd, D [ב]MMMM YYYY LT', + l : 'D/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY LT', + llll : 'ddd, D MMM YYYY LT' + }, + calendar : { + sameDay : '[×”×™×•× ×‘Ö¾]LT', + nextDay : '[מחר ב־]LT', + nextWeek : 'dddd [בשעה] LT', + lastDay : '[×תמול ב־]LT', + lastWeek : '[ביו×] dddd [×”×חרון בשעה] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'בעוד %s', + past : 'לפני %s', + s : 'מספר שניות', + m : 'דקה', + mm : '%d דקות', + h : 'שעה', + hh : function (number) { + if (number === 2) { + return 'שעתיי×'; + } + return number + ' שעות'; + }, + d : 'יו×', + dd : function (number) { + if (number === 2) { + return 'יומיי×'; + } + return number + ' ימי×'; + }, + M : 'חודש', + MM : function (number) { + if (number === 2) { + return 'חודשיי×'; + } + return number + ' חודשי×'; + }, + y : 'שנה', + yy : function (number) { + if (number === 2) { + return 'שנתיי×'; + } else if (number % 10 === 0 && number !== 10) { + return number + ' שנה'; + } + return number + ' שני×'; + } + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/hi.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/hi.js new file mode 100644 index 0000000..173c4ee --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/hi.js @@ -0,0 +1,121 @@ +// moment.js locale configuration +// locale : hindi (hi) +// author : Mayank Singhal : https://github.com/mayanksinghal + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.defineLocale('hi', { + months : 'जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°'.split('_'), + monthsShort : 'जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.'.split('_'), + weekdays : 'रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split('_'), + weekdaysShort : 'रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split('_'), + weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split('_'), + longDateFormat : { + LT : 'A h:mm बजे', + LTS : 'A h:mm:ss बजे', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[कल] LT', + nextWeek : 'dddd, LT', + lastDay : '[कल] LT', + lastWeek : '[पिछले] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s में', + past : '%s पहले', + s : 'कà¥à¤› ही कà¥à¤·à¤£', + m : 'à¤à¤• मिनट', + mm : '%d मिनट', + h : 'à¤à¤• घंटा', + hh : '%d घंटे', + d : 'à¤à¤• दिन', + dd : '%d दिन', + M : 'à¤à¤• महीने', + MM : '%d महीने', + y : 'à¤à¤• वरà¥à¤·', + yy : '%d वरà¥à¤·' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + // Hindi notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi. + meridiemParse: /रात|सà¥à¤¬à¤¹|दोपहर|शाम/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'रात') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'सà¥à¤¬à¤¹') { + return hour; + } else if (meridiem === 'दोपहर') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'शाम') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'रात'; + } else if (hour < 10) { + return 'सà¥à¤¬à¤¹'; + } else if (hour < 17) { + return 'दोपहर'; + } else if (hour < 20) { + return 'शाम'; + } else { + return 'रात'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/hr.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/hr.js new file mode 100644 index 0000000..65264dc --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/hr.js @@ -0,0 +1,141 @@ +// moment.js locale configuration +// locale : hrvatski (hr) +// author : Bojan Marković : https://github.com/bmarkovic + +// based on (sl) translation by Robert SedovÅ¡ek + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } + } + + return moment.defineLocale('hr', { + months : 'sjeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_'), + monthsShort : 'sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'), + weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota'.split('_'), + weekdaysShort : 'ned._pon._uto._sri._Äet._pet._sub.'.split('_'), + weekdaysMin : 'ne_po_ut_sr_Äe_pe_su'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD. MM. YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[proÅ¡lu] dddd [u] LT'; + case 6: + return '[proÅ¡le] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[proÅ¡li] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'par sekundi', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'dan', + dd : translate, + M : 'mjesec', + MM : translate, + y : 'godinu', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/hu.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/hu.js new file mode 100644 index 0000000..de8cae9 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/hu.js @@ -0,0 +1,111 @@ +// moment.js locale configuration +// locale : hungarian (hu) +// author : Adam Brunner : https://github.com/adambrunner + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var weekEndings = 'vasárnap hétfÅ‘n kedden szerdán csütörtökön pénteken szombaton'.split(' '); + + function translate(number, withoutSuffix, key, isFuture) { + var num = number, + suffix; + + switch (key) { + case 's': + return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce'; + case 'm': + return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'mm': + return num + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'h': + return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'hh': + return num + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'd': + return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'dd': + return num + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'M': + return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'MM': + return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'y': + return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve'); + case 'yy': + return num + (isFuture || withoutSuffix ? ' év' : ' éve'); + } + + return ''; + } + + function week(isFuture) { + return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]'; + } + + return moment.defineLocale('hu', { + months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'), + monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'), + weekdays : 'vasárnap_hétfÅ‘_kedd_szerda_csütörtök_péntek_szombat'.split('_'), + weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'), + weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'YYYY.MM.DD.', + LL : 'YYYY. MMMM D.', + LLL : 'YYYY. MMMM D., LT', + LLLL : 'YYYY. MMMM D., dddd LT' + }, + meridiemParse: /de|du/i, + isPM: function (input) { + return input.charAt(1).toLowerCase() === 'u'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower === true ? 'de' : 'DE'; + } else { + return isLower === true ? 'du' : 'DU'; + } + }, + calendar : { + sameDay : '[ma] LT[-kor]', + nextDay : '[holnap] LT[-kor]', + nextWeek : function () { + return week.call(this, true); + }, + lastDay : '[tegnap] LT[-kor]', + lastWeek : function () { + return week.call(this, false); + }, + sameElse : 'L' + }, + relativeTime : { + future : '%s múlva', + past : '%s', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/hy-am.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/hy-am.js new file mode 100644 index 0000000..6e2de8b --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/hy-am.js @@ -0,0 +1,118 @@ +// moment.js locale configuration +// locale : Armenian (hy-am) +// author : Armendarabyan : https://github.com/armendarabyan + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€_Õ´Õ¡Ö€Õ¿_Õ¡ÕºÖ€Õ«Õ¬_Õ´Õ¡ÕµÕ«Õ½_Õ°Õ¸Ö‚Õ¶Õ«Õ½_Õ°Õ¸Ö‚Õ¬Õ«Õ½_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€'.split('_'), + 'accusative': 'Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€Õ«_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€Õ«_Õ´Õ¡Ö€Õ¿Õ«_Õ¡ÕºÖ€Õ«Õ¬Õ«_Õ´Õ¡ÕµÕ«Õ½Õ«_Õ°Õ¸Ö‚Õ¶Õ«Õ½Õ«_Õ°Õ¸Ö‚Õ¬Õ«Õ½Õ«_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½Õ«_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function monthsShortCaseReplace(m, format) { + var monthsShort = 'Õ°Õ¶Õ¾_ÖƒÕ¿Ö€_Õ´Ö€Õ¿_Õ¡ÕºÖ€_Õ´ÕµÕ½_Õ°Õ¶Õ½_Õ°Õ¬Õ½_Ö…Õ£Õ½_Õ½ÕºÕ¿_Õ°Õ¯Õ¿_Õ¶Õ´Õ¢_Õ¤Õ¯Õ¿'.split('_'); + + return monthsShort[m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = 'Õ¯Õ«Ö€Õ¡Õ¯Õ«_Õ¥Ö€Õ¯Õ¸Ö‚Õ·Õ¡Õ¢Õ©Õ«_Õ¥Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ¹Õ¸Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ°Õ«Õ¶Õ£Õ·Õ¡Õ¢Õ©Õ«_Õ¸Ö‚Ö€Õ¢Õ¡Õ©_Õ·Õ¡Õ¢Õ¡Õ©'.split('_'); + + return weekdays[m.day()]; + } + + return moment.defineLocale('hy-am', { + months : monthsCaseReplace, + monthsShort : monthsShortCaseReplace, + weekdays : weekdaysCaseReplace, + weekdaysShort : 'Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©'.split('_'), + weekdaysMin : 'Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY Õ©.', + LLL : 'D MMMM YYYY Õ©., LT', + LLLL : 'dddd, D MMMM YYYY Õ©., LT' + }, + calendar : { + sameDay: '[Õ¡ÕµÕ½Ö…Ö€] LT', + nextDay: '[Õ¾Õ¡Õ²Õ¨] LT', + lastDay: '[Õ¥Ö€Õ¥Õ¯] LT', + nextWeek: function () { + return 'dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT'; + }, + lastWeek: function () { + return '[Õ¡Õ¶ÖÕ¡Õ®] dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT'; + }, + sameElse: 'L' + }, + relativeTime : { + future : '%s Õ°Õ¥Õ¿Õ¸', + past : '%s Õ¡Õ¼Õ¡Õ»', + s : 'Õ´Õ« Ö„Õ¡Õ¶Õ« Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶', + m : 'Ö€Õ¸ÕºÕ¥', + mm : '%d Ö€Õ¸ÕºÕ¥', + h : 'ÕªÕ¡Õ´', + hh : '%d ÕªÕ¡Õ´', + d : 'Ö…Ö€', + dd : '%d Ö…Ö€', + M : 'Õ¡Õ´Õ«Õ½', + MM : '%d Õ¡Õ´Õ«Õ½', + y : 'Õ¿Õ¡Ö€Õ«', + yy : '%d Õ¿Õ¡Ö€Õ«' + }, + + meridiemParse: /Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡|Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡|ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶/, + isPM: function (input) { + return /^(ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶)$/.test(input); + }, + meridiem : function (hour) { + if (hour < 4) { + return 'Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡'; + } else if (hour < 12) { + return 'Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡'; + } else if (hour < 17) { + return 'ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡'; + } else { + return 'Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶'; + } + }, + + ordinalParse: /\d{1,2}|\d{1,2}-(Õ«Õ¶|Ö€Õ¤)/, + ordinal: function (number, period) { + switch (period) { + case 'DDD': + case 'w': + case 'W': + case 'DDDo': + if (number === 1) { + return number + '-Õ«Õ¶'; + } + return number + '-Ö€Õ¤'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/id.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/id.js new file mode 100644 index 0000000..fe04849 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/id.js @@ -0,0 +1,81 @@ +// moment.js locale configuration +// locale : Bahasa Indonesia (id) +// author : Mohammad Satrio Utomo : https://github.com/tyok +// reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('id', { + months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'), + weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'), + weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'LT.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] LT', + LLLL : 'dddd, D MMMM YYYY [pukul] LT' + }, + meridiemParse: /pagi|siang|sore|malam/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'siang') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'sore' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'siang'; + } else if (hours < 19) { + return 'sore'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Besok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kemarin pukul] LT', + lastWeek : 'dddd [lalu pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lalu', + s : 'beberapa detik', + m : 'semenit', + mm : '%d menit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/is.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/is.js new file mode 100644 index 0000000..21888aa --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/is.js @@ -0,0 +1,126 @@ +// moment.js locale configuration +// locale : icelandic (is) +// author : Hinrik Örn Sigurðsson : https://github.com/hinrik + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function plural(n) { + if (n % 100 === 11) { + return true; + } else if (n % 10 === 1) { + return false; + } + return true; + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': + return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum'; + case 'm': + return withoutSuffix ? 'mínúta' : 'mínútu'; + case 'mm': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum'); + } else if (withoutSuffix) { + return result + 'mínúta'; + } + return result + 'mínútu'; + case 'hh': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum'); + } + return result + 'klukkustund'; + case 'd': + if (withoutSuffix) { + return 'dagur'; + } + return isFuture ? 'dag' : 'degi'; + case 'dd': + if (plural(number)) { + if (withoutSuffix) { + return result + 'dagar'; + } + return result + (isFuture ? 'daga' : 'dögum'); + } else if (withoutSuffix) { + return result + 'dagur'; + } + return result + (isFuture ? 'dag' : 'degi'); + case 'M': + if (withoutSuffix) { + return 'mánuður'; + } + return isFuture ? 'mánuð' : 'mánuði'; + case 'MM': + if (plural(number)) { + if (withoutSuffix) { + return result + 'mánuðir'; + } + return result + (isFuture ? 'mánuði' : 'mánuðum'); + } else if (withoutSuffix) { + return result + 'mánuður'; + } + return result + (isFuture ? 'mánuð' : 'mánuði'); + case 'y': + return withoutSuffix || isFuture ? 'ár' : 'ári'; + case 'yy': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'ár' : 'árum'); + } + return result + (withoutSuffix || isFuture ? 'ár' : 'ári'); + } + } + + return moment.defineLocale('is', { + months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'), + weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'), + weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'), + weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] LT', + LLLL : 'dddd, D. MMMM YYYY [kl.] LT' + }, + calendar : { + sameDay : '[í dag kl.] LT', + nextDay : '[á morgun kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[í gær kl.] LT', + lastWeek : '[síðasta] dddd [kl.] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'eftir %s', + past : 'fyrir %s síðan', + s : translate, + m : translate, + mm : translate, + h : 'klukkustund', + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/it.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/it.js new file mode 100644 index 0000000..9d14714 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/it.js @@ -0,0 +1,68 @@ +// moment.js locale configuration +// locale : italian (it) +// author : Lorenzo : https://github.com/aliem +// author: Mattia Larentis: https://github.com/nostalgiaz + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('it', { + months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'), + monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'), + weekdays : 'Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato'.split('_'), + weekdaysShort : 'Dom_Lun_Mar_Mer_Gio_Ven_Sab'.split('_'), + weekdaysMin : 'D_L_Ma_Me_G_V_S'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Oggi alle] LT', + nextDay: '[Domani alle] LT', + nextWeek: 'dddd [alle] LT', + lastDay: '[Ieri alle] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[la scorsa] dddd [alle] LT'; + default: + return '[lo scorso] dddd [alle] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : function (s) { + return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s; + }, + past : '%s fa', + s : 'alcuni secondi', + m : 'un minuto', + mm : '%d minuti', + h : 'un\'ora', + hh : '%d ore', + d : 'un giorno', + dd : '%d giorni', + M : 'un mese', + MM : '%d mesi', + y : 'un anno', + yy : '%d anni' + }, + ordinalParse : /\d{1,2}º/, + ordinal: '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ja.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ja.js new file mode 100644 index 0000000..1feb202 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ja.js @@ -0,0 +1,63 @@ +// moment.js locale configuration +// locale : japanese (ja) +// author : LI Long : https://github.com/baryon + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ja', { + months : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '日曜日_月曜日_ç«æ›œæ—¥_水曜日_木曜日_金曜日_土曜日'.split('_'), + weekdaysShort : 'æ—¥_月_ç«_æ°´_木_金_土'.split('_'), + weekdaysMin : 'æ—¥_月_ç«_æ°´_木_金_土'.split('_'), + longDateFormat : { + LT : 'Ah時m分', + LTS : 'LTs秒', + L : 'YYYY/MM/DD', + LL : 'YYYYå¹´M月Dæ—¥', + LLL : 'YYYYå¹´M月Dæ—¥LT', + LLLL : 'YYYYå¹´M月Dæ—¥LT dddd' + }, + meridiemParse: /åˆå‰|åˆå¾Œ/i, + isPM : function (input) { + return input === 'åˆå¾Œ'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'åˆå‰'; + } else { + return 'åˆå¾Œ'; + } + }, + calendar : { + sameDay : '[今日] LT', + nextDay : '[明日] LT', + nextWeek : '[æ¥é€±]dddd LT', + lastDay : '[昨日] LT', + lastWeek : '[å‰é€±]dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s後', + past : '%så‰', + s : '数秒', + m : '1分', + mm : '%d分', + h : '1時間', + hh : '%d時間', + d : '1æ—¥', + dd : '%dæ—¥', + M : '1ヶ月', + MM : '%dヶ月', + y : '1å¹´', + yy : '%då¹´' + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ka.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ka.js new file mode 100644 index 0000000..b56e18c --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ka.js @@ -0,0 +1,109 @@ +// moment.js locale configuration +// locale : Georgian (ka) +// author : Irakli Janiashvili : https://github.com/irakli-janiashvili + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'იáƒáƒœáƒ•áƒáƒ áƒ˜_თებერვáƒáƒšáƒ˜_მáƒáƒ áƒ¢áƒ˜_áƒáƒžáƒ áƒ˜áƒšáƒ˜_მáƒáƒ˜áƒ¡áƒ˜_ივნისი_ივლისი_áƒáƒ’ვისტáƒ_სექტემბერი_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი_ნáƒáƒ”მბერი_დეკემბერი'.split('_'), + 'accusative': 'იáƒáƒœáƒ•áƒáƒ áƒ¡_თებერვáƒáƒšáƒ¡_მáƒáƒ áƒ¢áƒ¡_áƒáƒžáƒ áƒ˜áƒšáƒ˜áƒ¡_მáƒáƒ˜áƒ¡áƒ¡_ივნისს_ივლისს_áƒáƒ’ვისტს_სექტემბერს_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერს_ნáƒáƒ”მბერს_დეკემბერს'.split('_') + }, + + nounCase = (/D[oD] *MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'კვირáƒ_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ი_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი_ხუთშáƒáƒ‘áƒáƒ—ი_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი_შáƒáƒ‘áƒáƒ—ი'.split('_'), + 'accusative': 'კვირáƒáƒ¡_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ს_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ს_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ს_ხუთშáƒáƒ‘áƒáƒ—ს_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვს_შáƒáƒ‘áƒáƒ—ს'.split('_') + }, + + nounCase = (/(წინáƒ|შემდეგ)/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.defineLocale('ka', { + months : monthsCaseReplace, + monthsShort : 'იáƒáƒœ_თებ_მáƒáƒ _áƒáƒžáƒ _მáƒáƒ˜_ივნ_ივლ_áƒáƒ’ვ_სექ_áƒáƒ¥áƒ¢_ნáƒáƒ”_დეკ'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'კვი_áƒáƒ áƒ¨_სáƒáƒ›_áƒáƒ—ხ_ხუთ_პáƒáƒ _შáƒáƒ‘'.split('_'), + weekdaysMin : 'კვ_áƒáƒ _სáƒ_áƒáƒ—_ხუ_პáƒ_შáƒ'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[დღეს] LT[-ზე]', + nextDay : '[ხვáƒáƒš] LT[-ზე]', + lastDay : '[გუშინ] LT[-ზე]', + nextWeek : '[შემდეგ] dddd LT[-ზე]', + lastWeek : '[წინáƒ] dddd LT-ზე', + sameElse : 'L' + }, + relativeTime : { + future : function (s) { + return (/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|წელი)/).test(s) ? + s.replace(/ი$/, 'ში') : + s + 'ში'; + }, + past : function (s) { + if ((/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|დღე|თვე)/).test(s)) { + return s.replace(/(ი|ე)$/, 'ის წინ'); + } + if ((/წელი/).test(s)) { + return s.replace(/წელი$/, 'წლის წინ'); + } + }, + s : 'რáƒáƒ›áƒ“ენიმე წáƒáƒ›áƒ˜', + m : 'წუთი', + mm : '%d წუთი', + h : 'სáƒáƒáƒ—ი', + hh : '%d სáƒáƒáƒ—ი', + d : 'დღე', + dd : '%d დღე', + M : 'თვე', + MM : '%d თვე', + y : 'წელი', + yy : '%d წელი' + }, + ordinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/, + ordinal : function (number) { + if (number === 0) { + return number; + } + + if (number === 1) { + return number + '-ლი'; + } + + if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) { + return 'მე-' + number; + } + + return number + '-ე'; + }, + week : { + dow : 1, + doy : 7 + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/km.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/km.js new file mode 100644 index 0000000..8d7b9b8 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/km.js @@ -0,0 +1,56 @@ +// moment.js locale configuration +// locale : khmer (km) +// author : Kruy Vanna : https://github.com/kruyvanna + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('km', { + months: 'មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ'.split('_'), + monthsShort: 'មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ'.split('_'), + weekdays: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), + weekdaysShort: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), + weekdaysMin: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS : 'LT:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd, D MMMM YYYY LT' + }, + calendar: { + sameDay: '[ážáŸ’ងៃនៈ ម៉ោង] LT', + nextDay: '[ស្អែក ម៉ោង] LT', + nextWeek: 'dddd [ម៉ោង] LT', + lastDay: '[ម្សិលមិញ ម៉ោង] LT', + lastWeek: 'dddd [សប្ážáž¶áž áŸáž˜áž»áž“] [ម៉ោង] LT', + sameElse: 'L' + }, + relativeTime: { + future: '%sទៀáž', + past: '%sមុន', + s: 'ប៉ុន្មានវិនាទី', + m: 'មួយនាទី', + mm: '%d នាទី', + h: 'មួយម៉ោង', + hh: '%d ម៉ោង', + d: 'មួយážáŸ’ងៃ', + dd: '%d ážáŸ’ងៃ', + M: 'មួយážáŸ‚', + MM: '%d ážáŸ‚', + y: 'មួយឆ្នាំ', + yy: '%d ឆ្នាំ' + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ko.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ko.js new file mode 100644 index 0000000..8f9396f --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ko.js @@ -0,0 +1,65 @@ +// moment.js locale configuration +// locale : korean (ko) +// +// authors +// +// - Kyungwook, Park : https://github.com/kyungw00k +// - Jeeeyul Lee +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ko', { + months : '1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”'.split('_'), + monthsShort : '1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”'.split('_'), + weekdays : 'ì¼ìš”ì¼_월요ì¼_화요ì¼_수요ì¼_목요ì¼_금요ì¼_토요ì¼'.split('_'), + weekdaysShort : 'ì¼_ì›”_í™”_수_목_금_토'.split('_'), + weekdaysMin : 'ì¼_ì›”_í™”_수_목_금_토'.split('_'), + longDateFormat : { + LT : 'A hì‹œ m분', + LTS : 'A hì‹œ m분 sì´ˆ', + L : 'YYYY.MM.DD', + LL : 'YYYYë…„ MMMM Dì¼', + LLL : 'YYYYë…„ MMMM Dì¼ LT', + LLLL : 'YYYYë…„ MMMM Dì¼ dddd LT' + }, + calendar : { + sameDay : '오늘 LT', + nextDay : 'ë‚´ì¼ LT', + nextWeek : 'dddd LT', + lastDay : 'ì–´ì œ LT', + lastWeek : '지난주 dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s 후', + past : '%s ì „', + s : '몇초', + ss : '%dì´ˆ', + m : 'ì¼ë¶„', + mm : '%d분', + h : '한시간', + hh : '%d시간', + d : '하루', + dd : '%dì¼', + M : '한달', + MM : '%d달', + y : 'ì¼ë…„', + yy : '%dë…„' + }, + ordinalParse : /\d{1,2}ì¼/, + ordinal : '%dì¼', + meridiemParse : /오전|오후/, + isPM : function (token) { + return token === '오후'; + }, + meridiem : function (hour, minute, isUpper) { + return hour < 12 ? '오전' : '오후'; + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/lb.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/lb.js new file mode 100644 index 0000000..2e84dab --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/lb.js @@ -0,0 +1,139 @@ +// moment.js locale configuration +// locale : Luxembourgish (lb) +// author : mweimerskirch : https://github.com/mweimerskirch, David Raison : https://github.com/kwisatz + +// Note: Luxembourgish has a very particular phonological rule ('Eifeler Regel') that causes the +// deletion of the final 'n' in certain contexts. That's what the 'eifelerRegelAppliesToWeekday' +// and 'eifelerRegelAppliesToNumber' methods are meant for + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eng Minutt', 'enger Minutt'], + 'h': ['eng Stonn', 'enger Stonn'], + 'd': ['een Dag', 'engem Dag'], + 'M': ['ee Mount', 'engem Mount'], + 'y': ['ee Joer', 'engem Joer'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + function processFutureTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'a ' + string; + } + return 'an ' + string; + } + + function processPastTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'viru ' + string; + } + return 'virun ' + string; + } + + /** + * Returns true if the word before the given number loses the '-n' ending. + * e.g. 'an 10 Deeg' but 'a 5 Deeg' + * + * @param number {integer} + * @returns {boolean} + */ + function eifelerRegelAppliesToNumber(number) { + number = parseInt(number, 10); + if (isNaN(number)) { + return false; + } + if (number < 0) { + // Negative Number --> always true + return true; + } else if (number < 10) { + // Only 1 digit + if (4 <= number && number <= 7) { + return true; + } + return false; + } else if (number < 100) { + // 2 digits + var lastDigit = number % 10, firstDigit = number / 10; + if (lastDigit === 0) { + return eifelerRegelAppliesToNumber(firstDigit); + } + return eifelerRegelAppliesToNumber(lastDigit); + } else if (number < 10000) { + // 3 or 4 digits --> recursively check first digit + while (number >= 10) { + number = number / 10; + } + return eifelerRegelAppliesToNumber(number); + } else { + // Anything larger than 4 digits: recursively check first n-3 digits + number = number / 1000; + return eifelerRegelAppliesToNumber(number); + } + } + + return moment.defineLocale('lb', { + months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'), + weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'), + weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'), + longDateFormat: { + LT: 'H:mm [Auer]', + LTS: 'H:mm:ss [Auer]', + L: 'DD.MM.YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY LT', + LLLL: 'dddd, D. MMMM YYYY LT' + }, + calendar: { + sameDay: '[Haut um] LT', + sameElse: 'L', + nextDay: '[Muer um] LT', + nextWeek: 'dddd [um] LT', + lastDay: '[Gëschter um] LT', + lastWeek: function () { + // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule + switch (this.day()) { + case 2: + case 4: + return '[Leschten] dddd [um] LT'; + default: + return '[Leschte] dddd [um] LT'; + } + } + }, + relativeTime : { + future : processFutureTime, + past : processPastTime, + s : 'e puer Sekonnen', + m : processRelativeTime, + mm : '%d Minutten', + h : processRelativeTime, + hh : '%d Stonnen', + d : processRelativeTime, + dd : '%d Deeg', + M : processRelativeTime, + MM : '%d Méint', + y : processRelativeTime, + yy : '%d Joer' + }, + ordinalParse: /\d{1,2}\./, + ordinal: '%d.', + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/lt.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/lt.js new file mode 100644 index 0000000..2d87e04 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/lt.js @@ -0,0 +1,120 @@ +// moment.js locale configuration +// locale : Lithuanian (lt) +// author : Mindaugas MozÅ«ras : https://github.com/mmozuras + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var units = { + 'm' : 'minutÄ—_minutÄ—s_minutÄ™', + 'mm': 'minutÄ—s_minuÄių_minutes', + 'h' : 'valanda_valandos_valandÄ…', + 'hh': 'valandos_valandų_valandas', + 'd' : 'diena_dienos_dienÄ…', + 'dd': 'dienos_dienų_dienas', + 'M' : 'mÄ—nuo_mÄ—nesio_mÄ—nesį', + 'MM': 'mÄ—nesiai_mÄ—nesių_mÄ—nesius', + 'y' : 'metai_metų_metus', + 'yy': 'metai_metų_metus' + }, + weekDays = 'sekmadienis_pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis'.split('_'); + + function translateSeconds(number, withoutSuffix, key, isFuture) { + if (withoutSuffix) { + return 'kelios sekundÄ—s'; + } else { + return isFuture ? 'kelių sekundžių' : 'kelias sekundes'; + } + } + + function translateSingular(number, withoutSuffix, key, isFuture) { + return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]); + } + + function special(number) { + return number % 10 === 0 || (number > 10 && number < 20); + } + + function forms(key) { + return units[key].split('_'); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + if (number === 1) { + return result + translateSingular(number, withoutSuffix, key[0], isFuture); + } else if (withoutSuffix) { + return result + (special(number) ? forms(key)[1] : forms(key)[0]); + } else { + if (isFuture) { + return result + forms(key)[1]; + } else { + return result + (special(number) ? forms(key)[1] : forms(key)[2]); + } + } + } + + function relativeWeekDay(moment, format) { + var nominative = format.indexOf('dddd HH:mm') === -1, + weekDay = weekDays[moment.day()]; + + return nominative ? weekDay : weekDay.substring(0, weekDay.length - 2) + 'į'; + } + + return moment.defineLocale('lt', { + months : 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio'.split('_'), + monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'), + weekdays : relativeWeekDay, + weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Å eÅ¡'.split('_'), + weekdaysMin : 'S_P_A_T_K_Pn_Å '.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY [m.] MMMM D [d.]', + LLL : 'YYYY [m.] MMMM D [d.], LT [val.]', + LLLL : 'YYYY [m.] MMMM D [d.], dddd, LT [val.]', + l : 'YYYY-MM-DD', + ll : 'YYYY [m.] MMMM D [d.]', + lll : 'YYYY [m.] MMMM D [d.], LT [val.]', + llll : 'YYYY [m.] MMMM D [d.], ddd, LT [val.]' + }, + calendar : { + sameDay : '[Å iandien] LT', + nextDay : '[Rytoj] LT', + nextWeek : 'dddd LT', + lastDay : '[Vakar] LT', + lastWeek : '[PraÄ—jusį] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : 'po %s', + past : 'prieÅ¡ %s', + s : translateSeconds, + m : translateSingular, + mm : translate, + h : translateSingular, + hh : translate, + d : translateSingular, + dd : translate, + M : translateSingular, + MM : translate, + y : translateSingular, + yy : translate + }, + ordinalParse: /\d{1,2}-oji/, + ordinal : function (number) { + return number + '-oji'; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/lv.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/lv.js new file mode 100644 index 0000000..47a0708 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/lv.js @@ -0,0 +1,79 @@ +// moment.js locale configuration +// locale : latvian (lv) +// author : Kristaps Karlsons : https://github.com/skakri + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var units = { + 'mm': 'minÅ«ti_minÅ«tes_minÅ«te_minÅ«tes', + 'hh': 'stundu_stundas_stunda_stundas', + 'dd': 'dienu_dienas_diena_dienas', + 'MM': 'mÄ“nesi_mÄ“neÅ¡us_mÄ“nesis_mÄ“neÅ¡i', + 'yy': 'gadu_gadus_gads_gadi' + }; + + function format(word, number, withoutSuffix) { + var forms = word.split('_'); + if (withoutSuffix) { + return number % 10 === 1 && number !== 11 ? forms[2] : forms[3]; + } else { + return number % 10 === 1 && number !== 11 ? forms[0] : forms[1]; + } + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + return number + ' ' + format(units[key], number, withoutSuffix); + } + + return moment.defineLocale('lv', { + months : 'janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jÅ«n_jÅ«l_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'svÄ“tdiena_pirmdiena_otrdiena_treÅ¡diena_ceturtdiena_piektdiena_sestdiena'.split('_'), + weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'), + weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'YYYY. [gada] D. MMMM', + LLL : 'YYYY. [gada] D. MMMM, LT', + LLLL : 'YYYY. [gada] D. MMMM, dddd, LT' + }, + calendar : { + sameDay : '[Å odien pulksten] LT', + nextDay : '[RÄ«t pulksten] LT', + nextWeek : 'dddd [pulksten] LT', + lastDay : '[Vakar pulksten] LT', + lastWeek : '[PagÄjuÅ¡Ä] dddd [pulksten] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s vÄ“lÄk', + past : '%s agrÄk', + s : 'dažas sekundes', + m : 'minÅ«ti', + mm : relativeTimeWithPlural, + h : 'stundu', + hh : relativeTimeWithPlural, + d : 'dienu', + dd : relativeTimeWithPlural, + M : 'mÄ“nesi', + MM : relativeTimeWithPlural, + y : 'gadu', + yy : relativeTimeWithPlural + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/mk.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/mk.js new file mode 100644 index 0000000..de36631 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/mk.js @@ -0,0 +1,88 @@ +// moment.js locale configuration +// locale : macedonian (mk) +// author : Borislav Mickov : https://github.com/B0k0 + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('mk', { + months : 'јануари_февруари_март_април_мај_јуни_јули_авгуÑÑ‚_Ñептември_октомври_ноември_декември'.split('_'), + monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_Ñеп_окт_ное_дек'.split('_'), + weekdays : 'недела_понеделник_вторник_Ñреда_четврток_петок_Ñабота'.split('_'), + weekdaysShort : 'нед_пон_вто_Ñре_чет_пет_Ñаб'.split('_'), + weekdaysMin : 'нe_пo_вт_ÑÑ€_че_пе_Ña'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'D.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Ð”ÐµÐ½ÐµÑ Ð²Ð¾] LT', + nextDay : '[Утре во] LT', + nextWeek : 'dddd [во] LT', + lastDay : '[Вчера во] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[Во изминатата] dddd [во] LT'; + case 1: + case 2: + case 4: + case 5: + return '[Во изминатиот] dddd [во] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'поÑле %s', + past : 'пред %s', + s : 'неколку Ñекунди', + m : 'минута', + mm : '%d минути', + h : 'чаÑ', + hh : '%d чаÑа', + d : 'ден', + dd : '%d дена', + M : 'меÑец', + MM : '%d меÑеци', + y : 'година', + yy : '%d години' + }, + ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ml.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ml.js new file mode 100644 index 0000000..eb877bb --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ml.js @@ -0,0 +1,69 @@ +// moment.js locale configuration +// locale : malayalam (ml) +// author : Floyd Pink : https://github.com/floydpink + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ml', { + months : 'ജനàµà´µà´°à´¿_ഫെബàµà´°àµà´µà´°à´¿_മാർചàµà´šàµ_à´à´ªàµà´°à´¿àµ½_മേയàµ_ജൂൺ_ജൂലൈ_à´“à´—à´¸àµà´±àµà´±àµ_സെപàµà´±àµà´±à´‚ബർ_à´’à´•àµà´Ÿàµ‹à´¬àµ¼_നവംബർ_ഡിസംബർ'.split('_'), + monthsShort : 'ജനàµ._ഫെബàµà´°àµ._മാർ._à´à´ªàµà´°à´¿._മേയàµ_ജൂൺ_ജൂലൈ._à´“à´—._സെപàµà´±àµà´±._à´’à´•àµà´Ÿàµ‹._നവം._ഡിസം.'.split('_'), + weekdays : 'ഞായറാഴàµà´š_തിങàµà´•à´³à´¾à´´àµà´š_ചൊവàµà´µà´¾à´´àµà´š_à´¬àµà´§à´¨à´¾à´´àµà´š_à´µàµà´¯à´¾à´´à´¾à´´àµà´š_വെളàµà´³à´¿à´¯à´¾à´´àµà´š_ശനിയാഴàµà´š'.split('_'), + weekdaysShort : 'ഞായർ_തിങàµà´•àµ¾_ചൊവàµà´µ_à´¬àµà´§àµ»_à´µàµà´¯à´¾à´´à´‚_വെളàµà´³à´¿_ശനി'.split('_'), + weekdaysMin : 'à´žà´¾_തി_ചൊ_à´¬àµ_à´µàµà´¯à´¾_വെ_à´¶'.split('_'), + longDateFormat : { + LT : 'A h:mm -à´¨àµ', + LTS : 'A h:mm:ss -à´¨àµ', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[ഇനàµà´¨àµ] LT', + nextDay : '[നാളെ] LT', + nextWeek : 'dddd, LT', + lastDay : '[ഇനàµà´¨à´²àµ†] LT', + lastWeek : '[à´•à´´à´¿à´žàµà´ž] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s à´•à´´à´¿à´žàµà´žàµ', + past : '%s à´®àµàµ»à´ªàµ', + s : 'അൽപ നിമിഷങàµà´™àµ¾', + m : 'ഒരൠമിനിറàµà´±àµ', + mm : '%d മിനിറàµà´±àµ', + h : 'ഒരൠമണികàµà´•àµ‚ർ', + hh : '%d മണികàµà´•àµ‚ർ', + d : 'ഒരൠദിവസം', + dd : '%d ദിവസം', + M : 'ഒരൠമാസം', + MM : '%d മാസം', + y : 'ഒരൠവർഷം', + yy : '%d വർഷം' + }, + meridiemParse: /രാതàµà´°à´¿|രാവിലെ|ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿/i, + isPM : function (input) { + return /^(ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'രാതàµà´°à´¿'; + } else if (hour < 12) { + return 'രാവിലെ'; + } else if (hour < 17) { + return 'ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ'; + } else if (hour < 20) { + return 'വൈകàµà´¨àµà´¨àµ‡à´°à´‚'; + } else { + return 'രാതàµà´°à´¿'; + } + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/mr.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/mr.js new file mode 100644 index 0000000..93f0eea --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/mr.js @@ -0,0 +1,120 @@ +// moment.js locale configuration +// locale : Marathi (mr) +// author : Harshad Kale : https://github.com/kalehv + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.defineLocale('mr', { + months : 'जानेवारी_फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€_मारà¥à¤š_à¤à¤ªà¥à¤°à¤¿à¤²_मे_जून_जà¥à¤²à¥ˆ_ऑगसà¥à¤Ÿ_सपà¥à¤Ÿà¥‡à¤‚बर_ऑकà¥à¤Ÿà¥‹à¤¬à¤°_नोवà¥à¤¹à¥‡à¤‚बर_डिसेंबर'.split('_'), + monthsShort: 'जाने._फेबà¥à¤°à¥._मारà¥à¤š._à¤à¤ªà¥à¤°à¤¿._मे._जून._जà¥à¤²à¥ˆ._ऑग._सपà¥à¤Ÿà¥‡à¤‚._ऑकà¥à¤Ÿà¥‹._नोवà¥à¤¹à¥‡à¤‚._डिसें.'.split('_'), + weekdays : 'रविवार_सोमवार_मंगळवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split('_'), + weekdaysShort : 'रवि_सोम_मंगळ_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split('_'), + weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split('_'), + longDateFormat : { + LT : 'A h:mm वाजता', + LTS : 'A h:mm:ss वाजता', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[उदà¥à¤¯à¤¾] LT', + nextWeek : 'dddd, LT', + lastDay : '[काल] LT', + lastWeek: '[मागील] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s नंतर', + past : '%s पूरà¥à¤µà¥€', + s : 'सेकंद', + m: 'à¤à¤• मिनिट', + mm: '%d मिनिटे', + h : 'à¤à¤• तास', + hh : '%d तास', + d : 'à¤à¤• दिवस', + dd : '%d दिवस', + M : 'à¤à¤• महिना', + MM : '%d महिने', + y : 'à¤à¤• वरà¥à¤·', + yy : '%d वरà¥à¤·à¥‡' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /रातà¥à¤°à¥€|सकाळी|दà¥à¤ªà¤¾à¤°à¥€|सायंकाळी/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'रातà¥à¤°à¥€') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'सकाळी') { + return hour; + } else if (meridiem === 'दà¥à¤ªà¤¾à¤°à¥€') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'सायंकाळी') { + return hour + 12; + } + }, + meridiem: function (hour, minute, isLower) + { + if (hour < 4) { + return 'रातà¥à¤°à¥€'; + } else if (hour < 10) { + return 'सकाळी'; + } else if (hour < 17) { + return 'दà¥à¤ªà¤¾à¤°à¥€'; + } else if (hour < 20) { + return 'सायंकाळी'; + } else { + return 'रातà¥à¤°à¥€'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ms-my.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ms-my.js new file mode 100644 index 0000000..56d5e91 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ms-my.js @@ -0,0 +1,80 @@ +// moment.js locale configuration +// locale : Bahasa Malaysia (ms-MY) +// author : Weldan Jamili : https://github.com/weldan + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ms-my', { + months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), + monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), + weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), + weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), + weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'LT.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] LT', + LLLL : 'dddd, D MMMM YYYY [pukul] LT' + }, + meridiemParse: /pagi|tengahari|petang|malam/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'tengahari') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'petang' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'tengahari'; + } else if (hours < 19) { + return 'petang'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Esok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kelmarin pukul] LT', + lastWeek : 'dddd [lepas pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lepas', + s : 'beberapa saat', + m : 'seminit', + mm : '%d minit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/my.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/my.js new file mode 100644 index 0000000..31f5c9e --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/my.js @@ -0,0 +1,89 @@ +// moment.js locale configuration +// locale : Burmese (my) +// author : Squar team, mysquar.com + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': 'á', + '2': 'á‚', + '3': 'áƒ', + '4': 'á„', + '5': 'á…', + '6': 'á†', + '7': 'á‡', + '8': 'áˆ', + '9': 'á‰', + '0': 'á€' + }, numberMap = { + 'á': '1', + 'á‚': '2', + 'áƒ': '3', + 'á„': '4', + 'á…': '5', + 'á†': '6', + 'á‡': '7', + 'áˆ': '8', + 'á‰': '9', + 'á€': '0' + }; + return moment.defineLocale('my', { + months: 'ဇန်နá€á€«á€›á€®_ဖေဖော်á€á€«á€›á€®_မá€á€º_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုá€á€º_စက်á€á€„်ဘာ_အောက်á€á€­á€¯á€˜á€¬_နိုá€á€„်ဘာ_ဒီဇင်ဘာ'.split('_'), + monthsShort: 'ဇန်_ဖေ_မá€á€º_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'), + weekdays: 'á€á€”င်္ဂနွေ_á€á€”င်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပá€á€±á€¸_သောကြာ_စနေ'.split('_'), + weekdaysShort: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), + weekdaysMin: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd D MMMM YYYY LT' + }, + calendar: { + sameDay: '[ယနေ.] LT [မှာ]', + nextDay: '[မနက်ဖြန်] LT [မှာ]', + nextWeek: 'dddd LT [မှာ]', + lastDay: '[မနေ.က] LT [မှာ]', + lastWeek: '[ပြီးá€á€²á€·á€žá€±á€¬] dddd LT [မှာ]', + sameElse: 'L' + }, + relativeTime: { + future: 'လာမည့် %s မှာ', + past: 'လွန်á€á€²á€·á€žá€±á€¬ %s က', + s: 'စက္ကန်.အနည်းငယ်', + m: 'á€á€…်မိနစ်', + mm: '%d မိနစ်', + h: 'á€á€…်နာရီ', + hh: '%d နာရီ', + d: 'á€á€…်ရက်', + dd: '%d ရက်', + M: 'á€á€…်လ', + MM: '%d လ', + y: 'á€á€…်နှစ်', + yy: '%d နှစ်' + }, + preparse: function (string) { + return string.replace(/[áá‚áƒá„á…á†á‡áˆá‰á€]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/nb.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/nb.js new file mode 100644 index 0000000..4764b50 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/nb.js @@ -0,0 +1,59 @@ +// moment.js locale configuration +// locale : norwegian bokmÃ¥l (nb) +// authors : Espen Hovlandsdal : https://github.com/rexxars +// Sigurd Gartmann : https://github.com/sigurdga + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('nb', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), + weekdaysShort : 'søn_man_tirs_ons_tors_fre_lør'.split('_'), + weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'H.mm', + LTS : 'LT.ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] LT', + LLLL : 'dddd D. MMMM YYYY [kl.] LT' + }, + calendar : { + sameDay: '[i dag kl.] LT', + nextDay: '[i morgen kl.] LT', + nextWeek: 'dddd [kl.] LT', + lastDay: '[i gÃ¥r kl.] LT', + lastWeek: '[forrige] dddd [kl.] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'for %s siden', + s : 'noen sekunder', + m : 'ett minutt', + mm : '%d minutter', + h : 'en time', + hh : '%d timer', + d : 'en dag', + dd : '%d dager', + M : 'en mÃ¥ned', + MM : '%d mÃ¥neder', + y : 'ett Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ne.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ne.js new file mode 100644 index 0000000..eb25ebe --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ne.js @@ -0,0 +1,121 @@ +// moment.js locale configuration +// locale : nepali/nepalese +// author : suvash : https://github.com/suvash + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.defineLocale('ne', { + months : 'जनवरी_फेबà¥à¤°à¥à¤µà¤°à¥€_मारà¥à¤š_अपà¥à¤°à¤¿à¤²_मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ_अगषà¥à¤Ÿ_सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°_अकà¥à¤Ÿà¥‹à¤¬à¤°_नोभेमà¥à¤¬à¤°_डिसेमà¥à¤¬à¤°'.split('_'), + monthsShort : 'जन._फेबà¥à¤°à¥._मारà¥à¤š_अपà¥à¤°à¤¿._मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ._अग._सेपà¥à¤Ÿ._अकà¥à¤Ÿà¥‹._नोभे._डिसे.'.split('_'), + weekdays : 'आइतबार_सोमबार_मङà¥à¤—लबार_बà¥à¤§à¤¬à¤¾à¤°_बिहिबार_शà¥à¤•à¥à¤°à¤¬à¤¾à¤°_शनिबार'.split('_'), + weekdaysShort : 'आइत._सोम._मङà¥à¤—ल._बà¥à¤§._बिहि._शà¥à¤•à¥à¤°._शनि.'.split('_'), + weekdaysMin : 'आइ._सो._मङà¥_बà¥._बि._शà¥._श.'.split('_'), + longDateFormat : { + LT : 'Aको h:mm बजे', + LTS : 'Aको h:mm:ss बजे', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /राती|बिहान|दिउà¤à¤¸à¥‹|बेलà¥à¤•à¤¾|साà¤à¤|राती/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'राती') { + return hour < 3 ? hour : hour + 12; + } else if (meridiem === 'बिहान') { + return hour; + } else if (meridiem === 'दिउà¤à¤¸à¥‹') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'बेलà¥à¤•à¤¾' || meridiem === 'साà¤à¤') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 3) { + return 'राती'; + } else if (hour < 10) { + return 'बिहान'; + } else if (hour < 15) { + return 'दिउà¤à¤¸à¥‹'; + } else if (hour < 18) { + return 'बेलà¥à¤•à¤¾'; + } else if (hour < 20) { + return 'साà¤à¤'; + } else { + return 'राती'; + } + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[भोली] LT', + nextWeek : '[आउà¤à¤¦à¥‹] dddd[,] LT', + lastDay : '[हिजो] LT', + lastWeek : '[गà¤à¤•à¥‹] dddd[,] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%sमा', + past : '%s अगाडी', + s : 'केही समय', + m : 'à¤à¤• मिनेट', + mm : '%d मिनेट', + h : 'à¤à¤• घणà¥à¤Ÿà¤¾', + hh : '%d घणà¥à¤Ÿà¤¾', + d : 'à¤à¤• दिन', + dd : '%d दिन', + M : 'à¤à¤• महिना', + MM : '%d महिना', + y : 'à¤à¤• बरà¥à¤·', + yy : '%d बरà¥à¤·' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/nl.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/nl.js new file mode 100644 index 0000000..9f4fdfe --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/nl.js @@ -0,0 +1,69 @@ +// moment.js locale configuration +// locale : dutch (nl) +// author : Joris Röling : https://github.com/jjupiter + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); + + return moment.defineLocale('nl', { + months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), + weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), + weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[vandaag om] LT', + nextDay: '[morgen om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[gisteren om] LT', + lastWeek: '[afgelopen] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'over %s', + past : '%s geleden', + s : 'een paar seconden', + m : 'één minuut', + mm : '%d minuten', + h : 'één uur', + hh : '%d uur', + d : 'één dag', + dd : '%d dagen', + M : 'één maand', + MM : '%d maanden', + y : 'één jaar', + yy : '%d jaar' + }, + ordinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/nn.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/nn.js new file mode 100644 index 0000000..d7a8238 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/nn.js @@ -0,0 +1,58 @@ +// moment.js locale configuration +// locale : norwegian nynorsk (nn) +// author : https://github.com/mechuwind + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('nn', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sundag_mÃ¥ndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'), + weekdaysShort : 'sun_mÃ¥n_tys_ons_tor_fre_lau'.split('_'), + weekdaysMin : 'su_mÃ¥_ty_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[I dag klokka] LT', + nextDay: '[I morgon klokka] LT', + nextWeek: 'dddd [klokka] LT', + lastDay: '[I gÃ¥r klokka] LT', + lastWeek: '[FøregÃ¥ande] dddd [klokka] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'for %s sidan', + s : 'nokre sekund', + m : 'eit minutt', + mm : '%d minutt', + h : 'ein time', + hh : '%d timar', + d : 'ein dag', + dd : '%d dagar', + M : 'ein mÃ¥nad', + MM : '%d mÃ¥nader', + y : 'eit Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/pl.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/pl.js new file mode 100644 index 0000000..418ca81 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/pl.js @@ -0,0 +1,100 @@ +// moment.js locale configuration +// locale : polish (pl) +// author : Rafal Hirsz : https://github.com/evoL + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var monthsNominative = 'styczeÅ„_luty_marzec_kwiecieÅ„_maj_czerwiec_lipiec_sierpieÅ„_wrzesieÅ„_październik_listopad_grudzieÅ„'.split('_'), + monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrzeÅ›nia_października_listopada_grudnia'.split('_'); + + function plural(n) { + return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1); + } + + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'minuta' : 'minutÄ™'; + case 'mm': + return result + (plural(number) ? 'minuty' : 'minut'); + case 'h': + return withoutSuffix ? 'godzina' : 'godzinÄ™'; + case 'hh': + return result + (plural(number) ? 'godziny' : 'godzin'); + case 'MM': + return result + (plural(number) ? 'miesiÄ…ce' : 'miesiÄ™cy'); + case 'yy': + return result + (plural(number) ? 'lata' : 'lat'); + } + } + + return moment.defineLocale('pl', { + months : function (momentToFormat, format) { + if (/D MMMM/.test(format)) { + return monthsSubjective[momentToFormat.month()]; + } else { + return monthsNominative[momentToFormat.month()]; + } + }, + monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'), + weekdays : 'niedziela_poniedziaÅ‚ek_wtorek_Å›roda_czwartek_piÄ…tek_sobota'.split('_'), + weekdaysShort : 'nie_pon_wt_Å›r_czw_pt_sb'.split('_'), + weekdaysMin : 'N_Pn_Wt_Åšr_Cz_Pt_So'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay: '[DziÅ› o] LT', + nextDay: '[Jutro o] LT', + nextWeek: '[W] dddd [o] LT', + lastDay: '[Wczoraj o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[W zeszÅ‚Ä… niedzielÄ™ o] LT'; + case 3: + return '[W zeszÅ‚Ä… Å›rodÄ™ o] LT'; + case 6: + return '[W zeszÅ‚Ä… sobotÄ™ o] LT'; + default: + return '[W zeszÅ‚y] dddd [o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : '%s temu', + s : 'kilka sekund', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : '1 dzieÅ„', + dd : '%d dni', + M : 'miesiÄ…c', + MM : translate, + y : 'rok', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/pt-br.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/pt-br.js new file mode 100644 index 0000000..813c2de --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/pt-br.js @@ -0,0 +1,58 @@ +// moment.js locale configuration +// locale : brazilian portuguese (pt-br) +// author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('pt-br', { + months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), + monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), + weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'), + weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'), + weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY [às] LT', + LLLL : 'dddd, D [de] MMMM [de] YYYY [às] LT' + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : 'em %s', + past : '%s atrás', + s : 'segundos', + m : 'um minuto', + mm : '%d minutos', + h : 'uma hora', + hh : '%d horas', + d : 'um dia', + dd : '%d dias', + M : 'um mês', + MM : '%d meses', + y : 'um ano', + yy : '%d anos' + }, + ordinalParse: /\d{1,2}º/, + ordinal : '%dº' + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/pt.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/pt.js new file mode 100644 index 0000000..4afd564 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/pt.js @@ -0,0 +1,62 @@ +// moment.js locale configuration +// locale : portuguese (pt) +// author : Jefferson : https://github.com/jalex79 + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('pt', { + months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), + monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), + weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'), + weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'), + weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY LT', + LLLL : 'dddd, D [de] MMMM [de] YYYY LT' + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : 'em %s', + past : 'há %s', + s : 'segundos', + m : 'um minuto', + mm : '%d minutos', + h : 'uma hora', + hh : '%d horas', + d : 'um dia', + dd : '%d dias', + M : 'um mês', + MM : '%d meses', + y : 'um ano', + yy : '%d anos' + }, + ordinalParse: /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ro.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ro.js new file mode 100644 index 0000000..fcc7d07 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ro.js @@ -0,0 +1,73 @@ +// moment.js locale configuration +// locale : romanian (ro) +// author : Vlad Gurdiga : https://github.com/gurdiga +// author : Valentin Agachi : https://github.com/avaly + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': 'minute', + 'hh': 'ore', + 'dd': 'zile', + 'MM': 'luni', + 'yy': 'ani' + }, + separator = ' '; + if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) { + separator = ' de '; + } + + return number + separator + format[key]; + } + + return moment.defineLocale('ro', { + months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'), + monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'), + weekdays : 'duminică_luni_marÈ›i_miercuri_joi_vineri_sâmbătă'.split('_'), + weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'), + weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY H:mm', + LLLL : 'dddd, D MMMM YYYY H:mm' + }, + calendar : { + sameDay: '[azi la] LT', + nextDay: '[mâine la] LT', + nextWeek: 'dddd [la] LT', + lastDay: '[ieri la] LT', + lastWeek: '[fosta] dddd [la] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'peste %s', + past : '%s în urmă', + s : 'câteva secunde', + m : 'un minut', + mm : relativeTimeWithPlural, + h : 'o oră', + hh : relativeTimeWithPlural, + d : 'o zi', + dd : relativeTimeWithPlural, + M : 'o lună', + MM : relativeTimeWithPlural, + y : 'un an', + yy : relativeTimeWithPlural + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ru.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ru.js new file mode 100644 index 0000000..5adfa9a --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ru.js @@ -0,0 +1,176 @@ +// moment.js locale configuration +// locale : russian (ru) +// author : Viktorminator : https://github.com/Viktorminator +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут', + 'hh': 'чаÑ_чаÑа_чаÑов', + 'dd': 'день_днÑ_дней', + 'MM': 'меÑÑц_меÑÑца_меÑÑцев', + 'yy': 'год_года_лет' + }; + if (key === 'm') { + return withoutSuffix ? 'минута' : 'минуту'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь'.split('_'), + 'accusative': 'ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function monthsShortCaseReplace(m, format) { + var monthsShort = { + 'nominative': 'Ñнв_фев_март_апр_май_июнь_июль_авг_Ñен_окт_ноÑ_дек'.split('_'), + 'accusative': 'Ñнв_фев_мар_апр_маÑ_июнÑ_июлÑ_авг_Ñен_окт_ноÑ_дек'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return monthsShort[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота'.split('_'), + 'accusative': 'воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу'.split('_') + }, + + nounCase = (/\[ ?[Вв] ?(?:прошлую|Ñледующую|Ñту)? ?\] ?dddd/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.defineLocale('ru', { + months : monthsCaseReplace, + monthsShort : monthsShortCaseReplace, + weekdays : weekdaysCaseReplace, + weekdaysShort : 'вÑ_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + weekdaysMin : 'вÑ_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + monthsParse : [/^Ñнв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[й|Ñ]/i, /^июн/i, /^июл/i, /^авг/i, /^Ñен/i, /^окт/i, /^ноÑ/i, /^дек/i], + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY г.', + LLL : 'D MMMM YYYY г., LT', + LLLL : 'dddd, D MMMM YYYY г., LT' + }, + calendar : { + sameDay: '[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT', + nextDay: '[Завтра в] LT', + lastDay: '[Вчера в] LT', + nextWeek: function () { + return this.day() === 2 ? '[Во] dddd [в] LT' : '[Ð’] dddd [в] LT'; + }, + lastWeek: function (now) { + if (now.week() !== this.week()) { + switch (this.day()) { + case 0: + return '[Ð’ прошлое] dddd [в] LT'; + case 1: + case 2: + case 4: + return '[Ð’ прошлый] dddd [в] LT'; + case 3: + case 5: + case 6: + return '[Ð’ прошлую] dddd [в] LT'; + } + } else { + if (this.day() === 2) { + return '[Во] dddd [в] LT'; + } else { + return '[Ð’] dddd [в] LT'; + } + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'через %s', + past : '%s назад', + s : 'неÑколько Ñекунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : 'чаÑ', + hh : relativeTimeWithPlural, + d : 'день', + dd : relativeTimeWithPlural, + M : 'меÑÑц', + MM : relativeTimeWithPlural, + y : 'год', + yy : relativeTimeWithPlural + }, + + meridiemParse: /ночи|утра|днÑ|вечера/i, + isPM : function (input) { + return /^(днÑ|вечера)$/.test(input); + }, + + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночи'; + } else if (hour < 12) { + return 'утра'; + } else if (hour < 17) { + return 'днÑ'; + } else { + return 'вечера'; + } + }, + + ordinalParse: /\d{1,2}-(й|го|Ñ)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + return number + '-й'; + case 'D': + return number + '-го'; + case 'w': + case 'W': + return number + '-Ñ'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/sk.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/sk.js new file mode 100644 index 0000000..f9d74c5 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/sk.js @@ -0,0 +1,158 @@ +// moment.js locale configuration +// locale : slovak (sk) +// author : Martin Minka : https://github.com/k2s +// based on work of petrbela : https://github.com/petrbela + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'), + monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_'); + + function plural(n) { + return (n > 1) && (n < 5); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami'; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minúty' : 'minút'); + } else { + return result + 'minútami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodín'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'deň' : 'dňom'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dni' : 'dní'); + } else { + return result + 'dňami'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'mesiace' : 'mesiacov'); + } else { + return result + 'mesiacmi'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokom'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'rokov'); + } else { + return result + 'rokmi'; + } + break; + } + } + + return moment.defineLocale('sk', { + months : months, + monthsShort : monthsShort, + monthsParse : (function (months, monthsShort) { + var i, _monthsParse = []; + for (i = 0; i < 12; i++) { + // use custom parser to solve problem with July (Äervenec) + _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); + } + return _monthsParse; + }(months, monthsShort)), + weekdays : 'nedeľa_pondelok_utorok_streda_Å¡tvrtok_piatok_sobota'.split('_'), + weekdaysShort : 'ne_po_ut_st_Å¡t_pi_so'.split('_'), + weekdaysMin : 'ne_po_ut_st_Å¡t_pi_so'.split('_'), + longDateFormat : { + LT: 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[dnes o] LT', + nextDay: '[zajtra o] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedeľu o] LT'; + case 1: + case 2: + return '[v] dddd [o] LT'; + case 3: + return '[v stredu o] LT'; + case 4: + return '[vo Å¡tvrtok o] LT'; + case 5: + return '[v piatok o] LT'; + case 6: + return '[v sobotu o] LT'; + } + }, + lastDay: '[vÄera o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulú nedeľu o] LT'; + case 1: + case 2: + return '[minulý] dddd [o] LT'; + case 3: + return '[minulú stredu o] LT'; + case 4: + case 5: + return '[minulý] dddd [o] LT'; + case 6: + return '[minulú sobotu o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pred %s', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/sl.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/sl.js new file mode 100644 index 0000000..232695f --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/sl.js @@ -0,0 +1,146 @@ +// moment.js locale configuration +// locale : slovenian (sl) +// author : Robert SedovÅ¡ek : https://github.com/sedovsek + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'ena minuta' : 'eno minuto'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2) { + result += 'minuti'; + } else if (number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minut'; + } + return result; + case 'h': + return withoutSuffix ? 'ena ura' : 'eno uro'; + case 'hh': + if (number === 1) { + result += 'ura'; + } else if (number === 2) { + result += 'uri'; + } else if (number === 3 || number === 4) { + result += 'ure'; + } else { + result += 'ur'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dni'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mesec'; + } else if (number === 2) { + result += 'meseca'; + } else if (number === 3 || number === 4) { + result += 'mesece'; + } else { + result += 'mesecev'; + } + return result; + case 'yy': + if (number === 1) { + result += 'leto'; + } else if (number === 2) { + result += 'leti'; + } else if (number === 3 || number === 4) { + result += 'leta'; + } else { + result += 'let'; + } + return result; + } + } + + return moment.defineLocale('sl', { + months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'), + monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'), + weekdays : 'nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota'.split('_'), + weekdaysShort : 'ned._pon._tor._sre._Äet._pet._sob.'.split('_'), + weekdaysMin : 'ne_po_to_sr_Äe_pe_so'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD. MM. YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[danes ob] LT', + nextDay : '[jutri ob] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[v] [nedeljo] [ob] LT'; + case 3: + return '[v] [sredo] [ob] LT'; + case 6: + return '[v] [soboto] [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[v] dddd [ob] LT'; + } + }, + lastDay : '[vÄeraj ob] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[prejÅ¡nja] dddd [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[prejÅ¡nji] dddd [ob] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'Äez %s', + past : '%s nazaj', + s : 'nekaj sekund', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'en dan', + dd : translate, + M : 'en mesec', + MM : translate, + y : 'eno leto', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/sq.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/sq.js new file mode 100644 index 0000000..9a5bc09 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/sq.js @@ -0,0 +1,67 @@ +// moment.js locale configuration +// locale : Albanian (sq) +// author : Flakërim Ismani : https://github.com/flakerimi +// author: Menelion Elensúle: https://github.com/Oire (tests) +// author : Oerd Cukalla : https://github.com/oerd (fixes) + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('sq', { + months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'), + monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'), + weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'), + weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'), + weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'), + meridiemParse: /PD|MD/, + isPM: function (input) { + return input.charAt(0) === 'M'; + }, + meridiem : function (hours, minutes, isLower) { + return hours < 12 ? 'PD' : 'MD'; + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Sot në] LT', + nextDay : '[Nesër në] LT', + nextWeek : 'dddd [në] LT', + lastDay : '[Dje në] LT', + lastWeek : 'dddd [e kaluar në] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'në %s', + past : '%s më parë', + s : 'disa sekonda', + m : 'një minutë', + mm : '%d minuta', + h : 'një orë', + hh : '%d orë', + d : 'një ditë', + dd : '%d ditë', + M : 'një muaj', + MM : '%d muaj', + y : 'një vit', + yy : '%d vite' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/sr-cyrl.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/sr-cyrl.js new file mode 100644 index 0000000..57619b6 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/sr-cyrl.js @@ -0,0 +1,107 @@ +// moment.js locale configuration +// locale : Serbian-cyrillic (sr-cyrl) +// author : Milan JanaÄković : https://github.com/milan-j + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var translator = { + words: { //Different grammatical cases + m: ['један минут', 'једне минуте'], + mm: ['минут', 'минуте', 'минута'], + h: ['један Ñат', 'једног Ñата'], + hh: ['Ñат', 'Ñата', 'Ñати'], + dd: ['дан', 'дана', 'дана'], + MM: ['меÑец', 'меÑеца', 'меÑеци'], + yy: ['година', 'године', 'година'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } + }; + + return moment.defineLocale('sr-cyrl', { + months: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'авгуÑÑ‚', 'Ñептембар', 'октобар', 'новембар', 'децембар'], + monthsShort: ['јан.', 'феб.', 'мар.', 'апр.', 'мај', 'јун', 'јул', 'авг.', 'Ñеп.', 'окт.', 'нов.', 'дец.'], + weekdays: ['недеља', 'понедељак', 'уторак', 'Ñреда', 'четвртак', 'петак', 'Ñубота'], + weekdaysShort: ['нед.', 'пон.', 'уто.', 'Ñре.', 'чет.', 'пет.', 'Ñуб.'], + weekdaysMin: ['не', 'по', 'ут', 'ÑÑ€', 'че', 'пе', 'Ñу'], + longDateFormat: { + LT: 'H:mm', + LTS : 'LT:ss', + L: 'DD. MM. YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY LT', + LLLL: 'dddd, D. MMMM YYYY LT' + }, + calendar: { + sameDay: '[Ð´Ð°Ð½Ð°Ñ Ñƒ] LT', + nextDay: '[Ñутра у] LT', + + nextWeek: function () { + switch (this.day()) { + case 0: + return '[у] [недељу] [у] LT'; + case 3: + return '[у] [Ñреду] [у] LT'; + case 6: + return '[у] [Ñуботу] [у] LT'; + case 1: + case 2: + case 4: + case 5: + return '[у] dddd [у] LT'; + } + }, + lastDay : '[јуче у] LT', + lastWeek : function () { + var lastWeekDays = [ + '[прошле] [недеље] [у] LT', + '[прошлог] [понедељка] [у] LT', + '[прошлог] [уторка] [у] LT', + '[прошле] [Ñреде] [у] LT', + '[прошлог] [четвртка] [у] LT', + '[прошлог] [петка] [у] LT', + '[прошле] [Ñуботе] [у] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'за %s', + past : 'пре %s', + s : 'неколико Ñекунди', + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'дан', + dd : translator.translate, + M : 'меÑец', + MM : translator.translate, + y : 'годину', + yy : translator.translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/sr.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/sr.js new file mode 100644 index 0000000..6f14284 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/sr.js @@ -0,0 +1,107 @@ +// moment.js locale configuration +// locale : Serbian-latin (sr) +// author : Milan JanaÄković : https://github.com/milan-j + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var translator = { + words: { //Different grammatical cases + m: ['jedan minut', 'jedne minute'], + mm: ['minut', 'minute', 'minuta'], + h: ['jedan sat', 'jednog sata'], + hh: ['sat', 'sata', 'sati'], + dd: ['dan', 'dana', 'dana'], + MM: ['mesec', 'meseca', 'meseci'], + yy: ['godina', 'godine', 'godina'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } + }; + + return moment.defineLocale('sr', { + months: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'], + monthsShort: ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun', 'jul', 'avg.', 'sep.', 'okt.', 'nov.', 'dec.'], + weekdays: ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'Äetvrtak', 'petak', 'subota'], + weekdaysShort: ['ned.', 'pon.', 'uto.', 'sre.', 'Äet.', 'pet.', 'sub.'], + weekdaysMin: ['ne', 'po', 'ut', 'sr', 'Äe', 'pe', 'su'], + longDateFormat: { + LT: 'H:mm', + LTS : 'LT:ss', + L: 'DD. MM. YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY LT', + LLLL: 'dddd, D. MMMM YYYY LT' + }, + calendar: { + sameDay: '[danas u] LT', + nextDay: '[sutra u] LT', + + nextWeek: function () { + switch (this.day()) { + case 0: + return '[u] [nedelju] [u] LT'; + case 3: + return '[u] [sredu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄe u] LT', + lastWeek : function () { + var lastWeekDays = [ + '[proÅ¡le] [nedelje] [u] LT', + '[proÅ¡log] [ponedeljka] [u] LT', + '[proÅ¡log] [utorka] [u] LT', + '[proÅ¡le] [srede] [u] LT', + '[proÅ¡log] [Äetvrtka] [u] LT', + '[proÅ¡log] [petka] [u] LT', + '[proÅ¡le] [subote] [u] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pre %s', + s : 'nekoliko sekundi', + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'dan', + dd : translator.translate, + M : 'mesec', + MM : translator.translate, + y : 'godinu', + yy : translator.translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/sv.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/sv.js new file mode 100644 index 0000000..6e14958 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/sv.js @@ -0,0 +1,65 @@ +// moment.js locale configuration +// locale : swedish (sv) +// author : Jens Alm : https://github.com/ulmus + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('sv', { + months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'söndag_mÃ¥ndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'), + weekdaysShort : 'sön_mÃ¥n_tis_ons_tor_fre_lör'.split('_'), + weekdaysMin : 'sö_mÃ¥_ti_on_to_fr_lö'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Idag] LT', + nextDay: '[Imorgon] LT', + lastDay: '[IgÃ¥r] LT', + nextWeek: 'dddd LT', + lastWeek: '[Förra] dddd[en] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'för %s sedan', + s : 'nÃ¥gra sekunder', + m : 'en minut', + mm : '%d minuter', + h : 'en timme', + hh : '%d timmar', + d : 'en dag', + dd : '%d dagar', + M : 'en mÃ¥nad', + MM : '%d mÃ¥nader', + y : 'ett Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}(e|a)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'e' : + (b === 1) ? 'a' : + (b === 2) ? 'a' : + (b === 3) ? 'e' : 'e'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ta.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ta.js new file mode 100644 index 0000000..8c86b4b --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/ta.js @@ -0,0 +1,130 @@ +// moment.js locale configuration +// locale : tamil (ta) +// author : Arjunkumar Krishnamoorthy : https://github.com/tk120404 + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + /*var symbolMap = { + '1': '௧', + '2': '௨', + '3': '௩', + '4': '௪', + '5': '௫', + '6': '௬', + '7': '௭', + '8': '௮', + '9': '௯', + '0': '௦' + }, + numberMap = { + '௧': '1', + '௨': '2', + '௩': '3', + '௪': '4', + '௫': '5', + '௬': '6', + '௭': '7', + '௮': '8', + '௯': '9', + '௦': '0' + }; */ + + return moment.defineLocale('ta', { + months : 'ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯'.split('_'), + monthsShort : 'ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯'.split('_'), + weekdays : 'ஞாயிறà¯à®±à¯à®•à¯à®•à®¿à®´à®®à¯ˆ_திஙà¯à®•à®Ÿà¯à®•à®¿à®´à®®à¯ˆ_செவà¯à®µà®¾à®¯à¯à®•à®¿à®´à®®à¯ˆ_பà¯à®¤à®©à¯à®•à®¿à®´à®®à¯ˆ_வியாழகà¯à®•à®¿à®´à®®à¯ˆ_வெளà¯à®³à®¿à®•à¯à®•à®¿à®´à®®à¯ˆ_சனிகà¯à®•à®¿à®´à®®à¯ˆ'.split('_'), + weekdaysShort : 'ஞாயிறà¯_திஙà¯à®•à®³à¯_செவà¯à®µà®¾à®¯à¯_பà¯à®¤à®©à¯_வியாழனà¯_வெளà¯à®³à®¿_சனி'.split('_'), + weekdaysMin : 'ஞா_தி_செ_பà¯_வி_வெ_ச'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[இனà¯à®±à¯] LT', + nextDay : '[நாளை] LT', + nextWeek : 'dddd, LT', + lastDay : '[நேறà¯à®±à¯] LT', + lastWeek : '[கடநà¯à®¤ வாரமà¯] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s இலà¯', + past : '%s à®®à¯à®©à¯', + s : 'ஒர௠சில விநாடிகளà¯', + m : 'ஒர௠நிமிடமà¯', + mm : '%d நிமிடஙà¯à®•à®³à¯', + h : 'ஒர௠மணி நேரமà¯', + hh : '%d மணி நேரமà¯', + d : 'ஒர௠நாளà¯', + dd : '%d நாடà¯à®•à®³à¯', + M : 'ஒர௠மாதமà¯', + MM : '%d மாதஙà¯à®•à®³à¯', + y : 'ஒர௠வரà¯à®Ÿà®®à¯', + yy : '%d ஆணà¯à®Ÿà¯à®•à®³à¯' + }, +/* preparse: function (string) { + return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + },*/ + ordinalParse: /\d{1,2}வதà¯/, + ordinal : function (number) { + return number + 'வதà¯'; + }, + + + // refer http://ta.wikipedia.org/s/1er1 + meridiemParse: /யாமமà¯|வைகறை|காலை|நணà¯à®ªà®•à®²à¯|எறà¯à®ªà®¾à®Ÿà¯|மாலை/, + meridiem : function (hour, minute, isLower) { + if (hour < 2) { + return ' யாமமà¯'; + } else if (hour < 6) { + return ' வைகறை'; // வைகறை + } else if (hour < 10) { + return ' காலை'; // காலை + } else if (hour < 14) { + return ' நணà¯à®ªà®•à®²à¯'; // நணà¯à®ªà®•à®²à¯ + } else if (hour < 18) { + return ' எறà¯à®ªà®¾à®Ÿà¯'; // எறà¯à®ªà®¾à®Ÿà¯ + } else if (hour < 22) { + return ' மாலை'; // மாலை + } else { + return ' யாமமà¯'; + } + }, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'யாமமà¯') { + return hour < 2 ? hour : hour + 12; + } else if (meridiem === 'வைகறை' || meridiem === 'காலை') { + return hour; + } else if (meridiem === 'நணà¯à®ªà®•à®²à¯') { + return hour >= 10 ? hour : hour + 12; + } else { + return hour + 12; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/th.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/th.js new file mode 100644 index 0000000..ec9b840 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/th.js @@ -0,0 +1,63 @@ +// moment.js locale configuration +// locale : thai (th) +// author : Kridsada Thanabulpong : https://github.com/sirn + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('th', { + months : 'มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม'.split('_'), + monthsShort : 'มà¸à¸£à¸²_à¸à¸¸à¸¡à¸ à¸²_มีนา_เมษา_พฤษภา_มิถุนา_à¸à¸£à¸à¸Žà¸²_สิงหา_à¸à¸±à¸™à¸¢à¸²_ตุลา_พฤศจิà¸à¸²_ธันวา'.split('_'), + weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์'.split('_'), + weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์'.split('_'), // yes, three characters difference + weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'), + longDateFormat : { + LT : 'H นาฬิà¸à¸² m นาที', + LTS : 'LT s วินาที', + L : 'YYYY/MM/DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY เวลา LT', + LLLL : 'วันddddที่ D MMMM YYYY เวลา LT' + }, + meridiemParse: /à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง|หลังเที่ยง/, + isPM: function (input) { + return input === 'หลังเที่ยง'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง'; + } else { + return 'หลังเที่ยง'; + } + }, + calendar : { + sameDay : '[วันนี้ เวลา] LT', + nextDay : '[พรุ่งนี้ เวลา] LT', + nextWeek : 'dddd[หน้า เวลา] LT', + lastDay : '[เมื่อวานนี้ เวลา] LT', + lastWeek : '[วัน]dddd[ที่à¹à¸¥à¹‰à¸§ เวลา] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'อีภ%s', + past : '%sที่à¹à¸¥à¹‰à¸§', + s : 'ไม่à¸à¸µà¹ˆà¸§à¸´à¸™à¸²à¸—ี', + m : '1 นาที', + mm : '%d นาที', + h : '1 ชั่วโมง', + hh : '%d ชั่วโมง', + d : '1 วัน', + dd : '%d วัน', + M : '1 เดือน', + MM : '%d เดือน', + y : '1 ปี', + yy : '%d ปี' + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/tl-ph.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/tl-ph.js new file mode 100644 index 0000000..40dbb07 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/tl-ph.js @@ -0,0 +1,60 @@ +// moment.js locale configuration +// locale : Tagalog/Filipino (tl-ph) +// author : Dan Hagman + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('tl-ph', { + months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'), + monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'), + weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'), + weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'), + weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'MM/D/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY LT', + LLLL : 'dddd, MMMM DD, YYYY LT' + }, + calendar : { + sameDay: '[Ngayon sa] LT', + nextDay: '[Bukas sa] LT', + nextWeek: 'dddd [sa] LT', + lastDay: '[Kahapon sa] LT', + lastWeek: 'dddd [huling linggo] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'sa loob ng %s', + past : '%s ang nakalipas', + s : 'ilang segundo', + m : 'isang minuto', + mm : '%d minuto', + h : 'isang oras', + hh : '%d oras', + d : 'isang araw', + dd : '%d araw', + M : 'isang buwan', + MM : '%d buwan', + y : 'isang taon', + yy : '%d taon' + }, + ordinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/tr.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/tr.js new file mode 100644 index 0000000..cd0a746 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/tr.js @@ -0,0 +1,94 @@ +// moment.js locale configuration +// locale : turkish (tr) +// authors : Erhan Gundogan : https://github.com/erhangundogan, +// Burak YiÄŸit Kaya: https://github.com/BYK + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var suffixes = { + 1: '\'inci', + 5: '\'inci', + 8: '\'inci', + 70: '\'inci', + 80: '\'inci', + + 2: '\'nci', + 7: '\'nci', + 20: '\'nci', + 50: '\'nci', + + 3: '\'üncü', + 4: '\'üncü', + 100: '\'üncü', + + 6: '\'ncı', + + 9: '\'uncu', + 10: '\'uncu', + 30: '\'uncu', + + 60: '\'ıncı', + 90: '\'ıncı' + }; + + return moment.defineLocale('tr', { + months : 'Ocak_Åžubat_Mart_Nisan_Mayıs_Haziran_Temmuz_AÄŸustos_Eylül_Ekim_Kasım_Aralık'.split('_'), + monthsShort : 'Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara'.split('_'), + weekdays : 'Pazar_Pazartesi_Salı_ÇarÅŸamba_PerÅŸembe_Cuma_Cumartesi'.split('_'), + weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'), + weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[bugün saat] LT', + nextDay : '[yarın saat] LT', + nextWeek : '[haftaya] dddd [saat] LT', + lastDay : '[dün] LT', + lastWeek : '[geçen hafta] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s sonra', + past : '%s önce', + s : 'birkaç saniye', + m : 'bir dakika', + mm : '%d dakika', + h : 'bir saat', + hh : '%d saat', + d : 'bir gün', + dd : '%d gün', + M : 'bir ay', + MM : '%d ay', + y : 'bir yıl', + yy : '%d yıl' + }, + ordinalParse: /\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/, + ordinal : function (number) { + if (number === 0) { // special case for zero + return number + '\'ıncı'; + } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + + return number + (suffixes[a] || suffixes[b] || suffixes[c]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/tzm-latn.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/tzm-latn.js new file mode 100644 index 0000000..34592b4 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/tzm-latn.js @@ -0,0 +1,56 @@ +// moment.js locale configuration +// locale : Morocco Central Atlas TamaziÉ£t in Latin (tzm-latn) +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('tzm-latn', { + months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), + weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), + weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[asdkh g] LT', + nextDay: '[aska g] LT', + nextWeek: 'dddd [g] LT', + lastDay: '[assant g] LT', + lastWeek: 'dddd [g] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dadkh s yan %s', + past : 'yan %s', + s : 'imik', + m : 'minuá¸', + mm : '%d minuá¸', + h : 'saÉ›a', + hh : '%d tassaÉ›in', + d : 'ass', + dd : '%d ossan', + M : 'ayowr', + MM : '%d iyyirn', + y : 'asgas', + yy : '%d isgasn' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/tzm.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/tzm.js new file mode 100644 index 0000000..9591521 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/tzm.js @@ -0,0 +1,56 @@ +// moment.js locale configuration +// locale : Morocco Central Atlas TamaziÉ£t (tzm) +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('tzm', { + months : 'ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”'.split('_'), + monthsShort : 'ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”'.split('_'), + weekdays : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + weekdaysShort : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS: 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[ⴰⵙⴷⵅ â´´] LT', + nextDay: '[ⴰⵙⴽⴰ â´´] LT', + nextWeek: 'dddd [â´´] LT', + lastDay: '[ⴰⵚⴰâµâµœ â´´] LT', + lastWeek: 'dddd [â´´] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'â´·â´°â´·âµ… âµ™ ⵢⴰⵠ%s', + past : 'ⵢⴰⵠ%s', + s : 'ⵉⵎⵉⴽ', + m : 'ⵎⵉâµâµ“â´º', + mm : '%d ⵎⵉâµâµ“â´º', + h : 'ⵙⴰⵄⴰ', + hh : '%d ⵜⴰⵙⵙⴰⵄⵉâµ', + d : 'ⴰⵙⵙ', + dd : '%d oⵙⵙⴰâµ', + M : 'â´°âµ¢oⵓⵔ', + MM : '%d ⵉⵢⵢⵉⵔâµ', + y : 'ⴰⵙⴳⴰⵙ', + yy : '%d ⵉⵙⴳⴰⵙâµ' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/uk.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/uk.js new file mode 100644 index 0000000..84e11ce --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/uk.js @@ -0,0 +1,163 @@ +// moment.js locale configuration +// locale : ukrainian (uk) +// author : zemlanin : https://github.com/zemlanin +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': 'хвилина_хвилини_хвилин', + 'hh': 'година_години_годин', + 'dd': 'день_дні_днів', + 'MM': 'міÑÑць_міÑÑці_міÑÑців', + 'yy': 'рік_роки_років' + }; + if (key === 'm') { + return withoutSuffix ? 'хвилина' : 'хвилину'; + } + else if (key === 'h') { + return withoutSuffix ? 'година' : 'годину'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень'.split('_'), + 'accusative': 'ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ'.split('_') + }, + + nounCase = (/D[oD]? *MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота'.split('_'), + 'accusative': 'неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу'.split('_'), + 'genitive': 'неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи'.split('_') + }, + + nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ? + 'accusative' : + ((/\[?(?:минулої|наÑтупної)? ?\] ?dddd/).test(format) ? + 'genitive' : + 'nominative'); + + return weekdays[nounCase][m.day()]; + } + + function processHoursFunction(str) { + return function () { + return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT'; + }; + } + + return moment.defineLocale('uk', { + months : monthsCaseReplace, + monthsShort : 'Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + weekdaysMin : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY Ñ€.', + LLL : 'D MMMM YYYY Ñ€., LT', + LLLL : 'dddd, D MMMM YYYY Ñ€., LT' + }, + calendar : { + sameDay: processHoursFunction('[Сьогодні '), + nextDay: processHoursFunction('[Завтра '), + lastDay: processHoursFunction('[Вчора '), + nextWeek: processHoursFunction('[У] dddd ['), + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return processHoursFunction('[Минулої] dddd [').call(this); + case 1: + case 2: + case 4: + return processHoursFunction('[Минулого] dddd [').call(this); + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'за %s', + past : '%s тому', + s : 'декілька Ñекунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : 'годину', + hh : relativeTimeWithPlural, + d : 'день', + dd : relativeTimeWithPlural, + M : 'міÑÑць', + MM : relativeTimeWithPlural, + y : 'рік', + yy : relativeTimeWithPlural + }, + + // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason + + meridiemParse: /ночі|ранку|днÑ|вечора/, + isPM: function (input) { + return /^(днÑ|вечора)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночі'; + } else if (hour < 12) { + return 'ранку'; + } else if (hour < 17) { + return 'днÑ'; + } else { + return 'вечора'; + } + }, + + ordinalParse: /\d{1,2}-(й|го)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return number + '-й'; + case 'D': + return number + '-го'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/uz.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/uz.js new file mode 100644 index 0000000..139e4de --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/uz.js @@ -0,0 +1,56 @@ +// moment.js locale configuration +// locale : uzbek (uz) +// author : Sardor Muminov : https://github.com/muminoff + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('uz', { + months : 'Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь'.split('_'), + monthsShort : 'Ñнв_фев_мар_апр_май_июн_июл_авг_Ñен_окт_ноÑ_дек'.split('_'), + weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'), + weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'), + weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'D MMMM YYYY, dddd LT' + }, + calendar : { + sameDay : '[Бугун Ñоат] LT [да]', + nextDay : '[Эртага] LT [да]', + nextWeek : 'dddd [куни Ñоат] LT [да]', + lastDay : '[Кеча Ñоат] LT [да]', + lastWeek : '[Утган] dddd [куни Ñоат] LT [да]', + sameElse : 'L' + }, + relativeTime : { + future : 'Якин %s ичида', + past : 'Бир неча %s олдин', + s : 'фурÑат', + m : 'бир дакика', + mm : '%d дакика', + h : 'бир Ñоат', + hh : '%d Ñоат', + d : 'бир кун', + dd : '%d кун', + M : 'бир ой', + MM : '%d ой', + y : 'бир йил', + yy : '%d йил' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/vi.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/vi.js new file mode 100644 index 0000000..15ec7dd --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/vi.js @@ -0,0 +1,64 @@ +// moment.js locale configuration +// locale : vietnamese (vi) +// author : Bang Nguyen : https://github.com/bangnk + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('vi', { + months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'), + monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'), + weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tÆ°_thứ năm_thứ sáu_thứ bảy'.split('_'), + weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM [năm] YYYY', + LLL : 'D MMMM [năm] YYYY LT', + LLLL : 'dddd, D MMMM [năm] YYYY LT', + l : 'DD/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY LT', + llll : 'ddd, D MMM YYYY LT' + }, + calendar : { + sameDay: '[Hôm nay lúc] LT', + nextDay: '[Ngày mai lúc] LT', + nextWeek: 'dddd [tuần tá»›i lúc] LT', + lastDay: '[Hôm qua lúc] LT', + lastWeek: 'dddd [tuần rồi lúc] LT', + sameElse: 'L' + }, + relativeTime : { + future : '%s tá»›i', + past : '%s trÆ°á»›c', + s : 'vài giây', + m : 'má»™t phút', + mm : '%d phút', + h : 'má»™t giá»', + hh : '%d giá»', + d : 'má»™t ngày', + dd : '%d ngày', + M : 'má»™t tháng', + MM : '%d tháng', + y : 'má»™t năm', + yy : '%d năm' + }, + ordinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/zh-cn.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/zh-cn.js new file mode 100644 index 0000000..da83416 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/zh-cn.js @@ -0,0 +1,125 @@ +// moment.js locale configuration +// locale : chinese (zh-cn) +// author : suupic : https://github.com/suupic +// author : Zeno Zeng : https://github.com/zenozeng + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('zh-cn', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'), + weekdaysMin : 'æ—¥_一_二_三_å››_五_å…­'.split('_'), + longDateFormat : { + LT : 'Ah点mm', + LTS : 'Ah点m分s秒', + L : 'YYYY-MM-DD', + LL : 'YYYYå¹´MMMDæ—¥', + LLL : 'YYYYå¹´MMMDæ—¥LT', + LLLL : 'YYYYå¹´MMMDæ—¥ddddLT', + l : 'YYYY-MM-DD', + ll : 'YYYYå¹´MMMDæ—¥', + lll : 'YYYYå¹´MMMDæ—¥LT', + llll : 'YYYYå¹´MMMDæ—¥ddddLT' + }, + meridiemParse: /凌晨|早上|上åˆ|中åˆ|下åˆ|晚上/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '凌晨' || meridiem === '早上' || + meridiem === '上åˆ') { + return hour; + } else if (meridiem === '下åˆ' || meridiem === '晚上') { + return hour + 12; + } else { + // '中åˆ' + return hour >= 11 ? hour : hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return '凌晨'; + } else if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上åˆ'; + } else if (hm < 1230) { + return '中åˆ'; + } else if (hm < 1800) { + return '下åˆ'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : function () { + return this.minutes() === 0 ? '[今天]Ah[点整]' : '[今天]LT'; + }, + nextDay : function () { + return this.minutes() === 0 ? '[明天]Ah[点整]' : '[明天]LT'; + }, + lastDay : function () { + return this.minutes() === 0 ? '[昨天]Ah[点整]' : '[昨天]LT'; + }, + nextWeek : function () { + var startOfWeek, prefix; + startOfWeek = moment().startOf('week'); + prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]'; + return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; + }, + lastWeek : function () { + var startOfWeek, prefix; + startOfWeek = moment().startOf('week'); + prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]'; + return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; + }, + sameElse : 'LL' + }, + ordinalParse: /\d{1,2}(æ—¥|月|周)/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + 'æ—¥'; + case 'M': + return number + '月'; + case 'w': + case 'W': + return number + '周'; + default: + return number; + } + }, + relativeTime : { + future : '%s内', + past : '%så‰', + s : '几秒', + m : '1分钟', + mm : '%d分钟', + h : '1å°æ—¶', + hh : '%då°æ—¶', + d : '1天', + dd : '%d天', + M : '1个月', + MM : '%d个月', + y : '1å¹´', + yy : '%då¹´' + }, + week : { + // GB/T 7408-1994《数æ®å…ƒå’Œäº¤æ¢æ ¼å¼Â·ä¿¡æ¯äº¤æ¢Â·æ—¥æœŸå’Œæ—¶é—´è¡¨ç¤ºæ³•ã€‹ä¸ŽISO 8601:1988等效 + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/zh-tw.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/zh-tw.js new file mode 100644 index 0000000..75c974d --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/locale/zh-tw.js @@ -0,0 +1,99 @@ +// moment.js locale configuration +// locale : traditional chinese (zh-tw) +// author : Ben : https://github.com/ben-lin + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('zh-tw', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), + weekdaysMin : 'æ—¥_一_二_三_å››_五_å…­'.split('_'), + longDateFormat : { + LT : 'Ah點mm', + LTS : 'Ah點m分s秒', + L : 'YYYYå¹´MMMDæ—¥', + LL : 'YYYYå¹´MMMDæ—¥', + LLL : 'YYYYå¹´MMMDæ—¥LT', + LLLL : 'YYYYå¹´MMMDæ—¥ddddLT', + l : 'YYYYå¹´MMMDæ—¥', + ll : 'YYYYå¹´MMMDæ—¥', + lll : 'YYYYå¹´MMMDæ—¥LT', + llll : 'YYYYå¹´MMMDæ—¥ddddLT' + }, + meridiemParse: /早上|上åˆ|中åˆ|下åˆ|晚上/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '早上' || meridiem === '上åˆ') { + return hour; + } else if (meridiem === '中åˆ') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === '下åˆ' || meridiem === '晚上') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上åˆ'; + } else if (hm < 1230) { + return '中åˆ'; + } else if (hm < 1800) { + return '下åˆ'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : '[今天]LT', + nextDay : '[明天]LT', + nextWeek : '[下]ddddLT', + lastDay : '[昨天]LT', + lastWeek : '[上]ddddLT', + sameElse : 'L' + }, + ordinalParse: /\d{1,2}(æ—¥|月|週)/, + ordinal : function (number, period) { + switch (period) { + case 'd' : + case 'D' : + case 'DDD' : + return number + 'æ—¥'; + case 'M' : + return number + '月'; + case 'w' : + case 'W' : + return number + '週'; + default : + return number; + } + }, + relativeTime : { + future : '%så…§', + past : '%så‰', + s : '幾秒', + m : '一分é˜', + mm : '%d分é˜', + h : '一å°æ™‚', + hh : '%då°æ™‚', + d : '一天', + dd : '%d天', + M : '一個月', + MM : '%d個月', + y : '一年', + yy : '%då¹´' + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/min/locales.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/min/locales.js new file mode 100644 index 0000000..e93562b --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/min/locales.js @@ -0,0 +1,7306 @@ +// moment.js locale configuration +// locale : afrikaans (af) +// author : Werner Mollentze : https://github.com/wernerm + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('af', { + months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'), + weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'), + weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'), + meridiemParse: /vm|nm/i, + isPM : function (input) { + return /^nm$/i.test(input); + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower ? 'vm' : 'VM'; + } else { + return isLower ? 'nm' : 'NM'; + } + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Vandag om] LT', + nextDay : '[Môre om] LT', + nextWeek : 'dddd [om] LT', + lastDay : '[Gister om] LT', + lastWeek : '[Laas] dddd [om] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'oor %s', + past : '%s gelede', + s : '\'n paar sekondes', + m : '\'n minuut', + mm : '%d minute', + h : '\'n uur', + hh : '%d ure', + d : '\'n dag', + dd : '%d dae', + M : '\'n maand', + MM : '%d maande', + y : '\'n jaar', + yy : '%d jaar' + }, + ordinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter + }, + week : { + dow : 1, // Maandag is die eerste dag van die week. + doy : 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar. + } + }); +})); + +// moment.js locale configuration +// locale : Moroccan Arabic (ar-ma) +// author : ElFadili Yassine : https://github.com/ElFadiliY +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ar-ma', { + months : 'يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + monthsShort : 'يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'ÙÙŠ %s', + past : 'منذ %s', + s : 'ثوان', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Arabic Saudi Arabia (ar-sa) +// author : Suhail Alkowaileet : https://github.com/xsoh + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': 'Ù¡', + '2': 'Ù¢', + '3': 'Ù£', + '4': 'Ù¤', + '5': 'Ù¥', + '6': 'Ù¦', + '7': 'Ù§', + '8': 'Ù¨', + '9': 'Ù©', + '0': 'Ù ' + }, numberMap = { + 'Ù¡': '1', + 'Ù¢': '2', + 'Ù£': '3', + 'Ù¤': '4', + 'Ù¥': '5', + 'Ù¦': '6', + 'Ù§': '7', + 'Ù¨': '8', + 'Ù©': '9', + 'Ù ': '0' + }; + + return moment.defineLocale('ar-sa', { + months : 'يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + monthsShort : 'يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + meridiemParse: /ص|Ù…/, + isPM : function (input) { + return 'Ù…' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'Ù…'; + } + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'ÙÙŠ %s', + past : 'منذ %s', + s : 'ثوان', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + preparse: function (string) { + return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return numberMap[match]; + }).replace(/ØŒ/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, 'ØŒ'); + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Tunisian Arabic (ar-tn) + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ar-tn', { + months: 'جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + monthsShort: 'جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin: 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS: 'LT:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd D MMMM YYYY LT' + }, + calendar: { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'ÙÙŠ %s', + past: 'منذ %s', + s: 'ثوان', + m: 'دقيقة', + mm: '%d دقائق', + h: 'ساعة', + hh: '%d ساعات', + d: 'يوم', + dd: '%d أيام', + M: 'شهر', + MM: '%d أشهر', + y: 'سنة', + yy: '%d سنوات' + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// Locale: Arabic (ar) +// Author: Abdel Said: https://github.com/abdelsaid +// Changes in months, weekdays: Ahmed Elkhatib +// Native plural forms: forabi https://github.com/forabi + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': 'Ù¡', + '2': 'Ù¢', + '3': 'Ù£', + '4': 'Ù¤', + '5': 'Ù¥', + '6': 'Ù¦', + '7': 'Ù§', + '8': 'Ù¨', + '9': 'Ù©', + '0': 'Ù ' + }, numberMap = { + 'Ù¡': '1', + 'Ù¢': '2', + 'Ù£': '3', + 'Ù¤': '4', + 'Ù¥': '5', + 'Ù¦': '6', + 'Ù§': '7', + 'Ù¨': '8', + 'Ù©': '9', + 'Ù ': '0' + }, pluralForm = function (n) { + return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5; + }, plurals = { + s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'], + m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'], + h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'], + d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'], + M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'], + y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام'] + }, pluralize = function (u) { + return function (number, withoutSuffix, string, isFuture) { + var f = pluralForm(number), + str = plurals[u][pluralForm(number)]; + if (f === 2) { + str = str[withoutSuffix ? 0 : 1]; + } + return str.replace(/%d/i, number); + }; + }, months = [ + 'كانون الثاني يناير', + 'شباط Ùبراير', + 'آذار مارس', + 'نيسان أبريل', + 'أيار مايو', + 'حزيران يونيو', + 'تموز يوليو', + 'آب أغسطس', + 'أيلول سبتمبر', + 'تشرين الأول أكتوبر', + 'تشرين الثاني نوÙمبر', + 'كانون الأول ديسمبر' + ]; + + return moment.defineLocale('ar', { + months : months, + monthsShort : months, + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + meridiemParse: /ص|Ù…/, + isPM : function (input) { + return 'Ù…' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'Ù…'; + } + }, + calendar : { + sameDay: '[اليوم عند الساعة] LT', + nextDay: '[غدًا عند الساعة] LT', + nextWeek: 'dddd [عند الساعة] LT', + lastDay: '[أمس عند الساعة] LT', + lastWeek: 'dddd [عند الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'بعد %s', + past : 'منذ %s', + s : pluralize('s'), + m : pluralize('m'), + mm : pluralize('m'), + h : pluralize('h'), + hh : pluralize('h'), + d : pluralize('d'), + dd : pluralize('d'), + M : pluralize('M'), + MM : pluralize('M'), + y : pluralize('y'), + yy : pluralize('y') + }, + preparse: function (string) { + return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return numberMap[match]; + }).replace(/ØŒ/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, 'ØŒ'); + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : azerbaijani (az) +// author : topchiyev : https://github.com/topchiyev + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var suffixes = { + 1: '-inci', + 5: '-inci', + 8: '-inci', + 70: '-inci', + 80: '-inci', + + 2: '-nci', + 7: '-nci', + 20: '-nci', + 50: '-nci', + + 3: '-üncü', + 4: '-üncü', + 100: '-üncü', + + 6: '-ncı', + + 9: '-uncu', + 10: '-uncu', + 30: '-uncu', + + 60: '-ıncı', + 90: '-ıncı' + }; + return moment.defineLocale('az', { + months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'), + monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'), + weekdays : 'Bazar_Bazar ertÉ™si_ÇərÅŸÉ™nbÉ™ axÅŸamı_ÇərÅŸÉ™nbÉ™_CümÉ™ axÅŸamı_CümÉ™_ŞənbÉ™'.split('_'), + weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'), + weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[bugün saat] LT', + nextDay : '[sabah saat] LT', + nextWeek : '[gÉ™lÉ™n hÉ™ftÉ™] dddd [saat] LT', + lastDay : '[dünÉ™n] LT', + lastWeek : '[keçən hÉ™ftÉ™] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s sonra', + past : '%s É™vvÉ™l', + s : 'birneçə saniyyÉ™', + m : 'bir dÉ™qiqÉ™', + mm : '%d dÉ™qiqÉ™', + h : 'bir saat', + hh : '%d saat', + d : 'bir gün', + dd : '%d gün', + M : 'bir ay', + MM : '%d ay', + y : 'bir il', + yy : '%d il' + }, + meridiemParse: /gecÉ™|sÉ™hÉ™r|gündüz|axÅŸam/, + isPM : function (input) { + return /^(gündüz|axÅŸam)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'gecÉ™'; + } else if (hour < 12) { + return 'sÉ™hÉ™r'; + } else if (hour < 17) { + return 'gündüz'; + } else { + return 'axÅŸam'; + } + }, + ordinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/, + ordinal : function (number) { + if (number === 0) { // special case for zero + return number + '-ıncı'; + } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + + return number + (suffixes[a] || suffixes[b] || suffixes[c]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : belarusian (be) +// author : Dmitry Demidov : https://github.com/demidov91 +// author: Praleska: http://praleska.pro/ +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін', + 'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін', + 'dd': 'дзень_дні_дзён', + 'MM': 'меÑÑц_меÑÑцы_меÑÑцаў', + 'yy': 'год_гады_гадоў' + }; + if (key === 'm') { + return withoutSuffix ? 'хвіліна' : 'хвіліну'; + } + else if (key === 'h') { + return withoutSuffix ? 'гадзіна' : 'гадзіну'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñтудзень_люты_Ñакавік_краÑавік_травень_чÑрвень_ліпень_жнівень_вераÑень_каÑтрычнік_ліÑтапад_Ñнежань'.split('_'), + 'accusative': 'ÑтудзенÑ_лютага_Ñакавіка_краÑавіка_траўнÑ_чÑрвенÑ_ліпенÑ_жніўнÑ_вераÑнÑ_каÑтрычніка_ліÑтапада_ÑнежнÑ'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'нÑдзелÑ_панÑдзелак_аўторак_Ñерада_чацвер_пÑтніца_Ñубота'.split('_'), + 'accusative': 'нÑдзелю_панÑдзелак_аўторак_Ñераду_чацвер_пÑтніцу_Ñуботу'.split('_') + }, + + nounCase = (/\[ ?[Вв] ?(?:мінулую|наÑтупную)? ?\] ?dddd/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.defineLocale('be', { + months : monthsCaseReplace, + monthsShort : 'Ñтуд_лют_Ñак_краÑ_трав_чÑрв_ліп_жнів_вер_каÑÑ‚_ліÑÑ‚_Ñнеж'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'нд_пн_ат_ÑÑ€_чц_пт_Ñб'.split('_'), + weekdaysMin : 'нд_пн_ат_ÑÑ€_чц_пт_Ñб'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY г.', + LLL : 'D MMMM YYYY г., LT', + LLLL : 'dddd, D MMMM YYYY г., LT' + }, + calendar : { + sameDay: '[Ð¡Ñ‘Ð½Ð½Ñ Ñž] LT', + nextDay: '[Заўтра Ñž] LT', + lastDay: '[Учора Ñž] LT', + nextWeek: function () { + return '[У] dddd [Ñž] LT'; + }, + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return '[У мінулую] dddd [Ñž] LT'; + case 1: + case 2: + case 4: + return '[У мінулы] dddd [Ñž] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'праз %s', + past : '%s таму', + s : 'некалькі Ñекунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : relativeTimeWithPlural, + hh : relativeTimeWithPlural, + d : 'дзень', + dd : relativeTimeWithPlural, + M : 'меÑÑц', + MM : relativeTimeWithPlural, + y : 'год', + yy : relativeTimeWithPlural + }, + meridiemParse: /ночы|раніцы|днÑ|вечара/, + isPM : function (input) { + return /^(днÑ|вечара)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночы'; + } else if (hour < 12) { + return 'раніцы'; + } else if (hour < 17) { + return 'днÑ'; + } else { + return 'вечара'; + } + }, + + ordinalParse: /\d{1,2}-(Ñ–|Ñ‹|га)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-Ñ–' : number + '-Ñ‹'; + case 'D': + return number + '-га'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : bulgarian (bg) +// author : Krasen Borisov : https://github.com/kraz + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('bg', { + months : 'Ñнуари_февруари_март_април_май_юни_юли_авгуÑÑ‚_Ñептември_октомври_ноември_декември'.split('_'), + monthsShort : 'Ñнр_фев_мар_апр_май_юни_юли_авг_Ñеп_окт_ное_дек'.split('_'), + weekdays : 'неделÑ_понеделник_вторник_ÑÑ€Ñда_четвъртък_петък_Ñъбота'.split('_'), + weekdaysShort : 'нед_пон_вто_ÑÑ€Ñ_чет_пет_Ñъб'.split('_'), + weekdaysMin : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'D.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Ð”Ð½ÐµÑ Ð²] LT', + nextDay : '[Утре в] LT', + nextWeek : 'dddd [в] LT', + lastDay : '[Вчера в] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[Ð’ изминалата] dddd [в] LT'; + case 1: + case 2: + case 4: + case 5: + return '[Ð’ изминалиÑ] dddd [в] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'Ñлед %s', + past : 'преди %s', + s : 'нÑколко Ñекунди', + m : 'минута', + mm : '%d минути', + h : 'чаÑ', + hh : '%d чаÑа', + d : 'ден', + dd : '%d дни', + M : 'меÑец', + MM : '%d меÑеца', + y : 'година', + yy : '%d години' + }, + ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Bengali (bn) +// author : Kaushik Gandhi : https://github.com/kaushikgandhi + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': '১', + '2': '২', + '3': '৩', + '4': '৪', + '5': '৫', + '6': '৬', + '7': '৭', + '8': '৮', + '9': '৯', + '0': '০' + }, + numberMap = { + '১': '1', + '২': '2', + '৩': '3', + '৪': '4', + '৫': '5', + '৬': '6', + '৭': '7', + '৮': '8', + '৯': '9', + '০': '0' + }; + + return moment.defineLocale('bn', { + months : 'জানà§à§Ÿà¦¾à¦°à§€_ফেবà§à§Ÿà¦¾à¦°à§€_মারà§à¦š_à¦à¦ªà§à¦°à¦¿à¦²_মে_জà§à¦¨_জà§à¦²à¦¾à¦‡_অগাসà§à¦Ÿ_সেপà§à¦Ÿà§‡à¦®à§à¦¬à¦°_অকà§à¦Ÿà§‹à¦¬à¦°_নভেমà§à¦¬à¦°_ডিসেমà§à¦¬à¦°'.split('_'), + monthsShort : 'জানà§_ফেব_মারà§à¦š_à¦à¦ªà¦°_মে_জà§à¦¨_জà§à¦²_অগ_সেপà§à¦Ÿ_অকà§à¦Ÿà§‹_নভ_ডিসেমà§'.split('_'), + weekdays : 'রবিবার_সোমবার_মঙà§à¦—লবার_বà§à¦§à¦¬à¦¾à¦°_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿à¦¬à¦¾à¦°_শà§à¦•à§à¦°à§à¦¬à¦¾à¦°_শনিবার'.split('_'), + weekdaysShort : 'রবি_সোম_মঙà§à¦—ল_বà§à¦§_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿_শà§à¦•à§à¦°à§_শনি'.split('_'), + weekdaysMin : 'রব_সম_মঙà§à¦—_বà§_বà§à¦°à¦¿à¦¹_শà§_শনি'.split('_'), + longDateFormat : { + LT : 'A h:mm সময়', + LTS : 'A h:mm:ss সময়', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[আজ] LT', + nextDay : '[আগামীকাল] LT', + nextWeek : 'dddd, LT', + lastDay : '[গতকাল] LT', + lastWeek : '[গত] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s পরে', + past : '%s আগে', + s : 'কà¦à¦• সেকেনà§à¦¡', + m : 'à¦à¦• মিনিট', + mm : '%d মিনিট', + h : 'à¦à¦• ঘনà§à¦Ÿà¦¾', + hh : '%d ঘনà§à¦Ÿà¦¾', + d : 'à¦à¦• দিন', + dd : '%d দিন', + M : 'à¦à¦• মাস', + MM : '%d মাস', + y : 'à¦à¦• বছর', + yy : '%d বছর' + }, + preparse: function (string) { + return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /রাত|শকাল|দà§à¦ªà§à¦°|বিকেল|রাত/, + isPM: function (input) { + return /^(দà§à¦ªà§à¦°|বিকেল|রাত)$/.test(input); + }, + //Bengali is a vast language its spoken + //in different forms in various parts of the world. + //I have just generalized with most common one used + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'রাত'; + } else if (hour < 10) { + return 'শকাল'; + } else if (hour < 17) { + return 'দà§à¦ªà§à¦°'; + } else if (hour < 20) { + return 'বিকেল'; + } else { + return 'রাত'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : tibetan (bo) +// author : Thupten N. Chakrishar : https://github.com/vajradog + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': '༡', + '2': '༢', + '3': '༣', + '4': '༤', + '5': '༥', + '6': '༦', + '7': '༧', + '8': '༨', + '9': '༩', + '0': '༠' + }, + numberMap = { + '༡': '1', + '༢': '2', + '༣': '3', + '༤': '4', + '༥': '5', + '༦': '6', + '༧': '7', + '༨': '8', + '༩': '9', + '༠': '0' + }; + + return moment.defineLocale('bo', { + months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), + monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), + weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'), + weekdaysShort : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), + weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), + longDateFormat : { + LT : 'A h:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[དི་རིང] LT', + nextDay : '[སང་ཉིན] LT', + nextWeek : '[བདུན་ཕྲག་རྗེས་མ], LT', + lastDay : '[à½à¼‹à½¦à½„] LT', + lastWeek : '[བདུན་ཕྲག་མà½à½ à¼‹à½˜] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s ལ་', + past : '%s སྔན་ལ', + s : 'ལམ་སང', + m : 'སà¾à½¢à¼‹à½˜à¼‹à½‚ཅིག', + mm : '%d སà¾à½¢à¼‹à½˜', + h : 'ཆུ་ཚོད་གཅིག', + hh : '%d ཆུ་ཚོད', + d : 'ཉིན་གཅིག', + dd : '%d ཉིན་', + M : 'ཟླ་བ་གཅིག', + MM : '%d ཟླ་བ', + y : 'ལོ་གཅིག', + yy : '%d ལོ' + }, + preparse: function (string) { + return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/, + isPM: function (input) { + return /^(ཉིན་གུང|དགོང་དག|མཚན་མོ)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'མཚན་མོ'; + } else if (hour < 10) { + return 'ཞོགས་ཀས'; + } else if (hour < 17) { + return 'ཉིན་གུང'; + } else if (hour < 20) { + return 'དགོང་དག'; + } else { + return 'མཚན་མོ'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : breton (br) +// author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function relativeTimeWithMutation(number, withoutSuffix, key) { + var format = { + 'mm': 'munutenn', + 'MM': 'miz', + 'dd': 'devezh' + }; + return number + ' ' + mutation(format[key], number); + } + + function specialMutationForYears(number) { + switch (lastNumber(number)) { + case 1: + case 3: + case 4: + case 5: + case 9: + return number + ' bloaz'; + default: + return number + ' vloaz'; + } + } + + function lastNumber(number) { + if (number > 9) { + return lastNumber(number % 10); + } + return number; + } + + function mutation(text, number) { + if (number === 2) { + return softMutation(text); + } + return text; + } + + function softMutation(text) { + var mutationTable = { + 'm': 'v', + 'b': 'v', + 'd': 'z' + }; + if (mutationTable[text.charAt(0)] === undefined) { + return text; + } + return mutationTable[text.charAt(0)] + text.substring(1); + } + + return moment.defineLocale('br', { + months : 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'), + monthsShort : 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'), + weekdays : 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'), + weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'), + weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'), + longDateFormat : { + LT : 'h[e]mm A', + LTS : 'h[e]mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D [a viz] MMMM YYYY', + LLL : 'D [a viz] MMMM YYYY LT', + LLLL : 'dddd, D [a viz] MMMM YYYY LT' + }, + calendar : { + sameDay : '[Hiziv da] LT', + nextDay : '[Warc\'hoazh da] LT', + nextWeek : 'dddd [da] LT', + lastDay : '[Dec\'h da] LT', + lastWeek : 'dddd [paset da] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'a-benn %s', + past : '%s \'zo', + s : 'un nebeud segondennoù', + m : 'ur vunutenn', + mm : relativeTimeWithMutation, + h : 'un eur', + hh : '%d eur', + d : 'un devezh', + dd : relativeTimeWithMutation, + M : 'ur miz', + MM : relativeTimeWithMutation, + y : 'ur bloaz', + yy : specialMutationForYears + }, + ordinalParse: /\d{1,2}(añ|vet)/, + ordinal : function (number) { + var output = (number === 1) ? 'añ' : 'vet'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : bosnian (bs) +// author : Nedim Cholich : https://github.com/frontyard +// based on (hr) translation by Bojan Marković + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } + } + + return moment.defineLocale('bs', { + months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'), + monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'), + weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota'.split('_'), + weekdaysShort : 'ned._pon._uto._sri._Äet._pet._sub.'.split('_'), + weekdaysMin : 'ne_po_ut_sr_Äe_pe_su'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD. MM. YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[proÅ¡lu] dddd [u] LT'; + case 6: + return '[proÅ¡le] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[proÅ¡li] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'par sekundi', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'dan', + dd : translate, + M : 'mjesec', + MM : translate, + y : 'godinu', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : catalan (ca) +// author : Juan G. Hurtado : https://github.com/juanghurtado + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ca', { + months : 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'), + monthsShort : 'gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.'.split('_'), + weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'), + weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'), + weekdaysMin : 'Dg_Dl_Dt_Dc_Dj_Dv_Ds'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay : function () { + return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextDay : function () { + return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastDay : function () { + return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'fa %s', + s : 'uns segons', + m : 'un minut', + mm : '%d minuts', + h : 'una hora', + hh : '%d hores', + d : 'un dia', + dd : '%d dies', + M : 'un mes', + MM : '%d mesos', + y : 'un any', + yy : '%d anys' + }, + ordinalParse: /\d{1,2}(r|n|t|è|a)/, + ordinal : function (number, period) { + var output = (number === 1) ? 'r' : + (number === 2) ? 'n' : + (number === 3) ? 'r' : + (number === 4) ? 't' : 'è'; + if (period === 'w' || period === 'W') { + output = 'a'; + } + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : czech (cs) +// author : petrbela : https://github.com/petrbela + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var months = 'leden_únor_bÅ™ezen_duben_kvÄ›ten_Äerven_Äervenec_srpen_září_říjen_listopad_prosinec'.split('_'), + monthsShort = 'led_úno_bÅ™e_dub_kvÄ›_Ävn_Ävc_srp_zář_říj_lis_pro'.split('_'); + + function plural(n) { + return (n > 1) && (n < 5) && (~~(n / 10) !== 1); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami'; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minuty' : 'minut'); + } else { + return result + 'minutami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodin'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'den' : 'dnem'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dny' : 'dní'); + } else { + return result + 'dny'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mÄ›síc' : 'mÄ›sícem'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'mÄ›síce' : 'mÄ›síců'); + } else { + return result + 'mÄ›síci'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokem'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'let'); + } else { + return result + 'lety'; + } + break; + } + } + + return moment.defineLocale('cs', { + months : months, + monthsShort : monthsShort, + monthsParse : (function (months, monthsShort) { + var i, _monthsParse = []; + for (i = 0; i < 12; i++) { + // use custom parser to solve problem with July (Äervenec) + _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); + } + return _monthsParse; + }(months, monthsShort)), + weekdays : 'nedÄ›le_pondÄ›lí_úterý_stÅ™eda_Ätvrtek_pátek_sobota'.split('_'), + weekdaysShort : 'ne_po_út_st_Ät_pá_so'.split('_'), + weekdaysMin : 'ne_po_út_st_Ät_pá_so'.split('_'), + longDateFormat : { + LT: 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[dnes v] LT', + nextDay: '[zítra v] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedÄ›li v] LT'; + case 1: + case 2: + return '[v] dddd [v] LT'; + case 3: + return '[ve stÅ™edu v] LT'; + case 4: + return '[ve Ätvrtek v] LT'; + case 5: + return '[v pátek v] LT'; + case 6: + return '[v sobotu v] LT'; + } + }, + lastDay: '[vÄera v] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulou nedÄ›li v] LT'; + case 1: + case 2: + return '[minulé] dddd [v] LT'; + case 3: + return '[minulou stÅ™edu v] LT'; + case 4: + case 5: + return '[minulý] dddd [v] LT'; + case 6: + return '[minulou sobotu v] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pÅ™ed %s', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse : /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : chuvash (cv) +// author : Anatoly Mironov : https://github.com/mirontoli + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('cv', { + months : 'кăрлач_нарăÑ_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав'.split('_'), + monthsShort : 'кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш'.split('_'), + weekdays : 'вырÑарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_Ñрнекун_шăматкун'.split('_'), + weekdaysShort : 'выр_тун_ытл_юн_кĕç_Ñрн_шăм'.split('_'), + weekdaysMin : 'вр_тн_Ñ‹Ñ‚_юн_кç_ÑÑ€_шм'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD-MM-YYYY', + LL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]', + LLL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT', + LLLL : 'dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT' + }, + calendar : { + sameDay: '[ПаÑн] LT [Ñехетре]', + nextDay: '[Ыран] LT [Ñехетре]', + lastDay: '[Ĕнер] LT [Ñехетре]', + nextWeek: '[ÇитеÑ] dddd LT [Ñехетре]', + lastWeek: '[Иртнĕ] dddd LT [Ñехетре]', + sameElse: 'L' + }, + relativeTime : { + future : function (output) { + var affix = /Ñехет$/i.exec(output) ? 'рен' : /çул$/i.exec(output) ? 'тан' : 'ран'; + return output + affix; + }, + past : '%s каÑлла', + s : 'пĕр-ик çеккунт', + m : 'пĕр минут', + mm : '%d минут', + h : 'пĕр Ñехет', + hh : '%d Ñехет', + d : 'пĕр кун', + dd : '%d кун', + M : 'пĕр уйăх', + MM : '%d уйăх', + y : 'пĕр çул', + yy : '%d çул' + }, + ordinalParse: /\d{1,2}-мĕш/, + ordinal : '%d-мĕш', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Welsh (cy) +// author : Robert Allen + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('cy', { + months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'), + monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'), + weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'), + weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'), + weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'), + // time formats are the same as en-gb + longDateFormat: { + LT: 'HH:mm', + LTS : 'LT:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd, D MMMM YYYY LT' + }, + calendar: { + sameDay: '[Heddiw am] LT', + nextDay: '[Yfory am] LT', + nextWeek: 'dddd [am] LT', + lastDay: '[Ddoe am] LT', + lastWeek: 'dddd [diwethaf am] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'mewn %s', + past: '%s yn ôl', + s: 'ychydig eiliadau', + m: 'munud', + mm: '%d munud', + h: 'awr', + hh: '%d awr', + d: 'diwrnod', + dd: '%d diwrnod', + M: 'mis', + MM: '%d mis', + y: 'blwyddyn', + yy: '%d flynedd' + }, + ordinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/, + // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh + ordinal: function (number) { + var b = number, + output = '', + lookup = [ + '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed + 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed + ]; + + if (b > 20) { + if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) { + output = 'fed'; // not 30ain, 70ain or 90ain + } else { + output = 'ain'; + } + } else if (b > 0) { + output = lookup[b]; + } + + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : danish (da) +// author : Ulrik Nielsen : https://github.com/mrbase + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('da', { + months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), + weekdaysShort : 'søn_man_tir_ons_tor_fre_lør'.split('_'), + weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd [d.] D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[I dag kl.] LT', + nextDay : '[I morgen kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[I gÃ¥r kl.] LT', + lastWeek : '[sidste] dddd [kl] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'om %s', + past : '%s siden', + s : 'fÃ¥ sekunder', + m : 'et minut', + mm : '%d minutter', + h : 'en time', + hh : '%d timer', + d : 'en dag', + dd : '%d dage', + M : 'en mÃ¥ned', + MM : '%d mÃ¥neder', + y : 'et Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : austrian german (de-at) +// author : lluchs : https://github.com/lluchs +// author: Menelion Elensúle: https://github.com/Oire +// author : Martin Groller : https://github.com/MadMG + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + return moment.defineLocale('de-at', { + months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[Heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[Morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[Gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : german (de) +// author : lluchs : https://github.com/lluchs +// author: Menelion Elensúle: https://github.com/Oire + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + return moment.defineLocale('de', { + months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[Heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[Morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[Gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : modern greek (el) +// author : Aggelos Karalias : https://github.com/mehiel + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('el', { + monthsNominativeEl : 'ΙανουάÏιος_ΦεβÏουάÏιος_ΜάÏτιος_ΑπÏίλιος_Μάιος_ΙοÏνιος_ΙοÏλιος_ΑÏγουστος_ΣεπτέμβÏιος_ΟκτώβÏιος_ÎοέμβÏιος_ΔεκέμβÏιος'.split('_'), + monthsGenitiveEl : 'ΙανουαÏίου_ΦεβÏουαÏίου_ΜαÏτίου_ΑπÏιλίου_ΜαÎου_Ιουνίου_Ιουλίου_ΑυγοÏστου_ΣεπτεμβÏίου_ΟκτωβÏίου_ÎοεμβÏίου_ΔεκεμβÏίου'.split('_'), + months : function (momentToFormat, format) { + if (/D/.test(format.substring(0, format.indexOf('MMMM')))) { // if there is a day number before 'MMMM' + return this._monthsGenitiveEl[momentToFormat.month()]; + } else { + return this._monthsNominativeEl[momentToFormat.month()]; + } + }, + monthsShort : 'Ιαν_Φεβ_ΜαÏ_ΑπÏ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Îοε_Δεκ'.split('_'), + weekdays : 'ΚυÏιακή_ΔευτέÏα_ΤÏίτη_ΤετάÏτη_Πέμπτη_ΠαÏασκευή_Σάββατο'.split('_'), + weekdaysShort : 'ΚυÏ_Δευ_ΤÏι_Τετ_Πεμ_ΠαÏ_Σαβ'.split('_'), + weekdaysMin : 'Κυ_Δε_ΤÏ_Τε_Πε_Πα_Σα'.split('_'), + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'μμ' : 'ΜΜ'; + } else { + return isLower ? 'πμ' : 'ΠΜ'; + } + }, + isPM : function (input) { + return ((input + '').toLowerCase()[0] === 'μ'); + }, + meridiemParse : /[ΠΜ]\.?Îœ?\.?/i, + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendarEl : { + sameDay : '[ΣήμεÏα {}] LT', + nextDay : '[ΑÏÏιο {}] LT', + nextWeek : 'dddd [{}] LT', + lastDay : '[Χθες {}] LT', + lastWeek : function () { + switch (this.day()) { + case 6: + return '[το Ï€ÏοηγοÏμενο] dddd [{}] LT'; + default: + return '[την Ï€ÏοηγοÏμενη] dddd [{}] LT'; + } + }, + sameElse : 'L' + }, + calendar : function (key, mom) { + var output = this._calendarEl[key], + hours = mom && mom.hours(); + + if (typeof output === 'function') { + output = output.apply(mom); + } + + return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις')); + }, + relativeTime : { + future : 'σε %s', + past : '%s Ï€Ïιν', + s : 'λίγα δευτεÏόλεπτα', + m : 'ένα λεπτό', + mm : '%d λεπτά', + h : 'μία ÏŽÏα', + hh : '%d ÏŽÏες', + d : 'μία μέÏα', + dd : '%d μέÏες', + M : 'ένας μήνας', + MM : '%d μήνες', + y : 'ένας χÏόνος', + yy : '%d χÏόνια' + }, + ordinalParse: /\d{1,2}η/, + ordinal: '%dη', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : australian english (en-au) + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('en-au', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + 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' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : canadian english (en-ca) +// author : Jonathan Abourbih : https://github.com/jonbca + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('en-ca', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'YYYY-MM-DD', + LL : 'D MMMM, YYYY', + LLL : 'D MMMM, YYYY LT', + LLLL : 'dddd, D MMMM, YYYY LT' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + 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' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); +})); + +// moment.js locale configuration +// locale : great britain english (en-gb) +// author : Chris Gedrim : https://github.com/chrisgedrim + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('en-gb', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + 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' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : esperanto (eo) +// author : Colin Dean : https://github.com/colindean +// komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko. +// Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni! + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('eo', { + months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aÅ­gusto_septembro_oktobro_novembro_decembro'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aÅ­g_sep_okt_nov_dec'.split('_'), + weekdays : 'Dimanĉo_Lundo_Mardo_Merkredo_Ä´aÅ­do_Vendredo_Sabato'.split('_'), + weekdaysShort : 'Dim_Lun_Mard_Merk_Ä´aÅ­_Ven_Sab'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Ä´a_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'D[-an de] MMMM, YYYY', + LLL : 'D[-an de] MMMM, YYYY LT', + LLLL : 'dddd, [la] D[-an de] MMMM, YYYY LT' + }, + meridiemParse: /[ap]\.t\.m/i, + isPM: function (input) { + return input.charAt(0).toLowerCase() === 'p'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'p.t.m.' : 'P.T.M.'; + } else { + return isLower ? 'a.t.m.' : 'A.T.M.'; + } + }, + calendar : { + sameDay : '[HodiaÅ­ je] LT', + nextDay : '[MorgaÅ­ je] LT', + nextWeek : 'dddd [je] LT', + lastDay : '[HieraÅ­ je] LT', + lastWeek : '[pasinta] dddd [je] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'je %s', + past : 'antaÅ­ %s', + s : 'sekundoj', + m : 'minuto', + mm : '%d minutoj', + h : 'horo', + hh : '%d horoj', + d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo + dd : '%d tagoj', + M : 'monato', + MM : '%d monatoj', + y : 'jaro', + yy : '%d jaroj' + }, + ordinalParse: /\d{1,2}a/, + ordinal : '%da', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : spanish (es) +// author : Julio Napurí : https://github.com/julionc + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), + monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); + + return moment.defineLocale('es', { + months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return monthsShort[m.month()]; + } else { + return monthsShortDot[m.month()]; + } + }, + weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), + weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), + weekdaysMin : 'Do_Lu_Ma_Mi_Ju_Vi_Sá'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY LT', + LLLL : 'dddd, D [de] MMMM [de] YYYY LT' + }, + calendar : { + sameDay : function () { + return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextDay : function () { + return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastDay : function () { + return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'hace %s', + s : 'unos segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'una hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un año', + yy : '%d años' + }, + ordinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : estonian (et) +// author : Henry Kehlmann : https://github.com/madhenry +// improvements : Illimar Tambek : https://github.com/ragulka + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'], + 'm' : ['ühe minuti', 'üks minut'], + 'mm': [number + ' minuti', number + ' minutit'], + 'h' : ['ühe tunni', 'tund aega', 'üks tund'], + 'hh': [number + ' tunni', number + ' tundi'], + 'd' : ['ühe päeva', 'üks päev'], + 'M' : ['kuu aja', 'kuu aega', 'üks kuu'], + 'MM': [number + ' kuu', number + ' kuud'], + 'y' : ['ühe aasta', 'aasta', 'üks aasta'], + 'yy': [number + ' aasta', number + ' aastat'] + }; + if (withoutSuffix) { + return format[key][2] ? format[key][2] : format[key][1]; + } + return isFuture ? format[key][0] : format[key][1]; + } + + return moment.defineLocale('et', { + months : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'), + monthsShort : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'), + weekdays : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'), + weekdaysShort : 'P_E_T_K_N_R_L'.split('_'), + weekdaysMin : 'P_E_T_K_N_R_L'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[Täna,] LT', + nextDay : '[Homme,] LT', + nextWeek : '[Järgmine] dddd LT', + lastDay : '[Eile,] LT', + lastWeek : '[Eelmine] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s pärast', + past : '%s tagasi', + s : processRelativeTime, + m : processRelativeTime, + mm : processRelativeTime, + h : processRelativeTime, + hh : processRelativeTime, + d : processRelativeTime, + dd : '%d päeva', + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : euskara (eu) +// author : Eneko Illarramendi : https://github.com/eillarra + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('eu', { + months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'), + monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'), + weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'), + weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'), + weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY[ko] MMMM[ren] D[a]', + LLL : 'YYYY[ko] MMMM[ren] D[a] LT', + LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] LT', + l : 'YYYY-M-D', + ll : 'YYYY[ko] MMM D[a]', + lll : 'YYYY[ko] MMM D[a] LT', + llll : 'ddd, YYYY[ko] MMM D[a] LT' + }, + calendar : { + sameDay : '[gaur] LT[etan]', + nextDay : '[bihar] LT[etan]', + nextWeek : 'dddd LT[etan]', + lastDay : '[atzo] LT[etan]', + lastWeek : '[aurreko] dddd LT[etan]', + sameElse : 'L' + }, + relativeTime : { + future : '%s barru', + past : 'duela %s', + s : 'segundo batzuk', + m : 'minutu bat', + mm : '%d minutu', + h : 'ordu bat', + hh : '%d ordu', + d : 'egun bat', + dd : '%d egun', + M : 'hilabete bat', + MM : '%d hilabete', + y : 'urte bat', + yy : '%d urte' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Persian (fa) +// author : Ebrahim Byagowi : https://github.com/ebraminio + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': 'Û±', + '2': 'Û²', + '3': 'Û³', + '4': 'Û´', + '5': 'Ûµ', + '6': 'Û¶', + '7': 'Û·', + '8': 'Û¸', + '9': 'Û¹', + '0': 'Û°' + }, numberMap = { + 'Û±': '1', + 'Û²': '2', + 'Û³': '3', + 'Û´': '4', + 'Ûµ': '5', + 'Û¶': '6', + 'Û·': '7', + 'Û¸': '8', + 'Û¹': '9', + 'Û°': '0' + }; + + return moment.defineLocale('fa', { + months : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + monthsShort : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysMin : 'ÛŒ_د_س_Ú†_Ù¾_ج_Ø´'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + meridiemParse: /قبل از ظهر|بعد از ظهر/, + isPM: function (input) { + return /بعد از ظهر/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'قبل از ظهر'; + } else { + return 'بعد از ظهر'; + } + }, + calendar : { + sameDay : '[امروز ساعت] LT', + nextDay : '[Ùردا ساعت] LT', + nextWeek : 'dddd [ساعت] LT', + lastDay : '[دیروز ساعت] LT', + lastWeek : 'dddd [پیش] [ساعت] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'در %s', + past : '%s پیش', + s : 'چندین ثانیه', + m : 'یک دقیقه', + mm : '%d دقیقه', + h : 'یک ساعت', + hh : '%d ساعت', + d : 'یک روز', + dd : '%d روز', + M : 'یک ماه', + MM : '%d ماه', + y : 'یک سال', + yy : '%d سال' + }, + preparse: function (string) { + return string.replace(/[Û°-Û¹]/g, function (match) { + return numberMap[match]; + }).replace(/ØŒ/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, 'ØŒ'); + }, + ordinalParse: /\d{1,2}Ù…/, + ordinal : '%dÙ…', + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : finnish (fi) +// author : Tarmo Aidantausta : https://github.com/bleadof + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '), + numbersFuture = [ + 'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden', + numbersPast[7], numbersPast[8], numbersPast[9] + ]; + + function translate(number, withoutSuffix, key, isFuture) { + var result = ''; + switch (key) { + case 's': + return isFuture ? 'muutaman sekunnin' : 'muutama sekunti'; + case 'm': + return isFuture ? 'minuutin' : 'minuutti'; + case 'mm': + result = isFuture ? 'minuutin' : 'minuuttia'; + break; + case 'h': + return isFuture ? 'tunnin' : 'tunti'; + case 'hh': + result = isFuture ? 'tunnin' : 'tuntia'; + break; + case 'd': + return isFuture ? 'päivän' : 'päivä'; + case 'dd': + result = isFuture ? 'päivän' : 'päivää'; + break; + case 'M': + return isFuture ? 'kuukauden' : 'kuukausi'; + case 'MM': + result = isFuture ? 'kuukauden' : 'kuukautta'; + break; + case 'y': + return isFuture ? 'vuoden' : 'vuosi'; + case 'yy': + result = isFuture ? 'vuoden' : 'vuotta'; + break; + } + result = verbalNumber(number, isFuture) + ' ' + result; + return result; + } + + function verbalNumber(number, isFuture) { + return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number; + } + + return moment.defineLocale('fi', { + months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'), + monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'), + weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'), + weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'), + weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD.MM.YYYY', + LL : 'Do MMMM[ta] YYYY', + LLL : 'Do MMMM[ta] YYYY, [klo] LT', + LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] LT', + l : 'D.M.YYYY', + ll : 'Do MMM YYYY', + lll : 'Do MMM YYYY, [klo] LT', + llll : 'ddd, Do MMM YYYY, [klo] LT' + }, + calendar : { + sameDay : '[tänään] [klo] LT', + nextDay : '[huomenna] [klo] LT', + nextWeek : 'dddd [klo] LT', + lastDay : '[eilen] [klo] LT', + lastWeek : '[viime] dddd[na] [klo] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s päästä', + past : '%s sitten', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : faroese (fo) +// author : Ragnar Johannesen : https://github.com/ragnar123 + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('fo', { + months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'), + weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'), + weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D. MMMM, YYYY LT' + }, + calendar : { + sameDay : '[à dag kl.] LT', + nextDay : '[à morgin kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[à gjár kl.] LT', + lastWeek : '[síðstu] dddd [kl] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'um %s', + past : '%s síðani', + s : 'fá sekund', + m : 'ein minutt', + mm : '%d minuttir', + h : 'ein tími', + hh : '%d tímar', + d : 'ein dagur', + dd : '%d dagar', + M : 'ein mánaði', + MM : '%d mánaðir', + y : 'eitt ár', + yy : '%d ár' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : canadian french (fr-ca) +// author : Jonathan Abourbih : https://github.com/jonbca + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('fr-ca', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Aujourd\'hui à] LT', + nextDay: '[Demain à] LT', + nextWeek: 'dddd [à] LT', + lastDay: '[Hier à] LT', + lastWeek: 'dddd [dernier à] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + ordinalParse: /\d{1,2}(er|)/, + ordinal : function (number) { + return number + (number === 1 ? 'er' : ''); + } + }); +})); + +// moment.js locale configuration +// locale : french (fr) +// author : John Fischer : https://github.com/jfroffice + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('fr', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Aujourd\'hui à] LT', + nextDay: '[Demain à] LT', + nextWeek: 'dddd [à] LT', + lastDay: '[Hier à] LT', + lastWeek: 'dddd [dernier à] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + ordinalParse: /\d{1,2}(er|)/, + ordinal : function (number) { + return number + (number === 1 ? 'er' : ''); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : frisian (fy) +// author : Robin van der Vliet : https://github.com/robin0van0der0v + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'); + + return moment.defineLocale('fy', { + months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'), + weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'), + weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[hjoed om] LT', + nextDay: '[moarn om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[juster om] LT', + lastWeek: '[ôfrûne] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'oer %s', + past : '%s lyn', + s : 'in pear sekonden', + m : 'ien minút', + mm : '%d minuten', + h : 'ien oere', + hh : '%d oeren', + d : 'ien dei', + dd : '%d dagen', + M : 'ien moanne', + MM : '%d moannen', + y : 'ien jier', + yy : '%d jierren' + }, + ordinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : galician (gl) +// author : Juan G. Hurtado : https://github.com/juanghurtado + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('gl', { + months : 'Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro'.split('_'), + monthsShort : 'Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.'.split('_'), + weekdays : 'Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado'.split('_'), + weekdaysShort : 'Dom._Lun._Mar._Mér._Xov._Ven._Sáb.'.split('_'), + weekdaysMin : 'Do_Lu_Ma_Mé_Xo_Ve_Sá'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay : function () { + return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextDay : function () { + return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextWeek : function () { + return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + lastDay : function () { + return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT'; + }, + lastWeek : function () { + return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : function (str) { + if (str === 'uns segundos') { + return 'nuns segundos'; + } + return 'en ' + str; + }, + past : 'hai %s', + s : 'uns segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'unha hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un ano', + yy : '%d anos' + }, + ordinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Hebrew (he) +// author : Tomer Cohen : https://github.com/tomer +// author : Moshe Simantov : https://github.com/DevelopmentIL +// author : Tal Ater : https://github.com/TalAter + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('he', { + months : 'ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר'.split('_'), + monthsShort : 'ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳'.split('_'), + weekdays : 'ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'), + weekdaysShort : '×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'), + weekdaysMin : '×_ב_×’_ד_×”_ו_ש'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [ב]MMMM YYYY', + LLL : 'D [ב]MMMM YYYY LT', + LLLL : 'dddd, D [ב]MMMM YYYY LT', + l : 'D/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY LT', + llll : 'ddd, D MMM YYYY LT' + }, + calendar : { + sameDay : '[×”×™×•× ×‘Ö¾]LT', + nextDay : '[מחר ב־]LT', + nextWeek : 'dddd [בשעה] LT', + lastDay : '[×תמול ב־]LT', + lastWeek : '[ביו×] dddd [×”×חרון בשעה] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'בעוד %s', + past : 'לפני %s', + s : 'מספר שניות', + m : 'דקה', + mm : '%d דקות', + h : 'שעה', + hh : function (number) { + if (number === 2) { + return 'שעתיי×'; + } + return number + ' שעות'; + }, + d : 'יו×', + dd : function (number) { + if (number === 2) { + return 'יומיי×'; + } + return number + ' ימי×'; + }, + M : 'חודש', + MM : function (number) { + if (number === 2) { + return 'חודשיי×'; + } + return number + ' חודשי×'; + }, + y : 'שנה', + yy : function (number) { + if (number === 2) { + return 'שנתיי×'; + } else if (number % 10 === 0 && number !== 10) { + return number + ' שנה'; + } + return number + ' שני×'; + } + } + }); +})); + +// moment.js locale configuration +// locale : hindi (hi) +// author : Mayank Singhal : https://github.com/mayanksinghal + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.defineLocale('hi', { + months : 'जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°'.split('_'), + monthsShort : 'जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.'.split('_'), + weekdays : 'रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split('_'), + weekdaysShort : 'रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split('_'), + weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split('_'), + longDateFormat : { + LT : 'A h:mm बजे', + LTS : 'A h:mm:ss बजे', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[कल] LT', + nextWeek : 'dddd, LT', + lastDay : '[कल] LT', + lastWeek : '[पिछले] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s में', + past : '%s पहले', + s : 'कà¥à¤› ही कà¥à¤·à¤£', + m : 'à¤à¤• मिनट', + mm : '%d मिनट', + h : 'à¤à¤• घंटा', + hh : '%d घंटे', + d : 'à¤à¤• दिन', + dd : '%d दिन', + M : 'à¤à¤• महीने', + MM : '%d महीने', + y : 'à¤à¤• वरà¥à¤·', + yy : '%d वरà¥à¤·' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + // Hindi notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi. + meridiemParse: /रात|सà¥à¤¬à¤¹|दोपहर|शाम/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'रात') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'सà¥à¤¬à¤¹') { + return hour; + } else if (meridiem === 'दोपहर') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'शाम') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'रात'; + } else if (hour < 10) { + return 'सà¥à¤¬à¤¹'; + } else if (hour < 17) { + return 'दोपहर'; + } else if (hour < 20) { + return 'शाम'; + } else { + return 'रात'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : hrvatski (hr) +// author : Bojan Marković : https://github.com/bmarkovic + +// based on (sl) translation by Robert SedovÅ¡ek + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } + } + + return moment.defineLocale('hr', { + months : 'sjeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_'), + monthsShort : 'sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'), + weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota'.split('_'), + weekdaysShort : 'ned._pon._uto._sri._Äet._pet._sub.'.split('_'), + weekdaysMin : 'ne_po_ut_sr_Äe_pe_su'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD. MM. YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[proÅ¡lu] dddd [u] LT'; + case 6: + return '[proÅ¡le] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[proÅ¡li] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'par sekundi', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'dan', + dd : translate, + M : 'mjesec', + MM : translate, + y : 'godinu', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : hungarian (hu) +// author : Adam Brunner : https://github.com/adambrunner + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var weekEndings = 'vasárnap hétfÅ‘n kedden szerdán csütörtökön pénteken szombaton'.split(' '); + + function translate(number, withoutSuffix, key, isFuture) { + var num = number, + suffix; + + switch (key) { + case 's': + return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce'; + case 'm': + return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'mm': + return num + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'h': + return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'hh': + return num + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'd': + return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'dd': + return num + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'M': + return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'MM': + return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'y': + return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve'); + case 'yy': + return num + (isFuture || withoutSuffix ? ' év' : ' éve'); + } + + return ''; + } + + function week(isFuture) { + return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]'; + } + + return moment.defineLocale('hu', { + months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'), + monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'), + weekdays : 'vasárnap_hétfÅ‘_kedd_szerda_csütörtök_péntek_szombat'.split('_'), + weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'), + weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'YYYY.MM.DD.', + LL : 'YYYY. MMMM D.', + LLL : 'YYYY. MMMM D., LT', + LLLL : 'YYYY. MMMM D., dddd LT' + }, + meridiemParse: /de|du/i, + isPM: function (input) { + return input.charAt(1).toLowerCase() === 'u'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower === true ? 'de' : 'DE'; + } else { + return isLower === true ? 'du' : 'DU'; + } + }, + calendar : { + sameDay : '[ma] LT[-kor]', + nextDay : '[holnap] LT[-kor]', + nextWeek : function () { + return week.call(this, true); + }, + lastDay : '[tegnap] LT[-kor]', + lastWeek : function () { + return week.call(this, false); + }, + sameElse : 'L' + }, + relativeTime : { + future : '%s múlva', + past : '%s', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Armenian (hy-am) +// author : Armendarabyan : https://github.com/armendarabyan + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€_Õ´Õ¡Ö€Õ¿_Õ¡ÕºÖ€Õ«Õ¬_Õ´Õ¡ÕµÕ«Õ½_Õ°Õ¸Ö‚Õ¶Õ«Õ½_Õ°Õ¸Ö‚Õ¬Õ«Õ½_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€'.split('_'), + 'accusative': 'Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€Õ«_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€Õ«_Õ´Õ¡Ö€Õ¿Õ«_Õ¡ÕºÖ€Õ«Õ¬Õ«_Õ´Õ¡ÕµÕ«Õ½Õ«_Õ°Õ¸Ö‚Õ¶Õ«Õ½Õ«_Õ°Õ¸Ö‚Õ¬Õ«Õ½Õ«_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½Õ«_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function monthsShortCaseReplace(m, format) { + var monthsShort = 'Õ°Õ¶Õ¾_ÖƒÕ¿Ö€_Õ´Ö€Õ¿_Õ¡ÕºÖ€_Õ´ÕµÕ½_Õ°Õ¶Õ½_Õ°Õ¬Õ½_Ö…Õ£Õ½_Õ½ÕºÕ¿_Õ°Õ¯Õ¿_Õ¶Õ´Õ¢_Õ¤Õ¯Õ¿'.split('_'); + + return monthsShort[m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = 'Õ¯Õ«Ö€Õ¡Õ¯Õ«_Õ¥Ö€Õ¯Õ¸Ö‚Õ·Õ¡Õ¢Õ©Õ«_Õ¥Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ¹Õ¸Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ°Õ«Õ¶Õ£Õ·Õ¡Õ¢Õ©Õ«_Õ¸Ö‚Ö€Õ¢Õ¡Õ©_Õ·Õ¡Õ¢Õ¡Õ©'.split('_'); + + return weekdays[m.day()]; + } + + return moment.defineLocale('hy-am', { + months : monthsCaseReplace, + monthsShort : monthsShortCaseReplace, + weekdays : weekdaysCaseReplace, + weekdaysShort : 'Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©'.split('_'), + weekdaysMin : 'Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY Õ©.', + LLL : 'D MMMM YYYY Õ©., LT', + LLLL : 'dddd, D MMMM YYYY Õ©., LT' + }, + calendar : { + sameDay: '[Õ¡ÕµÕ½Ö…Ö€] LT', + nextDay: '[Õ¾Õ¡Õ²Õ¨] LT', + lastDay: '[Õ¥Ö€Õ¥Õ¯] LT', + nextWeek: function () { + return 'dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT'; + }, + lastWeek: function () { + return '[Õ¡Õ¶ÖÕ¡Õ®] dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT'; + }, + sameElse: 'L' + }, + relativeTime : { + future : '%s Õ°Õ¥Õ¿Õ¸', + past : '%s Õ¡Õ¼Õ¡Õ»', + s : 'Õ´Õ« Ö„Õ¡Õ¶Õ« Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶', + m : 'Ö€Õ¸ÕºÕ¥', + mm : '%d Ö€Õ¸ÕºÕ¥', + h : 'ÕªÕ¡Õ´', + hh : '%d ÕªÕ¡Õ´', + d : 'Ö…Ö€', + dd : '%d Ö…Ö€', + M : 'Õ¡Õ´Õ«Õ½', + MM : '%d Õ¡Õ´Õ«Õ½', + y : 'Õ¿Õ¡Ö€Õ«', + yy : '%d Õ¿Õ¡Ö€Õ«' + }, + + meridiemParse: /Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡|Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡|ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶/, + isPM: function (input) { + return /^(ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶)$/.test(input); + }, + meridiem : function (hour) { + if (hour < 4) { + return 'Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡'; + } else if (hour < 12) { + return 'Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡'; + } else if (hour < 17) { + return 'ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡'; + } else { + return 'Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶'; + } + }, + + ordinalParse: /\d{1,2}|\d{1,2}-(Õ«Õ¶|Ö€Õ¤)/, + ordinal: function (number, period) { + switch (period) { + case 'DDD': + case 'w': + case 'W': + case 'DDDo': + if (number === 1) { + return number + '-Õ«Õ¶'; + } + return number + '-Ö€Õ¤'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Bahasa Indonesia (id) +// author : Mohammad Satrio Utomo : https://github.com/tyok +// reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('id', { + months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'), + weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'), + weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'LT.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] LT', + LLLL : 'dddd, D MMMM YYYY [pukul] LT' + }, + meridiemParse: /pagi|siang|sore|malam/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'siang') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'sore' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'siang'; + } else if (hours < 19) { + return 'sore'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Besok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kemarin pukul] LT', + lastWeek : 'dddd [lalu pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lalu', + s : 'beberapa detik', + m : 'semenit', + mm : '%d menit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : icelandic (is) +// author : Hinrik Örn Sigurðsson : https://github.com/hinrik + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function plural(n) { + if (n % 100 === 11) { + return true; + } else if (n % 10 === 1) { + return false; + } + return true; + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': + return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum'; + case 'm': + return withoutSuffix ? 'mínúta' : 'mínútu'; + case 'mm': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum'); + } else if (withoutSuffix) { + return result + 'mínúta'; + } + return result + 'mínútu'; + case 'hh': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum'); + } + return result + 'klukkustund'; + case 'd': + if (withoutSuffix) { + return 'dagur'; + } + return isFuture ? 'dag' : 'degi'; + case 'dd': + if (plural(number)) { + if (withoutSuffix) { + return result + 'dagar'; + } + return result + (isFuture ? 'daga' : 'dögum'); + } else if (withoutSuffix) { + return result + 'dagur'; + } + return result + (isFuture ? 'dag' : 'degi'); + case 'M': + if (withoutSuffix) { + return 'mánuður'; + } + return isFuture ? 'mánuð' : 'mánuði'; + case 'MM': + if (plural(number)) { + if (withoutSuffix) { + return result + 'mánuðir'; + } + return result + (isFuture ? 'mánuði' : 'mánuðum'); + } else if (withoutSuffix) { + return result + 'mánuður'; + } + return result + (isFuture ? 'mánuð' : 'mánuði'); + case 'y': + return withoutSuffix || isFuture ? 'ár' : 'ári'; + case 'yy': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'ár' : 'árum'); + } + return result + (withoutSuffix || isFuture ? 'ár' : 'ári'); + } + } + + return moment.defineLocale('is', { + months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'), + weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'), + weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'), + weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] LT', + LLLL : 'dddd, D. MMMM YYYY [kl.] LT' + }, + calendar : { + sameDay : '[í dag kl.] LT', + nextDay : '[á morgun kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[í gær kl.] LT', + lastWeek : '[síðasta] dddd [kl.] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'eftir %s', + past : 'fyrir %s síðan', + s : translate, + m : translate, + mm : translate, + h : 'klukkustund', + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : italian (it) +// author : Lorenzo : https://github.com/aliem +// author: Mattia Larentis: https://github.com/nostalgiaz + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('it', { + months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'), + monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'), + weekdays : 'Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato'.split('_'), + weekdaysShort : 'Dom_Lun_Mar_Mer_Gio_Ven_Sab'.split('_'), + weekdaysMin : 'D_L_Ma_Me_G_V_S'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Oggi alle] LT', + nextDay: '[Domani alle] LT', + nextWeek: 'dddd [alle] LT', + lastDay: '[Ieri alle] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[la scorsa] dddd [alle] LT'; + default: + return '[lo scorso] dddd [alle] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : function (s) { + return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s; + }, + past : '%s fa', + s : 'alcuni secondi', + m : 'un minuto', + mm : '%d minuti', + h : 'un\'ora', + hh : '%d ore', + d : 'un giorno', + dd : '%d giorni', + M : 'un mese', + MM : '%d mesi', + y : 'un anno', + yy : '%d anni' + }, + ordinalParse : /\d{1,2}º/, + ordinal: '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : japanese (ja) +// author : LI Long : https://github.com/baryon + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ja', { + months : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '日曜日_月曜日_ç«æ›œæ—¥_水曜日_木曜日_金曜日_土曜日'.split('_'), + weekdaysShort : 'æ—¥_月_ç«_æ°´_木_金_土'.split('_'), + weekdaysMin : 'æ—¥_月_ç«_æ°´_木_金_土'.split('_'), + longDateFormat : { + LT : 'Ah時m分', + LTS : 'LTs秒', + L : 'YYYY/MM/DD', + LL : 'YYYYå¹´M月Dæ—¥', + LLL : 'YYYYå¹´M月Dæ—¥LT', + LLLL : 'YYYYå¹´M月Dæ—¥LT dddd' + }, + meridiemParse: /åˆå‰|åˆå¾Œ/i, + isPM : function (input) { + return input === 'åˆå¾Œ'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'åˆå‰'; + } else { + return 'åˆå¾Œ'; + } + }, + calendar : { + sameDay : '[今日] LT', + nextDay : '[明日] LT', + nextWeek : '[æ¥é€±]dddd LT', + lastDay : '[昨日] LT', + lastWeek : '[å‰é€±]dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s後', + past : '%så‰', + s : '数秒', + m : '1分', + mm : '%d分', + h : '1時間', + hh : '%d時間', + d : '1æ—¥', + dd : '%dæ—¥', + M : '1ヶ月', + MM : '%dヶ月', + y : '1å¹´', + yy : '%då¹´' + } + }); +})); + +// moment.js locale configuration +// locale : Georgian (ka) +// author : Irakli Janiashvili : https://github.com/irakli-janiashvili + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'იáƒáƒœáƒ•áƒáƒ áƒ˜_თებერვáƒáƒšáƒ˜_მáƒáƒ áƒ¢áƒ˜_áƒáƒžáƒ áƒ˜áƒšáƒ˜_მáƒáƒ˜áƒ¡áƒ˜_ივნისი_ივლისი_áƒáƒ’ვისტáƒ_სექტემბერი_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი_ნáƒáƒ”მბერი_დეკემბერი'.split('_'), + 'accusative': 'იáƒáƒœáƒ•áƒáƒ áƒ¡_თებერვáƒáƒšáƒ¡_მáƒáƒ áƒ¢áƒ¡_áƒáƒžáƒ áƒ˜áƒšáƒ˜áƒ¡_მáƒáƒ˜áƒ¡áƒ¡_ივნისს_ივლისს_áƒáƒ’ვისტს_სექტემბერს_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერს_ნáƒáƒ”მბერს_დეკემბერს'.split('_') + }, + + nounCase = (/D[oD] *MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'კვირáƒ_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ი_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი_ხუთშáƒáƒ‘áƒáƒ—ი_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი_შáƒáƒ‘áƒáƒ—ი'.split('_'), + 'accusative': 'კვირáƒáƒ¡_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ს_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ს_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ს_ხუთშáƒáƒ‘áƒáƒ—ს_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვს_შáƒáƒ‘áƒáƒ—ს'.split('_') + }, + + nounCase = (/(წინáƒ|შემდეგ)/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.defineLocale('ka', { + months : monthsCaseReplace, + monthsShort : 'იáƒáƒœ_თებ_მáƒáƒ _áƒáƒžáƒ _მáƒáƒ˜_ივნ_ივლ_áƒáƒ’ვ_სექ_áƒáƒ¥áƒ¢_ნáƒáƒ”_დეკ'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'კვი_áƒáƒ áƒ¨_სáƒáƒ›_áƒáƒ—ხ_ხუთ_პáƒáƒ _შáƒáƒ‘'.split('_'), + weekdaysMin : 'კვ_áƒáƒ _სáƒ_áƒáƒ—_ხუ_პáƒ_შáƒ'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[დღეს] LT[-ზე]', + nextDay : '[ხვáƒáƒš] LT[-ზე]', + lastDay : '[გუშინ] LT[-ზე]', + nextWeek : '[შემდეგ] dddd LT[-ზე]', + lastWeek : '[წინáƒ] dddd LT-ზე', + sameElse : 'L' + }, + relativeTime : { + future : function (s) { + return (/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|წელი)/).test(s) ? + s.replace(/ი$/, 'ში') : + s + 'ში'; + }, + past : function (s) { + if ((/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|დღე|თვე)/).test(s)) { + return s.replace(/(ი|ე)$/, 'ის წინ'); + } + if ((/წელი/).test(s)) { + return s.replace(/წელი$/, 'წლის წინ'); + } + }, + s : 'რáƒáƒ›áƒ“ენიმე წáƒáƒ›áƒ˜', + m : 'წუთი', + mm : '%d წუთი', + h : 'სáƒáƒáƒ—ი', + hh : '%d სáƒáƒáƒ—ი', + d : 'დღე', + dd : '%d დღე', + M : 'თვე', + MM : '%d თვე', + y : 'წელი', + yy : '%d წელი' + }, + ordinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/, + ordinal : function (number) { + if (number === 0) { + return number; + } + + if (number === 1) { + return number + '-ლი'; + } + + if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) { + return 'მე-' + number; + } + + return number + '-ე'; + }, + week : { + dow : 1, + doy : 7 + } + }); +})); + +// moment.js locale configuration +// locale : khmer (km) +// author : Kruy Vanna : https://github.com/kruyvanna + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('km', { + months: 'មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ'.split('_'), + monthsShort: 'មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ'.split('_'), + weekdays: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), + weekdaysShort: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), + weekdaysMin: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS : 'LT:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd, D MMMM YYYY LT' + }, + calendar: { + sameDay: '[ážáŸ’ងៃនៈ ម៉ោង] LT', + nextDay: '[ស្អែក ម៉ោង] LT', + nextWeek: 'dddd [ម៉ោង] LT', + lastDay: '[ម្សិលមិញ ម៉ោង] LT', + lastWeek: 'dddd [សប្ážáž¶áž áŸáž˜áž»áž“] [ម៉ោង] LT', + sameElse: 'L' + }, + relativeTime: { + future: '%sទៀáž', + past: '%sមុន', + s: 'ប៉ុន្មានវិនាទី', + m: 'មួយនាទី', + mm: '%d នាទី', + h: 'មួយម៉ោង', + hh: '%d ម៉ោង', + d: 'មួយážáŸ’ងៃ', + dd: '%d ážáŸ’ងៃ', + M: 'មួយážáŸ‚', + MM: '%d ážáŸ‚', + y: 'មួយឆ្នាំ', + yy: '%d ឆ្នាំ' + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : korean (ko) +// +// authors +// +// - Kyungwook, Park : https://github.com/kyungw00k +// - Jeeeyul Lee +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ko', { + months : '1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”'.split('_'), + monthsShort : '1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”'.split('_'), + weekdays : 'ì¼ìš”ì¼_월요ì¼_화요ì¼_수요ì¼_목요ì¼_금요ì¼_토요ì¼'.split('_'), + weekdaysShort : 'ì¼_ì›”_í™”_수_목_금_토'.split('_'), + weekdaysMin : 'ì¼_ì›”_í™”_수_목_금_토'.split('_'), + longDateFormat : { + LT : 'A hì‹œ m분', + LTS : 'A hì‹œ m분 sì´ˆ', + L : 'YYYY.MM.DD', + LL : 'YYYYë…„ MMMM Dì¼', + LLL : 'YYYYë…„ MMMM Dì¼ LT', + LLLL : 'YYYYë…„ MMMM Dì¼ dddd LT' + }, + calendar : { + sameDay : '오늘 LT', + nextDay : 'ë‚´ì¼ LT', + nextWeek : 'dddd LT', + lastDay : 'ì–´ì œ LT', + lastWeek : '지난주 dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s 후', + past : '%s ì „', + s : '몇초', + ss : '%dì´ˆ', + m : 'ì¼ë¶„', + mm : '%d분', + h : '한시간', + hh : '%d시간', + d : '하루', + dd : '%dì¼', + M : '한달', + MM : '%d달', + y : 'ì¼ë…„', + yy : '%dë…„' + }, + ordinalParse : /\d{1,2}ì¼/, + ordinal : '%dì¼', + meridiemParse : /오전|오후/, + isPM : function (token) { + return token === '오후'; + }, + meridiem : function (hour, minute, isUpper) { + return hour < 12 ? '오전' : '오후'; + } + }); +})); + +// moment.js locale configuration +// locale : Luxembourgish (lb) +// author : mweimerskirch : https://github.com/mweimerskirch, David Raison : https://github.com/kwisatz + +// Note: Luxembourgish has a very particular phonological rule ('Eifeler Regel') that causes the +// deletion of the final 'n' in certain contexts. That's what the 'eifelerRegelAppliesToWeekday' +// and 'eifelerRegelAppliesToNumber' methods are meant for + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eng Minutt', 'enger Minutt'], + 'h': ['eng Stonn', 'enger Stonn'], + 'd': ['een Dag', 'engem Dag'], + 'M': ['ee Mount', 'engem Mount'], + 'y': ['ee Joer', 'engem Joer'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + function processFutureTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'a ' + string; + } + return 'an ' + string; + } + + function processPastTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'viru ' + string; + } + return 'virun ' + string; + } + + /** + * Returns true if the word before the given number loses the '-n' ending. + * e.g. 'an 10 Deeg' but 'a 5 Deeg' + * + * @param number {integer} + * @returns {boolean} + */ + function eifelerRegelAppliesToNumber(number) { + number = parseInt(number, 10); + if (isNaN(number)) { + return false; + } + if (number < 0) { + // Negative Number --> always true + return true; + } else if (number < 10) { + // Only 1 digit + if (4 <= number && number <= 7) { + return true; + } + return false; + } else if (number < 100) { + // 2 digits + var lastDigit = number % 10, firstDigit = number / 10; + if (lastDigit === 0) { + return eifelerRegelAppliesToNumber(firstDigit); + } + return eifelerRegelAppliesToNumber(lastDigit); + } else if (number < 10000) { + // 3 or 4 digits --> recursively check first digit + while (number >= 10) { + number = number / 10; + } + return eifelerRegelAppliesToNumber(number); + } else { + // Anything larger than 4 digits: recursively check first n-3 digits + number = number / 1000; + return eifelerRegelAppliesToNumber(number); + } + } + + return moment.defineLocale('lb', { + months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'), + weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'), + weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'), + longDateFormat: { + LT: 'H:mm [Auer]', + LTS: 'H:mm:ss [Auer]', + L: 'DD.MM.YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY LT', + LLLL: 'dddd, D. MMMM YYYY LT' + }, + calendar: { + sameDay: '[Haut um] LT', + sameElse: 'L', + nextDay: '[Muer um] LT', + nextWeek: 'dddd [um] LT', + lastDay: '[Gëschter um] LT', + lastWeek: function () { + // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule + switch (this.day()) { + case 2: + case 4: + return '[Leschten] dddd [um] LT'; + default: + return '[Leschte] dddd [um] LT'; + } + } + }, + relativeTime : { + future : processFutureTime, + past : processPastTime, + s : 'e puer Sekonnen', + m : processRelativeTime, + mm : '%d Minutten', + h : processRelativeTime, + hh : '%d Stonnen', + d : processRelativeTime, + dd : '%d Deeg', + M : processRelativeTime, + MM : '%d Méint', + y : processRelativeTime, + yy : '%d Joer' + }, + ordinalParse: /\d{1,2}\./, + ordinal: '%d.', + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Lithuanian (lt) +// author : Mindaugas MozÅ«ras : https://github.com/mmozuras + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var units = { + 'm' : 'minutÄ—_minutÄ—s_minutÄ™', + 'mm': 'minutÄ—s_minuÄių_minutes', + 'h' : 'valanda_valandos_valandÄ…', + 'hh': 'valandos_valandų_valandas', + 'd' : 'diena_dienos_dienÄ…', + 'dd': 'dienos_dienų_dienas', + 'M' : 'mÄ—nuo_mÄ—nesio_mÄ—nesį', + 'MM': 'mÄ—nesiai_mÄ—nesių_mÄ—nesius', + 'y' : 'metai_metų_metus', + 'yy': 'metai_metų_metus' + }, + weekDays = 'sekmadienis_pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis'.split('_'); + + function translateSeconds(number, withoutSuffix, key, isFuture) { + if (withoutSuffix) { + return 'kelios sekundÄ—s'; + } else { + return isFuture ? 'kelių sekundžių' : 'kelias sekundes'; + } + } + + function translateSingular(number, withoutSuffix, key, isFuture) { + return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]); + } + + function special(number) { + return number % 10 === 0 || (number > 10 && number < 20); + } + + function forms(key) { + return units[key].split('_'); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + if (number === 1) { + return result + translateSingular(number, withoutSuffix, key[0], isFuture); + } else if (withoutSuffix) { + return result + (special(number) ? forms(key)[1] : forms(key)[0]); + } else { + if (isFuture) { + return result + forms(key)[1]; + } else { + return result + (special(number) ? forms(key)[1] : forms(key)[2]); + } + } + } + + function relativeWeekDay(moment, format) { + var nominative = format.indexOf('dddd HH:mm') === -1, + weekDay = weekDays[moment.day()]; + + return nominative ? weekDay : weekDay.substring(0, weekDay.length - 2) + 'į'; + } + + return moment.defineLocale('lt', { + months : 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio'.split('_'), + monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'), + weekdays : relativeWeekDay, + weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Å eÅ¡'.split('_'), + weekdaysMin : 'S_P_A_T_K_Pn_Å '.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY [m.] MMMM D [d.]', + LLL : 'YYYY [m.] MMMM D [d.], LT [val.]', + LLLL : 'YYYY [m.] MMMM D [d.], dddd, LT [val.]', + l : 'YYYY-MM-DD', + ll : 'YYYY [m.] MMMM D [d.]', + lll : 'YYYY [m.] MMMM D [d.], LT [val.]', + llll : 'YYYY [m.] MMMM D [d.], ddd, LT [val.]' + }, + calendar : { + sameDay : '[Å iandien] LT', + nextDay : '[Rytoj] LT', + nextWeek : 'dddd LT', + lastDay : '[Vakar] LT', + lastWeek : '[PraÄ—jusį] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : 'po %s', + past : 'prieÅ¡ %s', + s : translateSeconds, + m : translateSingular, + mm : translate, + h : translateSingular, + hh : translate, + d : translateSingular, + dd : translate, + M : translateSingular, + MM : translate, + y : translateSingular, + yy : translate + }, + ordinalParse: /\d{1,2}-oji/, + ordinal : function (number) { + return number + '-oji'; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : latvian (lv) +// author : Kristaps Karlsons : https://github.com/skakri + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var units = { + 'mm': 'minÅ«ti_minÅ«tes_minÅ«te_minÅ«tes', + 'hh': 'stundu_stundas_stunda_stundas', + 'dd': 'dienu_dienas_diena_dienas', + 'MM': 'mÄ“nesi_mÄ“neÅ¡us_mÄ“nesis_mÄ“neÅ¡i', + 'yy': 'gadu_gadus_gads_gadi' + }; + + function format(word, number, withoutSuffix) { + var forms = word.split('_'); + if (withoutSuffix) { + return number % 10 === 1 && number !== 11 ? forms[2] : forms[3]; + } else { + return number % 10 === 1 && number !== 11 ? forms[0] : forms[1]; + } + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + return number + ' ' + format(units[key], number, withoutSuffix); + } + + return moment.defineLocale('lv', { + months : 'janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jÅ«n_jÅ«l_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'svÄ“tdiena_pirmdiena_otrdiena_treÅ¡diena_ceturtdiena_piektdiena_sestdiena'.split('_'), + weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'), + weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'YYYY. [gada] D. MMMM', + LLL : 'YYYY. [gada] D. MMMM, LT', + LLLL : 'YYYY. [gada] D. MMMM, dddd, LT' + }, + calendar : { + sameDay : '[Å odien pulksten] LT', + nextDay : '[RÄ«t pulksten] LT', + nextWeek : 'dddd [pulksten] LT', + lastDay : '[Vakar pulksten] LT', + lastWeek : '[PagÄjuÅ¡Ä] dddd [pulksten] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s vÄ“lÄk', + past : '%s agrÄk', + s : 'dažas sekundes', + m : 'minÅ«ti', + mm : relativeTimeWithPlural, + h : 'stundu', + hh : relativeTimeWithPlural, + d : 'dienu', + dd : relativeTimeWithPlural, + M : 'mÄ“nesi', + MM : relativeTimeWithPlural, + y : 'gadu', + yy : relativeTimeWithPlural + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : macedonian (mk) +// author : Borislav Mickov : https://github.com/B0k0 + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('mk', { + months : 'јануари_февруари_март_април_мај_јуни_јули_авгуÑÑ‚_Ñептември_октомври_ноември_декември'.split('_'), + monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_Ñеп_окт_ное_дек'.split('_'), + weekdays : 'недела_понеделник_вторник_Ñреда_четврток_петок_Ñабота'.split('_'), + weekdaysShort : 'нед_пон_вто_Ñре_чет_пет_Ñаб'.split('_'), + weekdaysMin : 'нe_пo_вт_ÑÑ€_че_пе_Ña'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'D.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Ð”ÐµÐ½ÐµÑ Ð²Ð¾] LT', + nextDay : '[Утре во] LT', + nextWeek : 'dddd [во] LT', + lastDay : '[Вчера во] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[Во изминатата] dddd [во] LT'; + case 1: + case 2: + case 4: + case 5: + return '[Во изминатиот] dddd [во] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'поÑле %s', + past : 'пред %s', + s : 'неколку Ñекунди', + m : 'минута', + mm : '%d минути', + h : 'чаÑ', + hh : '%d чаÑа', + d : 'ден', + dd : '%d дена', + M : 'меÑец', + MM : '%d меÑеци', + y : 'година', + yy : '%d години' + }, + ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : malayalam (ml) +// author : Floyd Pink : https://github.com/floydpink + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ml', { + months : 'ജനàµà´µà´°à´¿_ഫെബàµà´°àµà´µà´°à´¿_മാർചàµà´šàµ_à´à´ªàµà´°à´¿àµ½_മേയàµ_ജൂൺ_ജൂലൈ_à´“à´—à´¸àµà´±àµà´±àµ_സെപàµà´±àµà´±à´‚ബർ_à´’à´•àµà´Ÿàµ‹à´¬àµ¼_നവംബർ_ഡിസംബർ'.split('_'), + monthsShort : 'ജനàµ._ഫെബàµà´°àµ._മാർ._à´à´ªàµà´°à´¿._മേയàµ_ജൂൺ_ജൂലൈ._à´“à´—._സെപàµà´±àµà´±._à´’à´•àµà´Ÿàµ‹._നവം._ഡിസം.'.split('_'), + weekdays : 'ഞായറാഴàµà´š_തിങàµà´•à´³à´¾à´´àµà´š_ചൊവàµà´µà´¾à´´àµà´š_à´¬àµà´§à´¨à´¾à´´àµà´š_à´µàµà´¯à´¾à´´à´¾à´´àµà´š_വെളàµà´³à´¿à´¯à´¾à´´àµà´š_ശനിയാഴàµà´š'.split('_'), + weekdaysShort : 'ഞായർ_തിങàµà´•àµ¾_ചൊവàµà´µ_à´¬àµà´§àµ»_à´µàµà´¯à´¾à´´à´‚_വെളàµà´³à´¿_ശനി'.split('_'), + weekdaysMin : 'à´žà´¾_തി_ചൊ_à´¬àµ_à´µàµà´¯à´¾_വെ_à´¶'.split('_'), + longDateFormat : { + LT : 'A h:mm -à´¨àµ', + LTS : 'A h:mm:ss -à´¨àµ', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[ഇനàµà´¨àµ] LT', + nextDay : '[നാളെ] LT', + nextWeek : 'dddd, LT', + lastDay : '[ഇനàµà´¨à´²àµ†] LT', + lastWeek : '[à´•à´´à´¿à´žàµà´ž] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s à´•à´´à´¿à´žàµà´žàµ', + past : '%s à´®àµàµ»à´ªàµ', + s : 'അൽപ നിമിഷങàµà´™àµ¾', + m : 'ഒരൠമിനിറàµà´±àµ', + mm : '%d മിനിറàµà´±àµ', + h : 'ഒരൠമണികàµà´•àµ‚ർ', + hh : '%d മണികàµà´•àµ‚ർ', + d : 'ഒരൠദിവസം', + dd : '%d ദിവസം', + M : 'ഒരൠമാസം', + MM : '%d മാസം', + y : 'ഒരൠവർഷം', + yy : '%d വർഷം' + }, + meridiemParse: /രാതàµà´°à´¿|രാവിലെ|ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿/i, + isPM : function (input) { + return /^(ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'രാതàµà´°à´¿'; + } else if (hour < 12) { + return 'രാവിലെ'; + } else if (hour < 17) { + return 'ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ'; + } else if (hour < 20) { + return 'വൈകàµà´¨àµà´¨àµ‡à´°à´‚'; + } else { + return 'രാതàµà´°à´¿'; + } + } + }); +})); + +// moment.js locale configuration +// locale : Marathi (mr) +// author : Harshad Kale : https://github.com/kalehv + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.defineLocale('mr', { + months : 'जानेवारी_फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€_मारà¥à¤š_à¤à¤ªà¥à¤°à¤¿à¤²_मे_जून_जà¥à¤²à¥ˆ_ऑगसà¥à¤Ÿ_सपà¥à¤Ÿà¥‡à¤‚बर_ऑकà¥à¤Ÿà¥‹à¤¬à¤°_नोवà¥à¤¹à¥‡à¤‚बर_डिसेंबर'.split('_'), + monthsShort: 'जाने._फेबà¥à¤°à¥._मारà¥à¤š._à¤à¤ªà¥à¤°à¤¿._मे._जून._जà¥à¤²à¥ˆ._ऑग._सपà¥à¤Ÿà¥‡à¤‚._ऑकà¥à¤Ÿà¥‹._नोवà¥à¤¹à¥‡à¤‚._डिसें.'.split('_'), + weekdays : 'रविवार_सोमवार_मंगळवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split('_'), + weekdaysShort : 'रवि_सोम_मंगळ_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split('_'), + weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split('_'), + longDateFormat : { + LT : 'A h:mm वाजता', + LTS : 'A h:mm:ss वाजता', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[उदà¥à¤¯à¤¾] LT', + nextWeek : 'dddd, LT', + lastDay : '[काल] LT', + lastWeek: '[मागील] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s नंतर', + past : '%s पूरà¥à¤µà¥€', + s : 'सेकंद', + m: 'à¤à¤• मिनिट', + mm: '%d मिनिटे', + h : 'à¤à¤• तास', + hh : '%d तास', + d : 'à¤à¤• दिवस', + dd : '%d दिवस', + M : 'à¤à¤• महिना', + MM : '%d महिने', + y : 'à¤à¤• वरà¥à¤·', + yy : '%d वरà¥à¤·à¥‡' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /रातà¥à¤°à¥€|सकाळी|दà¥à¤ªà¤¾à¤°à¥€|सायंकाळी/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'रातà¥à¤°à¥€') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'सकाळी') { + return hour; + } else if (meridiem === 'दà¥à¤ªà¤¾à¤°à¥€') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'सायंकाळी') { + return hour + 12; + } + }, + meridiem: function (hour, minute, isLower) + { + if (hour < 4) { + return 'रातà¥à¤°à¥€'; + } else if (hour < 10) { + return 'सकाळी'; + } else if (hour < 17) { + return 'दà¥à¤ªà¤¾à¤°à¥€'; + } else if (hour < 20) { + return 'सायंकाळी'; + } else { + return 'रातà¥à¤°à¥€'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Bahasa Malaysia (ms-MY) +// author : Weldan Jamili : https://github.com/weldan + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ms-my', { + months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), + monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), + weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), + weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), + weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'LT.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] LT', + LLLL : 'dddd, D MMMM YYYY [pukul] LT' + }, + meridiemParse: /pagi|tengahari|petang|malam/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'tengahari') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'petang' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'tengahari'; + } else if (hours < 19) { + return 'petang'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Esok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kelmarin pukul] LT', + lastWeek : 'dddd [lepas pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lepas', + s : 'beberapa saat', + m : 'seminit', + mm : '%d minit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Burmese (my) +// author : Squar team, mysquar.com + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': 'á', + '2': 'á‚', + '3': 'áƒ', + '4': 'á„', + '5': 'á…', + '6': 'á†', + '7': 'á‡', + '8': 'áˆ', + '9': 'á‰', + '0': 'á€' + }, numberMap = { + 'á': '1', + 'á‚': '2', + 'áƒ': '3', + 'á„': '4', + 'á…': '5', + 'á†': '6', + 'á‡': '7', + 'áˆ': '8', + 'á‰': '9', + 'á€': '0' + }; + return moment.defineLocale('my', { + months: 'ဇန်နá€á€«á€›á€®_ဖေဖော်á€á€«á€›á€®_မá€á€º_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုá€á€º_စက်á€á€„်ဘာ_အောက်á€á€­á€¯á€˜á€¬_နိုá€á€„်ဘာ_ဒီဇင်ဘာ'.split('_'), + monthsShort: 'ဇန်_ဖေ_မá€á€º_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'), + weekdays: 'á€á€”င်္ဂနွေ_á€á€”င်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပá€á€±á€¸_သောကြာ_စနေ'.split('_'), + weekdaysShort: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), + weekdaysMin: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd D MMMM YYYY LT' + }, + calendar: { + sameDay: '[ယနေ.] LT [မှာ]', + nextDay: '[မနက်ဖြန်] LT [မှာ]', + nextWeek: 'dddd LT [မှာ]', + lastDay: '[မနေ.က] LT [မှာ]', + lastWeek: '[ပြီးá€á€²á€·á€žá€±á€¬] dddd LT [မှာ]', + sameElse: 'L' + }, + relativeTime: { + future: 'လာမည့် %s မှာ', + past: 'လွန်á€á€²á€·á€žá€±á€¬ %s က', + s: 'စက္ကန်.အနည်းငယ်', + m: 'á€á€…်မိနစ်', + mm: '%d မိနစ်', + h: 'á€á€…်နာရီ', + hh: '%d နာရီ', + d: 'á€á€…်ရက်', + dd: '%d ရက်', + M: 'á€á€…်လ', + MM: '%d လ', + y: 'á€á€…်နှစ်', + yy: '%d နှစ်' + }, + preparse: function (string) { + return string.replace(/[áá‚áƒá„á…á†á‡áˆá‰á€]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : norwegian bokmÃ¥l (nb) +// authors : Espen Hovlandsdal : https://github.com/rexxars +// Sigurd Gartmann : https://github.com/sigurdga + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('nb', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), + weekdaysShort : 'søn_man_tirs_ons_tors_fre_lør'.split('_'), + weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'H.mm', + LTS : 'LT.ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] LT', + LLLL : 'dddd D. MMMM YYYY [kl.] LT' + }, + calendar : { + sameDay: '[i dag kl.] LT', + nextDay: '[i morgen kl.] LT', + nextWeek: 'dddd [kl.] LT', + lastDay: '[i gÃ¥r kl.] LT', + lastWeek: '[forrige] dddd [kl.] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'for %s siden', + s : 'noen sekunder', + m : 'ett minutt', + mm : '%d minutter', + h : 'en time', + hh : '%d timer', + d : 'en dag', + dd : '%d dager', + M : 'en mÃ¥ned', + MM : '%d mÃ¥neder', + y : 'ett Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : nepali/nepalese +// author : suvash : https://github.com/suvash + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.defineLocale('ne', { + months : 'जनवरी_फेबà¥à¤°à¥à¤µà¤°à¥€_मारà¥à¤š_अपà¥à¤°à¤¿à¤²_मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ_अगषà¥à¤Ÿ_सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°_अकà¥à¤Ÿà¥‹à¤¬à¤°_नोभेमà¥à¤¬à¤°_डिसेमà¥à¤¬à¤°'.split('_'), + monthsShort : 'जन._फेबà¥à¤°à¥._मारà¥à¤š_अपà¥à¤°à¤¿._मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ._अग._सेपà¥à¤Ÿ._अकà¥à¤Ÿà¥‹._नोभे._डिसे.'.split('_'), + weekdays : 'आइतबार_सोमबार_मङà¥à¤—लबार_बà¥à¤§à¤¬à¤¾à¤°_बिहिबार_शà¥à¤•à¥à¤°à¤¬à¤¾à¤°_शनिबार'.split('_'), + weekdaysShort : 'आइत._सोम._मङà¥à¤—ल._बà¥à¤§._बिहि._शà¥à¤•à¥à¤°._शनि.'.split('_'), + weekdaysMin : 'आइ._सो._मङà¥_बà¥._बि._शà¥._श.'.split('_'), + longDateFormat : { + LT : 'Aको h:mm बजे', + LTS : 'Aको h:mm:ss बजे', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /राती|बिहान|दिउà¤à¤¸à¥‹|बेलà¥à¤•à¤¾|साà¤à¤|राती/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'राती') { + return hour < 3 ? hour : hour + 12; + } else if (meridiem === 'बिहान') { + return hour; + } else if (meridiem === 'दिउà¤à¤¸à¥‹') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'बेलà¥à¤•à¤¾' || meridiem === 'साà¤à¤') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 3) { + return 'राती'; + } else if (hour < 10) { + return 'बिहान'; + } else if (hour < 15) { + return 'दिउà¤à¤¸à¥‹'; + } else if (hour < 18) { + return 'बेलà¥à¤•à¤¾'; + } else if (hour < 20) { + return 'साà¤à¤'; + } else { + return 'राती'; + } + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[भोली] LT', + nextWeek : '[आउà¤à¤¦à¥‹] dddd[,] LT', + lastDay : '[हिजो] LT', + lastWeek : '[गà¤à¤•à¥‹] dddd[,] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%sमा', + past : '%s अगाडी', + s : 'केही समय', + m : 'à¤à¤• मिनेट', + mm : '%d मिनेट', + h : 'à¤à¤• घणà¥à¤Ÿà¤¾', + hh : '%d घणà¥à¤Ÿà¤¾', + d : 'à¤à¤• दिन', + dd : '%d दिन', + M : 'à¤à¤• महिना', + MM : '%d महिना', + y : 'à¤à¤• बरà¥à¤·', + yy : '%d बरà¥à¤·' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : dutch (nl) +// author : Joris Röling : https://github.com/jjupiter + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); + + return moment.defineLocale('nl', { + months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), + weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), + weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[vandaag om] LT', + nextDay: '[morgen om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[gisteren om] LT', + lastWeek: '[afgelopen] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'over %s', + past : '%s geleden', + s : 'een paar seconden', + m : 'één minuut', + mm : '%d minuten', + h : 'één uur', + hh : '%d uur', + d : 'één dag', + dd : '%d dagen', + M : 'één maand', + MM : '%d maanden', + y : 'één jaar', + yy : '%d jaar' + }, + ordinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : norwegian nynorsk (nn) +// author : https://github.com/mechuwind + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('nn', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sundag_mÃ¥ndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'), + weekdaysShort : 'sun_mÃ¥n_tys_ons_tor_fre_lau'.split('_'), + weekdaysMin : 'su_mÃ¥_ty_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[I dag klokka] LT', + nextDay: '[I morgon klokka] LT', + nextWeek: 'dddd [klokka] LT', + lastDay: '[I gÃ¥r klokka] LT', + lastWeek: '[FøregÃ¥ande] dddd [klokka] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'for %s sidan', + s : 'nokre sekund', + m : 'eit minutt', + mm : '%d minutt', + h : 'ein time', + hh : '%d timar', + d : 'ein dag', + dd : '%d dagar', + M : 'ein mÃ¥nad', + MM : '%d mÃ¥nader', + y : 'eit Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : polish (pl) +// author : Rafal Hirsz : https://github.com/evoL + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var monthsNominative = 'styczeÅ„_luty_marzec_kwiecieÅ„_maj_czerwiec_lipiec_sierpieÅ„_wrzesieÅ„_październik_listopad_grudzieÅ„'.split('_'), + monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrzeÅ›nia_października_listopada_grudnia'.split('_'); + + function plural(n) { + return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1); + } + + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'minuta' : 'minutÄ™'; + case 'mm': + return result + (plural(number) ? 'minuty' : 'minut'); + case 'h': + return withoutSuffix ? 'godzina' : 'godzinÄ™'; + case 'hh': + return result + (plural(number) ? 'godziny' : 'godzin'); + case 'MM': + return result + (plural(number) ? 'miesiÄ…ce' : 'miesiÄ™cy'); + case 'yy': + return result + (plural(number) ? 'lata' : 'lat'); + } + } + + return moment.defineLocale('pl', { + months : function (momentToFormat, format) { + if (/D MMMM/.test(format)) { + return monthsSubjective[momentToFormat.month()]; + } else { + return monthsNominative[momentToFormat.month()]; + } + }, + monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'), + weekdays : 'niedziela_poniedziaÅ‚ek_wtorek_Å›roda_czwartek_piÄ…tek_sobota'.split('_'), + weekdaysShort : 'nie_pon_wt_Å›r_czw_pt_sb'.split('_'), + weekdaysMin : 'N_Pn_Wt_Åšr_Cz_Pt_So'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay: '[DziÅ› o] LT', + nextDay: '[Jutro o] LT', + nextWeek: '[W] dddd [o] LT', + lastDay: '[Wczoraj o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[W zeszÅ‚Ä… niedzielÄ™ o] LT'; + case 3: + return '[W zeszÅ‚Ä… Å›rodÄ™ o] LT'; + case 6: + return '[W zeszÅ‚Ä… sobotÄ™ o] LT'; + default: + return '[W zeszÅ‚y] dddd [o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : '%s temu', + s : 'kilka sekund', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : '1 dzieÅ„', + dd : '%d dni', + M : 'miesiÄ…c', + MM : translate, + y : 'rok', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : brazilian portuguese (pt-br) +// author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('pt-br', { + months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), + monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), + weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'), + weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'), + weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY [às] LT', + LLLL : 'dddd, D [de] MMMM [de] YYYY [às] LT' + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : 'em %s', + past : '%s atrás', + s : 'segundos', + m : 'um minuto', + mm : '%d minutos', + h : 'uma hora', + hh : '%d horas', + d : 'um dia', + dd : '%d dias', + M : 'um mês', + MM : '%d meses', + y : 'um ano', + yy : '%d anos' + }, + ordinalParse: /\d{1,2}º/, + ordinal : '%dº' + }); +})); + +// moment.js locale configuration +// locale : portuguese (pt) +// author : Jefferson : https://github.com/jalex79 + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('pt', { + months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), + monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), + weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'), + weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'), + weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY LT', + LLLL : 'dddd, D [de] MMMM [de] YYYY LT' + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : 'em %s', + past : 'há %s', + s : 'segundos', + m : 'um minuto', + mm : '%d minutos', + h : 'uma hora', + hh : '%d horas', + d : 'um dia', + dd : '%d dias', + M : 'um mês', + MM : '%d meses', + y : 'um ano', + yy : '%d anos' + }, + ordinalParse: /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : romanian (ro) +// author : Vlad Gurdiga : https://github.com/gurdiga +// author : Valentin Agachi : https://github.com/avaly + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': 'minute', + 'hh': 'ore', + 'dd': 'zile', + 'MM': 'luni', + 'yy': 'ani' + }, + separator = ' '; + if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) { + separator = ' de '; + } + + return number + separator + format[key]; + } + + return moment.defineLocale('ro', { + months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'), + monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'), + weekdays : 'duminică_luni_marÈ›i_miercuri_joi_vineri_sâmbătă'.split('_'), + weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'), + weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY H:mm', + LLLL : 'dddd, D MMMM YYYY H:mm' + }, + calendar : { + sameDay: '[azi la] LT', + nextDay: '[mâine la] LT', + nextWeek: 'dddd [la] LT', + lastDay: '[ieri la] LT', + lastWeek: '[fosta] dddd [la] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'peste %s', + past : '%s în urmă', + s : 'câteva secunde', + m : 'un minut', + mm : relativeTimeWithPlural, + h : 'o oră', + hh : relativeTimeWithPlural, + d : 'o zi', + dd : relativeTimeWithPlural, + M : 'o lună', + MM : relativeTimeWithPlural, + y : 'un an', + yy : relativeTimeWithPlural + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : russian (ru) +// author : Viktorminator : https://github.com/Viktorminator +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут', + 'hh': 'чаÑ_чаÑа_чаÑов', + 'dd': 'день_днÑ_дней', + 'MM': 'меÑÑц_меÑÑца_меÑÑцев', + 'yy': 'год_года_лет' + }; + if (key === 'm') { + return withoutSuffix ? 'минута' : 'минуту'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь'.split('_'), + 'accusative': 'ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function monthsShortCaseReplace(m, format) { + var monthsShort = { + 'nominative': 'Ñнв_фев_март_апр_май_июнь_июль_авг_Ñен_окт_ноÑ_дек'.split('_'), + 'accusative': 'Ñнв_фев_мар_апр_маÑ_июнÑ_июлÑ_авг_Ñен_окт_ноÑ_дек'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return monthsShort[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота'.split('_'), + 'accusative': 'воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу'.split('_') + }, + + nounCase = (/\[ ?[Вв] ?(?:прошлую|Ñледующую|Ñту)? ?\] ?dddd/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.defineLocale('ru', { + months : monthsCaseReplace, + monthsShort : monthsShortCaseReplace, + weekdays : weekdaysCaseReplace, + weekdaysShort : 'вÑ_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + weekdaysMin : 'вÑ_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + monthsParse : [/^Ñнв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[й|Ñ]/i, /^июн/i, /^июл/i, /^авг/i, /^Ñен/i, /^окт/i, /^ноÑ/i, /^дек/i], + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY г.', + LLL : 'D MMMM YYYY г., LT', + LLLL : 'dddd, D MMMM YYYY г., LT' + }, + calendar : { + sameDay: '[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT', + nextDay: '[Завтра в] LT', + lastDay: '[Вчера в] LT', + nextWeek: function () { + return this.day() === 2 ? '[Во] dddd [в] LT' : '[Ð’] dddd [в] LT'; + }, + lastWeek: function (now) { + if (now.week() !== this.week()) { + switch (this.day()) { + case 0: + return '[Ð’ прошлое] dddd [в] LT'; + case 1: + case 2: + case 4: + return '[Ð’ прошлый] dddd [в] LT'; + case 3: + case 5: + case 6: + return '[Ð’ прошлую] dddd [в] LT'; + } + } else { + if (this.day() === 2) { + return '[Во] dddd [в] LT'; + } else { + return '[Ð’] dddd [в] LT'; + } + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'через %s', + past : '%s назад', + s : 'неÑколько Ñекунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : 'чаÑ', + hh : relativeTimeWithPlural, + d : 'день', + dd : relativeTimeWithPlural, + M : 'меÑÑц', + MM : relativeTimeWithPlural, + y : 'год', + yy : relativeTimeWithPlural + }, + + meridiemParse: /ночи|утра|днÑ|вечера/i, + isPM : function (input) { + return /^(днÑ|вечера)$/.test(input); + }, + + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночи'; + } else if (hour < 12) { + return 'утра'; + } else if (hour < 17) { + return 'днÑ'; + } else { + return 'вечера'; + } + }, + + ordinalParse: /\d{1,2}-(й|го|Ñ)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + return number + '-й'; + case 'D': + return number + '-го'; + case 'w': + case 'W': + return number + '-Ñ'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : slovak (sk) +// author : Martin Minka : https://github.com/k2s +// based on work of petrbela : https://github.com/petrbela + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'), + monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_'); + + function plural(n) { + return (n > 1) && (n < 5); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami'; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minúty' : 'minút'); + } else { + return result + 'minútami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodín'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'deň' : 'dňom'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dni' : 'dní'); + } else { + return result + 'dňami'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'mesiace' : 'mesiacov'); + } else { + return result + 'mesiacmi'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokom'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'rokov'); + } else { + return result + 'rokmi'; + } + break; + } + } + + return moment.defineLocale('sk', { + months : months, + monthsShort : monthsShort, + monthsParse : (function (months, monthsShort) { + var i, _monthsParse = []; + for (i = 0; i < 12; i++) { + // use custom parser to solve problem with July (Äervenec) + _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); + } + return _monthsParse; + }(months, monthsShort)), + weekdays : 'nedeľa_pondelok_utorok_streda_Å¡tvrtok_piatok_sobota'.split('_'), + weekdaysShort : 'ne_po_ut_st_Å¡t_pi_so'.split('_'), + weekdaysMin : 'ne_po_ut_st_Å¡t_pi_so'.split('_'), + longDateFormat : { + LT: 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[dnes o] LT', + nextDay: '[zajtra o] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedeľu o] LT'; + case 1: + case 2: + return '[v] dddd [o] LT'; + case 3: + return '[v stredu o] LT'; + case 4: + return '[vo Å¡tvrtok o] LT'; + case 5: + return '[v piatok o] LT'; + case 6: + return '[v sobotu o] LT'; + } + }, + lastDay: '[vÄera o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulú nedeľu o] LT'; + case 1: + case 2: + return '[minulý] dddd [o] LT'; + case 3: + return '[minulú stredu o] LT'; + case 4: + case 5: + return '[minulý] dddd [o] LT'; + case 6: + return '[minulú sobotu o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pred %s', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : slovenian (sl) +// author : Robert SedovÅ¡ek : https://github.com/sedovsek + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'ena minuta' : 'eno minuto'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2) { + result += 'minuti'; + } else if (number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minut'; + } + return result; + case 'h': + return withoutSuffix ? 'ena ura' : 'eno uro'; + case 'hh': + if (number === 1) { + result += 'ura'; + } else if (number === 2) { + result += 'uri'; + } else if (number === 3 || number === 4) { + result += 'ure'; + } else { + result += 'ur'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dni'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mesec'; + } else if (number === 2) { + result += 'meseca'; + } else if (number === 3 || number === 4) { + result += 'mesece'; + } else { + result += 'mesecev'; + } + return result; + case 'yy': + if (number === 1) { + result += 'leto'; + } else if (number === 2) { + result += 'leti'; + } else if (number === 3 || number === 4) { + result += 'leta'; + } else { + result += 'let'; + } + return result; + } + } + + return moment.defineLocale('sl', { + months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'), + monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'), + weekdays : 'nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota'.split('_'), + weekdaysShort : 'ned._pon._tor._sre._Äet._pet._sob.'.split('_'), + weekdaysMin : 'ne_po_to_sr_Äe_pe_so'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD. MM. YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[danes ob] LT', + nextDay : '[jutri ob] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[v] [nedeljo] [ob] LT'; + case 3: + return '[v] [sredo] [ob] LT'; + case 6: + return '[v] [soboto] [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[v] dddd [ob] LT'; + } + }, + lastDay : '[vÄeraj ob] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[prejÅ¡nja] dddd [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[prejÅ¡nji] dddd [ob] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'Äez %s', + past : '%s nazaj', + s : 'nekaj sekund', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'en dan', + dd : translate, + M : 'en mesec', + MM : translate, + y : 'eno leto', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Albanian (sq) +// author : Flakërim Ismani : https://github.com/flakerimi +// author: Menelion Elensúle: https://github.com/Oire (tests) +// author : Oerd Cukalla : https://github.com/oerd (fixes) + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('sq', { + months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'), + monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'), + weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'), + weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'), + weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'), + meridiemParse: /PD|MD/, + isPM: function (input) { + return input.charAt(0) === 'M'; + }, + meridiem : function (hours, minutes, isLower) { + return hours < 12 ? 'PD' : 'MD'; + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Sot në] LT', + nextDay : '[Nesër në] LT', + nextWeek : 'dddd [në] LT', + lastDay : '[Dje në] LT', + lastWeek : 'dddd [e kaluar në] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'në %s', + past : '%s më parë', + s : 'disa sekonda', + m : 'një minutë', + mm : '%d minuta', + h : 'një orë', + hh : '%d orë', + d : 'një ditë', + dd : '%d ditë', + M : 'një muaj', + MM : '%d muaj', + y : 'një vit', + yy : '%d vite' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Serbian-cyrillic (sr-cyrl) +// author : Milan JanaÄković : https://github.com/milan-j + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var translator = { + words: { //Different grammatical cases + m: ['један минут', 'једне минуте'], + mm: ['минут', 'минуте', 'минута'], + h: ['један Ñат', 'једног Ñата'], + hh: ['Ñат', 'Ñата', 'Ñати'], + dd: ['дан', 'дана', 'дана'], + MM: ['меÑец', 'меÑеца', 'меÑеци'], + yy: ['година', 'године', 'година'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } + }; + + return moment.defineLocale('sr-cyrl', { + months: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'авгуÑÑ‚', 'Ñептембар', 'октобар', 'новембар', 'децембар'], + monthsShort: ['јан.', 'феб.', 'мар.', 'апр.', 'мај', 'јун', 'јул', 'авг.', 'Ñеп.', 'окт.', 'нов.', 'дец.'], + weekdays: ['недеља', 'понедељак', 'уторак', 'Ñреда', 'четвртак', 'петак', 'Ñубота'], + weekdaysShort: ['нед.', 'пон.', 'уто.', 'Ñре.', 'чет.', 'пет.', 'Ñуб.'], + weekdaysMin: ['не', 'по', 'ут', 'ÑÑ€', 'че', 'пе', 'Ñу'], + longDateFormat: { + LT: 'H:mm', + LTS : 'LT:ss', + L: 'DD. MM. YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY LT', + LLLL: 'dddd, D. MMMM YYYY LT' + }, + calendar: { + sameDay: '[Ð´Ð°Ð½Ð°Ñ Ñƒ] LT', + nextDay: '[Ñутра у] LT', + + nextWeek: function () { + switch (this.day()) { + case 0: + return '[у] [недељу] [у] LT'; + case 3: + return '[у] [Ñреду] [у] LT'; + case 6: + return '[у] [Ñуботу] [у] LT'; + case 1: + case 2: + case 4: + case 5: + return '[у] dddd [у] LT'; + } + }, + lastDay : '[јуче у] LT', + lastWeek : function () { + var lastWeekDays = [ + '[прошле] [недеље] [у] LT', + '[прошлог] [понедељка] [у] LT', + '[прошлог] [уторка] [у] LT', + '[прошле] [Ñреде] [у] LT', + '[прошлог] [четвртка] [у] LT', + '[прошлог] [петка] [у] LT', + '[прошле] [Ñуботе] [у] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'за %s', + past : 'пре %s', + s : 'неколико Ñекунди', + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'дан', + dd : translator.translate, + M : 'меÑец', + MM : translator.translate, + y : 'годину', + yy : translator.translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Serbian-latin (sr) +// author : Milan JanaÄković : https://github.com/milan-j + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var translator = { + words: { //Different grammatical cases + m: ['jedan minut', 'jedne minute'], + mm: ['minut', 'minute', 'minuta'], + h: ['jedan sat', 'jednog sata'], + hh: ['sat', 'sata', 'sati'], + dd: ['dan', 'dana', 'dana'], + MM: ['mesec', 'meseca', 'meseci'], + yy: ['godina', 'godine', 'godina'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } + }; + + return moment.defineLocale('sr', { + months: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'], + monthsShort: ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun', 'jul', 'avg.', 'sep.', 'okt.', 'nov.', 'dec.'], + weekdays: ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'Äetvrtak', 'petak', 'subota'], + weekdaysShort: ['ned.', 'pon.', 'uto.', 'sre.', 'Äet.', 'pet.', 'sub.'], + weekdaysMin: ['ne', 'po', 'ut', 'sr', 'Äe', 'pe', 'su'], + longDateFormat: { + LT: 'H:mm', + LTS : 'LT:ss', + L: 'DD. MM. YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY LT', + LLLL: 'dddd, D. MMMM YYYY LT' + }, + calendar: { + sameDay: '[danas u] LT', + nextDay: '[sutra u] LT', + + nextWeek: function () { + switch (this.day()) { + case 0: + return '[u] [nedelju] [u] LT'; + case 3: + return '[u] [sredu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄe u] LT', + lastWeek : function () { + var lastWeekDays = [ + '[proÅ¡le] [nedelje] [u] LT', + '[proÅ¡log] [ponedeljka] [u] LT', + '[proÅ¡log] [utorka] [u] LT', + '[proÅ¡le] [srede] [u] LT', + '[proÅ¡log] [Äetvrtka] [u] LT', + '[proÅ¡log] [petka] [u] LT', + '[proÅ¡le] [subote] [u] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pre %s', + s : 'nekoliko sekundi', + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'dan', + dd : translator.translate, + M : 'mesec', + MM : translator.translate, + y : 'godinu', + yy : translator.translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : swedish (sv) +// author : Jens Alm : https://github.com/ulmus + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('sv', { + months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'söndag_mÃ¥ndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'), + weekdaysShort : 'sön_mÃ¥n_tis_ons_tor_fre_lör'.split('_'), + weekdaysMin : 'sö_mÃ¥_ti_on_to_fr_lö'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Idag] LT', + nextDay: '[Imorgon] LT', + lastDay: '[IgÃ¥r] LT', + nextWeek: 'dddd LT', + lastWeek: '[Förra] dddd[en] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'för %s sedan', + s : 'nÃ¥gra sekunder', + m : 'en minut', + mm : '%d minuter', + h : 'en timme', + hh : '%d timmar', + d : 'en dag', + dd : '%d dagar', + M : 'en mÃ¥nad', + MM : '%d mÃ¥nader', + y : 'ett Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}(e|a)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'e' : + (b === 1) ? 'a' : + (b === 2) ? 'a' : + (b === 3) ? 'e' : 'e'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : tamil (ta) +// author : Arjunkumar Krishnamoorthy : https://github.com/tk120404 + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + /*var symbolMap = { + '1': '௧', + '2': '௨', + '3': '௩', + '4': '௪', + '5': '௫', + '6': '௬', + '7': '௭', + '8': '௮', + '9': '௯', + '0': '௦' + }, + numberMap = { + '௧': '1', + '௨': '2', + '௩': '3', + '௪': '4', + '௫': '5', + '௬': '6', + '௭': '7', + '௮': '8', + '௯': '9', + '௦': '0' + }; */ + + return moment.defineLocale('ta', { + months : 'ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯'.split('_'), + monthsShort : 'ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯'.split('_'), + weekdays : 'ஞாயிறà¯à®±à¯à®•à¯à®•à®¿à®´à®®à¯ˆ_திஙà¯à®•à®Ÿà¯à®•à®¿à®´à®®à¯ˆ_செவà¯à®µà®¾à®¯à¯à®•à®¿à®´à®®à¯ˆ_பà¯à®¤à®©à¯à®•à®¿à®´à®®à¯ˆ_வியாழகà¯à®•à®¿à®´à®®à¯ˆ_வெளà¯à®³à®¿à®•à¯à®•à®¿à®´à®®à¯ˆ_சனிகà¯à®•à®¿à®´à®®à¯ˆ'.split('_'), + weekdaysShort : 'ஞாயிறà¯_திஙà¯à®•à®³à¯_செவà¯à®µà®¾à®¯à¯_பà¯à®¤à®©à¯_வியாழனà¯_வெளà¯à®³à®¿_சனி'.split('_'), + weekdaysMin : 'ஞா_தி_செ_பà¯_வி_வெ_ச'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[இனà¯à®±à¯] LT', + nextDay : '[நாளை] LT', + nextWeek : 'dddd, LT', + lastDay : '[நேறà¯à®±à¯] LT', + lastWeek : '[கடநà¯à®¤ வாரமà¯] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s இலà¯', + past : '%s à®®à¯à®©à¯', + s : 'ஒர௠சில விநாடிகளà¯', + m : 'ஒர௠நிமிடமà¯', + mm : '%d நிமிடஙà¯à®•à®³à¯', + h : 'ஒர௠மணி நேரமà¯', + hh : '%d மணி நேரமà¯', + d : 'ஒர௠நாளà¯', + dd : '%d நாடà¯à®•à®³à¯', + M : 'ஒர௠மாதமà¯', + MM : '%d மாதஙà¯à®•à®³à¯', + y : 'ஒர௠வரà¯à®Ÿà®®à¯', + yy : '%d ஆணà¯à®Ÿà¯à®•à®³à¯' + }, +/* preparse: function (string) { + return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + },*/ + ordinalParse: /\d{1,2}வதà¯/, + ordinal : function (number) { + return number + 'வதà¯'; + }, + + + // refer http://ta.wikipedia.org/s/1er1 + meridiemParse: /யாமமà¯|வைகறை|காலை|நணà¯à®ªà®•à®²à¯|எறà¯à®ªà®¾à®Ÿà¯|மாலை/, + meridiem : function (hour, minute, isLower) { + if (hour < 2) { + return ' யாமமà¯'; + } else if (hour < 6) { + return ' வைகறை'; // வைகறை + } else if (hour < 10) { + return ' காலை'; // காலை + } else if (hour < 14) { + return ' நணà¯à®ªà®•à®²à¯'; // நணà¯à®ªà®•à®²à¯ + } else if (hour < 18) { + return ' எறà¯à®ªà®¾à®Ÿà¯'; // எறà¯à®ªà®¾à®Ÿà¯ + } else if (hour < 22) { + return ' மாலை'; // மாலை + } else { + return ' யாமமà¯'; + } + }, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'யாமமà¯') { + return hour < 2 ? hour : hour + 12; + } else if (meridiem === 'வைகறை' || meridiem === 'காலை') { + return hour; + } else if (meridiem === 'நணà¯à®ªà®•à®²à¯') { + return hour >= 10 ? hour : hour + 12; + } else { + return hour + 12; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : thai (th) +// author : Kridsada Thanabulpong : https://github.com/sirn + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('th', { + months : 'มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม'.split('_'), + monthsShort : 'มà¸à¸£à¸²_à¸à¸¸à¸¡à¸ à¸²_มีนา_เมษา_พฤษภา_มิถุนา_à¸à¸£à¸à¸Žà¸²_สิงหา_à¸à¸±à¸™à¸¢à¸²_ตุลา_พฤศจิà¸à¸²_ธันวา'.split('_'), + weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์'.split('_'), + weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์'.split('_'), // yes, three characters difference + weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'), + longDateFormat : { + LT : 'H นาฬิà¸à¸² m นาที', + LTS : 'LT s วินาที', + L : 'YYYY/MM/DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY เวลา LT', + LLLL : 'วันddddที่ D MMMM YYYY เวลา LT' + }, + meridiemParse: /à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง|หลังเที่ยง/, + isPM: function (input) { + return input === 'หลังเที่ยง'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง'; + } else { + return 'หลังเที่ยง'; + } + }, + calendar : { + sameDay : '[วันนี้ เวลา] LT', + nextDay : '[พรุ่งนี้ เวลา] LT', + nextWeek : 'dddd[หน้า เวลา] LT', + lastDay : '[เมื่อวานนี้ เวลา] LT', + lastWeek : '[วัน]dddd[ที่à¹à¸¥à¹‰à¸§ เวลา] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'อีภ%s', + past : '%sที่à¹à¸¥à¹‰à¸§', + s : 'ไม่à¸à¸µà¹ˆà¸§à¸´à¸™à¸²à¸—ี', + m : '1 นาที', + mm : '%d นาที', + h : '1 ชั่วโมง', + hh : '%d ชั่วโมง', + d : '1 วัน', + dd : '%d วัน', + M : '1 เดือน', + MM : '%d เดือน', + y : '1 ปี', + yy : '%d ปี' + } + }); +})); + +// moment.js locale configuration +// locale : Tagalog/Filipino (tl-ph) +// author : Dan Hagman + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('tl-ph', { + months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'), + monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'), + weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'), + weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'), + weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'MM/D/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY LT', + LLLL : 'dddd, MMMM DD, YYYY LT' + }, + calendar : { + sameDay: '[Ngayon sa] LT', + nextDay: '[Bukas sa] LT', + nextWeek: 'dddd [sa] LT', + lastDay: '[Kahapon sa] LT', + lastWeek: 'dddd [huling linggo] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'sa loob ng %s', + past : '%s ang nakalipas', + s : 'ilang segundo', + m : 'isang minuto', + mm : '%d minuto', + h : 'isang oras', + hh : '%d oras', + d : 'isang araw', + dd : '%d araw', + M : 'isang buwan', + MM : '%d buwan', + y : 'isang taon', + yy : '%d taon' + }, + ordinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : turkish (tr) +// authors : Erhan Gundogan : https://github.com/erhangundogan, +// Burak YiÄŸit Kaya: https://github.com/BYK + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var suffixes = { + 1: '\'inci', + 5: '\'inci', + 8: '\'inci', + 70: '\'inci', + 80: '\'inci', + + 2: '\'nci', + 7: '\'nci', + 20: '\'nci', + 50: '\'nci', + + 3: '\'üncü', + 4: '\'üncü', + 100: '\'üncü', + + 6: '\'ncı', + + 9: '\'uncu', + 10: '\'uncu', + 30: '\'uncu', + + 60: '\'ıncı', + 90: '\'ıncı' + }; + + return moment.defineLocale('tr', { + months : 'Ocak_Åžubat_Mart_Nisan_Mayıs_Haziran_Temmuz_AÄŸustos_Eylül_Ekim_Kasım_Aralık'.split('_'), + monthsShort : 'Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara'.split('_'), + weekdays : 'Pazar_Pazartesi_Salı_ÇarÅŸamba_PerÅŸembe_Cuma_Cumartesi'.split('_'), + weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'), + weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[bugün saat] LT', + nextDay : '[yarın saat] LT', + nextWeek : '[haftaya] dddd [saat] LT', + lastDay : '[dün] LT', + lastWeek : '[geçen hafta] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s sonra', + past : '%s önce', + s : 'birkaç saniye', + m : 'bir dakika', + mm : '%d dakika', + h : 'bir saat', + hh : '%d saat', + d : 'bir gün', + dd : '%d gün', + M : 'bir ay', + MM : '%d ay', + y : 'bir yıl', + yy : '%d yıl' + }, + ordinalParse: /\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/, + ordinal : function (number) { + if (number === 0) { // special case for zero + return number + '\'ıncı'; + } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + + return number + (suffixes[a] || suffixes[b] || suffixes[c]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Morocco Central Atlas TamaziÉ£t in Latin (tzm-latn) +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('tzm-latn', { + months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), + weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), + weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[asdkh g] LT', + nextDay: '[aska g] LT', + nextWeek: 'dddd [g] LT', + lastDay: '[assant g] LT', + lastWeek: 'dddd [g] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dadkh s yan %s', + past : 'yan %s', + s : 'imik', + m : 'minuá¸', + mm : '%d minuá¸', + h : 'saÉ›a', + hh : '%d tassaÉ›in', + d : 'ass', + dd : '%d ossan', + M : 'ayowr', + MM : '%d iyyirn', + y : 'asgas', + yy : '%d isgasn' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Morocco Central Atlas TamaziÉ£t (tzm) +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('tzm', { + months : 'ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”'.split('_'), + monthsShort : 'ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”'.split('_'), + weekdays : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + weekdaysShort : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS: 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[ⴰⵙⴷⵅ â´´] LT', + nextDay: '[ⴰⵙⴽⴰ â´´] LT', + nextWeek: 'dddd [â´´] LT', + lastDay: '[ⴰⵚⴰâµâµœ â´´] LT', + lastWeek: 'dddd [â´´] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'â´·â´°â´·âµ… âµ™ ⵢⴰⵠ%s', + past : 'ⵢⴰⵠ%s', + s : 'ⵉⵎⵉⴽ', + m : 'ⵎⵉâµâµ“â´º', + mm : '%d ⵎⵉâµâµ“â´º', + h : 'ⵙⴰⵄⴰ', + hh : '%d ⵜⴰⵙⵙⴰⵄⵉâµ', + d : 'ⴰⵙⵙ', + dd : '%d oⵙⵙⴰâµ', + M : 'â´°âµ¢oⵓⵔ', + MM : '%d ⵉⵢⵢⵉⵔâµ', + y : 'ⴰⵙⴳⴰⵙ', + yy : '%d ⵉⵙⴳⴰⵙâµ' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : ukrainian (uk) +// author : zemlanin : https://github.com/zemlanin +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': 'хвилина_хвилини_хвилин', + 'hh': 'година_години_годин', + 'dd': 'день_дні_днів', + 'MM': 'міÑÑць_міÑÑці_міÑÑців', + 'yy': 'рік_роки_років' + }; + if (key === 'm') { + return withoutSuffix ? 'хвилина' : 'хвилину'; + } + else if (key === 'h') { + return withoutSuffix ? 'година' : 'годину'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень'.split('_'), + 'accusative': 'ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ'.split('_') + }, + + nounCase = (/D[oD]? *MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота'.split('_'), + 'accusative': 'неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу'.split('_'), + 'genitive': 'неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи'.split('_') + }, + + nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ? + 'accusative' : + ((/\[?(?:минулої|наÑтупної)? ?\] ?dddd/).test(format) ? + 'genitive' : + 'nominative'); + + return weekdays[nounCase][m.day()]; + } + + function processHoursFunction(str) { + return function () { + return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT'; + }; + } + + return moment.defineLocale('uk', { + months : monthsCaseReplace, + monthsShort : 'Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + weekdaysMin : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY Ñ€.', + LLL : 'D MMMM YYYY Ñ€., LT', + LLLL : 'dddd, D MMMM YYYY Ñ€., LT' + }, + calendar : { + sameDay: processHoursFunction('[Сьогодні '), + nextDay: processHoursFunction('[Завтра '), + lastDay: processHoursFunction('[Вчора '), + nextWeek: processHoursFunction('[У] dddd ['), + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return processHoursFunction('[Минулої] dddd [').call(this); + case 1: + case 2: + case 4: + return processHoursFunction('[Минулого] dddd [').call(this); + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'за %s', + past : '%s тому', + s : 'декілька Ñекунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : 'годину', + hh : relativeTimeWithPlural, + d : 'день', + dd : relativeTimeWithPlural, + M : 'міÑÑць', + MM : relativeTimeWithPlural, + y : 'рік', + yy : relativeTimeWithPlural + }, + + // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason + + meridiemParse: /ночі|ранку|днÑ|вечора/, + isPM: function (input) { + return /^(днÑ|вечора)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночі'; + } else if (hour < 12) { + return 'ранку'; + } else if (hour < 17) { + return 'днÑ'; + } else { + return 'вечора'; + } + }, + + ordinalParse: /\d{1,2}-(й|го)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return number + '-й'; + case 'D': + return number + '-го'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : uzbek (uz) +// author : Sardor Muminov : https://github.com/muminoff + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('uz', { + months : 'Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь'.split('_'), + monthsShort : 'Ñнв_фев_мар_апр_май_июн_июл_авг_Ñен_окт_ноÑ_дек'.split('_'), + weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'), + weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'), + weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'D MMMM YYYY, dddd LT' + }, + calendar : { + sameDay : '[Бугун Ñоат] LT [да]', + nextDay : '[Эртага] LT [да]', + nextWeek : 'dddd [куни Ñоат] LT [да]', + lastDay : '[Кеча Ñоат] LT [да]', + lastWeek : '[Утган] dddd [куни Ñоат] LT [да]', + sameElse : 'L' + }, + relativeTime : { + future : 'Якин %s ичида', + past : 'Бир неча %s олдин', + s : 'фурÑат', + m : 'бир дакика', + mm : '%d дакика', + h : 'бир Ñоат', + hh : '%d Ñоат', + d : 'бир кун', + dd : '%d кун', + M : 'бир ой', + MM : '%d ой', + y : 'бир йил', + yy : '%d йил' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : vietnamese (vi) +// author : Bang Nguyen : https://github.com/bangnk + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('vi', { + months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'), + monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'), + weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tÆ°_thứ năm_thứ sáu_thứ bảy'.split('_'), + weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM [năm] YYYY', + LLL : 'D MMMM [năm] YYYY LT', + LLLL : 'dddd, D MMMM [năm] YYYY LT', + l : 'DD/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY LT', + llll : 'ddd, D MMM YYYY LT' + }, + calendar : { + sameDay: '[Hôm nay lúc] LT', + nextDay: '[Ngày mai lúc] LT', + nextWeek: 'dddd [tuần tá»›i lúc] LT', + lastDay: '[Hôm qua lúc] LT', + lastWeek: 'dddd [tuần rồi lúc] LT', + sameElse: 'L' + }, + relativeTime : { + future : '%s tá»›i', + past : '%s trÆ°á»›c', + s : 'vài giây', + m : 'má»™t phút', + mm : '%d phút', + h : 'má»™t giá»', + hh : '%d giá»', + d : 'má»™t ngày', + dd : '%d ngày', + M : 'má»™t tháng', + MM : '%d tháng', + y : 'má»™t năm', + yy : '%d năm' + }, + ordinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : chinese (zh-cn) +// author : suupic : https://github.com/suupic +// author : Zeno Zeng : https://github.com/zenozeng + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('zh-cn', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'), + weekdaysMin : 'æ—¥_一_二_三_å››_五_å…­'.split('_'), + longDateFormat : { + LT : 'Ah点mm', + LTS : 'Ah点m分s秒', + L : 'YYYY-MM-DD', + LL : 'YYYYå¹´MMMDæ—¥', + LLL : 'YYYYå¹´MMMDæ—¥LT', + LLLL : 'YYYYå¹´MMMDæ—¥ddddLT', + l : 'YYYY-MM-DD', + ll : 'YYYYå¹´MMMDæ—¥', + lll : 'YYYYå¹´MMMDæ—¥LT', + llll : 'YYYYå¹´MMMDæ—¥ddddLT' + }, + meridiemParse: /凌晨|早上|上åˆ|中åˆ|下åˆ|晚上/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '凌晨' || meridiem === '早上' || + meridiem === '上åˆ') { + return hour; + } else if (meridiem === '下åˆ' || meridiem === '晚上') { + return hour + 12; + } else { + // '中åˆ' + return hour >= 11 ? hour : hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return '凌晨'; + } else if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上åˆ'; + } else if (hm < 1230) { + return '中åˆ'; + } else if (hm < 1800) { + return '下åˆ'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : function () { + return this.minutes() === 0 ? '[今天]Ah[点整]' : '[今天]LT'; + }, + nextDay : function () { + return this.minutes() === 0 ? '[明天]Ah[点整]' : '[明天]LT'; + }, + lastDay : function () { + return this.minutes() === 0 ? '[昨天]Ah[点整]' : '[昨天]LT'; + }, + nextWeek : function () { + var startOfWeek, prefix; + startOfWeek = moment().startOf('week'); + prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]'; + return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; + }, + lastWeek : function () { + var startOfWeek, prefix; + startOfWeek = moment().startOf('week'); + prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]'; + return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; + }, + sameElse : 'LL' + }, + ordinalParse: /\d{1,2}(æ—¥|月|周)/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + 'æ—¥'; + case 'M': + return number + '月'; + case 'w': + case 'W': + return number + '周'; + default: + return number; + } + }, + relativeTime : { + future : '%s内', + past : '%så‰', + s : '几秒', + m : '1分钟', + mm : '%d分钟', + h : '1å°æ—¶', + hh : '%då°æ—¶', + d : '1天', + dd : '%d天', + M : '1个月', + MM : '%d个月', + y : '1å¹´', + yy : '%då¹´' + }, + week : { + // GB/T 7408-1994《数æ®å…ƒå’Œäº¤æ¢æ ¼å¼Â·ä¿¡æ¯äº¤æ¢Â·æ—¥æœŸå’Œæ—¶é—´è¡¨ç¤ºæ³•ã€‹ä¸ŽISO 8601:1988等效 + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : traditional chinese (zh-tw) +// author : Ben : https://github.com/ben-lin + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('zh-tw', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), + weekdaysMin : 'æ—¥_一_二_三_å››_五_å…­'.split('_'), + longDateFormat : { + LT : 'Ah點mm', + LTS : 'Ah點m分s秒', + L : 'YYYYå¹´MMMDæ—¥', + LL : 'YYYYå¹´MMMDæ—¥', + LLL : 'YYYYå¹´MMMDæ—¥LT', + LLLL : 'YYYYå¹´MMMDæ—¥ddddLT', + l : 'YYYYå¹´MMMDæ—¥', + ll : 'YYYYå¹´MMMDæ—¥', + lll : 'YYYYå¹´MMMDæ—¥LT', + llll : 'YYYYå¹´MMMDæ—¥ddddLT' + }, + meridiemParse: /早上|上åˆ|中åˆ|下åˆ|晚上/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '早上' || meridiem === '上åˆ') { + return hour; + } else if (meridiem === '中åˆ') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === '下åˆ' || meridiem === '晚上') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上åˆ'; + } else if (hm < 1230) { + return '中åˆ'; + } else if (hm < 1800) { + return '下åˆ'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : '[今天]LT', + nextDay : '[明天]LT', + nextWeek : '[下]ddddLT', + lastDay : '[昨天]LT', + lastWeek : '[上]ddddLT', + sameElse : 'L' + }, + ordinalParse: /\d{1,2}(æ—¥|月|週)/, + ordinal : function (number, period) { + switch (period) { + case 'd' : + case 'D' : + case 'DDD' : + return number + 'æ—¥'; + case 'M' : + return number + '月'; + case 'w' : + case 'W' : + return number + '週'; + default : + return number; + } + }, + relativeTime : { + future : '%så…§', + past : '%så‰', + s : '幾秒', + m : '一分é˜', + mm : '%d分é˜', + h : '一å°æ™‚', + hh : '%då°æ™‚', + d : '一天', + dd : '%d天', + M : '一個月', + MM : '%d個月', + y : '一年', + yy : '%då¹´' + } + }); +})); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/min/locales.min.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/min/locales.min.js new file mode 100644 index 0000000..b35ba6d --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/min/locales.min.js @@ -0,0 +1,4 @@ +!function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(a){return/^nm$/i.test(a)},meridiem:function(a,b,c){return 12>a?c?"vm":"VM":c?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[Môre om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ar-ma",{months:"يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:6,doy:12}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"Ù¡",2:"Ù¢",3:"Ù£",4:"Ù¤",5:"Ù¥",6:"Ù¦",7:"Ù§",8:"Ù¨",9:"Ù©",0:"Ù "},c={"Ù¡":"1","Ù¢":"2","Ù£":"3","Ù¤":"4","Ù¥":"5","Ù¦":"6","Ù§":"7","Ù¨":"8","Ù©":"9","Ù ":"0"};return a.defineLocale("ar-sa",{months:"يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),monthsShort:"يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiemParse:/ص|Ù…/,isPM:function(a){return"Ù…"===a},meridiem:function(a){return 12>a?"ص":"Ù…"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(a){return a.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(a){return c[a]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]}).replace(/,/g,"ØŒ")},week:{dow:6,doy:12}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ar-tn",{months:"جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),monthsShort:"جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"Ù¡",2:"Ù¢",3:"Ù£",4:"Ù¤",5:"Ù¥",6:"Ù¦",7:"Ù§",8:"Ù¨",9:"Ù©",0:"Ù "},c={"Ù¡":"1","Ù¢":"2","Ù£":"3","Ù¤":"4","Ù¥":"5","Ù¦":"6","Ù§":"7","Ù¨":"8","Ù©":"9","Ù ":"0"},d=function(a){return 0===a?0:1===a?1:2===a?2:a%100>=3&&10>=a%100?3:a%100>=11?4:5},e={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},f=function(a){return function(b,c){var f=d(b),g=e[a][d(b)];return 2===f&&(g=g[c?0:1]),g.replace(/%d/i,b)}},g=["كانون الثاني يناير","شباط Ùبراير","آذار مارس","نيسان أبريل","أيار مايو","حزيران يونيو","تموز يوليو","آب أغسطس","أيلول سبتمبر","تشرين الأول أكتوبر","تشرين الثاني نوÙمبر","كانون الأول ديسمبر"];return a.defineLocale("ar",{months:g,monthsShort:g,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiemParse:/ص|Ù…/,isPM:function(a){return"Ù…"===a},meridiem:function(a){return 12>a?"ص":"Ù…"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:f("s"),m:f("m"),mm:f("m"),h:f("h"),hh:f("h"),d:f("d"),dd:f("d"),M:f("M"),MM:f("M"),y:f("y"),yy:f("y")},preparse:function(a){return a.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(a){return c[a]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]}).replace(/,/g,"ØŒ")},week:{dow:6,doy:12}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"-inci",5:"-inci",8:"-inci",70:"-inci",80:"-inci",2:"-nci",7:"-nci",20:"-nci",50:"-nci",3:"-üncü",4:"-üncü",100:"-üncü",6:"-ncı",9:"-uncu",10:"-uncu",30:"-uncu",60:"-ıncı",90:"-ıncı"};return a.defineLocale("az",{months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekdays:"Bazar_Bazar ertÉ™si_ÇərÅŸÉ™nbÉ™ axÅŸamı_ÇərÅŸÉ™nbÉ™_CümÉ™ axÅŸamı_CümÉ™_ŞənbÉ™".split("_"),weekdaysShort:"Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən".split("_"),weekdaysMin:"Bz_BE_ÇA_Çə_CA_Cü_Şə".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[sabah saat] LT",nextWeek:"[gÉ™lÉ™n hÉ™ftÉ™] dddd [saat] LT",lastDay:"[dünÉ™n] LT",lastWeek:"[keçən hÉ™ftÉ™] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s É™vvÉ™l",s:"birneçə saniyyÉ™",m:"bir dÉ™qiqÉ™",mm:"%d dÉ™qiqÉ™",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},meridiemParse:/gecÉ™|sÉ™hÉ™r|gündüz|axÅŸam/,isPM:function(a){return/^(gündüz|axÅŸam)$/.test(a)},meridiem:function(a){return 4>a?"gecÉ™":12>a?"sÉ™hÉ™r":17>a?"gündüz":"axÅŸam"},ordinalParse:/\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,ordinal:function(a){if(0===a)return a+"-ıncı";var c=a%10,d=a%100-c,e=a>=100?100:null;return a+(b[c]||b[d]||b[e])},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:c?"хвіліна_хвіліны_хвілін":"хвіліну_хвіліны_хвілін",hh:c?"гадзіна_гадзіны_гадзін":"гадзіну_гадзіны_гадзін",dd:"дзень_дні_дзён",MM:"меÑÑц_меÑÑцы_меÑÑцаў",yy:"год_гады_гадоў"};return"m"===d?c?"хвіліна":"хвіліну":"h"===d?c?"гадзіна":"гадзіну":a+" "+b(e[d],+a)}function d(a,b){var c={nominative:"Ñтудзень_люты_Ñакавік_краÑавік_травень_чÑрвень_ліпень_жнівень_вераÑень_каÑтрычнік_ліÑтапад_Ñнежань".split("_"),accusative:"ÑтудзенÑ_лютага_Ñакавіка_краÑавіка_траўнÑ_чÑрвенÑ_ліпенÑ_жніўнÑ_вераÑнÑ_каÑтрычніка_ліÑтапада_ÑнежнÑ".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function e(a,b){var c={nominative:"нÑдзелÑ_панÑдзелак_аўторак_Ñерада_чацвер_пÑтніца_Ñубота".split("_"),accusative:"нÑдзелю_панÑдзелак_аўторак_Ñераду_чацвер_пÑтніцу_Ñуботу".split("_")},d=/\[ ?[Вв] ?(?:мінулую|наÑтупную)? ?\] ?dddd/.test(b)?"accusative":"nominative";return c[d][a.day()]}return a.defineLocale("be",{months:d,monthsShort:"Ñтуд_лют_Ñак_краÑ_трав_чÑрв_ліп_жнів_вер_каÑÑ‚_ліÑÑ‚_Ñнеж".split("_"),weekdays:e,weekdaysShort:"нд_пн_ат_ÑÑ€_чц_пт_Ñб".split("_"),weekdaysMin:"нд_пн_ат_ÑÑ€_чц_пт_Ñб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., LT",LLLL:"dddd, D MMMM YYYY г., LT"},calendar:{sameDay:"[Ð¡Ñ‘Ð½Ð½Ñ Ñž] LT",nextDay:"[Заўтра Ñž] LT",lastDay:"[Учора Ñž] LT",nextWeek:function(){return"[У] dddd [Ñž] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[У мінулую] dddd [Ñž] LT";case 1:case 2:case 4:return"[У мінулы] dddd [Ñž] LT"}},sameElse:"L"},relativeTime:{future:"праз %s",past:"%s таму",s:"некалькі Ñекунд",m:c,mm:c,h:c,hh:c,d:"дзень",dd:c,M:"меÑÑц",MM:c,y:"год",yy:c},meridiemParse:/ночы|раніцы|днÑ|вечара/,isPM:function(a){return/^(днÑ|вечара)$/.test(a)},meridiem:function(a){return 4>a?"ночы":12>a?"раніцы":17>a?"днÑ":"вечара"},ordinalParse:/\d{1,2}-(Ñ–|Ñ‹|га)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":case"w":case"W":return a%10!==2&&a%10!==3||a%100===12||a%100===13?a+"-Ñ‹":a+"-Ñ–";case"D":return a+"-га";default:return a}},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("bg",{months:"Ñнуари_февруари_март_април_май_юни_юли_авгуÑÑ‚_Ñептември_октомври_ноември_декември".split("_"),monthsShort:"Ñнр_фев_мар_апр_май_юни_юли_авг_Ñеп_окт_ное_дек".split("_"),weekdays:"неделÑ_понеделник_вторник_ÑÑ€Ñда_четвъртък_петък_Ñъбота".split("_"),weekdaysShort:"нед_пон_вто_ÑÑ€Ñ_чет_пет_Ñъб".split("_"),weekdaysMin:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Ð”Ð½ÐµÑ Ð²] LT",nextDay:"[Утре в] LT",nextWeek:"dddd [в] LT",lastDay:"[Вчера в] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Ð’ изминалата] dddd [в] LT";case 1:case 2:case 4:case 5:return"[Ð’ изминалиÑ] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"Ñлед %s",past:"преди %s",s:"нÑколко Ñекунди",m:"минута",mm:"%d минути",h:"чаÑ",hh:"%d чаÑа",d:"ден",dd:"%d дни",M:"меÑец",MM:"%d меÑеца",y:"година",yy:"%d години"},ordinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(a){var b=a%10,c=a%100;return 0===a?a+"-ев":0===c?a+"-ен":c>10&&20>c?a+"-ти":1===b?a+"-ви":2===b?a+"-ри":7===b||8===b?a+"-ми":a+"-ти"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"১",2:"২",3:"৩",4:"৪",5:"৫",6:"৬",7:"৭",8:"৮",9:"৯",0:"০"},c={"১":"1","২":"2","৩":"3","৪":"4","৫":"5","৬":"6","৭":"7","৮":"8","৯":"9","০":"0"};return a.defineLocale("bn",{months:"জানà§à§Ÿà¦¾à¦°à§€_ফেবà§à§Ÿà¦¾à¦°à§€_মারà§à¦š_à¦à¦ªà§à¦°à¦¿à¦²_মে_জà§à¦¨_জà§à¦²à¦¾à¦‡_অগাসà§à¦Ÿ_সেপà§à¦Ÿà§‡à¦®à§à¦¬à¦°_অকà§à¦Ÿà§‹à¦¬à¦°_নভেমà§à¦¬à¦°_ডিসেমà§à¦¬à¦°".split("_"),monthsShort:"জানà§_ফেব_মারà§à¦š_à¦à¦ªà¦°_মে_জà§à¦¨_জà§à¦²_অগ_সেপà§à¦Ÿ_অকà§à¦Ÿà§‹_নভ_ডিসেমà§".split("_"),weekdays:"রবিবার_সোমবার_মঙà§à¦—লবার_বà§à¦§à¦¬à¦¾à¦°_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿à¦¬à¦¾à¦°_শà§à¦•à§à¦°à§à¦¬à¦¾à¦°_শনিবার".split("_"),weekdaysShort:"রবি_সোম_মঙà§à¦—ল_বà§à¦§_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿_শà§à¦•à§à¦°à§_শনি".split("_"),weekdaysMin:"রব_সম_মঙà§à¦—_বà§_বà§à¦°à¦¿à¦¹_শà§_শনি".split("_"),longDateFormat:{LT:"A h:mm সময়",LTS:"A h:mm:ss সময়",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[আজ] LT",nextDay:"[আগামীকাল] LT",nextWeek:"dddd, LT",lastDay:"[গতকাল] LT",lastWeek:"[গত] dddd, LT",sameElse:"L"},relativeTime:{future:"%s পরে",past:"%s আগে",s:"কà¦à¦• সেকেনà§à¦¡",m:"à¦à¦• মিনিট",mm:"%d মিনিট",h:"à¦à¦• ঘনà§à¦Ÿà¦¾",hh:"%d ঘনà§à¦Ÿà¦¾",d:"à¦à¦• দিন",dd:"%d দিন",M:"à¦à¦• মাস",MM:"%d মাস",y:"à¦à¦• বছর",yy:"%d বছর"},preparse:function(a){return a.replace(/[১২৩৪৫৬৭৮৯০]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/রাত|শকাল|দà§à¦ªà§à¦°|বিকেল|রাত/,isPM:function(a){return/^(দà§à¦ªà§à¦°|বিকেল|রাত)$/.test(a)},meridiem:function(a){return 4>a?"রাত":10>a?"শকাল":17>a?"দà§à¦ªà§à¦°":20>a?"বিকেল":"রাত"},week:{dow:0,doy:6}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"༡",2:"༢",3:"༣",4:"༤",5:"༥",6:"༦",7:"༧",8:"༨",9:"༩",0:"༠"},c={"༡":"1","༢":"2","༣":"3","༤":"4","༥":"5","༦":"6","༧":"7","༨":"8","༩":"9","༠":"0"};return a.defineLocale("bo",{months:"ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ".split("_"),monthsShort:"ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ".split("_"),weekdays:"གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་".split("_"),weekdaysShort:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),weekdaysMin:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),longDateFormat:{LT:"A h:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[དི་རིང] LT",nextDay:"[སང་ཉིན] LT",nextWeek:"[བདུན་ཕྲག་རྗེས་མ], LT",lastDay:"[à½à¼‹à½¦à½„] LT",lastWeek:"[བདུན་ཕྲག་མà½à½ à¼‹à½˜] dddd, LT",sameElse:"L"},relativeTime:{future:"%s ལ་",past:"%s སྔན་ལ",s:"ལམ་སང",m:"སà¾à½¢à¼‹à½˜à¼‹à½‚ཅིག",mm:"%d སà¾à½¢à¼‹à½˜",h:"ཆུ་ཚོད་གཅིག",hh:"%d ཆུ་ཚོད",d:"ཉིན་གཅིག",dd:"%d ཉིན་",M:"ཟླ་བ་གཅིག",MM:"%d ཟླ་བ",y:"ལོ་གཅིག",yy:"%d ལོ"},preparse:function(a){return a.replace(/[༡༢༣༤༥༦༧༨༩༠]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,isPM:function(a){return/^(ཉིན་གུང|དགོང་དག|མཚན་མོ)$/.test(a)},meridiem:function(a){return 4>a?"མཚན་མོ":10>a?"ཞོགས་ཀས":17>a?"ཉིན་གུང":20>a?"དགོང་དག":"མཚན་མོ"},week:{dow:0,doy:6}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d={mm:"munutenn",MM:"miz",dd:"devezh"};return a+" "+e(d[c],a)}function c(a){switch(d(a)){case 1:case 3:case 4:case 5:case 9:return a+" bloaz";default:return a+" vloaz"}}function d(a){return a>9?d(a%10):a}function e(a,b){return 2===b?f(a):a}function f(a){var b={m:"v",b:"v",d:"z"};return void 0===b[a.charAt(0)]?a:b[a.charAt(0)]+a.substring(1)}return a.defineLocale("br",{months:"Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),longDateFormat:{LT:"h[e]mm A",LTS:"h[e]mm:ss A",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY LT",LLLL:"dddd, D [a viz] MMMM YYYY LT"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc'hoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec'h da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s 'zo",s:"un nebeud segondennoù",m:"ur vunutenn",mm:b,h:"un eur",hh:"%d eur",d:"un devezh",dd:b,M:"ur miz",MM:b,y:"ur bloaz",yy:c},ordinalParse:/\d{1,2}(añ|vet)/,ordinal:function(a){var b=1===a?"añ":"vet";return a+b},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d=a+" ";switch(c){case"m":return b?"jedna minuta":"jedne minute";case"mm":return d+=1===a?"minuta":2===a||3===a||4===a?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return d+=1===a?"sat":2===a||3===a||4===a?"sata":"sati";case"dd":return d+=1===a?"dan":"dana";case"MM":return d+=1===a?"mjesec":2===a||3===a||4===a?"mjeseca":"mjeseci";case"yy":return d+=1===a?"godina":2===a||3===a||4===a?"godine":"godina"}}return a.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),weekdays:"nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._Äet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_Äe_pe_su".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[proÅ¡lu] dddd [u] LT";case 6:return"[proÅ¡le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[proÅ¡li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:b,mm:b,h:b,hh:b,d:"dan",dd:b,M:"mjesec",MM:b,y:"godinu",yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ca",{months:"gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),monthsShort:"gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.".split("_"),weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[demà a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"fa %s",s:"uns segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},ordinalParse:/\d{1,2}(r|n|t|è|a)/,ordinal:function(a,b){var c=1===a?"r":2===a?"n":3===a?"r":4===a?"t":"è";return("w"===b||"W"===b)&&(c="a"),a+c},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a){return a>1&&5>a&&1!==~~(a/10)}function c(a,c,d,e){var f=a+" ";switch(d){case"s":return c||e?"pár sekund":"pár sekundami";case"m":return c?"minuta":e?"minutu":"minutou";case"mm":return c||e?f+(b(a)?"minuty":"minut"):f+"minutami";break;case"h":return c?"hodina":e?"hodinu":"hodinou";case"hh":return c||e?f+(b(a)?"hodiny":"hodin"):f+"hodinami";break;case"d":return c||e?"den":"dnem";case"dd":return c||e?f+(b(a)?"dny":"dní"):f+"dny";break;case"M":return c||e?"mÄ›síc":"mÄ›sícem";case"MM":return c||e?f+(b(a)?"mÄ›síce":"mÄ›síců"):f+"mÄ›síci";break;case"y":return c||e?"rok":"rokem";case"yy":return c||e?f+(b(a)?"roky":"let"):f+"lety"}}var d="leden_únor_bÅ™ezen_duben_kvÄ›ten_Äerven_Äervenec_srpen_září_říjen_listopad_prosinec".split("_"),e="led_úno_bÅ™e_dub_kvÄ›_Ävn_Ävc_srp_zář_říj_lis_pro".split("_");return a.defineLocale("cs",{months:d,monthsShort:e,monthsParse:function(a,b){var c,d=[];for(c=0;12>c;c++)d[c]=new RegExp("^"+a[c]+"$|^"+b[c]+"$","i");return d}(d,e),weekdays:"nedÄ›le_pondÄ›lí_úterý_stÅ™eda_Ätvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_Ät_pá_so".split("_"),weekdaysMin:"ne_po_út_st_Ät_pá_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedÄ›li v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve stÅ™edu v] LT";case 4:return"[ve Ätvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[vÄera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou nedÄ›li v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou stÅ™edu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pÅ™ed %s",s:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("cv",{months:"кăрлач_нарăÑ_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав".split("_"),monthsShort:"кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш".split("_"),weekdays:"вырÑарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_Ñрнекун_шăматкун".split("_"),weekdaysShort:"выр_тун_ытл_юн_кĕç_Ñрн_шăм".split("_"),weekdaysMin:"вр_тн_Ñ‹Ñ‚_юн_кç_ÑÑ€_шм".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD-MM-YYYY",LL:"YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]",LLL:"YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT",LLLL:"dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT"},calendar:{sameDay:"[ПаÑн] LT [Ñехетре]",nextDay:"[Ыран] LT [Ñехетре]",lastDay:"[Ĕнер] LT [Ñехетре]",nextWeek:"[ÇитеÑ] dddd LT [Ñехетре]",lastWeek:"[Иртнĕ] dddd LT [Ñехетре]",sameElse:"L"},relativeTime:{future:function(a){var b=/Ñехет$/i.exec(a)?"рен":/çул$/i.exec(a)?"тан":"ран";return a+b},past:"%s каÑлла",s:"пĕр-ик çеккунт",m:"пĕр минут",mm:"%d минут",h:"пĕр Ñехет",hh:"%d Ñехет",d:"пĕр кун",dd:"%d кун",M:"пĕр уйăх",MM:"%d уйăх",y:"пĕр çул",yy:"%d çул"},ordinalParse:/\d{1,2}-мĕш/,ordinal:"%d-мĕш",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("cy",{months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Heddiw am] LT",nextDay:"[Yfory am] LT",nextWeek:"dddd [am] LT",lastDay:"[Ddoe am] LT",lastWeek:"dddd [diwethaf am] LT",sameElse:"L"},relativeTime:{future:"mewn %s",past:"%s yn ôl",s:"ychydig eiliadau",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"},ordinalParse:/\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,ordinal:function(a){var b=a,c="",d=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"];return b>20?c=40===b||50===b||60===b||80===b||100===b?"fed":"ain":b>0&&(c=d[b]),a+c},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd [d.] D. MMMM YYYY LT"},calendar:{sameDay:"[I dag kl.] LT",nextDay:"[I morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[I gÃ¥r kl.] LT",lastWeek:"[sidste] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"fÃ¥ sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en mÃ¥ned",MM:"%d mÃ¥neder",y:"et Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[a+" Tage",a+" Tagen"],M:["ein Monat","einem Monat"],MM:[a+" Monate",a+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[a+" Jahre",a+" Jahren"]};return b?d[c][0]:d[c][1]}return a.defineLocale("de-at",{months:"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT [Uhr]",sameElse:"L",nextDay:"[Morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[Gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:b,mm:"%d Minuten",h:b,hh:"%d Stunden",d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[a+" Tage",a+" Tagen"],M:["ein Monat","einem Monat"],MM:[a+" Monate",a+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[a+" Jahre",a+" Jahren"]};return b?d[c][0]:d[c][1]}return a.defineLocale("de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT [Uhr]",sameElse:"L",nextDay:"[Morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[Gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:b,mm:"%d Minuten",h:b,hh:"%d Stunden",d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("el",{monthsNominativeEl:"ΙανουάÏιος_ΦεβÏουάÏιος_ΜάÏτιος_ΑπÏίλιος_Μάιος_ΙοÏνιος_ΙοÏλιος_ΑÏγουστος_ΣεπτέμβÏιος_ΟκτώβÏιος_ÎοέμβÏιος_ΔεκέμβÏιος".split("_"),monthsGenitiveEl:"ΙανουαÏίου_ΦεβÏουαÏίου_ΜαÏτίου_ΑπÏιλίου_ΜαÎου_Ιουνίου_Ιουλίου_ΑυγοÏστου_ΣεπτεμβÏίου_ΟκτωβÏίου_ÎοεμβÏίου_ΔεκεμβÏίου".split("_"),months:function(a,b){return/D/.test(b.substring(0,b.indexOf("MMMM")))?this._monthsGenitiveEl[a.month()]:this._monthsNominativeEl[a.month()]},monthsShort:"Ιαν_Φεβ_ΜαÏ_ΑπÏ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Îοε_Δεκ".split("_"),weekdays:"ΚυÏιακή_ΔευτέÏα_ΤÏίτη_ΤετάÏτη_Πέμπτη_ΠαÏασκευή_Σάββατο".split("_"),weekdaysShort:"ΚυÏ_Δευ_ΤÏι_Τετ_Πεμ_ΠαÏ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_ΤÏ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(a,b,c){return a>11?c?"μμ":"ΜΜ":c?"πμ":"ΠΜ"},isPM:function(a){return"μ"===(a+"").toLowerCase()[0]},meridiemParse:/[ΠΜ]\.?Îœ?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendarEl:{sameDay:"[ΣήμεÏα {}] LT",nextDay:"[ΑÏÏιο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[το Ï€ÏοηγοÏμενο] dddd [{}] LT";default:return"[την Ï€ÏοηγοÏμενη] dddd [{}] LT"}},sameElse:"L"},calendar:function(a,b){var c=this._calendarEl[a],d=b&&b.hours();return"function"==typeof c&&(c=c.apply(b)),c.replace("{}",d%12===1?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s Ï€Ïιν",s:"λίγα δευτεÏόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ÏŽÏα",hh:"%d ÏŽÏες",d:"μία μέÏα",dd:"%d μέÏες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χÏόνος",yy:"%d χÏόνια"},ordinalParse:/\d{1,2}η/,ordinal:"%dη",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},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"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th"; +return a+c},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"D MMMM, YYYY",LLL:"D MMMM, YYYY LT",LLLL:"dddd, D MMMM, YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},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"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},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"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_aÅ­gusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aÅ­g_sep_okt_nov_dec".split("_"),weekdays:"Dimanĉo_Lundo_Mardo_Merkredo_Ä´aÅ­do_Vendredo_Sabato".split("_"),weekdaysShort:"Dim_Lun_Mard_Merk_Ä´aÅ­_Ven_Sab".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Ä´a_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"D[-an de] MMMM, YYYY",LLL:"D[-an de] MMMM, YYYY LT",LLLL:"dddd, [la] D[-an de] MMMM, YYYY LT"},meridiemParse:/[ap]\.t\.m/i,isPM:function(a){return"p"===a.charAt(0).toLowerCase()},meridiem:function(a,b,c){return a>11?c?"p.t.m.":"P.T.M.":c?"a.t.m.":"A.T.M."},calendar:{sameDay:"[HodiaÅ­ je] LT",nextDay:"[MorgaÅ­ je] LT",nextWeek:"dddd [je] LT",lastDay:"[HieraÅ­ je] LT",lastWeek:"[pasinta] dddd [je] LT",sameElse:"L"},relativeTime:{future:"je %s",past:"antaÅ­ %s",s:"sekundoj",m:"minuto",mm:"%d minutoj",h:"horo",hh:"%d horoj",d:"tago",dd:"%d tagoj",M:"monato",MM:"%d monatoj",y:"jaro",yy:"%d jaroj"},ordinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),c="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");return a.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(a,d){return/-MMM-/.test(d)?c[a.month()]:b[a.month()]},weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c,d){var e={s:["mõne sekundi","mõni sekund","paar sekundit"],m:["ühe minuti","üks minut"],mm:[a+" minuti",a+" minutit"],h:["ühe tunni","tund aega","üks tund"],hh:[a+" tunni",a+" tundi"],d:["ühe päeva","üks päev"],M:["kuu aja","kuu aega","üks kuu"],MM:[a+" kuu",a+" kuud"],y:["ühe aasta","aasta","üks aasta"],yy:[a+" aasta",a+" aastat"]};return b?e[c][2]?e[c][2]:e[c][1]:d?e[c][0]:e[c][1]}return a.defineLocale("et",{months:"jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Täna,] LT",nextDay:"[Homme,] LT",nextWeek:"[Järgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s pärast",past:"%s tagasi",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:"%d päeva",M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] LT",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] LT",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] LT",llll:"ddd, YYYY[ko] MMM D[a] LT"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"Û±",2:"Û²",3:"Û³",4:"Û´",5:"Ûµ",6:"Û¶",7:"Û·",8:"Û¸",9:"Û¹",0:"Û°"},c={"Û±":"1","Û²":"2","Û³":"3","Û´":"4","Ûµ":"5","Û¶":"6","Û·":"7","Û¸":"8","Û¹":"9","Û°":"0"};return a.defineLocale("fa",{months:"ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ÛŒ_د_س_Ú†_Ù¾_ج_Ø´".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},meridiemParse:/قبل از ظهر|بعد از ظهر/,isPM:function(a){return/بعد از ظهر/.test(a)},meridiem:function(a){return 12>a?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[Ùردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چندین ثانیه",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(a){return a.replace(/[Û°-Û¹]/g,function(a){return c[a]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]}).replace(/,/g,"ØŒ")},ordinalParse:/\d{1,2}Ù…/,ordinal:"%dÙ…",week:{dow:6,doy:12}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,d,e){var f="";switch(d){case"s":return e?"muutaman sekunnin":"muutama sekunti";case"m":return e?"minuutin":"minuutti";case"mm":f=e?"minuutin":"minuuttia";break;case"h":return e?"tunnin":"tunti";case"hh":f=e?"tunnin":"tuntia";break;case"d":return e?"päivän":"päivä";case"dd":f=e?"päivän":"päivää";break;case"M":return e?"kuukauden":"kuukausi";case"MM":f=e?"kuukauden":"kuukautta";break;case"y":return e?"vuoden":"vuosi";case"yy":f=e?"vuoden":"vuotta"}return f=c(a,e)+" "+f}function c(a,b){return 10>a?b?e[a]:d[a]:a}var d="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),e=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",d[7],d[8],d[9]];return a.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] LT",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] LT",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] LT",llll:"ddd, Do MMM YYYY, [klo] LT"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("fo",{months:"januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur".split("_"),weekdaysShort:"sun_mán_týs_mik_hós_frí_ley".split("_"),weekdaysMin:"su_má_tý_mi_hó_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D. MMMM, YYYY LT"},calendar:{sameDay:"[à dag kl.] LT",nextDay:"[à morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[à gjár kl.] LT",lastWeek:"[síðstu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s síðani",s:"fá sekund",m:"ein minutt",mm:"%d minuttir",h:"ein tími",hh:"%d tímar",d:"ein dagur",dd:"%d dagar",M:"ein mánaði",MM:"%d mánaðir",y:"eitt ár",yy:"%d ár"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|)/,ordinal:function(a){return a+(1===a?"er":"")}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|)/,ordinal:function(a){return a+(1===a?"er":"")},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b="jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.".split("_"),c="jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_");return a.defineLocale("fy",{months:"jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber".split("_"),monthsShort:function(a,d){return/-MMM-/.test(d)?c[a.month()]:b[a.month()]},weekdays:"snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon".split("_"),weekdaysShort:"si._mo._ti._wo._to._fr._so.".split("_"),weekdaysMin:"Si_Mo_Ti_Wo_To_Fr_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[hjoed om] LT",nextDay:"[moarn om] LT",nextWeek:"dddd [om] LT",lastDay:"[juster om] LT",lastWeek:"[ôfrûne] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oer %s",past:"%s lyn",s:"in pear sekonden",m:"ien minút",mm:"%d minuten",h:"ien oere",hh:"%d oeren",d:"ien dei",dd:"%d dagen",M:"ien moanne",MM:"%d moannen",y:"ien jier",yy:"%d jierren"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("gl",{months:"Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro".split("_"),monthsShort:"Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.".split("_"),weekdays:"Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado".split("_"),weekdaysShort:"Dom._Lun._Mar._Mér._Xov._Ven._Sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mé_Xo_Ve_Sá".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"ás":"á")+"] LT"},nextDay:function(){return"[mañá "+(1!==this.hours()?"ás":"á")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"ás":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"á":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"ás":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(a){return"uns segundos"===a?"nuns segundos":"en "+a},past:"hai %s",s:"uns segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("he",{months:"ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר".split("_"),monthsShort:"ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳".split("_"),weekdays:"ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),weekdaysShort:"×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),weekdaysMin:"×_ב_×’_ד_×”_ו_ש".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY LT",LLLL:"dddd, D [ב]MMMM YYYY LT",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY LT",llll:"ddd, D MMM YYYY LT"},calendar:{sameDay:"[×”×™×•× ×‘Ö¾]LT",nextDay:"[מחר ב־]LT",nextWeek:"dddd [בשעה] LT",lastDay:"[×תמול ב־]LT",lastWeek:"[ביו×] dddd [×”×חרון בשעה] LT",sameElse:"L"},relativeTime:{future:"בעוד %s",past:"לפני %s",s:"מספר שניות",m:"דקה",mm:"%d דקות",h:"שעה",hh:function(a){return 2===a?"שעתיי×":a+" שעות"},d:"יו×",dd:function(a){return 2===a?"יומיי×":a+" ימי×"},M:"חודש",MM:function(a){return 2===a?"חודשיי×":a+" חודשי×"},y:"שנה",yy:function(a){return 2===a?"שנתיי×":a%10===0&&10!==a?a+" שנה":a+" שני×"}}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return a.defineLocale("hi",{months:"जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°".split("_"),monthsShort:"जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.".split("_"),weekdays:"रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि".split("_"),weekdaysMin:"र_सो_मं_बà¥_गà¥_शà¥_श".split("_"),longDateFormat:{LT:"A h:mm बजे",LTS:"A h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कà¥à¤› ही कà¥à¤·à¤£",m:"à¤à¤• मिनट",mm:"%d मिनट",h:"à¤à¤• घंटा",hh:"%d घंटे",d:"à¤à¤• दिन",dd:"%d दिन",M:"à¤à¤• महीने",MM:"%d महीने",y:"à¤à¤• वरà¥à¤·",yy:"%d वरà¥à¤·"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/रात|सà¥à¤¬à¤¹|दोपहर|शाम/,meridiemHour:function(a,b){return 12===a&&(a=0),"रात"===b?4>a?a:a+12:"सà¥à¤¬à¤¹"===b?a:"दोपहर"===b?a>=10?a:a+12:"शाम"===b?a+12:void 0},meridiem:function(a){return 4>a?"रात":10>a?"सà¥à¤¬à¤¹":17>a?"दोपहर":20>a?"शाम":"रात"},week:{dow:0,doy:6}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d=a+" ";switch(c){case"m":return b?"jedna minuta":"jedne minute";case"mm":return d+=1===a?"minuta":2===a||3===a||4===a?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return d+=1===a?"sat":2===a||3===a||4===a?"sata":"sati";case"dd":return d+=1===a?"dan":"dana";case"MM":return d+=1===a?"mjesec":2===a||3===a||4===a?"mjeseca":"mjeseci";case"yy":return d+=1===a?"godina":2===a||3===a||4===a?"godine":"godina"}}return a.defineLocale("hr",{months:"sjeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_"),monthsShort:"sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),weekdays:"nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._Äet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_Äe_pe_su".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[proÅ¡lu] dddd [u] LT";case 6:return"[proÅ¡le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[proÅ¡li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:b,mm:b,h:b,hh:b,d:"dan",dd:b,M:"mjesec",MM:b,y:"godinu",yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c,d){var e=a;switch(c){case"s":return d||b?"néhány másodperc":"néhány másodperce";case"m":return"egy"+(d||b?" perc":" perce");case"mm":return e+(d||b?" perc":" perce");case"h":return"egy"+(d||b?" óra":" órája");case"hh":return e+(d||b?" óra":" órája");case"d":return"egy"+(d||b?" nap":" napja");case"dd":return e+(d||b?" nap":" napja");case"M":return"egy"+(d||b?" hónap":" hónapja");case"MM":return e+(d||b?" hónap":" hónapja");case"y":return"egy"+(d||b?" év":" éve");case"yy":return e+(d||b?" év":" éve")}return""}function c(a){return(a?"":"[múlt] ")+"["+d[this.day()]+"] LT[-kor]"}var d="vasárnap hétfÅ‘n kedden szerdán csütörtökön pénteken szombaton".split(" ");return a.defineLocale("hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfÅ‘_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D., LT",LLLL:"YYYY. MMMM D., dddd LT"},meridiemParse:/de|du/i,isPM:function(a){return"u"===a.charAt(1).toLowerCase()},meridiem:function(a,b,c){return 12>a?c===!0?"de":"DE":c===!0?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return c.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return c.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b){var c={nominative:"Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€_Õ´Õ¡Ö€Õ¿_Õ¡ÕºÖ€Õ«Õ¬_Õ´Õ¡ÕµÕ«Õ½_Õ°Õ¸Ö‚Õ¶Õ«Õ½_Õ°Õ¸Ö‚Õ¬Õ«Õ½_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€".split("_"),accusative:"Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€Õ«_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€Õ«_Õ´Õ¡Ö€Õ¿Õ«_Õ¡ÕºÖ€Õ«Õ¬Õ«_Õ´Õ¡ÕµÕ«Õ½Õ«_Õ°Õ¸Ö‚Õ¶Õ«Õ½Õ«_Õ°Õ¸Ö‚Õ¬Õ«Õ½Õ«_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½Õ«_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function c(a){var b="Õ°Õ¶Õ¾_ÖƒÕ¿Ö€_Õ´Ö€Õ¿_Õ¡ÕºÖ€_Õ´ÕµÕ½_Õ°Õ¶Õ½_Õ°Õ¬Õ½_Ö…Õ£Õ½_Õ½ÕºÕ¿_Õ°Õ¯Õ¿_Õ¶Õ´Õ¢_Õ¤Õ¯Õ¿".split("_");return b[a.month()]}function d(a){var b="Õ¯Õ«Ö€Õ¡Õ¯Õ«_Õ¥Ö€Õ¯Õ¸Ö‚Õ·Õ¡Õ¢Õ©Õ«_Õ¥Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ¹Õ¸Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ°Õ«Õ¶Õ£Õ·Õ¡Õ¢Õ©Õ«_Õ¸Ö‚Ö€Õ¢Õ¡Õ©_Õ·Õ¡Õ¢Õ¡Õ©".split("_");return b[a.day()]}return a.defineLocale("hy-am",{months:b,monthsShort:c,weekdays:d,weekdaysShort:"Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©".split("_"),weekdaysMin:"Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY Õ©.",LLL:"D MMMM YYYY Õ©., LT",LLLL:"dddd, D MMMM YYYY Õ©., LT"},calendar:{sameDay:"[Õ¡ÕµÕ½Ö…Ö€] LT",nextDay:"[Õ¾Õ¡Õ²Õ¨] LT",lastDay:"[Õ¥Ö€Õ¥Õ¯] LT",nextWeek:function(){return"dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT"},lastWeek:function(){return"[Õ¡Õ¶ÖÕ¡Õ®] dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT"},sameElse:"L"},relativeTime:{future:"%s Õ°Õ¥Õ¿Õ¸",past:"%s Õ¡Õ¼Õ¡Õ»",s:"Õ´Õ« Ö„Õ¡Õ¶Õ« Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶",m:"Ö€Õ¸ÕºÕ¥",mm:"%d Ö€Õ¸ÕºÕ¥",h:"ÕªÕ¡Õ´",hh:"%d ÕªÕ¡Õ´",d:"Ö…Ö€",dd:"%d Ö…Ö€",M:"Õ¡Õ´Õ«Õ½",MM:"%d Õ¡Õ´Õ«Õ½",y:"Õ¿Õ¡Ö€Õ«",yy:"%d Õ¿Õ¡Ö€Õ«"},meridiemParse:/Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡|Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡|ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶/,isPM:function(a){return/^(ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶)$/.test(a)},meridiem:function(a){return 4>a?"Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡":12>a?"Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡":17>a?"ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡":"Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶"},ordinalParse:/\d{1,2}|\d{1,2}-(Õ«Õ¶|Ö€Õ¤)/,ordinal:function(a,b){switch(b){case"DDD":case"w":case"W":case"DDDo":return 1===a?a+"-Õ«Õ¶":a+"-Ö€Õ¤";default:return a}},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"LT.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] LT",LLLL:"dddd, D MMMM YYYY [pukul] LT"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(a,b){return 12===a&&(a=0),"pagi"===b?a:"siang"===b?a>=11?a:a+12:"sore"===b||"malam"===b?a+12:void 0},meridiem:function(a){return 11>a?"pagi":15>a?"siang":19>a?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a){return a%100===11?!0:a%10===1?!1:!0}function c(a,c,d,e){var f=a+" ";switch(d){case"s":return c||e?"nokkrar sekúndur":"nokkrum sekúndum";case"m":return c?"mínúta":"mínútu";case"mm":return b(a)?f+(c||e?"mínútur":"mínútum"):c?f+"mínúta":f+"mínútu";case"hh":return b(a)?f+(c||e?"klukkustundir":"klukkustundum"):f+"klukkustund";case"d":return c?"dagur":e?"dag":"degi";case"dd":return b(a)?c?f+"dagar":f+(e?"daga":"dögum"):c?f+"dagur":f+(e?"dag":"degi");case"M":return c?"mánuður":e?"mánuð":"mánuði";case"MM":return b(a)?c?f+"mánuðir":f+(e?"mánuði":"mánuðum"):c?f+"mánuður":f+(e?"mánuð":"mánuði");case"y":return c||e?"ár":"ári";case"yy":return b(a)?f+(c||e?"ár":"árum"):f+(c||e?"ár":"ári")}}return a.defineLocale("is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd, D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:c,m:c,mm:c,h:"klukkustund",hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),weekdaysShort:"Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),weekdaysMin:"D_L_Ma_Me_G_V_S".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(a){return(/^[0-9].+$/.test(a)?"tra":"in")+" "+a},past:"%s fa",s:"alcuni secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_ç«æ›œæ—¥_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"æ—¥_月_ç«_æ°´_木_金_土".split("_"),weekdaysMin:"æ—¥_月_ç«_æ°´_木_金_土".split("_"),longDateFormat:{LT:"Ah時m分",LTS:"LTs秒",L:"YYYY/MM/DD",LL:"YYYYå¹´M月Dæ—¥",LLL:"YYYYå¹´M月Dæ—¥LT",LLLL:"YYYYå¹´M月Dæ—¥LT dddd"},meridiemParse:/åˆå‰|åˆå¾Œ/i,isPM:function(a){return"åˆå¾Œ"===a},meridiem:function(a){return 12>a?"åˆå‰":"åˆå¾Œ"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:"[æ¥é€±]dddd LT",lastDay:"[昨日] LT",lastWeek:"[å‰é€±]dddd LT",sameElse:"L"},relativeTime:{future:"%s後",past:"%så‰",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1æ—¥",dd:"%dæ—¥",M:"1ヶ月",MM:"%dヶ月",y:"1å¹´",yy:"%då¹´"}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b){var c={nominative:"იáƒáƒœáƒ•áƒáƒ áƒ˜_თებერვáƒáƒšáƒ˜_მáƒáƒ áƒ¢áƒ˜_áƒáƒžáƒ áƒ˜áƒšáƒ˜_მáƒáƒ˜áƒ¡áƒ˜_ივნისი_ივლისი_áƒáƒ’ვისტáƒ_სექტემბერი_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი_ნáƒáƒ”მბერი_დეკემბერი".split("_"),accusative:"იáƒáƒœáƒ•áƒáƒ áƒ¡_თებერვáƒáƒšáƒ¡_მáƒáƒ áƒ¢áƒ¡_áƒáƒžáƒ áƒ˜áƒšáƒ˜áƒ¡_მáƒáƒ˜áƒ¡áƒ¡_ივნისს_ივლისს_áƒáƒ’ვისტს_სექტემბერს_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერს_ნáƒáƒ”მბერს_დეკემბერს".split("_")},d=/D[oD] *MMMM?/.test(b)?"accusative":"nominative"; +return c[d][a.month()]}function c(a,b){var c={nominative:"კვირáƒ_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ი_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი_ხუთშáƒáƒ‘áƒáƒ—ი_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი_შáƒáƒ‘áƒáƒ—ი".split("_"),accusative:"კვირáƒáƒ¡_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ს_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ს_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ს_ხუთშáƒáƒ‘áƒáƒ—ს_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვს_შáƒáƒ‘áƒáƒ—ს".split("_")},d=/(წინáƒ|შემდეგ)/.test(b)?"accusative":"nominative";return c[d][a.day()]}return a.defineLocale("ka",{months:b,monthsShort:"იáƒáƒœ_თებ_მáƒáƒ _áƒáƒžáƒ _მáƒáƒ˜_ივნ_ივლ_áƒáƒ’ვ_სექ_áƒáƒ¥áƒ¢_ნáƒáƒ”_დეკ".split("_"),weekdays:c,weekdaysShort:"კვი_áƒáƒ áƒ¨_სáƒáƒ›_áƒáƒ—ხ_ხუთ_პáƒáƒ _შáƒáƒ‘".split("_"),weekdaysMin:"კვ_áƒáƒ _სáƒ_áƒáƒ—_ხუ_პáƒ_შáƒ".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[დღეს] LT[-ზე]",nextDay:"[ხვáƒáƒš] LT[-ზე]",lastDay:"[გუშინ] LT[-ზე]",nextWeek:"[შემდეგ] dddd LT[-ზე]",lastWeek:"[წინáƒ] dddd LT-ზე",sameElse:"L"},relativeTime:{future:function(a){return/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|წელი)/.test(a)?a.replace(/ი$/,"ში"):a+"ში"},past:function(a){return/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|დღე|თვე)/.test(a)?a.replace(/(ი|ე)$/,"ის წინ"):/წელი/.test(a)?a.replace(/წელი$/,"წლის წინ"):void 0},s:"რáƒáƒ›áƒ“ენიმე წáƒáƒ›áƒ˜",m:"წუთი",mm:"%d წუთი",h:"სáƒáƒáƒ—ი",hh:"%d სáƒáƒáƒ—ი",d:"დღე",dd:"%d დღე",M:"თვე",MM:"%d თვე",y:"წელი",yy:"%d წელი"},ordinalParse:/0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/,ordinal:function(a){return 0===a?a:1===a?a+"-ლი":20>a||100>=a&&a%20===0||a%100===0?"მე-"+a:a+"-ე"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("km",{months:"មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ".split("_"),monthsShort:"មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ".split("_"),weekdays:"អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ".split("_"),weekdaysShort:"អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ".split("_"),weekdaysMin:"អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[ážáŸ’ងៃនៈ ម៉ោង] LT",nextDay:"[ស្អែក ម៉ោង] LT",nextWeek:"dddd [ម៉ោង] LT",lastDay:"[ម្សិលមិញ ម៉ោង] LT",lastWeek:"dddd [សប្ážáž¶áž áŸáž˜áž»áž“] [ម៉ោង] LT",sameElse:"L"},relativeTime:{future:"%sទៀáž",past:"%sមុន",s:"ប៉ុន្មានវិនាទី",m:"មួយនាទី",mm:"%d នាទី",h:"មួយម៉ោង",hh:"%d ម៉ោង",d:"មួយážáŸ’ងៃ",dd:"%d ážáŸ’ងៃ",M:"មួយážáŸ‚",MM:"%d ážáŸ‚",y:"មួយឆ្នាំ",yy:"%d ឆ្នាំ"},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ko",{months:"1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"),monthsShort:"1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"),weekdays:"ì¼ìš”ì¼_월요ì¼_화요ì¼_수요ì¼_목요ì¼_금요ì¼_토요ì¼".split("_"),weekdaysShort:"ì¼_ì›”_í™”_수_목_금_토".split("_"),weekdaysMin:"ì¼_ì›”_í™”_수_목_금_토".split("_"),longDateFormat:{LT:"A hì‹œ m분",LTS:"A hì‹œ m분 sì´ˆ",L:"YYYY.MM.DD",LL:"YYYYë…„ MMMM Dì¼",LLL:"YYYYë…„ MMMM Dì¼ LT",LLLL:"YYYYë…„ MMMM Dì¼ dddd LT"},calendar:{sameDay:"오늘 LT",nextDay:"ë‚´ì¼ LT",nextWeek:"dddd LT",lastDay:"ì–´ì œ LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s ì „",s:"몇초",ss:"%dì´ˆ",m:"ì¼ë¶„",mm:"%d분",h:"한시간",hh:"%d시간",d:"하루",dd:"%dì¼",M:"한달",MM:"%d달",y:"ì¼ë…„",yy:"%dë…„"},ordinalParse:/\d{1,2}ì¼/,ordinal:"%dì¼",meridiemParse:/오전|오후/,isPM:function(a){return"오후"===a},meridiem:function(a){return 12>a?"오전":"오후"}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return b?d[c][0]:d[c][1]}function c(a){var b=a.substr(0,a.indexOf(" "));return e(b)?"a "+a:"an "+a}function d(a){var b=a.substr(0,a.indexOf(" "));return e(b)?"viru "+a:"virun "+a}function e(a){if(a=parseInt(a,10),isNaN(a))return!1;if(0>a)return!0;if(10>a)return a>=4&&7>=a?!0:!1;if(100>a){var b=a%10,c=a/10;return e(0===b?c:b)}if(1e4>a){for(;a>=10;)a/=10;return e(a)}return a/=1e3,e(a)}return a.defineLocale("lb",{months:"Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._Mé._Dë._Më._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mé_Dë_Më_Do_Fr_Sa".split("_"),longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gëschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:c,past:d,s:"e puer Sekonnen",m:b,mm:"%d Minutten",h:b,hh:"%d Stonnen",d:b,dd:"%d Deeg",M:b,MM:"%d Méint",y:b,yy:"%d Joer"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c,d){return b?"kelios sekundÄ—s":d?"kelių sekundžių":"kelias sekundes"}function c(a,b,c,d){return b?e(c)[0]:d?e(c)[1]:e(c)[2]}function d(a){return a%10===0||a>10&&20>a}function e(a){return h[a].split("_")}function f(a,b,f,g){var h=a+" ";return 1===a?h+c(a,b,f[0],g):b?h+(d(a)?e(f)[1]:e(f)[0]):g?h+e(f)[1]:h+(d(a)?e(f)[1]:e(f)[2])}function g(a,b){var c=-1===b.indexOf("dddd HH:mm"),d=i[a.day()];return c?d:d.substring(0,d.length-2)+"į"}var h={m:"minutÄ—_minutÄ—s_minutÄ™",mm:"minutÄ—s_minuÄių_minutes",h:"valanda_valandos_valandÄ…",hh:"valandos_valandų_valandas",d:"diena_dienos_dienÄ…",dd:"dienos_dienų_dienas",M:"mÄ—nuo_mÄ—nesio_mÄ—nesį",MM:"mÄ—nesiai_mÄ—nesių_mÄ—nesius",y:"metai_metų_metus",yy:"metai_metų_metus"},i="sekmadienis_pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis".split("_");return a.defineLocale("lt",{months:"sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio".split("_"),monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:g,weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Å eÅ¡".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Å ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], LT [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, LT [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], LT [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, LT [val.]"},calendar:{sameDay:"[Å iandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[PraÄ—jusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieÅ¡ %s",s:b,m:c,mm:f,h:c,hh:f,d:c,dd:f,M:c,MM:f,y:c,yy:f},ordinalParse:/\d{1,2}-oji/,ordinal:function(a){return a+"-oji"},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d=a.split("_");return c?b%10===1&&11!==b?d[2]:d[3]:b%10===1&&11!==b?d[0]:d[1]}function c(a,c,e){return a+" "+b(d[e],a,c)}var d={mm:"minÅ«ti_minÅ«tes_minÅ«te_minÅ«tes",hh:"stundu_stundas_stunda_stundas",dd:"dienu_dienas_diena_dienas",MM:"mÄ“nesi_mÄ“neÅ¡us_mÄ“nesis_mÄ“neÅ¡i",yy:"gadu_gadus_gads_gadi"};return a.defineLocale("lv",{months:"janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jÅ«n_jÅ«l_aug_sep_okt_nov_dec".split("_"),weekdays:"svÄ“tdiena_pirmdiena_otrdiena_treÅ¡diena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, LT",LLLL:"YYYY. [gada] D. MMMM, dddd, LT"},calendar:{sameDay:"[Å odien pulksten] LT",nextDay:"[RÄ«t pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[PagÄjuÅ¡Ä] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"%s vÄ“lÄk",past:"%s agrÄk",s:"dažas sekundes",m:"minÅ«ti",mm:c,h:"stundu",hh:c,d:"dienu",dd:c,M:"mÄ“nesi",MM:c,y:"gadu",yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("mk",{months:"јануари_февруари_март_април_мај_јуни_јули_авгуÑÑ‚_Ñептември_октомври_ноември_декември".split("_"),monthsShort:"јан_фев_мар_апр_мај_јун_јул_авг_Ñеп_окт_ное_дек".split("_"),weekdays:"недела_понеделник_вторник_Ñреда_четврток_петок_Ñабота".split("_"),weekdaysShort:"нед_пон_вто_Ñре_чет_пет_Ñаб".split("_"),weekdaysMin:"нe_пo_вт_ÑÑ€_че_пе_Ña".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Ð”ÐµÐ½ÐµÑ Ð²Ð¾] LT",nextDay:"[Утре во] LT",nextWeek:"dddd [во] LT",lastDay:"[Вчера во] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Во изминатата] dddd [во] LT";case 1:case 2:case 4:case 5:return"[Во изминатиот] dddd [во] LT"}},sameElse:"L"},relativeTime:{future:"поÑле %s",past:"пред %s",s:"неколку Ñекунди",m:"минута",mm:"%d минути",h:"чаÑ",hh:"%d чаÑа",d:"ден",dd:"%d дена",M:"меÑец",MM:"%d меÑеци",y:"година",yy:"%d години"},ordinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(a){var b=a%10,c=a%100;return 0===a?a+"-ев":0===c?a+"-ен":c>10&&20>c?a+"-ти":1===b?a+"-ви":2===b?a+"-ри":7===b||8===b?a+"-ми":a+"-ти"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ml",{months:"ജനàµà´µà´°à´¿_ഫെബàµà´°àµà´µà´°à´¿_മാർചàµà´šàµ_à´à´ªàµà´°à´¿àµ½_മേയàµ_ജൂൺ_ജൂലൈ_à´“à´—à´¸àµà´±àµà´±àµ_സെപàµà´±àµà´±à´‚ബർ_à´’à´•àµà´Ÿàµ‹à´¬àµ¼_നവംബർ_ഡിസംബർ".split("_"),monthsShort:"ജനàµ._ഫെബàµà´°àµ._മാർ._à´à´ªàµà´°à´¿._മേയàµ_ജൂൺ_ജൂലൈ._à´“à´—._സെപàµà´±àµà´±._à´’à´•àµà´Ÿàµ‹._നവം._ഡിസം.".split("_"),weekdays:"ഞായറാഴàµà´š_തിങàµà´•à´³à´¾à´´àµà´š_ചൊവàµà´µà´¾à´´àµà´š_à´¬àµà´§à´¨à´¾à´´àµà´š_à´µàµà´¯à´¾à´´à´¾à´´àµà´š_വെളàµà´³à´¿à´¯à´¾à´´àµà´š_ശനിയാഴàµà´š".split("_"),weekdaysShort:"ഞായർ_തിങàµà´•àµ¾_ചൊവàµà´µ_à´¬àµà´§àµ»_à´µàµà´¯à´¾à´´à´‚_വെളàµà´³à´¿_ശനി".split("_"),weekdaysMin:"à´žà´¾_തി_ചൊ_à´¬àµ_à´µàµà´¯à´¾_വെ_à´¶".split("_"),longDateFormat:{LT:"A h:mm -à´¨àµ",LTS:"A h:mm:ss -à´¨àµ",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[ഇനàµà´¨àµ] LT",nextDay:"[നാളെ] LT",nextWeek:"dddd, LT",lastDay:"[ഇനàµà´¨à´²àµ†] LT",lastWeek:"[à´•à´´à´¿à´žàµà´ž] dddd, LT",sameElse:"L"},relativeTime:{future:"%s à´•à´´à´¿à´žàµà´žàµ",past:"%s à´®àµàµ»à´ªàµ",s:"അൽപ നിമിഷങàµà´™àµ¾",m:"ഒരൠമിനിറàµà´±àµ",mm:"%d മിനിറàµà´±àµ",h:"ഒരൠമണികàµà´•àµ‚ർ",hh:"%d മണികàµà´•àµ‚ർ",d:"ഒരൠദിവസം",dd:"%d ദിവസം",M:"ഒരൠമാസം",MM:"%d മാസം",y:"ഒരൠവർഷം",yy:"%d വർഷം"},meridiemParse:/രാതàµà´°à´¿|രാവിലെ|ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿/i,isPM:function(a){return/^(ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿)$/.test(a)},meridiem:function(a){return 4>a?"രാതàµà´°à´¿":12>a?"രാവിലെ":17>a?"ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ":20>a?"വൈകàµà´¨àµà´¨àµ‡à´°à´‚":"രാതàµà´°à´¿"}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return a.defineLocale("mr",{months:"जानेवारी_फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€_मारà¥à¤š_à¤à¤ªà¥à¤°à¤¿à¤²_मे_जून_जà¥à¤²à¥ˆ_ऑगसà¥à¤Ÿ_सपà¥à¤Ÿà¥‡à¤‚बर_ऑकà¥à¤Ÿà¥‹à¤¬à¤°_नोवà¥à¤¹à¥‡à¤‚बर_डिसेंबर".split("_"),monthsShort:"जाने._फेबà¥à¤°à¥._मारà¥à¤š._à¤à¤ªà¥à¤°à¤¿._मे._जून._जà¥à¤²à¥ˆ._ऑग._सपà¥à¤Ÿà¥‡à¤‚._ऑकà¥à¤Ÿà¥‹._नोवà¥à¤¹à¥‡à¤‚._डिसें.".split("_"),weekdays:"रविवार_सोमवार_मंगळवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगळ_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि".split("_"),weekdaysMin:"र_सो_मं_बà¥_गà¥_शà¥_श".split("_"),longDateFormat:{LT:"A h:mm वाजता",LTS:"A h:mm:ss वाजता",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[आज] LT",nextDay:"[उदà¥à¤¯à¤¾] LT",nextWeek:"dddd, LT",lastDay:"[काल] LT",lastWeek:"[मागील] dddd, LT",sameElse:"L"},relativeTime:{future:"%s नंतर",past:"%s पूरà¥à¤µà¥€",s:"सेकंद",m:"à¤à¤• मिनिट",mm:"%d मिनिटे",h:"à¤à¤• तास",hh:"%d तास",d:"à¤à¤• दिवस",dd:"%d दिवस",M:"à¤à¤• महिना",MM:"%d महिने",y:"à¤à¤• वरà¥à¤·",yy:"%d वरà¥à¤·à¥‡"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/रातà¥à¤°à¥€|सकाळी|दà¥à¤ªà¤¾à¤°à¥€|सायंकाळी/,meridiemHour:function(a,b){return 12===a&&(a=0),"रातà¥à¤°à¥€"===b?4>a?a:a+12:"सकाळी"===b?a:"दà¥à¤ªà¤¾à¤°à¥€"===b?a>=10?a:a+12:"सायंकाळी"===b?a+12:void 0},meridiem:function(a){return 4>a?"रातà¥à¤°à¥€":10>a?"सकाळी":17>a?"दà¥à¤ªà¤¾à¤°à¥€":20>a?"सायंकाळी":"रातà¥à¤°à¥€"},week:{dow:0,doy:6}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"LT.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] LT",LLLL:"dddd, D MMMM YYYY [pukul] LT"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(a,b){return 12===a&&(a=0),"pagi"===b?a:"tengahari"===b?a>=11?a:a+12:"petang"===b||"malam"===b?a+12:void 0},meridiem:function(a){return 11>a?"pagi":15>a?"tengahari":19>a?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"á",2:"á‚",3:"áƒ",4:"á„",5:"á…",6:"á†",7:"á‡",8:"áˆ",9:"á‰",0:"á€"},c={"á":"1","á‚":"2","áƒ":"3","á„":"4","á…":"5","á†":"6","á‡":"7","áˆ":"8","á‰":"9","á€":"0"};return a.defineLocale("my",{months:"ဇန်နá€á€«á€›á€®_ဖေဖော်á€á€«á€›á€®_မá€á€º_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုá€á€º_စက်á€á€„်ဘာ_အောက်á€á€­á€¯á€˜á€¬_နိုá€á€„်ဘာ_ဒီဇင်ဘာ".split("_"),monthsShort:"ဇန်_ဖေ_မá€á€º_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ".split("_"),weekdays:"á€á€”င်္ဂနွေ_á€á€”င်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပá€á€±á€¸_သောကြာ_စနေ".split("_"),weekdaysShort:"နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),weekdaysMin:"နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[ယနေ.] LT [မှာ]",nextDay:"[မနက်ဖြန်] LT [မှာ]",nextWeek:"dddd LT [မှာ]",lastDay:"[မနေ.က] LT [မှာ]",lastWeek:"[ပြီးá€á€²á€·á€žá€±á€¬] dddd LT [မှာ]",sameElse:"L"},relativeTime:{future:"လာမည့် %s မှာ",past:"လွန်á€á€²á€·á€žá€±á€¬ %s က",s:"စက္ကန်.အနည်းငယ်",m:"á€á€…်မိနစ်",mm:"%d မိနစ်",h:"á€á€…်နာရီ",hh:"%d နာရီ",d:"á€á€…်ရက်",dd:"%d ရက်",M:"á€á€…်လ",MM:"%d လ",y:"á€á€…်နှစ်",yy:"%d နှစ်"},preparse:function(a){return a.replace(/[áá‚áƒá„á…á†á‡áˆá‰á€]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tirs_ons_tors_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"H.mm",LTS:"LT.ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i gÃ¥r kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"for %s siden",s:"noen sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en mÃ¥ned",MM:"%d mÃ¥neder",y:"ett Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return a.defineLocale("ne",{months:"जनवरी_फेबà¥à¤°à¥à¤µà¤°à¥€_मारà¥à¤š_अपà¥à¤°à¤¿à¤²_मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ_अगषà¥à¤Ÿ_सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°_अकà¥à¤Ÿà¥‹à¤¬à¤°_नोभेमà¥à¤¬à¤°_डिसेमà¥à¤¬à¤°".split("_"),monthsShort:"जन._फेबà¥à¤°à¥._मारà¥à¤š_अपà¥à¤°à¤¿._मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ._अग._सेपà¥à¤Ÿ._अकà¥à¤Ÿà¥‹._नोभे._डिसे.".split("_"),weekdays:"आइतबार_सोमबार_मङà¥à¤—लबार_बà¥à¤§à¤¬à¤¾à¤°_बिहिबार_शà¥à¤•à¥à¤°à¤¬à¤¾à¤°_शनिबार".split("_"),weekdaysShort:"आइत._सोम._मङà¥à¤—ल._बà¥à¤§._बिहि._शà¥à¤•à¥à¤°._शनि.".split("_"),weekdaysMin:"आइ._सो._मङà¥_बà¥._बि._शà¥._श.".split("_"),longDateFormat:{LT:"Aको h:mm बजे",LTS:"Aको h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/राती|बिहान|दिउà¤à¤¸à¥‹|बेलà¥à¤•à¤¾|साà¤à¤|राती/,meridiemHour:function(a,b){return 12===a&&(a=0),"राती"===b?3>a?a:a+12:"बिहान"===b?a:"दिउà¤à¤¸à¥‹"===b?a>=10?a:a+12:"बेलà¥à¤•à¤¾"===b||"साà¤à¤"===b?a+12:void 0},meridiem:function(a){return 3>a?"राती":10>a?"बिहान":15>a?"दिउà¤à¤¸à¥‹":18>a?"बेलà¥à¤•à¤¾":20>a?"साà¤à¤":"राती"},calendar:{sameDay:"[आज] LT",nextDay:"[भोली] LT",nextWeek:"[आउà¤à¤¦à¥‹] dddd[,] LT",lastDay:"[हिजो] LT",lastWeek:"[गà¤à¤•à¥‹] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%sमा",past:"%s अगाडी",s:"केही समय",m:"à¤à¤• मिनेट",mm:"%d मिनेट",h:"à¤à¤• घणà¥à¤Ÿà¤¾",hh:"%d घणà¥à¤Ÿà¤¾",d:"à¤à¤• दिन",dd:"%d दिन",M:"à¤à¤• महिना",MM:"%d महिना",y:"à¤à¤• बरà¥à¤·",yy:"%d बरà¥à¤·"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),c="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_");return a.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(a,d){return/-MMM-/.test(d)?c[a.month()]:b[a.month()]},weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_mÃ¥ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_mÃ¥n_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_mÃ¥_ty_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I gÃ¥r klokka] LT",lastWeek:"[FøregÃ¥ande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"for %s sidan",s:"nokre sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",M:"ein mÃ¥nad",MM:"%d mÃ¥nader",y:"eit Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a){return 5>a%10&&a%10>1&&~~(a/10)%10!==1}function c(a,c,d){var e=a+" ";switch(d){case"m":return c?"minuta":"minutÄ™";case"mm":return e+(b(a)?"minuty":"minut");case"h":return c?"godzina":"godzinÄ™";case"hh":return e+(b(a)?"godziny":"godzin");case"MM":return e+(b(a)?"miesiÄ…ce":"miesiÄ™cy");case"yy":return e+(b(a)?"lata":"lat")}}var d="styczeÅ„_luty_marzec_kwiecieÅ„_maj_czerwiec_lipiec_sierpieÅ„_wrzesieÅ„_październik_listopad_grudzieÅ„".split("_"),e="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrzeÅ›nia_października_listopada_grudnia".split("_");return a.defineLocale("pl",{months:function(a,b){return/D MMMM/.test(b)?e[a.month()]:d[a.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziaÅ‚ek_wtorek_Å›roda_czwartek_piÄ…tek_sobota".split("_"),weekdaysShort:"nie_pon_wt_Å›r_czw_pt_sb".split("_"),weekdaysMin:"N_Pn_Wt_Åšr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[DziÅ› o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszÅ‚Ä… niedzielÄ™ o] LT";case 3:return"[W zeszÅ‚Ä… Å›rodÄ™ o] LT";case 6:return"[W zeszÅ‚Ä… sobotÄ™ o] LT";default:return"[W zeszÅ‚y] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:c,mm:c,h:c,hh:c,d:"1 dzieÅ„",dd:"%d dni",M:"miesiÄ…c",MM:c,y:"rok",yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("pt-br",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] LT",LLLL:"dddd, D [de] MMMM [de] YYYY [às] LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº"})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("pt",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d={mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"},e=" ";return(a%100>=20||a>=100&&a%100===0)&&(e=" de "),a+e+d[c]}return a.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),weekdays:"duminică_luni_marÈ›i_miercuri_joi_vineri_sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",m:"un minut",mm:b,h:"o oră",hh:b,d:"o zi",dd:b,M:"o lună",MM:b,y:"un an",yy:b},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:c?"минута_минуты_минут":"минуту_минуты_минут",hh:"чаÑ_чаÑа_чаÑов",dd:"день_днÑ_дней",MM:"меÑÑц_меÑÑца_меÑÑцев",yy:"год_года_лет"};return"m"===d?c?"минута":"минуту":a+" "+b(e[d],+a)}function d(a,b){var c={nominative:"Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь".split("_"),accusative:"ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function e(a,b){var c={nominative:"Ñнв_фев_март_апр_май_июнь_июль_авг_Ñен_окт_ноÑ_дек".split("_"),accusative:"Ñнв_фев_мар_апр_маÑ_июнÑ_июлÑ_авг_Ñен_окт_ноÑ_дек".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function f(a,b){var c={nominative:"воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота".split("_"),accusative:"воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу".split("_")},d=/\[ ?[Вв] ?(?:прошлую|Ñледующую|Ñту)? ?\] ?dddd/.test(b)?"accusative":"nominative";return c[d][a.day()]}return a.defineLocale("ru",{months:d,monthsShort:e,weekdays:f,weekdaysShort:"вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),weekdaysMin:"вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),monthsParse:[/^Ñнв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[й|Ñ]/i,/^июн/i,/^июл/i,/^авг/i,/^Ñен/i,/^окт/i,/^ноÑ/i,/^дек/i],longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., LT",LLLL:"dddd, D MMMM YYYY г., LT"},calendar:{sameDay:"[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT",nextDay:"[Завтра в] LT",lastDay:"[Вчера в] LT",nextWeek:function(){return 2===this.day()?"[Во] dddd [в] LT":"[Ð’] dddd [в] LT"},lastWeek:function(a){if(a.week()===this.week())return 2===this.day()?"[Во] dddd [в] LT":"[Ð’] dddd [в] LT";switch(this.day()){case 0:return"[Ð’ прошлое] dddd [в] LT";case 1:case 2:case 4:return"[Ð’ прошлый] dddd [в] LT";case 3:case 5:case 6:return"[Ð’ прошлую] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"неÑколько Ñекунд",m:c,mm:c,h:"чаÑ",hh:c,d:"день",dd:c,M:"меÑÑц",MM:c,y:"год",yy:c},meridiemParse:/ночи|утра|днÑ|вечера/i,isPM:function(a){return/^(днÑ|вечера)$/.test(a)},meridiem:function(a){return 4>a?"ночи":12>a?"утра":17>a?"днÑ":"вечера"},ordinalParse:/\d{1,2}-(й|го|Ñ)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":return a+"-й";case"D":return a+"-го";case"w":case"W":return a+"-Ñ";default:return a}},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a){return a>1&&5>a}function c(a,c,d,e){var f=a+" ";switch(d){case"s":return c||e?"pár sekúnd":"pár sekundami";case"m":return c?"minúta":e?"minútu":"minútou";case"mm":return c||e?f+(b(a)?"minúty":"minút"):f+"minútami";break;case"h":return c?"hodina":e?"hodinu":"hodinou";case"hh":return c||e?f+(b(a)?"hodiny":"hodín"):f+"hodinami";break;case"d":return c||e?"deň":"dňom";case"dd":return c||e?f+(b(a)?"dni":"dní"):f+"dňami";break;case"M":return c||e?"mesiac":"mesiacom";case"MM":return c||e?f+(b(a)?"mesiace":"mesiacov"):f+"mesiacmi";break;case"y":return c||e?"rok":"rokom";case"yy":return c||e?f+(b(a)?"roky":"rokov"):f+"rokmi"}}var d="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),e="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");return a.defineLocale("sk",{months:d,monthsShort:e,monthsParse:function(a,b){var c,d=[];for(c=0;12>c;c++)d[c]=new RegExp("^"+a[c]+"$|^"+b[c]+"$","i");return d}(d,e),weekdays:"nedeľa_pondelok_utorok_streda_Å¡tvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_Å¡t_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_Å¡t_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo Å¡tvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[vÄera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT";case 1:case 2:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 4:case 5:return"[minulý] dddd [o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d=a+" ";switch(c){case"m":return b?"ena minuta":"eno minuto";case"mm":return d+=1===a?"minuta":2===a?"minuti":3===a||4===a?"minute":"minut";case"h":return b?"ena ura":"eno uro";case"hh":return d+=1===a?"ura":2===a?"uri":3===a||4===a?"ure":"ur";case"dd":return d+=1===a?"dan":"dni"; +case"MM":return d+=1===a?"mesec":2===a?"meseca":3===a||4===a?"mesece":"mesecev";case"yy":return d+=1===a?"leto":2===a?"leti":3===a||4===a?"leta":"let"}}return a.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),weekdays:"nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._Äet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_Äe_pe_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[vÄeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[prejÅ¡nja] dddd [ob] LT";case 1:case 2:case 4:case 5:return"[prejÅ¡nji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"Äez %s",past:"%s nazaj",s:"nekaj sekund",m:b,mm:b,h:b,hh:b,d:"en dan",dd:b,M:"en mesec",MM:b,y:"eno leto",yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"),weekdays:"E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë".split("_"),weekdaysShort:"Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_Më_E_P_Sh".split("_"),meridiemParse:/PD|MD/,isPM:function(a){return"M"===a.charAt(0)},meridiem:function(a){return 12>a?"PD":"MD"},longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Sot në] LT",nextDay:"[Nesër në] LT",nextWeek:"dddd [në] LT",lastDay:"[Dje në] LT",lastWeek:"dddd [e kaluar në] LT",sameElse:"L"},relativeTime:{future:"në %s",past:"%s më parë",s:"disa sekonda",m:"një minutë",mm:"%d minuta",h:"një orë",hh:"%d orë",d:"një ditë",dd:"%d ditë",M:"një muaj",MM:"%d muaj",y:"një vit",yy:"%d vite"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={words:{m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један Ñат","једног Ñата"],hh:["Ñат","Ñата","Ñати"],dd:["дан","дана","дана"],MM:["меÑец","меÑеца","меÑеци"],yy:["година","године","година"]},correctGrammaticalCase:function(a,b){return 1===a?b[0]:a>=2&&4>=a?b[1]:b[2]},translate:function(a,c,d){var e=b.words[d];return 1===d.length?c?e[0]:e[1]:a+" "+b.correctGrammaticalCase(a,e)}};return a.defineLocale("sr-cyrl",{months:["јануар","фебруар","март","април","мај","јун","јул","авгуÑÑ‚","Ñептембар","октобар","новембар","децембар"],monthsShort:["јан.","феб.","мар.","апр.","мај","јун","јул","авг.","Ñеп.","окт.","нов.","дец."],weekdays:["недеља","понедељак","уторак","Ñреда","четвртак","петак","Ñубота"],weekdaysShort:["нед.","пон.","уто.","Ñре.","чет.","пет.","Ñуб."],weekdaysMin:["не","по","ут","ÑÑ€","че","пе","Ñу"],longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Ð´Ð°Ð½Ð°Ñ Ñƒ] LT",nextDay:"[Ñутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [Ñреду] [у] LT";case 6:return"[у] [Ñуботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){var a=["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [Ñреде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [Ñуботе] [у] LT"];return a[this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико Ñекунди",m:b.translate,mm:b.translate,h:b.translate,hh:b.translate,d:"дан",dd:b.translate,M:"меÑец",MM:b.translate,y:"годину",yy:b.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={words:{m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(a,b){return 1===a?b[0]:a>=2&&4>=a?b[1]:b[2]},translate:function(a,c,d){var e=b.words[d];return 1===d.length?c?e[0]:e[1]:a+" "+b.correctGrammaticalCase(a,e)}};return a.defineLocale("sr",{months:["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar"],monthsShort:["jan.","feb.","mar.","apr.","maj","jun","jul","avg.","sep.","okt.","nov.","dec."],weekdays:["nedelja","ponedeljak","utorak","sreda","Äetvrtak","petak","subota"],weekdaysShort:["ned.","pon.","uto.","sre.","Äet.","pet.","sub."],weekdaysMin:["ne","po","ut","sr","Äe","pe","su"],longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄe u] LT",lastWeek:function(){var a=["[proÅ¡le] [nedelje] [u] LT","[proÅ¡log] [ponedeljka] [u] LT","[proÅ¡log] [utorka] [u] LT","[proÅ¡le] [srede] [u] LT","[proÅ¡log] [Äetvrtka] [u] LT","[proÅ¡log] [petka] [u] LT","[proÅ¡le] [subote] [u] LT"];return a[this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",m:b.translate,mm:b.translate,h:b.translate,hh:b.translate,d:"dan",dd:b.translate,M:"mesec",MM:b.translate,y:"godinu",yy:b.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_mÃ¥ndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mÃ¥n_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_mÃ¥_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[IgÃ¥r] LT",nextWeek:"dddd LT",lastWeek:"[Förra] dddd[en] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"nÃ¥gra sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en mÃ¥nad",MM:"%d mÃ¥nader",y:"ett Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}(e|a)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"e":1===b?"a":2===b?"a":"e";return a+c},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ta",{months:"ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯".split("_"),monthsShort:"ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯".split("_"),weekdays:"ஞாயிறà¯à®±à¯à®•à¯à®•à®¿à®´à®®à¯ˆ_திஙà¯à®•à®Ÿà¯à®•à®¿à®´à®®à¯ˆ_செவà¯à®µà®¾à®¯à¯à®•à®¿à®´à®®à¯ˆ_பà¯à®¤à®©à¯à®•à®¿à®´à®®à¯ˆ_வியாழகà¯à®•à®¿à®´à®®à¯ˆ_வெளà¯à®³à®¿à®•à¯à®•à®¿à®´à®®à¯ˆ_சனிகà¯à®•à®¿à®´à®®à¯ˆ".split("_"),weekdaysShort:"ஞாயிறà¯_திஙà¯à®•à®³à¯_செவà¯à®µà®¾à®¯à¯_பà¯à®¤à®©à¯_வியாழனà¯_வெளà¯à®³à®¿_சனி".split("_"),weekdaysMin:"ஞா_தி_செ_பà¯_வி_வெ_ச".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[இனà¯à®±à¯] LT",nextDay:"[நாளை] LT",nextWeek:"dddd, LT",lastDay:"[நேறà¯à®±à¯] LT",lastWeek:"[கடநà¯à®¤ வாரமà¯] dddd, LT",sameElse:"L"},relativeTime:{future:"%s இலà¯",past:"%s à®®à¯à®©à¯",s:"ஒர௠சில விநாடிகளà¯",m:"ஒர௠நிமிடமà¯",mm:"%d நிமிடஙà¯à®•à®³à¯",h:"ஒர௠மணி நேரமà¯",hh:"%d மணி நேரமà¯",d:"ஒர௠நாளà¯",dd:"%d நாடà¯à®•à®³à¯",M:"ஒர௠மாதமà¯",MM:"%d மாதஙà¯à®•à®³à¯",y:"ஒர௠வரà¯à®Ÿà®®à¯",yy:"%d ஆணà¯à®Ÿà¯à®•à®³à¯"},ordinalParse:/\d{1,2}வதà¯/,ordinal:function(a){return a+"வதà¯"},meridiemParse:/யாமமà¯|வைகறை|காலை|நணà¯à®ªà®•à®²à¯|எறà¯à®ªà®¾à®Ÿà¯|மாலை/,meridiem:function(a){return 2>a?" யாமமà¯":6>a?" வைகறை":10>a?" காலை":14>a?" நணà¯à®ªà®•à®²à¯":18>a?" எறà¯à®ªà®¾à®Ÿà¯":22>a?" மாலை":" யாமமà¯"},meridiemHour:function(a,b){return 12===a&&(a=0),"யாமமà¯"===b?2>a?a:a+12:"வைகறை"===b||"காலை"===b?a:"நணà¯à®ªà®•à®²à¯"===b&&a>=10?a:a+12},week:{dow:0,doy:6}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("th",{months:"มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม".split("_"),monthsShort:"มà¸à¸£à¸²_à¸à¸¸à¸¡à¸ à¸²_มีนา_เมษา_พฤษภา_มิถุนา_à¸à¸£à¸à¸Žà¸²_สิงหา_à¸à¸±à¸™à¸¢à¸²_ตุลา_พฤศจิà¸à¸²_ธันวา".split("_"),weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),longDateFormat:{LT:"H นาฬิà¸à¸² m นาที",LTS:"LT s วินาที",L:"YYYY/MM/DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา LT",LLLL:"วันddddที่ D MMMM YYYY เวลา LT"},meridiemParse:/à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง|หลังเที่ยง/,isPM:function(a){return"หลังเที่ยง"===a},meridiem:function(a){return 12>a?"à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่à¹à¸¥à¹‰à¸§ เวลา] LT",sameElse:"L"},relativeTime:{future:"อีภ%s",past:"%sที่à¹à¸¥à¹‰à¸§",s:"ไม่à¸à¸µà¹ˆà¸§à¸´à¸™à¸²à¸—ี",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY LT",LLLL:"dddd, MMMM DD, YYYY LT"},calendar:{sameDay:"[Ngayon sa] LT",nextDay:"[Bukas sa] LT",nextWeek:"dddd [sa] LT",lastDay:"[Kahapon sa] LT",lastWeek:"dddd [huling linggo] LT",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},ordinalParse:/\d{1,2}/,ordinal:function(a){return a},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"};return a.defineLocale("tr",{months:"Ocak_Åžubat_Mart_Nisan_Mayıs_Haziran_Temmuz_AÄŸustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_ÇarÅŸamba_PerÅŸembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[haftaya] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen hafta] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinalParse:/\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/,ordinal:function(a){if(0===a)return a+"'ıncı";var c=a%10,d=a%100-c,e=a>=100?100:null;return a+(b[c]||b[d]||b[e])},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("tzm-latn",{months:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",m:"minuá¸",mm:"%d minuá¸",h:"saÉ›a",hh:"%d tassaÉ›in",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("tzm",{months:"ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”".split("_"),monthsShort:"ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”".split("_"),weekdays:"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysShort:"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysMin:"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[ⴰⵙⴷⵅ â´´] LT",nextDay:"[ⴰⵙⴽⴰ â´´] LT",nextWeek:"dddd [â´´] LT",lastDay:"[ⴰⵚⴰâµâµœ â´´] LT",lastWeek:"dddd [â´´] LT",sameElse:"L"},relativeTime:{future:"â´·â´°â´·âµ… âµ™ ⵢⴰⵠ%s",past:"ⵢⴰⵠ%s",s:"ⵉⵎⵉⴽ",m:"ⵎⵉâµâµ“â´º",mm:"%d ⵎⵉâµâµ“â´º",h:"ⵙⴰⵄⴰ",hh:"%d ⵜⴰⵙⵙⴰⵄⵉâµ",d:"ⴰⵙⵙ",dd:"%d oⵙⵙⴰâµ",M:"â´°âµ¢oⵓⵔ",MM:"%d ⵉⵢⵢⵉⵔâµ",y:"ⴰⵙⴳⴰⵙ",yy:"%d ⵉⵙⴳⴰⵙâµ"},week:{dow:6,doy:12}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:"хвилина_хвилини_хвилин",hh:"година_години_годин",dd:"день_дні_днів",MM:"міÑÑць_міÑÑці_міÑÑців",yy:"рік_роки_років"};return"m"===d?c?"хвилина":"хвилину":"h"===d?c?"година":"годину":a+" "+b(e[d],+a)}function d(a,b){var c={nominative:"Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень".split("_"),accusative:"ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ".split("_")},d=/D[oD]? *MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function e(a,b){var c={nominative:"неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота".split("_"),accusative:"неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу".split("_"),genitive:"неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи".split("_")},d=/(\[[ВвУу]\]) ?dddd/.test(b)?"accusative":/\[?(?:минулої|наÑтупної)? ?\] ?dddd/.test(b)?"genitive":"nominative";return c[d][a.day()]}function f(a){return function(){return a+"о"+(11===this.hours()?"б":"")+"] LT"}}return a.defineLocale("uk",{months:d,monthsShort:"Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд".split("_"),weekdays:e,weekdaysShort:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),weekdaysMin:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY Ñ€.",LLL:"D MMMM YYYY Ñ€., LT",LLLL:"dddd, D MMMM YYYY Ñ€., LT"},calendar:{sameDay:f("[Сьогодні "),nextDay:f("[Завтра "),lastDay:f("[Вчора "),nextWeek:f("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return f("[Минулої] dddd [").call(this);case 1:case 2:case 4:return f("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька Ñекунд",m:c,mm:c,h:"годину",hh:c,d:"день",dd:c,M:"міÑÑць",MM:c,y:"рік",yy:c},meridiemParse:/ночі|ранку|днÑ|вечора/,isPM:function(a){return/^(днÑ|вечора)$/.test(a)},meridiem:function(a){return 4>a?"ночі":12>a?"ранку":17>a?"днÑ":"вечора"},ordinalParse:/\d{1,2}-(й|го)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":case"w":case"W":return a+"-й";case"D":return a+"-го";default:return a}},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("uz",{months:"Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь".split("_"),monthsShort:"Ñнв_фев_мар_апр_май_июн_июл_авг_Ñен_окт_ноÑ_дек".split("_"),weekdays:"Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"),weekdaysShort:"Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"),weekdaysMin:"Як_Ду_Се_Чо_Па_Жу_Ша".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"D MMMM YYYY, dddd LT"},calendar:{sameDay:"[Бугун Ñоат] LT [да]",nextDay:"[Эртага] LT [да]",nextWeek:"dddd [куни Ñоат] LT [да]",lastDay:"[Кеча Ñоат] LT [да]",lastWeek:"[Утган] dddd [куни Ñоат] LT [да]",sameElse:"L"},relativeTime:{future:"Якин %s ичида",past:"Бир неча %s олдин",s:"фурÑат",m:"бир дакика",mm:"%d дакика",h:"бир Ñоат",hh:"%d Ñоат",d:"бир кун",dd:"%d кун",M:"бир ой",MM:"%d ой",y:"бир йил",yy:"%d йил"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("vi",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),weekdays:"chủ nhật_thứ hai_thứ ba_thứ tÆ°_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY LT",LLLL:"dddd, D MMMM [năm] YYYY LT",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY LT",llll:"ddd, D MMM YYYY LT"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tá»›i lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần rồi lúc] LT",sameElse:"L"},relativeTime:{future:"%s tá»›i",past:"%s trÆ°á»›c",s:"vài giây",m:"má»™t phút",mm:"%d phút",h:"má»™t giá»",hh:"%d giá»",d:"má»™t ngày",dd:"%d ngày",M:"má»™t tháng",MM:"%d tháng",y:"má»™t năm",yy:"%d năm"},ordinalParse:/\d{1,2}/,ordinal:function(a){return a},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"æ—¥_一_二_三_å››_五_å…­".split("_"),longDateFormat:{LT:"Ah点mm",LTS:"Ah点m分s秒",L:"YYYY-MM-DD",LL:"YYYYå¹´MMMDæ—¥",LLL:"YYYYå¹´MMMDæ—¥LT",LLLL:"YYYYå¹´MMMDæ—¥ddddLT",l:"YYYY-MM-DD",ll:"YYYYå¹´MMMDæ—¥",lll:"YYYYå¹´MMMDæ—¥LT",llll:"YYYYå¹´MMMDæ—¥ddddLT"},meridiemParse:/凌晨|早上|上åˆ|中åˆ|下åˆ|晚上/,meridiemHour:function(a,b){return 12===a&&(a=0),"凌晨"===b||"早上"===b||"上åˆ"===b?a:"下åˆ"===b||"晚上"===b?a+12:a>=11?a:a+12},meridiem:function(a,b){var c=100*a+b;return 600>c?"凌晨":900>c?"早上":1130>c?"上åˆ":1230>c?"中åˆ":1800>c?"下åˆ":"晚上"},calendar:{sameDay:function(){return 0===this.minutes()?"[今天]Ah[点整]":"[今天]LT"},nextDay:function(){return 0===this.minutes()?"[明天]Ah[点整]":"[明天]LT"},lastDay:function(){return 0===this.minutes()?"[昨天]Ah[点整]":"[昨天]LT"},nextWeek:function(){var b,c;return b=a().startOf("week"),c=this.unix()-b.unix()>=604800?"[下]":"[本]",0===this.minutes()?c+"dddAh点整":c+"dddAh点mm"},lastWeek:function(){var b,c;return b=a().startOf("week"),c=this.unix()=11?a:a+12:"下åˆ"===b||"晚上"===b?a+12:void 0},meridiem:function(a,b){var c=100*a+b;return 900>c?"早上":1130>c?"上åˆ":1230>c?"中åˆ":1800>c?"下åˆ":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},ordinalParse:/\d{1,2}(æ—¥|月|週)/,ordinal:function(a,b){switch(b){case"d":case"D":case"DDD":return a+"æ—¥";case"M":return a+"月";case"w":case"W":return a+"週";default:return a}},relativeTime:{future:"%så…§",past:"%så‰",s:"幾秒",m:"一分é˜",mm:"%d分é˜",h:"一å°æ™‚",hh:"%då°æ™‚",d:"一天",dd:"%d天",M:"一個月",MM:"%d個月",y:"一年",yy:"%då¹´"}})}); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/min/moment-with-locales.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/min/moment-with-locales.js new file mode 100644 index 0000000..202450a --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/min/moment-with-locales.js @@ -0,0 +1,9792 @@ +//! moment.js +//! version : 2.9.0 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com + +(function (undefined) { + /************************************ + Constants + ************************************/ + + var moment, + VERSION = '2.9.0', + // the global-scope this is NOT the global object in Node.js + globalScope = (typeof global !== 'undefined' && (typeof window === 'undefined' || window === global.window)) ? global : this, + oldGlobalMoment, + round = Math.round, + hasOwnProperty = Object.prototype.hasOwnProperty, + i, + + YEAR = 0, + MONTH = 1, + DATE = 2, + HOUR = 3, + MINUTE = 4, + SECOND = 5, + MILLISECOND = 6, + + // internal storage for locale config files + locales = {}, + + // extra moment internal properties (plugins register props here) + momentProperties = [], + + // check for nodeJS + hasModule = (typeof module !== 'undefined' && module && module.exports), + + // ASP.NET json date format regex + aspNetJsonRegex = /^\/?Date\((\-?\d+)/i, + aspNetTimeSpanJsonRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/, + + // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html + // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere + isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/, + + // format tokens + formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|x|X|zz?|ZZ?|.)/g, + localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, + + // parsing token regexes + parseTokenOneOrTwoDigits = /\d\d?/, // 0 - 99 + parseTokenOneToThreeDigits = /\d{1,3}/, // 0 - 999 + parseTokenOneToFourDigits = /\d{1,4}/, // 0 - 9999 + parseTokenOneToSixDigits = /[+\-]?\d{1,6}/, // -999,999 - 999,999 + parseTokenDigits = /\d+/, // nonzero number of digits + parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i, // any word (or two) characters or numbers including two/three word month in arabic. + parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z + parseTokenT = /T/i, // T (ISO separator) + parseTokenOffsetMs = /[\+\-]?\d+/, // 1234567890123 + parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123 + + //strict parsing regexes + parseTokenOneDigit = /\d/, // 0 - 9 + parseTokenTwoDigits = /\d\d/, // 00 - 99 + parseTokenThreeDigits = /\d{3}/, // 000 - 999 + parseTokenFourDigits = /\d{4}/, // 0000 - 9999 + parseTokenSixDigits = /[+-]?\d{6}/, // -999,999 - 999,999 + parseTokenSignedNumber = /[+-]?\d+/, // -inf - inf + + // iso 8601 regex + // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) + isoRegex = /^\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)?)?$/, + + isoFormat = 'YYYY-MM-DDTHH:mm:ssZ', + + isoDates = [ + ['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}/] + ], + + // iso time formats and regexes + isoTimes = [ + ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d+/], + ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/], + ['HH:mm', /(T| )\d\d:\d\d/], + ['HH', /(T| )\d\d/] + ], + + // timezone chunker '+10:00' > ['10', '00'] or '-1530' > ['-', '15', '30'] + parseTimezoneChunker = /([\+\-]|\d\d)/gi, + + // getter and setter names + proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'), + unitMillisecondFactors = { + 'Milliseconds' : 1, + 'Seconds' : 1e3, + 'Minutes' : 6e4, + 'Hours' : 36e5, + 'Days' : 864e5, + 'Months' : 2592e6, + 'Years' : 31536e6 + }, + + unitAliases = { + ms : 'millisecond', + s : 'second', + m : 'minute', + h : 'hour', + d : 'day', + D : 'date', + w : 'week', + W : 'isoWeek', + M : 'month', + Q : 'quarter', + y : 'year', + DDD : 'dayOfYear', + e : 'weekday', + E : 'isoWeekday', + gg: 'weekYear', + GG: 'isoWeekYear' + }, + + camelFunctions = { + dayofyear : 'dayOfYear', + isoweekday : 'isoWeekday', + isoweek : 'isoWeek', + weekyear : 'weekYear', + isoweekyear : 'isoWeekYear' + }, + + // format function strings + formatFunctions = {}, + + // default relative time thresholds + relativeTimeThresholds = { + s: 45, // seconds to minute + m: 45, // minutes to hour + h: 22, // hours to day + d: 26, // days to month + M: 11 // months to year + }, + + // tokens to ordinalize and pad + ordinalizeTokens = 'DDD w W M D d'.split(' '), + paddedTokens = 'M D H h m s w W'.split(' '), + + formatTokenFunctions = { + M : function () { + return this.month() + 1; + }, + MMM : function (format) { + return this.localeData().monthsShort(this, format); + }, + MMMM : function (format) { + return this.localeData().months(this, format); + }, + D : function () { + return this.date(); + }, + DDD : function () { + return this.dayOfYear(); + }, + d : function () { + return this.day(); + }, + dd : function (format) { + return this.localeData().weekdaysMin(this, format); + }, + ddd : function (format) { + return this.localeData().weekdaysShort(this, format); + }, + dddd : function (format) { + return this.localeData().weekdays(this, format); + }, + w : function () { + return this.week(); + }, + W : function () { + return this.isoWeek(); + }, + YY : function () { + return leftZeroFill(this.year() % 100, 2); + }, + YYYY : function () { + return leftZeroFill(this.year(), 4); + }, + YYYYY : function () { + return leftZeroFill(this.year(), 5); + }, + YYYYYY : function () { + var y = this.year(), sign = y >= 0 ? '+' : '-'; + return sign + leftZeroFill(Math.abs(y), 6); + }, + gg : function () { + return leftZeroFill(this.weekYear() % 100, 2); + }, + gggg : function () { + return leftZeroFill(this.weekYear(), 4); + }, + ggggg : function () { + return leftZeroFill(this.weekYear(), 5); + }, + GG : function () { + return leftZeroFill(this.isoWeekYear() % 100, 2); + }, + GGGG : function () { + return leftZeroFill(this.isoWeekYear(), 4); + }, + GGGGG : function () { + return leftZeroFill(this.isoWeekYear(), 5); + }, + e : function () { + return this.weekday(); + }, + E : function () { + return this.isoWeekday(); + }, + a : function () { + return this.localeData().meridiem(this.hours(), this.minutes(), true); + }, + A : function () { + return this.localeData().meridiem(this.hours(), this.minutes(), false); + }, + 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 toInt(this.milliseconds() / 100); + }, + SS : function () { + return leftZeroFill(toInt(this.milliseconds() / 10), 2); + }, + SSS : function () { + return leftZeroFill(this.milliseconds(), 3); + }, + SSSS : function () { + return leftZeroFill(this.milliseconds(), 3); + }, + Z : function () { + var a = this.utcOffset(), + b = '+'; + if (a < 0) { + a = -a; + b = '-'; + } + return b + leftZeroFill(toInt(a / 60), 2) + ':' + leftZeroFill(toInt(a) % 60, 2); + }, + ZZ : function () { + var a = this.utcOffset(), + b = '+'; + if (a < 0) { + a = -a; + b = '-'; + } + return b + leftZeroFill(toInt(a / 60), 2) + leftZeroFill(toInt(a) % 60, 2); + }, + z : function () { + return this.zoneAbbr(); + }, + zz : function () { + return this.zoneName(); + }, + x : function () { + return this.valueOf(); + }, + X : function () { + return this.unix(); + }, + Q : function () { + return this.quarter(); + } + }, + + deprecations = {}, + + lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin'], + + updateInProgress = false; + + // Pick the first defined of two or three arguments. dfl comes from + // default. + function dfl(a, b, c) { + switch (arguments.length) { + case 2: return a != null ? a : b; + case 3: return a != null ? a : b != null ? b : c; + default: throw new Error('Implement me'); + } + } + + function hasOwnProp(a, b) { + return hasOwnProperty.call(a, b); + } + + function defaultParsingFlags() { + // We need to deep clone this object, and es5 standard is not very + // helpful. + return { + empty : false, + unusedTokens : [], + unusedInput : [], + overflow : -2, + charsLeftOver : 0, + nullInput : false, + invalidMonth : null, + invalidFormat : false, + userInvalidated : false, + iso: false + }; + } + + function printMsg(msg) { + if (moment.suppressDeprecationWarnings === false && + typeof console !== 'undefined' && console.warn) { + console.warn('Deprecation warning: ' + msg); + } + } + + function deprecate(msg, fn) { + var firstTime = true; + return extend(function () { + if (firstTime) { + printMsg(msg); + firstTime = false; + } + return fn.apply(this, arguments); + }, fn); + } + + function deprecateSimple(name, msg) { + if (!deprecations[name]) { + printMsg(msg); + deprecations[name] = true; + } + } + + function padToken(func, count) { + return function (a) { + return leftZeroFill(func.call(this, a), count); + }; + } + function ordinalizeToken(func, period) { + return function (a) { + return this.localeData().ordinal(func.call(this, a), period); + }; + } + + function monthDiff(a, b) { + // difference in months + var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), + // b is in (anchor - 1 month, anchor + 1 month) + anchor = a.clone().add(wholeMonthDiff, 'months'), + anchor2, adjust; + + if (b - anchor < 0) { + anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor - anchor2); + } else { + anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor2 - anchor); + } + + return -(wholeMonthDiff + adjust); + } + + while (ordinalizeTokens.length) { + i = ordinalizeTokens.pop(); + formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i); + } + while (paddedTokens.length) { + i = paddedTokens.pop(); + formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2); + } + formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3); + + + function meridiemFixWrap(locale, hour, meridiem) { + var isPm; + + if (meridiem == null) { + // nothing to do + return hour; + } + if (locale.meridiemHour != null) { + return locale.meridiemHour(hour, meridiem); + } else if (locale.isPM != null) { + // Fallback + isPm = locale.isPM(meridiem); + if (isPm && hour < 12) { + hour += 12; + } + if (!isPm && hour === 12) { + hour = 0; + } + return hour; + } else { + // thie is not supposed to happen + return hour; + } + } + + /************************************ + Constructors + ************************************/ + + function Locale() { + } + + // Moment prototype object + function Moment(config, skipOverflow) { + if (skipOverflow !== false) { + checkOverflow(config); + } + copyConfig(this, config); + this._d = new Date(+config._d); + // Prevent infinite loop in case updateOffset creates new moment + // objects. + if (updateInProgress === false) { + updateInProgress = true; + moment.updateOffset(this); + updateInProgress = false; + } + } + + // Duration Constructor + function Duration(duration) { + var normalizedInput = normalizeObjectUnits(duration), + years = normalizedInput.year || 0, + quarters = normalizedInput.quarter || 0, + months = normalizedInput.month || 0, + weeks = normalizedInput.week || 0, + days = normalizedInput.day || 0, + hours = normalizedInput.hour || 0, + minutes = normalizedInput.minute || 0, + seconds = normalizedInput.second || 0, + milliseconds = normalizedInput.millisecond || 0; + + // representation for dateAddRemove + this._milliseconds = +milliseconds + + seconds * 1e3 + // 1000 + minutes * 6e4 + // 1000 * 60 + hours * 36e5; // 1000 * 60 * 60 + // Because of dateAddRemove treats 24 hours as different from a + // day when working around DST, we need to store them separately + this._days = +days + + weeks * 7; + // It is impossible translate months into days without knowing + // which months you are are talking about, so we have to store + // it separately. + this._months = +months + + quarters * 3 + + years * 12; + + this._data = {}; + + this._locale = moment.localeData(); + + this._bubble(); + } + + /************************************ + Helpers + ************************************/ + + + function extend(a, b) { + for (var i in b) { + if (hasOwnProp(b, i)) { + a[i] = b[i]; + } + } + + if (hasOwnProp(b, 'toString')) { + a.toString = b.toString; + } + + if (hasOwnProp(b, 'valueOf')) { + a.valueOf = b.valueOf; + } + + return a; + } + + function copyConfig(to, from) { + var i, prop, val; + + if (typeof from._isAMomentObject !== 'undefined') { + to._isAMomentObject = from._isAMomentObject; + } + if (typeof from._i !== 'undefined') { + to._i = from._i; + } + if (typeof from._f !== 'undefined') { + to._f = from._f; + } + if (typeof from._l !== 'undefined') { + to._l = from._l; + } + if (typeof from._strict !== 'undefined') { + to._strict = from._strict; + } + if (typeof from._tzm !== 'undefined') { + to._tzm = from._tzm; + } + if (typeof from._isUTC !== 'undefined') { + to._isUTC = from._isUTC; + } + if (typeof from._offset !== 'undefined') { + to._offset = from._offset; + } + if (typeof from._pf !== 'undefined') { + to._pf = from._pf; + } + if (typeof from._locale !== 'undefined') { + to._locale = from._locale; + } + + if (momentProperties.length > 0) { + for (i in momentProperties) { + prop = momentProperties[i]; + val = from[prop]; + if (typeof val !== 'undefined') { + to[prop] = val; + } + } + } + + return to; + } + + function absRound(number) { + if (number < 0) { + return Math.ceil(number); + } else { + return Math.floor(number); + } + } + + // left zero fill a number + // see http://jsperf.com/left-zero-filling for performance comparison + function leftZeroFill(number, targetLength, forceSign) { + var output = '' + Math.abs(number), + sign = number >= 0; + + while (output.length < targetLength) { + output = '0' + output; + } + return (sign ? (forceSign ? '+' : '') : '-') + output; + } + + function positiveMomentsDifference(base, other) { + var res = {milliseconds: 0, months: 0}; + + res.months = other.month() - base.month() + + (other.year() - base.year()) * 12; + if (base.clone().add(res.months, 'M').isAfter(other)) { + --res.months; + } + + res.milliseconds = +other - +(base.clone().add(res.months, 'M')); + + return res; + } + + function momentsDifference(base, other) { + var res; + other = makeAs(other, base); + if (base.isBefore(other)) { + res = positiveMomentsDifference(base, other); + } else { + res = positiveMomentsDifference(other, base); + res.milliseconds = -res.milliseconds; + res.months = -res.months; + } + + return res; + } + + // TODO: remove 'name' arg after deprecation is removed + function createAdder(direction, name) { + return function (val, period) { + var dur, tmp; + //invert the arguments, but complain about it + if (period !== null && !isNaN(+period)) { + deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period).'); + tmp = val; val = period; period = tmp; + } + + val = typeof val === 'string' ? +val : val; + dur = moment.duration(val, period); + addOrSubtractDurationFromMoment(this, dur, direction); + return this; + }; + } + + function addOrSubtractDurationFromMoment(mom, duration, isAdding, updateOffset) { + var milliseconds = duration._milliseconds, + days = duration._days, + months = duration._months; + updateOffset = updateOffset == null ? true : updateOffset; + + if (milliseconds) { + mom._d.setTime(+mom._d + milliseconds * isAdding); + } + if (days) { + rawSetter(mom, 'Date', rawGetter(mom, 'Date') + days * isAdding); + } + if (months) { + rawMonthSetter(mom, rawGetter(mom, 'Month') + months * isAdding); + } + if (updateOffset) { + moment.updateOffset(mom, days || months); + } + } + + // check if is an array + function isArray(input) { + return Object.prototype.toString.call(input) === '[object Array]'; + } + + function isDate(input) { + return Object.prototype.toString.call(input) === '[object Date]' || + input instanceof Date; + } + + // compare two arrays, return the number of differences + function compareArrays(array1, array2, dontConvert) { + var len = Math.min(array1.length, array2.length), + lengthDiff = Math.abs(array1.length - array2.length), + diffs = 0, + i; + for (i = 0; i < len; i++) { + if ((dontConvert && array1[i] !== array2[i]) || + (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { + diffs++; + } + } + return diffs + lengthDiff; + } + + function normalizeUnits(units) { + if (units) { + var lowered = units.toLowerCase().replace(/(.)s$/, '$1'); + units = unitAliases[units] || camelFunctions[lowered] || lowered; + } + return units; + } + + function normalizeObjectUnits(inputObject) { + var normalizedInput = {}, + normalizedProp, + prop; + + for (prop in inputObject) { + if (hasOwnProp(inputObject, prop)) { + normalizedProp = normalizeUnits(prop); + if (normalizedProp) { + normalizedInput[normalizedProp] = inputObject[prop]; + } + } + } + + return normalizedInput; + } + + function makeList(field) { + var count, setter; + + if (field.indexOf('week') === 0) { + count = 7; + setter = 'day'; + } + else if (field.indexOf('month') === 0) { + count = 12; + setter = 'month'; + } + else { + return; + } + + moment[field] = function (format, index) { + var i, getter, + method = moment._locale[field], + results = []; + + if (typeof format === 'number') { + index = format; + format = undefined; + } + + getter = function (i) { + var m = moment().utc().set(setter, i); + return method.call(moment._locale, m, format || ''); + }; + + if (index != null) { + return getter(index); + } + else { + for (i = 0; i < count; i++) { + results.push(getter(i)); + } + return results; + } + }; + } + + function toInt(argumentForCoercion) { + var coercedNumber = +argumentForCoercion, + value = 0; + + if (coercedNumber !== 0 && isFinite(coercedNumber)) { + if (coercedNumber >= 0) { + value = Math.floor(coercedNumber); + } else { + value = Math.ceil(coercedNumber); + } + } + + return value; + } + + function daysInMonth(year, month) { + return new Date(Date.UTC(year, month + 1, 0)).getUTCDate(); + } + + function weeksInYear(year, dow, doy) { + return weekOfYear(moment([year, 11, 31 + dow - doy]), dow, doy).week; + } + + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; + } + + function isLeapYear(year) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; + } + + function checkOverflow(m) { + var overflow; + if (m._a && m._pf.overflow === -2) { + overflow = + m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH : + m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE : + m._a[HOUR] < 0 || m._a[HOUR] > 24 || + (m._a[HOUR] === 24 && (m._a[MINUTE] !== 0 || + m._a[SECOND] !== 0 || + m._a[MILLISECOND] !== 0)) ? HOUR : + m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE : + m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND : + m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND : + -1; + + if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { + overflow = DATE; + } + + m._pf.overflow = overflow; + } + } + + function isValid(m) { + if (m._isValid == null) { + m._isValid = !isNaN(m._d.getTime()) && + m._pf.overflow < 0 && + !m._pf.empty && + !m._pf.invalidMonth && + !m._pf.nullInput && + !m._pf.invalidFormat && + !m._pf.userInvalidated; + + if (m._strict) { + m._isValid = m._isValid && + m._pf.charsLeftOver === 0 && + m._pf.unusedTokens.length === 0 && + m._pf.bigHour === undefined; + } + } + return m._isValid; + } + + function normalizeLocale(key) { + return key ? key.toLowerCase().replace('_', '-') : key; + } + + // pick the locale from the array + // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each + // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root + function chooseLocale(names) { + var i = 0, j, next, locale, split; + + while (i < names.length) { + split = normalizeLocale(names[i]).split('-'); + j = split.length; + next = normalizeLocale(names[i + 1]); + next = next ? next.split('-') : null; + while (j > 0) { + locale = loadLocale(split.slice(0, j).join('-')); + if (locale) { + return locale; + } + if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { + //the next array item is better than a shallower substring of this one + break; + } + j--; + } + i++; + } + return null; + } + + function loadLocale(name) { + var oldLocale = null; + if (!locales[name] && hasModule) { + try { + oldLocale = moment.locale(); + require('./locale/' + name); + // because defineLocale currently also sets the global locale, we want to undo that for lazy loaded locales + moment.locale(oldLocale); + } catch (e) { } + } + return locales[name]; + } + + // Return a moment from input, that is local/utc/utcOffset equivalent to + // model. + function makeAs(input, model) { + var res, diff; + if (model._isUTC) { + res = model.clone(); + diff = (moment.isMoment(input) || isDate(input) ? + +input : +moment(input)) - (+res); + // Use low-level api, because this fn is low-level api. + res._d.setTime(+res._d + diff); + moment.updateOffset(res, false); + return res; + } else { + return moment(input).local(); + } + } + + /************************************ + Locale + ************************************/ + + + extend(Locale.prototype, { + + set : function (config) { + var prop, i; + for (i in config) { + prop = config[i]; + if (typeof prop === 'function') { + this[i] = prop; + } else { + this['_' + i] = prop; + } + } + // Lenient ordinal parsing accepts just a number in addition to + // number + (possibly) stuff coming from _ordinalParseLenient. + this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + /\d{1,2}/.source); + }, + + _months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + months : function (m) { + return this._months[m.month()]; + }, + + _monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + monthsShort : function (m) { + return this._monthsShort[m.month()]; + }, + + monthsParse : function (monthName, format, strict) { + var i, mom, regex; + + if (!this._monthsParse) { + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + } + + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = moment.utc([2000, i]); + if (strict && !this._longMonthsParse[i]) { + this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); + this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); + } + if (!strict && !this._monthsParse[i]) { + regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); + this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { + return i; + } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { + return i; + } else if (!strict && this._monthsParse[i].test(monthName)) { + return i; + } + } + }, + + _weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdays : function (m) { + return this._weekdays[m.day()]; + }, + + _weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysShort : function (m) { + return this._weekdaysShort[m.day()]; + }, + + _weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + weekdaysMin : function (m) { + return this._weekdaysMin[m.day()]; + }, + + weekdaysParse : function (weekdayName) { + var i, mom, regex; + + if (!this._weekdaysParse) { + this._weekdaysParse = []; + } + + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + if (!this._weekdaysParse[i]) { + mom = moment([2000, 1]).day(i); + regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); + this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (this._weekdaysParse[i].test(weekdayName)) { + return i; + } + } + }, + + _longDateFormat : { + LTS : 'h:mm:ss A', + 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 (key) { + var output = this._longDateFormat[key]; + if (!output && this._longDateFormat[key.toUpperCase()]) { + output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) { + return val.slice(1); + }); + this._longDateFormat[key] = output; + } + return output; + }, + + isPM : function (input) { + // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays + // Using charAt should be more compatible. + return ((input + '').toLowerCase().charAt(0) === 'p'); + }, + + _meridiemParse : /[ap]\.?m?\.?/i, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'pm' : 'PM'; + } else { + return isLower ? '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 (key, mom, now) { + var output = this._calendar[key]; + return typeof output === 'function' ? output.apply(mom, [now]) : output; + }, + + _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 (number, withoutSuffix, string, isFuture) { + var output = this._relativeTime[string]; + return (typeof output === 'function') ? + output(number, withoutSuffix, string, isFuture) : + output.replace(/%d/i, number); + }, + + pastFuture : function (diff, output) { + var format = this._relativeTime[diff > 0 ? 'future' : 'past']; + return typeof format === 'function' ? format(output) : format.replace(/%s/i, output); + }, + + ordinal : function (number) { + return this._ordinal.replace('%d', number); + }, + _ordinal : '%d', + _ordinalParse : /\d{1,2}/, + + preparse : function (string) { + return string; + }, + + postformat : function (string) { + return string; + }, + + week : function (mom) { + return weekOfYear(mom, this._week.dow, this._week.doy).week; + }, + + _week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + }, + + firstDayOfWeek : function () { + return this._week.dow; + }, + + firstDayOfYear : function () { + return this._week.doy; + }, + + _invalidDate: 'Invalid date', + invalidDate: function () { + return this._invalidDate; + } + }); + + /************************************ + Formatting + ************************************/ + + + function removeFormattingTokens(input) { + if (input.match(/\[[\s\S]/)) { + return input.replace(/^\[|\]$/g, ''); + } + return input.replace(/\\/g, ''); + } + + function makeFormatFunction(format) { + var array = format.match(formattingTokens), i, length; + + for (i = 0, length = array.length; i < length; i++) { + if (formatTokenFunctions[array[i]]) { + array[i] = formatTokenFunctions[array[i]]; + } else { + array[i] = removeFormattingTokens(array[i]); + } + } + + return function (mom) { + var output = ''; + for (i = 0; i < length; i++) { + output += array[i] instanceof Function ? array[i].call(mom, format) : array[i]; + } + return output; + }; + } + + // format date using native date object + function formatMoment(m, format) { + if (!m.isValid()) { + return m.localeData().invalidDate(); + } + + format = expandFormat(format, m.localeData()); + + if (!formatFunctions[format]) { + formatFunctions[format] = makeFormatFunction(format); + } + + return formatFunctions[format](m); + } + + function expandFormat(format, locale) { + var i = 5; + + function replaceLongDateFormatTokens(input) { + return locale.longDateFormat(input) || input; + } + + localFormattingTokens.lastIndex = 0; + while (i >= 0 && localFormattingTokens.test(format)) { + format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); + localFormattingTokens.lastIndex = 0; + i -= 1; + } + + return format; + } + + + /************************************ + Parsing + ************************************/ + + + // get the regex to find the next token + function getParseRegexForToken(token, config) { + var a, strict = config._strict; + switch (token) { + case 'Q': + return parseTokenOneDigit; + case 'DDDD': + return parseTokenThreeDigits; + case 'YYYY': + case 'GGGG': + case 'gggg': + return strict ? parseTokenFourDigits : parseTokenOneToFourDigits; + case 'Y': + case 'G': + case 'g': + return parseTokenSignedNumber; + case 'YYYYYY': + case 'YYYYY': + case 'GGGGG': + case 'ggggg': + return strict ? parseTokenSixDigits : parseTokenOneToSixDigits; + case 'S': + if (strict) { + return parseTokenOneDigit; + } + /* falls through */ + case 'SS': + if (strict) { + return parseTokenTwoDigits; + } + /* falls through */ + case 'SSS': + if (strict) { + return parseTokenThreeDigits; + } + /* falls through */ + case 'DDD': + return parseTokenOneToThreeDigits; + case 'MMM': + case 'MMMM': + case 'dd': + case 'ddd': + case 'dddd': + return parseTokenWord; + case 'a': + case 'A': + return config._locale._meridiemParse; + case 'x': + return parseTokenOffsetMs; + case 'X': + return parseTokenTimestampMs; + case 'Z': + case 'ZZ': + return parseTokenTimezone; + case 'T': + return parseTokenT; + case 'SSSS': + return parseTokenDigits; + case 'MM': + case 'DD': + case 'YY': + case 'GG': + case 'gg': + case 'HH': + case 'hh': + case 'mm': + case 'ss': + case 'ww': + case 'WW': + return strict ? parseTokenTwoDigits : parseTokenOneOrTwoDigits; + case 'M': + case 'D': + case 'd': + case 'H': + case 'h': + case 'm': + case 's': + case 'w': + case 'W': + case 'e': + case 'E': + return parseTokenOneOrTwoDigits; + case 'Do': + return strict ? config._locale._ordinalParse : config._locale._ordinalParseLenient; + default : + a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), 'i')); + return a; + } + } + + function utcOffsetFromString(string) { + string = string || ''; + var possibleTzMatches = (string.match(parseTokenTimezone) || []), + tzChunk = possibleTzMatches[possibleTzMatches.length - 1] || [], + parts = (tzChunk + '').match(parseTimezoneChunker) || ['-', 0, 0], + minutes = +(parts[1] * 60) + toInt(parts[2]); + + return parts[0] === '+' ? minutes : -minutes; + } + + // function to convert string input to date + function addTimeToArrayFromToken(token, input, config) { + var a, datePartArray = config._a; + + switch (token) { + // QUARTER + case 'Q': + if (input != null) { + datePartArray[MONTH] = (toInt(input) - 1) * 3; + } + break; + // MONTH + case 'M' : // fall through to MM + case 'MM' : + if (input != null) { + datePartArray[MONTH] = toInt(input) - 1; + } + break; + case 'MMM' : // fall through to MMMM + case 'MMMM' : + a = config._locale.monthsParse(input, token, config._strict); + // if we didn't find a month name, mark the date as invalid. + if (a != null) { + datePartArray[MONTH] = a; + } else { + config._pf.invalidMonth = input; + } + break; + // DAY OF MONTH + case 'D' : // fall through to DD + case 'DD' : + if (input != null) { + datePartArray[DATE] = toInt(input); + } + break; + case 'Do' : + if (input != null) { + datePartArray[DATE] = toInt(parseInt( + input.match(/\d{1,2}/)[0], 10)); + } + break; + // DAY OF YEAR + case 'DDD' : // fall through to DDDD + case 'DDDD' : + if (input != null) { + config._dayOfYear = toInt(input); + } + + break; + // YEAR + case 'YY' : + datePartArray[YEAR] = moment.parseTwoDigitYear(input); + break; + case 'YYYY' : + case 'YYYYY' : + case 'YYYYYY' : + datePartArray[YEAR] = toInt(input); + break; + // AM / PM + case 'a' : // fall through to A + case 'A' : + config._meridiem = input; + // config._isPm = config._locale.isPM(input); + break; + // HOUR + case 'h' : // fall through to hh + case 'hh' : + config._pf.bigHour = true; + /* falls through */ + case 'H' : // fall through to HH + case 'HH' : + datePartArray[HOUR] = toInt(input); + break; + // MINUTE + case 'm' : // fall through to mm + case 'mm' : + datePartArray[MINUTE] = toInt(input); + break; + // SECOND + case 's' : // fall through to ss + case 'ss' : + datePartArray[SECOND] = toInt(input); + break; + // MILLISECOND + case 'S' : + case 'SS' : + case 'SSS' : + case 'SSSS' : + datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000); + break; + // UNIX OFFSET (MILLISECONDS) + case 'x': + config._d = new Date(toInt(input)); + break; + // UNIX TIMESTAMP WITH MS + case 'X': + config._d = new Date(parseFloat(input) * 1000); + break; + // TIMEZONE + case 'Z' : // fall through to ZZ + case 'ZZ' : + config._useUTC = true; + config._tzm = utcOffsetFromString(input); + break; + // WEEKDAY - human + case 'dd': + case 'ddd': + case 'dddd': + a = config._locale.weekdaysParse(input); + // if we didn't get a weekday name, mark the date as invalid + if (a != null) { + config._w = config._w || {}; + config._w['d'] = a; + } else { + config._pf.invalidWeekday = input; + } + break; + // WEEK, WEEK DAY - numeric + case 'w': + case 'ww': + case 'W': + case 'WW': + case 'd': + case 'e': + case 'E': + token = token.substr(0, 1); + /* falls through */ + case 'gggg': + case 'GGGG': + case 'GGGGG': + token = token.substr(0, 2); + if (input) { + config._w = config._w || {}; + config._w[token] = toInt(input); + } + break; + case 'gg': + case 'GG': + config._w = config._w || {}; + config._w[token] = moment.parseTwoDigitYear(input); + } + } + + function dayOfYearFromWeekInfo(config) { + var w, weekYear, week, weekday, dow, doy, temp; + + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + dow = 1; + doy = 4; + + // TODO: We need to take the current isoWeekYear, but that depends on + // how we interpret now (local, utc, fixed offset). So create + // a now version of current config (take local/utc/offset flags, and + // create now). + weekYear = dfl(w.GG, config._a[YEAR], weekOfYear(moment(), 1, 4).year); + week = dfl(w.W, 1); + weekday = dfl(w.E, 1); + } else { + dow = config._locale._week.dow; + doy = config._locale._week.doy; + + weekYear = dfl(w.gg, config._a[YEAR], weekOfYear(moment(), dow, doy).year); + week = dfl(w.w, 1); + + if (w.d != null) { + // weekday -- low day numbers are considered next week + weekday = w.d; + if (weekday < dow) { + ++week; + } + } else if (w.e != null) { + // local weekday -- counting starts from begining of week + weekday = w.e + dow; + } else { + // default to begining of week + weekday = dow; + } + } + temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow); + + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } + + // convert an array to a date. + // the array should mirror the parameters below + // note: all values past the year are optional and will default to the lowest possible value. + // [year, month, day , hour, minute, second, millisecond] + function dateFromConfig(config) { + var i, date, input = [], currentDate, yearToUse; + + if (config._d) { + return; + } + + currentDate = currentDateArray(config); + + //compute day of the year from weeks and weekdays + if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { + dayOfYearFromWeekInfo(config); + } + + //if the day of the year is set, figure out what it is + if (config._dayOfYear) { + yearToUse = dfl(config._a[YEAR], currentDate[YEAR]); + + if (config._dayOfYear > daysInYear(yearToUse)) { + config._pf._overflowDayOfYear = true; + } + + date = makeUTCDate(yearToUse, 0, config._dayOfYear); + config._a[MONTH] = date.getUTCMonth(); + config._a[DATE] = date.getUTCDate(); + } + + // Default to current date. + // * if no year, month, day of month are given, default to today + // * if day of month is given, default month and year + // * if month is given, default only year + // * if year is given, don't default anything + for (i = 0; i < 3 && config._a[i] == null; ++i) { + config._a[i] = input[i] = currentDate[i]; + } + + // Zero out whatever was not defaulted, including time + for (; i < 7; i++) { + config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; + } + + // Check for 24:00:00.000 + if (config._a[HOUR] === 24 && + config._a[MINUTE] === 0 && + config._a[SECOND] === 0 && + config._a[MILLISECOND] === 0) { + config._nextDay = true; + config._a[HOUR] = 0; + } + + config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input); + // Apply timezone offset from input. The actual utcOffset can be changed + // with parseZone. + if (config._tzm != null) { + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); + } + + if (config._nextDay) { + config._a[HOUR] = 24; + } + } + + function dateFromObject(config) { + var normalizedInput; + + if (config._d) { + return; + } + + normalizedInput = normalizeObjectUnits(config._i); + config._a = [ + normalizedInput.year, + normalizedInput.month, + normalizedInput.day || normalizedInput.date, + normalizedInput.hour, + normalizedInput.minute, + normalizedInput.second, + normalizedInput.millisecond + ]; + + dateFromConfig(config); + } + + function currentDateArray(config) { + var now = new Date(); + if (config._useUTC) { + return [ + now.getUTCFullYear(), + now.getUTCMonth(), + now.getUTCDate() + ]; + } else { + return [now.getFullYear(), now.getMonth(), now.getDate()]; + } + } + + // date from string and format string + function makeDateFromStringAndFormat(config) { + if (config._f === moment.ISO_8601) { + parseISO(config); + return; + } + + config._a = []; + config._pf.empty = true; + + // This array is used to make a Date, either with `new Date` or `Date.UTC` + var string = '' + config._i, + i, parsedInput, tokens, token, skipped, + stringLength = string.length, + totalParsedInputLength = 0; + + tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; + + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; + if (parsedInput) { + skipped = string.substr(0, string.indexOf(parsedInput)); + if (skipped.length > 0) { + config._pf.unusedInput.push(skipped); + } + string = string.slice(string.indexOf(parsedInput) + parsedInput.length); + totalParsedInputLength += parsedInput.length; + } + // don't parse if it's not a known token + if (formatTokenFunctions[token]) { + if (parsedInput) { + config._pf.empty = false; + } + else { + config._pf.unusedTokens.push(token); + } + addTimeToArrayFromToken(token, parsedInput, config); + } + else if (config._strict && !parsedInput) { + config._pf.unusedTokens.push(token); + } + } + + // add remaining unparsed input length to the string + config._pf.charsLeftOver = stringLength - totalParsedInputLength; + if (string.length > 0) { + config._pf.unusedInput.push(string); + } + + // clear _12h flag if hour is <= 12 + if (config._pf.bigHour === true && config._a[HOUR] <= 12) { + config._pf.bigHour = undefined; + } + // handle meridiem + config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], + config._meridiem); + dateFromConfig(config); + checkOverflow(config); + } + + function unescapeFormat(s) { + return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { + return p1 || p2 || p3 || p4; + }); + } + + // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript + function regexpEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + } + + // date from string and array of format strings + function makeDateFromStringAndArray(config) { + var tempConfig, + bestMoment, + + scoreToBeat, + i, + currentScore; + + if (config._f.length === 0) { + config._pf.invalidFormat = true; + config._d = new Date(NaN); + return; + } + + for (i = 0; i < config._f.length; i++) { + currentScore = 0; + tempConfig = copyConfig({}, config); + if (config._useUTC != null) { + tempConfig._useUTC = config._useUTC; + } + tempConfig._pf = defaultParsingFlags(); + tempConfig._f = config._f[i]; + makeDateFromStringAndFormat(tempConfig); + + if (!isValid(tempConfig)) { + continue; + } + + // if there is any input that was not parsed add a penalty for that format + currentScore += tempConfig._pf.charsLeftOver; + + //or tokens + currentScore += tempConfig._pf.unusedTokens.length * 10; + + tempConfig._pf.score = currentScore; + + if (scoreToBeat == null || currentScore < scoreToBeat) { + scoreToBeat = currentScore; + bestMoment = tempConfig; + } + } + + extend(config, bestMoment || tempConfig); + } + + // date from iso format + function parseISO(config) { + var i, l, + string = config._i, + match = isoRegex.exec(string); + + if (match) { + config._pf.iso = true; + for (i = 0, l = isoDates.length; i < l; i++) { + if (isoDates[i][1].exec(string)) { + // match[5] should be 'T' or undefined + config._f = isoDates[i][0] + (match[6] || ' '); + break; + } + } + for (i = 0, l = isoTimes.length; i < l; i++) { + if (isoTimes[i][1].exec(string)) { + config._f += isoTimes[i][0]; + break; + } + } + if (string.match(parseTokenTimezone)) { + config._f += 'Z'; + } + makeDateFromStringAndFormat(config); + } else { + config._isValid = false; + } + } + + // date from iso format or fallback + function makeDateFromString(config) { + parseISO(config); + if (config._isValid === false) { + delete config._isValid; + moment.createFromInputFallback(config); + } + } + + function map(arr, fn) { + var res = [], i; + for (i = 0; i < arr.length; ++i) { + res.push(fn(arr[i], i)); + } + return res; + } + + function makeDateFromInput(config) { + var input = config._i, matched; + if (input === undefined) { + config._d = new Date(); + } else if (isDate(input)) { + config._d = new Date(+input); + } else if ((matched = aspNetJsonRegex.exec(input)) !== null) { + config._d = new Date(+matched[1]); + } else if (typeof input === 'string') { + makeDateFromString(config); + } else if (isArray(input)) { + config._a = map(input.slice(0), function (obj) { + return parseInt(obj, 10); + }); + dateFromConfig(config); + } else if (typeof(input) === 'object') { + dateFromObject(config); + } else if (typeof(input) === 'number') { + // from milliseconds + config._d = new Date(input); + } else { + moment.createFromInputFallback(config); + } + } + + function makeDate(y, m, d, h, M, s, ms) { + //can't just apply() to create a date: + //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply + var date = new Date(y, m, d, h, M, s, ms); + + //the date constructor doesn't accept years < 1970 + if (y < 1970) { + date.setFullYear(y); + } + return date; + } + + function makeUTCDate(y) { + var date = new Date(Date.UTC.apply(null, arguments)); + if (y < 1970) { + date.setUTCFullYear(y); + } + return date; + } + + function parseWeekday(input, locale) { + if (typeof input === 'string') { + if (!isNaN(input)) { + input = parseInt(input, 10); + } + else { + input = locale.weekdaysParse(input); + if (typeof input !== 'number') { + return null; + } + } + } + return input; + } + + /************************************ + Relative Time + ************************************/ + + + // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize + function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { + return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); + } + + function relativeTime(posNegDuration, withoutSuffix, locale) { + var duration = moment.duration(posNegDuration).abs(), + seconds = round(duration.as('s')), + minutes = round(duration.as('m')), + hours = round(duration.as('h')), + days = round(duration.as('d')), + months = round(duration.as('M')), + years = round(duration.as('y')), + + args = seconds < relativeTimeThresholds.s && ['s', seconds] || + minutes === 1 && ['m'] || + minutes < relativeTimeThresholds.m && ['mm', minutes] || + hours === 1 && ['h'] || + hours < relativeTimeThresholds.h && ['hh', hours] || + days === 1 && ['d'] || + days < relativeTimeThresholds.d && ['dd', days] || + months === 1 && ['M'] || + months < relativeTimeThresholds.M && ['MM', months] || + years === 1 && ['y'] || ['yy', years]; + + args[2] = withoutSuffix; + args[3] = +posNegDuration > 0; + args[4] = locale; + return substituteTimeAgo.apply({}, args); + } + + + /************************************ + Week of Year + ************************************/ + + + // firstDayOfWeek 0 = sun, 6 = sat + // the day of the week that starts the week + // (usually sunday or monday) + // firstDayOfWeekOfYear 0 = sun, 6 = sat + // the first week is the week that contains the first + // of this day of the week + // (eg. ISO weeks use thursday (4)) + function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) { + var end = firstDayOfWeekOfYear - firstDayOfWeek, + daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(), + adjustedMoment; + + + if (daysToDayOfWeek > end) { + daysToDayOfWeek -= 7; + } + + if (daysToDayOfWeek < end - 7) { + daysToDayOfWeek += 7; + } + + adjustedMoment = moment(mom).add(daysToDayOfWeek, 'd'); + return { + week: Math.ceil(adjustedMoment.dayOfYear() / 7), + year: adjustedMoment.year() + }; + } + + //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday + function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) { + var d = makeUTCDate(year, 0, 1).getUTCDay(), daysToAdd, dayOfYear; + + d = d === 0 ? 7 : d; + weekday = weekday != null ? weekday : firstDayOfWeek; + daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0); + dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1; + + return { + year: dayOfYear > 0 ? year : year - 1, + dayOfYear: dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear + }; + } + + /************************************ + Top Level Functions + ************************************/ + + function makeMoment(config) { + var input = config._i, + format = config._f, + res; + + config._locale = config._locale || moment.localeData(config._l); + + if (input === null || (format === undefined && input === '')) { + return moment.invalid({nullInput: true}); + } + + if (typeof input === 'string') { + config._i = input = config._locale.preparse(input); + } + + if (moment.isMoment(input)) { + return new Moment(input, true); + } else if (format) { + if (isArray(format)) { + makeDateFromStringAndArray(config); + } else { + makeDateFromStringAndFormat(config); + } + } else { + makeDateFromInput(config); + } + + res = new Moment(config); + if (res._nextDay) { + // Adding is smart enough around DST + res.add(1, 'd'); + res._nextDay = undefined; + } + + return res; + } + + moment = function (input, format, locale, strict) { + var c; + + if (typeof(locale) === 'boolean') { + strict = locale; + locale = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c = {}; + c._isAMomentObject = true; + c._i = input; + c._f = format; + c._l = locale; + c._strict = strict; + c._isUTC = false; + c._pf = defaultParsingFlags(); + + return makeMoment(c); + }; + + moment.suppressDeprecationWarnings = false; + + moment.createFromInputFallback = deprecate( + 'moment construction falls back to js Date. This is ' + + 'discouraged and will be removed in upcoming major ' + + 'release. Please refer to ' + + 'https://github.com/moment/moment/issues/1407 for more info.', + function (config) { + config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); + } + ); + + // Pick a moment m from moments so that m[fn](other) is true for all + // other. This relies on the function fn to be transitive. + // + // moments should either be an array of moment objects or an array, whose + // first element is an array of moment objects. + function pickBy(fn, moments) { + var res, i; + if (moments.length === 1 && isArray(moments[0])) { + moments = moments[0]; + } + if (!moments.length) { + return moment(); + } + res = moments[0]; + for (i = 1; i < moments.length; ++i) { + if (moments[i][fn](res)) { + res = moments[i]; + } + } + return res; + } + + moment.min = function () { + var args = [].slice.call(arguments, 0); + + return pickBy('isBefore', args); + }; + + moment.max = function () { + var args = [].slice.call(arguments, 0); + + return pickBy('isAfter', args); + }; + + // creating with utc + moment.utc = function (input, format, locale, strict) { + var c; + + if (typeof(locale) === 'boolean') { + strict = locale; + locale = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c = {}; + c._isAMomentObject = true; + c._useUTC = true; + c._isUTC = true; + c._l = locale; + c._i = input; + c._f = format; + c._strict = strict; + c._pf = defaultParsingFlags(); + + return makeMoment(c).utc(); + }; + + // creating with unix timestamp (in seconds) + moment.unix = function (input) { + return moment(input * 1000); + }; + + // duration + moment.duration = function (input, key) { + var duration = input, + // matching against regexp is expensive, do it on demand + match = null, + sign, + ret, + parseIso, + diffRes; + + if (moment.isDuration(input)) { + duration = { + ms: input._milliseconds, + d: input._days, + M: input._months + }; + } else if (typeof input === 'number') { + duration = {}; + if (key) { + duration[key] = input; + } else { + duration.milliseconds = input; + } + } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + duration = { + y: 0, + d: toInt(match[DATE]) * sign, + h: toInt(match[HOUR]) * sign, + m: toInt(match[MINUTE]) * sign, + s: toInt(match[SECOND]) * sign, + ms: toInt(match[MILLISECOND]) * sign + }; + } else if (!!(match = isoDurationRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + parseIso = function (inp) { + // We'd normally use ~~inp for this, but unfortunately it also + // converts floats to ints. + // inp may be undefined, so careful calling replace on it. + var res = inp && parseFloat(inp.replace(',', '.')); + // apply sign while we're at it + return (isNaN(res) ? 0 : res) * sign; + }; + duration = { + y: parseIso(match[2]), + M: parseIso(match[3]), + d: parseIso(match[4]), + h: parseIso(match[5]), + m: parseIso(match[6]), + s: parseIso(match[7]), + w: parseIso(match[8]) + }; + } else if (duration == null) {// checks for null or undefined + duration = {}; + } else if (typeof duration === 'object' && + ('from' in duration || 'to' in duration)) { + diffRes = momentsDifference(moment(duration.from), moment(duration.to)); + + duration = {}; + duration.ms = diffRes.milliseconds; + duration.M = diffRes.months; + } + + ret = new Duration(duration); + + if (moment.isDuration(input) && hasOwnProp(input, '_locale')) { + ret._locale = input._locale; + } + + return ret; + }; + + // version number + moment.version = VERSION; + + // default format + moment.defaultFormat = isoFormat; + + // constant that refers to the ISO standard + moment.ISO_8601 = function () {}; + + // Plugins that add properties should also add the key here (null value), + // so we can properly clone ourselves. + moment.momentProperties = momentProperties; + + // This function will be called whenever a moment is mutated. + // It is intended to keep the offset in sync with the timezone. + moment.updateOffset = function () {}; + + // This function allows you to set a threshold for relative time strings + moment.relativeTimeThreshold = function (threshold, limit) { + if (relativeTimeThresholds[threshold] === undefined) { + return false; + } + if (limit === undefined) { + return relativeTimeThresholds[threshold]; + } + relativeTimeThresholds[threshold] = limit; + return true; + }; + + moment.lang = deprecate( + 'moment.lang is deprecated. Use moment.locale instead.', + function (key, value) { + return moment.locale(key, value); + } + ); + + // This function will load locale and then set the global locale. If + // no arguments are passed in, it will simply return the current global + // locale key. + moment.locale = function (key, values) { + var data; + if (key) { + if (typeof(values) !== 'undefined') { + data = moment.defineLocale(key, values); + } + else { + data = moment.localeData(key); + } + + if (data) { + moment.duration._locale = moment._locale = data; + } + } + + return moment._locale._abbr; + }; + + moment.defineLocale = function (name, values) { + if (values !== null) { + values.abbr = name; + if (!locales[name]) { + locales[name] = new Locale(); + } + locales[name].set(values); + + // backwards compat for now: also set the locale + moment.locale(name); + + return locales[name]; + } else { + // useful for testing + delete locales[name]; + return null; + } + }; + + moment.langData = deprecate( + 'moment.langData is deprecated. Use moment.localeData instead.', + function (key) { + return moment.localeData(key); + } + ); + + // returns locale data + moment.localeData = function (key) { + var locale; + + if (key && key._locale && key._locale._abbr) { + key = key._locale._abbr; + } + + if (!key) { + return moment._locale; + } + + if (!isArray(key)) { + //short-circuit everything else + locale = loadLocale(key); + if (locale) { + return locale; + } + key = [key]; + } + + return chooseLocale(key); + }; + + // compare moment object + moment.isMoment = function (obj) { + return obj instanceof Moment || + (obj != null && hasOwnProp(obj, '_isAMomentObject')); + }; + + // for typechecking Duration objects + moment.isDuration = function (obj) { + return obj instanceof Duration; + }; + + for (i = lists.length - 1; i >= 0; --i) { + makeList(lists[i]); + } + + moment.normalizeUnits = function (units) { + return normalizeUnits(units); + }; + + moment.invalid = function (flags) { + var m = moment.utc(NaN); + if (flags != null) { + extend(m._pf, flags); + } + else { + m._pf.userInvalidated = true; + } + + return m; + }; + + moment.parseZone = function () { + return moment.apply(null, arguments).parseZone(); + }; + + moment.parseTwoDigitYear = function (input) { + return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); + }; + + moment.isDate = isDate; + + /************************************ + Moment Prototype + ************************************/ + + + extend(moment.fn = Moment.prototype, { + + clone : function () { + return moment(this); + }, + + valueOf : function () { + return +this._d - ((this._offset || 0) * 60000); + }, + + unix : function () { + return Math.floor(+this / 1000); + }, + + toString : function () { + return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); + }, + + toDate : function () { + return this._offset ? new Date(+this) : this._d; + }, + + toISOString : function () { + var m = moment(this).utc(); + if (0 < m.year() && m.year() <= 9999) { + if ('function' === typeof Date.prototype.toISOString) { + // native implementation is ~50x faster, use it when we can + return this.toDate().toISOString(); + } else { + return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } + } else { + return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } + }, + + toArray : function () { + var m = this; + return [ + m.year(), + m.month(), + m.date(), + m.hours(), + m.minutes(), + m.seconds(), + m.milliseconds() + ]; + }, + + isValid : function () { + return isValid(this); + }, + + isDSTShifted : function () { + if (this._a) { + return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0; + } + + return false; + }, + + parsingFlags : function () { + return extend({}, this._pf); + }, + + invalidAt: function () { + return this._pf.overflow; + }, + + utc : function (keepLocalTime) { + return this.utcOffset(0, keepLocalTime); + }, + + local : function (keepLocalTime) { + if (this._isUTC) { + this.utcOffset(0, keepLocalTime); + this._isUTC = false; + + if (keepLocalTime) { + this.subtract(this._dateUtcOffset(), 'm'); + } + } + return this; + }, + + format : function (inputString) { + var output = formatMoment(this, inputString || moment.defaultFormat); + return this.localeData().postformat(output); + }, + + add : createAdder(1, 'add'), + + subtract : createAdder(-1, 'subtract'), + + diff : function (input, units, asFloat) { + var that = makeAs(input, this), + zoneDiff = (that.utcOffset() - this.utcOffset()) * 6e4, + anchor, diff, output, daysAdjust; + + units = normalizeUnits(units); + + if (units === 'year' || units === 'month' || units === 'quarter') { + output = monthDiff(this, that); + if (units === 'quarter') { + output = output / 3; + } else if (units === 'year') { + output = output / 12; + } + } else { + diff = this - that; + output = units === 'second' ? diff / 1e3 : // 1000 + units === 'minute' ? diff / 6e4 : // 1000 * 60 + units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60 + units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst + units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst + diff; + } + return asFloat ? output : absRound(output); + }, + + from : function (time, withoutSuffix) { + return moment.duration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); + }, + + fromNow : function (withoutSuffix) { + return this.from(moment(), withoutSuffix); + }, + + calendar : function (time) { + // We want to compare the start of today, vs this. + // Getting start-of-today depends on whether we're locat/utc/offset + // or not. + var now = time || moment(), + sod = makeAs(now, this).startOf('day'), + diff = this.diff(sod, 'days', true), + format = diff < -6 ? 'sameElse' : + diff < -1 ? 'lastWeek' : + diff < 0 ? 'lastDay' : + diff < 1 ? 'sameDay' : + diff < 2 ? 'nextDay' : + diff < 7 ? 'nextWeek' : 'sameElse'; + return this.format(this.localeData().calendar(format, this, moment(now))); + }, + + isLeapYear : function () { + return isLeapYear(this.year()); + }, + + isDST : function () { + return (this.utcOffset() > this.clone().month(0).utcOffset() || + this.utcOffset() > this.clone().month(5).utcOffset()); + }, + + day : function (input) { + var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); + if (input != null) { + input = parseWeekday(input, this.localeData()); + return this.add(input - day, 'd'); + } else { + return day; + } + }, + + month : makeAccessor('Month', true), + + startOf : function (units) { + units = normalizeUnits(units); + // the following switch intentionally omits break keywords + // to utilize falling through the cases. + switch (units) { + case 'year': + this.month(0); + /* falls through */ + case 'quarter': + case 'month': + this.date(1); + /* falls through */ + case 'week': + case 'isoWeek': + case 'day': + this.hours(0); + /* falls through */ + case 'hour': + this.minutes(0); + /* falls through */ + case 'minute': + this.seconds(0); + /* falls through */ + case 'second': + this.milliseconds(0); + /* falls through */ + } + + // weeks are a special case + if (units === 'week') { + this.weekday(0); + } else if (units === 'isoWeek') { + this.isoWeekday(1); + } + + // quarters are also special + if (units === 'quarter') { + this.month(Math.floor(this.month() / 3) * 3); + } + + return this; + }, + + endOf: function (units) { + units = normalizeUnits(units); + if (units === undefined || units === 'millisecond') { + return this; + } + return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); + }, + + isAfter: function (input, units) { + var inputMs; + units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); + if (units === 'millisecond') { + input = moment.isMoment(input) ? input : moment(input); + return +this > +input; + } else { + inputMs = moment.isMoment(input) ? +input : +moment(input); + return inputMs < +this.clone().startOf(units); + } + }, + + isBefore: function (input, units) { + var inputMs; + units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); + if (units === 'millisecond') { + input = moment.isMoment(input) ? input : moment(input); + return +this < +input; + } else { + inputMs = moment.isMoment(input) ? +input : +moment(input); + return +this.clone().endOf(units) < inputMs; + } + }, + + isBetween: function (from, to, units) { + return this.isAfter(from, units) && this.isBefore(to, units); + }, + + isSame: function (input, units) { + var inputMs; + units = normalizeUnits(units || 'millisecond'); + if (units === 'millisecond') { + input = moment.isMoment(input) ? input : moment(input); + return +this === +input; + } else { + inputMs = +moment(input); + return +(this.clone().startOf(units)) <= inputMs && inputMs <= +(this.clone().endOf(units)); + } + }, + + min: deprecate( + 'moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548', + function (other) { + other = moment.apply(null, arguments); + return other < this ? this : other; + } + ), + + max: deprecate( + 'moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548', + function (other) { + other = moment.apply(null, arguments); + return other > this ? this : other; + } + ), + + zone : deprecate( + 'moment().zone is deprecated, use moment().utcOffset instead. ' + + 'https://github.com/moment/moment/issues/1779', + function (input, keepLocalTime) { + if (input != null) { + if (typeof input !== 'string') { + input = -input; + } + + this.utcOffset(input, keepLocalTime); + + return this; + } else { + return -this.utcOffset(); + } + } + ), + + // keepLocalTime = true means only change the timezone, without + // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> + // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset + // +0200, so we adjust the time as needed, to be valid. + // + // Keeping the time actually adds/subtracts (one hour) + // from the actual represented time. That is why we call updateOffset + // a second time. In case it wants us to change the offset again + // _changeInProgress == true case, then we have to adjust, because + // there is no such time in the given timezone. + utcOffset : function (input, keepLocalTime) { + var offset = this._offset || 0, + localAdjust; + if (input != null) { + if (typeof input === 'string') { + input = utcOffsetFromString(input); + } + if (Math.abs(input) < 16) { + input = input * 60; + } + if (!this._isUTC && keepLocalTime) { + localAdjust = this._dateUtcOffset(); + } + this._offset = input; + this._isUTC = true; + if (localAdjust != null) { + this.add(localAdjust, 'm'); + } + if (offset !== input) { + if (!keepLocalTime || this._changeInProgress) { + addOrSubtractDurationFromMoment(this, + moment.duration(input - offset, 'm'), 1, false); + } else if (!this._changeInProgress) { + this._changeInProgress = true; + moment.updateOffset(this, true); + this._changeInProgress = null; + } + } + + return this; + } else { + return this._isUTC ? offset : this._dateUtcOffset(); + } + }, + + isLocal : function () { + return !this._isUTC; + }, + + isUtcOffset : function () { + return this._isUTC; + }, + + isUtc : function () { + return this._isUTC && this._offset === 0; + }, + + zoneAbbr : function () { + return this._isUTC ? 'UTC' : ''; + }, + + zoneName : function () { + return this._isUTC ? 'Coordinated Universal Time' : ''; + }, + + parseZone : function () { + if (this._tzm) { + this.utcOffset(this._tzm); + } else if (typeof this._i === 'string') { + this.utcOffset(utcOffsetFromString(this._i)); + } + return this; + }, + + hasAlignedHourOffset : function (input) { + if (!input) { + input = 0; + } + else { + input = moment(input).utcOffset(); + } + + return (this.utcOffset() - input) % 60 === 0; + }, + + daysInMonth : function () { + return daysInMonth(this.year(), this.month()); + }, + + dayOfYear : function (input) { + var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1; + return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); + }, + + quarter : function (input) { + return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); + }, + + weekYear : function (input) { + var year = weekOfYear(this, this.localeData()._week.dow, this.localeData()._week.doy).year; + return input == null ? year : this.add((input - year), 'y'); + }, + + isoWeekYear : function (input) { + var year = weekOfYear(this, 1, 4).year; + return input == null ? year : this.add((input - year), 'y'); + }, + + week : function (input) { + var week = this.localeData().week(this); + return input == null ? week : this.add((input - week) * 7, 'd'); + }, + + isoWeek : function (input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add((input - week) * 7, 'd'); + }, + + weekday : function (input) { + var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; + return input == null ? weekday : this.add(input - weekday, 'd'); + }, + + isoWeekday : function (input) { + // behaves the same as moment#day except + // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) + // as a setter, sunday should belong to the previous week. + return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7); + }, + + isoWeeksInYear : function () { + return weeksInYear(this.year(), 1, 4); + }, + + weeksInYear : function () { + var weekInfo = this.localeData()._week; + return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); + }, + + get : function (units) { + units = normalizeUnits(units); + return this[units](); + }, + + set : function (units, value) { + var unit; + if (typeof units === 'object') { + for (unit in units) { + this.set(unit, units[unit]); + } + } + else { + units = normalizeUnits(units); + if (typeof this[units] === 'function') { + this[units](value); + } + } + return this; + }, + + // If passed a locale key, it will set the locale for this + // instance. Otherwise, it will return the locale configuration + // variables for this instance. + locale : function (key) { + var newLocaleData; + + if (key === undefined) { + return this._locale._abbr; + } else { + newLocaleData = moment.localeData(key); + if (newLocaleData != null) { + this._locale = newLocaleData; + } + return this; + } + }, + + lang : deprecate( + 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', + function (key) { + if (key === undefined) { + return this.localeData(); + } else { + return this.locale(key); + } + } + ), + + localeData : function () { + return this._locale; + }, + + _dateUtcOffset : function () { + // On Firefox.24 Date#getTimezoneOffset returns a floating point. + // https://github.com/moment/moment/pull/1871 + return -Math.round(this._d.getTimezoneOffset() / 15) * 15; + } + + }); + + function rawMonthSetter(mom, value) { + var dayOfMonth; + + // TODO: Move this out of here! + if (typeof value === 'string') { + value = mom.localeData().monthsParse(value); + // TODO: Another silent failure? + if (typeof value !== 'number') { + return mom; + } + } + + dayOfMonth = Math.min(mom.date(), + daysInMonth(mom.year(), value)); + mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); + return mom; + } + + function rawGetter(mom, unit) { + return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit](); + } + + function rawSetter(mom, unit, value) { + if (unit === 'Month') { + return rawMonthSetter(mom, value); + } else { + return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); + } + } + + function makeAccessor(unit, keepTime) { + return function (value) { + if (value != null) { + rawSetter(this, unit, value); + moment.updateOffset(this, keepTime); + return this; + } else { + return rawGetter(this, unit); + } + }; + } + + moment.fn.millisecond = moment.fn.milliseconds = makeAccessor('Milliseconds', false); + moment.fn.second = moment.fn.seconds = makeAccessor('Seconds', false); + moment.fn.minute = moment.fn.minutes = makeAccessor('Minutes', false); + // Setting the hour should keep the time, because the user explicitly + // specified which hour he wants. So trying to maintain the same hour (in + // a new timezone) makes sense. Adding/subtracting hours does not follow + // this rule. + moment.fn.hour = moment.fn.hours = makeAccessor('Hours', true); + // moment.fn.month is defined separately + moment.fn.date = makeAccessor('Date', true); + moment.fn.dates = deprecate('dates accessor is deprecated. Use date instead.', makeAccessor('Date', true)); + moment.fn.year = makeAccessor('FullYear', true); + moment.fn.years = deprecate('years accessor is deprecated. Use year instead.', makeAccessor('FullYear', true)); + + // add plural methods + moment.fn.days = moment.fn.day; + moment.fn.months = moment.fn.month; + moment.fn.weeks = moment.fn.week; + moment.fn.isoWeeks = moment.fn.isoWeek; + moment.fn.quarters = moment.fn.quarter; + + // add aliased format methods + moment.fn.toJSON = moment.fn.toISOString; + + // alias isUtc for dev-friendliness + moment.fn.isUTC = moment.fn.isUtc; + + /************************************ + Duration Prototype + ************************************/ + + + function daysToYears (days) { + // 400 years have 146097 days (taking into account leap year rules) + return days * 400 / 146097; + } + + function yearsToDays (years) { + // years * 365 + absRound(years / 4) - + // absRound(years / 100) + absRound(years / 400); + return years * 146097 / 400; + } + + extend(moment.duration.fn = Duration.prototype, { + + _bubble : function () { + var milliseconds = this._milliseconds, + days = this._days, + months = this._months, + data = this._data, + seconds, minutes, hours, years = 0; + + // The following code bubbles up values, see the tests for + // examples of what that means. + data.milliseconds = milliseconds % 1000; + + seconds = absRound(milliseconds / 1000); + data.seconds = seconds % 60; + + minutes = absRound(seconds / 60); + data.minutes = minutes % 60; + + hours = absRound(minutes / 60); + data.hours = hours % 24; + + days += absRound(hours / 24); + + // Accurately convert days to years, assume start from year 0. + years = absRound(daysToYears(days)); + days -= absRound(yearsToDays(years)); + + // 30 days to a month + // TODO (iskren): Use anchor date (like 1st Jan) to compute this. + months += absRound(days / 30); + days %= 30; + + // 12 months -> 1 year + years += absRound(months / 12); + months %= 12; + + data.days = days; + data.months = months; + data.years = years; + }, + + abs : function () { + this._milliseconds = Math.abs(this._milliseconds); + this._days = Math.abs(this._days); + this._months = Math.abs(this._months); + + this._data.milliseconds = Math.abs(this._data.milliseconds); + this._data.seconds = Math.abs(this._data.seconds); + this._data.minutes = Math.abs(this._data.minutes); + this._data.hours = Math.abs(this._data.hours); + this._data.months = Math.abs(this._data.months); + this._data.years = Math.abs(this._data.years); + + return this; + }, + + weeks : function () { + return absRound(this.days() / 7); + }, + + valueOf : function () { + return this._milliseconds + + this._days * 864e5 + + (this._months % 12) * 2592e6 + + toInt(this._months / 12) * 31536e6; + }, + + humanize : function (withSuffix) { + var output = relativeTime(this, !withSuffix, this.localeData()); + + if (withSuffix) { + output = this.localeData().pastFuture(+this, output); + } + + return this.localeData().postformat(output); + }, + + add : function (input, val) { + // supports only 2.0-style add(1, 's') or add(moment) + var dur = moment.duration(input, val); + + this._milliseconds += dur._milliseconds; + this._days += dur._days; + this._months += dur._months; + + this._bubble(); + + return this; + }, + + subtract : function (input, val) { + var dur = moment.duration(input, val); + + this._milliseconds -= dur._milliseconds; + this._days -= dur._days; + this._months -= dur._months; + + this._bubble(); + + return this; + }, + + get : function (units) { + units = normalizeUnits(units); + return this[units.toLowerCase() + 's'](); + }, + + as : function (units) { + var days, months; + units = normalizeUnits(units); + + if (units === 'month' || units === 'year') { + days = this._days + this._milliseconds / 864e5; + months = this._months + daysToYears(days) * 12; + return units === 'month' ? months : months / 12; + } else { + // handle milliseconds separately because of floating point math errors (issue #1867) + days = this._days + Math.round(yearsToDays(this._months / 12)); + switch (units) { + case 'week': return days / 7 + this._milliseconds / 6048e5; + case 'day': return days + this._milliseconds / 864e5; + case 'hour': return days * 24 + this._milliseconds / 36e5; + case 'minute': return days * 24 * 60 + this._milliseconds / 6e4; + case 'second': return days * 24 * 60 * 60 + this._milliseconds / 1000; + // Math.floor prevents floating point math errors here + case 'millisecond': return Math.floor(days * 24 * 60 * 60 * 1000) + this._milliseconds; + default: throw new Error('Unknown unit ' + units); + } + } + }, + + lang : moment.fn.lang, + locale : moment.fn.locale, + + toIsoString : deprecate( + 'toIsoString() is deprecated. Please use toISOString() instead ' + + '(notice the capitals)', + function () { + return this.toISOString(); + } + ), + + toISOString : function () { + // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js + var years = Math.abs(this.years()), + months = Math.abs(this.months()), + days = Math.abs(this.days()), + hours = Math.abs(this.hours()), + minutes = Math.abs(this.minutes()), + seconds = Math.abs(this.seconds() + this.milliseconds() / 1000); + + if (!this.asSeconds()) { + // this is the same as C#'s (Noda) and python (isodate)... + // but not other JS (goog.date) + return 'P0D'; + } + + return (this.asSeconds() < 0 ? '-' : '') + + 'P' + + (years ? years + 'Y' : '') + + (months ? months + 'M' : '') + + (days ? days + 'D' : '') + + ((hours || minutes || seconds) ? 'T' : '') + + (hours ? hours + 'H' : '') + + (minutes ? minutes + 'M' : '') + + (seconds ? seconds + 'S' : ''); + }, + + localeData : function () { + return this._locale; + }, + + toJSON : function () { + return this.toISOString(); + } + }); + + moment.duration.fn.toString = moment.duration.fn.toISOString; + + function makeDurationGetter(name) { + moment.duration.fn[name] = function () { + return this._data[name]; + }; + } + + for (i in unitMillisecondFactors) { + if (hasOwnProp(unitMillisecondFactors, i)) { + makeDurationGetter(i.toLowerCase()); + } + } + + moment.duration.fn.asMilliseconds = function () { + return this.as('ms'); + }; + moment.duration.fn.asSeconds = function () { + return this.as('s'); + }; + moment.duration.fn.asMinutes = function () { + return this.as('m'); + }; + moment.duration.fn.asHours = function () { + return this.as('h'); + }; + moment.duration.fn.asDays = function () { + return this.as('d'); + }; + moment.duration.fn.asWeeks = function () { + return this.as('weeks'); + }; + moment.duration.fn.asMonths = function () { + return this.as('M'); + }; + moment.duration.fn.asYears = function () { + return this.as('y'); + }; + + /************************************ + Default Locale + ************************************/ + + + // Set default locale, other locale will inherit from English. + moment.locale('en', { + ordinalParse: /\d{1,2}(th|st|nd|rd)/, + ordinal : function (number) { + var b = number % 10, + output = (toInt(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); + + // moment.js locale configuration +// locale : afrikaans (af) +// author : Werner Mollentze : https://github.com/wernerm + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('af', { + months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'), + weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'), + weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'), + meridiemParse: /vm|nm/i, + isPM : function (input) { + return /^nm$/i.test(input); + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower ? 'vm' : 'VM'; + } else { + return isLower ? 'nm' : 'NM'; + } + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Vandag om] LT', + nextDay : '[Môre om] LT', + nextWeek : 'dddd [om] LT', + lastDay : '[Gister om] LT', + lastWeek : '[Laas] dddd [om] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'oor %s', + past : '%s gelede', + s : '\'n paar sekondes', + m : '\'n minuut', + mm : '%d minute', + h : '\'n uur', + hh : '%d ure', + d : '\'n dag', + dd : '%d dae', + M : '\'n maand', + MM : '%d maande', + y : '\'n jaar', + yy : '%d jaar' + }, + ordinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter + }, + week : { + dow : 1, // Maandag is die eerste dag van die week. + doy : 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar. + } + }); +})); +// moment.js locale configuration +// locale : Moroccan Arabic (ar-ma) +// author : ElFadili Yassine : https://github.com/ElFadiliY +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('ar-ma', { + months : 'يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + monthsShort : 'يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'ÙÙŠ %s', + past : 'منذ %s', + s : 'ثوان', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Arabic Saudi Arabia (ar-sa) +// author : Suhail Alkowaileet : https://github.com/xsoh + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': 'Ù¡', + '2': 'Ù¢', + '3': 'Ù£', + '4': 'Ù¤', + '5': 'Ù¥', + '6': 'Ù¦', + '7': 'Ù§', + '8': 'Ù¨', + '9': 'Ù©', + '0': 'Ù ' + }, numberMap = { + 'Ù¡': '1', + 'Ù¢': '2', + 'Ù£': '3', + 'Ù¤': '4', + 'Ù¥': '5', + 'Ù¦': '6', + 'Ù§': '7', + 'Ù¨': '8', + 'Ù©': '9', + 'Ù ': '0' + }; + + return moment.defineLocale('ar-sa', { + months : 'يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + monthsShort : 'يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + meridiemParse: /ص|Ù…/, + isPM : function (input) { + return 'Ù…' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'Ù…'; + } + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'ÙÙŠ %s', + past : 'منذ %s', + s : 'ثوان', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + preparse: function (string) { + return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return numberMap[match]; + }).replace(/ØŒ/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, 'ØŒ'); + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Tunisian Arabic (ar-tn) + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('ar-tn', { + months: 'جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + monthsShort: 'جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin: 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS: 'LT:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd D MMMM YYYY LT' + }, + calendar: { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'ÙÙŠ %s', + past: 'منذ %s', + s: 'ثوان', + m: 'دقيقة', + mm: '%d دقائق', + h: 'ساعة', + hh: '%d ساعات', + d: 'يوم', + dd: '%d أيام', + M: 'شهر', + MM: '%d أشهر', + y: 'سنة', + yy: '%d سنوات' + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// Locale: Arabic (ar) +// Author: Abdel Said: https://github.com/abdelsaid +// Changes in months, weekdays: Ahmed Elkhatib +// Native plural forms: forabi https://github.com/forabi + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': 'Ù¡', + '2': 'Ù¢', + '3': 'Ù£', + '4': 'Ù¤', + '5': 'Ù¥', + '6': 'Ù¦', + '7': 'Ù§', + '8': 'Ù¨', + '9': 'Ù©', + '0': 'Ù ' + }, numberMap = { + 'Ù¡': '1', + 'Ù¢': '2', + 'Ù£': '3', + 'Ù¤': '4', + 'Ù¥': '5', + 'Ù¦': '6', + 'Ù§': '7', + 'Ù¨': '8', + 'Ù©': '9', + 'Ù ': '0' + }, pluralForm = function (n) { + return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5; + }, plurals = { + s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'], + m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'], + h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'], + d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'], + M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'], + y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام'] + }, pluralize = function (u) { + return function (number, withoutSuffix, string, isFuture) { + var f = pluralForm(number), + str = plurals[u][pluralForm(number)]; + if (f === 2) { + str = str[withoutSuffix ? 0 : 1]; + } + return str.replace(/%d/i, number); + }; + }, months = [ + 'كانون الثاني يناير', + 'شباط Ùبراير', + 'آذار مارس', + 'نيسان أبريل', + 'أيار مايو', + 'حزيران يونيو', + 'تموز يوليو', + 'آب أغسطس', + 'أيلول سبتمبر', + 'تشرين الأول أكتوبر', + 'تشرين الثاني نوÙمبر', + 'كانون الأول ديسمبر' + ]; + + return moment.defineLocale('ar', { + months : months, + monthsShort : months, + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + meridiemParse: /ص|Ù…/, + isPM : function (input) { + return 'Ù…' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'Ù…'; + } + }, + calendar : { + sameDay: '[اليوم عند الساعة] LT', + nextDay: '[غدًا عند الساعة] LT', + nextWeek: 'dddd [عند الساعة] LT', + lastDay: '[أمس عند الساعة] LT', + lastWeek: 'dddd [عند الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'بعد %s', + past : 'منذ %s', + s : pluralize('s'), + m : pluralize('m'), + mm : pluralize('m'), + h : pluralize('h'), + hh : pluralize('h'), + d : pluralize('d'), + dd : pluralize('d'), + M : pluralize('M'), + MM : pluralize('M'), + y : pluralize('y'), + yy : pluralize('y') + }, + preparse: function (string) { + return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return numberMap[match]; + }).replace(/ØŒ/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, 'ØŒ'); + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : azerbaijani (az) +// author : topchiyev : https://github.com/topchiyev + +(function (factory) { + factory(moment); +}(function (moment) { + var suffixes = { + 1: '-inci', + 5: '-inci', + 8: '-inci', + 70: '-inci', + 80: '-inci', + + 2: '-nci', + 7: '-nci', + 20: '-nci', + 50: '-nci', + + 3: '-üncü', + 4: '-üncü', + 100: '-üncü', + + 6: '-ncı', + + 9: '-uncu', + 10: '-uncu', + 30: '-uncu', + + 60: '-ıncı', + 90: '-ıncı' + }; + return moment.defineLocale('az', { + months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'), + monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'), + weekdays : 'Bazar_Bazar ertÉ™si_ÇərÅŸÉ™nbÉ™ axÅŸamı_ÇərÅŸÉ™nbÉ™_CümÉ™ axÅŸamı_CümÉ™_ŞənbÉ™'.split('_'), + weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'), + weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[bugün saat] LT', + nextDay : '[sabah saat] LT', + nextWeek : '[gÉ™lÉ™n hÉ™ftÉ™] dddd [saat] LT', + lastDay : '[dünÉ™n] LT', + lastWeek : '[keçən hÉ™ftÉ™] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s sonra', + past : '%s É™vvÉ™l', + s : 'birneçə saniyyÉ™', + m : 'bir dÉ™qiqÉ™', + mm : '%d dÉ™qiqÉ™', + h : 'bir saat', + hh : '%d saat', + d : 'bir gün', + dd : '%d gün', + M : 'bir ay', + MM : '%d ay', + y : 'bir il', + yy : '%d il' + }, + meridiemParse: /gecÉ™|sÉ™hÉ™r|gündüz|axÅŸam/, + isPM : function (input) { + return /^(gündüz|axÅŸam)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'gecÉ™'; + } else if (hour < 12) { + return 'sÉ™hÉ™r'; + } else if (hour < 17) { + return 'gündüz'; + } else { + return 'axÅŸam'; + } + }, + ordinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/, + ordinal : function (number) { + if (number === 0) { // special case for zero + return number + '-ıncı'; + } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + + return number + (suffixes[a] || suffixes[b] || suffixes[c]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : belarusian (be) +// author : Dmitry Demidov : https://github.com/demidov91 +// author: Praleska: http://praleska.pro/ +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + factory(moment); +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін', + 'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін', + 'dd': 'дзень_дні_дзён', + 'MM': 'меÑÑц_меÑÑцы_меÑÑцаў', + 'yy': 'год_гады_гадоў' + }; + if (key === 'm') { + return withoutSuffix ? 'хвіліна' : 'хвіліну'; + } + else if (key === 'h') { + return withoutSuffix ? 'гадзіна' : 'гадзіну'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñтудзень_люты_Ñакавік_краÑавік_травень_чÑрвень_ліпень_жнівень_вераÑень_каÑтрычнік_ліÑтапад_Ñнежань'.split('_'), + 'accusative': 'ÑтудзенÑ_лютага_Ñакавіка_краÑавіка_траўнÑ_чÑрвенÑ_ліпенÑ_жніўнÑ_вераÑнÑ_каÑтрычніка_ліÑтапада_ÑнежнÑ'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'нÑдзелÑ_панÑдзелак_аўторак_Ñерада_чацвер_пÑтніца_Ñубота'.split('_'), + 'accusative': 'нÑдзелю_панÑдзелак_аўторак_Ñераду_чацвер_пÑтніцу_Ñуботу'.split('_') + }, + + nounCase = (/\[ ?[Вв] ?(?:мінулую|наÑтупную)? ?\] ?dddd/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.defineLocale('be', { + months : monthsCaseReplace, + monthsShort : 'Ñтуд_лют_Ñак_краÑ_трав_чÑрв_ліп_жнів_вер_каÑÑ‚_ліÑÑ‚_Ñнеж'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'нд_пн_ат_ÑÑ€_чц_пт_Ñб'.split('_'), + weekdaysMin : 'нд_пн_ат_ÑÑ€_чц_пт_Ñб'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY г.', + LLL : 'D MMMM YYYY г., LT', + LLLL : 'dddd, D MMMM YYYY г., LT' + }, + calendar : { + sameDay: '[Ð¡Ñ‘Ð½Ð½Ñ Ñž] LT', + nextDay: '[Заўтра Ñž] LT', + lastDay: '[Учора Ñž] LT', + nextWeek: function () { + return '[У] dddd [Ñž] LT'; + }, + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return '[У мінулую] dddd [Ñž] LT'; + case 1: + case 2: + case 4: + return '[У мінулы] dddd [Ñž] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'праз %s', + past : '%s таму', + s : 'некалькі Ñекунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : relativeTimeWithPlural, + hh : relativeTimeWithPlural, + d : 'дзень', + dd : relativeTimeWithPlural, + M : 'меÑÑц', + MM : relativeTimeWithPlural, + y : 'год', + yy : relativeTimeWithPlural + }, + meridiemParse: /ночы|раніцы|днÑ|вечара/, + isPM : function (input) { + return /^(днÑ|вечара)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночы'; + } else if (hour < 12) { + return 'раніцы'; + } else if (hour < 17) { + return 'днÑ'; + } else { + return 'вечара'; + } + }, + + ordinalParse: /\d{1,2}-(Ñ–|Ñ‹|га)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-Ñ–' : number + '-Ñ‹'; + case 'D': + return number + '-га'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : bulgarian (bg) +// author : Krasen Borisov : https://github.com/kraz + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('bg', { + months : 'Ñнуари_февруари_март_април_май_юни_юли_авгуÑÑ‚_Ñептември_октомври_ноември_декември'.split('_'), + monthsShort : 'Ñнр_фев_мар_апр_май_юни_юли_авг_Ñеп_окт_ное_дек'.split('_'), + weekdays : 'неделÑ_понеделник_вторник_ÑÑ€Ñда_четвъртък_петък_Ñъбота'.split('_'), + weekdaysShort : 'нед_пон_вто_ÑÑ€Ñ_чет_пет_Ñъб'.split('_'), + weekdaysMin : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'D.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Ð”Ð½ÐµÑ Ð²] LT', + nextDay : '[Утре в] LT', + nextWeek : 'dddd [в] LT', + lastDay : '[Вчера в] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[Ð’ изминалата] dddd [в] LT'; + case 1: + case 2: + case 4: + case 5: + return '[Ð’ изминалиÑ] dddd [в] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'Ñлед %s', + past : 'преди %s', + s : 'нÑколко Ñекунди', + m : 'минута', + mm : '%d минути', + h : 'чаÑ', + hh : '%d чаÑа', + d : 'ден', + dd : '%d дни', + M : 'меÑец', + MM : '%d меÑеца', + y : 'година', + yy : '%d години' + }, + ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Bengali (bn) +// author : Kaushik Gandhi : https://github.com/kaushikgandhi + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': '১', + '2': '২', + '3': '৩', + '4': '৪', + '5': '৫', + '6': '৬', + '7': '৭', + '8': '৮', + '9': '৯', + '0': '০' + }, + numberMap = { + '১': '1', + '২': '2', + '৩': '3', + '৪': '4', + '৫': '5', + '৬': '6', + '৭': '7', + '৮': '8', + '৯': '9', + '০': '0' + }; + + return moment.defineLocale('bn', { + months : 'জানà§à§Ÿà¦¾à¦°à§€_ফেবà§à§Ÿà¦¾à¦°à§€_মারà§à¦š_à¦à¦ªà§à¦°à¦¿à¦²_মে_জà§à¦¨_জà§à¦²à¦¾à¦‡_অগাসà§à¦Ÿ_সেপà§à¦Ÿà§‡à¦®à§à¦¬à¦°_অকà§à¦Ÿà§‹à¦¬à¦°_নভেমà§à¦¬à¦°_ডিসেমà§à¦¬à¦°'.split('_'), + monthsShort : 'জানà§_ফেব_মারà§à¦š_à¦à¦ªà¦°_মে_জà§à¦¨_জà§à¦²_অগ_সেপà§à¦Ÿ_অকà§à¦Ÿà§‹_নভ_ডিসেমà§'.split('_'), + weekdays : 'রবিবার_সোমবার_মঙà§à¦—লবার_বà§à¦§à¦¬à¦¾à¦°_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿à¦¬à¦¾à¦°_শà§à¦•à§à¦°à§à¦¬à¦¾à¦°_শনিবার'.split('_'), + weekdaysShort : 'রবি_সোম_মঙà§à¦—ল_বà§à¦§_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿_শà§à¦•à§à¦°à§_শনি'.split('_'), + weekdaysMin : 'রব_সম_মঙà§à¦—_বà§_বà§à¦°à¦¿à¦¹_শà§_শনি'.split('_'), + longDateFormat : { + LT : 'A h:mm সময়', + LTS : 'A h:mm:ss সময়', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[আজ] LT', + nextDay : '[আগামীকাল] LT', + nextWeek : 'dddd, LT', + lastDay : '[গতকাল] LT', + lastWeek : '[গত] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s পরে', + past : '%s আগে', + s : 'কà¦à¦• সেকেনà§à¦¡', + m : 'à¦à¦• মিনিট', + mm : '%d মিনিট', + h : 'à¦à¦• ঘনà§à¦Ÿà¦¾', + hh : '%d ঘনà§à¦Ÿà¦¾', + d : 'à¦à¦• দিন', + dd : '%d দিন', + M : 'à¦à¦• মাস', + MM : '%d মাস', + y : 'à¦à¦• বছর', + yy : '%d বছর' + }, + preparse: function (string) { + return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /রাত|শকাল|দà§à¦ªà§à¦°|বিকেল|রাত/, + isPM: function (input) { + return /^(দà§à¦ªà§à¦°|বিকেল|রাত)$/.test(input); + }, + //Bengali is a vast language its spoken + //in different forms in various parts of the world. + //I have just generalized with most common one used + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'রাত'; + } else if (hour < 10) { + return 'শকাল'; + } else if (hour < 17) { + return 'দà§à¦ªà§à¦°'; + } else if (hour < 20) { + return 'বিকেল'; + } else { + return 'রাত'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : tibetan (bo) +// author : Thupten N. Chakrishar : https://github.com/vajradog + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': '༡', + '2': '༢', + '3': '༣', + '4': '༤', + '5': '༥', + '6': '༦', + '7': '༧', + '8': '༨', + '9': '༩', + '0': '༠' + }, + numberMap = { + '༡': '1', + '༢': '2', + '༣': '3', + '༤': '4', + '༥': '5', + '༦': '6', + '༧': '7', + '༨': '8', + '༩': '9', + '༠': '0' + }; + + return moment.defineLocale('bo', { + months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), + monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), + weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'), + weekdaysShort : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), + weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), + longDateFormat : { + LT : 'A h:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[དི་རིང] LT', + nextDay : '[སང་ཉིན] LT', + nextWeek : '[བདུན་ཕྲག་རྗེས་མ], LT', + lastDay : '[à½à¼‹à½¦à½„] LT', + lastWeek : '[བདུན་ཕྲག་མà½à½ à¼‹à½˜] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s ལ་', + past : '%s སྔན་ལ', + s : 'ལམ་སང', + m : 'སà¾à½¢à¼‹à½˜à¼‹à½‚ཅིག', + mm : '%d སà¾à½¢à¼‹à½˜', + h : 'ཆུ་ཚོད་གཅིག', + hh : '%d ཆུ་ཚོད', + d : 'ཉིན་གཅིག', + dd : '%d ཉིན་', + M : 'ཟླ་བ་གཅིག', + MM : '%d ཟླ་བ', + y : 'ལོ་གཅིག', + yy : '%d ལོ' + }, + preparse: function (string) { + return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/, + isPM: function (input) { + return /^(ཉིན་གུང|དགོང་དག|མཚན་མོ)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'མཚན་མོ'; + } else if (hour < 10) { + return 'ཞོགས་ཀས'; + } else if (hour < 17) { + return 'ཉིན་གུང'; + } else if (hour < 20) { + return 'དགོང་དག'; + } else { + return 'མཚན་མོ'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : breton (br) +// author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou + +(function (factory) { + factory(moment); +}(function (moment) { + function relativeTimeWithMutation(number, withoutSuffix, key) { + var format = { + 'mm': 'munutenn', + 'MM': 'miz', + 'dd': 'devezh' + }; + return number + ' ' + mutation(format[key], number); + } + + function specialMutationForYears(number) { + switch (lastNumber(number)) { + case 1: + case 3: + case 4: + case 5: + case 9: + return number + ' bloaz'; + default: + return number + ' vloaz'; + } + } + + function lastNumber(number) { + if (number > 9) { + return lastNumber(number % 10); + } + return number; + } + + function mutation(text, number) { + if (number === 2) { + return softMutation(text); + } + return text; + } + + function softMutation(text) { + var mutationTable = { + 'm': 'v', + 'b': 'v', + 'd': 'z' + }; + if (mutationTable[text.charAt(0)] === undefined) { + return text; + } + return mutationTable[text.charAt(0)] + text.substring(1); + } + + return moment.defineLocale('br', { + months : 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'), + monthsShort : 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'), + weekdays : 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'), + weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'), + weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'), + longDateFormat : { + LT : 'h[e]mm A', + LTS : 'h[e]mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D [a viz] MMMM YYYY', + LLL : 'D [a viz] MMMM YYYY LT', + LLLL : 'dddd, D [a viz] MMMM YYYY LT' + }, + calendar : { + sameDay : '[Hiziv da] LT', + nextDay : '[Warc\'hoazh da] LT', + nextWeek : 'dddd [da] LT', + lastDay : '[Dec\'h da] LT', + lastWeek : 'dddd [paset da] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'a-benn %s', + past : '%s \'zo', + s : 'un nebeud segondennoù', + m : 'ur vunutenn', + mm : relativeTimeWithMutation, + h : 'un eur', + hh : '%d eur', + d : 'un devezh', + dd : relativeTimeWithMutation, + M : 'ur miz', + MM : relativeTimeWithMutation, + y : 'ur bloaz', + yy : specialMutationForYears + }, + ordinalParse: /\d{1,2}(añ|vet)/, + ordinal : function (number) { + var output = (number === 1) ? 'añ' : 'vet'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : bosnian (bs) +// author : Nedim Cholich : https://github.com/frontyard +// based on (hr) translation by Bojan Marković + +(function (factory) { + factory(moment); +}(function (moment) { + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } + } + + return moment.defineLocale('bs', { + months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'), + monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'), + weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota'.split('_'), + weekdaysShort : 'ned._pon._uto._sri._Äet._pet._sub.'.split('_'), + weekdaysMin : 'ne_po_ut_sr_Äe_pe_su'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD. MM. YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[proÅ¡lu] dddd [u] LT'; + case 6: + return '[proÅ¡le] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[proÅ¡li] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'par sekundi', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'dan', + dd : translate, + M : 'mjesec', + MM : translate, + y : 'godinu', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : catalan (ca) +// author : Juan G. Hurtado : https://github.com/juanghurtado + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('ca', { + months : 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'), + monthsShort : 'gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.'.split('_'), + weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'), + weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'), + weekdaysMin : 'Dg_Dl_Dt_Dc_Dj_Dv_Ds'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay : function () { + return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextDay : function () { + return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastDay : function () { + return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'fa %s', + s : 'uns segons', + m : 'un minut', + mm : '%d minuts', + h : 'una hora', + hh : '%d hores', + d : 'un dia', + dd : '%d dies', + M : 'un mes', + MM : '%d mesos', + y : 'un any', + yy : '%d anys' + }, + ordinalParse: /\d{1,2}(r|n|t|è|a)/, + ordinal : function (number, period) { + var output = (number === 1) ? 'r' : + (number === 2) ? 'n' : + (number === 3) ? 'r' : + (number === 4) ? 't' : 'è'; + if (period === 'w' || period === 'W') { + output = 'a'; + } + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : czech (cs) +// author : petrbela : https://github.com/petrbela + +(function (factory) { + factory(moment); +}(function (moment) { + var months = 'leden_únor_bÅ™ezen_duben_kvÄ›ten_Äerven_Äervenec_srpen_září_říjen_listopad_prosinec'.split('_'), + monthsShort = 'led_úno_bÅ™e_dub_kvÄ›_Ävn_Ävc_srp_zář_říj_lis_pro'.split('_'); + + function plural(n) { + return (n > 1) && (n < 5) && (~~(n / 10) !== 1); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami'; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minuty' : 'minut'); + } else { + return result + 'minutami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodin'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'den' : 'dnem'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dny' : 'dní'); + } else { + return result + 'dny'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mÄ›síc' : 'mÄ›sícem'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'mÄ›síce' : 'mÄ›síců'); + } else { + return result + 'mÄ›síci'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokem'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'let'); + } else { + return result + 'lety'; + } + break; + } + } + + return moment.defineLocale('cs', { + months : months, + monthsShort : monthsShort, + monthsParse : (function (months, monthsShort) { + var i, _monthsParse = []; + for (i = 0; i < 12; i++) { + // use custom parser to solve problem with July (Äervenec) + _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); + } + return _monthsParse; + }(months, monthsShort)), + weekdays : 'nedÄ›le_pondÄ›lí_úterý_stÅ™eda_Ätvrtek_pátek_sobota'.split('_'), + weekdaysShort : 'ne_po_út_st_Ät_pá_so'.split('_'), + weekdaysMin : 'ne_po_út_st_Ät_pá_so'.split('_'), + longDateFormat : { + LT: 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[dnes v] LT', + nextDay: '[zítra v] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedÄ›li v] LT'; + case 1: + case 2: + return '[v] dddd [v] LT'; + case 3: + return '[ve stÅ™edu v] LT'; + case 4: + return '[ve Ätvrtek v] LT'; + case 5: + return '[v pátek v] LT'; + case 6: + return '[v sobotu v] LT'; + } + }, + lastDay: '[vÄera v] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulou nedÄ›li v] LT'; + case 1: + case 2: + return '[minulé] dddd [v] LT'; + case 3: + return '[minulou stÅ™edu v] LT'; + case 4: + case 5: + return '[minulý] dddd [v] LT'; + case 6: + return '[minulou sobotu v] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pÅ™ed %s', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse : /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : chuvash (cv) +// author : Anatoly Mironov : https://github.com/mirontoli + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('cv', { + months : 'кăрлач_нарăÑ_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав'.split('_'), + monthsShort : 'кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш'.split('_'), + weekdays : 'вырÑарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_Ñрнекун_шăматкун'.split('_'), + weekdaysShort : 'выр_тун_ытл_юн_кĕç_Ñрн_шăм'.split('_'), + weekdaysMin : 'вр_тн_Ñ‹Ñ‚_юн_кç_ÑÑ€_шм'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD-MM-YYYY', + LL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]', + LLL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT', + LLLL : 'dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT' + }, + calendar : { + sameDay: '[ПаÑн] LT [Ñехетре]', + nextDay: '[Ыран] LT [Ñехетре]', + lastDay: '[Ĕнер] LT [Ñехетре]', + nextWeek: '[ÇитеÑ] dddd LT [Ñехетре]', + lastWeek: '[Иртнĕ] dddd LT [Ñехетре]', + sameElse: 'L' + }, + relativeTime : { + future : function (output) { + var affix = /Ñехет$/i.exec(output) ? 'рен' : /çул$/i.exec(output) ? 'тан' : 'ран'; + return output + affix; + }, + past : '%s каÑлла', + s : 'пĕр-ик çеккунт', + m : 'пĕр минут', + mm : '%d минут', + h : 'пĕр Ñехет', + hh : '%d Ñехет', + d : 'пĕр кун', + dd : '%d кун', + M : 'пĕр уйăх', + MM : '%d уйăх', + y : 'пĕр çул', + yy : '%d çул' + }, + ordinalParse: /\d{1,2}-мĕш/, + ordinal : '%d-мĕш', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Welsh (cy) +// author : Robert Allen + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('cy', { + months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'), + monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'), + weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'), + weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'), + weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'), + // time formats are the same as en-gb + longDateFormat: { + LT: 'HH:mm', + LTS : 'LT:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd, D MMMM YYYY LT' + }, + calendar: { + sameDay: '[Heddiw am] LT', + nextDay: '[Yfory am] LT', + nextWeek: 'dddd [am] LT', + lastDay: '[Ddoe am] LT', + lastWeek: 'dddd [diwethaf am] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'mewn %s', + past: '%s yn ôl', + s: 'ychydig eiliadau', + m: 'munud', + mm: '%d munud', + h: 'awr', + hh: '%d awr', + d: 'diwrnod', + dd: '%d diwrnod', + M: 'mis', + MM: '%d mis', + y: 'blwyddyn', + yy: '%d flynedd' + }, + ordinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/, + // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh + ordinal: function (number) { + var b = number, + output = '', + lookup = [ + '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed + 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed + ]; + + if (b > 20) { + if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) { + output = 'fed'; // not 30ain, 70ain or 90ain + } else { + output = 'ain'; + } + } else if (b > 0) { + output = lookup[b]; + } + + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : danish (da) +// author : Ulrik Nielsen : https://github.com/mrbase + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('da', { + months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), + weekdaysShort : 'søn_man_tir_ons_tor_fre_lør'.split('_'), + weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd [d.] D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[I dag kl.] LT', + nextDay : '[I morgen kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[I gÃ¥r kl.] LT', + lastWeek : '[sidste] dddd [kl] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'om %s', + past : '%s siden', + s : 'fÃ¥ sekunder', + m : 'et minut', + mm : '%d minutter', + h : 'en time', + hh : '%d timer', + d : 'en dag', + dd : '%d dage', + M : 'en mÃ¥ned', + MM : '%d mÃ¥neder', + y : 'et Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : austrian german (de-at) +// author : lluchs : https://github.com/lluchs +// author: Menelion Elensúle: https://github.com/Oire +// author : Martin Groller : https://github.com/MadMG + +(function (factory) { + factory(moment); +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + return moment.defineLocale('de-at', { + months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[Heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[Morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[Gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : german (de) +// author : lluchs : https://github.com/lluchs +// author: Menelion Elensúle: https://github.com/Oire + +(function (factory) { + factory(moment); +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + return moment.defineLocale('de', { + months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[Heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[Morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[Gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : modern greek (el) +// author : Aggelos Karalias : https://github.com/mehiel + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('el', { + monthsNominativeEl : 'ΙανουάÏιος_ΦεβÏουάÏιος_ΜάÏτιος_ΑπÏίλιος_Μάιος_ΙοÏνιος_ΙοÏλιος_ΑÏγουστος_ΣεπτέμβÏιος_ΟκτώβÏιος_ÎοέμβÏιος_ΔεκέμβÏιος'.split('_'), + monthsGenitiveEl : 'ΙανουαÏίου_ΦεβÏουαÏίου_ΜαÏτίου_ΑπÏιλίου_ΜαÎου_Ιουνίου_Ιουλίου_ΑυγοÏστου_ΣεπτεμβÏίου_ΟκτωβÏίου_ÎοεμβÏίου_ΔεκεμβÏίου'.split('_'), + months : function (momentToFormat, format) { + if (/D/.test(format.substring(0, format.indexOf('MMMM')))) { // if there is a day number before 'MMMM' + return this._monthsGenitiveEl[momentToFormat.month()]; + } else { + return this._monthsNominativeEl[momentToFormat.month()]; + } + }, + monthsShort : 'Ιαν_Φεβ_ΜαÏ_ΑπÏ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Îοε_Δεκ'.split('_'), + weekdays : 'ΚυÏιακή_ΔευτέÏα_ΤÏίτη_ΤετάÏτη_Πέμπτη_ΠαÏασκευή_Σάββατο'.split('_'), + weekdaysShort : 'ΚυÏ_Δευ_ΤÏι_Τετ_Πεμ_ΠαÏ_Σαβ'.split('_'), + weekdaysMin : 'Κυ_Δε_ΤÏ_Τε_Πε_Πα_Σα'.split('_'), + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'μμ' : 'ΜΜ'; + } else { + return isLower ? 'πμ' : 'ΠΜ'; + } + }, + isPM : function (input) { + return ((input + '').toLowerCase()[0] === 'μ'); + }, + meridiemParse : /[ΠΜ]\.?Îœ?\.?/i, + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendarEl : { + sameDay : '[ΣήμεÏα {}] LT', + nextDay : '[ΑÏÏιο {}] LT', + nextWeek : 'dddd [{}] LT', + lastDay : '[Χθες {}] LT', + lastWeek : function () { + switch (this.day()) { + case 6: + return '[το Ï€ÏοηγοÏμενο] dddd [{}] LT'; + default: + return '[την Ï€ÏοηγοÏμενη] dddd [{}] LT'; + } + }, + sameElse : 'L' + }, + calendar : function (key, mom) { + var output = this._calendarEl[key], + hours = mom && mom.hours(); + + if (typeof output === 'function') { + output = output.apply(mom); + } + + return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις')); + }, + relativeTime : { + future : 'σε %s', + past : '%s Ï€Ïιν', + s : 'λίγα δευτεÏόλεπτα', + m : 'ένα λεπτό', + mm : '%d λεπτά', + h : 'μία ÏŽÏα', + hh : '%d ÏŽÏες', + d : 'μία μέÏα', + dd : '%d μέÏες', + M : 'ένας μήνας', + MM : '%d μήνες', + y : 'ένας χÏόνος', + yy : '%d χÏόνια' + }, + ordinalParse: /\d{1,2}η/, + ordinal: '%dη', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : australian english (en-au) + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('en-au', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + 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' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : canadian english (en-ca) +// author : Jonathan Abourbih : https://github.com/jonbca + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('en-ca', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'YYYY-MM-DD', + LL : 'D MMMM, YYYY', + LLL : 'D MMMM, YYYY LT', + LLLL : 'dddd, D MMMM, YYYY LT' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + 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' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); +})); +// moment.js locale configuration +// locale : great britain english (en-gb) +// author : Chris Gedrim : https://github.com/chrisgedrim + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('en-gb', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + 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' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : esperanto (eo) +// author : Colin Dean : https://github.com/colindean +// komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko. +// Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni! + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('eo', { + months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aÅ­gusto_septembro_oktobro_novembro_decembro'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aÅ­g_sep_okt_nov_dec'.split('_'), + weekdays : 'Dimanĉo_Lundo_Mardo_Merkredo_Ä´aÅ­do_Vendredo_Sabato'.split('_'), + weekdaysShort : 'Dim_Lun_Mard_Merk_Ä´aÅ­_Ven_Sab'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Ä´a_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'D[-an de] MMMM, YYYY', + LLL : 'D[-an de] MMMM, YYYY LT', + LLLL : 'dddd, [la] D[-an de] MMMM, YYYY LT' + }, + meridiemParse: /[ap]\.t\.m/i, + isPM: function (input) { + return input.charAt(0).toLowerCase() === 'p'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'p.t.m.' : 'P.T.M.'; + } else { + return isLower ? 'a.t.m.' : 'A.T.M.'; + } + }, + calendar : { + sameDay : '[HodiaÅ­ je] LT', + nextDay : '[MorgaÅ­ je] LT', + nextWeek : 'dddd [je] LT', + lastDay : '[HieraÅ­ je] LT', + lastWeek : '[pasinta] dddd [je] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'je %s', + past : 'antaÅ­ %s', + s : 'sekundoj', + m : 'minuto', + mm : '%d minutoj', + h : 'horo', + hh : '%d horoj', + d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo + dd : '%d tagoj', + M : 'monato', + MM : '%d monatoj', + y : 'jaro', + yy : '%d jaroj' + }, + ordinalParse: /\d{1,2}a/, + ordinal : '%da', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : spanish (es) +// author : Julio Napurí : https://github.com/julionc + +(function (factory) { + factory(moment); +}(function (moment) { + var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), + monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); + + return moment.defineLocale('es', { + months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return monthsShort[m.month()]; + } else { + return monthsShortDot[m.month()]; + } + }, + weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), + weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), + weekdaysMin : 'Do_Lu_Ma_Mi_Ju_Vi_Sá'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY LT', + LLLL : 'dddd, D [de] MMMM [de] YYYY LT' + }, + calendar : { + sameDay : function () { + return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextDay : function () { + return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastDay : function () { + return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'hace %s', + s : 'unos segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'una hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un año', + yy : '%d años' + }, + ordinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : estonian (et) +// author : Henry Kehlmann : https://github.com/madhenry +// improvements : Illimar Tambek : https://github.com/ragulka + +(function (factory) { + factory(moment); +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'], + 'm' : ['ühe minuti', 'üks minut'], + 'mm': [number + ' minuti', number + ' minutit'], + 'h' : ['ühe tunni', 'tund aega', 'üks tund'], + 'hh': [number + ' tunni', number + ' tundi'], + 'd' : ['ühe päeva', 'üks päev'], + 'M' : ['kuu aja', 'kuu aega', 'üks kuu'], + 'MM': [number + ' kuu', number + ' kuud'], + 'y' : ['ühe aasta', 'aasta', 'üks aasta'], + 'yy': [number + ' aasta', number + ' aastat'] + }; + if (withoutSuffix) { + return format[key][2] ? format[key][2] : format[key][1]; + } + return isFuture ? format[key][0] : format[key][1]; + } + + return moment.defineLocale('et', { + months : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'), + monthsShort : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'), + weekdays : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'), + weekdaysShort : 'P_E_T_K_N_R_L'.split('_'), + weekdaysMin : 'P_E_T_K_N_R_L'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[Täna,] LT', + nextDay : '[Homme,] LT', + nextWeek : '[Järgmine] dddd LT', + lastDay : '[Eile,] LT', + lastWeek : '[Eelmine] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s pärast', + past : '%s tagasi', + s : processRelativeTime, + m : processRelativeTime, + mm : processRelativeTime, + h : processRelativeTime, + hh : processRelativeTime, + d : processRelativeTime, + dd : '%d päeva', + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : euskara (eu) +// author : Eneko Illarramendi : https://github.com/eillarra + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('eu', { + months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'), + monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'), + weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'), + weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'), + weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY[ko] MMMM[ren] D[a]', + LLL : 'YYYY[ko] MMMM[ren] D[a] LT', + LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] LT', + l : 'YYYY-M-D', + ll : 'YYYY[ko] MMM D[a]', + lll : 'YYYY[ko] MMM D[a] LT', + llll : 'ddd, YYYY[ko] MMM D[a] LT' + }, + calendar : { + sameDay : '[gaur] LT[etan]', + nextDay : '[bihar] LT[etan]', + nextWeek : 'dddd LT[etan]', + lastDay : '[atzo] LT[etan]', + lastWeek : '[aurreko] dddd LT[etan]', + sameElse : 'L' + }, + relativeTime : { + future : '%s barru', + past : 'duela %s', + s : 'segundo batzuk', + m : 'minutu bat', + mm : '%d minutu', + h : 'ordu bat', + hh : '%d ordu', + d : 'egun bat', + dd : '%d egun', + M : 'hilabete bat', + MM : '%d hilabete', + y : 'urte bat', + yy : '%d urte' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Persian (fa) +// author : Ebrahim Byagowi : https://github.com/ebraminio + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': 'Û±', + '2': 'Û²', + '3': 'Û³', + '4': 'Û´', + '5': 'Ûµ', + '6': 'Û¶', + '7': 'Û·', + '8': 'Û¸', + '9': 'Û¹', + '0': 'Û°' + }, numberMap = { + 'Û±': '1', + 'Û²': '2', + 'Û³': '3', + 'Û´': '4', + 'Ûµ': '5', + 'Û¶': '6', + 'Û·': '7', + 'Û¸': '8', + 'Û¹': '9', + 'Û°': '0' + }; + + return moment.defineLocale('fa', { + months : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + monthsShort : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysMin : 'ÛŒ_د_س_Ú†_Ù¾_ج_Ø´'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + meridiemParse: /قبل از ظهر|بعد از ظهر/, + isPM: function (input) { + return /بعد از ظهر/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'قبل از ظهر'; + } else { + return 'بعد از ظهر'; + } + }, + calendar : { + sameDay : '[امروز ساعت] LT', + nextDay : '[Ùردا ساعت] LT', + nextWeek : 'dddd [ساعت] LT', + lastDay : '[دیروز ساعت] LT', + lastWeek : 'dddd [پیش] [ساعت] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'در %s', + past : '%s پیش', + s : 'چندین ثانیه', + m : 'یک دقیقه', + mm : '%d دقیقه', + h : 'یک ساعت', + hh : '%d ساعت', + d : 'یک روز', + dd : '%d روز', + M : 'یک ماه', + MM : '%d ماه', + y : 'یک سال', + yy : '%d سال' + }, + preparse: function (string) { + return string.replace(/[Û°-Û¹]/g, function (match) { + return numberMap[match]; + }).replace(/ØŒ/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, 'ØŒ'); + }, + ordinalParse: /\d{1,2}Ù…/, + ordinal : '%dÙ…', + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : finnish (fi) +// author : Tarmo Aidantausta : https://github.com/bleadof + +(function (factory) { + factory(moment); +}(function (moment) { + var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '), + numbersFuture = [ + 'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden', + numbersPast[7], numbersPast[8], numbersPast[9] + ]; + + function translate(number, withoutSuffix, key, isFuture) { + var result = ''; + switch (key) { + case 's': + return isFuture ? 'muutaman sekunnin' : 'muutama sekunti'; + case 'm': + return isFuture ? 'minuutin' : 'minuutti'; + case 'mm': + result = isFuture ? 'minuutin' : 'minuuttia'; + break; + case 'h': + return isFuture ? 'tunnin' : 'tunti'; + case 'hh': + result = isFuture ? 'tunnin' : 'tuntia'; + break; + case 'd': + return isFuture ? 'päivän' : 'päivä'; + case 'dd': + result = isFuture ? 'päivän' : 'päivää'; + break; + case 'M': + return isFuture ? 'kuukauden' : 'kuukausi'; + case 'MM': + result = isFuture ? 'kuukauden' : 'kuukautta'; + break; + case 'y': + return isFuture ? 'vuoden' : 'vuosi'; + case 'yy': + result = isFuture ? 'vuoden' : 'vuotta'; + break; + } + result = verbalNumber(number, isFuture) + ' ' + result; + return result; + } + + function verbalNumber(number, isFuture) { + return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number; + } + + return moment.defineLocale('fi', { + months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'), + monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'), + weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'), + weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'), + weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD.MM.YYYY', + LL : 'Do MMMM[ta] YYYY', + LLL : 'Do MMMM[ta] YYYY, [klo] LT', + LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] LT', + l : 'D.M.YYYY', + ll : 'Do MMM YYYY', + lll : 'Do MMM YYYY, [klo] LT', + llll : 'ddd, Do MMM YYYY, [klo] LT' + }, + calendar : { + sameDay : '[tänään] [klo] LT', + nextDay : '[huomenna] [klo] LT', + nextWeek : 'dddd [klo] LT', + lastDay : '[eilen] [klo] LT', + lastWeek : '[viime] dddd[na] [klo] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s päästä', + past : '%s sitten', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : faroese (fo) +// author : Ragnar Johannesen : https://github.com/ragnar123 + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('fo', { + months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'), + weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'), + weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D. MMMM, YYYY LT' + }, + calendar : { + sameDay : '[à dag kl.] LT', + nextDay : '[à morgin kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[à gjár kl.] LT', + lastWeek : '[síðstu] dddd [kl] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'um %s', + past : '%s síðani', + s : 'fá sekund', + m : 'ein minutt', + mm : '%d minuttir', + h : 'ein tími', + hh : '%d tímar', + d : 'ein dagur', + dd : '%d dagar', + M : 'ein mánaði', + MM : '%d mánaðir', + y : 'eitt ár', + yy : '%d ár' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : canadian french (fr-ca) +// author : Jonathan Abourbih : https://github.com/jonbca + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('fr-ca', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Aujourd\'hui à] LT', + nextDay: '[Demain à] LT', + nextWeek: 'dddd [à] LT', + lastDay: '[Hier à] LT', + lastWeek: 'dddd [dernier à] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + ordinalParse: /\d{1,2}(er|)/, + ordinal : function (number) { + return number + (number === 1 ? 'er' : ''); + } + }); +})); +// moment.js locale configuration +// locale : french (fr) +// author : John Fischer : https://github.com/jfroffice + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('fr', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Aujourd\'hui à] LT', + nextDay: '[Demain à] LT', + nextWeek: 'dddd [à] LT', + lastDay: '[Hier à] LT', + lastWeek: 'dddd [dernier à] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + ordinalParse: /\d{1,2}(er|)/, + ordinal : function (number) { + return number + (number === 1 ? 'er' : ''); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : frisian (fy) +// author : Robin van der Vliet : https://github.com/robin0van0der0v + +(function (factory) { + factory(moment); +}(function (moment) { + var monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'); + + return moment.defineLocale('fy', { + months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'), + weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'), + weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[hjoed om] LT', + nextDay: '[moarn om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[juster om] LT', + lastWeek: '[ôfrûne] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'oer %s', + past : '%s lyn', + s : 'in pear sekonden', + m : 'ien minút', + mm : '%d minuten', + h : 'ien oere', + hh : '%d oeren', + d : 'ien dei', + dd : '%d dagen', + M : 'ien moanne', + MM : '%d moannen', + y : 'ien jier', + yy : '%d jierren' + }, + ordinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : galician (gl) +// author : Juan G. Hurtado : https://github.com/juanghurtado + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('gl', { + months : 'Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro'.split('_'), + monthsShort : 'Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.'.split('_'), + weekdays : 'Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado'.split('_'), + weekdaysShort : 'Dom._Lun._Mar._Mér._Xov._Ven._Sáb.'.split('_'), + weekdaysMin : 'Do_Lu_Ma_Mé_Xo_Ve_Sá'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay : function () { + return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextDay : function () { + return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextWeek : function () { + return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + lastDay : function () { + return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT'; + }, + lastWeek : function () { + return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : function (str) { + if (str === 'uns segundos') { + return 'nuns segundos'; + } + return 'en ' + str; + }, + past : 'hai %s', + s : 'uns segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'unha hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un ano', + yy : '%d anos' + }, + ordinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Hebrew (he) +// author : Tomer Cohen : https://github.com/tomer +// author : Moshe Simantov : https://github.com/DevelopmentIL +// author : Tal Ater : https://github.com/TalAter + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('he', { + months : 'ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר'.split('_'), + monthsShort : 'ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳'.split('_'), + weekdays : 'ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'), + weekdaysShort : '×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'), + weekdaysMin : '×_ב_×’_ד_×”_ו_ש'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [ב]MMMM YYYY', + LLL : 'D [ב]MMMM YYYY LT', + LLLL : 'dddd, D [ב]MMMM YYYY LT', + l : 'D/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY LT', + llll : 'ddd, D MMM YYYY LT' + }, + calendar : { + sameDay : '[×”×™×•× ×‘Ö¾]LT', + nextDay : '[מחר ב־]LT', + nextWeek : 'dddd [בשעה] LT', + lastDay : '[×תמול ב־]LT', + lastWeek : '[ביו×] dddd [×”×חרון בשעה] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'בעוד %s', + past : 'לפני %s', + s : 'מספר שניות', + m : 'דקה', + mm : '%d דקות', + h : 'שעה', + hh : function (number) { + if (number === 2) { + return 'שעתיי×'; + } + return number + ' שעות'; + }, + d : 'יו×', + dd : function (number) { + if (number === 2) { + return 'יומיי×'; + } + return number + ' ימי×'; + }, + M : 'חודש', + MM : function (number) { + if (number === 2) { + return 'חודשיי×'; + } + return number + ' חודשי×'; + }, + y : 'שנה', + yy : function (number) { + if (number === 2) { + return 'שנתיי×'; + } else if (number % 10 === 0 && number !== 10) { + return number + ' שנה'; + } + return number + ' שני×'; + } + } + }); +})); +// moment.js locale configuration +// locale : hindi (hi) +// author : Mayank Singhal : https://github.com/mayanksinghal + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.defineLocale('hi', { + months : 'जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°'.split('_'), + monthsShort : 'जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.'.split('_'), + weekdays : 'रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split('_'), + weekdaysShort : 'रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split('_'), + weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split('_'), + longDateFormat : { + LT : 'A h:mm बजे', + LTS : 'A h:mm:ss बजे', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[कल] LT', + nextWeek : 'dddd, LT', + lastDay : '[कल] LT', + lastWeek : '[पिछले] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s में', + past : '%s पहले', + s : 'कà¥à¤› ही कà¥à¤·à¤£', + m : 'à¤à¤• मिनट', + mm : '%d मिनट', + h : 'à¤à¤• घंटा', + hh : '%d घंटे', + d : 'à¤à¤• दिन', + dd : '%d दिन', + M : 'à¤à¤• महीने', + MM : '%d महीने', + y : 'à¤à¤• वरà¥à¤·', + yy : '%d वरà¥à¤·' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + // Hindi notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi. + meridiemParse: /रात|सà¥à¤¬à¤¹|दोपहर|शाम/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'रात') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'सà¥à¤¬à¤¹') { + return hour; + } else if (meridiem === 'दोपहर') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'शाम') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'रात'; + } else if (hour < 10) { + return 'सà¥à¤¬à¤¹'; + } else if (hour < 17) { + return 'दोपहर'; + } else if (hour < 20) { + return 'शाम'; + } else { + return 'रात'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : hrvatski (hr) +// author : Bojan Marković : https://github.com/bmarkovic + +// based on (sl) translation by Robert SedovÅ¡ek + +(function (factory) { + factory(moment); +}(function (moment) { + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } + } + + return moment.defineLocale('hr', { + months : 'sjeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_'), + monthsShort : 'sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'), + weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota'.split('_'), + weekdaysShort : 'ned._pon._uto._sri._Äet._pet._sub.'.split('_'), + weekdaysMin : 'ne_po_ut_sr_Äe_pe_su'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD. MM. YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[proÅ¡lu] dddd [u] LT'; + case 6: + return '[proÅ¡le] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[proÅ¡li] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'par sekundi', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'dan', + dd : translate, + M : 'mjesec', + MM : translate, + y : 'godinu', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : hungarian (hu) +// author : Adam Brunner : https://github.com/adambrunner + +(function (factory) { + factory(moment); +}(function (moment) { + var weekEndings = 'vasárnap hétfÅ‘n kedden szerdán csütörtökön pénteken szombaton'.split(' '); + + function translate(number, withoutSuffix, key, isFuture) { + var num = number, + suffix; + + switch (key) { + case 's': + return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce'; + case 'm': + return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'mm': + return num + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'h': + return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'hh': + return num + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'd': + return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'dd': + return num + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'M': + return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'MM': + return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'y': + return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve'); + case 'yy': + return num + (isFuture || withoutSuffix ? ' év' : ' éve'); + } + + return ''; + } + + function week(isFuture) { + return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]'; + } + + return moment.defineLocale('hu', { + months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'), + monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'), + weekdays : 'vasárnap_hétfÅ‘_kedd_szerda_csütörtök_péntek_szombat'.split('_'), + weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'), + weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'YYYY.MM.DD.', + LL : 'YYYY. MMMM D.', + LLL : 'YYYY. MMMM D., LT', + LLLL : 'YYYY. MMMM D., dddd LT' + }, + meridiemParse: /de|du/i, + isPM: function (input) { + return input.charAt(1).toLowerCase() === 'u'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower === true ? 'de' : 'DE'; + } else { + return isLower === true ? 'du' : 'DU'; + } + }, + calendar : { + sameDay : '[ma] LT[-kor]', + nextDay : '[holnap] LT[-kor]', + nextWeek : function () { + return week.call(this, true); + }, + lastDay : '[tegnap] LT[-kor]', + lastWeek : function () { + return week.call(this, false); + }, + sameElse : 'L' + }, + relativeTime : { + future : '%s múlva', + past : '%s', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Armenian (hy-am) +// author : Armendarabyan : https://github.com/armendarabyan + +(function (factory) { + factory(moment); +}(function (moment) { + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€_Õ´Õ¡Ö€Õ¿_Õ¡ÕºÖ€Õ«Õ¬_Õ´Õ¡ÕµÕ«Õ½_Õ°Õ¸Ö‚Õ¶Õ«Õ½_Õ°Õ¸Ö‚Õ¬Õ«Õ½_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€'.split('_'), + 'accusative': 'Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€Õ«_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€Õ«_Õ´Õ¡Ö€Õ¿Õ«_Õ¡ÕºÖ€Õ«Õ¬Õ«_Õ´Õ¡ÕµÕ«Õ½Õ«_Õ°Õ¸Ö‚Õ¶Õ«Õ½Õ«_Õ°Õ¸Ö‚Õ¬Õ«Õ½Õ«_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½Õ«_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function monthsShortCaseReplace(m, format) { + var monthsShort = 'Õ°Õ¶Õ¾_ÖƒÕ¿Ö€_Õ´Ö€Õ¿_Õ¡ÕºÖ€_Õ´ÕµÕ½_Õ°Õ¶Õ½_Õ°Õ¬Õ½_Ö…Õ£Õ½_Õ½ÕºÕ¿_Õ°Õ¯Õ¿_Õ¶Õ´Õ¢_Õ¤Õ¯Õ¿'.split('_'); + + return monthsShort[m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = 'Õ¯Õ«Ö€Õ¡Õ¯Õ«_Õ¥Ö€Õ¯Õ¸Ö‚Õ·Õ¡Õ¢Õ©Õ«_Õ¥Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ¹Õ¸Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ°Õ«Õ¶Õ£Õ·Õ¡Õ¢Õ©Õ«_Õ¸Ö‚Ö€Õ¢Õ¡Õ©_Õ·Õ¡Õ¢Õ¡Õ©'.split('_'); + + return weekdays[m.day()]; + } + + return moment.defineLocale('hy-am', { + months : monthsCaseReplace, + monthsShort : monthsShortCaseReplace, + weekdays : weekdaysCaseReplace, + weekdaysShort : 'Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©'.split('_'), + weekdaysMin : 'Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY Õ©.', + LLL : 'D MMMM YYYY Õ©., LT', + LLLL : 'dddd, D MMMM YYYY Õ©., LT' + }, + calendar : { + sameDay: '[Õ¡ÕµÕ½Ö…Ö€] LT', + nextDay: '[Õ¾Õ¡Õ²Õ¨] LT', + lastDay: '[Õ¥Ö€Õ¥Õ¯] LT', + nextWeek: function () { + return 'dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT'; + }, + lastWeek: function () { + return '[Õ¡Õ¶ÖÕ¡Õ®] dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT'; + }, + sameElse: 'L' + }, + relativeTime : { + future : '%s Õ°Õ¥Õ¿Õ¸', + past : '%s Õ¡Õ¼Õ¡Õ»', + s : 'Õ´Õ« Ö„Õ¡Õ¶Õ« Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶', + m : 'Ö€Õ¸ÕºÕ¥', + mm : '%d Ö€Õ¸ÕºÕ¥', + h : 'ÕªÕ¡Õ´', + hh : '%d ÕªÕ¡Õ´', + d : 'Ö…Ö€', + dd : '%d Ö…Ö€', + M : 'Õ¡Õ´Õ«Õ½', + MM : '%d Õ¡Õ´Õ«Õ½', + y : 'Õ¿Õ¡Ö€Õ«', + yy : '%d Õ¿Õ¡Ö€Õ«' + }, + + meridiemParse: /Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡|Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡|ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶/, + isPM: function (input) { + return /^(ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶)$/.test(input); + }, + meridiem : function (hour) { + if (hour < 4) { + return 'Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡'; + } else if (hour < 12) { + return 'Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡'; + } else if (hour < 17) { + return 'ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡'; + } else { + return 'Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶'; + } + }, + + ordinalParse: /\d{1,2}|\d{1,2}-(Õ«Õ¶|Ö€Õ¤)/, + ordinal: function (number, period) { + switch (period) { + case 'DDD': + case 'w': + case 'W': + case 'DDDo': + if (number === 1) { + return number + '-Õ«Õ¶'; + } + return number + '-Ö€Õ¤'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Bahasa Indonesia (id) +// author : Mohammad Satrio Utomo : https://github.com/tyok +// reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('id', { + months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'), + weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'), + weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'LT.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] LT', + LLLL : 'dddd, D MMMM YYYY [pukul] LT' + }, + meridiemParse: /pagi|siang|sore|malam/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'siang') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'sore' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'siang'; + } else if (hours < 19) { + return 'sore'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Besok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kemarin pukul] LT', + lastWeek : 'dddd [lalu pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lalu', + s : 'beberapa detik', + m : 'semenit', + mm : '%d menit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : icelandic (is) +// author : Hinrik Örn Sigurðsson : https://github.com/hinrik + +(function (factory) { + factory(moment); +}(function (moment) { + function plural(n) { + if (n % 100 === 11) { + return true; + } else if (n % 10 === 1) { + return false; + } + return true; + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': + return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum'; + case 'm': + return withoutSuffix ? 'mínúta' : 'mínútu'; + case 'mm': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum'); + } else if (withoutSuffix) { + return result + 'mínúta'; + } + return result + 'mínútu'; + case 'hh': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum'); + } + return result + 'klukkustund'; + case 'd': + if (withoutSuffix) { + return 'dagur'; + } + return isFuture ? 'dag' : 'degi'; + case 'dd': + if (plural(number)) { + if (withoutSuffix) { + return result + 'dagar'; + } + return result + (isFuture ? 'daga' : 'dögum'); + } else if (withoutSuffix) { + return result + 'dagur'; + } + return result + (isFuture ? 'dag' : 'degi'); + case 'M': + if (withoutSuffix) { + return 'mánuður'; + } + return isFuture ? 'mánuð' : 'mánuði'; + case 'MM': + if (plural(number)) { + if (withoutSuffix) { + return result + 'mánuðir'; + } + return result + (isFuture ? 'mánuði' : 'mánuðum'); + } else if (withoutSuffix) { + return result + 'mánuður'; + } + return result + (isFuture ? 'mánuð' : 'mánuði'); + case 'y': + return withoutSuffix || isFuture ? 'ár' : 'ári'; + case 'yy': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'ár' : 'árum'); + } + return result + (withoutSuffix || isFuture ? 'ár' : 'ári'); + } + } + + return moment.defineLocale('is', { + months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'), + weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'), + weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'), + weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] LT', + LLLL : 'dddd, D. MMMM YYYY [kl.] LT' + }, + calendar : { + sameDay : '[í dag kl.] LT', + nextDay : '[á morgun kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[í gær kl.] LT', + lastWeek : '[síðasta] dddd [kl.] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'eftir %s', + past : 'fyrir %s síðan', + s : translate, + m : translate, + mm : translate, + h : 'klukkustund', + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : italian (it) +// author : Lorenzo : https://github.com/aliem +// author: Mattia Larentis: https://github.com/nostalgiaz + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('it', { + months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'), + monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'), + weekdays : 'Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato'.split('_'), + weekdaysShort : 'Dom_Lun_Mar_Mer_Gio_Ven_Sab'.split('_'), + weekdaysMin : 'D_L_Ma_Me_G_V_S'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Oggi alle] LT', + nextDay: '[Domani alle] LT', + nextWeek: 'dddd [alle] LT', + lastDay: '[Ieri alle] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[la scorsa] dddd [alle] LT'; + default: + return '[lo scorso] dddd [alle] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : function (s) { + return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s; + }, + past : '%s fa', + s : 'alcuni secondi', + m : 'un minuto', + mm : '%d minuti', + h : 'un\'ora', + hh : '%d ore', + d : 'un giorno', + dd : '%d giorni', + M : 'un mese', + MM : '%d mesi', + y : 'un anno', + yy : '%d anni' + }, + ordinalParse : /\d{1,2}º/, + ordinal: '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : japanese (ja) +// author : LI Long : https://github.com/baryon + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('ja', { + months : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '日曜日_月曜日_ç«æ›œæ—¥_水曜日_木曜日_金曜日_土曜日'.split('_'), + weekdaysShort : 'æ—¥_月_ç«_æ°´_木_金_土'.split('_'), + weekdaysMin : 'æ—¥_月_ç«_æ°´_木_金_土'.split('_'), + longDateFormat : { + LT : 'Ah時m分', + LTS : 'LTs秒', + L : 'YYYY/MM/DD', + LL : 'YYYYå¹´M月Dæ—¥', + LLL : 'YYYYå¹´M月Dæ—¥LT', + LLLL : 'YYYYå¹´M月Dæ—¥LT dddd' + }, + meridiemParse: /åˆå‰|åˆå¾Œ/i, + isPM : function (input) { + return input === 'åˆå¾Œ'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'åˆå‰'; + } else { + return 'åˆå¾Œ'; + } + }, + calendar : { + sameDay : '[今日] LT', + nextDay : '[明日] LT', + nextWeek : '[æ¥é€±]dddd LT', + lastDay : '[昨日] LT', + lastWeek : '[å‰é€±]dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s後', + past : '%så‰', + s : '数秒', + m : '1分', + mm : '%d分', + h : '1時間', + hh : '%d時間', + d : '1æ—¥', + dd : '%dæ—¥', + M : '1ヶ月', + MM : '%dヶ月', + y : '1å¹´', + yy : '%då¹´' + } + }); +})); +// moment.js locale configuration +// locale : Georgian (ka) +// author : Irakli Janiashvili : https://github.com/irakli-janiashvili + +(function (factory) { + factory(moment); +}(function (moment) { + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'იáƒáƒœáƒ•áƒáƒ áƒ˜_თებერვáƒáƒšáƒ˜_მáƒáƒ áƒ¢áƒ˜_áƒáƒžáƒ áƒ˜áƒšáƒ˜_მáƒáƒ˜áƒ¡áƒ˜_ივნისი_ივლისი_áƒáƒ’ვისტáƒ_სექტემბერი_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი_ნáƒáƒ”მბერი_დეკემბერი'.split('_'), + 'accusative': 'იáƒáƒœáƒ•áƒáƒ áƒ¡_თებერვáƒáƒšáƒ¡_მáƒáƒ áƒ¢áƒ¡_áƒáƒžáƒ áƒ˜áƒšáƒ˜áƒ¡_მáƒáƒ˜áƒ¡áƒ¡_ივნისს_ივლისს_áƒáƒ’ვისტს_სექტემბერს_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერს_ნáƒáƒ”მბერს_დეკემბერს'.split('_') + }, + + nounCase = (/D[oD] *MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'კვირáƒ_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ი_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი_ხუთშáƒáƒ‘áƒáƒ—ი_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი_შáƒáƒ‘áƒáƒ—ი'.split('_'), + 'accusative': 'კვირáƒáƒ¡_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ს_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ს_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ს_ხუთშáƒáƒ‘áƒáƒ—ს_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვს_შáƒáƒ‘áƒáƒ—ს'.split('_') + }, + + nounCase = (/(წინáƒ|შემდეგ)/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.defineLocale('ka', { + months : monthsCaseReplace, + monthsShort : 'იáƒáƒœ_თებ_მáƒáƒ _áƒáƒžáƒ _მáƒáƒ˜_ივნ_ივლ_áƒáƒ’ვ_სექ_áƒáƒ¥áƒ¢_ნáƒáƒ”_დეკ'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'კვი_áƒáƒ áƒ¨_სáƒáƒ›_áƒáƒ—ხ_ხუთ_პáƒáƒ _შáƒáƒ‘'.split('_'), + weekdaysMin : 'კვ_áƒáƒ _სáƒ_áƒáƒ—_ხუ_პáƒ_შáƒ'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[დღეს] LT[-ზე]', + nextDay : '[ხვáƒáƒš] LT[-ზე]', + lastDay : '[გუშინ] LT[-ზე]', + nextWeek : '[შემდეგ] dddd LT[-ზე]', + lastWeek : '[წინáƒ] dddd LT-ზე', + sameElse : 'L' + }, + relativeTime : { + future : function (s) { + return (/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|წელი)/).test(s) ? + s.replace(/ი$/, 'ში') : + s + 'ში'; + }, + past : function (s) { + if ((/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|დღე|თვე)/).test(s)) { + return s.replace(/(ი|ე)$/, 'ის წინ'); + } + if ((/წელი/).test(s)) { + return s.replace(/წელი$/, 'წლის წინ'); + } + }, + s : 'რáƒáƒ›áƒ“ენიმე წáƒáƒ›áƒ˜', + m : 'წუთი', + mm : '%d წუთი', + h : 'სáƒáƒáƒ—ი', + hh : '%d სáƒáƒáƒ—ი', + d : 'დღე', + dd : '%d დღე', + M : 'თვე', + MM : '%d თვე', + y : 'წელი', + yy : '%d წელი' + }, + ordinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/, + ordinal : function (number) { + if (number === 0) { + return number; + } + + if (number === 1) { + return number + '-ლი'; + } + + if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) { + return 'მე-' + number; + } + + return number + '-ე'; + }, + week : { + dow : 1, + doy : 7 + } + }); +})); +// moment.js locale configuration +// locale : khmer (km) +// author : Kruy Vanna : https://github.com/kruyvanna + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('km', { + months: 'មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ'.split('_'), + monthsShort: 'មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ'.split('_'), + weekdays: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), + weekdaysShort: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), + weekdaysMin: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS : 'LT:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd, D MMMM YYYY LT' + }, + calendar: { + sameDay: '[ážáŸ’ងៃនៈ ម៉ោង] LT', + nextDay: '[ស្អែក ម៉ោង] LT', + nextWeek: 'dddd [ម៉ោង] LT', + lastDay: '[ម្សិលមិញ ម៉ោង] LT', + lastWeek: 'dddd [សប្ážáž¶áž áŸáž˜áž»áž“] [ម៉ោង] LT', + sameElse: 'L' + }, + relativeTime: { + future: '%sទៀáž', + past: '%sមុន', + s: 'ប៉ុន្មានវិនាទី', + m: 'មួយនាទី', + mm: '%d នាទី', + h: 'មួយម៉ោង', + hh: '%d ម៉ោង', + d: 'មួយážáŸ’ងៃ', + dd: '%d ážáŸ’ងៃ', + M: 'មួយážáŸ‚', + MM: '%d ážáŸ‚', + y: 'មួយឆ្នាំ', + yy: '%d ឆ្នាំ' + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : korean (ko) +// +// authors +// +// - Kyungwook, Park : https://github.com/kyungw00k +// - Jeeeyul Lee +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('ko', { + months : '1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”'.split('_'), + monthsShort : '1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”'.split('_'), + weekdays : 'ì¼ìš”ì¼_월요ì¼_화요ì¼_수요ì¼_목요ì¼_금요ì¼_토요ì¼'.split('_'), + weekdaysShort : 'ì¼_ì›”_í™”_수_목_금_토'.split('_'), + weekdaysMin : 'ì¼_ì›”_í™”_수_목_금_토'.split('_'), + longDateFormat : { + LT : 'A hì‹œ m분', + LTS : 'A hì‹œ m분 sì´ˆ', + L : 'YYYY.MM.DD', + LL : 'YYYYë…„ MMMM Dì¼', + LLL : 'YYYYë…„ MMMM Dì¼ LT', + LLLL : 'YYYYë…„ MMMM Dì¼ dddd LT' + }, + calendar : { + sameDay : '오늘 LT', + nextDay : 'ë‚´ì¼ LT', + nextWeek : 'dddd LT', + lastDay : 'ì–´ì œ LT', + lastWeek : '지난주 dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s 후', + past : '%s ì „', + s : '몇초', + ss : '%dì´ˆ', + m : 'ì¼ë¶„', + mm : '%d분', + h : '한시간', + hh : '%d시간', + d : '하루', + dd : '%dì¼', + M : '한달', + MM : '%d달', + y : 'ì¼ë…„', + yy : '%dë…„' + }, + ordinalParse : /\d{1,2}ì¼/, + ordinal : '%dì¼', + meridiemParse : /오전|오후/, + isPM : function (token) { + return token === '오후'; + }, + meridiem : function (hour, minute, isUpper) { + return hour < 12 ? '오전' : '오후'; + } + }); +})); +// moment.js locale configuration +// locale : Luxembourgish (lb) +// author : mweimerskirch : https://github.com/mweimerskirch, David Raison : https://github.com/kwisatz + +// Note: Luxembourgish has a very particular phonological rule ('Eifeler Regel') that causes the +// deletion of the final 'n' in certain contexts. That's what the 'eifelerRegelAppliesToWeekday' +// and 'eifelerRegelAppliesToNumber' methods are meant for + +(function (factory) { + factory(moment); +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eng Minutt', 'enger Minutt'], + 'h': ['eng Stonn', 'enger Stonn'], + 'd': ['een Dag', 'engem Dag'], + 'M': ['ee Mount', 'engem Mount'], + 'y': ['ee Joer', 'engem Joer'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + function processFutureTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'a ' + string; + } + return 'an ' + string; + } + + function processPastTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'viru ' + string; + } + return 'virun ' + string; + } + + /** + * Returns true if the word before the given number loses the '-n' ending. + * e.g. 'an 10 Deeg' but 'a 5 Deeg' + * + * @param number {integer} + * @returns {boolean} + */ + function eifelerRegelAppliesToNumber(number) { + number = parseInt(number, 10); + if (isNaN(number)) { + return false; + } + if (number < 0) { + // Negative Number --> always true + return true; + } else if (number < 10) { + // Only 1 digit + if (4 <= number && number <= 7) { + return true; + } + return false; + } else if (number < 100) { + // 2 digits + var lastDigit = number % 10, firstDigit = number / 10; + if (lastDigit === 0) { + return eifelerRegelAppliesToNumber(firstDigit); + } + return eifelerRegelAppliesToNumber(lastDigit); + } else if (number < 10000) { + // 3 or 4 digits --> recursively check first digit + while (number >= 10) { + number = number / 10; + } + return eifelerRegelAppliesToNumber(number); + } else { + // Anything larger than 4 digits: recursively check first n-3 digits + number = number / 1000; + return eifelerRegelAppliesToNumber(number); + } + } + + return moment.defineLocale('lb', { + months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'), + weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'), + weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'), + longDateFormat: { + LT: 'H:mm [Auer]', + LTS: 'H:mm:ss [Auer]', + L: 'DD.MM.YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY LT', + LLLL: 'dddd, D. MMMM YYYY LT' + }, + calendar: { + sameDay: '[Haut um] LT', + sameElse: 'L', + nextDay: '[Muer um] LT', + nextWeek: 'dddd [um] LT', + lastDay: '[Gëschter um] LT', + lastWeek: function () { + // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule + switch (this.day()) { + case 2: + case 4: + return '[Leschten] dddd [um] LT'; + default: + return '[Leschte] dddd [um] LT'; + } + } + }, + relativeTime : { + future : processFutureTime, + past : processPastTime, + s : 'e puer Sekonnen', + m : processRelativeTime, + mm : '%d Minutten', + h : processRelativeTime, + hh : '%d Stonnen', + d : processRelativeTime, + dd : '%d Deeg', + M : processRelativeTime, + MM : '%d Méint', + y : processRelativeTime, + yy : '%d Joer' + }, + ordinalParse: /\d{1,2}\./, + ordinal: '%d.', + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Lithuanian (lt) +// author : Mindaugas MozÅ«ras : https://github.com/mmozuras + +(function (factory) { + factory(moment); +}(function (moment) { + var units = { + 'm' : 'minutÄ—_minutÄ—s_minutÄ™', + 'mm': 'minutÄ—s_minuÄių_minutes', + 'h' : 'valanda_valandos_valandÄ…', + 'hh': 'valandos_valandų_valandas', + 'd' : 'diena_dienos_dienÄ…', + 'dd': 'dienos_dienų_dienas', + 'M' : 'mÄ—nuo_mÄ—nesio_mÄ—nesį', + 'MM': 'mÄ—nesiai_mÄ—nesių_mÄ—nesius', + 'y' : 'metai_metų_metus', + 'yy': 'metai_metų_metus' + }, + weekDays = 'sekmadienis_pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis'.split('_'); + + function translateSeconds(number, withoutSuffix, key, isFuture) { + if (withoutSuffix) { + return 'kelios sekundÄ—s'; + } else { + return isFuture ? 'kelių sekundžių' : 'kelias sekundes'; + } + } + + function translateSingular(number, withoutSuffix, key, isFuture) { + return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]); + } + + function special(number) { + return number % 10 === 0 || (number > 10 && number < 20); + } + + function forms(key) { + return units[key].split('_'); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + if (number === 1) { + return result + translateSingular(number, withoutSuffix, key[0], isFuture); + } else if (withoutSuffix) { + return result + (special(number) ? forms(key)[1] : forms(key)[0]); + } else { + if (isFuture) { + return result + forms(key)[1]; + } else { + return result + (special(number) ? forms(key)[1] : forms(key)[2]); + } + } + } + + function relativeWeekDay(moment, format) { + var nominative = format.indexOf('dddd HH:mm') === -1, + weekDay = weekDays[moment.day()]; + + return nominative ? weekDay : weekDay.substring(0, weekDay.length - 2) + 'į'; + } + + return moment.defineLocale('lt', { + months : 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio'.split('_'), + monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'), + weekdays : relativeWeekDay, + weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Å eÅ¡'.split('_'), + weekdaysMin : 'S_P_A_T_K_Pn_Å '.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY [m.] MMMM D [d.]', + LLL : 'YYYY [m.] MMMM D [d.], LT [val.]', + LLLL : 'YYYY [m.] MMMM D [d.], dddd, LT [val.]', + l : 'YYYY-MM-DD', + ll : 'YYYY [m.] MMMM D [d.]', + lll : 'YYYY [m.] MMMM D [d.], LT [val.]', + llll : 'YYYY [m.] MMMM D [d.], ddd, LT [val.]' + }, + calendar : { + sameDay : '[Å iandien] LT', + nextDay : '[Rytoj] LT', + nextWeek : 'dddd LT', + lastDay : '[Vakar] LT', + lastWeek : '[PraÄ—jusį] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : 'po %s', + past : 'prieÅ¡ %s', + s : translateSeconds, + m : translateSingular, + mm : translate, + h : translateSingular, + hh : translate, + d : translateSingular, + dd : translate, + M : translateSingular, + MM : translate, + y : translateSingular, + yy : translate + }, + ordinalParse: /\d{1,2}-oji/, + ordinal : function (number) { + return number + '-oji'; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : latvian (lv) +// author : Kristaps Karlsons : https://github.com/skakri + +(function (factory) { + factory(moment); +}(function (moment) { + var units = { + 'mm': 'minÅ«ti_minÅ«tes_minÅ«te_minÅ«tes', + 'hh': 'stundu_stundas_stunda_stundas', + 'dd': 'dienu_dienas_diena_dienas', + 'MM': 'mÄ“nesi_mÄ“neÅ¡us_mÄ“nesis_mÄ“neÅ¡i', + 'yy': 'gadu_gadus_gads_gadi' + }; + + function format(word, number, withoutSuffix) { + var forms = word.split('_'); + if (withoutSuffix) { + return number % 10 === 1 && number !== 11 ? forms[2] : forms[3]; + } else { + return number % 10 === 1 && number !== 11 ? forms[0] : forms[1]; + } + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + return number + ' ' + format(units[key], number, withoutSuffix); + } + + return moment.defineLocale('lv', { + months : 'janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jÅ«n_jÅ«l_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'svÄ“tdiena_pirmdiena_otrdiena_treÅ¡diena_ceturtdiena_piektdiena_sestdiena'.split('_'), + weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'), + weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'YYYY. [gada] D. MMMM', + LLL : 'YYYY. [gada] D. MMMM, LT', + LLLL : 'YYYY. [gada] D. MMMM, dddd, LT' + }, + calendar : { + sameDay : '[Å odien pulksten] LT', + nextDay : '[RÄ«t pulksten] LT', + nextWeek : 'dddd [pulksten] LT', + lastDay : '[Vakar pulksten] LT', + lastWeek : '[PagÄjuÅ¡Ä] dddd [pulksten] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s vÄ“lÄk', + past : '%s agrÄk', + s : 'dažas sekundes', + m : 'minÅ«ti', + mm : relativeTimeWithPlural, + h : 'stundu', + hh : relativeTimeWithPlural, + d : 'dienu', + dd : relativeTimeWithPlural, + M : 'mÄ“nesi', + MM : relativeTimeWithPlural, + y : 'gadu', + yy : relativeTimeWithPlural + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : macedonian (mk) +// author : Borislav Mickov : https://github.com/B0k0 + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('mk', { + months : 'јануари_февруари_март_април_мај_јуни_јули_авгуÑÑ‚_Ñептември_октомври_ноември_декември'.split('_'), + monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_Ñеп_окт_ное_дек'.split('_'), + weekdays : 'недела_понеделник_вторник_Ñреда_четврток_петок_Ñабота'.split('_'), + weekdaysShort : 'нед_пон_вто_Ñре_чет_пет_Ñаб'.split('_'), + weekdaysMin : 'нe_пo_вт_ÑÑ€_че_пе_Ña'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'D.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Ð”ÐµÐ½ÐµÑ Ð²Ð¾] LT', + nextDay : '[Утре во] LT', + nextWeek : 'dddd [во] LT', + lastDay : '[Вчера во] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[Во изминатата] dddd [во] LT'; + case 1: + case 2: + case 4: + case 5: + return '[Во изминатиот] dddd [во] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'поÑле %s', + past : 'пред %s', + s : 'неколку Ñекунди', + m : 'минута', + mm : '%d минути', + h : 'чаÑ', + hh : '%d чаÑа', + d : 'ден', + dd : '%d дена', + M : 'меÑец', + MM : '%d меÑеци', + y : 'година', + yy : '%d години' + }, + ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : malayalam (ml) +// author : Floyd Pink : https://github.com/floydpink + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('ml', { + months : 'ജനàµà´µà´°à´¿_ഫെബàµà´°àµà´µà´°à´¿_മാർചàµà´šàµ_à´à´ªàµà´°à´¿àµ½_മേയàµ_ജൂൺ_ജൂലൈ_à´“à´—à´¸àµà´±àµà´±àµ_സെപàµà´±àµà´±à´‚ബർ_à´’à´•àµà´Ÿàµ‹à´¬àµ¼_നവംബർ_ഡിസംബർ'.split('_'), + monthsShort : 'ജനàµ._ഫെബàµà´°àµ._മാർ._à´à´ªàµà´°à´¿._മേയàµ_ജൂൺ_ജൂലൈ._à´“à´—._സെപàµà´±àµà´±._à´’à´•àµà´Ÿàµ‹._നവം._ഡിസം.'.split('_'), + weekdays : 'ഞായറാഴàµà´š_തിങàµà´•à´³à´¾à´´àµà´š_ചൊവàµà´µà´¾à´´àµà´š_à´¬àµà´§à´¨à´¾à´´àµà´š_à´µàµà´¯à´¾à´´à´¾à´´àµà´š_വെളàµà´³à´¿à´¯à´¾à´´àµà´š_ശനിയാഴàµà´š'.split('_'), + weekdaysShort : 'ഞായർ_തിങàµà´•àµ¾_ചൊവàµà´µ_à´¬àµà´§àµ»_à´µàµà´¯à´¾à´´à´‚_വെളàµà´³à´¿_ശനി'.split('_'), + weekdaysMin : 'à´žà´¾_തി_ചൊ_à´¬àµ_à´µàµà´¯à´¾_വെ_à´¶'.split('_'), + longDateFormat : { + LT : 'A h:mm -à´¨àµ', + LTS : 'A h:mm:ss -à´¨àµ', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[ഇനàµà´¨àµ] LT', + nextDay : '[നാളെ] LT', + nextWeek : 'dddd, LT', + lastDay : '[ഇനàµà´¨à´²àµ†] LT', + lastWeek : '[à´•à´´à´¿à´žàµà´ž] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s à´•à´´à´¿à´žàµà´žàµ', + past : '%s à´®àµàµ»à´ªàµ', + s : 'അൽപ നിമിഷങàµà´™àµ¾', + m : 'ഒരൠമിനിറàµà´±àµ', + mm : '%d മിനിറàµà´±àµ', + h : 'ഒരൠമണികàµà´•àµ‚ർ', + hh : '%d മണികàµà´•àµ‚ർ', + d : 'ഒരൠദിവസം', + dd : '%d ദിവസം', + M : 'ഒരൠമാസം', + MM : '%d മാസം', + y : 'ഒരൠവർഷം', + yy : '%d വർഷം' + }, + meridiemParse: /രാതàµà´°à´¿|രാവിലെ|ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿/i, + isPM : function (input) { + return /^(ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'രാതàµà´°à´¿'; + } else if (hour < 12) { + return 'രാവിലെ'; + } else if (hour < 17) { + return 'ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ'; + } else if (hour < 20) { + return 'വൈകàµà´¨àµà´¨àµ‡à´°à´‚'; + } else { + return 'രാതàµà´°à´¿'; + } + } + }); +})); +// moment.js locale configuration +// locale : Marathi (mr) +// author : Harshad Kale : https://github.com/kalehv + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.defineLocale('mr', { + months : 'जानेवारी_फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€_मारà¥à¤š_à¤à¤ªà¥à¤°à¤¿à¤²_मे_जून_जà¥à¤²à¥ˆ_ऑगसà¥à¤Ÿ_सपà¥à¤Ÿà¥‡à¤‚बर_ऑकà¥à¤Ÿà¥‹à¤¬à¤°_नोवà¥à¤¹à¥‡à¤‚बर_डिसेंबर'.split('_'), + monthsShort: 'जाने._फेबà¥à¤°à¥._मारà¥à¤š._à¤à¤ªà¥à¤°à¤¿._मे._जून._जà¥à¤²à¥ˆ._ऑग._सपà¥à¤Ÿà¥‡à¤‚._ऑकà¥à¤Ÿà¥‹._नोवà¥à¤¹à¥‡à¤‚._डिसें.'.split('_'), + weekdays : 'रविवार_सोमवार_मंगळवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split('_'), + weekdaysShort : 'रवि_सोम_मंगळ_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split('_'), + weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split('_'), + longDateFormat : { + LT : 'A h:mm वाजता', + LTS : 'A h:mm:ss वाजता', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[उदà¥à¤¯à¤¾] LT', + nextWeek : 'dddd, LT', + lastDay : '[काल] LT', + lastWeek: '[मागील] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s नंतर', + past : '%s पूरà¥à¤µà¥€', + s : 'सेकंद', + m: 'à¤à¤• मिनिट', + mm: '%d मिनिटे', + h : 'à¤à¤• तास', + hh : '%d तास', + d : 'à¤à¤• दिवस', + dd : '%d दिवस', + M : 'à¤à¤• महिना', + MM : '%d महिने', + y : 'à¤à¤• वरà¥à¤·', + yy : '%d वरà¥à¤·à¥‡' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /रातà¥à¤°à¥€|सकाळी|दà¥à¤ªà¤¾à¤°à¥€|सायंकाळी/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'रातà¥à¤°à¥€') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'सकाळी') { + return hour; + } else if (meridiem === 'दà¥à¤ªà¤¾à¤°à¥€') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'सायंकाळी') { + return hour + 12; + } + }, + meridiem: function (hour, minute, isLower) + { + if (hour < 4) { + return 'रातà¥à¤°à¥€'; + } else if (hour < 10) { + return 'सकाळी'; + } else if (hour < 17) { + return 'दà¥à¤ªà¤¾à¤°à¥€'; + } else if (hour < 20) { + return 'सायंकाळी'; + } else { + return 'रातà¥à¤°à¥€'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Bahasa Malaysia (ms-MY) +// author : Weldan Jamili : https://github.com/weldan + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('ms-my', { + months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), + monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), + weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), + weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), + weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'LT.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] LT', + LLLL : 'dddd, D MMMM YYYY [pukul] LT' + }, + meridiemParse: /pagi|tengahari|petang|malam/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'tengahari') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'petang' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'tengahari'; + } else if (hours < 19) { + return 'petang'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Esok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kelmarin pukul] LT', + lastWeek : 'dddd [lepas pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lepas', + s : 'beberapa saat', + m : 'seminit', + mm : '%d minit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Burmese (my) +// author : Squar team, mysquar.com + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': 'á', + '2': 'á‚', + '3': 'áƒ', + '4': 'á„', + '5': 'á…', + '6': 'á†', + '7': 'á‡', + '8': 'áˆ', + '9': 'á‰', + '0': 'á€' + }, numberMap = { + 'á': '1', + 'á‚': '2', + 'áƒ': '3', + 'á„': '4', + 'á…': '5', + 'á†': '6', + 'á‡': '7', + 'áˆ': '8', + 'á‰': '9', + 'á€': '0' + }; + return moment.defineLocale('my', { + months: 'ဇန်နá€á€«á€›á€®_ဖေဖော်á€á€«á€›á€®_မá€á€º_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုá€á€º_စက်á€á€„်ဘာ_အောက်á€á€­á€¯á€˜á€¬_နိုá€á€„်ဘာ_ဒီဇင်ဘာ'.split('_'), + monthsShort: 'ဇန်_ဖေ_မá€á€º_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'), + weekdays: 'á€á€”င်္ဂနွေ_á€á€”င်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပá€á€±á€¸_သောကြာ_စနေ'.split('_'), + weekdaysShort: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), + weekdaysMin: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd D MMMM YYYY LT' + }, + calendar: { + sameDay: '[ယနေ.] LT [မှာ]', + nextDay: '[မနက်ဖြန်] LT [မှာ]', + nextWeek: 'dddd LT [မှာ]', + lastDay: '[မနေ.က] LT [မှာ]', + lastWeek: '[ပြီးá€á€²á€·á€žá€±á€¬] dddd LT [မှာ]', + sameElse: 'L' + }, + relativeTime: { + future: 'လာမည့် %s မှာ', + past: 'လွန်á€á€²á€·á€žá€±á€¬ %s က', + s: 'စက္ကန်.အနည်းငယ်', + m: 'á€á€…်မိနစ်', + mm: '%d မိနစ်', + h: 'á€á€…်နာရီ', + hh: '%d နာရီ', + d: 'á€á€…်ရက်', + dd: '%d ရက်', + M: 'á€á€…်လ', + MM: '%d လ', + y: 'á€á€…်နှစ်', + yy: '%d နှစ်' + }, + preparse: function (string) { + return string.replace(/[áá‚áƒá„á…á†á‡áˆá‰á€]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : norwegian bokmÃ¥l (nb) +// authors : Espen Hovlandsdal : https://github.com/rexxars +// Sigurd Gartmann : https://github.com/sigurdga + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('nb', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), + weekdaysShort : 'søn_man_tirs_ons_tors_fre_lør'.split('_'), + weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'H.mm', + LTS : 'LT.ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] LT', + LLLL : 'dddd D. MMMM YYYY [kl.] LT' + }, + calendar : { + sameDay: '[i dag kl.] LT', + nextDay: '[i morgen kl.] LT', + nextWeek: 'dddd [kl.] LT', + lastDay: '[i gÃ¥r kl.] LT', + lastWeek: '[forrige] dddd [kl.] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'for %s siden', + s : 'noen sekunder', + m : 'ett minutt', + mm : '%d minutter', + h : 'en time', + hh : '%d timer', + d : 'en dag', + dd : '%d dager', + M : 'en mÃ¥ned', + MM : '%d mÃ¥neder', + y : 'ett Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : nepali/nepalese +// author : suvash : https://github.com/suvash + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.defineLocale('ne', { + months : 'जनवरी_फेबà¥à¤°à¥à¤µà¤°à¥€_मारà¥à¤š_अपà¥à¤°à¤¿à¤²_मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ_अगषà¥à¤Ÿ_सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°_अकà¥à¤Ÿà¥‹à¤¬à¤°_नोभेमà¥à¤¬à¤°_डिसेमà¥à¤¬à¤°'.split('_'), + monthsShort : 'जन._फेबà¥à¤°à¥._मारà¥à¤š_अपà¥à¤°à¤¿._मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ._अग._सेपà¥à¤Ÿ._अकà¥à¤Ÿà¥‹._नोभे._डिसे.'.split('_'), + weekdays : 'आइतबार_सोमबार_मङà¥à¤—लबार_बà¥à¤§à¤¬à¤¾à¤°_बिहिबार_शà¥à¤•à¥à¤°à¤¬à¤¾à¤°_शनिबार'.split('_'), + weekdaysShort : 'आइत._सोम._मङà¥à¤—ल._बà¥à¤§._बिहि._शà¥à¤•à¥à¤°._शनि.'.split('_'), + weekdaysMin : 'आइ._सो._मङà¥_बà¥._बि._शà¥._श.'.split('_'), + longDateFormat : { + LT : 'Aको h:mm बजे', + LTS : 'Aको h:mm:ss बजे', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /राती|बिहान|दिउà¤à¤¸à¥‹|बेलà¥à¤•à¤¾|साà¤à¤|राती/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'राती') { + return hour < 3 ? hour : hour + 12; + } else if (meridiem === 'बिहान') { + return hour; + } else if (meridiem === 'दिउà¤à¤¸à¥‹') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'बेलà¥à¤•à¤¾' || meridiem === 'साà¤à¤') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 3) { + return 'राती'; + } else if (hour < 10) { + return 'बिहान'; + } else if (hour < 15) { + return 'दिउà¤à¤¸à¥‹'; + } else if (hour < 18) { + return 'बेलà¥à¤•à¤¾'; + } else if (hour < 20) { + return 'साà¤à¤'; + } else { + return 'राती'; + } + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[भोली] LT', + nextWeek : '[आउà¤à¤¦à¥‹] dddd[,] LT', + lastDay : '[हिजो] LT', + lastWeek : '[गà¤à¤•à¥‹] dddd[,] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%sमा', + past : '%s अगाडी', + s : 'केही समय', + m : 'à¤à¤• मिनेट', + mm : '%d मिनेट', + h : 'à¤à¤• घणà¥à¤Ÿà¤¾', + hh : '%d घणà¥à¤Ÿà¤¾', + d : 'à¤à¤• दिन', + dd : '%d दिन', + M : 'à¤à¤• महिना', + MM : '%d महिना', + y : 'à¤à¤• बरà¥à¤·', + yy : '%d बरà¥à¤·' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : dutch (nl) +// author : Joris Röling : https://github.com/jjupiter + +(function (factory) { + factory(moment); +}(function (moment) { + var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); + + return moment.defineLocale('nl', { + months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), + weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), + weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[vandaag om] LT', + nextDay: '[morgen om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[gisteren om] LT', + lastWeek: '[afgelopen] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'over %s', + past : '%s geleden', + s : 'een paar seconden', + m : 'één minuut', + mm : '%d minuten', + h : 'één uur', + hh : '%d uur', + d : 'één dag', + dd : '%d dagen', + M : 'één maand', + MM : '%d maanden', + y : 'één jaar', + yy : '%d jaar' + }, + ordinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : norwegian nynorsk (nn) +// author : https://github.com/mechuwind + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('nn', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sundag_mÃ¥ndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'), + weekdaysShort : 'sun_mÃ¥n_tys_ons_tor_fre_lau'.split('_'), + weekdaysMin : 'su_mÃ¥_ty_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[I dag klokka] LT', + nextDay: '[I morgon klokka] LT', + nextWeek: 'dddd [klokka] LT', + lastDay: '[I gÃ¥r klokka] LT', + lastWeek: '[FøregÃ¥ande] dddd [klokka] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'for %s sidan', + s : 'nokre sekund', + m : 'eit minutt', + mm : '%d minutt', + h : 'ein time', + hh : '%d timar', + d : 'ein dag', + dd : '%d dagar', + M : 'ein mÃ¥nad', + MM : '%d mÃ¥nader', + y : 'eit Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : polish (pl) +// author : Rafal Hirsz : https://github.com/evoL + +(function (factory) { + factory(moment); +}(function (moment) { + var monthsNominative = 'styczeÅ„_luty_marzec_kwiecieÅ„_maj_czerwiec_lipiec_sierpieÅ„_wrzesieÅ„_październik_listopad_grudzieÅ„'.split('_'), + monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrzeÅ›nia_października_listopada_grudnia'.split('_'); + + function plural(n) { + return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1); + } + + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'minuta' : 'minutÄ™'; + case 'mm': + return result + (plural(number) ? 'minuty' : 'minut'); + case 'h': + return withoutSuffix ? 'godzina' : 'godzinÄ™'; + case 'hh': + return result + (plural(number) ? 'godziny' : 'godzin'); + case 'MM': + return result + (plural(number) ? 'miesiÄ…ce' : 'miesiÄ™cy'); + case 'yy': + return result + (plural(number) ? 'lata' : 'lat'); + } + } + + return moment.defineLocale('pl', { + months : function (momentToFormat, format) { + if (/D MMMM/.test(format)) { + return monthsSubjective[momentToFormat.month()]; + } else { + return monthsNominative[momentToFormat.month()]; + } + }, + monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'), + weekdays : 'niedziela_poniedziaÅ‚ek_wtorek_Å›roda_czwartek_piÄ…tek_sobota'.split('_'), + weekdaysShort : 'nie_pon_wt_Å›r_czw_pt_sb'.split('_'), + weekdaysMin : 'N_Pn_Wt_Åšr_Cz_Pt_So'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay: '[DziÅ› o] LT', + nextDay: '[Jutro o] LT', + nextWeek: '[W] dddd [o] LT', + lastDay: '[Wczoraj o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[W zeszÅ‚Ä… niedzielÄ™ o] LT'; + case 3: + return '[W zeszÅ‚Ä… Å›rodÄ™ o] LT'; + case 6: + return '[W zeszÅ‚Ä… sobotÄ™ o] LT'; + default: + return '[W zeszÅ‚y] dddd [o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : '%s temu', + s : 'kilka sekund', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : '1 dzieÅ„', + dd : '%d dni', + M : 'miesiÄ…c', + MM : translate, + y : 'rok', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : brazilian portuguese (pt-br) +// author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('pt-br', { + months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), + monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), + weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'), + weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'), + weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY [às] LT', + LLLL : 'dddd, D [de] MMMM [de] YYYY [às] LT' + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : 'em %s', + past : '%s atrás', + s : 'segundos', + m : 'um minuto', + mm : '%d minutos', + h : 'uma hora', + hh : '%d horas', + d : 'um dia', + dd : '%d dias', + M : 'um mês', + MM : '%d meses', + y : 'um ano', + yy : '%d anos' + }, + ordinalParse: /\d{1,2}º/, + ordinal : '%dº' + }); +})); +// moment.js locale configuration +// locale : portuguese (pt) +// author : Jefferson : https://github.com/jalex79 + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('pt', { + months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), + monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), + weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'), + weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'), + weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY LT', + LLLL : 'dddd, D [de] MMMM [de] YYYY LT' + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : 'em %s', + past : 'há %s', + s : 'segundos', + m : 'um minuto', + mm : '%d minutos', + h : 'uma hora', + hh : '%d horas', + d : 'um dia', + dd : '%d dias', + M : 'um mês', + MM : '%d meses', + y : 'um ano', + yy : '%d anos' + }, + ordinalParse: /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : romanian (ro) +// author : Vlad Gurdiga : https://github.com/gurdiga +// author : Valentin Agachi : https://github.com/avaly + +(function (factory) { + factory(moment); +}(function (moment) { + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': 'minute', + 'hh': 'ore', + 'dd': 'zile', + 'MM': 'luni', + 'yy': 'ani' + }, + separator = ' '; + if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) { + separator = ' de '; + } + + return number + separator + format[key]; + } + + return moment.defineLocale('ro', { + months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'), + monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'), + weekdays : 'duminică_luni_marÈ›i_miercuri_joi_vineri_sâmbătă'.split('_'), + weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'), + weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY H:mm', + LLLL : 'dddd, D MMMM YYYY H:mm' + }, + calendar : { + sameDay: '[azi la] LT', + nextDay: '[mâine la] LT', + nextWeek: 'dddd [la] LT', + lastDay: '[ieri la] LT', + lastWeek: '[fosta] dddd [la] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'peste %s', + past : '%s în urmă', + s : 'câteva secunde', + m : 'un minut', + mm : relativeTimeWithPlural, + h : 'o oră', + hh : relativeTimeWithPlural, + d : 'o zi', + dd : relativeTimeWithPlural, + M : 'o lună', + MM : relativeTimeWithPlural, + y : 'un an', + yy : relativeTimeWithPlural + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : russian (ru) +// author : Viktorminator : https://github.com/Viktorminator +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + factory(moment); +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут', + 'hh': 'чаÑ_чаÑа_чаÑов', + 'dd': 'день_днÑ_дней', + 'MM': 'меÑÑц_меÑÑца_меÑÑцев', + 'yy': 'год_года_лет' + }; + if (key === 'm') { + return withoutSuffix ? 'минута' : 'минуту'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь'.split('_'), + 'accusative': 'ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function monthsShortCaseReplace(m, format) { + var monthsShort = { + 'nominative': 'Ñнв_фев_март_апр_май_июнь_июль_авг_Ñен_окт_ноÑ_дек'.split('_'), + 'accusative': 'Ñнв_фев_мар_апр_маÑ_июнÑ_июлÑ_авг_Ñен_окт_ноÑ_дек'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return monthsShort[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота'.split('_'), + 'accusative': 'воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу'.split('_') + }, + + nounCase = (/\[ ?[Вв] ?(?:прошлую|Ñледующую|Ñту)? ?\] ?dddd/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.defineLocale('ru', { + months : monthsCaseReplace, + monthsShort : monthsShortCaseReplace, + weekdays : weekdaysCaseReplace, + weekdaysShort : 'вÑ_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + weekdaysMin : 'вÑ_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + monthsParse : [/^Ñнв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[й|Ñ]/i, /^июн/i, /^июл/i, /^авг/i, /^Ñен/i, /^окт/i, /^ноÑ/i, /^дек/i], + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY г.', + LLL : 'D MMMM YYYY г., LT', + LLLL : 'dddd, D MMMM YYYY г., LT' + }, + calendar : { + sameDay: '[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT', + nextDay: '[Завтра в] LT', + lastDay: '[Вчера в] LT', + nextWeek: function () { + return this.day() === 2 ? '[Во] dddd [в] LT' : '[Ð’] dddd [в] LT'; + }, + lastWeek: function (now) { + if (now.week() !== this.week()) { + switch (this.day()) { + case 0: + return '[Ð’ прошлое] dddd [в] LT'; + case 1: + case 2: + case 4: + return '[Ð’ прошлый] dddd [в] LT'; + case 3: + case 5: + case 6: + return '[Ð’ прошлую] dddd [в] LT'; + } + } else { + if (this.day() === 2) { + return '[Во] dddd [в] LT'; + } else { + return '[Ð’] dddd [в] LT'; + } + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'через %s', + past : '%s назад', + s : 'неÑколько Ñекунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : 'чаÑ', + hh : relativeTimeWithPlural, + d : 'день', + dd : relativeTimeWithPlural, + M : 'меÑÑц', + MM : relativeTimeWithPlural, + y : 'год', + yy : relativeTimeWithPlural + }, + + meridiemParse: /ночи|утра|днÑ|вечера/i, + isPM : function (input) { + return /^(днÑ|вечера)$/.test(input); + }, + + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночи'; + } else if (hour < 12) { + return 'утра'; + } else if (hour < 17) { + return 'днÑ'; + } else { + return 'вечера'; + } + }, + + ordinalParse: /\d{1,2}-(й|го|Ñ)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + return number + '-й'; + case 'D': + return number + '-го'; + case 'w': + case 'W': + return number + '-Ñ'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : slovak (sk) +// author : Martin Minka : https://github.com/k2s +// based on work of petrbela : https://github.com/petrbela + +(function (factory) { + factory(moment); +}(function (moment) { + var months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'), + monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_'); + + function plural(n) { + return (n > 1) && (n < 5); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami'; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minúty' : 'minút'); + } else { + return result + 'minútami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodín'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'deň' : 'dňom'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dni' : 'dní'); + } else { + return result + 'dňami'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'mesiace' : 'mesiacov'); + } else { + return result + 'mesiacmi'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokom'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'rokov'); + } else { + return result + 'rokmi'; + } + break; + } + } + + return moment.defineLocale('sk', { + months : months, + monthsShort : monthsShort, + monthsParse : (function (months, monthsShort) { + var i, _monthsParse = []; + for (i = 0; i < 12; i++) { + // use custom parser to solve problem with July (Äervenec) + _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); + } + return _monthsParse; + }(months, monthsShort)), + weekdays : 'nedeľa_pondelok_utorok_streda_Å¡tvrtok_piatok_sobota'.split('_'), + weekdaysShort : 'ne_po_ut_st_Å¡t_pi_so'.split('_'), + weekdaysMin : 'ne_po_ut_st_Å¡t_pi_so'.split('_'), + longDateFormat : { + LT: 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[dnes o] LT', + nextDay: '[zajtra o] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedeľu o] LT'; + case 1: + case 2: + return '[v] dddd [o] LT'; + case 3: + return '[v stredu o] LT'; + case 4: + return '[vo Å¡tvrtok o] LT'; + case 5: + return '[v piatok o] LT'; + case 6: + return '[v sobotu o] LT'; + } + }, + lastDay: '[vÄera o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulú nedeľu o] LT'; + case 1: + case 2: + return '[minulý] dddd [o] LT'; + case 3: + return '[minulú stredu o] LT'; + case 4: + case 5: + return '[minulý] dddd [o] LT'; + case 6: + return '[minulú sobotu o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pred %s', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : slovenian (sl) +// author : Robert SedovÅ¡ek : https://github.com/sedovsek + +(function (factory) { + factory(moment); +}(function (moment) { + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'ena minuta' : 'eno minuto'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2) { + result += 'minuti'; + } else if (number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minut'; + } + return result; + case 'h': + return withoutSuffix ? 'ena ura' : 'eno uro'; + case 'hh': + if (number === 1) { + result += 'ura'; + } else if (number === 2) { + result += 'uri'; + } else if (number === 3 || number === 4) { + result += 'ure'; + } else { + result += 'ur'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dni'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mesec'; + } else if (number === 2) { + result += 'meseca'; + } else if (number === 3 || number === 4) { + result += 'mesece'; + } else { + result += 'mesecev'; + } + return result; + case 'yy': + if (number === 1) { + result += 'leto'; + } else if (number === 2) { + result += 'leti'; + } else if (number === 3 || number === 4) { + result += 'leta'; + } else { + result += 'let'; + } + return result; + } + } + + return moment.defineLocale('sl', { + months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'), + monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'), + weekdays : 'nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota'.split('_'), + weekdaysShort : 'ned._pon._tor._sre._Äet._pet._sob.'.split('_'), + weekdaysMin : 'ne_po_to_sr_Äe_pe_so'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD. MM. YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[danes ob] LT', + nextDay : '[jutri ob] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[v] [nedeljo] [ob] LT'; + case 3: + return '[v] [sredo] [ob] LT'; + case 6: + return '[v] [soboto] [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[v] dddd [ob] LT'; + } + }, + lastDay : '[vÄeraj ob] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[prejÅ¡nja] dddd [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[prejÅ¡nji] dddd [ob] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'Äez %s', + past : '%s nazaj', + s : 'nekaj sekund', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'en dan', + dd : translate, + M : 'en mesec', + MM : translate, + y : 'eno leto', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Albanian (sq) +// author : Flakërim Ismani : https://github.com/flakerimi +// author: Menelion Elensúle: https://github.com/Oire (tests) +// author : Oerd Cukalla : https://github.com/oerd (fixes) + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('sq', { + months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'), + monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'), + weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'), + weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'), + weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'), + meridiemParse: /PD|MD/, + isPM: function (input) { + return input.charAt(0) === 'M'; + }, + meridiem : function (hours, minutes, isLower) { + return hours < 12 ? 'PD' : 'MD'; + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Sot në] LT', + nextDay : '[Nesër në] LT', + nextWeek : 'dddd [në] LT', + lastDay : '[Dje në] LT', + lastWeek : 'dddd [e kaluar në] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'në %s', + past : '%s më parë', + s : 'disa sekonda', + m : 'një minutë', + mm : '%d minuta', + h : 'një orë', + hh : '%d orë', + d : 'një ditë', + dd : '%d ditë', + M : 'një muaj', + MM : '%d muaj', + y : 'një vit', + yy : '%d vite' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Serbian-cyrillic (sr-cyrl) +// author : Milan JanaÄković : https://github.com/milan-j + +(function (factory) { + factory(moment); +}(function (moment) { + var translator = { + words: { //Different grammatical cases + m: ['један минут', 'једне минуте'], + mm: ['минут', 'минуте', 'минута'], + h: ['један Ñат', 'једног Ñата'], + hh: ['Ñат', 'Ñата', 'Ñати'], + dd: ['дан', 'дана', 'дана'], + MM: ['меÑец', 'меÑеца', 'меÑеци'], + yy: ['година', 'године', 'година'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } + }; + + return moment.defineLocale('sr-cyrl', { + months: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'авгуÑÑ‚', 'Ñептембар', 'октобар', 'новембар', 'децембар'], + monthsShort: ['јан.', 'феб.', 'мар.', 'апр.', 'мај', 'јун', 'јул', 'авг.', 'Ñеп.', 'окт.', 'нов.', 'дец.'], + weekdays: ['недеља', 'понедељак', 'уторак', 'Ñреда', 'четвртак', 'петак', 'Ñубота'], + weekdaysShort: ['нед.', 'пон.', 'уто.', 'Ñре.', 'чет.', 'пет.', 'Ñуб.'], + weekdaysMin: ['не', 'по', 'ут', 'ÑÑ€', 'че', 'пе', 'Ñу'], + longDateFormat: { + LT: 'H:mm', + LTS : 'LT:ss', + L: 'DD. MM. YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY LT', + LLLL: 'dddd, D. MMMM YYYY LT' + }, + calendar: { + sameDay: '[Ð´Ð°Ð½Ð°Ñ Ñƒ] LT', + nextDay: '[Ñутра у] LT', + + nextWeek: function () { + switch (this.day()) { + case 0: + return '[у] [недељу] [у] LT'; + case 3: + return '[у] [Ñреду] [у] LT'; + case 6: + return '[у] [Ñуботу] [у] LT'; + case 1: + case 2: + case 4: + case 5: + return '[у] dddd [у] LT'; + } + }, + lastDay : '[јуче у] LT', + lastWeek : function () { + var lastWeekDays = [ + '[прошле] [недеље] [у] LT', + '[прошлог] [понедељка] [у] LT', + '[прошлог] [уторка] [у] LT', + '[прошле] [Ñреде] [у] LT', + '[прошлог] [четвртка] [у] LT', + '[прошлог] [петка] [у] LT', + '[прошле] [Ñуботе] [у] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'за %s', + past : 'пре %s', + s : 'неколико Ñекунди', + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'дан', + dd : translator.translate, + M : 'меÑец', + MM : translator.translate, + y : 'годину', + yy : translator.translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Serbian-latin (sr) +// author : Milan JanaÄković : https://github.com/milan-j + +(function (factory) { + factory(moment); +}(function (moment) { + var translator = { + words: { //Different grammatical cases + m: ['jedan minut', 'jedne minute'], + mm: ['minut', 'minute', 'minuta'], + h: ['jedan sat', 'jednog sata'], + hh: ['sat', 'sata', 'sati'], + dd: ['dan', 'dana', 'dana'], + MM: ['mesec', 'meseca', 'meseci'], + yy: ['godina', 'godine', 'godina'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } + }; + + return moment.defineLocale('sr', { + months: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'], + monthsShort: ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun', 'jul', 'avg.', 'sep.', 'okt.', 'nov.', 'dec.'], + weekdays: ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'Äetvrtak', 'petak', 'subota'], + weekdaysShort: ['ned.', 'pon.', 'uto.', 'sre.', 'Äet.', 'pet.', 'sub.'], + weekdaysMin: ['ne', 'po', 'ut', 'sr', 'Äe', 'pe', 'su'], + longDateFormat: { + LT: 'H:mm', + LTS : 'LT:ss', + L: 'DD. MM. YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY LT', + LLLL: 'dddd, D. MMMM YYYY LT' + }, + calendar: { + sameDay: '[danas u] LT', + nextDay: '[sutra u] LT', + + nextWeek: function () { + switch (this.day()) { + case 0: + return '[u] [nedelju] [u] LT'; + case 3: + return '[u] [sredu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄe u] LT', + lastWeek : function () { + var lastWeekDays = [ + '[proÅ¡le] [nedelje] [u] LT', + '[proÅ¡log] [ponedeljka] [u] LT', + '[proÅ¡log] [utorka] [u] LT', + '[proÅ¡le] [srede] [u] LT', + '[proÅ¡log] [Äetvrtka] [u] LT', + '[proÅ¡log] [petka] [u] LT', + '[proÅ¡le] [subote] [u] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pre %s', + s : 'nekoliko sekundi', + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'dan', + dd : translator.translate, + M : 'mesec', + MM : translator.translate, + y : 'godinu', + yy : translator.translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : swedish (sv) +// author : Jens Alm : https://github.com/ulmus + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('sv', { + months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'söndag_mÃ¥ndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'), + weekdaysShort : 'sön_mÃ¥n_tis_ons_tor_fre_lör'.split('_'), + weekdaysMin : 'sö_mÃ¥_ti_on_to_fr_lö'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Idag] LT', + nextDay: '[Imorgon] LT', + lastDay: '[IgÃ¥r] LT', + nextWeek: 'dddd LT', + lastWeek: '[Förra] dddd[en] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'för %s sedan', + s : 'nÃ¥gra sekunder', + m : 'en minut', + mm : '%d minuter', + h : 'en timme', + hh : '%d timmar', + d : 'en dag', + dd : '%d dagar', + M : 'en mÃ¥nad', + MM : '%d mÃ¥nader', + y : 'ett Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}(e|a)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'e' : + (b === 1) ? 'a' : + (b === 2) ? 'a' : + (b === 3) ? 'e' : 'e'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : tamil (ta) +// author : Arjunkumar Krishnamoorthy : https://github.com/tk120404 + +(function (factory) { + factory(moment); +}(function (moment) { + /*var symbolMap = { + '1': '௧', + '2': '௨', + '3': '௩', + '4': '௪', + '5': '௫', + '6': '௬', + '7': '௭', + '8': '௮', + '9': '௯', + '0': '௦' + }, + numberMap = { + '௧': '1', + '௨': '2', + '௩': '3', + '௪': '4', + '௫': '5', + '௬': '6', + '௭': '7', + '௮': '8', + '௯': '9', + '௦': '0' + }; */ + + return moment.defineLocale('ta', { + months : 'ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯'.split('_'), + monthsShort : 'ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯'.split('_'), + weekdays : 'ஞாயிறà¯à®±à¯à®•à¯à®•à®¿à®´à®®à¯ˆ_திஙà¯à®•à®Ÿà¯à®•à®¿à®´à®®à¯ˆ_செவà¯à®µà®¾à®¯à¯à®•à®¿à®´à®®à¯ˆ_பà¯à®¤à®©à¯à®•à®¿à®´à®®à¯ˆ_வியாழகà¯à®•à®¿à®´à®®à¯ˆ_வெளà¯à®³à®¿à®•à¯à®•à®¿à®´à®®à¯ˆ_சனிகà¯à®•à®¿à®´à®®à¯ˆ'.split('_'), + weekdaysShort : 'ஞாயிறà¯_திஙà¯à®•à®³à¯_செவà¯à®µà®¾à®¯à¯_பà¯à®¤à®©à¯_வியாழனà¯_வெளà¯à®³à®¿_சனி'.split('_'), + weekdaysMin : 'ஞா_தி_செ_பà¯_வி_வெ_ச'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[இனà¯à®±à¯] LT', + nextDay : '[நாளை] LT', + nextWeek : 'dddd, LT', + lastDay : '[நேறà¯à®±à¯] LT', + lastWeek : '[கடநà¯à®¤ வாரமà¯] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s இலà¯', + past : '%s à®®à¯à®©à¯', + s : 'ஒர௠சில விநாடிகளà¯', + m : 'ஒர௠நிமிடமà¯', + mm : '%d நிமிடஙà¯à®•à®³à¯', + h : 'ஒர௠மணி நேரமà¯', + hh : '%d மணி நேரமà¯', + d : 'ஒர௠நாளà¯', + dd : '%d நாடà¯à®•à®³à¯', + M : 'ஒர௠மாதமà¯', + MM : '%d மாதஙà¯à®•à®³à¯', + y : 'ஒர௠வரà¯à®Ÿà®®à¯', + yy : '%d ஆணà¯à®Ÿà¯à®•à®³à¯' + }, +/* preparse: function (string) { + return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + },*/ + ordinalParse: /\d{1,2}வதà¯/, + ordinal : function (number) { + return number + 'வதà¯'; + }, + + + // refer http://ta.wikipedia.org/s/1er1 + meridiemParse: /யாமமà¯|வைகறை|காலை|நணà¯à®ªà®•à®²à¯|எறà¯à®ªà®¾à®Ÿà¯|மாலை/, + meridiem : function (hour, minute, isLower) { + if (hour < 2) { + return ' யாமமà¯'; + } else if (hour < 6) { + return ' வைகறை'; // வைகறை + } else if (hour < 10) { + return ' காலை'; // காலை + } else if (hour < 14) { + return ' நணà¯à®ªà®•à®²à¯'; // நணà¯à®ªà®•à®²à¯ + } else if (hour < 18) { + return ' எறà¯à®ªà®¾à®Ÿà¯'; // எறà¯à®ªà®¾à®Ÿà¯ + } else if (hour < 22) { + return ' மாலை'; // மாலை + } else { + return ' யாமமà¯'; + } + }, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'யாமமà¯') { + return hour < 2 ? hour : hour + 12; + } else if (meridiem === 'வைகறை' || meridiem === 'காலை') { + return hour; + } else if (meridiem === 'நணà¯à®ªà®•à®²à¯') { + return hour >= 10 ? hour : hour + 12; + } else { + return hour + 12; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : thai (th) +// author : Kridsada Thanabulpong : https://github.com/sirn + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('th', { + months : 'มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม'.split('_'), + monthsShort : 'มà¸à¸£à¸²_à¸à¸¸à¸¡à¸ à¸²_มีนา_เมษา_พฤษภา_มิถุนา_à¸à¸£à¸à¸Žà¸²_สิงหา_à¸à¸±à¸™à¸¢à¸²_ตุลา_พฤศจิà¸à¸²_ธันวา'.split('_'), + weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์'.split('_'), + weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์'.split('_'), // yes, three characters difference + weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'), + longDateFormat : { + LT : 'H นาฬิà¸à¸² m นาที', + LTS : 'LT s วินาที', + L : 'YYYY/MM/DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY เวลา LT', + LLLL : 'วันddddที่ D MMMM YYYY เวลา LT' + }, + meridiemParse: /à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง|หลังเที่ยง/, + isPM: function (input) { + return input === 'หลังเที่ยง'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง'; + } else { + return 'หลังเที่ยง'; + } + }, + calendar : { + sameDay : '[วันนี้ เวลา] LT', + nextDay : '[พรุ่งนี้ เวลา] LT', + nextWeek : 'dddd[หน้า เวลา] LT', + lastDay : '[เมื่อวานนี้ เวลา] LT', + lastWeek : '[วัน]dddd[ที่à¹à¸¥à¹‰à¸§ เวลา] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'อีภ%s', + past : '%sที่à¹à¸¥à¹‰à¸§', + s : 'ไม่à¸à¸µà¹ˆà¸§à¸´à¸™à¸²à¸—ี', + m : '1 นาที', + mm : '%d นาที', + h : '1 ชั่วโมง', + hh : '%d ชั่วโมง', + d : '1 วัน', + dd : '%d วัน', + M : '1 เดือน', + MM : '%d เดือน', + y : '1 ปี', + yy : '%d ปี' + } + }); +})); +// moment.js locale configuration +// locale : Tagalog/Filipino (tl-ph) +// author : Dan Hagman + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('tl-ph', { + months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'), + monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'), + weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'), + weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'), + weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'MM/D/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY LT', + LLLL : 'dddd, MMMM DD, YYYY LT' + }, + calendar : { + sameDay: '[Ngayon sa] LT', + nextDay: '[Bukas sa] LT', + nextWeek: 'dddd [sa] LT', + lastDay: '[Kahapon sa] LT', + lastWeek: 'dddd [huling linggo] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'sa loob ng %s', + past : '%s ang nakalipas', + s : 'ilang segundo', + m : 'isang minuto', + mm : '%d minuto', + h : 'isang oras', + hh : '%d oras', + d : 'isang araw', + dd : '%d araw', + M : 'isang buwan', + MM : '%d buwan', + y : 'isang taon', + yy : '%d taon' + }, + ordinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : turkish (tr) +// authors : Erhan Gundogan : https://github.com/erhangundogan, +// Burak YiÄŸit Kaya: https://github.com/BYK + +(function (factory) { + factory(moment); +}(function (moment) { + var suffixes = { + 1: '\'inci', + 5: '\'inci', + 8: '\'inci', + 70: '\'inci', + 80: '\'inci', + + 2: '\'nci', + 7: '\'nci', + 20: '\'nci', + 50: '\'nci', + + 3: '\'üncü', + 4: '\'üncü', + 100: '\'üncü', + + 6: '\'ncı', + + 9: '\'uncu', + 10: '\'uncu', + 30: '\'uncu', + + 60: '\'ıncı', + 90: '\'ıncı' + }; + + return moment.defineLocale('tr', { + months : 'Ocak_Åžubat_Mart_Nisan_Mayıs_Haziran_Temmuz_AÄŸustos_Eylül_Ekim_Kasım_Aralık'.split('_'), + monthsShort : 'Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara'.split('_'), + weekdays : 'Pazar_Pazartesi_Salı_ÇarÅŸamba_PerÅŸembe_Cuma_Cumartesi'.split('_'), + weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'), + weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[bugün saat] LT', + nextDay : '[yarın saat] LT', + nextWeek : '[haftaya] dddd [saat] LT', + lastDay : '[dün] LT', + lastWeek : '[geçen hafta] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s sonra', + past : '%s önce', + s : 'birkaç saniye', + m : 'bir dakika', + mm : '%d dakika', + h : 'bir saat', + hh : '%d saat', + d : 'bir gün', + dd : '%d gün', + M : 'bir ay', + MM : '%d ay', + y : 'bir yıl', + yy : '%d yıl' + }, + ordinalParse: /\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/, + ordinal : function (number) { + if (number === 0) { // special case for zero + return number + '\'ıncı'; + } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + + return number + (suffixes[a] || suffixes[b] || suffixes[c]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Morocco Central Atlas TamaziÉ£t in Latin (tzm-latn) +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('tzm-latn', { + months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), + weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), + weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[asdkh g] LT', + nextDay: '[aska g] LT', + nextWeek: 'dddd [g] LT', + lastDay: '[assant g] LT', + lastWeek: 'dddd [g] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dadkh s yan %s', + past : 'yan %s', + s : 'imik', + m : 'minuá¸', + mm : '%d minuá¸', + h : 'saÉ›a', + hh : '%d tassaÉ›in', + d : 'ass', + dd : '%d ossan', + M : 'ayowr', + MM : '%d iyyirn', + y : 'asgas', + yy : '%d isgasn' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Morocco Central Atlas TamaziÉ£t (tzm) +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('tzm', { + months : 'ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”'.split('_'), + monthsShort : 'ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”'.split('_'), + weekdays : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + weekdaysShort : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS: 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[ⴰⵙⴷⵅ â´´] LT', + nextDay: '[ⴰⵙⴽⴰ â´´] LT', + nextWeek: 'dddd [â´´] LT', + lastDay: '[ⴰⵚⴰâµâµœ â´´] LT', + lastWeek: 'dddd [â´´] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'â´·â´°â´·âµ… âµ™ ⵢⴰⵠ%s', + past : 'ⵢⴰⵠ%s', + s : 'ⵉⵎⵉⴽ', + m : 'ⵎⵉâµâµ“â´º', + mm : '%d ⵎⵉâµâµ“â´º', + h : 'ⵙⴰⵄⴰ', + hh : '%d ⵜⴰⵙⵙⴰⵄⵉâµ', + d : 'ⴰⵙⵙ', + dd : '%d oⵙⵙⴰâµ', + M : 'â´°âµ¢oⵓⵔ', + MM : '%d ⵉⵢⵢⵉⵔâµ', + y : 'ⴰⵙⴳⴰⵙ', + yy : '%d ⵉⵙⴳⴰⵙâµ' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : ukrainian (uk) +// author : zemlanin : https://github.com/zemlanin +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + factory(moment); +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': 'хвилина_хвилини_хвилин', + 'hh': 'година_години_годин', + 'dd': 'день_дні_днів', + 'MM': 'міÑÑць_міÑÑці_міÑÑців', + 'yy': 'рік_роки_років' + }; + if (key === 'm') { + return withoutSuffix ? 'хвилина' : 'хвилину'; + } + else if (key === 'h') { + return withoutSuffix ? 'година' : 'годину'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень'.split('_'), + 'accusative': 'ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ'.split('_') + }, + + nounCase = (/D[oD]? *MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота'.split('_'), + 'accusative': 'неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу'.split('_'), + 'genitive': 'неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи'.split('_') + }, + + nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ? + 'accusative' : + ((/\[?(?:минулої|наÑтупної)? ?\] ?dddd/).test(format) ? + 'genitive' : + 'nominative'); + + return weekdays[nounCase][m.day()]; + } + + function processHoursFunction(str) { + return function () { + return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT'; + }; + } + + return moment.defineLocale('uk', { + months : monthsCaseReplace, + monthsShort : 'Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + weekdaysMin : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY Ñ€.', + LLL : 'D MMMM YYYY Ñ€., LT', + LLLL : 'dddd, D MMMM YYYY Ñ€., LT' + }, + calendar : { + sameDay: processHoursFunction('[Сьогодні '), + nextDay: processHoursFunction('[Завтра '), + lastDay: processHoursFunction('[Вчора '), + nextWeek: processHoursFunction('[У] dddd ['), + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return processHoursFunction('[Минулої] dddd [').call(this); + case 1: + case 2: + case 4: + return processHoursFunction('[Минулого] dddd [').call(this); + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'за %s', + past : '%s тому', + s : 'декілька Ñекунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : 'годину', + hh : relativeTimeWithPlural, + d : 'день', + dd : relativeTimeWithPlural, + M : 'міÑÑць', + MM : relativeTimeWithPlural, + y : 'рік', + yy : relativeTimeWithPlural + }, + + // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason + + meridiemParse: /ночі|ранку|днÑ|вечора/, + isPM: function (input) { + return /^(днÑ|вечора)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночі'; + } else if (hour < 12) { + return 'ранку'; + } else if (hour < 17) { + return 'днÑ'; + } else { + return 'вечора'; + } + }, + + ordinalParse: /\d{1,2}-(й|го)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return number + '-й'; + case 'D': + return number + '-го'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : uzbek (uz) +// author : Sardor Muminov : https://github.com/muminoff + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('uz', { + months : 'Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь'.split('_'), + monthsShort : 'Ñнв_фев_мар_апр_май_июн_июл_авг_Ñен_окт_ноÑ_дек'.split('_'), + weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'), + weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'), + weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'D MMMM YYYY, dddd LT' + }, + calendar : { + sameDay : '[Бугун Ñоат] LT [да]', + nextDay : '[Эртага] LT [да]', + nextWeek : 'dddd [куни Ñоат] LT [да]', + lastDay : '[Кеча Ñоат] LT [да]', + lastWeek : '[Утган] dddd [куни Ñоат] LT [да]', + sameElse : 'L' + }, + relativeTime : { + future : 'Якин %s ичида', + past : 'Бир неча %s олдин', + s : 'фурÑат', + m : 'бир дакика', + mm : '%d дакика', + h : 'бир Ñоат', + hh : '%d Ñоат', + d : 'бир кун', + dd : '%d кун', + M : 'бир ой', + MM : '%d ой', + y : 'бир йил', + yy : '%d йил' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : vietnamese (vi) +// author : Bang Nguyen : https://github.com/bangnk + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('vi', { + months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'), + monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'), + weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tÆ°_thứ năm_thứ sáu_thứ bảy'.split('_'), + weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM [năm] YYYY', + LLL : 'D MMMM [năm] YYYY LT', + LLLL : 'dddd, D MMMM [năm] YYYY LT', + l : 'DD/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY LT', + llll : 'ddd, D MMM YYYY LT' + }, + calendar : { + sameDay: '[Hôm nay lúc] LT', + nextDay: '[Ngày mai lúc] LT', + nextWeek: 'dddd [tuần tá»›i lúc] LT', + lastDay: '[Hôm qua lúc] LT', + lastWeek: 'dddd [tuần rồi lúc] LT', + sameElse: 'L' + }, + relativeTime : { + future : '%s tá»›i', + past : '%s trÆ°á»›c', + s : 'vài giây', + m : 'má»™t phút', + mm : '%d phút', + h : 'má»™t giá»', + hh : '%d giá»', + d : 'má»™t ngày', + dd : '%d ngày', + M : 'má»™t tháng', + MM : '%d tháng', + y : 'má»™t năm', + yy : '%d năm' + }, + ordinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : chinese (zh-cn) +// author : suupic : https://github.com/suupic +// author : Zeno Zeng : https://github.com/zenozeng + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('zh-cn', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'), + weekdaysMin : 'æ—¥_一_二_三_å››_五_å…­'.split('_'), + longDateFormat : { + LT : 'Ah点mm', + LTS : 'Ah点m分s秒', + L : 'YYYY-MM-DD', + LL : 'YYYYå¹´MMMDæ—¥', + LLL : 'YYYYå¹´MMMDæ—¥LT', + LLLL : 'YYYYå¹´MMMDæ—¥ddddLT', + l : 'YYYY-MM-DD', + ll : 'YYYYå¹´MMMDæ—¥', + lll : 'YYYYå¹´MMMDæ—¥LT', + llll : 'YYYYå¹´MMMDæ—¥ddddLT' + }, + meridiemParse: /凌晨|早上|上åˆ|中åˆ|下åˆ|晚上/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '凌晨' || meridiem === '早上' || + meridiem === '上åˆ') { + return hour; + } else if (meridiem === '下åˆ' || meridiem === '晚上') { + return hour + 12; + } else { + // '中åˆ' + return hour >= 11 ? hour : hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return '凌晨'; + } else if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上åˆ'; + } else if (hm < 1230) { + return '中åˆ'; + } else if (hm < 1800) { + return '下åˆ'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : function () { + return this.minutes() === 0 ? '[今天]Ah[点整]' : '[今天]LT'; + }, + nextDay : function () { + return this.minutes() === 0 ? '[明天]Ah[点整]' : '[明天]LT'; + }, + lastDay : function () { + return this.minutes() === 0 ? '[昨天]Ah[点整]' : '[昨天]LT'; + }, + nextWeek : function () { + var startOfWeek, prefix; + startOfWeek = moment().startOf('week'); + prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]'; + return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; + }, + lastWeek : function () { + var startOfWeek, prefix; + startOfWeek = moment().startOf('week'); + prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]'; + return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; + }, + sameElse : 'LL' + }, + ordinalParse: /\d{1,2}(æ—¥|月|周)/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + 'æ—¥'; + case 'M': + return number + '月'; + case 'w': + case 'W': + return number + '周'; + default: + return number; + } + }, + relativeTime : { + future : '%s内', + past : '%så‰', + s : '几秒', + m : '1分钟', + mm : '%d分钟', + h : '1å°æ—¶', + hh : '%då°æ—¶', + d : '1天', + dd : '%d天', + M : '1个月', + MM : '%d个月', + y : '1å¹´', + yy : '%då¹´' + }, + week : { + // GB/T 7408-1994《数æ®å…ƒå’Œäº¤æ¢æ ¼å¼Â·ä¿¡æ¯äº¤æ¢Â·æ—¥æœŸå’Œæ—¶é—´è¡¨ç¤ºæ³•ã€‹ä¸ŽISO 8601:1988等效 + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : traditional chinese (zh-tw) +// author : Ben : https://github.com/ben-lin + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('zh-tw', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), + weekdaysMin : 'æ—¥_一_二_三_å››_五_å…­'.split('_'), + longDateFormat : { + LT : 'Ah點mm', + LTS : 'Ah點m分s秒', + L : 'YYYYå¹´MMMDæ—¥', + LL : 'YYYYå¹´MMMDæ—¥', + LLL : 'YYYYå¹´MMMDæ—¥LT', + LLLL : 'YYYYå¹´MMMDæ—¥ddddLT', + l : 'YYYYå¹´MMMDæ—¥', + ll : 'YYYYå¹´MMMDæ—¥', + lll : 'YYYYå¹´MMMDæ—¥LT', + llll : 'YYYYå¹´MMMDæ—¥ddddLT' + }, + meridiemParse: /早上|上åˆ|中åˆ|下åˆ|晚上/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '早上' || meridiem === '上åˆ') { + return hour; + } else if (meridiem === '中åˆ') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === '下åˆ' || meridiem === '晚上') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上åˆ'; + } else if (hm < 1230) { + return '中åˆ'; + } else if (hm < 1800) { + return '下åˆ'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : '[今天]LT', + nextDay : '[明天]LT', + nextWeek : '[下]ddddLT', + lastDay : '[昨天]LT', + lastWeek : '[上]ddddLT', + sameElse : 'L' + }, + ordinalParse: /\d{1,2}(æ—¥|月|週)/, + ordinal : function (number, period) { + switch (period) { + case 'd' : + case 'D' : + case 'DDD' : + return number + 'æ—¥'; + case 'M' : + return number + '月'; + case 'w' : + case 'W' : + return number + '週'; + default : + return number; + } + }, + relativeTime : { + future : '%så…§', + past : '%så‰', + s : '幾秒', + m : '一分é˜', + mm : '%d分é˜', + h : '一å°æ™‚', + hh : '%då°æ™‚', + d : '一天', + dd : '%d天', + M : '一個月', + MM : '%d個月', + y : '一年', + yy : '%då¹´' + } + }); +})); + + moment.locale('en'); + + + /************************************ + Exposing Moment + ************************************/ + + function makeGlobal(shouldDeprecate) { + /*global ender:false */ + if (typeof ender !== 'undefined') { + return; + } + oldGlobalMoment = globalScope.moment; + if (shouldDeprecate) { + globalScope.moment = deprecate( + 'Accessing Moment through the global scope is ' + + 'deprecated, and will be removed in an upcoming ' + + 'release.', + moment); + } else { + globalScope.moment = moment; + } + } + + // CommonJS module is defined + if (hasModule) { + module.exports = moment; + } else if (typeof define === 'function' && define.amd) { + define(function (require, exports, module) { + if (module.config && module.config() && module.config().noGlobal === true) { + // release the global variable + globalScope.moment = oldGlobalMoment; + } + + return moment; + }); + makeGlobal(true); + } else { + makeGlobal(); + } +}).call(this); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/min/moment-with-locales.min.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/min/moment-with-locales.min.js new file mode 100644 index 0000000..f604348 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/min/moment-with-locales.min.js @@ -0,0 +1,10 @@ +//! moment.js +//! version : 2.9.0 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com +(function(a){function b(a,b,c){switch(arguments.length){case 2:return null!=a?a:b;case 3:return null!=a?a:null!=b?b:c;default:throw new Error("Implement me")}}function c(a,b){return Bb.call(a,b)}function d(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function e(a){vb.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+a)}function f(a,b){var c=!0;return o(function(){return c&&(e(a),c=!1),b.apply(this,arguments)},b)}function g(a,b){sc[a]||(e(b),sc[a]=!0)}function h(a,b){return function(c){return r(a.call(this,c),b)}}function i(a,b){return function(c){return this.localeData().ordinal(a.call(this,c),b)}}function j(a,b){var c,d,e=12*(b.year()-a.year())+(b.month()-a.month()),f=a.clone().add(e,"months");return 0>b-f?(c=a.clone().add(e-1,"months"),d=(b-f)/(f-c)):(c=a.clone().add(e+1,"months"),d=(b-f)/(c-f)),-(e+d)}function k(a,b,c){var d;return null==c?b:null!=a.meridiemHour?a.meridiemHour(b,c):null!=a.isPM?(d=a.isPM(c),d&&12>b&&(b+=12),d||12!==b||(b=0),b):b}function l(){}function m(a,b){b!==!1&&H(a),p(this,a),this._d=new Date(+a._d),uc===!1&&(uc=!0,vb.updateOffset(this),uc=!1)}function n(a){var b=A(a),c=b.year||0,d=b.quarter||0,e=b.month||0,f=b.week||0,g=b.day||0,h=b.hour||0,i=b.minute||0,j=b.second||0,k=b.millisecond||0;this._milliseconds=+k+1e3*j+6e4*i+36e5*h,this._days=+g+7*f,this._months=+e+3*d+12*c,this._data={},this._locale=vb.localeData(),this._bubble()}function o(a,b){for(var d in b)c(b,d)&&(a[d]=b[d]);return c(b,"toString")&&(a.toString=b.toString),c(b,"valueOf")&&(a.valueOf=b.valueOf),a}function p(a,b){var c,d,e;if("undefined"!=typeof b._isAMomentObject&&(a._isAMomentObject=b._isAMomentObject),"undefined"!=typeof b._i&&(a._i=b._i),"undefined"!=typeof b._f&&(a._f=b._f),"undefined"!=typeof b._l&&(a._l=b._l),"undefined"!=typeof b._strict&&(a._strict=b._strict),"undefined"!=typeof b._tzm&&(a._tzm=b._tzm),"undefined"!=typeof b._isUTC&&(a._isUTC=b._isUTC),"undefined"!=typeof b._offset&&(a._offset=b._offset),"undefined"!=typeof b._pf&&(a._pf=b._pf),"undefined"!=typeof b._locale&&(a._locale=b._locale),Kb.length>0)for(c in Kb)d=Kb[c],e=b[d],"undefined"!=typeof e&&(a[d]=e);return a}function q(a){return 0>a?Math.ceil(a):Math.floor(a)}function r(a,b,c){for(var d=""+Math.abs(a),e=a>=0;d.lengthd;d++)(c&&a[d]!==b[d]||!c&&C(a[d])!==C(b[d]))&&g++;return g+f}function z(a){if(a){var b=a.toLowerCase().replace(/(.)s$/,"$1");a=lc[a]||mc[b]||b}return a}function A(a){var b,d,e={};for(d in a)c(a,d)&&(b=z(d),b&&(e[b]=a[d]));return e}function B(b){var c,d;if(0===b.indexOf("week"))c=7,d="day";else{if(0!==b.indexOf("month"))return;c=12,d="month"}vb[b]=function(e,f){var g,h,i=vb._locale[b],j=[];if("number"==typeof e&&(f=e,e=a),h=function(a){var b=vb().utc().set(d,a);return i.call(vb._locale,b,e||"")},null!=f)return h(f);for(g=0;c>g;g++)j.push(h(g));return j}}function C(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=b>=0?Math.floor(b):Math.ceil(b)),c}function D(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function E(a,b,c){return jb(vb([a,11,31+b-c]),b,c).week}function F(a){return G(a)?366:365}function G(a){return a%4===0&&a%100!==0||a%400===0}function H(a){var b;a._a&&-2===a._pf.overflow&&(b=a._a[Db]<0||a._a[Db]>11?Db:a._a[Eb]<1||a._a[Eb]>D(a._a[Cb],a._a[Db])?Eb:a._a[Fb]<0||a._a[Fb]>24||24===a._a[Fb]&&(0!==a._a[Gb]||0!==a._a[Hb]||0!==a._a[Ib])?Fb:a._a[Gb]<0||a._a[Gb]>59?Gb:a._a[Hb]<0||a._a[Hb]>59?Hb:a._a[Ib]<0||a._a[Ib]>999?Ib:-1,a._pf._overflowDayOfYear&&(Cb>b||b>Eb)&&(b=Eb),a._pf.overflow=b)}function I(b){return null==b._isValid&&(b._isValid=!isNaN(b._d.getTime())&&b._pf.overflow<0&&!b._pf.empty&&!b._pf.invalidMonth&&!b._pf.nullInput&&!b._pf.invalidFormat&&!b._pf.userInvalidated,b._strict&&(b._isValid=b._isValid&&0===b._pf.charsLeftOver&&0===b._pf.unusedTokens.length&&b._pf.bigHour===a)),b._isValid}function J(a){return a?a.toLowerCase().replace("_","-"):a}function K(a){for(var b,c,d,e,f=0;f0;){if(d=L(e.slice(0,b).join("-")))return d;if(c&&c.length>=b&&y(e,c,!0)>=b-1)break;b--}f++}return null}function L(a){var b=null;if(!Jb[a]&&Lb)try{b=vb.locale(),require("./locale/"+a),vb.locale(b)}catch(c){}return Jb[a]}function M(a,b){var c,d;return b._isUTC?(c=b.clone(),d=(vb.isMoment(a)||x(a)?+a:+vb(a))-+c,c._d.setTime(+c._d+d),vb.updateOffset(c,!1),c):vb(a).local()}function N(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function O(a){var b,c,d=a.match(Pb);for(b=0,c=d.length;c>b;b++)d[b]=rc[d[b]]?rc[d[b]]:N(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 P(a,b){return a.isValid()?(b=Q(b,a.localeData()),nc[b]||(nc[b]=O(b)),nc[b](a)):a.localeData().invalidDate()}function Q(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(Qb.lastIndex=0;d>=0&&Qb.test(a);)a=a.replace(Qb,c),Qb.lastIndex=0,d-=1;return a}function R(a,b){var c,d=b._strict;switch(a){case"Q":return _b;case"DDDD":return bc;case"YYYY":case"GGGG":case"gggg":return d?cc:Tb;case"Y":case"G":case"g":return ec;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return d?dc:Ub;case"S":if(d)return _b;case"SS":if(d)return ac;case"SSS":if(d)return bc;case"DDD":return Sb;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Wb;case"a":case"A":return b._locale._meridiemParse;case"x":return Zb;case"X":return $b;case"Z":case"ZZ":return Xb;case"T":return Yb;case"SSSS":return Vb;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return d?ac:Rb;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return Rb;case"Do":return d?b._locale._ordinalParse:b._locale._ordinalParseLenient;default:return c=new RegExp($(Z(a.replace("\\","")),"i"))}}function S(a){a=a||"";var b=a.match(Xb)||[],c=b[b.length-1]||[],d=(c+"").match(jc)||["-",0,0],e=+(60*d[1])+C(d[2]);return"+"===d[0]?e:-e}function T(a,b,c){var d,e=c._a;switch(a){case"Q":null!=b&&(e[Db]=3*(C(b)-1));break;case"M":case"MM":null!=b&&(e[Db]=C(b)-1);break;case"MMM":case"MMMM":d=c._locale.monthsParse(b,a,c._strict),null!=d?e[Db]=d:c._pf.invalidMonth=b;break;case"D":case"DD":null!=b&&(e[Eb]=C(b));break;case"Do":null!=b&&(e[Eb]=C(parseInt(b.match(/\d{1,2}/)[0],10)));break;case"DDD":case"DDDD":null!=b&&(c._dayOfYear=C(b));break;case"YY":e[Cb]=vb.parseTwoDigitYear(b);break;case"YYYY":case"YYYYY":case"YYYYYY":e[Cb]=C(b);break;case"a":case"A":c._meridiem=b;break;case"h":case"hh":c._pf.bigHour=!0;case"H":case"HH":e[Fb]=C(b);break;case"m":case"mm":e[Gb]=C(b);break;case"s":case"ss":e[Hb]=C(b);break;case"S":case"SS":case"SSS":case"SSSS":e[Ib]=C(1e3*("0."+b));break;case"x":c._d=new Date(C(b));break;case"X":c._d=new Date(1e3*parseFloat(b));break;case"Z":case"ZZ":c._useUTC=!0,c._tzm=S(b);break;case"dd":case"ddd":case"dddd":d=c._locale.weekdaysParse(b),null!=d?(c._w=c._w||{},c._w.d=d):c._pf.invalidWeekday=b;break;case"w":case"ww":case"W":case"WW":case"d":case"e":case"E":a=a.substr(0,1);case"gggg":case"GGGG":case"GGGGG":a=a.substr(0,2),b&&(c._w=c._w||{},c._w[a]=C(b));break;case"gg":case"GG":c._w=c._w||{},c._w[a]=vb.parseTwoDigitYear(b)}}function U(a){var c,d,e,f,g,h,i;c=a._w,null!=c.GG||null!=c.W||null!=c.E?(g=1,h=4,d=b(c.GG,a._a[Cb],jb(vb(),1,4).year),e=b(c.W,1),f=b(c.E,1)):(g=a._locale._week.dow,h=a._locale._week.doy,d=b(c.gg,a._a[Cb],jb(vb(),g,h).year),e=b(c.w,1),null!=c.d?(f=c.d,g>f&&++e):f=null!=c.e?c.e+g:g),i=kb(d,e,f,h,g),a._a[Cb]=i.year,a._dayOfYear=i.dayOfYear}function V(a){var c,d,e,f,g=[];if(!a._d){for(e=X(a),a._w&&null==a._a[Eb]&&null==a._a[Db]&&U(a),a._dayOfYear&&(f=b(a._a[Cb],e[Cb]),a._dayOfYear>F(f)&&(a._pf._overflowDayOfYear=!0),d=fb(f,0,a._dayOfYear),a._a[Db]=d.getUTCMonth(),a._a[Eb]=d.getUTCDate()),c=0;3>c&&null==a._a[c];++c)a._a[c]=g[c]=e[c];for(;7>c;c++)a._a[c]=g[c]=null==a._a[c]?2===c?1:0:a._a[c];24===a._a[Fb]&&0===a._a[Gb]&&0===a._a[Hb]&&0===a._a[Ib]&&(a._nextDay=!0,a._a[Fb]=0),a._d=(a._useUTC?fb:eb).apply(null,g),null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()-a._tzm),a._nextDay&&(a._a[Fb]=24)}}function W(a){var b;a._d||(b=A(a._i),a._a=[b.year,b.month,b.day||b.date,b.hour,b.minute,b.second,b.millisecond],V(a))}function X(a){var b=new Date;return a._useUTC?[b.getUTCFullYear(),b.getUTCMonth(),b.getUTCDate()]:[b.getFullYear(),b.getMonth(),b.getDate()]}function Y(b){if(b._f===vb.ISO_8601)return void ab(b);b._a=[],b._pf.empty=!0;var c,d,e,f,g,h=""+b._i,i=h.length,j=0;for(e=Q(b._f,b._locale).match(Pb)||[],c=0;c0&&b._pf.unusedInput.push(g),h=h.slice(h.indexOf(d)+d.length),j+=d.length),rc[f]?(d?b._pf.empty=!1:b._pf.unusedTokens.push(f),T(f,d,b)):b._strict&&!d&&b._pf.unusedTokens.push(f);b._pf.charsLeftOver=i-j,h.length>0&&b._pf.unusedInput.push(h),b._pf.bigHour===!0&&b._a[Fb]<=12&&(b._pf.bigHour=a),b._a[Fb]=k(b._locale,b._a[Fb],b._meridiem),V(b),H(b)}function Z(a){return a.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e})}function $(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function _(a){var b,c,e,f,g;if(0===a._f.length)return a._pf.invalidFormat=!0,void(a._d=new Date(0/0));for(f=0;fg)&&(e=g,c=b));o(a,c||b)}function ab(a){var b,c,d=a._i,e=fc.exec(d);if(e){for(a._pf.iso=!0,b=0,c=hc.length;c>b;b++)if(hc[b][1].exec(d)){a._f=hc[b][0]+(e[6]||" ");break}for(b=0,c=ic.length;c>b;b++)if(ic[b][1].exec(d)){a._f+=ic[b][0];break}d.match(Xb)&&(a._f+="Z"),Y(a)}else a._isValid=!1}function bb(a){ab(a),a._isValid===!1&&(delete a._isValid,vb.createFromInputFallback(a))}function cb(a,b){var c,d=[];for(c=0;ca&&h.setFullYear(a),h}function fb(a){var b=new Date(Date.UTC.apply(null,arguments));return 1970>a&&b.setUTCFullYear(a),b}function gb(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 hb(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function ib(a,b,c){var d=vb.duration(a).abs(),e=Ab(d.as("s")),f=Ab(d.as("m")),g=Ab(d.as("h")),h=Ab(d.as("d")),i=Ab(d.as("M")),j=Ab(d.as("y")),k=e0,k[4]=c,hb.apply({},k)}function jb(a,b,c){var d,e=c-b,f=c-a.day();return f>e&&(f-=7),e-7>f&&(f+=7),d=vb(a).add(f,"d"),{week:Math.ceil(d.dayOfYear()/7),year:d.year()}}function kb(a,b,c,d,e){var f,g,h=fb(a,0,1).getUTCDay();return h=0===h?7:h,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:F(a-1)+g}}function lb(b){var c,d=b._i,e=b._f;return b._locale=b._locale||vb.localeData(b._l),null===d||e===a&&""===d?vb.invalid({nullInput:!0}):("string"==typeof d&&(b._i=d=b._locale.preparse(d)),vb.isMoment(d)?new m(d,!0):(e?w(e)?_(b):Y(b):db(b),c=new m(b),c._nextDay&&(c.add(1,"d"),c._nextDay=a),c))}function mb(a,b){var c,d;if(1===b.length&&w(b[0])&&(b=b[0]),!b.length)return vb();for(c=b[0],d=1;d=0?"+":"-";return b+r(Math.abs(a),6)},gg:function(){return r(this.weekYear()%100,2)},gggg:function(){return r(this.weekYear(),4)},ggggg:function(){return r(this.weekYear(),5)},GG:function(){return r(this.isoWeekYear()%100,2)},GGGG:function(){return r(this.isoWeekYear(),4)},GGGGG:function(){return r(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.localeData().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.localeData().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 C(this.milliseconds()/100)},SS:function(){return r(C(this.milliseconds()/10),2)},SSS:function(){return r(this.milliseconds(),3)},SSSS:function(){return r(this.milliseconds(),3)},Z:function(){var a=this.utcOffset(),b="+";return 0>a&&(a=-a,b="-"),b+r(C(a/60),2)+":"+r(C(a)%60,2)},ZZ:function(){var a=this.utcOffset(),b="+";return 0>a&&(a=-a,b="-"),b+r(C(a/60),2)+r(C(a)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},x:function(){return this.valueOf()},X:function(){return this.unix()},Q:function(){return this.quarter()}},sc={},tc=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"],uc=!1;pc.length;)xb=pc.pop(),rc[xb+"o"]=i(rc[xb],xb);for(;qc.length;)xb=qc.pop(),rc[xb+xb]=h(rc[xb],2);rc.DDDD=h(rc.DDD,3),o(l.prototype,{set:function(a){var b,c;for(c in a)b=a[c],"function"==typeof b?this[c]=b:this["_"+c]=b;this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)},_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,b,c){var d,e,f;for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),d=0;12>d;d++){if(e=vb.utc([2e3,d]),c&&!this._longMonthsParse[d]&&(this._longMonthsParse[d]=new RegExp("^"+this.months(e,"").replace(".","")+"$","i"),this._shortMonthsParse[d]=new RegExp("^"+this.monthsShort(e,"").replace(".","")+"$","i")),c||this._monthsParse[d]||(f="^"+this.months(e,"")+"|^"+this.monthsShort(e,""),this._monthsParse[d]=new RegExp(f.replace(".",""),"i")),c&&"MMMM"===b&&this._longMonthsParse[d].test(a))return d;if(c&&"MMM"===b&&this._shortMonthsParse[d].test(a))return d;if(!c&&this._monthsParse[d].test(a))return d}},_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=vb([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:{LTS:"h:mm:ss A",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,c){var d=this._calendar[a];return"function"==typeof d?d.apply(b,[c]):d},_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",_ordinalParse:/\d{1,2}/,preparse:function(a){return a},postformat:function(a){return a},week:function(a){return jb(a,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},firstDayOfWeek:function(){return this._week.dow},firstDayOfYear:function(){return this._week.doy},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),vb=function(b,c,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._i=b,g._f=c,g._l=e,g._strict=f,g._isUTC=!1,g._pf=d(),lb(g)},vb.suppressDeprecationWarnings=!1,vb.createFromInputFallback=f("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(a){a._d=new Date(a._i+(a._useUTC?" UTC":""))}),vb.min=function(){var a=[].slice.call(arguments,0);return mb("isBefore",a)},vb.max=function(){var a=[].slice.call(arguments,0);return mb("isAfter",a)},vb.utc=function(b,c,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=b,g._f=c,g._strict=f,g._pf=d(),lb(g).utc()},vb.unix=function(a){return vb(1e3*a)},vb.duration=function(a,b){var d,e,f,g,h=a,i=null;return vb.isDuration(a)?h={ms:a._milliseconds,d:a._days,M:a._months}:"number"==typeof a?(h={},b?h[b]=a:h.milliseconds=a):(i=Nb.exec(a))?(d="-"===i[1]?-1:1,h={y:0,d:C(i[Eb])*d,h:C(i[Fb])*d,m:C(i[Gb])*d,s:C(i[Hb])*d,ms:C(i[Ib])*d}):(i=Ob.exec(a))?(d="-"===i[1]?-1:1,f=function(a){var b=a&&parseFloat(a.replace(",","."));return(isNaN(b)?0:b)*d},h={y:f(i[2]),M:f(i[3]),d:f(i[4]),h:f(i[5]),m:f(i[6]),s:f(i[7]),w:f(i[8])}):null==h?h={}:"object"==typeof h&&("from"in h||"to"in h)&&(g=t(vb(h.from),vb(h.to)),h={},h.ms=g.milliseconds,h.M=g.months),e=new n(h),vb.isDuration(a)&&c(a,"_locale")&&(e._locale=a._locale),e},vb.version=yb,vb.defaultFormat=gc,vb.ISO_8601=function(){},vb.momentProperties=Kb,vb.updateOffset=function(){},vb.relativeTimeThreshold=function(b,c){return oc[b]===a?!1:c===a?oc[b]:(oc[b]=c,!0)},vb.lang=f("moment.lang is deprecated. Use moment.locale instead.",function(a,b){return vb.locale(a,b)}),vb.locale=function(a,b){var c;return a&&(c="undefined"!=typeof b?vb.defineLocale(a,b):vb.localeData(a),c&&(vb.duration._locale=vb._locale=c)),vb._locale._abbr},vb.defineLocale=function(a,b){return null!==b?(b.abbr=a,Jb[a]||(Jb[a]=new l),Jb[a].set(b),vb.locale(a),Jb[a]):(delete Jb[a],null)},vb.langData=f("moment.langData is deprecated. Use moment.localeData instead.",function(a){return vb.localeData(a)}),vb.localeData=function(a){var b;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return vb._locale;if(!w(a)){if(b=L(a))return b;a=[a]}return K(a)},vb.isMoment=function(a){return a instanceof m||null!=a&&c(a,"_isAMomentObject")},vb.isDuration=function(a){return a instanceof n};for(xb=tc.length-1;xb>=0;--xb)B(tc[xb]);vb.normalizeUnits=function(a){return z(a)},vb.invalid=function(a){var b=vb.utc(0/0);return null!=a?o(b._pf,a):b._pf.userInvalidated=!0,b},vb.parseZone=function(){return vb.apply(null,arguments).parseZone()},vb.parseTwoDigitYear=function(a){return C(a)+(C(a)>68?1900:2e3)},vb.isDate=x,o(vb.fn=m.prototype,{clone:function(){return vb(this)},valueOf:function(){return+this._d-6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().locale("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=vb(this).utc();return 00:!1},parsingFlags:function(){return o({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(a){return this.utcOffset(0,a)},local:function(a){return this._isUTC&&(this.utcOffset(0,a),this._isUTC=!1,a&&this.subtract(this._dateUtcOffset(),"m")),this},format:function(a){var b=P(this,a||vb.defaultFormat);return this.localeData().postformat(b)},add:u(1,"add"),subtract:u(-1,"subtract"),diff:function(a,b,c){var d,e,f=M(a,this),g=6e4*(f.utcOffset()-this.utcOffset());return b=z(b),"year"===b||"month"===b||"quarter"===b?(e=j(this,f),"quarter"===b?e/=3:"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:q(e)},from:function(a,b){return vb.duration({to:this,from:a}).locale(this.locale()).humanize(!b)},fromNow:function(a){return this.from(vb(),a)},calendar:function(a){var b=a||vb(),c=M(b,this).startOf("day"),d=this.diff(c,"days",!0),e=-6>d?"sameElse":-1>d?"lastWeek":0>d?"lastDay":1>d?"sameDay":2>d?"nextDay":7>d?"nextWeek":"sameElse";return this.format(this.localeData().calendar(e,this,vb(b)))},isLeapYear:function(){return G(this.year())},isDST:function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},day:function(a){var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=gb(a,this.localeData()),this.add(a-b,"d")):b},month:qb("Month",!0),startOf:function(a){switch(a=z(a)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===a?this.weekday(0):"isoWeek"===a&&this.isoWeekday(1),"quarter"===a&&this.month(3*Math.floor(this.month()/3)),this},endOf:function(b){return b=z(b),b===a||"millisecond"===b?this:this.startOf(b).add(1,"isoWeek"===b?"week":b).subtract(1,"ms")},isAfter:function(a,b){var c;return b=z("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=vb.isMoment(a)?a:vb(a),+this>+a):(c=vb.isMoment(a)?+a:+vb(a),c<+this.clone().startOf(b))},isBefore:function(a,b){var c;return b=z("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=vb.isMoment(a)?a:vb(a),+a>+this):(c=vb.isMoment(a)?+a:+vb(a),+this.clone().endOf(b)a?this:a}),max:f("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(a){return a=vb.apply(null,arguments),a>this?this:a}),zone:f("moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779",function(a,b){return null!=a?("string"!=typeof a&&(a=-a),this.utcOffset(a,b),this):-this.utcOffset()}),utcOffset:function(a,b){var c,d=this._offset||0;return null!=a?("string"==typeof a&&(a=S(a)),Math.abs(a)<16&&(a=60*a),!this._isUTC&&b&&(c=this._dateUtcOffset()),this._offset=a,this._isUTC=!0,null!=c&&this.add(c,"m"),d!==a&&(!b||this._changeInProgress?v(this,vb.duration(a-d,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,vb.updateOffset(this,!0),this._changeInProgress=null)),this):this._isUTC?d:this._dateUtcOffset()},isLocal:function(){return!this._isUTC},isUtcOffset:function(){return this._isUTC},isUtc:function(){return this._isUTC&&0===this._offset},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.utcOffset(this._tzm):"string"==typeof this._i&&this.utcOffset(S(this._i)),this},hasAlignedHourOffset:function(a){return a=a?vb(a).utcOffset():0,(this.utcOffset()-a)%60===0},daysInMonth:function(){return D(this.year(),this.month())},dayOfYear:function(a){var b=Ab((vb(this).startOf("day")-vb(this).startOf("year"))/864e5)+1;return null==a?b:this.add(a-b,"d")},quarter:function(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)},weekYear:function(a){var b=jb(this,this.localeData()._week.dow,this.localeData()._week.doy).year;return null==a?b:this.add(a-b,"y")},isoWeekYear:function(a){var b=jb(this,1,4).year;return null==a?b:this.add(a-b,"y")},week:function(a){var b=this.localeData().week(this);return null==a?b:this.add(7*(a-b),"d")},isoWeek:function(a){var b=jb(this,1,4).week;return null==a?b:this.add(7*(a-b),"d")},weekday:function(a){var b=(this.day()+7-this.localeData()._week.dow)%7;return null==a?b:this.add(a-b,"d")},isoWeekday:function(a){return null==a?this.day()||7:this.day(this.day()%7?a:a-7)},isoWeeksInYear:function(){return E(this.year(),1,4)},weeksInYear:function(){var a=this.localeData()._week;return E(this.year(),a.dow,a.doy)},get:function(a){return a=z(a),this[a]()},set:function(a,b){var c;if("object"==typeof a)for(c in a)this.set(c,a[c]);else a=z(a),"function"==typeof this[a]&&this[a](b);return this},locale:function(b){var c;return b===a?this._locale._abbr:(c=vb.localeData(b),null!=c&&(this._locale=c),this)},lang:f("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(b){return b===a?this.localeData():this.locale(b)}),localeData:function(){return this._locale},_dateUtcOffset:function(){return 15*-Math.round(this._d.getTimezoneOffset()/15)}}),vb.fn.millisecond=vb.fn.milliseconds=qb("Milliseconds",!1),vb.fn.second=vb.fn.seconds=qb("Seconds",!1),vb.fn.minute=vb.fn.minutes=qb("Minutes",!1),vb.fn.hour=vb.fn.hours=qb("Hours",!0),vb.fn.date=qb("Date",!0),vb.fn.dates=f("dates accessor is deprecated. Use date instead.",qb("Date",!0)),vb.fn.year=qb("FullYear",!0),vb.fn.years=f("years accessor is deprecated. Use year instead.",qb("FullYear",!0)),vb.fn.days=vb.fn.day,vb.fn.months=vb.fn.month,vb.fn.weeks=vb.fn.week,vb.fn.isoWeeks=vb.fn.isoWeek,vb.fn.quarters=vb.fn.quarter,vb.fn.toJSON=vb.fn.toISOString,vb.fn.isUTC=vb.fn.isUtc,o(vb.duration.fn=n.prototype,{_bubble:function(){var a,b,c,d=this._milliseconds,e=this._days,f=this._months,g=this._data,h=0;g.milliseconds=d%1e3,a=q(d/1e3),g.seconds=a%60,b=q(a/60),g.minutes=b%60,c=q(b/60),g.hours=c%24,e+=q(c/24),h=q(rb(e)),e-=q(sb(h)),f+=q(e/30),e%=30,h+=q(f/12),f%=12,g.days=e,g.months=f,g.years=h},abs:function(){return this._milliseconds=Math.abs(this._milliseconds),this._days=Math.abs(this._days),this._months=Math.abs(this._months),this._data.milliseconds=Math.abs(this._data.milliseconds),this._data.seconds=Math.abs(this._data.seconds),this._data.minutes=Math.abs(this._data.minutes),this._data.hours=Math.abs(this._data.hours),this._data.months=Math.abs(this._data.months),this._data.years=Math.abs(this._data.years),this},weeks:function(){return q(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*C(this._months/12) +},humanize:function(a){var b=ib(this,!a,this.localeData());return a&&(b=this.localeData().pastFuture(+this,b)),this.localeData().postformat(b)},add:function(a,b){var c=vb.duration(a,b);return this._milliseconds+=c._milliseconds,this._days+=c._days,this._months+=c._months,this._bubble(),this},subtract:function(a,b){var c=vb.duration(a,b);return this._milliseconds-=c._milliseconds,this._days-=c._days,this._months-=c._months,this._bubble(),this},get:function(a){return a=z(a),this[a.toLowerCase()+"s"]()},as:function(a){var b,c;if(a=z(a),"month"===a||"year"===a)return b=this._days+this._milliseconds/864e5,c=this._months+12*rb(b),"month"===a?c:c/12;switch(b=this._days+Math.round(sb(this._months/12)),a){case"week":return b/7+this._milliseconds/6048e5;case"day":return b+this._milliseconds/864e5;case"hour":return 24*b+this._milliseconds/36e5;case"minute":return 24*b*60+this._milliseconds/6e4;case"second":return 24*b*60*60+this._milliseconds/1e3;case"millisecond":return Math.floor(24*b*60*60*1e3)+this._milliseconds;default:throw new Error("Unknown unit "+a)}},lang:vb.fn.lang,locale:vb.fn.locale,toIsoString:f("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",function(){return this.toISOString()}),toISOString:function(){var a=Math.abs(this.years()),b=Math.abs(this.months()),c=Math.abs(this.days()),d=Math.abs(this.hours()),e=Math.abs(this.minutes()),f=Math.abs(this.seconds()+this.milliseconds()/1e3);return this.asSeconds()?(this.asSeconds()<0?"-":"")+"P"+(a?a+"Y":"")+(b?b+"M":"")+(c?c+"D":"")+(d||e||f?"T":"")+(d?d+"H":"")+(e?e+"M":"")+(f?f+"S":""):"P0D"},localeData:function(){return this._locale},toJSON:function(){return this.toISOString()}}),vb.duration.fn.toString=vb.duration.fn.toISOString;for(xb in kc)c(kc,xb)&&tb(xb.toLowerCase());vb.duration.fn.asMilliseconds=function(){return this.as("ms")},vb.duration.fn.asSeconds=function(){return this.as("s")},vb.duration.fn.asMinutes=function(){return this.as("m")},vb.duration.fn.asHours=function(){return this.as("h")},vb.duration.fn.asDays=function(){return this.as("d")},vb.duration.fn.asWeeks=function(){return this.as("weeks")},vb.duration.fn.asMonths=function(){return this.as("M")},vb.duration.fn.asYears=function(){return this.as("y")},vb.locale("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var b=a%10,c=1===C(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}),function(a){a(vb)}(function(a){return a.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(a){return/^nm$/i.test(a)},meridiem:function(a,b,c){return 12>a?c?"vm":"VM":c?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[Môre om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("ar-ma",{months:"يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:6,doy:12}})}),function(a){a(vb)}(function(a){var b={1:"Ù¡",2:"Ù¢",3:"Ù£",4:"Ù¤",5:"Ù¥",6:"Ù¦",7:"Ù§",8:"Ù¨",9:"Ù©",0:"Ù "},c={"Ù¡":"1","Ù¢":"2","Ù£":"3","Ù¤":"4","Ù¥":"5","Ù¦":"6","Ù§":"7","Ù¨":"8","Ù©":"9","Ù ":"0"};return a.defineLocale("ar-sa",{months:"يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),monthsShort:"يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiemParse:/ص|Ù…/,isPM:function(a){return"Ù…"===a},meridiem:function(a){return 12>a?"ص":"Ù…"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(a){return a.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(a){return c[a]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]}).replace(/,/g,"ØŒ")},week:{dow:6,doy:12}})}),function(a){a(vb)}(function(a){return a.defineLocale("ar-tn",{months:"جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),monthsShort:"جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){var b={1:"Ù¡",2:"Ù¢",3:"Ù£",4:"Ù¤",5:"Ù¥",6:"Ù¦",7:"Ù§",8:"Ù¨",9:"Ù©",0:"Ù "},c={"Ù¡":"1","Ù¢":"2","Ù£":"3","Ù¤":"4","Ù¥":"5","Ù¦":"6","Ù§":"7","Ù¨":"8","Ù©":"9","Ù ":"0"},d=function(a){return 0===a?0:1===a?1:2===a?2:a%100>=3&&10>=a%100?3:a%100>=11?4:5},e={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},f=function(a){return function(b,c){var f=d(b),g=e[a][d(b)];return 2===f&&(g=g[c?0:1]),g.replace(/%d/i,b)}},g=["كانون الثاني يناير","شباط Ùبراير","آذار مارس","نيسان أبريل","أيار مايو","حزيران يونيو","تموز يوليو","آب أغسطس","أيلول سبتمبر","تشرين الأول أكتوبر","تشرين الثاني نوÙمبر","كانون الأول ديسمبر"];return a.defineLocale("ar",{months:g,monthsShort:g,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiemParse:/ص|Ù…/,isPM:function(a){return"Ù…"===a},meridiem:function(a){return 12>a?"ص":"Ù…"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:f("s"),m:f("m"),mm:f("m"),h:f("h"),hh:f("h"),d:f("d"),dd:f("d"),M:f("M"),MM:f("M"),y:f("y"),yy:f("y")},preparse:function(a){return a.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(a){return c[a]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]}).replace(/,/g,"ØŒ")},week:{dow:6,doy:12}})}),function(a){a(vb)}(function(a){var b={1:"-inci",5:"-inci",8:"-inci",70:"-inci",80:"-inci",2:"-nci",7:"-nci",20:"-nci",50:"-nci",3:"-üncü",4:"-üncü",100:"-üncü",6:"-ncı",9:"-uncu",10:"-uncu",30:"-uncu",60:"-ıncı",90:"-ıncı"};return a.defineLocale("az",{months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekdays:"Bazar_Bazar ertÉ™si_ÇərÅŸÉ™nbÉ™ axÅŸamı_ÇərÅŸÉ™nbÉ™_CümÉ™ axÅŸamı_CümÉ™_ŞənbÉ™".split("_"),weekdaysShort:"Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən".split("_"),weekdaysMin:"Bz_BE_ÇA_Çə_CA_Cü_Şə".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[sabah saat] LT",nextWeek:"[gÉ™lÉ™n hÉ™ftÉ™] dddd [saat] LT",lastDay:"[dünÉ™n] LT",lastWeek:"[keçən hÉ™ftÉ™] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s É™vvÉ™l",s:"birneçə saniyyÉ™",m:"bir dÉ™qiqÉ™",mm:"%d dÉ™qiqÉ™",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},meridiemParse:/gecÉ™|sÉ™hÉ™r|gündüz|axÅŸam/,isPM:function(a){return/^(gündüz|axÅŸam)$/.test(a)},meridiem:function(a){return 4>a?"gecÉ™":12>a?"sÉ™hÉ™r":17>a?"gündüz":"axÅŸam"},ordinalParse:/\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,ordinal:function(a){if(0===a)return a+"-ıncı";var c=a%10,d=a%100-c,e=a>=100?100:null;return a+(b[c]||b[d]||b[e])},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){function b(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:c?"хвіліна_хвіліны_хвілін":"хвіліну_хвіліны_хвілін",hh:c?"гадзіна_гадзіны_гадзін":"гадзіну_гадзіны_гадзін",dd:"дзень_дні_дзён",MM:"меÑÑц_меÑÑцы_меÑÑцаў",yy:"год_гады_гадоў"};return"m"===d?c?"хвіліна":"хвіліну":"h"===d?c?"гадзіна":"гадзіну":a+" "+b(e[d],+a)}function d(a,b){var c={nominative:"Ñтудзень_люты_Ñакавік_краÑавік_травень_чÑрвень_ліпень_жнівень_вераÑень_каÑтрычнік_ліÑтапад_Ñнежань".split("_"),accusative:"ÑтудзенÑ_лютага_Ñакавіка_краÑавіка_траўнÑ_чÑрвенÑ_ліпенÑ_жніўнÑ_вераÑнÑ_каÑтрычніка_ліÑтапада_ÑнежнÑ".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function e(a,b){var c={nominative:"нÑдзелÑ_панÑдзелак_аўторак_Ñерада_чацвер_пÑтніца_Ñубота".split("_"),accusative:"нÑдзелю_панÑдзелак_аўторак_Ñераду_чацвер_пÑтніцу_Ñуботу".split("_")},d=/\[ ?[Вв] ?(?:мінулую|наÑтупную)? ?\] ?dddd/.test(b)?"accusative":"nominative";return c[d][a.day()]}return a.defineLocale("be",{months:d,monthsShort:"Ñтуд_лют_Ñак_краÑ_трав_чÑрв_ліп_жнів_вер_каÑÑ‚_ліÑÑ‚_Ñнеж".split("_"),weekdays:e,weekdaysShort:"нд_пн_ат_ÑÑ€_чц_пт_Ñб".split("_"),weekdaysMin:"нд_пн_ат_ÑÑ€_чц_пт_Ñб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., LT",LLLL:"dddd, D MMMM YYYY г., LT"},calendar:{sameDay:"[Ð¡Ñ‘Ð½Ð½Ñ Ñž] LT",nextDay:"[Заўтра Ñž] LT",lastDay:"[Учора Ñž] LT",nextWeek:function(){return"[У] dddd [Ñž] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[У мінулую] dddd [Ñž] LT";case 1:case 2:case 4:return"[У мінулы] dddd [Ñž] LT"}},sameElse:"L"},relativeTime:{future:"праз %s",past:"%s таму",s:"некалькі Ñекунд",m:c,mm:c,h:c,hh:c,d:"дзень",dd:c,M:"меÑÑц",MM:c,y:"год",yy:c},meridiemParse:/ночы|раніцы|днÑ|вечара/,isPM:function(a){return/^(днÑ|вечара)$/.test(a)},meridiem:function(a){return 4>a?"ночы":12>a?"раніцы":17>a?"днÑ":"вечара"},ordinalParse:/\d{1,2}-(Ñ–|Ñ‹|га)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":case"w":case"W":return a%10!==2&&a%10!==3||a%100===12||a%100===13?a+"-Ñ‹":a+"-Ñ–";case"D":return a+"-га";default:return a}},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("bg",{months:"Ñнуари_февруари_март_април_май_юни_юли_авгуÑÑ‚_Ñептември_октомври_ноември_декември".split("_"),monthsShort:"Ñнр_фев_мар_апр_май_юни_юли_авг_Ñеп_окт_ное_дек".split("_"),weekdays:"неделÑ_понеделник_вторник_ÑÑ€Ñда_четвъртък_петък_Ñъбота".split("_"),weekdaysShort:"нед_пон_вто_ÑÑ€Ñ_чет_пет_Ñъб".split("_"),weekdaysMin:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Ð”Ð½ÐµÑ Ð²] LT",nextDay:"[Утре в] LT",nextWeek:"dddd [в] LT",lastDay:"[Вчера в] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Ð’ изминалата] dddd [в] LT";case 1:case 2:case 4:case 5:return"[Ð’ изминалиÑ] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"Ñлед %s",past:"преди %s",s:"нÑколко Ñекунди",m:"минута",mm:"%d минути",h:"чаÑ",hh:"%d чаÑа",d:"ден",dd:"%d дни",M:"меÑец",MM:"%d меÑеца",y:"година",yy:"%d години"},ordinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(a){var b=a%10,c=a%100;return 0===a?a+"-ев":0===c?a+"-ен":c>10&&20>c?a+"-ти":1===b?a+"-ви":2===b?a+"-ри":7===b||8===b?a+"-ми":a+"-ти"},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){var b={1:"১",2:"২",3:"৩",4:"৪",5:"৫",6:"৬",7:"৭",8:"৮",9:"৯",0:"০"},c={"১":"1","২":"2","৩":"3","৪":"4","৫":"5","৬":"6","৭":"7","৮":"8","৯":"9","০":"0"};return a.defineLocale("bn",{months:"জানà§à§Ÿà¦¾à¦°à§€_ফেবà§à§Ÿà¦¾à¦°à§€_মারà§à¦š_à¦à¦ªà§à¦°à¦¿à¦²_মে_জà§à¦¨_জà§à¦²à¦¾à¦‡_অগাসà§à¦Ÿ_সেপà§à¦Ÿà§‡à¦®à§à¦¬à¦°_অকà§à¦Ÿà§‹à¦¬à¦°_নভেমà§à¦¬à¦°_ডিসেমà§à¦¬à¦°".split("_"),monthsShort:"জানà§_ফেব_মারà§à¦š_à¦à¦ªà¦°_মে_জà§à¦¨_জà§à¦²_অগ_সেপà§à¦Ÿ_অকà§à¦Ÿà§‹_নভ_ডিসেমà§".split("_"),weekdays:"রবিবার_সোমবার_মঙà§à¦—লবার_বà§à¦§à¦¬à¦¾à¦°_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿à¦¬à¦¾à¦°_শà§à¦•à§à¦°à§à¦¬à¦¾à¦°_শনিবার".split("_"),weekdaysShort:"রবি_সোম_মঙà§à¦—ল_বà§à¦§_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿_শà§à¦•à§à¦°à§_শনি".split("_"),weekdaysMin:"রব_সম_মঙà§à¦—_বà§_বà§à¦°à¦¿à¦¹_শà§_শনি".split("_"),longDateFormat:{LT:"A h:mm সময়",LTS:"A h:mm:ss সময়",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[আজ] LT",nextDay:"[আগামীকাল] LT",nextWeek:"dddd, LT",lastDay:"[গতকাল] LT",lastWeek:"[গত] dddd, LT",sameElse:"L"},relativeTime:{future:"%s পরে",past:"%s আগে",s:"কà¦à¦• সেকেনà§à¦¡",m:"à¦à¦• মিনিট",mm:"%d মিনিট",h:"à¦à¦• ঘনà§à¦Ÿà¦¾",hh:"%d ঘনà§à¦Ÿà¦¾",d:"à¦à¦• দিন",dd:"%d দিন",M:"à¦à¦• মাস",MM:"%d মাস",y:"à¦à¦• বছর",yy:"%d বছর"},preparse:function(a){return a.replace(/[১২৩৪৫৬৭৮৯০]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/রাত|শকাল|দà§à¦ªà§à¦°|বিকেল|রাত/,isPM:function(a){return/^(দà§à¦ªà§à¦°|বিকেল|রাত)$/.test(a)},meridiem:function(a){return 4>a?"রাত":10>a?"শকাল":17>a?"দà§à¦ªà§à¦°":20>a?"বিকেল":"রাত"},week:{dow:0,doy:6}})}),function(a){a(vb)}(function(a){var b={1:"༡",2:"༢",3:"༣",4:"༤",5:"༥",6:"༦",7:"༧",8:"༨",9:"༩",0:"༠"},c={"༡":"1","༢":"2","༣":"3","༤":"4","༥":"5","༦":"6","༧":"7","༨":"8","༩":"9","༠":"0"};return a.defineLocale("bo",{months:"ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ".split("_"),monthsShort:"ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ".split("_"),weekdays:"གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་".split("_"),weekdaysShort:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),weekdaysMin:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),longDateFormat:{LT:"A h:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[དི་རིང] LT",nextDay:"[སང་ཉིན] LT",nextWeek:"[བདུན་ཕྲག་རྗེས་མ], LT",lastDay:"[à½à¼‹à½¦à½„] LT",lastWeek:"[བདུན་ཕྲག་མà½à½ à¼‹à½˜] dddd, LT",sameElse:"L"},relativeTime:{future:"%s ལ་",past:"%s སྔན་ལ",s:"ལམ་སང",m:"སà¾à½¢à¼‹à½˜à¼‹à½‚ཅིག",mm:"%d སà¾à½¢à¼‹à½˜",h:"ཆུ་ཚོད་གཅིག",hh:"%d ཆུ་ཚོད",d:"ཉིན་གཅིག",dd:"%d ཉིན་",M:"ཟླ་བ་གཅིག",MM:"%d ཟླ་བ",y:"ལོ་གཅིག",yy:"%d ལོ"},preparse:function(a){return a.replace(/[༡༢༣༤༥༦༧༨༩༠]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,isPM:function(a){return/^(ཉིན་གུང|དགོང་དག|མཚན་མོ)$/.test(a)},meridiem:function(a){return 4>a?"མཚན་མོ":10>a?"ཞོགས་ཀས":17>a?"ཉིན་གུང":20>a?"དགོང་དག":"མཚན་མོ"},week:{dow:0,doy:6}})}),function(a){a(vb)}(function(b){function c(a,b,c){var d={mm:"munutenn",MM:"miz",dd:"devezh"};return a+" "+f(d[c],a)}function d(a){switch(e(a)){case 1:case 3:case 4:case 5:case 9:return a+" bloaz";default:return a+" vloaz"}}function e(a){return a>9?e(a%10):a}function f(a,b){return 2===b?g(a):a}function g(b){var c={m:"v",b:"v",d:"z"};return c[b.charAt(0)]===a?b:c[b.charAt(0)]+b.substring(1)}return b.defineLocale("br",{months:"Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),longDateFormat:{LT:"h[e]mm A",LTS:"h[e]mm:ss A",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY LT",LLLL:"dddd, D [a viz] MMMM YYYY LT"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc'hoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec'h da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s 'zo",s:"un nebeud segondennoù",m:"ur vunutenn",mm:c,h:"un eur",hh:"%d eur",d:"un devezh",dd:c,M:"ur miz",MM:c,y:"ur bloaz",yy:d},ordinalParse:/\d{1,2}(añ|vet)/,ordinal:function(a){var b=1===a?"añ":"vet";return a+b},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d=a+" ";switch(c){case"m":return b?"jedna minuta":"jedne minute";case"mm":return d+=1===a?"minuta":2===a||3===a||4===a?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return d+=1===a?"sat":2===a||3===a||4===a?"sata":"sati";case"dd":return d+=1===a?"dan":"dana";case"MM":return d+=1===a?"mjesec":2===a||3===a||4===a?"mjeseca":"mjeseci";case"yy":return d+=1===a?"godina":2===a||3===a||4===a?"godine":"godina"}}return a.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),weekdays:"nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._Äet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_Äe_pe_su".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[proÅ¡lu] dddd [u] LT";case 6:return"[proÅ¡le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[proÅ¡li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:b,mm:b,h:b,hh:b,d:"dan",dd:b,M:"mjesec",MM:b,y:"godinu",yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("ca",{months:"gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),monthsShort:"gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.".split("_"),weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[demà a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"fa %s",s:"uns segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},ordinalParse:/\d{1,2}(r|n|t|è|a)/,ordinal:function(a,b){var c=1===a?"r":2===a?"n":3===a?"r":4===a?"t":"è";return("w"===b||"W"===b)&&(c="a"),a+c},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a){return a>1&&5>a&&1!==~~(a/10)}function c(a,c,d,e){var f=a+" ";switch(d){case"s":return c||e?"pár sekund":"pár sekundami";case"m":return c?"minuta":e?"minutu":"minutou";case"mm":return c||e?f+(b(a)?"minuty":"minut"):f+"minutami";break;case"h":return c?"hodina":e?"hodinu":"hodinou";case"hh":return c||e?f+(b(a)?"hodiny":"hodin"):f+"hodinami";break;case"d":return c||e?"den":"dnem";case"dd":return c||e?f+(b(a)?"dny":"dní"):f+"dny";break;case"M":return c||e?"mÄ›síc":"mÄ›sícem";case"MM":return c||e?f+(b(a)?"mÄ›síce":"mÄ›síců"):f+"mÄ›síci";break;case"y":return c||e?"rok":"rokem";case"yy":return c||e?f+(b(a)?"roky":"let"):f+"lety"}}var d="leden_únor_bÅ™ezen_duben_kvÄ›ten_Äerven_Äervenec_srpen_září_říjen_listopad_prosinec".split("_"),e="led_úno_bÅ™e_dub_kvÄ›_Ävn_Ävc_srp_zář_říj_lis_pro".split("_");return a.defineLocale("cs",{months:d,monthsShort:e,monthsParse:function(a,b){var c,d=[];for(c=0;12>c;c++)d[c]=new RegExp("^"+a[c]+"$|^"+b[c]+"$","i");return d}(d,e),weekdays:"nedÄ›le_pondÄ›lí_úterý_stÅ™eda_Ätvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_Ät_pá_so".split("_"),weekdaysMin:"ne_po_út_st_Ät_pá_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedÄ›li v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve stÅ™edu v] LT";case 4:return"[ve Ätvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[vÄera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou nedÄ›li v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou stÅ™edu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pÅ™ed %s",s:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("cv",{months:"кăрлач_нарăÑ_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав".split("_"),monthsShort:"кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш".split("_"),weekdays:"вырÑарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_Ñрнекун_шăматкун".split("_"),weekdaysShort:"выр_тун_ытл_юн_кĕç_Ñрн_шăм".split("_"),weekdaysMin:"вр_тн_Ñ‹Ñ‚_юн_кç_ÑÑ€_шм".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD-MM-YYYY",LL:"YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]",LLL:"YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT",LLLL:"dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT"},calendar:{sameDay:"[ПаÑн] LT [Ñехетре]",nextDay:"[Ыран] LT [Ñехетре]",lastDay:"[Ĕнер] LT [Ñехетре]",nextWeek:"[ÇитеÑ] dddd LT [Ñехетре]",lastWeek:"[Иртнĕ] dddd LT [Ñехетре]",sameElse:"L"},relativeTime:{future:function(a){var b=/Ñехет$/i.exec(a)?"рен":/çул$/i.exec(a)?"тан":"ран";return a+b},past:"%s каÑлла",s:"пĕр-ик çеккунт",m:"пĕр минут",mm:"%d минут",h:"пĕр Ñехет",hh:"%d Ñехет",d:"пĕр кун",dd:"%d кун",M:"пĕр уйăх",MM:"%d уйăх",y:"пĕр çул",yy:"%d çул"},ordinalParse:/\d{1,2}-мĕш/,ordinal:"%d-мĕш",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("cy",{months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Heddiw am] LT",nextDay:"[Yfory am] LT",nextWeek:"dddd [am] LT",lastDay:"[Ddoe am] LT",lastWeek:"dddd [diwethaf am] LT",sameElse:"L"},relativeTime:{future:"mewn %s",past:"%s yn ôl",s:"ychydig eiliadau",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"},ordinalParse:/\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,ordinal:function(a){var b=a,c="",d=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"];return b>20?c=40===b||50===b||60===b||80===b||100===b?"fed":"ain":b>0&&(c=d[b]),a+c},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd [d.] D. MMMM YYYY LT"},calendar:{sameDay:"[I dag kl.] LT",nextDay:"[I morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[I gÃ¥r kl.] LT",lastWeek:"[sidste] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"fÃ¥ sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en mÃ¥ned",MM:"%d mÃ¥neder",y:"et Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[a+" Tage",a+" Tagen"],M:["ein Monat","einem Monat"],MM:[a+" Monate",a+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[a+" Jahre",a+" Jahren"]};return b?d[c][0]:d[c][1]}return a.defineLocale("de-at",{months:"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT [Uhr]",sameElse:"L",nextDay:"[Morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[Gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:b,mm:"%d Minuten",h:b,hh:"%d Stunden",d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[a+" Tage",a+" Tagen"],M:["ein Monat","einem Monat"],MM:[a+" Monate",a+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[a+" Jahre",a+" Jahren"]};return b?d[c][0]:d[c][1]}return a.defineLocale("de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT [Uhr]",sameElse:"L",nextDay:"[Morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[Gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:b,mm:"%d Minuten",h:b,hh:"%d Stunden",d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("el",{monthsNominativeEl:"ΙανουάÏιος_ΦεβÏουάÏιος_ΜάÏτιος_ΑπÏίλιος_Μάιος_ΙοÏνιος_ΙοÏλιος_ΑÏγουστος_ΣεπτέμβÏιος_ΟκτώβÏιος_ÎοέμβÏιος_ΔεκέμβÏιος".split("_"),monthsGenitiveEl:"ΙανουαÏίου_ΦεβÏουαÏίου_ΜαÏτίου_ΑπÏιλίου_ΜαÎου_Ιουνίου_Ιουλίου_ΑυγοÏστου_ΣεπτεμβÏίου_ΟκτωβÏίου_ÎοεμβÏίου_ΔεκεμβÏίου".split("_"),months:function(a,b){return/D/.test(b.substring(0,b.indexOf("MMMM")))?this._monthsGenitiveEl[a.month()]:this._monthsNominativeEl[a.month()]},monthsShort:"Ιαν_Φεβ_ΜαÏ_ΑπÏ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Îοε_Δεκ".split("_"),weekdays:"ΚυÏιακή_ΔευτέÏα_ΤÏίτη_ΤετάÏτη_Πέμπτη_ΠαÏασκευή_Σάββατο".split("_"),weekdaysShort:"ΚυÏ_Δευ_ΤÏι_Τετ_Πεμ_ΠαÏ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_ΤÏ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(a,b,c){return a>11?c?"μμ":"ΜΜ":c?"πμ":"ΠΜ"},isPM:function(a){return"μ"===(a+"").toLowerCase()[0]},meridiemParse:/[ΠΜ]\.?Îœ?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendarEl:{sameDay:"[ΣήμεÏα {}] LT",nextDay:"[ΑÏÏιο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[το Ï€ÏοηγοÏμενο] dddd [{}] LT";default:return"[την Ï€ÏοηγοÏμενη] dddd [{}] LT"}},sameElse:"L"},calendar:function(a,b){var c=this._calendarEl[a],d=b&&b.hours();return"function"==typeof c&&(c=c.apply(b)),c.replace("{}",d%12===1?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s Ï€Ïιν",s:"λίγα δευτεÏόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ÏŽÏα",hh:"%d ÏŽÏες",d:"μία μέÏα",dd:"%d μέÏες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χÏόνος",yy:"%d χÏόνια"},ordinalParse:/\d{1,2}η/,ordinal:"%dη",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},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"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"D MMMM, YYYY",LLL:"D MMMM, YYYY LT",LLLL:"dddd, D MMMM, YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},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"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th"; +return a+c}})}),function(a){a(vb)}(function(a){return a.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},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"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_aÅ­gusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aÅ­g_sep_okt_nov_dec".split("_"),weekdays:"Dimanĉo_Lundo_Mardo_Merkredo_Ä´aÅ­do_Vendredo_Sabato".split("_"),weekdaysShort:"Dim_Lun_Mard_Merk_Ä´aÅ­_Ven_Sab".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Ä´a_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"D[-an de] MMMM, YYYY",LLL:"D[-an de] MMMM, YYYY LT",LLLL:"dddd, [la] D[-an de] MMMM, YYYY LT"},meridiemParse:/[ap]\.t\.m/i,isPM:function(a){return"p"===a.charAt(0).toLowerCase()},meridiem:function(a,b,c){return a>11?c?"p.t.m.":"P.T.M.":c?"a.t.m.":"A.T.M."},calendar:{sameDay:"[HodiaÅ­ je] LT",nextDay:"[MorgaÅ­ je] LT",nextWeek:"dddd [je] LT",lastDay:"[HieraÅ­ je] LT",lastWeek:"[pasinta] dddd [je] LT",sameElse:"L"},relativeTime:{future:"je %s",past:"antaÅ­ %s",s:"sekundoj",m:"minuto",mm:"%d minutoj",h:"horo",hh:"%d horoj",d:"tago",dd:"%d tagoj",M:"monato",MM:"%d monatoj",y:"jaro",yy:"%d jaroj"},ordinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){var b="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),c="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");return a.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(a,d){return/-MMM-/.test(d)?c[a.month()]:b[a.month()]},weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c,d){var e={s:["mõne sekundi","mõni sekund","paar sekundit"],m:["ühe minuti","üks minut"],mm:[a+" minuti",a+" minutit"],h:["ühe tunni","tund aega","üks tund"],hh:[a+" tunni",a+" tundi"],d:["ühe päeva","üks päev"],M:["kuu aja","kuu aega","üks kuu"],MM:[a+" kuu",a+" kuud"],y:["ühe aasta","aasta","üks aasta"],yy:[a+" aasta",a+" aastat"]};return b?e[c][2]?e[c][2]:e[c][1]:d?e[c][0]:e[c][1]}return a.defineLocale("et",{months:"jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Täna,] LT",nextDay:"[Homme,] LT",nextWeek:"[Järgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s pärast",past:"%s tagasi",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:"%d päeva",M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] LT",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] LT",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] LT",llll:"ddd, YYYY[ko] MMM D[a] LT"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){var b={1:"Û±",2:"Û²",3:"Û³",4:"Û´",5:"Ûµ",6:"Û¶",7:"Û·",8:"Û¸",9:"Û¹",0:"Û°"},c={"Û±":"1","Û²":"2","Û³":"3","Û´":"4","Ûµ":"5","Û¶":"6","Û·":"7","Û¸":"8","Û¹":"9","Û°":"0"};return a.defineLocale("fa",{months:"ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ÛŒ_د_س_Ú†_Ù¾_ج_Ø´".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},meridiemParse:/قبل از ظهر|بعد از ظهر/,isPM:function(a){return/بعد از ظهر/.test(a)},meridiem:function(a){return 12>a?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[Ùردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چندین ثانیه",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(a){return a.replace(/[Û°-Û¹]/g,function(a){return c[a]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]}).replace(/,/g,"ØŒ")},ordinalParse:/\d{1,2}Ù…/,ordinal:"%dÙ…",week:{dow:6,doy:12}})}),function(a){a(vb)}(function(a){function b(a,b,d,e){var f="";switch(d){case"s":return e?"muutaman sekunnin":"muutama sekunti";case"m":return e?"minuutin":"minuutti";case"mm":f=e?"minuutin":"minuuttia";break;case"h":return e?"tunnin":"tunti";case"hh":f=e?"tunnin":"tuntia";break;case"d":return e?"päivän":"päivä";case"dd":f=e?"päivän":"päivää";break;case"M":return e?"kuukauden":"kuukausi";case"MM":f=e?"kuukauden":"kuukautta";break;case"y":return e?"vuoden":"vuosi";case"yy":f=e?"vuoden":"vuotta"}return f=c(a,e)+" "+f}function c(a,b){return 10>a?b?e[a]:d[a]:a}var d="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),e=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",d[7],d[8],d[9]];return a.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] LT",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] LT",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] LT",llll:"ddd, Do MMM YYYY, [klo] LT"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("fo",{months:"januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur".split("_"),weekdaysShort:"sun_mán_týs_mik_hós_frí_ley".split("_"),weekdaysMin:"su_má_tý_mi_hó_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D. MMMM, YYYY LT"},calendar:{sameDay:"[à dag kl.] LT",nextDay:"[à morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[à gjár kl.] LT",lastWeek:"[síðstu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s síðani",s:"fá sekund",m:"ein minutt",mm:"%d minuttir",h:"ein tími",hh:"%d tímar",d:"ein dagur",dd:"%d dagar",M:"ein mánaði",MM:"%d mánaðir",y:"eitt ár",yy:"%d ár"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|)/,ordinal:function(a){return a+(1===a?"er":"")}})}),function(a){a(vb)}(function(a){return a.defineLocale("fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|)/,ordinal:function(a){return a+(1===a?"er":"")},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){var b="jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.".split("_"),c="jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_");return a.defineLocale("fy",{months:"jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber".split("_"),monthsShort:function(a,d){return/-MMM-/.test(d)?c[a.month()]:b[a.month()]},weekdays:"snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon".split("_"),weekdaysShort:"si._mo._ti._wo._to._fr._so.".split("_"),weekdaysMin:"Si_Mo_Ti_Wo_To_Fr_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[hjoed om] LT",nextDay:"[moarn om] LT",nextWeek:"dddd [om] LT",lastDay:"[juster om] LT",lastWeek:"[ôfrûne] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oer %s",past:"%s lyn",s:"in pear sekonden",m:"ien minút",mm:"%d minuten",h:"ien oere",hh:"%d oeren",d:"ien dei",dd:"%d dagen",M:"ien moanne",MM:"%d moannen",y:"ien jier",yy:"%d jierren"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("gl",{months:"Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro".split("_"),monthsShort:"Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.".split("_"),weekdays:"Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado".split("_"),weekdaysShort:"Dom._Lun._Mar._Mér._Xov._Ven._Sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mé_Xo_Ve_Sá".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"ás":"á")+"] LT"},nextDay:function(){return"[mañá "+(1!==this.hours()?"ás":"á")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"ás":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"á":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"ás":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(a){return"uns segundos"===a?"nuns segundos":"en "+a},past:"hai %s",s:"uns segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("he",{months:"ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר".split("_"),monthsShort:"ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳".split("_"),weekdays:"ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),weekdaysShort:"×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),weekdaysMin:"×_ב_×’_ד_×”_ו_ש".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY LT",LLLL:"dddd, D [ב]MMMM YYYY LT",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY LT",llll:"ddd, D MMM YYYY LT"},calendar:{sameDay:"[×”×™×•× ×‘Ö¾]LT",nextDay:"[מחר ב־]LT",nextWeek:"dddd [בשעה] LT",lastDay:"[×תמול ב־]LT",lastWeek:"[ביו×] dddd [×”×חרון בשעה] LT",sameElse:"L"},relativeTime:{future:"בעוד %s",past:"לפני %s",s:"מספר שניות",m:"דקה",mm:"%d דקות",h:"שעה",hh:function(a){return 2===a?"שעתיי×":a+" שעות"},d:"יו×",dd:function(a){return 2===a?"יומיי×":a+" ימי×"},M:"חודש",MM:function(a){return 2===a?"חודשיי×":a+" חודשי×"},y:"שנה",yy:function(a){return 2===a?"שנתיי×":a%10===0&&10!==a?a+" שנה":a+" שני×"}}})}),function(a){a(vb)}(function(a){var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return a.defineLocale("hi",{months:"जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°".split("_"),monthsShort:"जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.".split("_"),weekdays:"रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि".split("_"),weekdaysMin:"र_सो_मं_बà¥_गà¥_शà¥_श".split("_"),longDateFormat:{LT:"A h:mm बजे",LTS:"A h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कà¥à¤› ही कà¥à¤·à¤£",m:"à¤à¤• मिनट",mm:"%d मिनट",h:"à¤à¤• घंटा",hh:"%d घंटे",d:"à¤à¤• दिन",dd:"%d दिन",M:"à¤à¤• महीने",MM:"%d महीने",y:"à¤à¤• वरà¥à¤·",yy:"%d वरà¥à¤·"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/रात|सà¥à¤¬à¤¹|दोपहर|शाम/,meridiemHour:function(a,b){return 12===a&&(a=0),"रात"===b?4>a?a:a+12:"सà¥à¤¬à¤¹"===b?a:"दोपहर"===b?a>=10?a:a+12:"शाम"===b?a+12:void 0},meridiem:function(a){return 4>a?"रात":10>a?"सà¥à¤¬à¤¹":17>a?"दोपहर":20>a?"शाम":"रात"},week:{dow:0,doy:6}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d=a+" ";switch(c){case"m":return b?"jedna minuta":"jedne minute";case"mm":return d+=1===a?"minuta":2===a||3===a||4===a?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return d+=1===a?"sat":2===a||3===a||4===a?"sata":"sati";case"dd":return d+=1===a?"dan":"dana";case"MM":return d+=1===a?"mjesec":2===a||3===a||4===a?"mjeseca":"mjeseci";case"yy":return d+=1===a?"godina":2===a||3===a||4===a?"godine":"godina"}}return a.defineLocale("hr",{months:"sjeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_"),monthsShort:"sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),weekdays:"nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._Äet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_Äe_pe_su".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[proÅ¡lu] dddd [u] LT";case 6:return"[proÅ¡le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[proÅ¡li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:b,mm:b,h:b,hh:b,d:"dan",dd:b,M:"mjesec",MM:b,y:"godinu",yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){function b(a,b,c,d){var e=a;switch(c){case"s":return d||b?"néhány másodperc":"néhány másodperce";case"m":return"egy"+(d||b?" perc":" perce");case"mm":return e+(d||b?" perc":" perce");case"h":return"egy"+(d||b?" óra":" órája");case"hh":return e+(d||b?" óra":" órája");case"d":return"egy"+(d||b?" nap":" napja");case"dd":return e+(d||b?" nap":" napja");case"M":return"egy"+(d||b?" hónap":" hónapja");case"MM":return e+(d||b?" hónap":" hónapja");case"y":return"egy"+(d||b?" év":" éve");case"yy":return e+(d||b?" év":" éve")}return""}function c(a){return(a?"":"[múlt] ")+"["+d[this.day()]+"] LT[-kor]"}var d="vasárnap hétfÅ‘n kedden szerdán csütörtökön pénteken szombaton".split(" ");return a.defineLocale("hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfÅ‘_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D., LT",LLLL:"YYYY. MMMM D., dddd LT"},meridiemParse:/de|du/i,isPM:function(a){return"u"===a.charAt(1).toLowerCase()},meridiem:function(a,b,c){return 12>a?c===!0?"de":"DE":c===!0?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return c.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return c.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){function b(a,b){var c={nominative:"Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€_Õ´Õ¡Ö€Õ¿_Õ¡ÕºÖ€Õ«Õ¬_Õ´Õ¡ÕµÕ«Õ½_Õ°Õ¸Ö‚Õ¶Õ«Õ½_Õ°Õ¸Ö‚Õ¬Õ«Õ½_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€".split("_"),accusative:"Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€Õ«_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€Õ«_Õ´Õ¡Ö€Õ¿Õ«_Õ¡ÕºÖ€Õ«Õ¬Õ«_Õ´Õ¡ÕµÕ«Õ½Õ«_Õ°Õ¸Ö‚Õ¶Õ«Õ½Õ«_Õ°Õ¸Ö‚Õ¬Õ«Õ½Õ«_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½Õ«_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function c(a){var b="Õ°Õ¶Õ¾_ÖƒÕ¿Ö€_Õ´Ö€Õ¿_Õ¡ÕºÖ€_Õ´ÕµÕ½_Õ°Õ¶Õ½_Õ°Õ¬Õ½_Ö…Õ£Õ½_Õ½ÕºÕ¿_Õ°Õ¯Õ¿_Õ¶Õ´Õ¢_Õ¤Õ¯Õ¿".split("_");return b[a.month()]}function d(a){var b="Õ¯Õ«Ö€Õ¡Õ¯Õ«_Õ¥Ö€Õ¯Õ¸Ö‚Õ·Õ¡Õ¢Õ©Õ«_Õ¥Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ¹Õ¸Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ°Õ«Õ¶Õ£Õ·Õ¡Õ¢Õ©Õ«_Õ¸Ö‚Ö€Õ¢Õ¡Õ©_Õ·Õ¡Õ¢Õ¡Õ©".split("_");return b[a.day()]}return a.defineLocale("hy-am",{months:b,monthsShort:c,weekdays:d,weekdaysShort:"Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©".split("_"),weekdaysMin:"Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY Õ©.",LLL:"D MMMM YYYY Õ©., LT",LLLL:"dddd, D MMMM YYYY Õ©., LT"},calendar:{sameDay:"[Õ¡ÕµÕ½Ö…Ö€] LT",nextDay:"[Õ¾Õ¡Õ²Õ¨] LT",lastDay:"[Õ¥Ö€Õ¥Õ¯] LT",nextWeek:function(){return"dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT"},lastWeek:function(){return"[Õ¡Õ¶ÖÕ¡Õ®] dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT"},sameElse:"L"},relativeTime:{future:"%s Õ°Õ¥Õ¿Õ¸",past:"%s Õ¡Õ¼Õ¡Õ»",s:"Õ´Õ« Ö„Õ¡Õ¶Õ« Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶",m:"Ö€Õ¸ÕºÕ¥",mm:"%d Ö€Õ¸ÕºÕ¥",h:"ÕªÕ¡Õ´",hh:"%d ÕªÕ¡Õ´",d:"Ö…Ö€",dd:"%d Ö…Ö€",M:"Õ¡Õ´Õ«Õ½",MM:"%d Õ¡Õ´Õ«Õ½",y:"Õ¿Õ¡Ö€Õ«",yy:"%d Õ¿Õ¡Ö€Õ«"},meridiemParse:/Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡|Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡|ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶/,isPM:function(a){return/^(ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶)$/.test(a)},meridiem:function(a){return 4>a?"Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡":12>a?"Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡":17>a?"ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡":"Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶"},ordinalParse:/\d{1,2}|\d{1,2}-(Õ«Õ¶|Ö€Õ¤)/,ordinal:function(a,b){switch(b){case"DDD":case"w":case"W":case"DDDo":return 1===a?a+"-Õ«Õ¶":a+"-Ö€Õ¤";default:return a}},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"LT.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] LT",LLLL:"dddd, D MMMM YYYY [pukul] LT"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(a,b){return 12===a&&(a=0),"pagi"===b?a:"siang"===b?a>=11?a:a+12:"sore"===b||"malam"===b?a+12:void 0},meridiem:function(a){return 11>a?"pagi":15>a?"siang":19>a?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){function b(a){return a%100===11?!0:a%10===1?!1:!0}function c(a,c,d,e){var f=a+" ";switch(d){case"s":return c||e?"nokkrar sekúndur":"nokkrum sekúndum";case"m":return c?"mínúta":"mínútu";case"mm":return b(a)?f+(c||e?"mínútur":"mínútum"):c?f+"mínúta":f+"mínútu";case"hh":return b(a)?f+(c||e?"klukkustundir":"klukkustundum"):f+"klukkustund";case"d":return c?"dagur":e?"dag":"degi";case"dd":return b(a)?c?f+"dagar":f+(e?"daga":"dögum"):c?f+"dagur":f+(e?"dag":"degi");case"M":return c?"mánuður":e?"mánuð":"mánuði";case"MM":return b(a)?c?f+"mánuðir":f+(e?"mánuði":"mánuðum"):c?f+"mánuður":f+(e?"mánuð":"mánuði");case"y":return c||e?"ár":"ári";case"yy":return b(a)?f+(c||e?"ár":"árum"):f+(c||e?"ár":"ári")}}return a.defineLocale("is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd, D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:c,m:c,mm:c,h:"klukkustund",hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),weekdaysShort:"Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),weekdaysMin:"D_L_Ma_Me_G_V_S".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(a){return(/^[0-9].+$/.test(a)?"tra":"in")+" "+a},past:"%s fa",s:"alcuni secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_ç«æ›œæ—¥_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"æ—¥_月_ç«_æ°´_木_金_土".split("_"),weekdaysMin:"æ—¥_月_ç«_æ°´_木_金_土".split("_"),longDateFormat:{LT:"Ah時m分",LTS:"LTs秒",L:"YYYY/MM/DD",LL:"YYYYå¹´M月Dæ—¥",LLL:"YYYYå¹´M月Dæ—¥LT",LLLL:"YYYYå¹´M月Dæ—¥LT dddd"},meridiemParse:/åˆå‰|åˆå¾Œ/i,isPM:function(a){return"åˆå¾Œ"===a},meridiem:function(a){return 12>a?"åˆå‰":"åˆå¾Œ"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:"[æ¥é€±]dddd LT",lastDay:"[昨日] LT",lastWeek:"[å‰é€±]dddd LT",sameElse:"L"},relativeTime:{future:"%s後",past:"%så‰",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1æ—¥",dd:"%dæ—¥",M:"1ヶ月",MM:"%dヶ月",y:"1å¹´",yy:"%då¹´"}})}),function(a){a(vb)}(function(a){function b(a,b){var c={nominative:"იáƒáƒœáƒ•áƒáƒ áƒ˜_თებერვáƒáƒšáƒ˜_მáƒáƒ áƒ¢áƒ˜_áƒáƒžáƒ áƒ˜áƒšáƒ˜_მáƒáƒ˜áƒ¡áƒ˜_ივნისი_ივლისი_áƒáƒ’ვისტáƒ_სექტემბერი_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი_ნáƒáƒ”მბერი_დეკემბერი".split("_"),accusative:"იáƒáƒœáƒ•áƒáƒ áƒ¡_თებერვáƒáƒšáƒ¡_მáƒáƒ áƒ¢áƒ¡_áƒáƒžáƒ áƒ˜áƒšáƒ˜áƒ¡_მáƒáƒ˜áƒ¡áƒ¡_ივნისს_ივლისს_áƒáƒ’ვისტს_სექტემბერს_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერს_ნáƒáƒ”მბერს_დეკემბერს".split("_")},d=/D[oD] *MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function c(a,b){var c={nominative:"კვირáƒ_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ი_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი_ხუთშáƒáƒ‘áƒáƒ—ი_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი_შáƒáƒ‘áƒáƒ—ი".split("_"),accusative:"კვირáƒáƒ¡_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ს_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ს_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ს_ხუთშáƒáƒ‘áƒáƒ—ს_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვს_შáƒáƒ‘áƒáƒ—ს".split("_")},d=/(წინáƒ|შემდეგ)/.test(b)?"accusative":"nominative";return c[d][a.day()]}return a.defineLocale("ka",{months:b,monthsShort:"იáƒáƒœ_თებ_მáƒáƒ _áƒáƒžáƒ _მáƒáƒ˜_ივნ_ივლ_áƒáƒ’ვ_სექ_áƒáƒ¥áƒ¢_ნáƒáƒ”_დეკ".split("_"),weekdays:c,weekdaysShort:"კვი_áƒáƒ áƒ¨_სáƒáƒ›_áƒáƒ—ხ_ხუთ_პáƒáƒ _შáƒáƒ‘".split("_"),weekdaysMin:"კვ_áƒáƒ _სáƒ_áƒáƒ—_ხუ_პáƒ_შáƒ".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[დღეს] LT[-ზე]",nextDay:"[ხვáƒáƒš] LT[-ზე]",lastDay:"[გუშინ] LT[-ზე]",nextWeek:"[შემდეგ] dddd LT[-ზე]",lastWeek:"[წინáƒ] dddd LT-ზე",sameElse:"L"},relativeTime:{future:function(a){return/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|წელი)/.test(a)?a.replace(/ი$/,"ში"):a+"ში"},past:function(a){return/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|დღე|თვე)/.test(a)?a.replace(/(ი|ე)$/,"ის წინ"):/წელი/.test(a)?a.replace(/წელი$/,"წლის წინ"):void 0},s:"რáƒáƒ›áƒ“ენიმე წáƒáƒ›áƒ˜",m:"წუთი",mm:"%d წუთი",h:"სáƒáƒáƒ—ი",hh:"%d სáƒáƒáƒ—ი",d:"დღე",dd:"%d დღე",M:"თვე",MM:"%d თვე",y:"წელი",yy:"%d წელი"},ordinalParse:/0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/,ordinal:function(a){return 0===a?a:1===a?a+"-ლი":20>a||100>=a&&a%20===0||a%100===0?"მე-"+a:a+"-ე"},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("km",{months:"មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ".split("_"),monthsShort:"មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ".split("_"),weekdays:"អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ".split("_"),weekdaysShort:"អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ".split("_"),weekdaysMin:"អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[ážáŸ’ងៃនៈ ម៉ោង] LT",nextDay:"[ស្អែក ម៉ោង] LT",nextWeek:"dddd [ម៉ោង] LT",lastDay:"[ម្សិលមិញ ម៉ោង] LT",lastWeek:"dddd [សប្ážáž¶áž áŸáž˜áž»áž“] [ម៉ោង] LT",sameElse:"L"},relativeTime:{future:"%sទៀáž",past:"%sមុន",s:"ប៉ុន្មានវិនាទី",m:"មួយនាទី",mm:"%d នាទី",h:"មួយម៉ោង",hh:"%d ម៉ោង",d:"មួយážáŸ’ងៃ",dd:"%d ážáŸ’ងៃ",M:"មួយážáŸ‚",MM:"%d ážáŸ‚",y:"មួយឆ្នាំ",yy:"%d ឆ្នាំ"},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("ko",{months:"1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"),monthsShort:"1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"),weekdays:"ì¼ìš”ì¼_월요ì¼_화요ì¼_수요ì¼_목요ì¼_금요ì¼_토요ì¼".split("_"),weekdaysShort:"ì¼_ì›”_í™”_수_목_금_토".split("_"),weekdaysMin:"ì¼_ì›”_í™”_수_목_금_토".split("_"),longDateFormat:{LT:"A hì‹œ m분",LTS:"A hì‹œ m분 sì´ˆ",L:"YYYY.MM.DD",LL:"YYYYë…„ MMMM Dì¼",LLL:"YYYYë…„ MMMM Dì¼ LT",LLLL:"YYYYë…„ MMMM Dì¼ dddd LT"},calendar:{sameDay:"오늘 LT",nextDay:"ë‚´ì¼ LT",nextWeek:"dddd LT",lastDay:"ì–´ì œ LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s ì „",s:"몇초",ss:"%dì´ˆ",m:"ì¼ë¶„",mm:"%d분",h:"한시간",hh:"%d시간",d:"하루",dd:"%dì¼",M:"한달",MM:"%d달",y:"ì¼ë…„",yy:"%dë…„"},ordinalParse:/\d{1,2}ì¼/,ordinal:"%dì¼",meridiemParse:/오전|오후/,isPM:function(a){return"오후"===a},meridiem:function(a){return 12>a?"오전":"오후"}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return b?d[c][0]:d[c][1]}function c(a){var b=a.substr(0,a.indexOf(" "));return e(b)?"a "+a:"an "+a}function d(a){var b=a.substr(0,a.indexOf(" "));return e(b)?"viru "+a:"virun "+a}function e(a){if(a=parseInt(a,10),isNaN(a))return!1;if(0>a)return!0;if(10>a)return a>=4&&7>=a?!0:!1;if(100>a){var b=a%10,c=a/10;return e(0===b?c:b)}if(1e4>a){for(;a>=10;)a/=10;return e(a)}return a/=1e3,e(a)}return a.defineLocale("lb",{months:"Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._Mé._Dë._Më._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mé_Dë_Më_Do_Fr_Sa".split("_"),longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gëschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:c,past:d,s:"e puer Sekonnen",m:b,mm:"%d Minutten",h:b,hh:"%d Stonnen",d:b,dd:"%d Deeg",M:b,MM:"%d Méint",y:b,yy:"%d Joer"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c,d){return b?"kelios sekundÄ—s":d?"kelių sekundžių":"kelias sekundes"}function c(a,b,c,d){return b?e(c)[0]:d?e(c)[1]:e(c)[2] +}function d(a){return a%10===0||a>10&&20>a}function e(a){return h[a].split("_")}function f(a,b,f,g){var h=a+" ";return 1===a?h+c(a,b,f[0],g):b?h+(d(a)?e(f)[1]:e(f)[0]):g?h+e(f)[1]:h+(d(a)?e(f)[1]:e(f)[2])}function g(a,b){var c=-1===b.indexOf("dddd HH:mm"),d=i[a.day()];return c?d:d.substring(0,d.length-2)+"į"}var h={m:"minutÄ—_minutÄ—s_minutÄ™",mm:"minutÄ—s_minuÄių_minutes",h:"valanda_valandos_valandÄ…",hh:"valandos_valandų_valandas",d:"diena_dienos_dienÄ…",dd:"dienos_dienų_dienas",M:"mÄ—nuo_mÄ—nesio_mÄ—nesį",MM:"mÄ—nesiai_mÄ—nesių_mÄ—nesius",y:"metai_metų_metus",yy:"metai_metų_metus"},i="sekmadienis_pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis".split("_");return a.defineLocale("lt",{months:"sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio".split("_"),monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:g,weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Å eÅ¡".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Å ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], LT [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, LT [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], LT [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, LT [val.]"},calendar:{sameDay:"[Å iandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[PraÄ—jusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieÅ¡ %s",s:b,m:c,mm:f,h:c,hh:f,d:c,dd:f,M:c,MM:f,y:c,yy:f},ordinalParse:/\d{1,2}-oji/,ordinal:function(a){return a+"-oji"},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d=a.split("_");return c?b%10===1&&11!==b?d[2]:d[3]:b%10===1&&11!==b?d[0]:d[1]}function c(a,c,e){return a+" "+b(d[e],a,c)}var d={mm:"minÅ«ti_minÅ«tes_minÅ«te_minÅ«tes",hh:"stundu_stundas_stunda_stundas",dd:"dienu_dienas_diena_dienas",MM:"mÄ“nesi_mÄ“neÅ¡us_mÄ“nesis_mÄ“neÅ¡i",yy:"gadu_gadus_gads_gadi"};return a.defineLocale("lv",{months:"janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jÅ«n_jÅ«l_aug_sep_okt_nov_dec".split("_"),weekdays:"svÄ“tdiena_pirmdiena_otrdiena_treÅ¡diena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, LT",LLLL:"YYYY. [gada] D. MMMM, dddd, LT"},calendar:{sameDay:"[Å odien pulksten] LT",nextDay:"[RÄ«t pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[PagÄjuÅ¡Ä] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"%s vÄ“lÄk",past:"%s agrÄk",s:"dažas sekundes",m:"minÅ«ti",mm:c,h:"stundu",hh:c,d:"dienu",dd:c,M:"mÄ“nesi",MM:c,y:"gadu",yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("mk",{months:"јануари_февруари_март_април_мај_јуни_јули_авгуÑÑ‚_Ñептември_октомври_ноември_декември".split("_"),monthsShort:"јан_фев_мар_апр_мај_јун_јул_авг_Ñеп_окт_ное_дек".split("_"),weekdays:"недела_понеделник_вторник_Ñреда_четврток_петок_Ñабота".split("_"),weekdaysShort:"нед_пон_вто_Ñре_чет_пет_Ñаб".split("_"),weekdaysMin:"нe_пo_вт_ÑÑ€_че_пе_Ña".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Ð”ÐµÐ½ÐµÑ Ð²Ð¾] LT",nextDay:"[Утре во] LT",nextWeek:"dddd [во] LT",lastDay:"[Вчера во] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Во изминатата] dddd [во] LT";case 1:case 2:case 4:case 5:return"[Во изминатиот] dddd [во] LT"}},sameElse:"L"},relativeTime:{future:"поÑле %s",past:"пред %s",s:"неколку Ñекунди",m:"минута",mm:"%d минути",h:"чаÑ",hh:"%d чаÑа",d:"ден",dd:"%d дена",M:"меÑец",MM:"%d меÑеци",y:"година",yy:"%d години"},ordinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(a){var b=a%10,c=a%100;return 0===a?a+"-ев":0===c?a+"-ен":c>10&&20>c?a+"-ти":1===b?a+"-ви":2===b?a+"-ри":7===b||8===b?a+"-ми":a+"-ти"},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("ml",{months:"ജനàµà´µà´°à´¿_ഫെബàµà´°àµà´µà´°à´¿_മാർചàµà´šàµ_à´à´ªàµà´°à´¿àµ½_മേയàµ_ജൂൺ_ജൂലൈ_à´“à´—à´¸àµà´±àµà´±àµ_സെപàµà´±àµà´±à´‚ബർ_à´’à´•àµà´Ÿàµ‹à´¬àµ¼_നവംബർ_ഡിസംബർ".split("_"),monthsShort:"ജനàµ._ഫെബàµà´°àµ._മാർ._à´à´ªàµà´°à´¿._മേയàµ_ജൂൺ_ജൂലൈ._à´“à´—._സെപàµà´±àµà´±._à´’à´•àµà´Ÿàµ‹._നവം._ഡിസം.".split("_"),weekdays:"ഞായറാഴàµà´š_തിങàµà´•à´³à´¾à´´àµà´š_ചൊവàµà´µà´¾à´´àµà´š_à´¬àµà´§à´¨à´¾à´´àµà´š_à´µàµà´¯à´¾à´´à´¾à´´àµà´š_വെളàµà´³à´¿à´¯à´¾à´´àµà´š_ശനിയാഴàµà´š".split("_"),weekdaysShort:"ഞായർ_തിങàµà´•àµ¾_ചൊവàµà´µ_à´¬àµà´§àµ»_à´µàµà´¯à´¾à´´à´‚_വെളàµà´³à´¿_ശനി".split("_"),weekdaysMin:"à´žà´¾_തി_ചൊ_à´¬àµ_à´µàµà´¯à´¾_വെ_à´¶".split("_"),longDateFormat:{LT:"A h:mm -à´¨àµ",LTS:"A h:mm:ss -à´¨àµ",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[ഇനàµà´¨àµ] LT",nextDay:"[നാളെ] LT",nextWeek:"dddd, LT",lastDay:"[ഇനàµà´¨à´²àµ†] LT",lastWeek:"[à´•à´´à´¿à´žàµà´ž] dddd, LT",sameElse:"L"},relativeTime:{future:"%s à´•à´´à´¿à´žàµà´žàµ",past:"%s à´®àµàµ»à´ªàµ",s:"അൽപ നിമിഷങàµà´™àµ¾",m:"ഒരൠമിനിറàµà´±àµ",mm:"%d മിനിറàµà´±àµ",h:"ഒരൠമണികàµà´•àµ‚ർ",hh:"%d മണികàµà´•àµ‚ർ",d:"ഒരൠദിവസം",dd:"%d ദിവസം",M:"ഒരൠമാസം",MM:"%d മാസം",y:"ഒരൠവർഷം",yy:"%d വർഷം"},meridiemParse:/രാതàµà´°à´¿|രാവിലെ|ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿/i,isPM:function(a){return/^(ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿)$/.test(a)},meridiem:function(a){return 4>a?"രാതàµà´°à´¿":12>a?"രാവിലെ":17>a?"ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ":20>a?"വൈകàµà´¨àµà´¨àµ‡à´°à´‚":"രാതàµà´°à´¿"}})}),function(a){a(vb)}(function(a){var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return a.defineLocale("mr",{months:"जानेवारी_फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€_मारà¥à¤š_à¤à¤ªà¥à¤°à¤¿à¤²_मे_जून_जà¥à¤²à¥ˆ_ऑगसà¥à¤Ÿ_सपà¥à¤Ÿà¥‡à¤‚बर_ऑकà¥à¤Ÿà¥‹à¤¬à¤°_नोवà¥à¤¹à¥‡à¤‚बर_डिसेंबर".split("_"),monthsShort:"जाने._फेबà¥à¤°à¥._मारà¥à¤š._à¤à¤ªà¥à¤°à¤¿._मे._जून._जà¥à¤²à¥ˆ._ऑग._सपà¥à¤Ÿà¥‡à¤‚._ऑकà¥à¤Ÿà¥‹._नोवà¥à¤¹à¥‡à¤‚._डिसें.".split("_"),weekdays:"रविवार_सोमवार_मंगळवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगळ_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि".split("_"),weekdaysMin:"र_सो_मं_बà¥_गà¥_शà¥_श".split("_"),longDateFormat:{LT:"A h:mm वाजता",LTS:"A h:mm:ss वाजता",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[आज] LT",nextDay:"[उदà¥à¤¯à¤¾] LT",nextWeek:"dddd, LT",lastDay:"[काल] LT",lastWeek:"[मागील] dddd, LT",sameElse:"L"},relativeTime:{future:"%s नंतर",past:"%s पूरà¥à¤µà¥€",s:"सेकंद",m:"à¤à¤• मिनिट",mm:"%d मिनिटे",h:"à¤à¤• तास",hh:"%d तास",d:"à¤à¤• दिवस",dd:"%d दिवस",M:"à¤à¤• महिना",MM:"%d महिने",y:"à¤à¤• वरà¥à¤·",yy:"%d वरà¥à¤·à¥‡"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/रातà¥à¤°à¥€|सकाळी|दà¥à¤ªà¤¾à¤°à¥€|सायंकाळी/,meridiemHour:function(a,b){return 12===a&&(a=0),"रातà¥à¤°à¥€"===b?4>a?a:a+12:"सकाळी"===b?a:"दà¥à¤ªà¤¾à¤°à¥€"===b?a>=10?a:a+12:"सायंकाळी"===b?a+12:void 0},meridiem:function(a){return 4>a?"रातà¥à¤°à¥€":10>a?"सकाळी":17>a?"दà¥à¤ªà¤¾à¤°à¥€":20>a?"सायंकाळी":"रातà¥à¤°à¥€"},week:{dow:0,doy:6}})}),function(a){a(vb)}(function(a){return a.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"LT.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] LT",LLLL:"dddd, D MMMM YYYY [pukul] LT"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(a,b){return 12===a&&(a=0),"pagi"===b?a:"tengahari"===b?a>=11?a:a+12:"petang"===b||"malam"===b?a+12:void 0},meridiem:function(a){return 11>a?"pagi":15>a?"tengahari":19>a?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){var b={1:"á",2:"á‚",3:"áƒ",4:"á„",5:"á…",6:"á†",7:"á‡",8:"áˆ",9:"á‰",0:"á€"},c={"á":"1","á‚":"2","áƒ":"3","á„":"4","á…":"5","á†":"6","á‡":"7","áˆ":"8","á‰":"9","á€":"0"};return a.defineLocale("my",{months:"ဇန်နá€á€«á€›á€®_ဖေဖော်á€á€«á€›á€®_မá€á€º_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုá€á€º_စက်á€á€„်ဘာ_အောက်á€á€­á€¯á€˜á€¬_နိုá€á€„်ဘာ_ဒီဇင်ဘာ".split("_"),monthsShort:"ဇန်_ဖေ_မá€á€º_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ".split("_"),weekdays:"á€á€”င်္ဂနွေ_á€á€”င်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပá€á€±á€¸_သောကြာ_စနေ".split("_"),weekdaysShort:"နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),weekdaysMin:"နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[ယနေ.] LT [မှာ]",nextDay:"[မနက်ဖြန်] LT [မှာ]",nextWeek:"dddd LT [မှာ]",lastDay:"[မနေ.က] LT [မှာ]",lastWeek:"[ပြီးá€á€²á€·á€žá€±á€¬] dddd LT [မှာ]",sameElse:"L"},relativeTime:{future:"လာမည့် %s မှာ",past:"လွန်á€á€²á€·á€žá€±á€¬ %s က",s:"စက္ကန်.အနည်းငယ်",m:"á€á€…်မိနစ်",mm:"%d မိနစ်",h:"á€á€…်နာရီ",hh:"%d နာရီ",d:"á€á€…်ရက်",dd:"%d ရက်",M:"á€á€…်လ",MM:"%d လ",y:"á€á€…်နှစ်",yy:"%d နှစ်"},preparse:function(a){return a.replace(/[áá‚áƒá„á…á†á‡áˆá‰á€]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tirs_ons_tors_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"H.mm",LTS:"LT.ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i gÃ¥r kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"for %s siden",s:"noen sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en mÃ¥ned",MM:"%d mÃ¥neder",y:"ett Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return a.defineLocale("ne",{months:"जनवरी_फेबà¥à¤°à¥à¤µà¤°à¥€_मारà¥à¤š_अपà¥à¤°à¤¿à¤²_मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ_अगषà¥à¤Ÿ_सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°_अकà¥à¤Ÿà¥‹à¤¬à¤°_नोभेमà¥à¤¬à¤°_डिसेमà¥à¤¬à¤°".split("_"),monthsShort:"जन._फेबà¥à¤°à¥._मारà¥à¤š_अपà¥à¤°à¤¿._मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ._अग._सेपà¥à¤Ÿ._अकà¥à¤Ÿà¥‹._नोभे._डिसे.".split("_"),weekdays:"आइतबार_सोमबार_मङà¥à¤—लबार_बà¥à¤§à¤¬à¤¾à¤°_बिहिबार_शà¥à¤•à¥à¤°à¤¬à¤¾à¤°_शनिबार".split("_"),weekdaysShort:"आइत._सोम._मङà¥à¤—ल._बà¥à¤§._बिहि._शà¥à¤•à¥à¤°._शनि.".split("_"),weekdaysMin:"आइ._सो._मङà¥_बà¥._बि._शà¥._श.".split("_"),longDateFormat:{LT:"Aको h:mm बजे",LTS:"Aको h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/राती|बिहान|दिउà¤à¤¸à¥‹|बेलà¥à¤•à¤¾|साà¤à¤|राती/,meridiemHour:function(a,b){return 12===a&&(a=0),"राती"===b?3>a?a:a+12:"बिहान"===b?a:"दिउà¤à¤¸à¥‹"===b?a>=10?a:a+12:"बेलà¥à¤•à¤¾"===b||"साà¤à¤"===b?a+12:void 0},meridiem:function(a){return 3>a?"राती":10>a?"बिहान":15>a?"दिउà¤à¤¸à¥‹":18>a?"बेलà¥à¤•à¤¾":20>a?"साà¤à¤":"राती"},calendar:{sameDay:"[आज] LT",nextDay:"[भोली] LT",nextWeek:"[आउà¤à¤¦à¥‹] dddd[,] LT",lastDay:"[हिजो] LT",lastWeek:"[गà¤à¤•à¥‹] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%sमा",past:"%s अगाडी",s:"केही समय",m:"à¤à¤• मिनेट",mm:"%d मिनेट",h:"à¤à¤• घणà¥à¤Ÿà¤¾",hh:"%d घणà¥à¤Ÿà¤¾",d:"à¤à¤• दिन",dd:"%d दिन",M:"à¤à¤• महिना",MM:"%d महिना",y:"à¤à¤• बरà¥à¤·",yy:"%d बरà¥à¤·"},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){var b="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),c="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_");return a.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(a,d){return/-MMM-/.test(d)?c[a.month()]:b[a.month()]},weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_mÃ¥ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_mÃ¥n_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_mÃ¥_ty_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I gÃ¥r klokka] LT",lastWeek:"[FøregÃ¥ande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"for %s sidan",s:"nokre sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",M:"ein mÃ¥nad",MM:"%d mÃ¥nader",y:"eit Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a){return 5>a%10&&a%10>1&&~~(a/10)%10!==1}function c(a,c,d){var e=a+" ";switch(d){case"m":return c?"minuta":"minutÄ™";case"mm":return e+(b(a)?"minuty":"minut");case"h":return c?"godzina":"godzinÄ™";case"hh":return e+(b(a)?"godziny":"godzin");case"MM":return e+(b(a)?"miesiÄ…ce":"miesiÄ™cy");case"yy":return e+(b(a)?"lata":"lat")}}var d="styczeÅ„_luty_marzec_kwiecieÅ„_maj_czerwiec_lipiec_sierpieÅ„_wrzesieÅ„_październik_listopad_grudzieÅ„".split("_"),e="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrzeÅ›nia_października_listopada_grudnia".split("_");return a.defineLocale("pl",{months:function(a,b){return/D MMMM/.test(b)?e[a.month()]:d[a.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziaÅ‚ek_wtorek_Å›roda_czwartek_piÄ…tek_sobota".split("_"),weekdaysShort:"nie_pon_wt_Å›r_czw_pt_sb".split("_"),weekdaysMin:"N_Pn_Wt_Åšr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[DziÅ› o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszÅ‚Ä… niedzielÄ™ o] LT";case 3:return"[W zeszÅ‚Ä… Å›rodÄ™ o] LT";case 6:return"[W zeszÅ‚Ä… sobotÄ™ o] LT";default:return"[W zeszÅ‚y] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:c,mm:c,h:c,hh:c,d:"1 dzieÅ„",dd:"%d dni",M:"miesiÄ…c",MM:c,y:"rok",yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("pt-br",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] LT",LLLL:"dddd, D [de] MMMM [de] YYYY [às] LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº"})}),function(a){a(vb)}(function(a){return a.defineLocale("pt",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d={mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"},e=" ";return(a%100>=20||a>=100&&a%100===0)&&(e=" de "),a+e+d[c]}return a.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),weekdays:"duminică_luni_marÈ›i_miercuri_joi_vineri_sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",m:"un minut",mm:b,h:"o oră",hh:b,d:"o zi",dd:b,M:"o lună",MM:b,y:"un an",yy:b},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){function b(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:c?"минута_минуты_минут":"минуту_минуты_минут",hh:"чаÑ_чаÑа_чаÑов",dd:"день_днÑ_дней",MM:"меÑÑц_меÑÑца_меÑÑцев",yy:"год_года_лет"};return"m"===d?c?"минута":"минуту":a+" "+b(e[d],+a)}function d(a,b){var c={nominative:"Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь".split("_"),accusative:"ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function e(a,b){var c={nominative:"Ñнв_фев_март_апр_май_июнь_июль_авг_Ñен_окт_ноÑ_дек".split("_"),accusative:"Ñнв_фев_мар_апр_маÑ_июнÑ_июлÑ_авг_Ñен_окт_ноÑ_дек".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function f(a,b){var c={nominative:"воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота".split("_"),accusative:"воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу".split("_")},d=/\[ ?[Вв] ?(?:прошлую|Ñледующую|Ñту)? ?\] ?dddd/.test(b)?"accusative":"nominative";return c[d][a.day()]}return a.defineLocale("ru",{months:d,monthsShort:e,weekdays:f,weekdaysShort:"вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),weekdaysMin:"вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),monthsParse:[/^Ñнв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[й|Ñ]/i,/^июн/i,/^июл/i,/^авг/i,/^Ñен/i,/^окт/i,/^ноÑ/i,/^дек/i],longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., LT",LLLL:"dddd, D MMMM YYYY г., LT"},calendar:{sameDay:"[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT",nextDay:"[Завтра в] LT",lastDay:"[Вчера в] LT",nextWeek:function(){return 2===this.day()?"[Во] dddd [в] LT":"[Ð’] dddd [в] LT"},lastWeek:function(a){if(a.week()===this.week())return 2===this.day()?"[Во] dddd [в] LT":"[Ð’] dddd [в] LT";switch(this.day()){case 0:return"[Ð’ прошлое] dddd [в] LT";case 1:case 2:case 4:return"[Ð’ прошлый] dddd [в] LT";case 3:case 5:case 6:return"[Ð’ прошлую] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"неÑколько Ñекунд",m:c,mm:c,h:"чаÑ",hh:c,d:"день",dd:c,M:"меÑÑц",MM:c,y:"год",yy:c},meridiemParse:/ночи|утра|днÑ|вечера/i,isPM:function(a){return/^(днÑ|вечера)$/.test(a)},meridiem:function(a){return 4>a?"ночи":12>a?"утра":17>a?"днÑ":"вечера"},ordinalParse:/\d{1,2}-(й|го|Ñ)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":return a+"-й";case"D":return a+"-го";case"w":case"W":return a+"-Ñ";default:return a}},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){function b(a){return a>1&&5>a}function c(a,c,d,e){var f=a+" ";switch(d){case"s":return c||e?"pár sekúnd":"pár sekundami";case"m":return c?"minúta":e?"minútu":"minútou";case"mm":return c||e?f+(b(a)?"minúty":"minút"):f+"minútami";break;case"h":return c?"hodina":e?"hodinu":"hodinou";case"hh":return c||e?f+(b(a)?"hodiny":"hodín"):f+"hodinami";break;case"d":return c||e?"deň":"dňom";case"dd":return c||e?f+(b(a)?"dni":"dní"):f+"dňami";break;case"M":return c||e?"mesiac":"mesiacom";case"MM":return c||e?f+(b(a)?"mesiace":"mesiacov"):f+"mesiacmi";break;case"y":return c||e?"rok":"rokom";case"yy":return c||e?f+(b(a)?"roky":"rokov"):f+"rokmi"}}var d="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),e="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");return a.defineLocale("sk",{months:d,monthsShort:e,monthsParse:function(a,b){var c,d=[];for(c=0;12>c;c++)d[c]=new RegExp("^"+a[c]+"$|^"+b[c]+"$","i");return d}(d,e),weekdays:"nedeľa_pondelok_utorok_streda_Å¡tvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_Å¡t_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_Å¡t_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo Å¡tvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[vÄera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT";case 1:case 2:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 4:case 5:return"[minulý] dddd [o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d=a+" ";switch(c){case"m":return b?"ena minuta":"eno minuto";case"mm":return d+=1===a?"minuta":2===a?"minuti":3===a||4===a?"minute":"minut";case"h":return b?"ena ura":"eno uro";case"hh":return d+=1===a?"ura":2===a?"uri":3===a||4===a?"ure":"ur";case"dd":return d+=1===a?"dan":"dni";case"MM":return d+=1===a?"mesec":2===a?"meseca":3===a||4===a?"mesece":"mesecev";case"yy":return d+=1===a?"leto":2===a?"leti":3===a||4===a?"leta":"let"}}return a.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),weekdays:"nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._Äet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_Äe_pe_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[vÄeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[prejÅ¡nja] dddd [ob] LT";case 1:case 2:case 4:case 5:return"[prejÅ¡nji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"Äez %s",past:"%s nazaj",s:"nekaj sekund",m:b,mm:b,h:b,hh:b,d:"en dan",dd:b,M:"en mesec",MM:b,y:"eno leto",yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"),weekdays:"E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë".split("_"),weekdaysShort:"Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_Më_E_P_Sh".split("_"),meridiemParse:/PD|MD/,isPM:function(a){return"M"===a.charAt(0)},meridiem:function(a){return 12>a?"PD":"MD"},longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Sot në] LT",nextDay:"[Nesër në] LT",nextWeek:"dddd [në] LT",lastDay:"[Dje në] LT",lastWeek:"dddd [e kaluar në] LT",sameElse:"L"},relativeTime:{future:"në %s",past:"%s më parë",s:"disa sekonda",m:"një minutë",mm:"%d minuta",h:"një orë",hh:"%d orë",d:"një ditë",dd:"%d ditë",M:"një muaj",MM:"%d muaj",y:"një vit",yy:"%d vite"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){var b={words:{m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један Ñат","једног Ñата"],hh:["Ñат","Ñата","Ñати"],dd:["дан","дана","дана"],MM:["меÑец","меÑеца","меÑеци"],yy:["година","године","година"]},correctGrammaticalCase:function(a,b){return 1===a?b[0]:a>=2&&4>=a?b[1]:b[2]},translate:function(a,c,d){var e=b.words[d];return 1===d.length?c?e[0]:e[1]:a+" "+b.correctGrammaticalCase(a,e)}};return a.defineLocale("sr-cyrl",{months:["јануар","фебруар","март","април","мај","јун","јул","авгуÑÑ‚","Ñептембар","октобар","новембар","децембар"],monthsShort:["јан.","феб.","мар.","апр.","мај","јун","јул","авг.","Ñеп.","окт.","нов.","дец."],weekdays:["недеља","понедељак","уторак","Ñреда","четвртак","петак","Ñубота"],weekdaysShort:["нед.","пон.","уто.","Ñре.","чет.","пет.","Ñуб."],weekdaysMin:["не","по","ут","ÑÑ€","че","пе","Ñу"],longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Ð´Ð°Ð½Ð°Ñ Ñƒ] LT",nextDay:"[Ñутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [Ñреду] [у] LT";case 6:return"[у] [Ñуботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){var a=["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [Ñреде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [Ñуботе] [у] LT"];return a[this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико Ñекунди",m:b.translate,mm:b.translate,h:b.translate,hh:b.translate,d:"дан",dd:b.translate,M:"меÑец",MM:b.translate,y:"годину",yy:b.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){var b={words:{m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(a,b){return 1===a?b[0]:a>=2&&4>=a?b[1]:b[2]},translate:function(a,c,d){var e=b.words[d];return 1===d.length?c?e[0]:e[1]:a+" "+b.correctGrammaticalCase(a,e)}};return a.defineLocale("sr",{months:["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar"],monthsShort:["jan.","feb.","mar.","apr.","maj","jun","jul","avg.","sep.","okt.","nov.","dec."],weekdays:["nedelja","ponedeljak","utorak","sreda","Äetvrtak","petak","subota"],weekdaysShort:["ned.","pon.","uto.","sre.","Äet.","pet.","sub."],weekdaysMin:["ne","po","ut","sr","Äe","pe","su"],longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄe u] LT",lastWeek:function(){var a=["[proÅ¡le] [nedelje] [u] LT","[proÅ¡log] [ponedeljka] [u] LT","[proÅ¡log] [utorka] [u] LT","[proÅ¡le] [srede] [u] LT","[proÅ¡log] [Äetvrtka] [u] LT","[proÅ¡log] [petka] [u] LT","[proÅ¡le] [subote] [u] LT"];return a[this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",m:b.translate,mm:b.translate,h:b.translate,hh:b.translate,d:"dan",dd:b.translate,M:"mesec",MM:b.translate,y:"godinu",yy:b.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_mÃ¥ndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mÃ¥n_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_mÃ¥_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[IgÃ¥r] LT",nextWeek:"dddd LT",lastWeek:"[Förra] dddd[en] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"nÃ¥gra sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en mÃ¥nad",MM:"%d mÃ¥nader",y:"ett Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}(e|a)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"e":1===b?"a":2===b?"a":"e";return a+c},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("ta",{months:"ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯".split("_"),monthsShort:"ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯".split("_"),weekdays:"ஞாயிறà¯à®±à¯à®•à¯à®•à®¿à®´à®®à¯ˆ_திஙà¯à®•à®Ÿà¯à®•à®¿à®´à®®à¯ˆ_செவà¯à®µà®¾à®¯à¯à®•à®¿à®´à®®à¯ˆ_பà¯à®¤à®©à¯à®•à®¿à®´à®®à¯ˆ_வியாழகà¯à®•à®¿à®´à®®à¯ˆ_வெளà¯à®³à®¿à®•à¯à®•à®¿à®´à®®à¯ˆ_சனிகà¯à®•à®¿à®´à®®à¯ˆ".split("_"),weekdaysShort:"ஞாயிறà¯_திஙà¯à®•à®³à¯_செவà¯à®µà®¾à®¯à¯_பà¯à®¤à®©à¯_வியாழனà¯_வெளà¯à®³à®¿_சனி".split("_"),weekdaysMin:"ஞா_தி_செ_பà¯_வி_வெ_ச".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[இனà¯à®±à¯] LT",nextDay:"[நாளை] LT",nextWeek:"dddd, LT",lastDay:"[நேறà¯à®±à¯] LT",lastWeek:"[கடநà¯à®¤ வாரமà¯] dddd, LT",sameElse:"L"},relativeTime:{future:"%s இலà¯",past:"%s à®®à¯à®©à¯",s:"ஒர௠சில விநாடிகளà¯",m:"ஒர௠நிமிடமà¯",mm:"%d நிமிடஙà¯à®•à®³à¯",h:"ஒர௠மணி நேரமà¯",hh:"%d மணி நேரமà¯",d:"ஒர௠நாளà¯",dd:"%d நாடà¯à®•à®³à¯",M:"ஒர௠மாதமà¯",MM:"%d மாதஙà¯à®•à®³à¯",y:"ஒர௠வரà¯à®Ÿà®®à¯",yy:"%d ஆணà¯à®Ÿà¯à®•à®³à¯"},ordinalParse:/\d{1,2}வதà¯/,ordinal:function(a){return a+"வதà¯"},meridiemParse:/யாமமà¯|வைகறை|காலை|நணà¯à®ªà®•à®²à¯|எறà¯à®ªà®¾à®Ÿà¯|மாலை/,meridiem:function(a){return 2>a?" யாமமà¯":6>a?" வைகறை":10>a?" காலை":14>a?" நணà¯à®ªà®•à®²à¯":18>a?" எறà¯à®ªà®¾à®Ÿà¯":22>a?" மாலை":" யாமமà¯"},meridiemHour:function(a,b){return 12===a&&(a=0),"யாமமà¯"===b?2>a?a:a+12:"வைகறை"===b||"காலை"===b?a:"நணà¯à®ªà®•à®²à¯"===b&&a>=10?a:a+12},week:{dow:0,doy:6}})}),function(a){a(vb)}(function(a){return a.defineLocale("th",{months:"มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม".split("_"),monthsShort:"มà¸à¸£à¸²_à¸à¸¸à¸¡à¸ à¸²_มีนา_เมษา_พฤษภา_มิถุนา_à¸à¸£à¸à¸Žà¸²_สิงหา_à¸à¸±à¸™à¸¢à¸²_ตุลา_พฤศจิà¸à¸²_ธันวา".split("_"),weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),longDateFormat:{LT:"H นาฬิà¸à¸² m นาที",LTS:"LT s วินาที",L:"YYYY/MM/DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา LT",LLLL:"วันddddที่ D MMMM YYYY เวลา LT"},meridiemParse:/à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง|หลังเที่ยง/,isPM:function(a){return"หลังเที่ยง"===a +},meridiem:function(a){return 12>a?"à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่à¹à¸¥à¹‰à¸§ เวลา] LT",sameElse:"L"},relativeTime:{future:"อีภ%s",past:"%sที่à¹à¸¥à¹‰à¸§",s:"ไม่à¸à¸µà¹ˆà¸§à¸´à¸™à¸²à¸—ี",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"}})}),function(a){a(vb)}(function(a){return a.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY LT",LLLL:"dddd, MMMM DD, YYYY LT"},calendar:{sameDay:"[Ngayon sa] LT",nextDay:"[Bukas sa] LT",nextWeek:"dddd [sa] LT",lastDay:"[Kahapon sa] LT",lastWeek:"dddd [huling linggo] LT",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},ordinalParse:/\d{1,2}/,ordinal:function(a){return a},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){var b={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"};return a.defineLocale("tr",{months:"Ocak_Åžubat_Mart_Nisan_Mayıs_Haziran_Temmuz_AÄŸustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_ÇarÅŸamba_PerÅŸembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[haftaya] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen hafta] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinalParse:/\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/,ordinal:function(a){if(0===a)return a+"'ıncı";var c=a%10,d=a%100-c,e=a>=100?100:null;return a+(b[c]||b[d]||b[e])},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("tzm-latn",{months:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",m:"minuá¸",mm:"%d minuá¸",h:"saÉ›a",hh:"%d tassaÉ›in",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})}),function(a){a(vb)}(function(a){return a.defineLocale("tzm",{months:"ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”".split("_"),monthsShort:"ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”".split("_"),weekdays:"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysShort:"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysMin:"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[ⴰⵙⴷⵅ â´´] LT",nextDay:"[ⴰⵙⴽⴰ â´´] LT",nextWeek:"dddd [â´´] LT",lastDay:"[ⴰⵚⴰâµâµœ â´´] LT",lastWeek:"dddd [â´´] LT",sameElse:"L"},relativeTime:{future:"â´·â´°â´·âµ… âµ™ ⵢⴰⵠ%s",past:"ⵢⴰⵠ%s",s:"ⵉⵎⵉⴽ",m:"ⵎⵉâµâµ“â´º",mm:"%d ⵎⵉâµâµ“â´º",h:"ⵙⴰⵄⴰ",hh:"%d ⵜⴰⵙⵙⴰⵄⵉâµ",d:"ⴰⵙⵙ",dd:"%d oⵙⵙⴰâµ",M:"â´°âµ¢oⵓⵔ",MM:"%d ⵉⵢⵢⵉⵔâµ",y:"ⴰⵙⴳⴰⵙ",yy:"%d ⵉⵙⴳⴰⵙâµ"},week:{dow:6,doy:12}})}),function(a){a(vb)}(function(a){function b(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:"хвилина_хвилини_хвилин",hh:"година_години_годин",dd:"день_дні_днів",MM:"міÑÑць_міÑÑці_міÑÑців",yy:"рік_роки_років"};return"m"===d?c?"хвилина":"хвилину":"h"===d?c?"година":"годину":a+" "+b(e[d],+a)}function d(a,b){var c={nominative:"Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень".split("_"),accusative:"ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ".split("_")},d=/D[oD]? *MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function e(a,b){var c={nominative:"неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота".split("_"),accusative:"неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу".split("_"),genitive:"неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи".split("_")},d=/(\[[ВвУу]\]) ?dddd/.test(b)?"accusative":/\[?(?:минулої|наÑтупної)? ?\] ?dddd/.test(b)?"genitive":"nominative";return c[d][a.day()]}function f(a){return function(){return a+"о"+(11===this.hours()?"б":"")+"] LT"}}return a.defineLocale("uk",{months:d,monthsShort:"Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд".split("_"),weekdays:e,weekdaysShort:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),weekdaysMin:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY Ñ€.",LLL:"D MMMM YYYY Ñ€., LT",LLLL:"dddd, D MMMM YYYY Ñ€., LT"},calendar:{sameDay:f("[Сьогодні "),nextDay:f("[Завтра "),lastDay:f("[Вчора "),nextWeek:f("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return f("[Минулої] dddd [").call(this);case 1:case 2:case 4:return f("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька Ñекунд",m:c,mm:c,h:"годину",hh:c,d:"день",dd:c,M:"міÑÑць",MM:c,y:"рік",yy:c},meridiemParse:/ночі|ранку|днÑ|вечора/,isPM:function(a){return/^(днÑ|вечора)$/.test(a)},meridiem:function(a){return 4>a?"ночі":12>a?"ранку":17>a?"днÑ":"вечора"},ordinalParse:/\d{1,2}-(й|го)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":case"w":case"W":return a+"-й";case"D":return a+"-го";default:return a}},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("uz",{months:"Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь".split("_"),monthsShort:"Ñнв_фев_мар_апр_май_июн_июл_авг_Ñен_окт_ноÑ_дек".split("_"),weekdays:"Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"),weekdaysShort:"Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"),weekdaysMin:"Як_Ду_Се_Чо_Па_Жу_Ша".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"D MMMM YYYY, dddd LT"},calendar:{sameDay:"[Бугун Ñоат] LT [да]",nextDay:"[Эртага] LT [да]",nextWeek:"dddd [куни Ñоат] LT [да]",lastDay:"[Кеча Ñоат] LT [да]",lastWeek:"[Утган] dddd [куни Ñоат] LT [да]",sameElse:"L"},relativeTime:{future:"Якин %s ичида",past:"Бир неча %s олдин",s:"фурÑат",m:"бир дакика",mm:"%d дакика",h:"бир Ñоат",hh:"%d Ñоат",d:"бир кун",dd:"%d кун",M:"бир ой",MM:"%d ой",y:"бир йил",yy:"%d йил"},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("vi",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),weekdays:"chủ nhật_thứ hai_thứ ba_thứ tÆ°_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY LT",LLLL:"dddd, D MMMM [năm] YYYY LT",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY LT",llll:"ddd, D MMM YYYY LT"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tá»›i lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần rồi lúc] LT",sameElse:"L"},relativeTime:{future:"%s tá»›i",past:"%s trÆ°á»›c",s:"vài giây",m:"má»™t phút",mm:"%d phút",h:"má»™t giá»",hh:"%d giá»",d:"má»™t ngày",dd:"%d ngày",M:"má»™t tháng",MM:"%d tháng",y:"má»™t năm",yy:"%d năm"},ordinalParse:/\d{1,2}/,ordinal:function(a){return a},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"æ—¥_一_二_三_å››_五_å…­".split("_"),longDateFormat:{LT:"Ah点mm",LTS:"Ah点m分s秒",L:"YYYY-MM-DD",LL:"YYYYå¹´MMMDæ—¥",LLL:"YYYYå¹´MMMDæ—¥LT",LLLL:"YYYYå¹´MMMDæ—¥ddddLT",l:"YYYY-MM-DD",ll:"YYYYå¹´MMMDæ—¥",lll:"YYYYå¹´MMMDæ—¥LT",llll:"YYYYå¹´MMMDæ—¥ddddLT"},meridiemParse:/凌晨|早上|上åˆ|中åˆ|下åˆ|晚上/,meridiemHour:function(a,b){return 12===a&&(a=0),"凌晨"===b||"早上"===b||"上åˆ"===b?a:"下åˆ"===b||"晚上"===b?a+12:a>=11?a:a+12},meridiem:function(a,b){var c=100*a+b;return 600>c?"凌晨":900>c?"早上":1130>c?"上åˆ":1230>c?"中åˆ":1800>c?"下åˆ":"晚上"},calendar:{sameDay:function(){return 0===this.minutes()?"[今天]Ah[点整]":"[今天]LT"},nextDay:function(){return 0===this.minutes()?"[明天]Ah[点整]":"[明天]LT"},lastDay:function(){return 0===this.minutes()?"[昨天]Ah[点整]":"[昨天]LT"},nextWeek:function(){var b,c;return b=a().startOf("week"),c=this.unix()-b.unix()>=604800?"[下]":"[本]",0===this.minutes()?c+"dddAh点整":c+"dddAh点mm"},lastWeek:function(){var b,c;return b=a().startOf("week"),c=this.unix()=11?a:a+12:"下åˆ"===b||"晚上"===b?a+12:void 0},meridiem:function(a,b){var c=100*a+b;return 900>c?"早上":1130>c?"上åˆ":1230>c?"中åˆ":1800>c?"下åˆ":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},ordinalParse:/\d{1,2}(æ—¥|月|週)/,ordinal:function(a,b){switch(b){case"d":case"D":case"DDD":return a+"æ—¥";case"M":return a+"月";case"w":case"W":return a+"週";default:return a}},relativeTime:{future:"%så…§",past:"%så‰",s:"幾秒",m:"一分é˜",mm:"%d分é˜",h:"一å°æ™‚",hh:"%då°æ™‚",d:"一天",dd:"%d天",M:"一個月",MM:"%d個月",y:"一年",yy:"%då¹´"}})}),vb.locale("en"),Lb?module.exports=vb:"function"==typeof define&&define.amd?(define(function(a,b,c){return c.config&&c.config()&&c.config().noGlobal===!0&&(zb.moment=wb),vb}),ub(!0)):ub()}).call(this); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/min/moment.min.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/min/moment.min.js new file mode 100644 index 0000000..024d488 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/min/moment.min.js @@ -0,0 +1,7 @@ +//! moment.js +//! version : 2.9.0 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com +(function(a){function b(a,b,c){switch(arguments.length){case 2:return null!=a?a:b;case 3:return null!=a?a:null!=b?b:c;default:throw new Error("Implement me")}}function c(a,b){return Bb.call(a,b)}function d(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function e(a){vb.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+a)}function f(a,b){var c=!0;return o(function(){return c&&(e(a),c=!1),b.apply(this,arguments)},b)}function g(a,b){sc[a]||(e(b),sc[a]=!0)}function h(a,b){return function(c){return r(a.call(this,c),b)}}function i(a,b){return function(c){return this.localeData().ordinal(a.call(this,c),b)}}function j(a,b){var c,d,e=12*(b.year()-a.year())+(b.month()-a.month()),f=a.clone().add(e,"months");return 0>b-f?(c=a.clone().add(e-1,"months"),d=(b-f)/(f-c)):(c=a.clone().add(e+1,"months"),d=(b-f)/(c-f)),-(e+d)}function k(a,b,c){var d;return null==c?b:null!=a.meridiemHour?a.meridiemHour(b,c):null!=a.isPM?(d=a.isPM(c),d&&12>b&&(b+=12),d||12!==b||(b=0),b):b}function l(){}function m(a,b){b!==!1&&H(a),p(this,a),this._d=new Date(+a._d),uc===!1&&(uc=!0,vb.updateOffset(this),uc=!1)}function n(a){var b=A(a),c=b.year||0,d=b.quarter||0,e=b.month||0,f=b.week||0,g=b.day||0,h=b.hour||0,i=b.minute||0,j=b.second||0,k=b.millisecond||0;this._milliseconds=+k+1e3*j+6e4*i+36e5*h,this._days=+g+7*f,this._months=+e+3*d+12*c,this._data={},this._locale=vb.localeData(),this._bubble()}function o(a,b){for(var d in b)c(b,d)&&(a[d]=b[d]);return c(b,"toString")&&(a.toString=b.toString),c(b,"valueOf")&&(a.valueOf=b.valueOf),a}function p(a,b){var c,d,e;if("undefined"!=typeof b._isAMomentObject&&(a._isAMomentObject=b._isAMomentObject),"undefined"!=typeof b._i&&(a._i=b._i),"undefined"!=typeof b._f&&(a._f=b._f),"undefined"!=typeof b._l&&(a._l=b._l),"undefined"!=typeof b._strict&&(a._strict=b._strict),"undefined"!=typeof b._tzm&&(a._tzm=b._tzm),"undefined"!=typeof b._isUTC&&(a._isUTC=b._isUTC),"undefined"!=typeof b._offset&&(a._offset=b._offset),"undefined"!=typeof b._pf&&(a._pf=b._pf),"undefined"!=typeof b._locale&&(a._locale=b._locale),Kb.length>0)for(c in Kb)d=Kb[c],e=b[d],"undefined"!=typeof e&&(a[d]=e);return a}function q(a){return 0>a?Math.ceil(a):Math.floor(a)}function r(a,b,c){for(var d=""+Math.abs(a),e=a>=0;d.lengthd;d++)(c&&a[d]!==b[d]||!c&&C(a[d])!==C(b[d]))&&g++;return g+f}function z(a){if(a){var b=a.toLowerCase().replace(/(.)s$/,"$1");a=lc[a]||mc[b]||b}return a}function A(a){var b,d,e={};for(d in a)c(a,d)&&(b=z(d),b&&(e[b]=a[d]));return e}function B(b){var c,d;if(0===b.indexOf("week"))c=7,d="day";else{if(0!==b.indexOf("month"))return;c=12,d="month"}vb[b]=function(e,f){var g,h,i=vb._locale[b],j=[];if("number"==typeof e&&(f=e,e=a),h=function(a){var b=vb().utc().set(d,a);return i.call(vb._locale,b,e||"")},null!=f)return h(f);for(g=0;c>g;g++)j.push(h(g));return j}}function C(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=b>=0?Math.floor(b):Math.ceil(b)),c}function D(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function E(a,b,c){return jb(vb([a,11,31+b-c]),b,c).week}function F(a){return G(a)?366:365}function G(a){return a%4===0&&a%100!==0||a%400===0}function H(a){var b;a._a&&-2===a._pf.overflow&&(b=a._a[Db]<0||a._a[Db]>11?Db:a._a[Eb]<1||a._a[Eb]>D(a._a[Cb],a._a[Db])?Eb:a._a[Fb]<0||a._a[Fb]>24||24===a._a[Fb]&&(0!==a._a[Gb]||0!==a._a[Hb]||0!==a._a[Ib])?Fb:a._a[Gb]<0||a._a[Gb]>59?Gb:a._a[Hb]<0||a._a[Hb]>59?Hb:a._a[Ib]<0||a._a[Ib]>999?Ib:-1,a._pf._overflowDayOfYear&&(Cb>b||b>Eb)&&(b=Eb),a._pf.overflow=b)}function I(b){return null==b._isValid&&(b._isValid=!isNaN(b._d.getTime())&&b._pf.overflow<0&&!b._pf.empty&&!b._pf.invalidMonth&&!b._pf.nullInput&&!b._pf.invalidFormat&&!b._pf.userInvalidated,b._strict&&(b._isValid=b._isValid&&0===b._pf.charsLeftOver&&0===b._pf.unusedTokens.length&&b._pf.bigHour===a)),b._isValid}function J(a){return a?a.toLowerCase().replace("_","-"):a}function K(a){for(var b,c,d,e,f=0;f0;){if(d=L(e.slice(0,b).join("-")))return d;if(c&&c.length>=b&&y(e,c,!0)>=b-1)break;b--}f++}return null}function L(a){var b=null;if(!Jb[a]&&Lb)try{b=vb.locale(),require("./locale/"+a),vb.locale(b)}catch(c){}return Jb[a]}function M(a,b){var c,d;return b._isUTC?(c=b.clone(),d=(vb.isMoment(a)||x(a)?+a:+vb(a))-+c,c._d.setTime(+c._d+d),vb.updateOffset(c,!1),c):vb(a).local()}function N(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function O(a){var b,c,d=a.match(Pb);for(b=0,c=d.length;c>b;b++)d[b]=rc[d[b]]?rc[d[b]]:N(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 P(a,b){return a.isValid()?(b=Q(b,a.localeData()),nc[b]||(nc[b]=O(b)),nc[b](a)):a.localeData().invalidDate()}function Q(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(Qb.lastIndex=0;d>=0&&Qb.test(a);)a=a.replace(Qb,c),Qb.lastIndex=0,d-=1;return a}function R(a,b){var c,d=b._strict;switch(a){case"Q":return _b;case"DDDD":return bc;case"YYYY":case"GGGG":case"gggg":return d?cc:Tb;case"Y":case"G":case"g":return ec;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return d?dc:Ub;case"S":if(d)return _b;case"SS":if(d)return ac;case"SSS":if(d)return bc;case"DDD":return Sb;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Wb;case"a":case"A":return b._locale._meridiemParse;case"x":return Zb;case"X":return $b;case"Z":case"ZZ":return Xb;case"T":return Yb;case"SSSS":return Vb;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return d?ac:Rb;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return Rb;case"Do":return d?b._locale._ordinalParse:b._locale._ordinalParseLenient;default:return c=new RegExp($(Z(a.replace("\\","")),"i"))}}function S(a){a=a||"";var b=a.match(Xb)||[],c=b[b.length-1]||[],d=(c+"").match(jc)||["-",0,0],e=+(60*d[1])+C(d[2]);return"+"===d[0]?e:-e}function T(a,b,c){var d,e=c._a;switch(a){case"Q":null!=b&&(e[Db]=3*(C(b)-1));break;case"M":case"MM":null!=b&&(e[Db]=C(b)-1);break;case"MMM":case"MMMM":d=c._locale.monthsParse(b,a,c._strict),null!=d?e[Db]=d:c._pf.invalidMonth=b;break;case"D":case"DD":null!=b&&(e[Eb]=C(b));break;case"Do":null!=b&&(e[Eb]=C(parseInt(b.match(/\d{1,2}/)[0],10)));break;case"DDD":case"DDDD":null!=b&&(c._dayOfYear=C(b));break;case"YY":e[Cb]=vb.parseTwoDigitYear(b);break;case"YYYY":case"YYYYY":case"YYYYYY":e[Cb]=C(b);break;case"a":case"A":c._meridiem=b;break;case"h":case"hh":c._pf.bigHour=!0;case"H":case"HH":e[Fb]=C(b);break;case"m":case"mm":e[Gb]=C(b);break;case"s":case"ss":e[Hb]=C(b);break;case"S":case"SS":case"SSS":case"SSSS":e[Ib]=C(1e3*("0."+b));break;case"x":c._d=new Date(C(b));break;case"X":c._d=new Date(1e3*parseFloat(b));break;case"Z":case"ZZ":c._useUTC=!0,c._tzm=S(b);break;case"dd":case"ddd":case"dddd":d=c._locale.weekdaysParse(b),null!=d?(c._w=c._w||{},c._w.d=d):c._pf.invalidWeekday=b;break;case"w":case"ww":case"W":case"WW":case"d":case"e":case"E":a=a.substr(0,1);case"gggg":case"GGGG":case"GGGGG":a=a.substr(0,2),b&&(c._w=c._w||{},c._w[a]=C(b));break;case"gg":case"GG":c._w=c._w||{},c._w[a]=vb.parseTwoDigitYear(b)}}function U(a){var c,d,e,f,g,h,i;c=a._w,null!=c.GG||null!=c.W||null!=c.E?(g=1,h=4,d=b(c.GG,a._a[Cb],jb(vb(),1,4).year),e=b(c.W,1),f=b(c.E,1)):(g=a._locale._week.dow,h=a._locale._week.doy,d=b(c.gg,a._a[Cb],jb(vb(),g,h).year),e=b(c.w,1),null!=c.d?(f=c.d,g>f&&++e):f=null!=c.e?c.e+g:g),i=kb(d,e,f,h,g),a._a[Cb]=i.year,a._dayOfYear=i.dayOfYear}function V(a){var c,d,e,f,g=[];if(!a._d){for(e=X(a),a._w&&null==a._a[Eb]&&null==a._a[Db]&&U(a),a._dayOfYear&&(f=b(a._a[Cb],e[Cb]),a._dayOfYear>F(f)&&(a._pf._overflowDayOfYear=!0),d=fb(f,0,a._dayOfYear),a._a[Db]=d.getUTCMonth(),a._a[Eb]=d.getUTCDate()),c=0;3>c&&null==a._a[c];++c)a._a[c]=g[c]=e[c];for(;7>c;c++)a._a[c]=g[c]=null==a._a[c]?2===c?1:0:a._a[c];24===a._a[Fb]&&0===a._a[Gb]&&0===a._a[Hb]&&0===a._a[Ib]&&(a._nextDay=!0,a._a[Fb]=0),a._d=(a._useUTC?fb:eb).apply(null,g),null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()-a._tzm),a._nextDay&&(a._a[Fb]=24)}}function W(a){var b;a._d||(b=A(a._i),a._a=[b.year,b.month,b.day||b.date,b.hour,b.minute,b.second,b.millisecond],V(a))}function X(a){var b=new Date;return a._useUTC?[b.getUTCFullYear(),b.getUTCMonth(),b.getUTCDate()]:[b.getFullYear(),b.getMonth(),b.getDate()]}function Y(b){if(b._f===vb.ISO_8601)return void ab(b);b._a=[],b._pf.empty=!0;var c,d,e,f,g,h=""+b._i,i=h.length,j=0;for(e=Q(b._f,b._locale).match(Pb)||[],c=0;c0&&b._pf.unusedInput.push(g),h=h.slice(h.indexOf(d)+d.length),j+=d.length),rc[f]?(d?b._pf.empty=!1:b._pf.unusedTokens.push(f),T(f,d,b)):b._strict&&!d&&b._pf.unusedTokens.push(f);b._pf.charsLeftOver=i-j,h.length>0&&b._pf.unusedInput.push(h),b._pf.bigHour===!0&&b._a[Fb]<=12&&(b._pf.bigHour=a),b._a[Fb]=k(b._locale,b._a[Fb],b._meridiem),V(b),H(b)}function Z(a){return a.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e})}function $(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function _(a){var b,c,e,f,g;if(0===a._f.length)return a._pf.invalidFormat=!0,void(a._d=new Date(0/0));for(f=0;fg)&&(e=g,c=b));o(a,c||b)}function ab(a){var b,c,d=a._i,e=fc.exec(d);if(e){for(a._pf.iso=!0,b=0,c=hc.length;c>b;b++)if(hc[b][1].exec(d)){a._f=hc[b][0]+(e[6]||" ");break}for(b=0,c=ic.length;c>b;b++)if(ic[b][1].exec(d)){a._f+=ic[b][0];break}d.match(Xb)&&(a._f+="Z"),Y(a)}else a._isValid=!1}function bb(a){ab(a),a._isValid===!1&&(delete a._isValid,vb.createFromInputFallback(a))}function cb(a,b){var c,d=[];for(c=0;ca&&h.setFullYear(a),h}function fb(a){var b=new Date(Date.UTC.apply(null,arguments));return 1970>a&&b.setUTCFullYear(a),b}function gb(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 hb(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function ib(a,b,c){var d=vb.duration(a).abs(),e=Ab(d.as("s")),f=Ab(d.as("m")),g=Ab(d.as("h")),h=Ab(d.as("d")),i=Ab(d.as("M")),j=Ab(d.as("y")),k=e0,k[4]=c,hb.apply({},k)}function jb(a,b,c){var d,e=c-b,f=c-a.day();return f>e&&(f-=7),e-7>f&&(f+=7),d=vb(a).add(f,"d"),{week:Math.ceil(d.dayOfYear()/7),year:d.year()}}function kb(a,b,c,d,e){var f,g,h=fb(a,0,1).getUTCDay();return h=0===h?7:h,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:F(a-1)+g}}function lb(b){var c,d=b._i,e=b._f;return b._locale=b._locale||vb.localeData(b._l),null===d||e===a&&""===d?vb.invalid({nullInput:!0}):("string"==typeof d&&(b._i=d=b._locale.preparse(d)),vb.isMoment(d)?new m(d,!0):(e?w(e)?_(b):Y(b):db(b),c=new m(b),c._nextDay&&(c.add(1,"d"),c._nextDay=a),c))}function mb(a,b){var c,d;if(1===b.length&&w(b[0])&&(b=b[0]),!b.length)return vb();for(c=b[0],d=1;d=0?"+":"-";return b+r(Math.abs(a),6)},gg:function(){return r(this.weekYear()%100,2)},gggg:function(){return r(this.weekYear(),4)},ggggg:function(){return r(this.weekYear(),5)},GG:function(){return r(this.isoWeekYear()%100,2)},GGGG:function(){return r(this.isoWeekYear(),4)},GGGGG:function(){return r(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.localeData().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.localeData().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 C(this.milliseconds()/100)},SS:function(){return r(C(this.milliseconds()/10),2)},SSS:function(){return r(this.milliseconds(),3)},SSSS:function(){return r(this.milliseconds(),3)},Z:function(){var a=this.utcOffset(),b="+";return 0>a&&(a=-a,b="-"),b+r(C(a/60),2)+":"+r(C(a)%60,2)},ZZ:function(){var a=this.utcOffset(),b="+";return 0>a&&(a=-a,b="-"),b+r(C(a/60),2)+r(C(a)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},x:function(){return this.valueOf()},X:function(){return this.unix()},Q:function(){return this.quarter()}},sc={},tc=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"],uc=!1;pc.length;)xb=pc.pop(),rc[xb+"o"]=i(rc[xb],xb);for(;qc.length;)xb=qc.pop(),rc[xb+xb]=h(rc[xb],2);rc.DDDD=h(rc.DDD,3),o(l.prototype,{set:function(a){var b,c;for(c in a)b=a[c],"function"==typeof b?this[c]=b:this["_"+c]=b;this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)},_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,b,c){var d,e,f;for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),d=0;12>d;d++){if(e=vb.utc([2e3,d]),c&&!this._longMonthsParse[d]&&(this._longMonthsParse[d]=new RegExp("^"+this.months(e,"").replace(".","")+"$","i"),this._shortMonthsParse[d]=new RegExp("^"+this.monthsShort(e,"").replace(".","")+"$","i")),c||this._monthsParse[d]||(f="^"+this.months(e,"")+"|^"+this.monthsShort(e,""),this._monthsParse[d]=new RegExp(f.replace(".",""),"i")),c&&"MMMM"===b&&this._longMonthsParse[d].test(a))return d;if(c&&"MMM"===b&&this._shortMonthsParse[d].test(a))return d;if(!c&&this._monthsParse[d].test(a))return d}},_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=vb([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:{LTS:"h:mm:ss A",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,c){var d=this._calendar[a];return"function"==typeof d?d.apply(b,[c]):d},_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",_ordinalParse:/\d{1,2}/,preparse:function(a){return a},postformat:function(a){return a},week:function(a){return jb(a,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},firstDayOfWeek:function(){return this._week.dow},firstDayOfYear:function(){return this._week.doy},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),vb=function(b,c,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._i=b,g._f=c,g._l=e,g._strict=f,g._isUTC=!1,g._pf=d(),lb(g)},vb.suppressDeprecationWarnings=!1,vb.createFromInputFallback=f("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(a){a._d=new Date(a._i+(a._useUTC?" UTC":""))}),vb.min=function(){var a=[].slice.call(arguments,0);return mb("isBefore",a)},vb.max=function(){var a=[].slice.call(arguments,0);return mb("isAfter",a)},vb.utc=function(b,c,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=b,g._f=c,g._strict=f,g._pf=d(),lb(g).utc()},vb.unix=function(a){return vb(1e3*a)},vb.duration=function(a,b){var d,e,f,g,h=a,i=null;return vb.isDuration(a)?h={ms:a._milliseconds,d:a._days,M:a._months}:"number"==typeof a?(h={},b?h[b]=a:h.milliseconds=a):(i=Nb.exec(a))?(d="-"===i[1]?-1:1,h={y:0,d:C(i[Eb])*d,h:C(i[Fb])*d,m:C(i[Gb])*d,s:C(i[Hb])*d,ms:C(i[Ib])*d}):(i=Ob.exec(a))?(d="-"===i[1]?-1:1,f=function(a){var b=a&&parseFloat(a.replace(",","."));return(isNaN(b)?0:b)*d},h={y:f(i[2]),M:f(i[3]),d:f(i[4]),h:f(i[5]),m:f(i[6]),s:f(i[7]),w:f(i[8])}):null==h?h={}:"object"==typeof h&&("from"in h||"to"in h)&&(g=t(vb(h.from),vb(h.to)),h={},h.ms=g.milliseconds,h.M=g.months),e=new n(h),vb.isDuration(a)&&c(a,"_locale")&&(e._locale=a._locale),e},vb.version=yb,vb.defaultFormat=gc,vb.ISO_8601=function(){},vb.momentProperties=Kb,vb.updateOffset=function(){},vb.relativeTimeThreshold=function(b,c){return oc[b]===a?!1:c===a?oc[b]:(oc[b]=c,!0)},vb.lang=f("moment.lang is deprecated. Use moment.locale instead.",function(a,b){return vb.locale(a,b)}),vb.locale=function(a,b){var c;return a&&(c="undefined"!=typeof b?vb.defineLocale(a,b):vb.localeData(a),c&&(vb.duration._locale=vb._locale=c)),vb._locale._abbr},vb.defineLocale=function(a,b){return null!==b?(b.abbr=a,Jb[a]||(Jb[a]=new l),Jb[a].set(b),vb.locale(a),Jb[a]):(delete Jb[a],null)},vb.langData=f("moment.langData is deprecated. Use moment.localeData instead.",function(a){return vb.localeData(a)}),vb.localeData=function(a){var b;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return vb._locale;if(!w(a)){if(b=L(a))return b;a=[a]}return K(a)},vb.isMoment=function(a){return a instanceof m||null!=a&&c(a,"_isAMomentObject")},vb.isDuration=function(a){return a instanceof n};for(xb=tc.length-1;xb>=0;--xb)B(tc[xb]);vb.normalizeUnits=function(a){return z(a)},vb.invalid=function(a){var b=vb.utc(0/0);return null!=a?o(b._pf,a):b._pf.userInvalidated=!0,b},vb.parseZone=function(){return vb.apply(null,arguments).parseZone()},vb.parseTwoDigitYear=function(a){return C(a)+(C(a)>68?1900:2e3)},vb.isDate=x,o(vb.fn=m.prototype,{clone:function(){return vb(this)},valueOf:function(){return+this._d-6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().locale("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=vb(this).utc();return 00:!1},parsingFlags:function(){return o({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(a){return this.utcOffset(0,a)},local:function(a){return this._isUTC&&(this.utcOffset(0,a),this._isUTC=!1,a&&this.subtract(this._dateUtcOffset(),"m")),this},format:function(a){var b=P(this,a||vb.defaultFormat);return this.localeData().postformat(b)},add:u(1,"add"),subtract:u(-1,"subtract"),diff:function(a,b,c){var d,e,f=M(a,this),g=6e4*(f.utcOffset()-this.utcOffset());return b=z(b),"year"===b||"month"===b||"quarter"===b?(e=j(this,f),"quarter"===b?e/=3:"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:q(e)},from:function(a,b){return vb.duration({to:this,from:a}).locale(this.locale()).humanize(!b)},fromNow:function(a){return this.from(vb(),a)},calendar:function(a){var b=a||vb(),c=M(b,this).startOf("day"),d=this.diff(c,"days",!0),e=-6>d?"sameElse":-1>d?"lastWeek":0>d?"lastDay":1>d?"sameDay":2>d?"nextDay":7>d?"nextWeek":"sameElse";return this.format(this.localeData().calendar(e,this,vb(b)))},isLeapYear:function(){return G(this.year())},isDST:function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},day:function(a){var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=gb(a,this.localeData()),this.add(a-b,"d")):b},month:qb("Month",!0),startOf:function(a){switch(a=z(a)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===a?this.weekday(0):"isoWeek"===a&&this.isoWeekday(1),"quarter"===a&&this.month(3*Math.floor(this.month()/3)),this},endOf:function(b){return b=z(b),b===a||"millisecond"===b?this:this.startOf(b).add(1,"isoWeek"===b?"week":b).subtract(1,"ms")},isAfter:function(a,b){var c;return b=z("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=vb.isMoment(a)?a:vb(a),+this>+a):(c=vb.isMoment(a)?+a:+vb(a),c<+this.clone().startOf(b))},isBefore:function(a,b){var c;return b=z("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=vb.isMoment(a)?a:vb(a),+a>+this):(c=vb.isMoment(a)?+a:+vb(a),+this.clone().endOf(b)a?this:a}),max:f("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(a){return a=vb.apply(null,arguments),a>this?this:a}),zone:f("moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779",function(a,b){return null!=a?("string"!=typeof a&&(a=-a),this.utcOffset(a,b),this):-this.utcOffset()}),utcOffset:function(a,b){var c,d=this._offset||0;return null!=a?("string"==typeof a&&(a=S(a)),Math.abs(a)<16&&(a=60*a),!this._isUTC&&b&&(c=this._dateUtcOffset()),this._offset=a,this._isUTC=!0,null!=c&&this.add(c,"m"),d!==a&&(!b||this._changeInProgress?v(this,vb.duration(a-d,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,vb.updateOffset(this,!0),this._changeInProgress=null)),this):this._isUTC?d:this._dateUtcOffset()},isLocal:function(){return!this._isUTC},isUtcOffset:function(){return this._isUTC},isUtc:function(){return this._isUTC&&0===this._offset},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.utcOffset(this._tzm):"string"==typeof this._i&&this.utcOffset(S(this._i)),this},hasAlignedHourOffset:function(a){return a=a?vb(a).utcOffset():0,(this.utcOffset()-a)%60===0},daysInMonth:function(){return D(this.year(),this.month())},dayOfYear:function(a){var b=Ab((vb(this).startOf("day")-vb(this).startOf("year"))/864e5)+1;return null==a?b:this.add(a-b,"d")},quarter:function(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)},weekYear:function(a){var b=jb(this,this.localeData()._week.dow,this.localeData()._week.doy).year;return null==a?b:this.add(a-b,"y")},isoWeekYear:function(a){var b=jb(this,1,4).year;return null==a?b:this.add(a-b,"y")},week:function(a){var b=this.localeData().week(this);return null==a?b:this.add(7*(a-b),"d")},isoWeek:function(a){var b=jb(this,1,4).week;return null==a?b:this.add(7*(a-b),"d")},weekday:function(a){var b=(this.day()+7-this.localeData()._week.dow)%7;return null==a?b:this.add(a-b,"d")},isoWeekday:function(a){return null==a?this.day()||7:this.day(this.day()%7?a:a-7)},isoWeeksInYear:function(){return E(this.year(),1,4)},weeksInYear:function(){var a=this.localeData()._week;return E(this.year(),a.dow,a.doy)},get:function(a){return a=z(a),this[a]()},set:function(a,b){var c;if("object"==typeof a)for(c in a)this.set(c,a[c]);else a=z(a),"function"==typeof this[a]&&this[a](b);return this},locale:function(b){var c;return b===a?this._locale._abbr:(c=vb.localeData(b),null!=c&&(this._locale=c),this)},lang:f("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(b){return b===a?this.localeData():this.locale(b)}),localeData:function(){return this._locale},_dateUtcOffset:function(){return 15*-Math.round(this._d.getTimezoneOffset()/15)}}),vb.fn.millisecond=vb.fn.milliseconds=qb("Milliseconds",!1),vb.fn.second=vb.fn.seconds=qb("Seconds",!1),vb.fn.minute=vb.fn.minutes=qb("Minutes",!1),vb.fn.hour=vb.fn.hours=qb("Hours",!0),vb.fn.date=qb("Date",!0),vb.fn.dates=f("dates accessor is deprecated. Use date instead.",qb("Date",!0)),vb.fn.year=qb("FullYear",!0),vb.fn.years=f("years accessor is deprecated. Use year instead.",qb("FullYear",!0)),vb.fn.days=vb.fn.day,vb.fn.months=vb.fn.month,vb.fn.weeks=vb.fn.week,vb.fn.isoWeeks=vb.fn.isoWeek,vb.fn.quarters=vb.fn.quarter,vb.fn.toJSON=vb.fn.toISOString,vb.fn.isUTC=vb.fn.isUtc,o(vb.duration.fn=n.prototype,{_bubble:function(){var a,b,c,d=this._milliseconds,e=this._days,f=this._months,g=this._data,h=0;g.milliseconds=d%1e3,a=q(d/1e3),g.seconds=a%60,b=q(a/60),g.minutes=b%60,c=q(b/60),g.hours=c%24,e+=q(c/24),h=q(rb(e)),e-=q(sb(h)),f+=q(e/30),e%=30,h+=q(f/12),f%=12,g.days=e,g.months=f,g.years=h},abs:function(){return this._milliseconds=Math.abs(this._milliseconds),this._days=Math.abs(this._days),this._months=Math.abs(this._months),this._data.milliseconds=Math.abs(this._data.milliseconds),this._data.seconds=Math.abs(this._data.seconds),this._data.minutes=Math.abs(this._data.minutes),this._data.hours=Math.abs(this._data.hours),this._data.months=Math.abs(this._data.months),this._data.years=Math.abs(this._data.years),this},weeks:function(){return q(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*C(this._months/12) +},humanize:function(a){var b=ib(this,!a,this.localeData());return a&&(b=this.localeData().pastFuture(+this,b)),this.localeData().postformat(b)},add:function(a,b){var c=vb.duration(a,b);return this._milliseconds+=c._milliseconds,this._days+=c._days,this._months+=c._months,this._bubble(),this},subtract:function(a,b){var c=vb.duration(a,b);return this._milliseconds-=c._milliseconds,this._days-=c._days,this._months-=c._months,this._bubble(),this},get:function(a){return a=z(a),this[a.toLowerCase()+"s"]()},as:function(a){var b,c;if(a=z(a),"month"===a||"year"===a)return b=this._days+this._milliseconds/864e5,c=this._months+12*rb(b),"month"===a?c:c/12;switch(b=this._days+Math.round(sb(this._months/12)),a){case"week":return b/7+this._milliseconds/6048e5;case"day":return b+this._milliseconds/864e5;case"hour":return 24*b+this._milliseconds/36e5;case"minute":return 24*b*60+this._milliseconds/6e4;case"second":return 24*b*60*60+this._milliseconds/1e3;case"millisecond":return Math.floor(24*b*60*60*1e3)+this._milliseconds;default:throw new Error("Unknown unit "+a)}},lang:vb.fn.lang,locale:vb.fn.locale,toIsoString:f("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",function(){return this.toISOString()}),toISOString:function(){var a=Math.abs(this.years()),b=Math.abs(this.months()),c=Math.abs(this.days()),d=Math.abs(this.hours()),e=Math.abs(this.minutes()),f=Math.abs(this.seconds()+this.milliseconds()/1e3);return this.asSeconds()?(this.asSeconds()<0?"-":"")+"P"+(a?a+"Y":"")+(b?b+"M":"")+(c?c+"D":"")+(d||e||f?"T":"")+(d?d+"H":"")+(e?e+"M":"")+(f?f+"S":""):"P0D"},localeData:function(){return this._locale},toJSON:function(){return this.toISOString()}}),vb.duration.fn.toString=vb.duration.fn.toISOString;for(xb in kc)c(kc,xb)&&tb(xb.toLowerCase());vb.duration.fn.asMilliseconds=function(){return this.as("ms")},vb.duration.fn.asSeconds=function(){return this.as("s")},vb.duration.fn.asMinutes=function(){return this.as("m")},vb.duration.fn.asHours=function(){return this.as("h")},vb.duration.fn.asDays=function(){return this.as("d")},vb.duration.fn.asWeeks=function(){return this.as("weeks")},vb.duration.fn.asMonths=function(){return this.as("M")},vb.duration.fn.asYears=function(){return this.as("y")},vb.locale("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var b=a%10,c=1===C(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}),Lb?module.exports=vb:"function"==typeof define&&define.amd?(define(function(a,b,c){return c.config&&c.config()&&c.config().noGlobal===!0&&(zb.moment=wb),vb}),ub(!0)):ub()}).call(this); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/moment.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/moment.js new file mode 100644 index 0000000..c635ec0 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/moment.js @@ -0,0 +1,3043 @@ +//! moment.js +//! version : 2.9.0 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com + +(function (undefined) { + /************************************ + Constants + ************************************/ + + var moment, + VERSION = '2.9.0', + // the global-scope this is NOT the global object in Node.js + globalScope = (typeof global !== 'undefined' && (typeof window === 'undefined' || window === global.window)) ? global : this, + oldGlobalMoment, + round = Math.round, + hasOwnProperty = Object.prototype.hasOwnProperty, + i, + + YEAR = 0, + MONTH = 1, + DATE = 2, + HOUR = 3, + MINUTE = 4, + SECOND = 5, + MILLISECOND = 6, + + // internal storage for locale config files + locales = {}, + + // extra moment internal properties (plugins register props here) + momentProperties = [], + + // check for nodeJS + hasModule = (typeof module !== 'undefined' && module && module.exports), + + // ASP.NET json date format regex + aspNetJsonRegex = /^\/?Date\((\-?\d+)/i, + aspNetTimeSpanJsonRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/, + + // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html + // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere + isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/, + + // format tokens + formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|x|X|zz?|ZZ?|.)/g, + localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, + + // parsing token regexes + parseTokenOneOrTwoDigits = /\d\d?/, // 0 - 99 + parseTokenOneToThreeDigits = /\d{1,3}/, // 0 - 999 + parseTokenOneToFourDigits = /\d{1,4}/, // 0 - 9999 + parseTokenOneToSixDigits = /[+\-]?\d{1,6}/, // -999,999 - 999,999 + parseTokenDigits = /\d+/, // nonzero number of digits + parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i, // any word (or two) characters or numbers including two/three word month in arabic. + parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z + parseTokenT = /T/i, // T (ISO separator) + parseTokenOffsetMs = /[\+\-]?\d+/, // 1234567890123 + parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123 + + //strict parsing regexes + parseTokenOneDigit = /\d/, // 0 - 9 + parseTokenTwoDigits = /\d\d/, // 00 - 99 + parseTokenThreeDigits = /\d{3}/, // 000 - 999 + parseTokenFourDigits = /\d{4}/, // 0000 - 9999 + parseTokenSixDigits = /[+-]?\d{6}/, // -999,999 - 999,999 + parseTokenSignedNumber = /[+-]?\d+/, // -inf - inf + + // iso 8601 regex + // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) + isoRegex = /^\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)?)?$/, + + isoFormat = 'YYYY-MM-DDTHH:mm:ssZ', + + isoDates = [ + ['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}/] + ], + + // iso time formats and regexes + isoTimes = [ + ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d+/], + ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/], + ['HH:mm', /(T| )\d\d:\d\d/], + ['HH', /(T| )\d\d/] + ], + + // timezone chunker '+10:00' > ['10', '00'] or '-1530' > ['-', '15', '30'] + parseTimezoneChunker = /([\+\-]|\d\d)/gi, + + // getter and setter names + proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'), + unitMillisecondFactors = { + 'Milliseconds' : 1, + 'Seconds' : 1e3, + 'Minutes' : 6e4, + 'Hours' : 36e5, + 'Days' : 864e5, + 'Months' : 2592e6, + 'Years' : 31536e6 + }, + + unitAliases = { + ms : 'millisecond', + s : 'second', + m : 'minute', + h : 'hour', + d : 'day', + D : 'date', + w : 'week', + W : 'isoWeek', + M : 'month', + Q : 'quarter', + y : 'year', + DDD : 'dayOfYear', + e : 'weekday', + E : 'isoWeekday', + gg: 'weekYear', + GG: 'isoWeekYear' + }, + + camelFunctions = { + dayofyear : 'dayOfYear', + isoweekday : 'isoWeekday', + isoweek : 'isoWeek', + weekyear : 'weekYear', + isoweekyear : 'isoWeekYear' + }, + + // format function strings + formatFunctions = {}, + + // default relative time thresholds + relativeTimeThresholds = { + s: 45, // seconds to minute + m: 45, // minutes to hour + h: 22, // hours to day + d: 26, // days to month + M: 11 // months to year + }, + + // tokens to ordinalize and pad + ordinalizeTokens = 'DDD w W M D d'.split(' '), + paddedTokens = 'M D H h m s w W'.split(' '), + + formatTokenFunctions = { + M : function () { + return this.month() + 1; + }, + MMM : function (format) { + return this.localeData().monthsShort(this, format); + }, + MMMM : function (format) { + return this.localeData().months(this, format); + }, + D : function () { + return this.date(); + }, + DDD : function () { + return this.dayOfYear(); + }, + d : function () { + return this.day(); + }, + dd : function (format) { + return this.localeData().weekdaysMin(this, format); + }, + ddd : function (format) { + return this.localeData().weekdaysShort(this, format); + }, + dddd : function (format) { + return this.localeData().weekdays(this, format); + }, + w : function () { + return this.week(); + }, + W : function () { + return this.isoWeek(); + }, + YY : function () { + return leftZeroFill(this.year() % 100, 2); + }, + YYYY : function () { + return leftZeroFill(this.year(), 4); + }, + YYYYY : function () { + return leftZeroFill(this.year(), 5); + }, + YYYYYY : function () { + var y = this.year(), sign = y >= 0 ? '+' : '-'; + return sign + leftZeroFill(Math.abs(y), 6); + }, + gg : function () { + return leftZeroFill(this.weekYear() % 100, 2); + }, + gggg : function () { + return leftZeroFill(this.weekYear(), 4); + }, + ggggg : function () { + return leftZeroFill(this.weekYear(), 5); + }, + GG : function () { + return leftZeroFill(this.isoWeekYear() % 100, 2); + }, + GGGG : function () { + return leftZeroFill(this.isoWeekYear(), 4); + }, + GGGGG : function () { + return leftZeroFill(this.isoWeekYear(), 5); + }, + e : function () { + return this.weekday(); + }, + E : function () { + return this.isoWeekday(); + }, + a : function () { + return this.localeData().meridiem(this.hours(), this.minutes(), true); + }, + A : function () { + return this.localeData().meridiem(this.hours(), this.minutes(), false); + }, + 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 toInt(this.milliseconds() / 100); + }, + SS : function () { + return leftZeroFill(toInt(this.milliseconds() / 10), 2); + }, + SSS : function () { + return leftZeroFill(this.milliseconds(), 3); + }, + SSSS : function () { + return leftZeroFill(this.milliseconds(), 3); + }, + Z : function () { + var a = this.utcOffset(), + b = '+'; + if (a < 0) { + a = -a; + b = '-'; + } + return b + leftZeroFill(toInt(a / 60), 2) + ':' + leftZeroFill(toInt(a) % 60, 2); + }, + ZZ : function () { + var a = this.utcOffset(), + b = '+'; + if (a < 0) { + a = -a; + b = '-'; + } + return b + leftZeroFill(toInt(a / 60), 2) + leftZeroFill(toInt(a) % 60, 2); + }, + z : function () { + return this.zoneAbbr(); + }, + zz : function () { + return this.zoneName(); + }, + x : function () { + return this.valueOf(); + }, + X : function () { + return this.unix(); + }, + Q : function () { + return this.quarter(); + } + }, + + deprecations = {}, + + lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin'], + + updateInProgress = false; + + // Pick the first defined of two or three arguments. dfl comes from + // default. + function dfl(a, b, c) { + switch (arguments.length) { + case 2: return a != null ? a : b; + case 3: return a != null ? a : b != null ? b : c; + default: throw new Error('Implement me'); + } + } + + function hasOwnProp(a, b) { + return hasOwnProperty.call(a, b); + } + + function defaultParsingFlags() { + // We need to deep clone this object, and es5 standard is not very + // helpful. + return { + empty : false, + unusedTokens : [], + unusedInput : [], + overflow : -2, + charsLeftOver : 0, + nullInput : false, + invalidMonth : null, + invalidFormat : false, + userInvalidated : false, + iso: false + }; + } + + function printMsg(msg) { + if (moment.suppressDeprecationWarnings === false && + typeof console !== 'undefined' && console.warn) { + console.warn('Deprecation warning: ' + msg); + } + } + + function deprecate(msg, fn) { + var firstTime = true; + return extend(function () { + if (firstTime) { + printMsg(msg); + firstTime = false; + } + return fn.apply(this, arguments); + }, fn); + } + + function deprecateSimple(name, msg) { + if (!deprecations[name]) { + printMsg(msg); + deprecations[name] = true; + } + } + + function padToken(func, count) { + return function (a) { + return leftZeroFill(func.call(this, a), count); + }; + } + function ordinalizeToken(func, period) { + return function (a) { + return this.localeData().ordinal(func.call(this, a), period); + }; + } + + function monthDiff(a, b) { + // difference in months + var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), + // b is in (anchor - 1 month, anchor + 1 month) + anchor = a.clone().add(wholeMonthDiff, 'months'), + anchor2, adjust; + + if (b - anchor < 0) { + anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor - anchor2); + } else { + anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor2 - anchor); + } + + return -(wholeMonthDiff + adjust); + } + + while (ordinalizeTokens.length) { + i = ordinalizeTokens.pop(); + formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i); + } + while (paddedTokens.length) { + i = paddedTokens.pop(); + formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2); + } + formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3); + + + function meridiemFixWrap(locale, hour, meridiem) { + var isPm; + + if (meridiem == null) { + // nothing to do + return hour; + } + if (locale.meridiemHour != null) { + return locale.meridiemHour(hour, meridiem); + } else if (locale.isPM != null) { + // Fallback + isPm = locale.isPM(meridiem); + if (isPm && hour < 12) { + hour += 12; + } + if (!isPm && hour === 12) { + hour = 0; + } + return hour; + } else { + // thie is not supposed to happen + return hour; + } + } + + /************************************ + Constructors + ************************************/ + + function Locale() { + } + + // Moment prototype object + function Moment(config, skipOverflow) { + if (skipOverflow !== false) { + checkOverflow(config); + } + copyConfig(this, config); + this._d = new Date(+config._d); + // Prevent infinite loop in case updateOffset creates new moment + // objects. + if (updateInProgress === false) { + updateInProgress = true; + moment.updateOffset(this); + updateInProgress = false; + } + } + + // Duration Constructor + function Duration(duration) { + var normalizedInput = normalizeObjectUnits(duration), + years = normalizedInput.year || 0, + quarters = normalizedInput.quarter || 0, + months = normalizedInput.month || 0, + weeks = normalizedInput.week || 0, + days = normalizedInput.day || 0, + hours = normalizedInput.hour || 0, + minutes = normalizedInput.minute || 0, + seconds = normalizedInput.second || 0, + milliseconds = normalizedInput.millisecond || 0; + + // representation for dateAddRemove + this._milliseconds = +milliseconds + + seconds * 1e3 + // 1000 + minutes * 6e4 + // 1000 * 60 + hours * 36e5; // 1000 * 60 * 60 + // Because of dateAddRemove treats 24 hours as different from a + // day when working around DST, we need to store them separately + this._days = +days + + weeks * 7; + // It is impossible translate months into days without knowing + // which months you are are talking about, so we have to store + // it separately. + this._months = +months + + quarters * 3 + + years * 12; + + this._data = {}; + + this._locale = moment.localeData(); + + this._bubble(); + } + + /************************************ + Helpers + ************************************/ + + + function extend(a, b) { + for (var i in b) { + if (hasOwnProp(b, i)) { + a[i] = b[i]; + } + } + + if (hasOwnProp(b, 'toString')) { + a.toString = b.toString; + } + + if (hasOwnProp(b, 'valueOf')) { + a.valueOf = b.valueOf; + } + + return a; + } + + function copyConfig(to, from) { + var i, prop, val; + + if (typeof from._isAMomentObject !== 'undefined') { + to._isAMomentObject = from._isAMomentObject; + } + if (typeof from._i !== 'undefined') { + to._i = from._i; + } + if (typeof from._f !== 'undefined') { + to._f = from._f; + } + if (typeof from._l !== 'undefined') { + to._l = from._l; + } + if (typeof from._strict !== 'undefined') { + to._strict = from._strict; + } + if (typeof from._tzm !== 'undefined') { + to._tzm = from._tzm; + } + if (typeof from._isUTC !== 'undefined') { + to._isUTC = from._isUTC; + } + if (typeof from._offset !== 'undefined') { + to._offset = from._offset; + } + if (typeof from._pf !== 'undefined') { + to._pf = from._pf; + } + if (typeof from._locale !== 'undefined') { + to._locale = from._locale; + } + + if (momentProperties.length > 0) { + for (i in momentProperties) { + prop = momentProperties[i]; + val = from[prop]; + if (typeof val !== 'undefined') { + to[prop] = val; + } + } + } + + return to; + } + + function absRound(number) { + if (number < 0) { + return Math.ceil(number); + } else { + return Math.floor(number); + } + } + + // left zero fill a number + // see http://jsperf.com/left-zero-filling for performance comparison + function leftZeroFill(number, targetLength, forceSign) { + var output = '' + Math.abs(number), + sign = number >= 0; + + while (output.length < targetLength) { + output = '0' + output; + } + return (sign ? (forceSign ? '+' : '') : '-') + output; + } + + function positiveMomentsDifference(base, other) { + var res = {milliseconds: 0, months: 0}; + + res.months = other.month() - base.month() + + (other.year() - base.year()) * 12; + if (base.clone().add(res.months, 'M').isAfter(other)) { + --res.months; + } + + res.milliseconds = +other - +(base.clone().add(res.months, 'M')); + + return res; + } + + function momentsDifference(base, other) { + var res; + other = makeAs(other, base); + if (base.isBefore(other)) { + res = positiveMomentsDifference(base, other); + } else { + res = positiveMomentsDifference(other, base); + res.milliseconds = -res.milliseconds; + res.months = -res.months; + } + + return res; + } + + // TODO: remove 'name' arg after deprecation is removed + function createAdder(direction, name) { + return function (val, period) { + var dur, tmp; + //invert the arguments, but complain about it + if (period !== null && !isNaN(+period)) { + deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period).'); + tmp = val; val = period; period = tmp; + } + + val = typeof val === 'string' ? +val : val; + dur = moment.duration(val, period); + addOrSubtractDurationFromMoment(this, dur, direction); + return this; + }; + } + + function addOrSubtractDurationFromMoment(mom, duration, isAdding, updateOffset) { + var milliseconds = duration._milliseconds, + days = duration._days, + months = duration._months; + updateOffset = updateOffset == null ? true : updateOffset; + + if (milliseconds) { + mom._d.setTime(+mom._d + milliseconds * isAdding); + } + if (days) { + rawSetter(mom, 'Date', rawGetter(mom, 'Date') + days * isAdding); + } + if (months) { + rawMonthSetter(mom, rawGetter(mom, 'Month') + months * isAdding); + } + if (updateOffset) { + moment.updateOffset(mom, days || months); + } + } + + // check if is an array + function isArray(input) { + return Object.prototype.toString.call(input) === '[object Array]'; + } + + function isDate(input) { + return Object.prototype.toString.call(input) === '[object Date]' || + input instanceof Date; + } + + // compare two arrays, return the number of differences + function compareArrays(array1, array2, dontConvert) { + var len = Math.min(array1.length, array2.length), + lengthDiff = Math.abs(array1.length - array2.length), + diffs = 0, + i; + for (i = 0; i < len; i++) { + if ((dontConvert && array1[i] !== array2[i]) || + (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { + diffs++; + } + } + return diffs + lengthDiff; + } + + function normalizeUnits(units) { + if (units) { + var lowered = units.toLowerCase().replace(/(.)s$/, '$1'); + units = unitAliases[units] || camelFunctions[lowered] || lowered; + } + return units; + } + + function normalizeObjectUnits(inputObject) { + var normalizedInput = {}, + normalizedProp, + prop; + + for (prop in inputObject) { + if (hasOwnProp(inputObject, prop)) { + normalizedProp = normalizeUnits(prop); + if (normalizedProp) { + normalizedInput[normalizedProp] = inputObject[prop]; + } + } + } + + return normalizedInput; + } + + function makeList(field) { + var count, setter; + + if (field.indexOf('week') === 0) { + count = 7; + setter = 'day'; + } + else if (field.indexOf('month') === 0) { + count = 12; + setter = 'month'; + } + else { + return; + } + + moment[field] = function (format, index) { + var i, getter, + method = moment._locale[field], + results = []; + + if (typeof format === 'number') { + index = format; + format = undefined; + } + + getter = function (i) { + var m = moment().utc().set(setter, i); + return method.call(moment._locale, m, format || ''); + }; + + if (index != null) { + return getter(index); + } + else { + for (i = 0; i < count; i++) { + results.push(getter(i)); + } + return results; + } + }; + } + + function toInt(argumentForCoercion) { + var coercedNumber = +argumentForCoercion, + value = 0; + + if (coercedNumber !== 0 && isFinite(coercedNumber)) { + if (coercedNumber >= 0) { + value = Math.floor(coercedNumber); + } else { + value = Math.ceil(coercedNumber); + } + } + + return value; + } + + function daysInMonth(year, month) { + return new Date(Date.UTC(year, month + 1, 0)).getUTCDate(); + } + + function weeksInYear(year, dow, doy) { + return weekOfYear(moment([year, 11, 31 + dow - doy]), dow, doy).week; + } + + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; + } + + function isLeapYear(year) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; + } + + function checkOverflow(m) { + var overflow; + if (m._a && m._pf.overflow === -2) { + overflow = + m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH : + m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE : + m._a[HOUR] < 0 || m._a[HOUR] > 24 || + (m._a[HOUR] === 24 && (m._a[MINUTE] !== 0 || + m._a[SECOND] !== 0 || + m._a[MILLISECOND] !== 0)) ? HOUR : + m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE : + m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND : + m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND : + -1; + + if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { + overflow = DATE; + } + + m._pf.overflow = overflow; + } + } + + function isValid(m) { + if (m._isValid == null) { + m._isValid = !isNaN(m._d.getTime()) && + m._pf.overflow < 0 && + !m._pf.empty && + !m._pf.invalidMonth && + !m._pf.nullInput && + !m._pf.invalidFormat && + !m._pf.userInvalidated; + + if (m._strict) { + m._isValid = m._isValid && + m._pf.charsLeftOver === 0 && + m._pf.unusedTokens.length === 0 && + m._pf.bigHour === undefined; + } + } + return m._isValid; + } + + function normalizeLocale(key) { + return key ? key.toLowerCase().replace('_', '-') : key; + } + + // pick the locale from the array + // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each + // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root + function chooseLocale(names) { + var i = 0, j, next, locale, split; + + while (i < names.length) { + split = normalizeLocale(names[i]).split('-'); + j = split.length; + next = normalizeLocale(names[i + 1]); + next = next ? next.split('-') : null; + while (j > 0) { + locale = loadLocale(split.slice(0, j).join('-')); + if (locale) { + return locale; + } + if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { + //the next array item is better than a shallower substring of this one + break; + } + j--; + } + i++; + } + return null; + } + + function loadLocale(name) { + var oldLocale = null; + if (!locales[name] && hasModule) { + try { + oldLocale = moment.locale(); + require('./locale/' + name); + // because defineLocale currently also sets the global locale, we want to undo that for lazy loaded locales + moment.locale(oldLocale); + } catch (e) { } + } + return locales[name]; + } + + // Return a moment from input, that is local/utc/utcOffset equivalent to + // model. + function makeAs(input, model) { + var res, diff; + if (model._isUTC) { + res = model.clone(); + diff = (moment.isMoment(input) || isDate(input) ? + +input : +moment(input)) - (+res); + // Use low-level api, because this fn is low-level api. + res._d.setTime(+res._d + diff); + moment.updateOffset(res, false); + return res; + } else { + return moment(input).local(); + } + } + + /************************************ + Locale + ************************************/ + + + extend(Locale.prototype, { + + set : function (config) { + var prop, i; + for (i in config) { + prop = config[i]; + if (typeof prop === 'function') { + this[i] = prop; + } else { + this['_' + i] = prop; + } + } + // Lenient ordinal parsing accepts just a number in addition to + // number + (possibly) stuff coming from _ordinalParseLenient. + this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + /\d{1,2}/.source); + }, + + _months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + months : function (m) { + return this._months[m.month()]; + }, + + _monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + monthsShort : function (m) { + return this._monthsShort[m.month()]; + }, + + monthsParse : function (monthName, format, strict) { + var i, mom, regex; + + if (!this._monthsParse) { + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + } + + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = moment.utc([2000, i]); + if (strict && !this._longMonthsParse[i]) { + this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); + this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); + } + if (!strict && !this._monthsParse[i]) { + regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); + this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { + return i; + } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { + return i; + } else if (!strict && this._monthsParse[i].test(monthName)) { + return i; + } + } + }, + + _weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdays : function (m) { + return this._weekdays[m.day()]; + }, + + _weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysShort : function (m) { + return this._weekdaysShort[m.day()]; + }, + + _weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + weekdaysMin : function (m) { + return this._weekdaysMin[m.day()]; + }, + + weekdaysParse : function (weekdayName) { + var i, mom, regex; + + if (!this._weekdaysParse) { + this._weekdaysParse = []; + } + + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + if (!this._weekdaysParse[i]) { + mom = moment([2000, 1]).day(i); + regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); + this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (this._weekdaysParse[i].test(weekdayName)) { + return i; + } + } + }, + + _longDateFormat : { + LTS : 'h:mm:ss A', + 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 (key) { + var output = this._longDateFormat[key]; + if (!output && this._longDateFormat[key.toUpperCase()]) { + output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) { + return val.slice(1); + }); + this._longDateFormat[key] = output; + } + return output; + }, + + isPM : function (input) { + // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays + // Using charAt should be more compatible. + return ((input + '').toLowerCase().charAt(0) === 'p'); + }, + + _meridiemParse : /[ap]\.?m?\.?/i, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'pm' : 'PM'; + } else { + return isLower ? '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 (key, mom, now) { + var output = this._calendar[key]; + return typeof output === 'function' ? output.apply(mom, [now]) : output; + }, + + _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 (number, withoutSuffix, string, isFuture) { + var output = this._relativeTime[string]; + return (typeof output === 'function') ? + output(number, withoutSuffix, string, isFuture) : + output.replace(/%d/i, number); + }, + + pastFuture : function (diff, output) { + var format = this._relativeTime[diff > 0 ? 'future' : 'past']; + return typeof format === 'function' ? format(output) : format.replace(/%s/i, output); + }, + + ordinal : function (number) { + return this._ordinal.replace('%d', number); + }, + _ordinal : '%d', + _ordinalParse : /\d{1,2}/, + + preparse : function (string) { + return string; + }, + + postformat : function (string) { + return string; + }, + + week : function (mom) { + return weekOfYear(mom, this._week.dow, this._week.doy).week; + }, + + _week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + }, + + firstDayOfWeek : function () { + return this._week.dow; + }, + + firstDayOfYear : function () { + return this._week.doy; + }, + + _invalidDate: 'Invalid date', + invalidDate: function () { + return this._invalidDate; + } + }); + + /************************************ + Formatting + ************************************/ + + + function removeFormattingTokens(input) { + if (input.match(/\[[\s\S]/)) { + return input.replace(/^\[|\]$/g, ''); + } + return input.replace(/\\/g, ''); + } + + function makeFormatFunction(format) { + var array = format.match(formattingTokens), i, length; + + for (i = 0, length = array.length; i < length; i++) { + if (formatTokenFunctions[array[i]]) { + array[i] = formatTokenFunctions[array[i]]; + } else { + array[i] = removeFormattingTokens(array[i]); + } + } + + return function (mom) { + var output = ''; + for (i = 0; i < length; i++) { + output += array[i] instanceof Function ? array[i].call(mom, format) : array[i]; + } + return output; + }; + } + + // format date using native date object + function formatMoment(m, format) { + if (!m.isValid()) { + return m.localeData().invalidDate(); + } + + format = expandFormat(format, m.localeData()); + + if (!formatFunctions[format]) { + formatFunctions[format] = makeFormatFunction(format); + } + + return formatFunctions[format](m); + } + + function expandFormat(format, locale) { + var i = 5; + + function replaceLongDateFormatTokens(input) { + return locale.longDateFormat(input) || input; + } + + localFormattingTokens.lastIndex = 0; + while (i >= 0 && localFormattingTokens.test(format)) { + format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); + localFormattingTokens.lastIndex = 0; + i -= 1; + } + + return format; + } + + + /************************************ + Parsing + ************************************/ + + + // get the regex to find the next token + function getParseRegexForToken(token, config) { + var a, strict = config._strict; + switch (token) { + case 'Q': + return parseTokenOneDigit; + case 'DDDD': + return parseTokenThreeDigits; + case 'YYYY': + case 'GGGG': + case 'gggg': + return strict ? parseTokenFourDigits : parseTokenOneToFourDigits; + case 'Y': + case 'G': + case 'g': + return parseTokenSignedNumber; + case 'YYYYYY': + case 'YYYYY': + case 'GGGGG': + case 'ggggg': + return strict ? parseTokenSixDigits : parseTokenOneToSixDigits; + case 'S': + if (strict) { + return parseTokenOneDigit; + } + /* falls through */ + case 'SS': + if (strict) { + return parseTokenTwoDigits; + } + /* falls through */ + case 'SSS': + if (strict) { + return parseTokenThreeDigits; + } + /* falls through */ + case 'DDD': + return parseTokenOneToThreeDigits; + case 'MMM': + case 'MMMM': + case 'dd': + case 'ddd': + case 'dddd': + return parseTokenWord; + case 'a': + case 'A': + return config._locale._meridiemParse; + case 'x': + return parseTokenOffsetMs; + case 'X': + return parseTokenTimestampMs; + case 'Z': + case 'ZZ': + return parseTokenTimezone; + case 'T': + return parseTokenT; + case 'SSSS': + return parseTokenDigits; + case 'MM': + case 'DD': + case 'YY': + case 'GG': + case 'gg': + case 'HH': + case 'hh': + case 'mm': + case 'ss': + case 'ww': + case 'WW': + return strict ? parseTokenTwoDigits : parseTokenOneOrTwoDigits; + case 'M': + case 'D': + case 'd': + case 'H': + case 'h': + case 'm': + case 's': + case 'w': + case 'W': + case 'e': + case 'E': + return parseTokenOneOrTwoDigits; + case 'Do': + return strict ? config._locale._ordinalParse : config._locale._ordinalParseLenient; + default : + a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), 'i')); + return a; + } + } + + function utcOffsetFromString(string) { + string = string || ''; + var possibleTzMatches = (string.match(parseTokenTimezone) || []), + tzChunk = possibleTzMatches[possibleTzMatches.length - 1] || [], + parts = (tzChunk + '').match(parseTimezoneChunker) || ['-', 0, 0], + minutes = +(parts[1] * 60) + toInt(parts[2]); + + return parts[0] === '+' ? minutes : -minutes; + } + + // function to convert string input to date + function addTimeToArrayFromToken(token, input, config) { + var a, datePartArray = config._a; + + switch (token) { + // QUARTER + case 'Q': + if (input != null) { + datePartArray[MONTH] = (toInt(input) - 1) * 3; + } + break; + // MONTH + case 'M' : // fall through to MM + case 'MM' : + if (input != null) { + datePartArray[MONTH] = toInt(input) - 1; + } + break; + case 'MMM' : // fall through to MMMM + case 'MMMM' : + a = config._locale.monthsParse(input, token, config._strict); + // if we didn't find a month name, mark the date as invalid. + if (a != null) { + datePartArray[MONTH] = a; + } else { + config._pf.invalidMonth = input; + } + break; + // DAY OF MONTH + case 'D' : // fall through to DD + case 'DD' : + if (input != null) { + datePartArray[DATE] = toInt(input); + } + break; + case 'Do' : + if (input != null) { + datePartArray[DATE] = toInt(parseInt( + input.match(/\d{1,2}/)[0], 10)); + } + break; + // DAY OF YEAR + case 'DDD' : // fall through to DDDD + case 'DDDD' : + if (input != null) { + config._dayOfYear = toInt(input); + } + + break; + // YEAR + case 'YY' : + datePartArray[YEAR] = moment.parseTwoDigitYear(input); + break; + case 'YYYY' : + case 'YYYYY' : + case 'YYYYYY' : + datePartArray[YEAR] = toInt(input); + break; + // AM / PM + case 'a' : // fall through to A + case 'A' : + config._meridiem = input; + // config._isPm = config._locale.isPM(input); + break; + // HOUR + case 'h' : // fall through to hh + case 'hh' : + config._pf.bigHour = true; + /* falls through */ + case 'H' : // fall through to HH + case 'HH' : + datePartArray[HOUR] = toInt(input); + break; + // MINUTE + case 'm' : // fall through to mm + case 'mm' : + datePartArray[MINUTE] = toInt(input); + break; + // SECOND + case 's' : // fall through to ss + case 'ss' : + datePartArray[SECOND] = toInt(input); + break; + // MILLISECOND + case 'S' : + case 'SS' : + case 'SSS' : + case 'SSSS' : + datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000); + break; + // UNIX OFFSET (MILLISECONDS) + case 'x': + config._d = new Date(toInt(input)); + break; + // UNIX TIMESTAMP WITH MS + case 'X': + config._d = new Date(parseFloat(input) * 1000); + break; + // TIMEZONE + case 'Z' : // fall through to ZZ + case 'ZZ' : + config._useUTC = true; + config._tzm = utcOffsetFromString(input); + break; + // WEEKDAY - human + case 'dd': + case 'ddd': + case 'dddd': + a = config._locale.weekdaysParse(input); + // if we didn't get a weekday name, mark the date as invalid + if (a != null) { + config._w = config._w || {}; + config._w['d'] = a; + } else { + config._pf.invalidWeekday = input; + } + break; + // WEEK, WEEK DAY - numeric + case 'w': + case 'ww': + case 'W': + case 'WW': + case 'd': + case 'e': + case 'E': + token = token.substr(0, 1); + /* falls through */ + case 'gggg': + case 'GGGG': + case 'GGGGG': + token = token.substr(0, 2); + if (input) { + config._w = config._w || {}; + config._w[token] = toInt(input); + } + break; + case 'gg': + case 'GG': + config._w = config._w || {}; + config._w[token] = moment.parseTwoDigitYear(input); + } + } + + function dayOfYearFromWeekInfo(config) { + var w, weekYear, week, weekday, dow, doy, temp; + + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + dow = 1; + doy = 4; + + // TODO: We need to take the current isoWeekYear, but that depends on + // how we interpret now (local, utc, fixed offset). So create + // a now version of current config (take local/utc/offset flags, and + // create now). + weekYear = dfl(w.GG, config._a[YEAR], weekOfYear(moment(), 1, 4).year); + week = dfl(w.W, 1); + weekday = dfl(w.E, 1); + } else { + dow = config._locale._week.dow; + doy = config._locale._week.doy; + + weekYear = dfl(w.gg, config._a[YEAR], weekOfYear(moment(), dow, doy).year); + week = dfl(w.w, 1); + + if (w.d != null) { + // weekday -- low day numbers are considered next week + weekday = w.d; + if (weekday < dow) { + ++week; + } + } else if (w.e != null) { + // local weekday -- counting starts from begining of week + weekday = w.e + dow; + } else { + // default to begining of week + weekday = dow; + } + } + temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow); + + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } + + // convert an array to a date. + // the array should mirror the parameters below + // note: all values past the year are optional and will default to the lowest possible value. + // [year, month, day , hour, minute, second, millisecond] + function dateFromConfig(config) { + var i, date, input = [], currentDate, yearToUse; + + if (config._d) { + return; + } + + currentDate = currentDateArray(config); + + //compute day of the year from weeks and weekdays + if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { + dayOfYearFromWeekInfo(config); + } + + //if the day of the year is set, figure out what it is + if (config._dayOfYear) { + yearToUse = dfl(config._a[YEAR], currentDate[YEAR]); + + if (config._dayOfYear > daysInYear(yearToUse)) { + config._pf._overflowDayOfYear = true; + } + + date = makeUTCDate(yearToUse, 0, config._dayOfYear); + config._a[MONTH] = date.getUTCMonth(); + config._a[DATE] = date.getUTCDate(); + } + + // Default to current date. + // * if no year, month, day of month are given, default to today + // * if day of month is given, default month and year + // * if month is given, default only year + // * if year is given, don't default anything + for (i = 0; i < 3 && config._a[i] == null; ++i) { + config._a[i] = input[i] = currentDate[i]; + } + + // Zero out whatever was not defaulted, including time + for (; i < 7; i++) { + config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; + } + + // Check for 24:00:00.000 + if (config._a[HOUR] === 24 && + config._a[MINUTE] === 0 && + config._a[SECOND] === 0 && + config._a[MILLISECOND] === 0) { + config._nextDay = true; + config._a[HOUR] = 0; + } + + config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input); + // Apply timezone offset from input. The actual utcOffset can be changed + // with parseZone. + if (config._tzm != null) { + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); + } + + if (config._nextDay) { + config._a[HOUR] = 24; + } + } + + function dateFromObject(config) { + var normalizedInput; + + if (config._d) { + return; + } + + normalizedInput = normalizeObjectUnits(config._i); + config._a = [ + normalizedInput.year, + normalizedInput.month, + normalizedInput.day || normalizedInput.date, + normalizedInput.hour, + normalizedInput.minute, + normalizedInput.second, + normalizedInput.millisecond + ]; + + dateFromConfig(config); + } + + function currentDateArray(config) { + var now = new Date(); + if (config._useUTC) { + return [ + now.getUTCFullYear(), + now.getUTCMonth(), + now.getUTCDate() + ]; + } else { + return [now.getFullYear(), now.getMonth(), now.getDate()]; + } + } + + // date from string and format string + function makeDateFromStringAndFormat(config) { + if (config._f === moment.ISO_8601) { + parseISO(config); + return; + } + + config._a = []; + config._pf.empty = true; + + // This array is used to make a Date, either with `new Date` or `Date.UTC` + var string = '' + config._i, + i, parsedInput, tokens, token, skipped, + stringLength = string.length, + totalParsedInputLength = 0; + + tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; + + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; + if (parsedInput) { + skipped = string.substr(0, string.indexOf(parsedInput)); + if (skipped.length > 0) { + config._pf.unusedInput.push(skipped); + } + string = string.slice(string.indexOf(parsedInput) + parsedInput.length); + totalParsedInputLength += parsedInput.length; + } + // don't parse if it's not a known token + if (formatTokenFunctions[token]) { + if (parsedInput) { + config._pf.empty = false; + } + else { + config._pf.unusedTokens.push(token); + } + addTimeToArrayFromToken(token, parsedInput, config); + } + else if (config._strict && !parsedInput) { + config._pf.unusedTokens.push(token); + } + } + + // add remaining unparsed input length to the string + config._pf.charsLeftOver = stringLength - totalParsedInputLength; + if (string.length > 0) { + config._pf.unusedInput.push(string); + } + + // clear _12h flag if hour is <= 12 + if (config._pf.bigHour === true && config._a[HOUR] <= 12) { + config._pf.bigHour = undefined; + } + // handle meridiem + config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], + config._meridiem); + dateFromConfig(config); + checkOverflow(config); + } + + function unescapeFormat(s) { + return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { + return p1 || p2 || p3 || p4; + }); + } + + // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript + function regexpEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + } + + // date from string and array of format strings + function makeDateFromStringAndArray(config) { + var tempConfig, + bestMoment, + + scoreToBeat, + i, + currentScore; + + if (config._f.length === 0) { + config._pf.invalidFormat = true; + config._d = new Date(NaN); + return; + } + + for (i = 0; i < config._f.length; i++) { + currentScore = 0; + tempConfig = copyConfig({}, config); + if (config._useUTC != null) { + tempConfig._useUTC = config._useUTC; + } + tempConfig._pf = defaultParsingFlags(); + tempConfig._f = config._f[i]; + makeDateFromStringAndFormat(tempConfig); + + if (!isValid(tempConfig)) { + continue; + } + + // if there is any input that was not parsed add a penalty for that format + currentScore += tempConfig._pf.charsLeftOver; + + //or tokens + currentScore += tempConfig._pf.unusedTokens.length * 10; + + tempConfig._pf.score = currentScore; + + if (scoreToBeat == null || currentScore < scoreToBeat) { + scoreToBeat = currentScore; + bestMoment = tempConfig; + } + } + + extend(config, bestMoment || tempConfig); + } + + // date from iso format + function parseISO(config) { + var i, l, + string = config._i, + match = isoRegex.exec(string); + + if (match) { + config._pf.iso = true; + for (i = 0, l = isoDates.length; i < l; i++) { + if (isoDates[i][1].exec(string)) { + // match[5] should be 'T' or undefined + config._f = isoDates[i][0] + (match[6] || ' '); + break; + } + } + for (i = 0, l = isoTimes.length; i < l; i++) { + if (isoTimes[i][1].exec(string)) { + config._f += isoTimes[i][0]; + break; + } + } + if (string.match(parseTokenTimezone)) { + config._f += 'Z'; + } + makeDateFromStringAndFormat(config); + } else { + config._isValid = false; + } + } + + // date from iso format or fallback + function makeDateFromString(config) { + parseISO(config); + if (config._isValid === false) { + delete config._isValid; + moment.createFromInputFallback(config); + } + } + + function map(arr, fn) { + var res = [], i; + for (i = 0; i < arr.length; ++i) { + res.push(fn(arr[i], i)); + } + return res; + } + + function makeDateFromInput(config) { + var input = config._i, matched; + if (input === undefined) { + config._d = new Date(); + } else if (isDate(input)) { + config._d = new Date(+input); + } else if ((matched = aspNetJsonRegex.exec(input)) !== null) { + config._d = new Date(+matched[1]); + } else if (typeof input === 'string') { + makeDateFromString(config); + } else if (isArray(input)) { + config._a = map(input.slice(0), function (obj) { + return parseInt(obj, 10); + }); + dateFromConfig(config); + } else if (typeof(input) === 'object') { + dateFromObject(config); + } else if (typeof(input) === 'number') { + // from milliseconds + config._d = new Date(input); + } else { + moment.createFromInputFallback(config); + } + } + + function makeDate(y, m, d, h, M, s, ms) { + //can't just apply() to create a date: + //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply + var date = new Date(y, m, d, h, M, s, ms); + + //the date constructor doesn't accept years < 1970 + if (y < 1970) { + date.setFullYear(y); + } + return date; + } + + function makeUTCDate(y) { + var date = new Date(Date.UTC.apply(null, arguments)); + if (y < 1970) { + date.setUTCFullYear(y); + } + return date; + } + + function parseWeekday(input, locale) { + if (typeof input === 'string') { + if (!isNaN(input)) { + input = parseInt(input, 10); + } + else { + input = locale.weekdaysParse(input); + if (typeof input !== 'number') { + return null; + } + } + } + return input; + } + + /************************************ + Relative Time + ************************************/ + + + // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize + function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { + return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); + } + + function relativeTime(posNegDuration, withoutSuffix, locale) { + var duration = moment.duration(posNegDuration).abs(), + seconds = round(duration.as('s')), + minutes = round(duration.as('m')), + hours = round(duration.as('h')), + days = round(duration.as('d')), + months = round(duration.as('M')), + years = round(duration.as('y')), + + args = seconds < relativeTimeThresholds.s && ['s', seconds] || + minutes === 1 && ['m'] || + minutes < relativeTimeThresholds.m && ['mm', minutes] || + hours === 1 && ['h'] || + hours < relativeTimeThresholds.h && ['hh', hours] || + days === 1 && ['d'] || + days < relativeTimeThresholds.d && ['dd', days] || + months === 1 && ['M'] || + months < relativeTimeThresholds.M && ['MM', months] || + years === 1 && ['y'] || ['yy', years]; + + args[2] = withoutSuffix; + args[3] = +posNegDuration > 0; + args[4] = locale; + return substituteTimeAgo.apply({}, args); + } + + + /************************************ + Week of Year + ************************************/ + + + // firstDayOfWeek 0 = sun, 6 = sat + // the day of the week that starts the week + // (usually sunday or monday) + // firstDayOfWeekOfYear 0 = sun, 6 = sat + // the first week is the week that contains the first + // of this day of the week + // (eg. ISO weeks use thursday (4)) + function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) { + var end = firstDayOfWeekOfYear - firstDayOfWeek, + daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(), + adjustedMoment; + + + if (daysToDayOfWeek > end) { + daysToDayOfWeek -= 7; + } + + if (daysToDayOfWeek < end - 7) { + daysToDayOfWeek += 7; + } + + adjustedMoment = moment(mom).add(daysToDayOfWeek, 'd'); + return { + week: Math.ceil(adjustedMoment.dayOfYear() / 7), + year: adjustedMoment.year() + }; + } + + //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday + function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) { + var d = makeUTCDate(year, 0, 1).getUTCDay(), daysToAdd, dayOfYear; + + d = d === 0 ? 7 : d; + weekday = weekday != null ? weekday : firstDayOfWeek; + daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0); + dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1; + + return { + year: dayOfYear > 0 ? year : year - 1, + dayOfYear: dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear + }; + } + + /************************************ + Top Level Functions + ************************************/ + + function makeMoment(config) { + var input = config._i, + format = config._f, + res; + + config._locale = config._locale || moment.localeData(config._l); + + if (input === null || (format === undefined && input === '')) { + return moment.invalid({nullInput: true}); + } + + if (typeof input === 'string') { + config._i = input = config._locale.preparse(input); + } + + if (moment.isMoment(input)) { + return new Moment(input, true); + } else if (format) { + if (isArray(format)) { + makeDateFromStringAndArray(config); + } else { + makeDateFromStringAndFormat(config); + } + } else { + makeDateFromInput(config); + } + + res = new Moment(config); + if (res._nextDay) { + // Adding is smart enough around DST + res.add(1, 'd'); + res._nextDay = undefined; + } + + return res; + } + + moment = function (input, format, locale, strict) { + var c; + + if (typeof(locale) === 'boolean') { + strict = locale; + locale = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c = {}; + c._isAMomentObject = true; + c._i = input; + c._f = format; + c._l = locale; + c._strict = strict; + c._isUTC = false; + c._pf = defaultParsingFlags(); + + return makeMoment(c); + }; + + moment.suppressDeprecationWarnings = false; + + moment.createFromInputFallback = deprecate( + 'moment construction falls back to js Date. This is ' + + 'discouraged and will be removed in upcoming major ' + + 'release. Please refer to ' + + 'https://github.com/moment/moment/issues/1407 for more info.', + function (config) { + config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); + } + ); + + // Pick a moment m from moments so that m[fn](other) is true for all + // other. This relies on the function fn to be transitive. + // + // moments should either be an array of moment objects or an array, whose + // first element is an array of moment objects. + function pickBy(fn, moments) { + var res, i; + if (moments.length === 1 && isArray(moments[0])) { + moments = moments[0]; + } + if (!moments.length) { + return moment(); + } + res = moments[0]; + for (i = 1; i < moments.length; ++i) { + if (moments[i][fn](res)) { + res = moments[i]; + } + } + return res; + } + + moment.min = function () { + var args = [].slice.call(arguments, 0); + + return pickBy('isBefore', args); + }; + + moment.max = function () { + var args = [].slice.call(arguments, 0); + + return pickBy('isAfter', args); + }; + + // creating with utc + moment.utc = function (input, format, locale, strict) { + var c; + + if (typeof(locale) === 'boolean') { + strict = locale; + locale = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c = {}; + c._isAMomentObject = true; + c._useUTC = true; + c._isUTC = true; + c._l = locale; + c._i = input; + c._f = format; + c._strict = strict; + c._pf = defaultParsingFlags(); + + return makeMoment(c).utc(); + }; + + // creating with unix timestamp (in seconds) + moment.unix = function (input) { + return moment(input * 1000); + }; + + // duration + moment.duration = function (input, key) { + var duration = input, + // matching against regexp is expensive, do it on demand + match = null, + sign, + ret, + parseIso, + diffRes; + + if (moment.isDuration(input)) { + duration = { + ms: input._milliseconds, + d: input._days, + M: input._months + }; + } else if (typeof input === 'number') { + duration = {}; + if (key) { + duration[key] = input; + } else { + duration.milliseconds = input; + } + } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + duration = { + y: 0, + d: toInt(match[DATE]) * sign, + h: toInt(match[HOUR]) * sign, + m: toInt(match[MINUTE]) * sign, + s: toInt(match[SECOND]) * sign, + ms: toInt(match[MILLISECOND]) * sign + }; + } else if (!!(match = isoDurationRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + parseIso = function (inp) { + // We'd normally use ~~inp for this, but unfortunately it also + // converts floats to ints. + // inp may be undefined, so careful calling replace on it. + var res = inp && parseFloat(inp.replace(',', '.')); + // apply sign while we're at it + return (isNaN(res) ? 0 : res) * sign; + }; + duration = { + y: parseIso(match[2]), + M: parseIso(match[3]), + d: parseIso(match[4]), + h: parseIso(match[5]), + m: parseIso(match[6]), + s: parseIso(match[7]), + w: parseIso(match[8]) + }; + } else if (duration == null) {// checks for null or undefined + duration = {}; + } else if (typeof duration === 'object' && + ('from' in duration || 'to' in duration)) { + diffRes = momentsDifference(moment(duration.from), moment(duration.to)); + + duration = {}; + duration.ms = diffRes.milliseconds; + duration.M = diffRes.months; + } + + ret = new Duration(duration); + + if (moment.isDuration(input) && hasOwnProp(input, '_locale')) { + ret._locale = input._locale; + } + + return ret; + }; + + // version number + moment.version = VERSION; + + // default format + moment.defaultFormat = isoFormat; + + // constant that refers to the ISO standard + moment.ISO_8601 = function () {}; + + // Plugins that add properties should also add the key here (null value), + // so we can properly clone ourselves. + moment.momentProperties = momentProperties; + + // This function will be called whenever a moment is mutated. + // It is intended to keep the offset in sync with the timezone. + moment.updateOffset = function () {}; + + // This function allows you to set a threshold for relative time strings + moment.relativeTimeThreshold = function (threshold, limit) { + if (relativeTimeThresholds[threshold] === undefined) { + return false; + } + if (limit === undefined) { + return relativeTimeThresholds[threshold]; + } + relativeTimeThresholds[threshold] = limit; + return true; + }; + + moment.lang = deprecate( + 'moment.lang is deprecated. Use moment.locale instead.', + function (key, value) { + return moment.locale(key, value); + } + ); + + // This function will load locale and then set the global locale. If + // no arguments are passed in, it will simply return the current global + // locale key. + moment.locale = function (key, values) { + var data; + if (key) { + if (typeof(values) !== 'undefined') { + data = moment.defineLocale(key, values); + } + else { + data = moment.localeData(key); + } + + if (data) { + moment.duration._locale = moment._locale = data; + } + } + + return moment._locale._abbr; + }; + + moment.defineLocale = function (name, values) { + if (values !== null) { + values.abbr = name; + if (!locales[name]) { + locales[name] = new Locale(); + } + locales[name].set(values); + + // backwards compat for now: also set the locale + moment.locale(name); + + return locales[name]; + } else { + // useful for testing + delete locales[name]; + return null; + } + }; + + moment.langData = deprecate( + 'moment.langData is deprecated. Use moment.localeData instead.', + function (key) { + return moment.localeData(key); + } + ); + + // returns locale data + moment.localeData = function (key) { + var locale; + + if (key && key._locale && key._locale._abbr) { + key = key._locale._abbr; + } + + if (!key) { + return moment._locale; + } + + if (!isArray(key)) { + //short-circuit everything else + locale = loadLocale(key); + if (locale) { + return locale; + } + key = [key]; + } + + return chooseLocale(key); + }; + + // compare moment object + moment.isMoment = function (obj) { + return obj instanceof Moment || + (obj != null && hasOwnProp(obj, '_isAMomentObject')); + }; + + // for typechecking Duration objects + moment.isDuration = function (obj) { + return obj instanceof Duration; + }; + + for (i = lists.length - 1; i >= 0; --i) { + makeList(lists[i]); + } + + moment.normalizeUnits = function (units) { + return normalizeUnits(units); + }; + + moment.invalid = function (flags) { + var m = moment.utc(NaN); + if (flags != null) { + extend(m._pf, flags); + } + else { + m._pf.userInvalidated = true; + } + + return m; + }; + + moment.parseZone = function () { + return moment.apply(null, arguments).parseZone(); + }; + + moment.parseTwoDigitYear = function (input) { + return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); + }; + + moment.isDate = isDate; + + /************************************ + Moment Prototype + ************************************/ + + + extend(moment.fn = Moment.prototype, { + + clone : function () { + return moment(this); + }, + + valueOf : function () { + return +this._d - ((this._offset || 0) * 60000); + }, + + unix : function () { + return Math.floor(+this / 1000); + }, + + toString : function () { + return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); + }, + + toDate : function () { + return this._offset ? new Date(+this) : this._d; + }, + + toISOString : function () { + var m = moment(this).utc(); + if (0 < m.year() && m.year() <= 9999) { + if ('function' === typeof Date.prototype.toISOString) { + // native implementation is ~50x faster, use it when we can + return this.toDate().toISOString(); + } else { + return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } + } else { + return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } + }, + + toArray : function () { + var m = this; + return [ + m.year(), + m.month(), + m.date(), + m.hours(), + m.minutes(), + m.seconds(), + m.milliseconds() + ]; + }, + + isValid : function () { + return isValid(this); + }, + + isDSTShifted : function () { + if (this._a) { + return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0; + } + + return false; + }, + + parsingFlags : function () { + return extend({}, this._pf); + }, + + invalidAt: function () { + return this._pf.overflow; + }, + + utc : function (keepLocalTime) { + return this.utcOffset(0, keepLocalTime); + }, + + local : function (keepLocalTime) { + if (this._isUTC) { + this.utcOffset(0, keepLocalTime); + this._isUTC = false; + + if (keepLocalTime) { + this.subtract(this._dateUtcOffset(), 'm'); + } + } + return this; + }, + + format : function (inputString) { + var output = formatMoment(this, inputString || moment.defaultFormat); + return this.localeData().postformat(output); + }, + + add : createAdder(1, 'add'), + + subtract : createAdder(-1, 'subtract'), + + diff : function (input, units, asFloat) { + var that = makeAs(input, this), + zoneDiff = (that.utcOffset() - this.utcOffset()) * 6e4, + anchor, diff, output, daysAdjust; + + units = normalizeUnits(units); + + if (units === 'year' || units === 'month' || units === 'quarter') { + output = monthDiff(this, that); + if (units === 'quarter') { + output = output / 3; + } else if (units === 'year') { + output = output / 12; + } + } else { + diff = this - that; + output = units === 'second' ? diff / 1e3 : // 1000 + units === 'minute' ? diff / 6e4 : // 1000 * 60 + units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60 + units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst + units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst + diff; + } + return asFloat ? output : absRound(output); + }, + + from : function (time, withoutSuffix) { + return moment.duration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); + }, + + fromNow : function (withoutSuffix) { + return this.from(moment(), withoutSuffix); + }, + + calendar : function (time) { + // We want to compare the start of today, vs this. + // Getting start-of-today depends on whether we're locat/utc/offset + // or not. + var now = time || moment(), + sod = makeAs(now, this).startOf('day'), + diff = this.diff(sod, 'days', true), + format = diff < -6 ? 'sameElse' : + diff < -1 ? 'lastWeek' : + diff < 0 ? 'lastDay' : + diff < 1 ? 'sameDay' : + diff < 2 ? 'nextDay' : + diff < 7 ? 'nextWeek' : 'sameElse'; + return this.format(this.localeData().calendar(format, this, moment(now))); + }, + + isLeapYear : function () { + return isLeapYear(this.year()); + }, + + isDST : function () { + return (this.utcOffset() > this.clone().month(0).utcOffset() || + this.utcOffset() > this.clone().month(5).utcOffset()); + }, + + day : function (input) { + var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); + if (input != null) { + input = parseWeekday(input, this.localeData()); + return this.add(input - day, 'd'); + } else { + return day; + } + }, + + month : makeAccessor('Month', true), + + startOf : function (units) { + units = normalizeUnits(units); + // the following switch intentionally omits break keywords + // to utilize falling through the cases. + switch (units) { + case 'year': + this.month(0); + /* falls through */ + case 'quarter': + case 'month': + this.date(1); + /* falls through */ + case 'week': + case 'isoWeek': + case 'day': + this.hours(0); + /* falls through */ + case 'hour': + this.minutes(0); + /* falls through */ + case 'minute': + this.seconds(0); + /* falls through */ + case 'second': + this.milliseconds(0); + /* falls through */ + } + + // weeks are a special case + if (units === 'week') { + this.weekday(0); + } else if (units === 'isoWeek') { + this.isoWeekday(1); + } + + // quarters are also special + if (units === 'quarter') { + this.month(Math.floor(this.month() / 3) * 3); + } + + return this; + }, + + endOf: function (units) { + units = normalizeUnits(units); + if (units === undefined || units === 'millisecond') { + return this; + } + return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); + }, + + isAfter: function (input, units) { + var inputMs; + units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); + if (units === 'millisecond') { + input = moment.isMoment(input) ? input : moment(input); + return +this > +input; + } else { + inputMs = moment.isMoment(input) ? +input : +moment(input); + return inputMs < +this.clone().startOf(units); + } + }, + + isBefore: function (input, units) { + var inputMs; + units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); + if (units === 'millisecond') { + input = moment.isMoment(input) ? input : moment(input); + return +this < +input; + } else { + inputMs = moment.isMoment(input) ? +input : +moment(input); + return +this.clone().endOf(units) < inputMs; + } + }, + + isBetween: function (from, to, units) { + return this.isAfter(from, units) && this.isBefore(to, units); + }, + + isSame: function (input, units) { + var inputMs; + units = normalizeUnits(units || 'millisecond'); + if (units === 'millisecond') { + input = moment.isMoment(input) ? input : moment(input); + return +this === +input; + } else { + inputMs = +moment(input); + return +(this.clone().startOf(units)) <= inputMs && inputMs <= +(this.clone().endOf(units)); + } + }, + + min: deprecate( + 'moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548', + function (other) { + other = moment.apply(null, arguments); + return other < this ? this : other; + } + ), + + max: deprecate( + 'moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548', + function (other) { + other = moment.apply(null, arguments); + return other > this ? this : other; + } + ), + + zone : deprecate( + 'moment().zone is deprecated, use moment().utcOffset instead. ' + + 'https://github.com/moment/moment/issues/1779', + function (input, keepLocalTime) { + if (input != null) { + if (typeof input !== 'string') { + input = -input; + } + + this.utcOffset(input, keepLocalTime); + + return this; + } else { + return -this.utcOffset(); + } + } + ), + + // keepLocalTime = true means only change the timezone, without + // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> + // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset + // +0200, so we adjust the time as needed, to be valid. + // + // Keeping the time actually adds/subtracts (one hour) + // from the actual represented time. That is why we call updateOffset + // a second time. In case it wants us to change the offset again + // _changeInProgress == true case, then we have to adjust, because + // there is no such time in the given timezone. + utcOffset : function (input, keepLocalTime) { + var offset = this._offset || 0, + localAdjust; + if (input != null) { + if (typeof input === 'string') { + input = utcOffsetFromString(input); + } + if (Math.abs(input) < 16) { + input = input * 60; + } + if (!this._isUTC && keepLocalTime) { + localAdjust = this._dateUtcOffset(); + } + this._offset = input; + this._isUTC = true; + if (localAdjust != null) { + this.add(localAdjust, 'm'); + } + if (offset !== input) { + if (!keepLocalTime || this._changeInProgress) { + addOrSubtractDurationFromMoment(this, + moment.duration(input - offset, 'm'), 1, false); + } else if (!this._changeInProgress) { + this._changeInProgress = true; + moment.updateOffset(this, true); + this._changeInProgress = null; + } + } + + return this; + } else { + return this._isUTC ? offset : this._dateUtcOffset(); + } + }, + + isLocal : function () { + return !this._isUTC; + }, + + isUtcOffset : function () { + return this._isUTC; + }, + + isUtc : function () { + return this._isUTC && this._offset === 0; + }, + + zoneAbbr : function () { + return this._isUTC ? 'UTC' : ''; + }, + + zoneName : function () { + return this._isUTC ? 'Coordinated Universal Time' : ''; + }, + + parseZone : function () { + if (this._tzm) { + this.utcOffset(this._tzm); + } else if (typeof this._i === 'string') { + this.utcOffset(utcOffsetFromString(this._i)); + } + return this; + }, + + hasAlignedHourOffset : function (input) { + if (!input) { + input = 0; + } + else { + input = moment(input).utcOffset(); + } + + return (this.utcOffset() - input) % 60 === 0; + }, + + daysInMonth : function () { + return daysInMonth(this.year(), this.month()); + }, + + dayOfYear : function (input) { + var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1; + return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); + }, + + quarter : function (input) { + return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); + }, + + weekYear : function (input) { + var year = weekOfYear(this, this.localeData()._week.dow, this.localeData()._week.doy).year; + return input == null ? year : this.add((input - year), 'y'); + }, + + isoWeekYear : function (input) { + var year = weekOfYear(this, 1, 4).year; + return input == null ? year : this.add((input - year), 'y'); + }, + + week : function (input) { + var week = this.localeData().week(this); + return input == null ? week : this.add((input - week) * 7, 'd'); + }, + + isoWeek : function (input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add((input - week) * 7, 'd'); + }, + + weekday : function (input) { + var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; + return input == null ? weekday : this.add(input - weekday, 'd'); + }, + + isoWeekday : function (input) { + // behaves the same as moment#day except + // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) + // as a setter, sunday should belong to the previous week. + return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7); + }, + + isoWeeksInYear : function () { + return weeksInYear(this.year(), 1, 4); + }, + + weeksInYear : function () { + var weekInfo = this.localeData()._week; + return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); + }, + + get : function (units) { + units = normalizeUnits(units); + return this[units](); + }, + + set : function (units, value) { + var unit; + if (typeof units === 'object') { + for (unit in units) { + this.set(unit, units[unit]); + } + } + else { + units = normalizeUnits(units); + if (typeof this[units] === 'function') { + this[units](value); + } + } + return this; + }, + + // If passed a locale key, it will set the locale for this + // instance. Otherwise, it will return the locale configuration + // variables for this instance. + locale : function (key) { + var newLocaleData; + + if (key === undefined) { + return this._locale._abbr; + } else { + newLocaleData = moment.localeData(key); + if (newLocaleData != null) { + this._locale = newLocaleData; + } + return this; + } + }, + + lang : deprecate( + 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', + function (key) { + if (key === undefined) { + return this.localeData(); + } else { + return this.locale(key); + } + } + ), + + localeData : function () { + return this._locale; + }, + + _dateUtcOffset : function () { + // On Firefox.24 Date#getTimezoneOffset returns a floating point. + // https://github.com/moment/moment/pull/1871 + return -Math.round(this._d.getTimezoneOffset() / 15) * 15; + } + + }); + + function rawMonthSetter(mom, value) { + var dayOfMonth; + + // TODO: Move this out of here! + if (typeof value === 'string') { + value = mom.localeData().monthsParse(value); + // TODO: Another silent failure? + if (typeof value !== 'number') { + return mom; + } + } + + dayOfMonth = Math.min(mom.date(), + daysInMonth(mom.year(), value)); + mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); + return mom; + } + + function rawGetter(mom, unit) { + return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit](); + } + + function rawSetter(mom, unit, value) { + if (unit === 'Month') { + return rawMonthSetter(mom, value); + } else { + return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); + } + } + + function makeAccessor(unit, keepTime) { + return function (value) { + if (value != null) { + rawSetter(this, unit, value); + moment.updateOffset(this, keepTime); + return this; + } else { + return rawGetter(this, unit); + } + }; + } + + moment.fn.millisecond = moment.fn.milliseconds = makeAccessor('Milliseconds', false); + moment.fn.second = moment.fn.seconds = makeAccessor('Seconds', false); + moment.fn.minute = moment.fn.minutes = makeAccessor('Minutes', false); + // Setting the hour should keep the time, because the user explicitly + // specified which hour he wants. So trying to maintain the same hour (in + // a new timezone) makes sense. Adding/subtracting hours does not follow + // this rule. + moment.fn.hour = moment.fn.hours = makeAccessor('Hours', true); + // moment.fn.month is defined separately + moment.fn.date = makeAccessor('Date', true); + moment.fn.dates = deprecate('dates accessor is deprecated. Use date instead.', makeAccessor('Date', true)); + moment.fn.year = makeAccessor('FullYear', true); + moment.fn.years = deprecate('years accessor is deprecated. Use year instead.', makeAccessor('FullYear', true)); + + // add plural methods + moment.fn.days = moment.fn.day; + moment.fn.months = moment.fn.month; + moment.fn.weeks = moment.fn.week; + moment.fn.isoWeeks = moment.fn.isoWeek; + moment.fn.quarters = moment.fn.quarter; + + // add aliased format methods + moment.fn.toJSON = moment.fn.toISOString; + + // alias isUtc for dev-friendliness + moment.fn.isUTC = moment.fn.isUtc; + + /************************************ + Duration Prototype + ************************************/ + + + function daysToYears (days) { + // 400 years have 146097 days (taking into account leap year rules) + return days * 400 / 146097; + } + + function yearsToDays (years) { + // years * 365 + absRound(years / 4) - + // absRound(years / 100) + absRound(years / 400); + return years * 146097 / 400; + } + + extend(moment.duration.fn = Duration.prototype, { + + _bubble : function () { + var milliseconds = this._milliseconds, + days = this._days, + months = this._months, + data = this._data, + seconds, minutes, hours, years = 0; + + // The following code bubbles up values, see the tests for + // examples of what that means. + data.milliseconds = milliseconds % 1000; + + seconds = absRound(milliseconds / 1000); + data.seconds = seconds % 60; + + minutes = absRound(seconds / 60); + data.minutes = minutes % 60; + + hours = absRound(minutes / 60); + data.hours = hours % 24; + + days += absRound(hours / 24); + + // Accurately convert days to years, assume start from year 0. + years = absRound(daysToYears(days)); + days -= absRound(yearsToDays(years)); + + // 30 days to a month + // TODO (iskren): Use anchor date (like 1st Jan) to compute this. + months += absRound(days / 30); + days %= 30; + + // 12 months -> 1 year + years += absRound(months / 12); + months %= 12; + + data.days = days; + data.months = months; + data.years = years; + }, + + abs : function () { + this._milliseconds = Math.abs(this._milliseconds); + this._days = Math.abs(this._days); + this._months = Math.abs(this._months); + + this._data.milliseconds = Math.abs(this._data.milliseconds); + this._data.seconds = Math.abs(this._data.seconds); + this._data.minutes = Math.abs(this._data.minutes); + this._data.hours = Math.abs(this._data.hours); + this._data.months = Math.abs(this._data.months); + this._data.years = Math.abs(this._data.years); + + return this; + }, + + weeks : function () { + return absRound(this.days() / 7); + }, + + valueOf : function () { + return this._milliseconds + + this._days * 864e5 + + (this._months % 12) * 2592e6 + + toInt(this._months / 12) * 31536e6; + }, + + humanize : function (withSuffix) { + var output = relativeTime(this, !withSuffix, this.localeData()); + + if (withSuffix) { + output = this.localeData().pastFuture(+this, output); + } + + return this.localeData().postformat(output); + }, + + add : function (input, val) { + // supports only 2.0-style add(1, 's') or add(moment) + var dur = moment.duration(input, val); + + this._milliseconds += dur._milliseconds; + this._days += dur._days; + this._months += dur._months; + + this._bubble(); + + return this; + }, + + subtract : function (input, val) { + var dur = moment.duration(input, val); + + this._milliseconds -= dur._milliseconds; + this._days -= dur._days; + this._months -= dur._months; + + this._bubble(); + + return this; + }, + + get : function (units) { + units = normalizeUnits(units); + return this[units.toLowerCase() + 's'](); + }, + + as : function (units) { + var days, months; + units = normalizeUnits(units); + + if (units === 'month' || units === 'year') { + days = this._days + this._milliseconds / 864e5; + months = this._months + daysToYears(days) * 12; + return units === 'month' ? months : months / 12; + } else { + // handle milliseconds separately because of floating point math errors (issue #1867) + days = this._days + Math.round(yearsToDays(this._months / 12)); + switch (units) { + case 'week': return days / 7 + this._milliseconds / 6048e5; + case 'day': return days + this._milliseconds / 864e5; + case 'hour': return days * 24 + this._milliseconds / 36e5; + case 'minute': return days * 24 * 60 + this._milliseconds / 6e4; + case 'second': return days * 24 * 60 * 60 + this._milliseconds / 1000; + // Math.floor prevents floating point math errors here + case 'millisecond': return Math.floor(days * 24 * 60 * 60 * 1000) + this._milliseconds; + default: throw new Error('Unknown unit ' + units); + } + } + }, + + lang : moment.fn.lang, + locale : moment.fn.locale, + + toIsoString : deprecate( + 'toIsoString() is deprecated. Please use toISOString() instead ' + + '(notice the capitals)', + function () { + return this.toISOString(); + } + ), + + toISOString : function () { + // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js + var years = Math.abs(this.years()), + months = Math.abs(this.months()), + days = Math.abs(this.days()), + hours = Math.abs(this.hours()), + minutes = Math.abs(this.minutes()), + seconds = Math.abs(this.seconds() + this.milliseconds() / 1000); + + if (!this.asSeconds()) { + // this is the same as C#'s (Noda) and python (isodate)... + // but not other JS (goog.date) + return 'P0D'; + } + + return (this.asSeconds() < 0 ? '-' : '') + + 'P' + + (years ? years + 'Y' : '') + + (months ? months + 'M' : '') + + (days ? days + 'D' : '') + + ((hours || minutes || seconds) ? 'T' : '') + + (hours ? hours + 'H' : '') + + (minutes ? minutes + 'M' : '') + + (seconds ? seconds + 'S' : ''); + }, + + localeData : function () { + return this._locale; + }, + + toJSON : function () { + return this.toISOString(); + } + }); + + moment.duration.fn.toString = moment.duration.fn.toISOString; + + function makeDurationGetter(name) { + moment.duration.fn[name] = function () { + return this._data[name]; + }; + } + + for (i in unitMillisecondFactors) { + if (hasOwnProp(unitMillisecondFactors, i)) { + makeDurationGetter(i.toLowerCase()); + } + } + + moment.duration.fn.asMilliseconds = function () { + return this.as('ms'); + }; + moment.duration.fn.asSeconds = function () { + return this.as('s'); + }; + moment.duration.fn.asMinutes = function () { + return this.as('m'); + }; + moment.duration.fn.asHours = function () { + return this.as('h'); + }; + moment.duration.fn.asDays = function () { + return this.as('d'); + }; + moment.duration.fn.asWeeks = function () { + return this.as('weeks'); + }; + moment.duration.fn.asMonths = function () { + return this.as('M'); + }; + moment.duration.fn.asYears = function () { + return this.as('y'); + }; + + /************************************ + Default Locale + ************************************/ + + + // Set default locale, other locale will inherit from English. + moment.locale('en', { + ordinalParse: /\d{1,2}(th|st|nd|rd)/, + ordinal : function (number) { + var b = number % 10, + output = (toInt(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); + + /* EMBED_LOCALES */ + + /************************************ + Exposing Moment + ************************************/ + + function makeGlobal(shouldDeprecate) { + /*global ender:false */ + if (typeof ender !== 'undefined') { + return; + } + oldGlobalMoment = globalScope.moment; + if (shouldDeprecate) { + globalScope.moment = deprecate( + 'Accessing Moment through the global scope is ' + + 'deprecated, and will be removed in an upcoming ' + + 'release.', + moment); + } else { + globalScope.moment = moment; + } + } + + // CommonJS module is defined + if (hasModule) { + module.exports = moment; + } else if (typeof define === 'function' && define.amd) { + define(function (require, exports, module) { + if (module.config && module.config() && module.config().noGlobal === true) { + // release the global variable + globalScope.moment = oldGlobalMoment; + } + + return moment; + }); + makeGlobal(true); + } else { + makeGlobal(); + } +}).call(this); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/package.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/package.js new file mode 100644 index 0000000..aba8d50 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/package.js @@ -0,0 +1,11 @@ +var profile = { + resourceTags: { + ignore: function(filename, mid){ + // only include moment/moment + return mid != "moment/moment"; + }, + amd: function(filename, mid){ + return /\.js$/.test(filename); + } + } +}; diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/package.json b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/package.json new file mode 100644 index 0000000..8b47326 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/node_modules/moment/package.json @@ -0,0 +1,121 @@ +{ + "name": "moment", + "version": "2.9.0", + "description": "Parse, validate, manipulate, and display dates", + "homepage": "http://momentjs.com", + "author": { + "name": "Iskren Ivov Chernev", + "email": "iskren.chernev@gmail.com", + "url": "https://github.com/ichernev" + }, + "contributors": [ + { + "name": "Tim Wood", + "email": "washwithcare@gmail.com", + "url": "http://timwoodcreates.com/" + }, + { + "name": "Rocky Meza", + "url": "http://rockymeza.com" + }, + { + "name": "Matt Johnson", + "email": "mj1856@hotmail.com", + "url": "http://codeofmatt.com" + }, + { + "name": "Isaac Cambron", + "email": "isaac@isaaccambron.com", + "url": "http://isaaccambron.com" + }, + { + "name": "Andre Polykanine", + "email": "andre@oire.org", + "url": "https://github.com/oire" + } + ], + "keywords": [ + "moment", + "date", + "time", + "parse", + "format", + "validate", + "i18n", + "l10n", + "ender" + ], + "main": "./moment.js", + "engines": { + "node": "*" + }, + "repository": { + "type": "git", + "url": "https://github.com/moment/moment.git" + }, + "bugs": { + "url": "https://github.com/moment/moment/issues" + }, + "licenses": [ + { + "type": "MIT" + } + ], + "devDependencies": { + "uglify-js": "latest", + "grunt": "latest", + "nodeunit": "latest", + "benchmark": "latest", + "grunt-contrib-clean": "latest", + "grunt-contrib-jshint": "latest", + "grunt-contrib-nodeunit": "latest", + "grunt-contrib-concat": "latest", + "grunt-contrib-uglify": "latest", + "grunt-contrib-watch": "latest", + "grunt-env": "latest", + "grunt-jscs": "latest", + "grunt-karma": "latest", + "grunt-nuget": "latest", + "grunt-benchmark": "latest", + "grunt-string-replace": "latest", + "grunt-exec": "latest", + "load-grunt-tasks": "latest", + "karma": "latest", + "karma-chrome-launcher": "latest", + "karma-firefox-launcher": "latest", + "karma-nodeunit": "latest", + "karma-sauce-launcher": "latest", + "spacejam": "latest" + }, + "scripts": { + "test": "grunt test:node" + }, + "ender": "./ender.js", + "dojoBuild": "package.js", + "jspm": { + "files": [ + "moment.js", + "locale" + ], + "map": { + "moment": "./moment" + }, + "buildConfig": { + "uglify": true + } + }, + "spm": { + "main": "moment.js", + "output": [ + "locale/*.js" + ] + }, + "readme": "[![NPM version][npm-version-image]][npm-url] [![NPM downloads][npm-downloads-image]][npm-url] [![MIT License][license-image]][license-url] [![Build Status][travis-image]][travis-url]\n\nA lightweight JavaScript date library for parsing, validating, manipulating, and formatting dates.\n\n## [Documentation](http://momentjs.com/docs/)\n\n## Upgrading to 2.0.0\n\nThere are a number of small backwards incompatible changes with version 2.0.0. [See the full descriptions here](https://gist.github.com/timrwood/e72f2eef320ed9e37c51#backwards-incompatible-changes)\n\n * Changed language ordinal method to return the number + ordinal instead of just the ordinal.\n\n * Changed two digit year parsing cutoff to match strptime.\n\n * Removed `moment#sod` and `moment#eod` in favor of `moment#startOf` and `moment#endOf`.\n\n * Removed `moment.humanizeDuration()` in favor of `moment.duration().humanize()`.\n\n * Removed the lang data objects from the top level namespace.\n\n * Duplicate `Date` passed to `moment()` instead of referencing it.\n\n## [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md)\n\n## [Contributing](https://github.com/moment/moment/blob/develop/CONTRIBUTING.md)\n\n## License\n\nMoment.js is freely distributable under the terms of the [MIT license](https://github.com/moment/moment/blob/develop/LICENSE).\n\n[license-image]: http://img.shields.io/badge/license-MIT-blue.svg?style=flat\n[license-url]: LICENSE\n\n[npm-url]: https://npmjs.org/package/moment\n[npm-version-image]: http://img.shields.io/npm/v/moment.svg?style=flat\n[npm-downloads-image]: http://img.shields.io/npm/dm/moment.svg?style=flat\n\n[travis-url]: http://travis-ci.org/moment/moment\n[travis-image]: http://img.shields.io/travis/moment/moment/develop.svg?style=flat\n", + "readmeFilename": "README.md", + "_id": "moment@2.9.0", + "dist": { + "shasum": "77ec1175fa294f42627f10c8e6de6302c036f6d5" + }, + "_from": "moment@2.x.x", + "_resolved": "https://registry.npmjs.org/moment/-/moment-2.9.0.tgz" +} diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/package.json b/node_modules/hapi/node_modules/heavy/node_modules/joi/package.json new file mode 100644 index 0000000..1bbd4b4 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/package.json @@ -0,0 +1,44 @@ +{ + "name": "joi", + "description": "Object schema validation", + "version": "5.1.0", + "repository": { + "type": "git", + "url": "git://github.com/hapijs/joi" + }, + "main": "index", + "keywords": [ + "schema", + "validation" + ], + "engines": { + "node": ">=0.10.30" + }, + "dependencies": { + "hoek": "^2.2.x", + "topo": "1.x.x", + "isemail": "1.x.x", + "moment": "2.x.x" + }, + "devDependencies": { + "code": "1.x.x", + "lab": "5.x.x" + }, + "scripts": { + "test": "lab -t 100 -a code", + "test-cov-html": "lab -r html -o coverage.html -a code" + }, + "licenses": [ + { + "type": "BSD", + "url": "http://github.com/hapijs/joi/raw/master/LICENSE" + } + ], + "readme": "![joi Logo](https://raw.github.com/hapijs/joi/master/images/joi.png)\n\nObject schema description language and validator for JavaScript objects.\n\n[![npm version](https://badge.fury.io/js/joi.svg)](http://badge.fury.io/js/joi)\n[![Build Status](https://secure.travis-ci.org/hapijs/joi.svg)](http://travis-ci.org/hapijs/joi)\n[![Dependencies Status](https://david-dm.org/hapijs/joi.svg)](https://david-dm.org/hapijs/joi)\n[![DevDependencies Status](https://david-dm.org/hapijs/joi/dev-status.svg)](https://david-dm.org/hapijs/joi#info=devDependencies)\n\nLead Maintainer: [Nicolas Morel](https://github.com/marsup)\n\n## Table of Contents\n\n\n- [Example](#example)\n- [Usage](#usage)\n - [`validate(value, schema, [options], [callback])`](#validatevalue-schema-options-callback)\n - [`compile(schema)`](#compileschema)\n - [`assert(value, schema, [message])`](#assertvalue-schema-message)\n - [`any`](#any)\n - [`any.allow(value)`](#anyallowvalue)\n - [`any.valid(value)`](#anyvalidvalue)\n - [`any.invalid(value)`](#anyinvalidvalue)\n - [`any.required()`](#anyrequired)\n - [`any.optional()`](#anyoptional)\n - [`any.forbidden()`](#anyforbidden)\n - [`any.description(desc)`](#anydescriptiondesc)\n - [`any.notes(notes)`](#anynotesnotes)\n - [`any.tags(tags)`](#anytagstags)\n - [`any.meta(meta)`](#anymetameta)\n - [`any.example(value)`](#anyexamplevalue)\n - [`any.unit(name)`](#anyunitname)\n - [`any.options(options)`](#anyoptionsoptions)\n - [`any.strict()`](#anystrict)\n - [`any.default(value)`](#anydefaultvalue)\n - [`any.concat(schema)`](#anyconcatschema)\n - [`any.when(ref, options)`](#anywhenref-options)\n - [`any.label(name)`](#anylabelname)\n - [`any.raw(isRaw)`](#anyrawisraw)\n - [`array`](#array)\n - [`array.sparse(enabled)`](#arraysparseenabled)\n - [`array.includes(type)`](#arrayincludestype)\n - [`array.excludes(type)`](#arrayexcludestype)\n - [`array.min(limit)`](#arrayminlimit)\n - [`array.max(limit)`](#arraymaxlimit)\n - [`array.length(limit)`](#arraylengthlimit)\n - [`array.unique()`](#arrayunique)\n - [`binary`](#binary)\n - [`binary.encoding(encoding)`](#binaryencodingencoding)\n - [`binary.min(limit)`](#binaryminlimit)\n - [`binary.max(limit)`](#binarymaxlimit)\n - [`binary.length(limit)`](#binarylengthlimit)\n - [`boolean()`](#boolean)\n - [`date`](#date)\n - [`date.min(date)`](#datemindate)\n - [`date.max(date)`](#datemaxdate)\n - [`date.format(format)`](#dateformatformat)\n - [`date.iso()`](#dateiso)\n - [`func`](#func)\n - [`number`](#number)\n - [`number.min(limit)`](#numberminlimit)\n - [`number.max(limit)`](#numbermaxlimit)\n - [`number.greater(limit)`](#numbergreaterlimit)\n - [`number.less(limit)`](#numberlesslimit)\n - [`number.integer()`](#numberinteger)\n - [`number.precision(limit)`](#numberprecisionlimit)\n - [`object`](#object)\n - [`object.keys([schema])`](#objectkeysschema)\n - [`object.min(limit)`](#objectminlimit)\n - [`object.max(limit)`](#objectmaxlimit)\n - [`object.length(limit)`](#objectlengthlimit)\n - [`object.pattern(regex, schema)`](#objectpatternregex-schema)\n - [`object.and(peers)`](#objectandpeers)\n - [`object.nand(peers)`](#objectnandpeers)\n - [`object.or(peers)`](#objectorpeers)\n - [`object.xor(peers)`](#objectxorpeers)\n - [`object.with(key, peers)`](#objectwithkey-peers)\n - [`object.without(key, peers)`](#objectwithoutkey-peers)\n - [`object.rename(from, to, [options])`](#objectrenamefrom-to-options)\n - [`object.assert(ref, schema, [message])`](#objectassertref-schema-message)\n - [`object.unknown([allow])`](#objectunknownallow)\n - [`object.type(constructor, [name])`](#objecttypeconstructorname)\n - [`object.requiredKeys(children)`](#objectrequiredkeyschildren)\n - [`object.optionalKeys(children)`](#objectoptionalkeyschildren)\n - [`string`](#string)\n - [`string.insensitive()`](#stringinsensitive)\n - [`string.min(limit, [encoding])`](#stringminlimit-encoding)\n - [`string.max(limit, [encoding])`](#stringmaxlimit-encoding)\n - [`string.creditCard()`](#stringcreditCard)\n - [`string.length(limit, [encoding])`](#stringlengthlimit-encoding)\n - [`string.regex(pattern, [name])`](#stringregexpattern-name)\n - [`string.alphanum()`](#stringalphanum)\n - [`string.token()`](#stringtoken)\n - [`string.email()`](#stringemail)\n - [`string.guid()`](#stringguid)\n - [`string.hostname()`](#stringhostname)\n - [`string.lowercase()`](#stringlowercase)\n - [`string.uppercase()`](#stringuppercase)\n - [`string.trim()`](#stringtrim)\n - [`alternatives`](#alternatives)\n - [`alternatives.try(schemas)`](#alternativestryschemas)\n - [`alternatives.when(ref, options)`](#alternativeswhenref-options)\n - [`ref(key, [options])`](#refkey-options)\n\n# Example\n\n```javascript\nvar Joi = require('joi');\n\nvar schema = Joi.object().keys({\n username: Joi.string().alphanum().min(3).max(30).required(),\n password: Joi.string().regex(/[a-zA-Z0-9]{3,30}/),\n access_token: [Joi.string(), Joi.number()],\n birthyear: Joi.number().integer().min(1900).max(2013),\n email: Joi.string().email()\n}).with('username', 'birthyear').without('password', 'access_token');\n\nJoi.validate({ username: 'abc', birthyear: 1994 }, schema, function (err, value) { }); // err === null -> valid\n```\n\nThe above schema defines the following constraints:\n* `username`\n * a required string\n * must contain only alphanumeric characters\n * at least 3 characters long but no more than 30\n * must be accompanied by `birthyear`\n* `password`\n * an optional string\n * must satisfy the custom regex\n * cannot appear together with `access_token`\n* `access_token`\n * an optional, unconstrained string or number\n* `birthyear`\n * an integer between 1900 and 2013\n* `email`\n * a valid email address string\n\n# Usage\n\nUsage is a two steps process. First, a schema is constructed using the provided types and constraints:\n\n```javascript\nvar schema = {\n a: Joi.string()\n};\n```\n\nNote that **joi** schema objects are immutable which means every additional rule added (e.g. `.min(5)`) will return a\nnew schema object.\n\nThen the value is validated against the schema:\n\n```javascript\nJoi.validate({ a: 'a string' }, schema, function (err, value) { });\n```\n\nIf the value is valid, `null` is returned, otherwise an `Error` object.\n\nThe schema can be a plain JavaScript object where every key is assigned a **joi** type, or it can be a **joi** type directly:\n\n```javascript\nvar schema = Joi.string().min(10);\n```\n\nIf the schema is a **joi** type, the `schema.validate(value, callback)` can be called directly on the type. When passing a non-type schema object,\nthe module converts it internally to an object() type equivalent to:\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.string()\n});\n```\n\nWhen validating a schema:\n* Keys are optional by default.\n* Strings are utf-8 encoded by default.\n* Rules are defined in an additive fashion and evaluated in order after whitelist and blacklist checks.\n\n### `validate(value, schema, [options], [callback])`\n\nValidates a value using the given schema and options where:\n- `value` - the value being validated.\n- `schema` - the validation schema. Can be a **joi** type object or a plain object where every key is assigned a **joi** type object.\n- `options` - an optional object with the following optional keys:\n - `abortEarly` - when `true`, stops validation on the first error, otherwise returns all the errors found. Defaults to `true`.\n - `convert` - when `true`, attempts to cast values to the required types (e.g. a string to a number). Defaults to `true`.\n - `allowUnknown` - when `true`, allows object to contain unknown keys which are ignored. Defaults to `false`.\n - `skipFunctions` - when `true`, ignores unknown keys with a function value. Defaults to `false`.\n - `stripUnknown` - when `true`, unknown keys are deleted (only when value is an object). Defaults to `false`.\n - `language` - overrides individual error messages, when `'label'` is set, it overrides the key name in the error message. Defaults to no override (`{}`).\n - `presence` - sets the default presence requirements. Supported modes: `'optional'`, `'required'`, and `'forbidden'`.\n Defaults to `'optional'`.\n - `context` - provides an external data set to be used in [references](#refkey-options). Can only be set as an external option to\n `validate()` and not using `any.options()`.\n- `callback` - the optional synchronous callback method using the signature `function(err, value)` where:\n - `err` - if validation failed, the error reason, otherwise `null`.\n - `value` - the validated value with any type conversions and other modifiers applied (the input is left unchanged). `value` can be\n incomplete if validation failed and `abortEarly` is `true`. If callback is not provided, then returns an object with error\n and value properties.\n\n```javascript\nvar schema = {\n a: Joi.number()\n};\n\nvar value = {\n a: '123'\n};\n\nJoi.validate(value, schema, function (err, value) { });\n// err -> null\n// value.a -> 123 (number, not string)\n\n// or\nvar result = Joi.validate(value, schema);\n// result.error -> null\n// result.value -> { \"a\" : 123 }\n```\n\n### `compile(schema)`\n\nConverts literal schema definition to **joi** schema object (or returns the same back if already a **joi** schema object) where:\n- `schema` - the schema definition to compile.\n\n```javascript\nvar definition = ['key', 5, { a: true, b: [/^a/, 'boom'] }];\nvar schema = Joi.compile(definition);\n\n// Same as:\n\nvar schema = Joi.alternatives().try([\n Joi.string().valid('key'),\n Joi.number().valid(5),\n Joi.object().keys({\n a: Joi.boolean().valid(true),\n b: Joi.alternatives().try([\n Joi.string().regex(/^a/),\n Joi.string().valid('boom')\n ])\n })\n]);\n```\n\n### `assert(value, schema, [message])`\n\nValidates a value against a schema and throws if validation fails where:\n- `value` - the value to validate.\n- `schema` - the schema object.\n- `message` - optional message sting prefix added in front of the error message.\n\n```javascript\nJoi.assert('x', Joi.number());\n```\n\n### `any`\n\nGenerates a schema object that matches any data type.\n\n```javascript\nvar any = Joi.any();\nany.validate('a', function (err, value) { });\n```\n\n#### `any.allow(value)`\n\nWhitelists a value where:\n- `value` - the allowed value which can be of any type and will be matched against the validated value before applying any other rules.\n `value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options).\n\n```javascript\nvar schema = {\n a: Joi.any().allow('a'),\n b: Joi.any().allow('b', 'B'),\n c: Joi.any().allow(['c', 'C'])\n};\n```\n\n#### `any.valid(value)`\n\nAdds the provided values into the allowed whitelist and marks them as the only valid values allowed where:\n- `value` - the allowed value which can be of any type and will be matched against the validated value before applying any other rules.\n `value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options).\n\n```javascript\nvar schema = {\n a: Joi.any().valid('a'),\n b: Joi.any().valid('b', 'B'),\n c: Joi.any().valid(['c', 'C'])\n};\n```\n\n#### `any.invalid(value)`\n\nBlacklists a value where:\n- `value` - the forbidden value which can be of any type and will be matched against the validated value before applying any other rules.\n `value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options).\n\n```javascript\nvar schema = {\n a: Joi.any().invalid('a'),\n b: Joi.any().invalid('b', 'B'),\n c: Joi.any().invalid(['c', 'C'])\n};\n```\n\n#### `any.required()`\n\nMarks a key as required which will not allow `undefined` as value. All keys are optional by default.\n\n```javascript\nvar schema = Joi.any().required();\n```\n\n#### `any.optional()`\n\nMarks a key as optional which will allow `undefined` as values. Used to annotate the schema for readability as all keys are optional by default.\n\n```javascript\nvar schema = Joi.any().optional();\n```\n\n#### `any.forbidden()`\n\nMarks a key as forbidden which will not allow any value except `undefined`. Used to explicitly forbid keys.\n\n```javascript\nvar schema = {\n a: Joi.any().forbidden()\n};\n```\n\n#### `any.description(desc)`\n\nAnnotates the key where:\n- `desc` - the description string.\n\n```javascript\nvar schema = Joi.any().description('this key will match anything you give it');\n```\n\n#### `any.notes(notes)`\n\nAnnotates the key where:\n- `notes` - the notes string or array of strings.\n\n```javascript\nvar schema = Joi.any().notes(['this is special', 'this is important']);\n```\n\n#### `any.tags(tags)`\n\nAnnotates the key where:\n- `tags` - the tag string or array of strings.\n\n```javascript\nvar schema = Joi.any().tags(['api', 'user']);\n```\n\n#### `any.meta(meta)`\n\nAttaches metadata to the key where:\n- `meta` - the meta object to attach.\n\n```javascript\nvar schema = Joi.any().meta({ index: true });\n```\n\n#### `any.example(value)`\n\nAnnotates the key where:\n- `value` - an example value.\n\nIf the example fails to pass validation, the function will throw.\n\n```javascript\nvar schema = Joi.string().min(4).example('abcd');\n```\n\n#### `any.unit(name)`\n\nAnnotates the key where:\n- `name` - the unit name of the value.\n\n```javascript\nvar schema = Joi.number().unit('milliseconds');\n```\n\n#### `any.options(options)`\n\nOverrides the global `validate()` options for the current key and any sub-key where:\n- `options` - an object with the same optional keys as [`Joi.validate(value, schema, options, callback)`](#joivalidatevalue-schema-options-callback).\n\n```javascript\nvar schema = Joi.any().options({ convert: false });\n```\n\n#### `any.strict()`\n\nSets the `options.convert` options to `false` which prevent type casting for the current key and any child keys.\n\n```javascript\nvar schema = Joi.any().strict();\n```\n\n#### `any.default(value)`\n\nSets a default value if the original value is undefined where:\n- `value` - the value. `value` supports [references](#refkey-options).\n\nNote that if `value` is an object, any changes to the object after `default()` is called will change the reference\nand any future assignment.\n\n```javascript\nvar schema = {\n username: Joi.string().default('new_user')\n};\nJoi.validate({}, schema, function (err, value) { });\n// value === { username: \"new_user\" }\n```\n\n#### `any.concat(schema)`\n\nReturns a new type that is the result of adding the rules of one type to another where:\n- `schema` - a **joi** type to merge into the current schema. Can only be of the same type as the context type or `any`.\n\n```javascript\nvar a = Joi.string().valid('a');\nvar b = Joi.string().valid('b');\nvar ab = a.concat(b);\n```\n\n#### `any.when(ref, options)`\n\nConverts the type into an [`alternatives`](#alternatives) type where the conditions are merged into the type definition where:\n- `ref` - the key name or [reference](#refkey-options).\n- `options` - an object with:\n - `is` - the required condition **joi** type.\n - `then` - the alternative schema type if the condition is true. Required if `otherwise` is missing.\n - `otherwise` - the alternative schema type if the condition is false. Required if `then` is missing.\n\n```javascript\nvar schema = {\n a: Joi.any().valid('x').when('b', { is: 5, then: Joi.valid('y'), otherwise: Joi.valid('z') }),\n b: Joi.any()\n};\n```\n\nAlternatively, if you want to specify a specific type such as `string`, `array`, etc, you can do so like this:\n\n```javascript\nvar schema = {\n a: Joi.valid('a', 'b', 'other'),\n other: Joi.string()\n .when('a', { is: 'other', then: Joi.required() }),\n};\n```\n\n#### `any.label(name)`\n\nOverrides the key name in error messages.\n- `name` - the name of the key.\n\n```javascript\nvar schema = {\n first_name: Joi.string().label('First Name')\n};\n```\n\n#### `any.raw(isRaw)`\n\nOutputs the original untouched value instead of the casted value.\n- `isRaw` - whether to enable raw mode or not. Defaults to true.\n\n```javascript\nvar schema = {\n timestamp: Joi.date().format('YYYYMMDD').raw()\n};\n```\n\n### `array`\n\nGenerates a schema object that matches an array data type. Note that undefined values inside arrays are not allowed by default but can be by using `sparse()`.\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar array = Joi.array().includes(Joi.string().valid('a', 'b'));\narray.validate(['a', 'b', 'a'], function (err, value) { });\n```\n\n#### `array.sparse(enabled)`\n\nAllow this array to be sparse. `enabled` can be used with a falsy value to go back to the default behavior.\n\n```javascript\nvar schema = Joi.array().sparse(); // undefined values are now allowed\nschema = schema.sparse(false); // undefined values are now denied\n```\n\n#### `array.single(enabled)`\n\nAllow single values to be checked against rules as if it were provided as an array.\n\n`enabled` can be used with a falsy value to go back to the default behavior.\n\n```javascript\nvar schema = Joi.array().includes(Joi.number()).single();\nschema.validate([4]); // returns `{ error: null, value: [ 4 ] }`\nschema.validate(4); // returns `{ error: null, value: [ 4 ] }`\n```\n\n#### `array.includes(type)`\n\nList the types allowed for the array values where:\n- `type` - a **joi** schema object to validate each array item against. `type` can be an array of values, or multiple values can be passed as individual arguments.\n\n```javascript\nvar schema = Joi.array().includes(Joi.string(), Joi.number());\n```\n\n#### `array.excludes(type)`\n\nList the types forbidden for the array values where:\n- `type` - a **joi** schema object to validate each array item against. `type` can be an array of values, or multiple values can be passed as individual arguments.\n\n```javascript\nvar schema = Joi.array().excludes(Joi.object());\n```\n\n#### `array.min(limit)`\n\nSpecifies the minimum number of items in the array where:\n- `limit` - the lowest number of array items allowed.\n\n```javascript\nvar schema = Joi.array().min(2);\n```\n\n#### `array.max(limit)`\n\nSpecifies the maximum number of items in the array where:\n- `limit` - the highest number of array items allowed.\n\n```javascript\nvar schema = Joi.array().max(10);\n```\n\n#### `array.length(limit)`\n\nSpecifies the exact number of items in the array where:\n- `limit` - the number of array items allowed.\n\n```javascript\nvar schema = Joi.array().length(5);\n```\n\n#### `array.unique()`\n\nRequires the array values to be unique.\n\nBe aware that a deep equality is performed on elements of the array having a type of `object`, a performance penalty is to be expected for this kind of operation.\n\n```javascript\nvar schema = Joi.array().unique();\n```\n\n### `boolean`\n\nGenerates a schema object that matches a boolean data type (as well as the strings 'true', 'false', 'yes', and 'no'). Can also be called via `bool()`.\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar boolean = Joi.boolean();\nboolean.validate(true, function (err, value) { });\n```\n\n### `binary`\n\nGenerates a schema object that matches a Buffer data type (as well as the strings which will be converted to Buffers).\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar schema = Joi.binary();\n```\n\n#### `binary.encoding(encoding)`\n\nSets the string encoding format if a string input is converted to a buffer where:\n- `encoding` - the encoding scheme.\n\n```javascript\nvar schema = Joi.binary().encoding('base64');\n```\n\n#### `binary.min(limit)`\n\nSpecifies the minimum length of the buffer where:\n- `limit` - the lowest size of the buffer.\n\n```javascript\nvar schema = Joi.binary().min(2);\n```\n\n#### `binary.max(limit)`\n\nSpecifies the maximum length of the buffer where:\n- `limit` - the highest size of the buffer.\n\n```javascript\nvar schema = Joi.binary().max(10);\n```\n\n#### `binary.length(limit)`\n\nSpecifies the exact length of the buffer:\n- `limit` - the size of buffer allowed.\n\n```javascript\nvar schema = Joi.binary().length(5);\n```\n\n### `date`\n\nGenerates a schema object that matches a date type (as well as a JavaScript date string or number of milliseconds).\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar date = Joi.date();\ndate.validate('12-21-2012', function (err, value) { });\n```\n\n#### `date.min(date)`\n\nSpecifies the oldest date allowed where:\n- `date` - the oldest date allowed.\n\n```javascript\nvar schema = Joi.date().min('1-1-1974');\n```\n\nNotes: `'now'` can be passed in lieu of `date` so as to always compare relatively to the current date, allowing to explicitly ensure a date is either in the past or in the future.\n\n```javascript\nvar schema = Joi.date().min('now');\n```\n\nIt can also be a reference to another field.\n\n```javascript\nvar schema = Joi.object({\n from: Joi.date().required(),\n to: Joi.date().min(Joi.ref('from')).required()\n});\n```\n\n#### `date.max(date)`\n\nSpecifies the latest date allowed where:\n- `date` - the latest date allowed.\n\n```javascript\nvar schema = Joi.date().max('12-31-2020');\n```\n\nNotes: `'now'` can be passed in lieu of `date` so as to always compare relatively to the current date, allowing to explicitly ensure a date is either in the past or in the future.\n\n```javascript\nvar schema = Joi.date().max('now');\n```\n\nIt can also be a reference to another field.\n\n```javascript\nvar schema = Joi.object({\n from: Joi.date().max(Joi.ref('to')).required(),\n to: Joi.date().required()\n});\n```\n\n#### `date.format(format)`\n\nSpecifies the allowed date format:\n- `format` - string or array of strings that follow the `moment.js` [format](http://momentjs.com/docs/#/parsing/string-format/).\n\n```javascript\nvar schema = Joi.date().format('YYYY/MM/DD');\n```\n\n#### `date.iso()`\n\nRequires the string value to be in valid ISO 8601 date format.\n\n```javascript\nvar schema = Joi.date().iso();\n```\n\n### `func`\n\nGenerates a schema object that matches a function type.\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar func = Joi.func();\nfunc.validate(function () {}, function (err, value) { });\n```\n\n### `number`\n\nGenerates a schema object that matches a number data type (as well as strings that can be converted to numbers).\n\n`Infinity` and `-Infinity` are invalid by default, you can change that behavior by calling `allow(Infinity, -Infinity)`.\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar number = Joi.number();\nnumber.validate(5, function (err, value) { });\n```\n\n#### `number.min(limit)`\n\nSpecifies the minimum value where:\n- `limit` - the minimum value allowed.\n\n```javascript\nvar schema = Joi.number().min(2);\n```\n\n#### `number.max(limit)`\n\nSpecifies the maximum value where:\n- `limit` - the maximum value allowed.\n\n```javascript\nvar schema = Joi.number().max(10);\n```\n\n#### `number.greater(limit)`\n\nSpecifies that the value must be greater than `limit`.\n\n```javascript\nvar schema = Joi.number().greater(5);\n```\n\n#### `number.less(limit)`\n\nSpecifies that the value must be less than `limit`.\n\n```javascript\nvar schema = Joi.number().less(10);\n```\n\n#### `number.integer()`\n\nRequires the number to be an integer (no floating point).\n\n```javascript\nvar schema = Joi.number().integer();\n```\n\n#### `number.precision(limit)`\n\nSpecifies the maximum number of decimal places where:\n- `limit` - the maximum number of decimal places allowed.\n\n```javascript\nvar schema = Joi.number().precision(2);\n```\n\n### `object`\n\nGenerates a schema object that matches an object data type (as well as JSON strings that parsed into objects). Defaults\nto allowing any child key.\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar object = Joi.object().keys({\n a: Joi.number().min(1).max(10).integer(),\n b: 'some string'\n});\n\nobject.validate({ a: 5 }, function (err, value) { });\n```\n\n#### `object.keys([schema])`\n\nSets or extends the allowed object keys where:\n- `schema` - optional object where each key is assigned a **joi** type object. If `schema` is `{}` no keys allowed.\n If `schema` is `null` or `undefined`, any key allowed. If `schema` is an object with keys, the keys are added to any\n previously defined keys (but narrows the selection if all keys previously allowed). Defaults to 'undefined' which\n allows any child key.\n\n```javascript\nvar base = Joi.object().keys({\n a: Joi.number(),\n b: Joi.string()\n});\n// Validate keys a, b and c.\nvar extended = base.keys({\n c: Joi.boolean()\n});\n```\n\n#### `object.min(limit)`\n\nSpecifies the minimum number of keys in the object where:\n- `limit` - the lowest number of keys allowed.\n\n```javascript\nvar schema = Joi.object().min(2);\n```\n\n#### `object.max(limit)`\n\nSpecifies the maximum number of keys in the object where:\n- `limit` - the highest number of object keys allowed.\n\n```javascript\nvar schema = Joi.object().max(10);\n```\n\n#### `object.length(limit)`\n\nSpecifies the exact number of keys in the object where:\n- `limit` - the number of object keys allowed.\n\n```javascript\nvar schema = Joi.object().length(5);\n```\n\n#### `object.pattern(regex, schema)`\n\nSpecify validation rules for unknown keys matching a pattern where:\n- `regex` - a regular expression tested against the unknown key names.\n- `schema` - the schema object matching keys much validate against.\n\n```javascrip\nvar schema = Joi.object({\n a: Joi.string()\n}).pattern(/\\w\\d/, Joi.boolean());\n```\n\n#### `object.and(peers)`\n\nDefines an all-or-nothing relationship between keys where if one of the peers is present, all of them are required as\nwell where:\n- `peers` - the key names of which if one present, all are required. `peers` can be a single string value, an\n array of string values, or each peer provided as an argument.\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.any(),\n b: Joi.any()\n}).and('a', 'b');\n```\n\n#### `object.nand(peers)`\n\nDefines a relationship between keys where not all peers can be present at the\nsame time where:\n- `peers` - the key names of which if one present, the others may not all be present. `peers` can be a single string value, an\n array of string values, or each peer provided as an argument.\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.any(),\n b: Joi.any()\n}).nand('a', 'b');\n```\n\n#### `object.or(peers)`\n\nDefines a relationship between keys where one of the peers is required (and more than one is allowed) where:\n- `peers` - the key names of which at least one must appear. `peers` can be a single string value, an\n array of string values, or each peer provided as an argument.\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.any(),\n b: Joi.any()\n}).or('a', 'b');\n```\n\n#### `object.xor(peers)`\n\nDefines an exclusive relationship between a set of keys where one of them is required but not at the same time where:\n- `peers` - the exclusive key names that must not appear together but where one of them is required. `peers` can be a single string value, an\n array of string values, or each peer provided as an argument.\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.any(),\n b: Joi.any()\n}).xor('a', 'b');\n```\n\n#### `object.with(key, peers)`\n\nRequires the presence of other keys whenever the specified key is present where:\n- `key` - the reference key.\n- `peers` - the required peer key names that must appear together with `key`. `peers` can be a single string value or an array of string values.\n\nNote that unlike [`object.and()`](#objectandpeers), `with()` creates a dependency only between the `key` and each of the `peers`, not\nbetween the `peers` themselves.\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.any(),\n b: Joi.any()\n}).with('a', 'b');\n```\n\n#### `object.without(key, peers)`\n\nForbids the presence of other keys whenever the specified is present where:\n- `key` - the reference key.\n- `peers` - the forbidden peer key names that must not appear together with `key`. `peers` can be a single string value or an array of string values.\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.any(),\n b: Joi.any()\n}).without('a', ['b']);\n```\n\n#### `object.rename(from, to, [options])`\n\nRenames a key to another name (deletes the renamed key) where:\n- `from` - the original key name.\n- `to` - the new key name.\n- `options` - an optional object with the following optional keys:\n - `alias` - if `true`, does not delete the old key name, keeping both the new and old keys in place. Defaults to `false`.\n - `multiple` - if `true`, allows renaming multiple keys to the same destination where the last rename wins. Defaults to `false`.\n - `override` - if `true`, allows renaming a key over an existing key. Defaults to `false`.\n\nKeys are renamed before any other validation rules are applied.\n\n```javascript\nvar object = Joi.object().keys({\n a: Joi.number()\n}).rename('b', 'a');\n\nobject.validate({ b: 5 }, function (err, value) { });\n```\n\n#### `object.assert(ref, schema, [message])`\n\nVerifies an assertion where:\n- `ref` - the key name or [reference](#refkey-options).\n- `schema` - the validation rules required to satisfy the assertion. If the `schema` includes references, they are resolved against\n the object value, not the value of the `ref` target.\n- `message` - optional human-readable message used when the assertion fails. Defaults to 'failed to pass the assertion test'.\n\n```javascript\nvar schema = Joi.object().keys({\n a: {\n b: Joi.string(),\n c: Joi.number()\n },\n d: {\n e: Joi.any()\n }\n}).assert('d.e', Joi.ref('a.c'), 'equal to a.c');\n```\n\n#### `object.unknown([allow])`\n\nOverrides the handling of unknown keys for the scope of the current object only (does not apply to children) where:\n- `allow` - if `false`, unknown keys are not allowed, otherwise unknown keys are ignored.\n\n```javascript\nvar schema = Joi.object({ a: Joi.any() }).unknown();\n```\n\n#### `object.type(constructor, [name])`\n\nRequires the object to be an instance of a given constructor where:\n- `constructor` - the constructor function that the object must be an instance of.\n- `name` - an alternate name to use in validation errors. This is useful when the constructor function does not have a name.\n\n```javascript\nvar schema = Joi.object().type(RegExp);\n```\n\n#### `object.requiredKeys(children)`\n\nSets the specified children to required.\n- `children` - can be a single string value, an array of string values, or each child provided as an argument.\n\n```javascript\nvar schema = Joi.object().keys({ a: { b: Joi.number() }, c: { d: Joi.string() } });\nvar requiredSchema = schema.requiredKeys('', 'a.b', 'c', 'c.d');\n```\n\nNote that in this example `''` means the current object, `a` is not required but `b` is, as well as `c` and `d`.\n\n#### `object.optionalKeys(children)`\n\nSets the specified children to optional.\n- `children` - can be a single string value, an array of string values, or each child provided as an argument.\n\n```javascript\nvar schema = Joi.object().keys({ a: { b: Joi.number().required() }, c: { d: Joi.string().required() } });\nvar requiredSchema = schema.optionalKeys('a.b', 'c.d');\n```\n\nThe behavior is exactly the same as `requiredKeys`.\n\n### `string`\n\nGenerates a schema object that matches a string data type. Note that empty strings are not allowed by default and must be enabled with `allow('')`.\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar schema = Joi.string().min(1).max(10);\nschema.validate('12345', function (err, value) { });\n```\n\n#### `string.insensitive()`\n\nAllows the value to match any whitelist of blacklist item in a case insensitive comparison.\n\n```javascript\nvar schema = Joi.string().valid('a').insensitive();\n```\n\n#### `string.min(limit, [encoding])`\n\nSpecifies the minimum number string characters where:\n- `limit` - the minimum number of string characters required.\n- `encoding` - is specified, the string length is calculated in bytes using the provided encoding.\n\n```javascript\nvar schema = Joi.string().min(2);\n```\n\n#### `string.max(limit, [encoding])`\n\nSpecifies the maximum number of string characters where:\n- `limit` - the maximum number of string characters allowed.\n- `encoding` - is specified, the string length is calculated in bytes using the provided encoding.\n\n```javascript\nvar schema = Joi.string().max(10);\n```\n\n#### `string.creditCard()`\n\nRequires the number to be a credit card number (Using [Lunh\nAlgorithm](http://en.wikipedia.org/wiki/Luhn_algorithm)).\n\n```javascript\nvar schema = Joi.string().creditCard();\n```\n\n#### `string.length(limit, [encoding])`\n\nSpecifies the exact string length required where:\n- `limit` - the required string length.\n- `encoding` - is specified, the string length is calculated in bytes using the provided encoding.\n\n```javascript\nvar schema = Joi.string().length(5);\n```\n\n#### `string.regex(pattern, [name])`\n\nDefines a regular expression rule where:\n- `pattern` - a regular expression object the string value must match against.\n- `name` - optional name for patterns (useful with multiple patterns). Defaults to 'required'.\n\n```javascript\nvar schema = Joi.string().regex(/^[abc]+$/);\n```\n\n#### `string.alphanum()`\n\nRequires the string value to only contain a-z, A-Z, and 0-9.\n\n```javascript\nvar schema = Joi.string().alphanum();\n```\n\n#### `string.token()`\n\nRequires the string value to only contain a-z, A-Z, 0-9, and underscore _.\n\n```javascript\nvar schema = Joi.string().token();\n```\n\n#### `string.email()`\n\nRequires the string value to be a valid email address.\n\n```javascript\nvar schema = Joi.string().email();\n```\n\n#### `string.guid()`\n\nRequires the string value to be a valid GUID.\n\n```javascript\nvar schema = Joi.string().guid();\n```\n\n#### `string.hostname()`\n\nRequires the string value to be a valid hostname as per [RFC1123](http://tools.ietf.org/html/rfc1123).\n\n```javascript\nvar schema = Joi.string().hostname();\n```\n\n#### `string.lowercase()`\n\nRequires the string value to be all lowercase. If the validation `convert` option is on (enabled by default), the string\nwill be forced to lowercase.\n\n```javascript\nvar schema = Joi.string().lowercase();\n```\n\n#### `string.uppercase()`\n\nRequires the string value to be all uppercase. If the validation `convert` option is on (enabled by default), the string\nwill be forced to uppercase.\n\n```javascript\nvar schema = Joi.string().uppercase();\n```\n\n#### `string.trim()`\n\nRequires the string value to contain no whitespace before or after. If the validation `convert` option is on (enabled by\ndefault), the string will be trimmed.\n\n```javascript\nvar schema = Joi.string().trim();\n```\n\n### `alternatives`\n\nGenerates a type that will match one of the provided alternative schemas via the [`try()`](#alternativestryschemas)\nmethod. If no schemas are added, the type will not match any value except for `undefined`.\n\nSupports the same methods of the [`any()`](#any) type.\n\nAlternatives can be expressed using the shorter `[]` notation.\n\n```javascript\nvar alt = Joi.alternatives().try(Joi.number(), Joi.string());\n// Same as [Joi.number(), Joi.string()]\n```\n\n#### `alternatives.try(schemas)`\n\nAdds an alternative schema type for attempting to match against the validated value where:\n- `schema` - an array of alternative **joi** types. Also supports providing each type as a separate argument.\n\n```javascript\nvar alt = Joi.alternatives().try(Joi.number(), Joi.string());\nalt.validate('a', function (err, value) { });\n```\n\n#### `alternatives.when(ref, options)`\n\nAdds a conditional alternative schema type based on another key (not the same as `any.when()`) value where:\n- `ref` - the key name or [reference](#refkey-options).\n- `options` - an object with:\n - `is` - the required condition **joi** type.\n - `then` - the alternative schema type to **try** if the condition is true. Required if `otherwise` is missing.\n - `otherwise` - the alternative schema type to **try** if the condition is false. Required if `then` is missing.\n\n```javascript\nvar schema = {\n a: Joi.alternatives().when('b', { is: 5, then: Joi.string(), otherwise: Joi.number() }),\n b: Joi.any()\n};\n```\n\nNote that `when()` only adds additional alternatives to try and does not impact the overall type. Setting\na `required()` rule on a single alternative will not apply to the overall key. For example,\nthis definition of `a`:\n\n```javascript\nvar schema = {\n a: Joi.alternatives().when('b', { is: true, then: Joi.required() }),\n b: Joi.boolean()\n};\n```\n\nDoes not turn `a` into a required key when `b` is `true`. Instead, it tells the validator to try and match the\nvalue to anything that's not `undefined`. However, since `Joi.alternatives()` by itself allows `undefined`, the rule\ndoes not accomplish turning `a` to a required value. This rule is the same as `Joi.alternatives([Joi.required()])`\nwhen `b` is `true` which will allow any value including `undefined`.\n\nTo accomplish the desired result above use:\n\n```javascript\nvar schema = {\n a: Joi.when('b', { is: true, then: Joi.required() }),\n b: Joi.boolean()\n};\n```\n\n### `ref(key, [options])`\n\nGenerates a reference to the value of the named key. References are resolved at validation time and in order of dependency\nso that if one key validation depends on another, the dependent key is validated second after the reference is validated.\nReferences support the following arguments:\n- `key` - the reference target. References cannot point up the object tree, only to sibling keys, but they can point to\n their siblings' children (e.g. 'a.b.c') using the `.` separator. If a `key` starts with `$` is signifies a context reference\n which is looked up in the `context` option object.\n- `options` - optional settings:\n - `separator` - overrides the default `.` hierarchy separator.\n - `contextPrefix` - overrides the default `$` context prefix signifier.\n\nNote that references can only be used where explicitly supported such as in `valid()` or `invalid()` rules. If upwards\n(parents) references are needed, use [`object.assert()`](#objectassertref-schema-message).\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.ref('b.c'),\n b: {\n c: Joi.any()\n },\n c: Joi.ref('$x')\n});\n\nJoi.validate({ a: 5, b: { c: 5 } }, schema, { context: { x: 5 } }, function (err, value) {});\n```\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/hapijs/joi/issues" + }, + "_id": "joi@5.1.0", + "_from": "joi@5.x.x" +} diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/test/alternatives.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/test/alternatives.js new file mode 100755 index 0000000..e82ca88 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/test/alternatives.js @@ -0,0 +1,454 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('..'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('alternatives', function () { + + it('fails when no alternatives are provided', function (done) { + + Joi.alternatives().validate('a', function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('value not matching any of the allowed alternatives'); + done(); + }); + }); + + it('allows undefined when no alternatives are provided', function (done) { + + Joi.alternatives().validate(undefined, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('applies modifiers when higher priority converts', function (done) { + + var schema = Joi.object({ + a: [ + Joi.number(), + Joi.string() + ] + }); + + schema.validate({ a: '5' }, function (err, value) { + + expect(err).to.not.exist(); + expect(value.a).to.equal(5); + done(); + }); + }); + + it('applies modifiers when lower priority valid is a match', function (done) { + + var schema = Joi.object({ + a: [ + Joi.number(), + Joi.valid('5') + ] + }); + + schema.validate({ a: '5' }, function (err, value) { + + expect(err).to.not.exist(); + expect(value.a).to.equal(5); + done(); + }); + }); + + it('does not apply modifier if alternative fails', function (done) { + + var schema = Joi.object({ + a: [ + Joi.object({ c: Joi.any(), d: Joi.number() }).rename('b', 'c'), + { b: Joi.any(), d: Joi.string() } + ] + }); + + var input = { a: { b: 'any', d: 'string' } }; + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + expect(value.a.b).to.equal('any'); + done(); + }); + }); + + describe('#try', function () { + + it('throws when missing alternatives', function (done) { + + expect(function () { + + Joi.alternatives().try(); + }).to.throw('Cannot add other alternatives without at least one schema'); + done(); + }); + }); + + describe('#when', function () { + + it('throws on invalid ref (not string)', function (done) { + + expect(function () { + + Joi.alternatives().when(5, { is: 6, then: Joi.number() }); + }).to.throw('Invalid reference: 5'); + done(); + }); + + it('validates conditional alternatives', function (done) { + + var schema = { + a: Joi.alternatives().when('b', { is: 5, then: 'x', otherwise: 'y' }) + .try('z'), + b: Joi.any() + }; + + Helper.validate(schema, [ + [{ a: 'x', b: 5 }, true], + [{ a: 'x', b: 6 }, false], + [{ a: 'y', b: 5 }, false], + [{ a: 'y', b: 6 }, true], + [{ a: 'z', b: 5 }, true], + [{ a: 'z', b: 6 }, true] + ], done); + }); + + it('validates conditional alternatives (empty key)', function (done) { + + var schema = { + a: Joi.alternatives().when('', { is: 5, then: 'x', otherwise: 'y' }) + .try('z'), + '': Joi.any() + }; + + Helper.validate(schema, [ + [{ a: 'x', '': 5 }, true], + [{ a: 'x', '': 6 }, false], + [{ a: 'y', '': 5 }, false], + [{ a: 'y', '': 6 }, true], + [{ a: 'z', '': 5 }, true], + [{ a: 'z', '': 6 }, true] + ], done); + }); + + it('validates only then', function (done) { + + var schema = { + a: Joi.alternatives().when(Joi.ref('b'), { is: 5, then: 'x' }) + .try('z'), + b: Joi.any() + }; + + Helper.validate(schema, [ + [{ a: 'x', b: 5 }, true], + [{ a: 'x', b: 6 }, false], + [{ a: 'y', b: 5 }, false], + [{ a: 'y', b: 6 }, false], + [{ a: 'z', b: 5 }, true], + [{ a: 'z', b: 6 }, true] + ], done); + }); + + it('validates only otherwise', function (done) { + + var schema = { + a: Joi.alternatives().when('b', { is: 5, otherwise: 'y' }) + .try('z'), + b: Joi.any() + }; + + Helper.validate(schema, [ + [{ a: 'x', b: 5 }, false], + [{ a: 'x', b: 6 }, false], + [{ a: 'y', b: 5 }, false], + [{ a: 'y', b: 6 }, true], + [{ a: 'z', b: 5 }, true], + [{ a: 'z', b: 6 }, true] + ], done); + }); + + it('validates when is has ref', function (done) { + + var schema = { + a: Joi.alternatives().when('b', { is: Joi.ref('c'), then: 'x' }), + b: Joi.any(), + c: Joi.number() + }; + + Helper.validate(schema, [ + [{ a: 'x', b: 5, c: '5' }, true], + [{ a: 'x', b: 5, c: '1' }, false], + [{ a: 'x', b: '5', c: '5' }, false], + [{ a: 'y', b: 5, c: 5 }, false], + [{ a: 'y' }, false] + ], done); + }); + + it('validates when then has ref', function (done) { + + var schema = { + a: Joi.alternatives().when('b', { is: 5, then: Joi.ref('c') }), + b: Joi.any(), + c: Joi.number() + }; + + Helper.validate(schema, [ + [{ a: 'x', b: 5, c: '1' }, false], + [{ a: 1, b: 5, c: '1' }, true], + [{ a: '1', b: 5, c: '1' }, false] + ], done); + }); + + it('validates when otherwise has ref', function (done) { + + var schema = { + a: Joi.alternatives().when('b', { is: 6, otherwise: Joi.ref('c') }), + b: Joi.any(), + c: Joi.number() + }; + + Helper.validate(schema, [ + [{ a: 'x', b: 5, c: '1' }, false], + [{ a: 1, b: 5, c: '1' }, true], + [{ a: '1', b: 5, c: '1' }, false] + ], done); + }); + + it('validates when empty value', function (done) { + + var schema = { + a: Joi.alternatives().when('b', { is: true, then: Joi.required() }), + b: Joi.boolean().default(false) + }; + + Helper.validate(schema, [ + [{ b: false }, true], + [{ b: true }, true] // true because required() only applies to the one alternative + ], done); + }); + }); + + describe('#describe', function () { + + it('describes when', function (done) { + + var schema = { + a: Joi.alternatives().when('b', { is: 5, then: 'x', otherwise: 'y' }) + .try('z'), + b: Joi.any() + }; + + var outcome = { + type: 'object', + children: { + b: { + type: 'any' + }, + a: { + type: 'alternatives', + alternatives: [ + { + ref: 'ref:b', + is: { + type: 'number', + flags: { + allowOnly: true + }, + valids: [5], + invalids: [Infinity, -Infinity] + }, + then: { + type: 'string', + flags: { + allowOnly: true + }, + valids: ['x'], + invalids: [''] + }, + otherwise: { + type: 'string', + flags: { + allowOnly: true + }, + valids: ['y'], + invalids: [''] + } + }, + { + type: 'string', + flags: { + allowOnly: true + }, + valids: ['z'], + invalids: [''] + } + ] + } + } + }; + + expect(Joi.describe(schema)).to.deep.equal(outcome); + done(); + }); + + it('describes when (only then)', function (done) { + + var schema = { + a: Joi.alternatives().when('b', { is: 5, then: 'x' }) + .try('z'), + b: Joi.any() + }; + + var outcome = { + type: 'object', + children: { + b: { + type: 'any' + }, + a: { + type: 'alternatives', + alternatives: [ + { + ref: 'ref:b', + is: { + type: 'number', + flags: { + allowOnly: true + }, + valids: [5], + invalids: [Infinity, -Infinity] + }, + then: { + type: 'string', + flags: { + allowOnly: true + }, + valids: ['x'], + invalids: [''] + } + }, + { + type: 'string', + flags: { + allowOnly: true + }, + valids: ['z'], + invalids: [''] + } + ] + } + } + }; + + expect(Joi.describe(schema)).to.deep.equal(outcome); + done(); + }); + + it('describes when (only otherwise)', function (done) { + + var schema = { + a: Joi.alternatives().when('b', { is: 5, otherwise: 'y' }) + .try('z'), + b: Joi.any() + }; + + var outcome = { + type: 'object', + children: { + b: { + type: 'any' + }, + a: { + type: 'alternatives', + alternatives: [ + { + ref: 'ref:b', + is: { + type: 'number', + flags: { + allowOnly: true + }, + valids: [5], + invalids: [Infinity, -Infinity] + }, + otherwise: { + type: 'string', + flags: { + allowOnly: true + }, + valids: ['y'], + invalids: [''] + } + }, + { + type: 'string', + flags: { + allowOnly: true + }, + valids: ['z'], + invalids: [''] + } + ] + } + } + }; + + expect(Joi.describe(schema)).to.deep.equal(outcome); + done(); + }); + + it('describes inherited fields (from any)', function (done) { + + var schema = Joi.alternatives() + .try('a') + .description('d') + .example('a') + .meta('b') + .meta('c') + .notes('f') + .tags('g'); + + var outcome = { + type: 'alternatives', + description: 'd', + notes: ['f'], + tags: ['g'], + meta: ['b', 'c'], + examples: ['a'], + alternatives: [{ + type: 'string', + flags: { + allowOnly: true + }, + valids: ['a'], + invalids: [''] + }] + }; + + expect(Joi.describe(schema)).to.deep.equal(outcome); + done(); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/test/any.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/test/any.js new file mode 100755 index 0000000..3a89bf6 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/test/any.js @@ -0,0 +1,960 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('any', function () { + + describe('#equal', function () { + + it('validates valid values', function (done) { + + Helper.validate(Joi.equal(4), [ + [4, true], + [5, false] + ], done); + }); + }); + + describe('#not', function () { + + it('validates invalid values', function (done) { + + Helper.validate(Joi.not(5), [ + [4, true], + [5, false] + ], done); + }); + }); + + describe('#exist', function () { + + it('validates required values', function (done) { + + Helper.validate(Joi.exist(), [ + [4, true], + [undefined, false] + ], done); + }); + }); + + describe('#strict', function () { + + it('validates without converting', function (done) { + + var schema = Joi.object({ + array: Joi.array().includes(Joi.string().min(5), Joi.number().min(3)) + }).strict(); + + Helper.validate(schema, [ + [{ array: ['12345'] }, true], + [{ array: ['1'] }, false], + [{ array: [3] }, true], + [{ array: ['12345', 3] }, true] + ], done); + }); + }); + + describe('#options', function () { + + it('adds to existing options', function (done) { + + var schema = Joi.object({ b: Joi.number().strict().options({ convert: true }) }); + var input = { b: '2' }; + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + expect(value.b).to.equal(2); + done(); + }); + }); + }); + + describe('#label', function () { + + it('adds to existing options', function (done) { + + var schema = Joi.object({ b: Joi.string().email().label('Custom label') }); + var input = { b: 'not_a_valid_email' }; + schema.validate(input, function (err, value) { + + expect(err).to.exist(); + expect(err.details[0].message).to.equal('Custom label must be a valid email'); + done(); + }); + }); + + it('throws when label is missing', function (done) { + + expect(function () { + + Joi.label(); + }).to.throw('Label name must be a non-empty string'); + done(); + }); + + it('can describe a label', function (done) { + + var schema = Joi.object().label('lbl').describe(); + expect(schema).to.deep.equal({ type: 'object', label: 'lbl' }); + done(); + }); + }); + + describe('#strict', function () { + + it('adds to existing options', function (done) { + + var schema = Joi.object({ b: Joi.number().options({ convert: true }).strict() }); + var input = { b: '2' }; + schema.validate(input, function (err, value) { + + expect(err).to.exist(); + expect(value.b).to.equal('2'); + done(); + }); + }); + }); + + describe('#raw', function () { + + it('gives the raw input', function (done) { + + var tests = [ + [Joi.array(), '[1,2,3]'], + [Joi.binary(), 'abc'], + [Joi.boolean(), 'false'], + [Joi.date().format('YYYYMMDD'), '19700101'], + [Joi.number(), '12'], + [Joi.object(), '{ "a": 1 }'], + [Joi.any().strict(), 'abc'] + ]; + + tests.forEach(function (test) { + + var baseSchema = test[0]; + var input = test[1]; + var schemas = [ + baseSchema.raw(), + baseSchema.raw(true), + baseSchema.options({ raw: true }) + ]; + + schemas.forEach(function (schema) { + + schema.raw().validate(input, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.equal(input); + }); + }); + }); + + done(); + }); + }); + + describe('#default', function () { + + it('sets the value', function (done) { + + var schema = Joi.object({ foo: Joi.string().default('test') }); + var input = {}; + + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + expect(value.foo).to.equal('test'); + done(); + }); + }); + + it('should not overide a value when value is given', function (done) { + + var schema = Joi.object({ foo: Joi.string().default('bar') }); + var input = { foo: 'test' }; + + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + expect(value.foo).to.equal('test'); + done(); + }); + }); + + it('sets value based on condition (outer)', function (done) { + + var schema = Joi.object({ + a: Joi.boolean(), + b: Joi.boolean().default(false).when('a', { is: true, then: Joi.required(), otherwise: Joi.forbidden() }) + }); + + schema.validate({ a: false }, function (err, value) { + + expect(err).to.not.exist(); + expect(value.b).to.equal(false); + done(); + }); + }); + + it('sets value based on condition (inner)', function (done) { + + var schema = Joi.object({ + a: Joi.boolean(), + b: Joi.boolean().when('a', { is: true, then: Joi.default(false), otherwise: Joi.forbidden() }) + }); + + schema.validate({ a: true }, function (err, value) { + + expect(err).to.not.exist(); + expect(value.b).to.equal(false); + done(); + }); + }); + }); + + describe('#optional', function () { + + it('validates optional with default required', function (done) { + + var schema = Joi.object({ + a: Joi.any(), + b: Joi.any(), + c: { + d: Joi.any() + } + }).options({ presence: 'required' }); + + Helper.validate(schema, [ + [{ a: 5 }, false], + [{ a: 5, b: 6 }, false], + [{ a: 5, b: 6, c: {} }, false], + [{ a: 5, b: 6, c: { d: 7 } }, true], + [{}, false], + [{ b: 5 }, false] + ], done); + }); + }); + + describe('#forbidden', function () { + + it('validates forbidden', function (done) { + + var schema = { + a: Joi.number(), + b: Joi.forbidden() + }; + + Helper.validate(schema, [ + [{ a: 5 }, true], + [{ a: 5, b: 6 }, false], + [{ a: 'a' }, false], + [{}, true], + [{ b: undefined }, true], + [{ b: null }, false] + ], done); + }); + }); + + describe('#description', function () { + + it('sets the description', function (done) { + + var b = Joi.description('my description'); + expect(b._description).to.equal('my description'); + done(); + }); + + it('throws when description is missing', function (done) { + + expect(function () { + + Joi.description(); + }).to.throw('Description must be a non-empty string'); + done(); + }); + }); + + describe('#notes', function () { + + it('sets the notes', function (done) { + + var b = Joi.notes(['a']).notes('my notes'); + expect(b._notes).to.deep.equal(['a', 'my notes']); + done(); + }); + + it('throws when notes are missing', function (done) { + + expect(function () { + + Joi.notes(); + }).to.throw('Notes must be a non-empty string or array'); + done(); + }); + + it('throws when notes are invalid', function (done) { + + expect(function () { + + Joi.notes(5); + }).to.throw('Notes must be a non-empty string or array'); + done(); + }); + }); + + describe('#tags', function () { + + it('sets the tags', function (done) { + + var b = Joi.tags(['tag1', 'tag2']).tags('tag3'); + expect(b._tags).to.include('tag1'); + expect(b._tags).to.include('tag2'); + expect(b._tags).to.include('tag3'); + done(); + }); + + it('throws when tags are missing', function (done) { + + expect(function () { + + Joi.tags(); + }).to.throw('Tags must be a non-empty string or array'); + done(); + }); + + it('throws when tags are invalid', function (done) { + + expect(function () { + + Joi.tags(5); + }).to.throw('Tags must be a non-empty string or array'); + done(); + }); + }); + + describe('#meta', function () { + + it('sets the meta', function (done) { + + var meta = { prop: 'val', prop2: 3 }; + var b = Joi.meta(meta); + expect(b.describe().meta).to.deep.equal([meta]); + + b = b.meta({ other: true }); + expect(b.describe().meta).to.deep.equal([meta, { + other: true + }]); + + done(); + }); + + it('throws when meta is missing', function (done) { + + expect(function () { + + Joi.meta(); + }).to.throw('Meta cannot be undefined'); + done(); + }); + }); + + describe('#example', function () { + + it('sets an example', function (done) { + + var schema = Joi.valid(5, 6, 7).example(5); + expect(schema._examples).to.include(5); + expect(schema.describe().examples).to.deep.equal([5]); + done(); + }); + + it('throws when tags are missing', function (done) { + + expect(function () { + + Joi.example(); + }).to.throw('Missing example'); + done(); + }); + + it('throws when example fails own rules', function (done) { + + expect(function () { + + var schema = Joi.valid(5, 6, 7).example(4); + }).to.throw('Bad example: value must be one of 5, 6, 7'); + done(); + }); + }); + + describe('#unit', function () { + + it('sets the unit', function (done) { + + var b = Joi.unit('milliseconds'); + expect(b._unit).to.equal('milliseconds'); + expect(b.describe().unit).to.equal('milliseconds'); + done(); + }); + + it('throws when unit is missing', function (done) { + + expect(function () { + + Joi.unit(); + }).to.throw('Unit name must be a non-empty string'); + done(); + }); + }); + + describe('#_validate', function () { + + it('checks value after conversion', function (done) { + + var schema = Joi.number().invalid(2); + Joi.validate('2', schema, { abortEarly: false }, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + }); + + describe('#concat', function () { + + it('throws when schema is not any', function (done) { + + expect(function () { + + Joi.string().concat(Joi.number()); + }).to.throw('Cannot merge with another type: number'); + done(); + }); + + it('throws when schema is missing', function (done) { + + expect(function () { + + Joi.string().concat(); + }).to.throw('Invalid schema object'); + done(); + }); + + it('throws when schema is invalid', function (done) { + + expect(function () { + + Joi.string().concat(1); + }).to.throw('Invalid schema object'); + done(); + }); + + it('merges two schemas (settings)', function (done) { + + var a = Joi.number().options({ convert: true }); + var b = Joi.options({ convert: false }); + + Helper.validate(a, [ + [1, true], ['1', true] + ]); + + Helper.validate(a.concat(b), [ + [1, true], ['1', false] + ], done); + }); + + it('merges two schemas (valid)', function (done) { + + var a = Joi.string().valid('a'); + var b = Joi.string().valid('b'); + + Helper.validate(a, [ + ['a', true], + ['b', false] + ]); + + Helper.validate(b, [ + ['b', true], + ['a', false] + ]); + + Helper.validate(a.concat(b), [ + ['a', true], + ['b', true] + ], done); + }); + + it('merges two schemas (invalid)', function (done) { + + var a = Joi.string().invalid('a'); + var b = Joi.invalid('b'); + + Helper.validate(a, [ + ['b', true], ['a', false] + ]); + + Helper.validate(b, [ + ['a', true], ['b', false] + ]); + + Helper.validate(a.concat(b), [ + ['a', false], ['b', false] + ], done); + }); + + it('merges two schemas (valid/invalid)', function (done) { + + var a = Joi.string().valid('a').invalid('b'); + var b = Joi.string().valid('b').invalid('a'); + + Helper.validate(a, [ + ['a', true], + ['b', false] + ]); + + Helper.validate(b, [ + ['b', true], + ['a', false] + ]); + + Helper.validate(a.concat(b), [ + ['a', false], + ['b', true] + ], done); + }); + + it('merges two schemas (tests)', function (done) { + + var a = Joi.number().min(5); + var b = Joi.number().max(10); + + Helper.validate(a, [ + [4, false], [11, true] + ]); + + Helper.validate(b, [ + [6, true], [11, false] + ]); + + Helper.validate(a.concat(b), [ + [4, false], [6, true], [11, false] + ], done); + }); + + it('merges two schemas (flags)', function (done) { + + var a = Joi.string().valid('a'); + var b = Joi.string().insensitive(); + + Helper.validate(a, [ + ['a', true], ['A', false], ['b', false] + ]); + + Helper.validate(a.concat(b), [ + ['a', true], ['A', true], ['b', false] + ], done); + }); + + it('overrides and append information', function (done) { + + var a = Joi.description('a').unit('a').tags('a').example('a'); + var b = Joi.description('b').unit('b').tags('b').example('b'); + + var desc = a.concat(b).describe(); + expect(desc).to.deep.equal({ + type: 'any', + description: 'b', + tags: ['a', 'b'], + examples: ['a', 'b'], + unit: 'b' + }); + done(); + }); + + it('merges two objects (any key + specific key)', function (done) { + + var a = Joi.object(); + var b = Joi.object({ b: 1 }); + + Helper.validate(a, [ + [{ b: 1 }, true], [{ b: 2 }, true] + ]); + + Helper.validate(b, [ + [{ b: 1 }, true], [{ b: 2 }, false] + ]); + + Helper.validate(a.concat(b), [ + [{ b: 1 }, true], [{ b: 2 }, false] + ]); + + Helper.validate(b.concat(a), [ + [{ b: 1 }, true], [{ b: 2 }, false] + ], done); + }); + + it('merges two objects (no key + any key)', function (done) { + + var a = Joi.object({}); + var b = Joi.object(); + + Helper.validate(a, [ + [{}, true], [{ b: 2 }, false] + ]); + + Helper.validate(b, [ + [{}, true], [{ b: 2 }, true] + ]); + + Helper.validate(a.concat(b), [ + [{}, true], [{ b: 2 }, false] + ]); + + Helper.validate(b.concat(a), [ + [{}, true], [{ b: 2 }, false] + ], done); + }); + + it('merges two objects (key + key)', function (done) { + + var a = Joi.object({ a: 1 }); + var b = Joi.object({ b: 2 }); + + Helper.validate(a, [ + [{ a: 1 }, true], [{ b: 2 }, false] + ]); + + Helper.validate(b, [ + [{ a: 1 }, false], [{ b: 2 }, true] + ]); + + Helper.validate(a.concat(b), [ + [{ a: 1 }, true], [{ b: 2 }, true] + ]); + + Helper.validate(b.concat(a), [ + [{ a: 1 }, true], [{ b: 2 }, true] + ], done); + }); + + it('merges two objects (renames)', function (done) { + + var a = Joi.object({ a: 1 }).rename('c', 'a'); + var b = Joi.object({ b: 2 }).rename('d', 'b'); + + a.concat(b).validate({ c: 1, d: 2 }, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal({ a: 1, b: 2 }); + done(); + }); + }); + + it('merges two objects (deps)', function (done) { + + var a = Joi.object({ a: 1 }); + var b = Joi.object({ b: 2 }).and('b', 'a'); + + a.concat(b).validate({ a: 1, b: 2 }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('merges two alternatives with references', function (done) { + + var schema = { + a: { c: Joi.number() }, + b: Joi.alternatives(Joi.ref('a.c')).concat(Joi.alternatives(Joi.ref('c'))), + c: Joi.number() + }; + + Helper.validate(schema, [ + [{ a: {} }, true], + [{ a: { c: '5' }, b: 5 }, true], + [{ a: { c: '5' }, b: 6, c: '6' }, true], + [{ a: { c: '5' }, b: 7, c: '6' }, false] + ], done); + }); + + it('merges meta properly', function (done) { + + var metaA = { a: 1 }; + var metaB = { b: 1 }; + var a = Joi.any().meta(metaA); + var b = Joi.any().meta(metaB); + var c = Joi.any(); + var d = Joi.any(); + + expect(a.concat(b)._meta).to.deep.equal([{ a: 1 }, { b: 1 }]); + expect(a.concat(c)._meta).to.deep.equal([metaA]); + expect(b.concat(c)._meta).to.deep.equal([metaB]); + expect(c.concat(d)._meta).to.deep.equal([]); + + done(); + }); + }); + + describe('#when', function () { + + it('throws when options are invalid', function (done) { + + expect(function () { + + Joi.when('a'); + }).to.throw('Invalid options'); + done(); + }); + + it('forks type into alternatives', function (done) { + + var schema = { + a: Joi.any(), + b: Joi.string().valid('x').when('a', { is: 5, then: Joi.valid('y'), otherwise: Joi.valid('z') }) + }; + + Helper.validate(schema, [ + [{ a: 5, b: 'x' }, true], + [{ a: 5, b: 'y' }, true], + [{ a: 5, b: 'z' }, false], + [{ a: 1, b: 'x' }, true], + [{ a: 1, b: 'y' }, false], + [{ a: 1, b: 'z' }, true], + [{ a: 5, b: 'a' }, false], + [{ b: 'a' }, false] + ], done); + }); + + it('forks type into alternatives (only then)', function (done) { + + var schema = { + a: Joi.any(), + b: Joi.string().valid('x').when('a', { is: 5, then: Joi.valid('y') }) + }; + + Helper.validate(schema, [ + [{ a: 5, b: 'x' }, true], + [{ a: 5, b: 'y' }, true], + [{ a: 5, b: 'z' }, false], + [{ a: 1, b: 'x' }, true], + [{ a: 1, b: 'y' }, false], + [{ a: 1, b: 'z' }, false], + [{ a: 5, b: 'a' }, false], + [{ b: 'a' }, false] + ], done); + }); + + it('forks type into alternatives (only otherwise)', function (done) { + + var schema = { + a: Joi.any(), + b: Joi.string().valid('x').when('a', { is: 5, otherwise: Joi.valid('z') }) + }; + + Helper.validate(schema, [ + [{ a: 5, b: 'x' }, true], + [{ a: 5, b: 'y' }, false], + [{ a: 5, b: 'z' }, false], + [{ a: 1, b: 'x' }, true], + [{ a: 1, b: 'y' }, false], + [{ a: 1, b: 'z' }, true], + [{ a: 5, b: 'a' }, false], + [{ b: 'a' }, false] + ], done); + }); + + it('makes peer required', function (done) { + + var schema = { + a: Joi.when('b', { is: 5, then: Joi.required() }), + b: Joi.any() + }; + + Helper.validate(schema, [ + [{ b: 5 }, false], + [{ b: 6 }, true], + [{ a: 'b' }, true], + [{ b: 5, a: 'x' }, true] + ], done) + }); + }); + + describe('#requiredKeys', function () { + + it('should set keys as required', function (done) { + + var schema = Joi.object({ a: 0, b: 0, c: { d: 0, e: { f: 0 } }, g: { h: 0 } }) + .requiredKeys('a', 'b', 'c.d', 'c.e.f', 'g'); + Helper.validate(schema, [ + [{}, false], + [{ a: 0 }, false], + [{ a: 0, b: 0 }, false], + [{ a: 0, b: 0, g: {} }, true], + [{ a: 0, b: 0, c: {}, g: {} }, false], + [{ a: 0, b: 0, c: { d: 0 }, g: {} }, true], + [{ a: 0, b: 0, c: { d: 0, e: {} }, g: {} }, false], + [{ a: 0, b: 0, c: { d: 0, e: { f: 0 } }, g: {} }, true] + ], done); + }); + + it('should work on types other than objects', function (done) { + + var schemas = [Joi.array(), Joi.binary(), Joi.boolean(), Joi.date(), Joi.func(), Joi.number(), Joi.string()]; + schemas.forEach(function (schema) { + + expect(function () { + + schema.applyFunctionToChildren([''], 'required'); + }).to.not.throw(); + + expect(function () { + + schema.applyFunctionToChildren(['', 'a'], 'required'); + }).to.throw(); + + expect(function () { + + schema.applyFunctionToChildren(['a'], 'required'); + }).to.throw(); + }); + + done(); + }); + + it('should throw on unknown key', function (done) { + + expect(function() { + Joi.object({ a: 0, b: 0 }).requiredKeys('a', 'c', 'b', 'd', 'd.e.f'); + }).to.throw(Error, 'unknown key(s) c, d'); + expect(function() { + Joi.object({ a: 0, b: 0 }).requiredKeys('a', 'b', 'a.c.d'); + }).to.throw(Error, 'unknown key(s) a.c.d'); + done(); + }); + + it('should throw on empty object', function (done) { + + expect(function() { + Joi.object().requiredKeys('a', 'c', 'b', 'd'); + }).to.throw(Error, 'unknown key(s) a, b, c, d'); + done(); + }); + + it('should not modify original object', function (done) { + + var schema = Joi.object({ a: 0 }); + var requiredSchema = schema.requiredKeys('a'); + schema.validate({}, function (err) { + + expect(err).to.not.exist(); + + requiredSchema.validate({}, function (err) { + + expect(err).to.exist(); + done(); + }); + }); + }); + }); + + describe('#optionalKeys', function () { + + it('should set keys as optional', function (done) { + + var schema = Joi.object({ a: Joi.number().required(), b: Joi.number().required() }).optionalKeys('a', 'b'); + Helper.validate(schema, [ + [{}, true], + [{ a: 0 }, true], + [{ a: 0, b: 0 }, true] + ], done); + }); + }); + + describe('Set', function () { + + describe('#add', function () { + + it('throws when adding a non ref function', function (done) { + + expect(function () { + + Joi.valid(function () { }); + }).to.throw('Value cannot be an object or function'); + done(); + }); + + it('throws when adding an object function', function (done) { + + expect(function () { + + Joi.valid({}); + }).to.throw('Value cannot be an object or function'); + done(); + }); + }); + + describe('#has', function () { + + it('compares date to null', function (done) { + + var any = Joi.any().clone(); + any._valids.add(null); + expect(any._valids.has(new Date())).to.equal(false); + done(); + }); + + it('compares buffer to null', function (done) { + + var any = Joi.any().clone(); + any._valids.add(null); + expect(any._valids.has(new Buffer(''))).to.equal(false); + done(); + }); + }); + + describe('#values', function () { + + it('returns array', function (done) { + + var a = Joi.any().valid('x').invalid('y'); + var b = a.invalid('x'); + expect(a._valids.values().length).to.equal(1); + expect(b._valids.values().length).to.equal(0); + expect(a._invalids.values().length).to.equal(1); + expect(b._invalids.values().length).to.equal(2); + done(); + }); + }); + + describe('#toString', function () { + + it('includes undefined', function (done) { + + var b = Joi.any().allow(undefined); + expect(b._valids.toString(true)).to.equal('undefined'); + done(); + }); + }); + }); +}); + diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/test/array.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/test/array.js new file mode 100755 index 0000000..7c1d549 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/test/array.js @@ -0,0 +1,593 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('array', function () { + + it('converts a string to an array', function (done) { + + Joi.array().validate('[1,2,3]', function (err, value) { + + expect(err).to.not.exist(); + expect(value.length).to.equal(3); + done(); + }); + }); + + it('errors on non-array string', function (done) { + + Joi.array().validate('{ "something": false }', function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('value must be an array'); + done(); + }); + }); + + it('errors on number', function (done) { + + Joi.array().validate(3, function (err, value) { + + expect(err).to.exist(); + expect(value).to.equal(3); + done(); + }); + }); + + it('converts a non-array string with number type', function (done) { + + Joi.array().validate('3', function (err, value) { + + expect(err).to.exist(); + expect(value).to.equal('3'); + done(); + }); + }); + + it('errors on a non-array string', function (done) { + + Joi.array().validate('asdf', function (err, value) { + + expect(err).to.exist(); + expect(value).to.equal('asdf'); + done(); + }); + }); + + describe('#includes', function () { + + it('converts members', function (done) { + + var schema = Joi.array().includes(Joi.number()); + var input = ['1', '2', '3']; + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal([1, 2, 3]); + done(); + }); + }); + + it('allows zero size', function (done) { + + var schema = Joi.object({ + test: Joi.array().includes(Joi.object({ + foo: Joi.string().required() + })) + }); + var input = { test: [] }; + + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('returns the first error when only one inclusion', function (done) { + + var schema = Joi.object({ + test: Joi.array().includes(Joi.object({ + foo: Joi.string().required() + })) + }); + var input = { test: [{ foo: 'a' }, { bar: 2 }] }; + + schema.validate(input, function (err, value) { + + expect(err.message).to.equal('test at position 1 fails because foo is required'); + done(); + }); + }); + + it('validates multiple types added in two calls', function (done) { + + var schema = Joi.array() + .includes(Joi.number()) + .includes(Joi.string()); + + Helper.validate(schema, [ + [[1, 2, 3], true], + [[50, 100, 1000], true], + [[1, 'a', 5, 10], true], + [['joi', 'everydaylowprices', 5000], true] + ], done); + }); + }); + + describe('#min', function () { + + it('validates array size', function (done) { + + var schema = Joi.array().min(2); + Helper.validate(schema, [ + [[1, 2], true], + [[1], false] + ], done); + }); + + it('throws when limit is not a number', function (done) { + + expect(function () { + + Joi.array().min('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('throws when limit is not an integer', function (done) { + + expect(function () { + + Joi.array().min(1.2); + }).to.throw('limit must be a positive integer'); + done(); + }); + }); + + describe('#max', function () { + + it('validates array size', function (done) { + + var schema = Joi.array().max(1); + Helper.validate(schema, [ + [[1, 2], false], + [[1], true] + ], done); + }); + + it('throws when limit is not a number', function (done) { + + expect(function () { + + Joi.array().max('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('throws when limit is not an integer', function (done) { + + expect(function () { + + Joi.array().max(1.2); + }).to.throw('limit must be a positive integer'); + done(); + }); + }); + + describe('#length', function () { + + it('validates array size', function (done) { + + var schema = Joi.array().length(2); + Helper.validate(schema, [ + [[1, 2], true], + [[1], false] + ], done); + }); + + it('throws when limit is not a number', function (done) { + + expect(function () { + + Joi.array().length('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('throws when limit is not an integer', function (done) { + + expect(function () { + + Joi.array().length(1.2); + }).to.throw('limit must be a positive integer'); + done(); + }); + }); + + describe('#validate', function () { + + it('should, by default, allow undefined, allow empty array', function (done) { + + Helper.validate(Joi.array(), [ + [undefined, true], + [[], true] + ], done); + }); + + it('should, when .required(), deny undefined', function (done) { + + Helper.validate(Joi.array().required(), [ + [undefined, false] + ], done); + }); + + it('allows empty arrays', function (done) { + + Helper.validate(Joi.array(), [ + [undefined, true], + [[], true] + ], done); + }); + + it('excludes values when excludes is called', function (done) { + + Helper.validate(Joi.array().excludes(Joi.string()), [ + [['2', '1'], false], + [['1'], false], + [[2], true] + ], done); + }); + + it('allows types to be excluded', function (done) { + + var schema = Joi.array().excludes(Joi.number()); + + var n = [1, 2, 'hippo']; + schema.validate(n, function (err, value) { + + expect(err).to.exist(); + + var m = ['x', 'y', 'z']; + schema.validate(m, function (err2, value) { + + expect(err2).to.not.exist(); + done(); + }); + }); + }); + + it('validates array of Numbers', function (done) { + + Helper.validate(Joi.array().includes(Joi.number()), [ + [[1, 2, 3], true], + [[50, 100, 1000], true], + [['a', 1, 2], false], + [['1', '2', 4], true] + ], done); + }); + + it('validates array of mixed Numbers & Strings', function (done) { + + Helper.validate(Joi.array().includes(Joi.number(), Joi.string()), [ + [[1, 2, 3], true], + [[50, 100, 1000], true], + [[1, 'a', 5, 10], true], + [['joi', 'everydaylowprices', 5000], true] + ], done); + }); + + it('validates array of objects with schema', function (done) { + + Helper.validate(Joi.array().includes(Joi.object({ h1: Joi.number().required() })), [ + [[{ h1: 1 }, { h1: 2 }, { h1: 3 }], true], + [[{ h2: 1, h3: 'somestring' }, { h1: 2 }, { h1: 3 }], false], + [[1, 2, [1]], false] + ], done); + }); + + it('errors on array of unallowed mixed types (Array)', function (done) { + + Helper.validate(Joi.array().includes(Joi.number()), [ + [[1, 2, 3], true], + [[1, 2, [1]], false] + ], done); + }); + + it('errors on invalid number rule using includes', function (done) { + + var schema = Joi.object({ + arr: Joi.array().includes(Joi.number().integer()) + }); + + var input = { arr: [1, 2, 2.1] }; + schema.validate(input, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('arr at position 2 fails because 2 must be an integer'); + done(); + }); + }); + + it('validates an array within an object', function (done) { + + var schema = Joi.object({ + array: Joi.array().includes(Joi.string().min(5), Joi.number().min(3)) + }).options({ convert: false }); + + Helper.validate(schema, [ + [{ array: ['12345'] }, true], + [{ array: ['1'] }, false], + [{ array: [3] }, true], + [{ array: ['12345', 3] }, true] + ], done); + }); + + it('should not change original value', function (done) { + + var schema = Joi.array().includes(Joi.number()).unique(); + var input = ['1', '2']; + + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal([1, 2]); + expect(input).to.deep.equal(['1', '2']); + done(); + }); + }); + + describe('#describe', function () { + + it('returns an empty description when no rules are applied', function (done) { + + var schema = Joi.array(); + var desc = schema.describe(); + expect(desc).to.deep.equal({ + type: 'array', + flags: { sparse: false } + }); + done(); + }); + + it('returns an updated description when sparse rule is applied', function (done) { + + var schema = Joi.array().sparse(); + var desc = schema.describe(); + expect(desc).to.deep.equal({ + type: 'array', + flags: { sparse: true } + }); + done(); + }); + + it('returns an includes array only if includes are specified', function (done) { + + var schema = Joi.array().includes().max(5); + var desc = schema.describe(); + expect(desc.includes).to.not.exist(); + done(); + }); + + it('returns a recursively defined array of includes when specified', function (done) { + + var schema = Joi.array().includes(Joi.number(), Joi.string()).excludes(Joi.boolean()); + var desc = schema.describe(); + expect(desc.includes).to.have.length(2); + expect(desc.excludes).to.have.length(1); + expect(desc).to.deep.equal({ + type: 'array', + flags: { sparse: false }, + includes: [{ type: 'number', invalids: [Infinity, -Infinity] }, { type: 'string', invalids: [''] }], + excludes: [{ type: 'boolean' }] + }); + + done(); + }); + }); + }); + + describe('#unique', function() { + + it('errors if duplicate numbers, strings, objects, binaries, functions, dates and booleans', function(done) { + var buffer = new Buffer('hello world'); + var func = function() {}; + var now = new Date(); + var schema = Joi.array().sparse().unique(); + + Helper.validate(schema, [ + [[2, 2], false], + [[02, 2], false], + [[0x2, 2], false], + [['duplicate', 'duplicate'], false], + [[{ a: 'b' }, { a: 'b' }], false], + [[buffer, buffer], false], + [[func, func], false], + [[now, now], false], + [[true, true], false], + [[undefined, undefined], false] + ], done); + }); + + it('ignores duplicates if they are of different types', function(done) { + var schema = Joi.array().unique(); + + Helper.validate(schema, [ + [[2, '2'], true] + ], done); + }); + + it('validates without duplicates', function(done) { + var buffer = new Buffer('hello world'); + var buffer2 = new Buffer('Hello world'); + var func = function() {}; + var func2 = function() {}; + var now = new Date(); + var now2 = new Date(+now + 100); + var schema = Joi.array().unique(); + + Helper.validate(schema, [ + [[1, 2], true], + [['s1', 's2'], true], + [[{ a: 'b' }, { a: 'c' }], true], + [[buffer, buffer2], true], + [[func, func2], true], + [[now, now2], true], + [[true, false], true] + ], done); + }); + }); + + describe('#sparse', function () { + + it('errors on undefined value', function (done) { + + var schema = Joi.array().includes(Joi.number()); + + Helper.validate(schema, [ + [[undefined], false], + [[2, undefined], false] + ], done); + }); + + it('validates on undefined value with sparse', function (done) { + + var schema = Joi.array().includes(Joi.number()).sparse(); + + Helper.validate(schema, [ + [[undefined], true], + [[2, undefined], true] + ], done); + }); + + it('switches the sparse flag', function (done) { + + var schema = Joi.array().sparse(); + var desc = schema.describe(); + expect(desc).to.deep.equal({ + type: 'array', + flags: { sparse: true } + }); + done(); + }); + + it('switches the sparse flag with explicit value', function (done) { + + var schema = Joi.array().sparse(true); + var desc = schema.describe(); + expect(desc).to.deep.equal({ + type: 'array', + flags: { sparse: true } + }); + done(); + }); + + it('switches the sparse flag back', function (done) { + + var schema = Joi.array().sparse().sparse(false); + var desc = schema.describe(); + expect(desc).to.deep.equal({ + type: 'array', + flags: { sparse: false } + }); + done(); + }); + }); + + describe('#single', function() { + + it('should allow a single element', function(done) { + + var schema = Joi.array().includes(Joi.number()).excludes(Joi.boolean()).single(); + + Helper.validate(schema, [ + [[1, 2, 3], true], + [1, true], + [['a'], false, null, 'value at position 0 fails because value must be a number'], + ['a', false, null, 'single value of value fails because value must be a number'], + [true, false, null, 'single value of value contains an excluded value'] + ], done); + }); + + it('should allow a single element with multiple types', function(done) { + + var schema = Joi.array().includes(Joi.number(), Joi.string()).single(); + + Helper.validate(schema, [ + [[1, 2, 3], true], + [1, true], + [[1, 'a'], true], + ['a', true], + [true, false, null, 'single value of value does not match any of the allowed types'] + ], done); + }); + + it('should allow nested arrays', function(done) { + + var schema = Joi.array().includes(Joi.array().includes(Joi.number())).single(); + + Helper.validate(schema, [ + [[[1],[2],[3]], true], + [[1, 2, 3], true], + [[['a']], false, null, 'value at position 0 fails because value at position 0 fails because value must be a number'], + [['a'], false, null, 'value at position 0 fails because value must be an array'], + ['a', false, null, 'single value of value fails because value must be an array'], + [1, false, null, 'single value of value fails because value must be an array'], + [true, false, null, 'single value of value fails because value must be an array'] + ], done); + }); + + it('should allow nested arrays with multiple types', function (done) { + + var schema = Joi.array().includes(Joi.array().includes(Joi.number(), Joi.boolean())).single(); + + Helper.validate(schema, [ + [[[1, true]], true], + [[1, true], true], + [[[1, 'a']], false, null, 'value at position 0 fails because value at position 1 does not match any of the allowed types'], + [[1, 'a'], false, null, 'value at position 0 fails because value must be an array'] + ], done); + }); + + it('switches the single flag with explicit value', function (done) { + + var schema = Joi.array().single(true); + var desc = schema.describe(); + expect(desc).to.deep.equal({ + type: 'array', + flags: { sparse: false, single: true } + }); + done(); + }); + + it('switches the single flag back', function (done) { + + var schema = Joi.array().single().single(false); + var desc = schema.describe(); + expect(desc).to.deep.equal({ + type: 'array', + flags: { sparse: false, single: false } + }); + done(); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/test/binary.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/test/binary.js new file mode 100755 index 0000000..7a89a4c --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/test/binary.js @@ -0,0 +1,194 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('binary', function () { + + it('converts a string to a buffer', function (done) { + + Joi.binary().validate('test', function (err, value) { + + expect(err).to.not.exist(); + expect(value instanceof Buffer).to.equal(true); + expect(value.length).to.equal(4); + expect(value.toString('utf8')).to.equal('test'); + done(); + }); + }); + + it('validates allowed buffer content', function (done) { + + var hello = new Buffer('hello'); + var schema = Joi.binary().valid(hello); + + Helper.validate(schema, [ + ['hello', true], + [hello, true], + [new Buffer('hello'), true], + ['goodbye', false], + [new Buffer('goodbye'), false], + [new Buffer('HELLO'), false] + ], done); + }); + + describe('#validate', function () { + + it('returns an error when a non-buffer or non-string is used', function (done) { + + Joi.binary().validate(5, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('value must be a buffer or a string'); + done(); + }); + }); + + it('accepts a buffer object', function (done) { + + var schema = { + buffer: Joi.binary + }; + + Joi.binary().validate(new Buffer('hello world'), function (err, value) { + + expect(err).to.not.exist(); + expect(value.toString('utf8')).to.equal('hello world'); + done(); + }); + }); + }); + + describe('#encoding', function () { + + it('applies encoding', function (done) { + + var schema = Joi.binary().encoding('base64'); + var input = new Buffer('abcdef'); + schema.validate(input.toString('base64'), function (err, value) { + + expect(err).to.not.exist(); + expect(value instanceof Buffer).to.equal(true); + expect(value.toString()).to.equal('abcdef'); + done(); + }); + }); + + it('throws when encoding is invalid', function (done) { + + expect(function () { + + Joi.binary().encoding('base6'); + }).to.throw('Invalid encoding: base6'); + done(); + }); + }); + + describe('#min', function () { + + it('validates buffer size', function (done) { + + var schema = Joi.binary().min(5); + Helper.validate(schema, [ + [new Buffer('testing'), true], + [new Buffer('test'), false] + ], done); + }); + + it('throws when min is not a number', function (done) { + + expect(function () { + + Joi.binary().min('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('throws when min is not an integer', function (done) { + + expect(function () { + + Joi.binary().min(1.2); + }).to.throw('limit must be a positive integer'); + done(); + }); + }); + + describe('#max', function () { + + it('validates buffer size', function (done) { + + var schema = Joi.binary().max(5); + Helper.validate(schema, [ + [new Buffer('testing'), false], + [new Buffer('test'), true] + ], done); + }); + + it('throws when max is not a number', function (done) { + + expect(function () { + + Joi.binary().max('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('throws when max is not an integer', function (done) { + + expect(function () { + + Joi.binary().max(1.2); + }).to.throw('limit must be a positive integer'); + done(); + }); + }); + + describe('#length', function () { + + it('validates buffer size', function (done) { + + var schema = Joi.binary().length(4); + Helper.validate(schema, [ + [new Buffer('test'), true], + [new Buffer('testing'), false] + ], done); + }); + + it('throws when length is not a number', function (done) { + + expect(function () { + + Joi.binary().length('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('throws when length is not an integer', function (done) { + + expect(function () { + + Joi.binary().length(1.2); + }).to.throw('limit must be a positive integer'); + done(); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/test/boolean.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/test/boolean.js new file mode 100755 index 0000000..5be2e97 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/test/boolean.js @@ -0,0 +1,132 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('boolean', function () { + + it('converts a string to a boolean', function (done) { + + Joi.boolean().validate('true', function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.equal(true); + done(); + }); + }); + + it('errors on a number', function (done) { + + Joi.boolean().validate(1, function (err, value) { + + expect(err).to.exist(); + expect(value).to.equal(1); + done(); + }); + }); + + describe('#validate', function () { + + it('converts string values and validates', function (done) { + + var rule = Joi.boolean(); + Helper.validate(rule, [ + ['1234', false], + [false, true], + [true, true], + [null, false], + ['on', true], + ['off', true], + ['true', true], + ['false', true], + ['yes', true], + ['no', true] + ], done); + }); + + it('should handle work with required', function (done) { + + var rule = Joi.boolean().required(); + Helper.validate(rule, [ + ['1234', false], + ['true', true], + [false, true], + [true, true], + [null, false] + ], done); + }); + + it('should handle work with allow', function (done) { + + var rule = Joi.boolean().allow(false); + Helper.validate(rule, [ + ['1234', false], + [false, true], + [null, false] + ], done); + }); + + it('should handle work with invalid', function (done) { + + var rule = Joi.boolean().invalid(false); + Helper.validate(rule, [ + ['1234', false], + [false, false], + [true, true], + [null, false] + ], done); + }); + + it('should handle work with invalid and null allowed', function (done) { + + var rule = Joi.boolean().invalid(false).allow(null); + Helper.validate(rule, [ + ['1234', false], + [false, false], + [true, true], + [null, true] + ], done); + }); + + it('should handle work with allow and invalid', function (done) { + + var rule = Joi.boolean().invalid(true).allow(false); + Helper.validate(rule, [ + ['1234', false], + [false, true], + [true, false], + [null, false] + ], done); + }); + + it('should handle work with allow, invalid, and null allowed', function (done) { + + var rule = Joi.boolean().invalid(true).allow(false).allow(null); + Helper.validate(rule, [ + ['1234', false], + [false, true], + [true, false], + [null, true] + ], done); + }); + }); +}); + diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/test/date.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/test/date.js new file mode 100755 index 0000000..6eb9d21 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/test/date.js @@ -0,0 +1,291 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('date', function () { + + it('fails on boolean', function (done) { + + var schema = Joi.date(); + Helper.validate(schema, [ + [true, false], + [false, false] + ], done); + }); + + it('matches specific date', function (done) { + + var now = Date.now(); + Joi.date().valid(new Date(now)).validate(new Date(now), function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('errors on invalid input and convert disabled', function (done) { + + Joi.date().options({ convert: false }).validate('1-1-2013 UTC', function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('value must be a number of milliseconds or valid date string'); + done(); + }); + }); + + it('validates date', function (done) { + + Joi.date().validate(new Date(), function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('validates millisecond date as a string', function (done) { + + var now = new Date(); + var mili = now.getTime(); + + Joi.date().validate(mili.toString(), function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal(now); + done(); + }); + }); + + describe('#validate', function () { + + describe('min', function () { + + it('validates min', function (done) { + + Helper.validate(Joi.date().min('1-1-2000 UTC'), [ + ['1-1-2001 UTC', true], + ['1-1-2000 UTC', true], + [0, false], + ["0", false], + ["-1", false], + ['1-1-1999 UTC', false] + ], done); + }); + + it('accepts "now" as the min date', function(done) { + + var future = new Date(Date.now() + 1000000); + + Joi.date().min('now').validate(future, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal(future); + done(); + }); + }); + + it('errors if .min("now") is used with a past date', function(done) { + + var past = new Date(Date.now() - 1000000); + + Joi.date().min('now').validate(past, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('accepts references as min date', function(done) { + + var schema = Joi.object({ a: Joi.date(), b: Joi.date().min(Joi.ref('a')) }); + var now = Date.now(); + + Helper.validate(schema, [ + [{ a: now, b: now }, true], + [{ a: now, b: now + 1e3 }, true], + [{ a: now, b: now - 1e3 }, false] + ], done); + }); + + it('errors if reference is not a date', function(done) { + + var schema = Joi.object({ a: Joi.string(), b: Joi.date().min(Joi.ref('a')) }); + + Helper.validate(schema, [ + [{ a: 'abc', b: new Date() }, false, null, 'b references a which is not a date'], + [{ a: '123', b: new Date() }, true], + [{ a: (Date.now() + 1e3).toString(), b: new Date() }, false, null, /^b must be larger than or equal to/] + ], done); + }); + }); + + describe('max', function () { + + it('validates max', function (done) { + + Helper.validate(Joi.date().max('1-1-1970 UTC'), [ + ['1-1-1971 UTC', false], + ['1-1-1970 UTC', true], + [0, true], + [1, false], + ["0", true], + ["-1", true], + ['1-1-2014 UTC', false] + ], done); + }); + + it('accepts "now" as the max date', function(done) { + + var past = new Date(Date.now() - 1000000); + + Joi.date().max('now').validate(past, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal(past); + done(); + }); + }); + + it('errors if .max("now") is used with a future date', function(done) { + + var future = new Date(Date.now() + 1000000); + + Joi.date().max('now').validate(future, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('accepts references as max date', function(done) { + + var schema = Joi.object({ a: Joi.date(), b: Joi.date().max(Joi.ref('a')) }); + var now = Date.now(); + + Helper.validate(schema, [ + [{ a: now, b: now }, true], + [{ a: now, b: now + 1e3 }, false], + [{ a: now, b: now - 1e3 }, true] + ], done); + }); + + it('errors if reference is not a date', function(done) { + + var schema = Joi.object({ a: Joi.string(), b: Joi.date().max(Joi.ref('a')) }); + + Helper.validate(schema, [ + [{ a: 'abc', b: new Date() }, false, null, 'b references a which is not a date'], + [{ a: '100000000000000', b: new Date() }, true], + [{ a: (Date.now() - 1e3).toString(), b: new Date() }, false, null, /^b must be less than or equal to/] + ], done); + }); + }); + + it('validates only valid dates', function (done) { + + Helper.validate(Joi.date(), [ + ['1-1-2013 UTC', true], + ['not a valid date', false], + [new Date('not a valid date'), false] + ], done); + }); + + describe('#iso', function() { + + it('validates isoDate', function (done) { + + Helper.validate(Joi.date().iso(), [ + ['2013-06-07T14:21:46.295Z', true], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', true], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', true], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', true], + ['2013-06-07T14:21:46-07:00', true], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', true], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', true], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', true], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false] + ], done); + }); + + it('validates isoDate with a friendly error message', function (done) { + + var schema = { item: Joi.date().iso() }; + Joi.compile(schema).validate({ item: 'something' }, function (err, value) { + + expect(err.message).to.contain('must be a valid ISO 8601 date'); + done(); + }); + }); + + it('validates isoDate after clone', function (done) { + + var schema = { item: Joi.date().iso().clone() }; + Joi.compile(schema).validate({ item: '2013-06-07T14:21:46.295Z' }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + }); + + describe('#format', function () { + + it('validates custom format', function (done) { + + Helper.validate(Joi.date().format('DD#YYYY$MM'), [ + ['07#2013$06', true], + ['2013-06-07', false] + ], done); + }); + + it('validates several custom formats', function (done) { + + Helper.validate(Joi.date().format(['DD#YYYY$MM', 'YY|DD|MM']), [ + ['13|07|06', true], + ['2013-06-07', false] + ], done); + }); + + it('fails with bad formats', function (done) { + + expect(function () { + + Joi.date().format(true); + }).to.throw('Invalid format.'); + + expect(function () { + + Joi.date().format(['YYYYMMDD', true]); + }).to.throw('Invalid format.'); + done(); + }); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/test/errors.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/test/errors.js new file mode 100755 index 0000000..3b343ed --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/test/errors.js @@ -0,0 +1,270 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('errors', function () { + + it('supports custom errors when validating types', function (done) { + + var schema = Joi.object({ + email: Joi.string().email(), + date: Joi.date(), + alphanum: Joi.string().alphanum(), + min: Joi.string().min(3), + max: Joi.string().max(3), + required: Joi.string().required(), + xor: Joi.string(), + renamed: Joi.string().valid('456'), + notEmpty: Joi.string().required() + }).rename('renamed', 'required').without('required', 'xor').without('xor', 'required'); + + var input = { + email: 'invalid-email', + date: 'invalid-date', + alphanum: '\b\n\f\r\t', + min: 'ab', + max: 'abcd', + required: 'hello', + xor: '123', + renamed: '456', + notEmpty: '' + }; + + var lang = { + any: { + empty: '3' + }, + date: { + base: '18' + }, + string: { + base: '13', + min: '14', + max: '15', + alphanum: '16', + email: '19' + }, + object: { + without: '7', + rename: { + override: '11' + } + } + }; + + Joi.validate(input, schema, { abortEarly: false, language: lang }, function (err, value) { + + expect(err).to.exist(); + expect(err.name).to.equal('ValidationError'); + expect(err.message).to.equal('value 11. required 7. xor 7. email 19. date 18. alphanum 16. min 14. max 15. notEmpty 3'); + done(); + }); + }); + + it('does not prefix with key when language uses context.key', function (done) { + + Joi.valid('sad').options({ language: { any: { allowOnly: 'my hero {{key}} is not {{valids}}' } } }).validate(5, function (err, value) { + + expect(err.message).to.equal('my hero value is not sad'); + done(); + }); + }); + + it('escapes unsafe keys', function (done) { + + var schema = { + 'a()': Joi.number() + }; + + Joi.validate({ 'a()': 'x' }, schema, function (err, value) { + + expect(err.message).to.equal('a() must be a number'); + + Joi.validate({ 'b()': 'x' }, schema, function (err, value) { + + expect(err.message).to.equal('b() is not allowed'); + done(); + }); + }); + }); + + it('returns error type in validation error', function (done) { + + var input = { + notNumber: '', + notString: true, + notBoolean: 9 + }; + + var schema = { + notNumber: Joi.number().required(), + notString: Joi.string().required(), + notBoolean: Joi.boolean().required() + } + + Joi.validate(input, schema, { abortEarly: false }, function (err, value) { + + expect(err).to.exist(); + expect(err.details).to.have.length(3); + expect(err.details[0].type).to.equal('number.base'); + expect(err.details[1].type).to.equal('string.base'); + expect(err.details[2].type).to.equal('boolean.base'); + done(); + }); + }); + + it('returns a full path to an error value on an array (includes)', function (done) { + + var schema = Joi.array().includes(Joi.array().includes({ x: Joi.number() })); + var input = [ + [{ x: 1 }], + [{ x: 1 }, { x: 'a' }] + ]; + + schema.validate(input, function (err, value) { + + expect(err).to.exist(); + expect(err.details[0].path).to.equal('1.1.x'); + done(); + }); + }); + + it('returns a full path to an error value on an array (excludes)', function (done) { + + var schema = Joi.array().includes(Joi.array().excludes({ x: Joi.string() })); + var input = [ + [{ x: 1 }], + [{ x: 1 }, { x: 'a' }] + ]; + + schema.validate(input, function (err, value) { + + expect(err).to.exist(); + expect(err.details[0].path).to.equal('1.1'); + done(); + }); + }); + + it('returns a full path to an error value on an object', function (done) { + + var schema = { + x: Joi.array().includes({ x: Joi.number() }) + }; + + var input = { + x: [{ x: 1 }, { x: 'a' }] + }; + + Joi.validate(input, schema, function (err, value) { + + expect(err).to.exist(); + expect(err.details[0].path).to.equal('x.1.x'); + done(); + }); + }); + + it('overrides root key language', function (done) { + + Joi.string().options({ language: { root: 'blah' } }).validate(4, function (err, value) { + + expect(err.message).to.equal('blah must be a string'); + done(); + }); + }); + + it('overrides label key language', function (done) { + + Joi.string().options({ language: { root: 'blah', label: 'bleh' } }).validate(4, function (err, value) { + + expect(err.message).to.equal('bleh must be a string'); + done(); + }); + }); + + it('provides context with the error', function (done) { + + Joi.object({ length: Joi.number().min(3).required() }).validate({ length: 1 }, function (err) { + + expect(err.details).to.deep.equal([{ + message: 'length must be larger than or equal to 3', + path: 'length', + type: 'number.min', + context: { + limit: 3, + key: 'length' + } + }]); + done(); + }); + }); + + describe('#annotate', function () { + + it('annotates error', function (done) { + + var object = { + a: 'm', + y: { + b: { + c: 10 + } + } + }; + + var schema = { + a: Joi.string().valid('a', 'b', 'c', 'd'), + y: Joi.object({ + u: Joi.string().valid(['e', 'f', 'g', 'h']).required(), + b: Joi.string().valid('i', 'j').allow(false), + d: Joi.object({ + x: Joi.string().valid('k', 'l').required(), + c: Joi.number() + }) + }) + }; + + Joi.validate(object, schema, { abortEarly: false }, function (err, value) { + + expect(err).to.exist(); + expect(err.annotate()).to.equal('{\n \"y\": {\n \"b\" \u001b[31m[1]\u001b[0m: {\n \"c\": 10\n },\n \u001b[41m\"u\"\u001b[0m\u001b[31m [2]: -- missing --\u001b[0m\n },\n \"a\" \u001b[31m[3]\u001b[0m: \"m\"\n}\n\u001b[31m\n[1] a must be one of a, b, c, d\n[2] u is required\n[3] b must be a string\u001b[0m'); + done(); + }); + }); + + it('displays alternatives fail as a single line', function (done) { + + var schema = { + x: [ + Joi.string(), + Joi.number(), + Joi.date() + ] + }; + + Joi.validate({ x: true }, schema, function (err, value) { + + expect(err).to.exist(); + expect(err.annotate()).to.equal('{\n \"x\" \u001b[31m[1, 2, 3]\u001b[0m: true\n}\n\u001b[31m\n[1] x must be a string\n[2] x must be a number\n[3] x must be a number of milliseconds or valid date string\u001b[0m'); + done(); + }); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/test/function.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/test/function.js new file mode 100755 index 0000000..f98d57d --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/test/function.js @@ -0,0 +1,34 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('func', function () { + + it('should validate a function', function (done) { + + Helper.validate(Joi.func().required(), [ + [function () { }, true], + ['', false] + ], done); + }); +}); + diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/test/helper.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/test/helper.js new file mode 100755 index 0000000..50c12ba --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/test/helper.js @@ -0,0 +1,70 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +exports.validate = function (schema, config, callback) { + + return exports.validateOptions(schema, config, null, callback); +} + + +exports.validateOptions = function (schema, config, options, callback) { + + var compiled = Joi.compile(schema); + for (var i = 0, il = config.length; i < il; ++i) { + + var item = config[i]; + var result = Joi.validate(item[0], compiled, item[2] || options); + + var err = result.error; + var value = result.value; + + if (err !== null && item[1]) { + console.log(err); + } + + if (err === null && !item[1]) { + console.log(item[0]); + } + + expect(err === null).to.equal(item[1]); + + if (item.length >= 4) { + var comparator = item[3]; + if (item[1]) { + expect(value).to.deep.equal(comparator); + } + else { + if (comparator instanceof RegExp) { + expect(err.message).to.match(comparator); + } + else { + expect(err.message).to.deep.equal(comparator); + } + } + } + } + + if (callback) { + callback(); + } +}; + diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/test/index.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/test/index.js new file mode 100755 index 0000000..9a05886 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/test/index.js @@ -0,0 +1,1472 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Path = require('path'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('Joi', function () { + + it('validates object', function (done) { + + var schema = Joi.object({ + a: Joi.number().min(0).max(3), + b: Joi.string().valid('a', 'b', 'c'), + c: Joi.string().email().optional() + }).without('a', 'none'); + + var obj = { + a: 1, + b: 'a', + c: 'joe@example.com' + }; + + schema.validate(obj, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('keeps schema immutable', function (done) { + + var a = Joi.string(); + var b = a.valid('b'); + + Helper.validate(a, [ + ['a', true], + ['b', true], + [5, false] + ], function () { + + Helper.validate(b, [ + ['a', false], + ['b', true], + [5, false] + ], done); + }); + + }); + + it('validates null', function (done) { + + Joi.string().validate(null, function (err, value) { + + expect(err).to.exist(); + expect(err.annotate()).to.equal('{\n \u001b[41m\"value\"\u001b[0m\u001b[31m [1]: -- missing --\u001b[0m\n}\n\u001b[31m\n[1] value must be a string\u001b[0m'); + done(); + }); + }); + + it('validates null schema', function (done) { + + Helper.validate(null, [ + ['a', false], + [null, true] + ], done); + }); + + it('validates number literal', function (done) { + + Helper.validate(5, [ + [6, false], + [5, true] + ], done); + }); + + it('validates string literal', function (done) { + + Helper.validate('5', [ + ['6', false], + ['5', true] + ], done); + }); + + it('validates boolean literal', function (done) { + + Helper.validate(true, [ + [false, false], + [true, true] + ], done); + }); + + it('validates date literal', function (done) { + + var now = Date.now(); + Helper.validate(new Date(now), [ + [new Date(now), true], + [now, true], + [now * 2, false] + ], done); + }); + + it('validates complex literal', function (done) { + + var schema = ['key', 5, { a: true, b: [/^a/, 'boom'] }]; + Helper.validate(schema, [ + ['key', true], + [5, true], + ['other', false], + [6, false], + [{ c: 5 }, false], + [{}, true], + [{ b: 'abc' }, true], + [{ a: true, b: 'boom' }, true], + [{ a: 5, b: 'a' }, false] + ], done); + }); + + it('validates a compiled complex literal', function (done) { + + var schema = Joi.compile(['key', 5, { a: true, b: [/^a/, 'boom'] }]); + Helper.validate(schema, [ + ['key', true], + [5, true], + ['other', false], + [6, false], + [{ c: 5 }, false], + [{}, true], + [{ b: 'abc' }, true], + [{ a: true, b: 'boom' }, true], + [{ a: 5, b: 'a' }, false] + ], done); + }); + + it('validates regex directly', function (done) { + + Joi.compile(/^5$/).validate('5', function (err, value) { + + expect(err).to.not.exist(); + Joi.compile(/.{2}/).validate('6', function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + }); + + it('validated with', function (done) { + + var schema = Joi.object({ + txt: Joi.string(), + upc: Joi.string() + }).with('txt', 'upc'); + + Joi.validate({ txt: 'a' }, schema, { abortEarly: false }, function (err, value) { + + expect(err.message).to.equal('txt missing required peer upc'); + + Helper.validate(schema, [ + [{ upc: 'test' }, true], + [{ txt: 'test' }, false], + [{ txt: 'test', upc: null }, false], + [{ txt: 'test', upc: '' }, false], + [{ txt: 'test', upc: undefined }, false], + [{ txt: 'test', upc: 'test' }, true] + ], done); + }); + }); + + it('validated without', function (done) { + + var schema = Joi.object({ + txt: Joi.string(), + upc: Joi.string() + }).without('txt', 'upc'); + + Joi.validate({ txt: 'a', upc: 'b' }, schema, { abortEarly: false }, function (err, value) { + + expect(err.message).to.equal('txt conflict with forbidden peer upc'); + + Helper.validate(schema, [ + [{ upc: 'test' }, true], + [{ txt: 'test' }, true], + [{ txt: 'test', upc: null }, false], + [{ txt: 'test', upc: '' }, false], + [{ txt: 'test', upc: undefined }, true], + [{ txt: 'test', upc: 'test' }, false] + ], done); + }); + }); + + it('validates xor', function (done) { + + var schema = Joi.object({ + txt: Joi.string(), + upc: Joi.string() + }).xor('txt', 'upc'); + + Joi.validate({}, schema, { abortEarly: false }, function (err, value) { + + expect(err.message).to.equal('value must contain at least one of txt, upc'); + + Helper.validate(schema, [ + [{ upc: null }, false], + [{ upc: 'test' }, true], + [{ txt: null }, false], + [{ txt: 'test' }, true], + [{ txt: 'test', upc: null }, false], + [{ txt: 'test', upc: '' }, false], + [{ txt: '', upc: 'test' }, false], + [{ txt: null, upc: 'test' }, false], + [{ txt: undefined, upc: 'test' }, true], + [{ txt: 'test', upc: undefined }, true], + [{ txt: 'test', upc: '' }, false], + [{ txt: 'test', upc: null }, false], + [{ txt: '', upc: undefined }, false], + [{ txt: '', upc: '' }, false], + [{ txt: 'test', upc: 'test' }, false] + ], done); + }); + }); + + it('validates multiple peers xor', function (done) { + + var schema = Joi.object({ + txt: Joi.string(), + upc: Joi.string(), + code: Joi.string() + }).xor('txt', 'upc', 'code'); + + Helper.validate(schema, [ + [{ upc: 'test' }, true], + [{ txt: 'test' }, true], + [{}, false] + ], done); + }); + + it('validates xor with number types', function (done) { + + var schema = Joi.object({ + code: Joi.number(), + upc: Joi.number() + }).xor('code', 'upc'); + + Helper.validate(schema, [ + [{ upc: 123 }, true], + [{ code: 456 }, true], + [{ code: 456, upc: 123 }, false], + [{}, false] + ], done); + }); + + it('validates xor when empty value of peer allowed', function (done) { + + var schema = Joi.object({ + code: Joi.string(), + upc: Joi.string().allow('') + }).xor('code', 'upc'); + + Helper.validate(schema, [ + [{ upc: '' }, true], + [{ upc: '123' }, true], + [{ code: '456' }, true], + [{ code: '456', upc: '' }, false], + [{}, false] + ], done); + }); + + it('validates or', function (done) { + + var schema = Joi.object({ + txt: Joi.string(), + upc: Joi.string().allow(null, ''), + code: Joi.number() + }).or('txt', 'upc', 'code'); + + Joi.validate({}, schema, { abortEarly: false }, function (err, value) { + + expect(err.message).to.equal('value must contain at least one of txt, upc, code'); + + Helper.validate(schema, [ + [{ upc: null }, true], + [{ upc: 'test' }, true], + [{ txt: null }, false], + [{ txt: 'test' }, true], + [{ code: null }, false], + [{ code: 123 }, true], + [{ txt: 'test', upc: null }, true], + [{ txt: 'test', upc: '' }, true], + [{ txt: '', upc: 'test' }, false], + [{ txt: null, upc: 'test' }, false], + [{ txt: undefined, upc: 'test' }, true], + [{ txt: 'test', upc: undefined }, true], + [{ txt: 'test', upc: '' }, true], + [{ txt: 'test', upc: null }, true], + [{ txt: '', upc: undefined }, false], + [{ txt: '', upc: undefined, code: 999 }, false], + [{ txt: '', upc: undefined, code: undefined }, false], + [{ txt: '', upc: '' }, false], + [{ txt: 'test', upc: 'test' }, true], + [{ txt: 'test', upc: 'test', code: 322 }, true] + ], done); + }); + }); + + it('validates and', function (done) { + + var schema = Joi.object({ + txt: Joi.string(), + upc: Joi.string().allow(null, ''), + code: Joi.number() + }).and('txt', 'upc', 'code'); + + Joi.validate({ txt: 'x' }, schema, { abortEarly: false }, function (err, value) { + + expect(err.message).to.equal('value contains txt without its required peers upc, code'); + + Helper.validate(schema, [ + [{}, true], + [{ upc: null }, false], + [{ upc: 'test' }, false], + [{ txt: null }, false], + [{ txt: 'test' }, false], + [{ code: null }, false], + [{ code: 123 }, false], + [{ txt: 'test', upc: null }, false], + [{ txt: 'test', upc: '' }, false], + [{ txt: '', upc: 'test' }, false], + [{ txt: null, upc: 'test' }, false], + [{ txt: undefined, upc: 'test' }, false], + [{ txt: 'test', upc: undefined }, false], + [{ txt: 'test', upc: '' }, false], + [{ txt: 'test', upc: null }, false], + [{ txt: '', upc: undefined }, false], + [{ txt: '', upc: undefined, code: 999 }, false], + [{ txt: '', upc: undefined, code: undefined }, false], + [{ txt: '', upc: '' }, false], + [{ txt: 'test', upc: 'test' }, false], + [{ txt: 'test', upc: 'test', code: 322 }, true], + [{ txt: 'test', upc: null, code: 322 }, true] + ], done); + }); + }); + + it('validates nand()', function (done) { + + var schema = Joi.object({ + txt: Joi.string(), + upc: Joi.string().allow(null, ''), + code: Joi.number() + }).nand('txt', 'upc', 'code'); + + Joi.validate({ txt: 'x', upc: 'y', code: 123 }, schema, { abortEarly: false }, function (err, value) { + + expect(err.message).to.equal('value txt must not exist simultaneously with upc, code'); + + Helper.validate(schema, [ + [{}, true], + [{ upc: null }, true], + [{ upc: 'test' }, true], + [{ txt: 'test' }, true], + [{ code: 123 }, true], + [{ txt: 'test', upc: null }, true], + [{ txt: 'test', upc: '' }, true], + [{ txt: undefined, upc: 'test' }, true], + [{ txt: 'test', upc: undefined }, true], + [{ txt: 'test', upc: '' }, true], + [{ txt: 'test', upc: null }, true], + [{ txt: 'test', upc: undefined, code: 999 }, true], + [{ txt: 'test', upc: 'test' }, true], + [{ txt: 'test', upc: 'test', code: 322 }, false], + [{ txt: 'test', upc: null, code: 322 }, false] + ], done); + }); + }); + + it('validates an array of valid types', function (done) { + + var schema = Joi.object({ + auth: [ + Joi.object({ + mode: Joi.string().valid('required', 'optional', 'try').allow(null) + }).allow(null), + Joi.string(), + Joi.boolean() + ] + }); + + schema.validate({ auth: { mode: 'none' } }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('mode must be one of required, optional, try, null. auth must be a string. auth must be a boolean'); + + Helper.validate(schema, [ + [{ auth: { mode: 'try' } }, true], + [{ something: undefined }, false], + [{ auth: { something: undefined } }, false], + [{ auth: null }, true], + [{ auth: undefined }, true], + [{}, true], + [{ auth: true }, true], + [{ auth: 123 }, false] + ], done); + }); + }); + + it('validates alternatives', function (done) { + + var schema = Joi.object({ + auth: Joi.alternatives( + Joi.object({ + mode: Joi.string().valid('required', 'optional', 'try').allow(null) + }).allow(null), + Joi.string(), + Joi.boolean() + ) + }); + + schema.validate({ auth: { mode: 'none' } }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('mode must be one of required, optional, try, null. auth must be a string. auth must be a boolean'); + + Helper.validate(schema, [ + [{ auth: { mode: 'try' } }, true], + [{ something: undefined }, false], + [{ auth: { something: undefined } }, false], + [{ auth: null }, true], + [{ auth: undefined }, true], + [{}, true], + [{ auth: true }, true], + [{ auth: 123 }, false] + ], done); + }); + }); + + it('validates required alternatives', function (done) { + + var schema = { + a: Joi.alternatives( + Joi.string().required(), + Joi.boolean().required() + ) + }; + + Helper.validate(schema, [ + [{ a: null }, false], + [{ a: undefined }, true], + [{}, true], + [{ a: true }, true], + [{ a: 'true' }, true], + [{ a: 123 }, false], + [{ a: { c: 1 } }, false], + [{ b: undefined }, false] + ], done); + }); + + it('validates required [] alternatives', function (done) { + + var schema = { + a: [ + Joi.string().required(), + Joi.boolean().required() + ] + }; + + Helper.validate(schema, [ + [{ a: null }, false], + [{ a: undefined }, true], + [{}, true], + [{ a: true }, true], + [{ a: 'true' }, true], + [{ a: 123 }, false], + [{ a: { c: 1 } }, false], + [{ b: undefined }, false] + ], done); + }); + + it('validates an array of string with valid', function (done) { + + var schema = { + brand: Joi.array().includes(Joi.string().valid('amex', 'visa')) + }; + + Helper.validate(schema, [ + [{ brand: ['amex'] }, true], + [{ brand: ['visa', 'mc'] }, false] + ], done); + }); + + it('validates pre and post convert value', function (done) { + + var schema = Joi.number().valid(5); + + Helper.validate(schema, [ + [5, true], + ['5', true] + ], done); + }); + + it('does not change object when validation fails', function (done) { + + var schema = Joi.object({ + a: Joi.number().valid(2) + }); + + var obj = { + a: '5' + }; + + schema.validate(obj, function (err, value) { + + expect(err).to.exist(); + expect(value.a).to.equal('5'); + done(); + }); + }); + + it('does not set optional keys when missing', function (done) { + + var schema = Joi.object({ + a: Joi.number() + }); + + var obj = {}; + + schema.validate(obj, function (err, value) { + + expect(err).to.not.exist(); + expect(value.hasOwnProperty('a')).to.equal(false); + done(); + }); + }); + + it('invalidates pre and post convert value', function (done) { + + var schema = Joi.number().invalid(5); + + Helper.validate(schema, [ + [5, false], + ['5', false] + ], done); + }); + + it('invalidates missing peers', function (done) { + + var schema = Joi.object({ + username: Joi.string(), + password: Joi.string() + }).with('username', 'password').without('password', 'access_token'); + + schema.validate({ username: 'bob' }, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('validates config where the root item is a joi type', function (done) { + + Joi.boolean().allow(null).validate(true, function (err, value) { + + expect(err).to.be.null(); + Joi.object().validate({ auth: { mode: 'try' } }, function (err, value) { + + expect(err).to.be.null(); + + Joi.object().validate(true, function (err, value) { + + expect(err.message).to.contain('value must be an object'); + + Joi.string().validate(true, function (err, value) { + + expect(err.message).to.contain('value must be a string'); + + Joi.string().email().validate('test@test.com', function (err, value) { + + expect(err).to.be.null(); + Joi.object({ param: Joi.string().required() }).validate({ param: 'item' }, function (err, value) { + + expect(err).to.be.null(); + done(); + }); + }); + }); + }); + }); + }); + }); + + it('converts string to number', function (done) { + + var schema = Joi.object({ + a: Joi.number() + }); + + var input = { a: '5' }; + schema.validate(input, function (err, value) { + + expect(err).to.be.null(); + expect(value.a).to.equal(5); + expect(input.a).to.equal('5'); + done(); + }); + }); + + it('allows unknown keys in objects if no schema was given', function (done) { + + Joi.object().validate({ foo: 'bar' }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('fails on unknown keys in objects if a schema was given', function (done) { + + Joi.object({}).validate({ foo: 'bar' }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('foo is not allowed'); + + Joi.compile({}).validate({ foo: 'bar' }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('foo is not allowed'); + + Joi.compile({ other: Joi.number() }).validate({ foo: 'bar' }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('foo is not allowed'); + + done(); + }); + }); + }); + }); + + it('validates an unknown option', function (done) { + + var config = { + auth: Joi.object({ + mode: Joi.string().valid('required', 'optional', 'try').allow(null) + }).allow(null) + }; + + Joi.compile(config).validate({ auth: { unknown: true } }, function (err, value) { + + expect(err).to.not.be.null(); + expect(err.message).to.contain('unknown is not allowed'); + + Joi.compile(config).validate({ something: false }, function (err, value) { + + expect(err).to.not.be.null(); + expect(err.message).to.contain('something is not allowed'); + + done(); + }); + }); + }); + + it('validates required key with multiple options', function (done) { + + var config = { + module: Joi.alternatives([ + Joi.object({ + compile: Joi.func().required(), + execute: Joi.func() + }), + Joi.string() + ]).required() + }; + + Joi.compile(config).validate({}, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.contain('module is required'); + + Joi.compile(config).validate({ module: 'test' }, function (err, value) { + + expect(err).to.be.null(); + + Joi.compile(config).validate({ module: {} }, function (err, value) { + + expect(err).to.not.be.null(); + expect(err.message).to.contain('compile is required'); + expect(err.message).to.contain('module must be a string'); + + Joi.compile(config).validate({ module: { compile: function () { } } }, function (err, value) { + + expect(err).to.be.null(); + done(); + }); + }); + }); + }); + }); + + it('validates key with required alternatives', function (done) { + + var config = { + module: Joi.alt().try( + Joi.object({ + compile: Joi.func().required(), + execute: Joi.func() + }).required(), + Joi.string().required() + ) + }; + + Joi.compile(config).validate({}, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('validates required key with alternatives', function (done) { + + var config = { + module: Joi.alt().try( + Joi.object({ + compile: Joi.func().required(), + execute: Joi.func() + }), + Joi.string() + ).required() + }; + + Joi.compile(config).validate({}, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.contain('module is required'); + done(); + }); + }); + + it('does not require optional numbers', function (done) { + + var config = { + position: Joi.number(), + suggestion: Joi.string() + }; + + Joi.compile(config).validate({ suggestion: 'something' }, function (err, value) { + + expect(err).to.be.null(); + + Joi.compile(config).validate({ position: 1 }, function (err, value) { + + expect(err).to.be.null(); + done(); + }) + }); + }); + + it('does not require optional objects', function (done) { + + var config = { + position: Joi.number(), + suggestion: Joi.object() + }; + + Joi.compile(config).validate({ suggestion: {} }, function (err, value) { + + expect(err).to.be.null(); + + Joi.compile(config).validate({ position: 1 }, function (err, value) { + + expect(err).to.be.null(); + done(); + }); + }); + }); + + it('validates object successfully when config has an array of types', function (done) { + + var schema = { + f: [Joi.number(), Joi.boolean()], + g: [Joi.string(), Joi.object()] + }; + + var obj = { + f: true, + g: 'test' + }; + + Joi.compile(schema).validate(obj, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('validates object successfully when config allows for optional key and key is missing', function (done) { + + var schema = { + h: Joi.number(), + i: Joi.string(), + j: Joi.object() + }; + + var obj = { + h: 12, + i: 'test' + }; + + Joi.compile(schema).validate(obj, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('fails validation', function (done) { + + var schema = { + a: Joi.number().min(0).max(3), + b: Joi.string().valid('a', 'b', 'c'), + c: Joi.string().email().optional() + }; + + var obj = { + a: 10, + b: 'a', + c: 'joe@example.com' + }; + + Joi.compile(schema).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('fails validation when the wrong types are supplied', function (done) { + + var schema = { + a: Joi.number().min(0).max(3), + b: Joi.string().valid('a', 'b', 'c'), + c: Joi.string().email().optional() + }; + + var obj = { + a: 'a', + b: 'a', + c: 'joe@example.com' + }; + + Joi.compile(schema).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('fails validation when missing a required parameter', function (done) { + + var obj = { + c: 10 + }; + + Joi.compile({ a: Joi.string().required() }).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('fails validation when missing a required parameter within an object config', function (done) { + + var obj = { + a: {} + }; + + Joi.compile({ a: Joi.object({ b: Joi.string().required() }) }).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('fails validation when parameter is required to be an object but is given as string', function (done) { + + var obj = { + a: 'a string' + }; + + Joi.compile({ a: Joi.object({ b: Joi.string().required() }) }).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('validates when parameter is required to be an object and is given correctly as a json string', function (done) { + + var schema = { + a: Joi.object({ + b: Joi.string().required() + }) + }; + + var input = { + a: '{"b":"string"}' + }; + + Joi.validate(input, schema, function (err, value) { + + expect(err).to.not.exist(); + expect(input.a).to.equal('{"b":"string"}'); + expect(value.a.b).to.equal('string'); + done(); + }); + }); + + it('fails validation when parameter is required to be an object but is given as a json string that is incorrect (number instead of string)', function (done) { + + var obj = { + a: '{"b":2}' + }; + + Joi.object({ a: Joi.object({ b: Joi.string().required() }) }).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('fails validation when parameter is required to be an Array but is given as string', function (done) { + + var obj = { + a: "an array" + }; + + Joi.object({ a: Joi.array() }).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('validates when parameter is required to be an Array and is given correctly as a json string', function (done) { + + var obj = { + a: '[1,2]' + }; + + Joi.object({ a: Joi.array() }).validate(obj, function (err, value) { + + expect(err).to.be.null(); + done(); + }); + }); + + it('fails validation when parameter is required to be an Array but is given as a json that is incorrect (object instead of array)', function (done) { + + var obj = { + a: '{"b":2}' + }; + + Joi.object({ a: Joi.object({ b: Joi.string().required() }) }).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('fails validation when config is an array and fails', function (done) { + + var schema = { + d: [Joi.string(), Joi.boolean()], + e: [Joi.number(), Joi.object()] + }; + + var obj = { + d: 10, + e: 'a' + }; + + Joi.compile(schema).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('fails validation when config is an array and fails with extra keys', function (done) { + + var schema = { + d: [Joi.string(), Joi.boolean()], + e: [Joi.number(), Joi.object()] + }; + + var obj = { + a: 10, + b: 'a' + }; + + Joi.compile(schema).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('fails validation with extra keys', function (done) { + + var schema = { + a: Joi.number(), + }; + + var obj = { + a: 1, + b: 'a', + }; + + Joi.compile(schema).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('validates missing optional key with string condition', function (done) { + + var schema = { + key: Joi.string().alphanum(false).min(8) + }; + + Joi.compile(schema).validate({}, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('validates with extra keys and remove them when stripUnknown is set', function (done) { + + var schema = { + a: Joi.number().min(0).max(3), + b: Joi.string().valid('a', 'b', 'c'), + c: Joi.string().email().optional() + }; + + var obj = { + a: 1, + b: 'a', + d: 'c' + }; + + Joi.validate(obj, schema, { stripUnknown: true, allowUnknown: true }, function (err, value) { + + expect(err).to.be.null(); + expect(value).to.deep.equal({ a: 1, b: 'a' }); + done(); + }); + }); + + it('fails to validate with incorrect property when asked to strip unkown keys without aborting early', function (done) { + + var schema = { + a: Joi.number().min(0).max(3), + b: Joi.string().valid('a', 'b', 'c'), + c: Joi.string().email().optional() + }; + + var obj = { + a: 1, + b: 'f', + d: 'c' + }; + + Joi.validate(obj, schema, { stripUnknown: true, abortEarly: false }, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('should pass validation with extra keys when allowUnknown is set', function (done) { + + var schema = { + a: Joi.number().min(0).max(3), + b: Joi.string().valid('a', 'b', 'c'), + c: Joi.string().email().optional() + }; + + var obj = { + a: 1, + b: 'a', + d: 'c' + }; + + Joi.validate(obj, schema, { allowUnknown: true }, function (err, value) { + + expect(err).to.be.null(); + expect(value).to.deep.equal({ a: 1, b: 'a', d: 'c' }); + done(); + }); + }); + + it('should pass validation with extra keys set', function (done) { + + var localConfig = Joi.object({ + a: Joi.number().min(0).max(3), + b: Joi.string().valid('a', 'b', 'c'), + }).options({ allowUnknown: true }); + + var obj = { + a: 1, + b: 'a', + d: 'c' + }; + + localConfig.validate(obj, function (err, value) { + + expect(err).to.be.null(); + expect(value).to.deep.equal({ a: 1, b: 'a', d: 'c' }); + + localConfig.validate(value, function (err, value) { + + expect(err).to.be.null(); + expect(value).to.deep.equal({ a: 1, b: 'a', d: 'c' }); + done(); + }); + }); + }); + + + it('should pass validation with extra keys and remove them when skipExtraKeys is set locally', function (done) { + + var localConfig = Joi.object({ + a: Joi.number().min(0).max(3), + b: Joi.string().valid('a', 'b', 'c') + }).options({ stripUnknown: true, allowUnknown: true }); + + var obj = { + a: 1, + b: 'a', + d: 'c' + }; + + localConfig.validate(obj, function (err, value) { + + expect(err).to.be.null(); + expect(value).to.deep.equal({ a: 1, b: 'a' }); + + localConfig.validate(value, function (err, value) { + + expect(err).to.be.null(); + expect(value).to.deep.equal({ a: 1, b: 'a' }); + done(); + }); + }); + }); + + it('should work when the skipFunctions setting is enabled', function (done) { + + var schema = Joi.object({ username: Joi.string() }).options({ skipFunctions: true }); + var input = { username: 'test', func: function () { } }; + Joi.validate(input, schema, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('should work when the skipFunctions setting is disabled', function (done) { + + var schema = { username: Joi.string() }; + var input = { username: 'test', func: function () { } }; + + Joi.validate(input, schema, { skipFunctions: false }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.contain('func is not allowed'); + done(); + }); + }); + + it('should not convert values when convert is false', function (done) { + + var schema = { + arr: Joi.array().includes(Joi.string()) + }; + + var input = { arr: 'foo' }; + Joi.validate(input, schema, { convert: false }, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('full errors when abortEarly is false', function (done) { + + var schema = { + a: Joi.string(), + b: Joi.string() + }; + + var input = { a: 1, b: 2 }; + + Joi.validate(input, schema, function (errOne, value) { + + Joi.validate(input, schema, { abortEarly: false }, function (errFull, value) { + + expect(errOne).to.exist(); + expect(errFull).to.exist(); + expect(errFull.details.length).to.be.greaterThan(errOne.details.length); + done(); + }); + }); + }); + + it('validates using the root any object', function (done) { + + var any = Joi; + any.validate('abc', function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('validates using the root any object (no callback)', function (done) { + + var any = Joi; + var result = any.validate('abc'); + expect(result.error).to.not.exist(); + expect(result.value).to.equal('abc'); + done(); + }); + + it('accepts no options', function (done) { + + Joi.validate('test', Joi.string(), function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('accepts no options (no callback)', function (done) { + + var result = Joi.validate('test', Joi.string()); + expect(result.error).to.not.exist(); + expect(result.value).to.equal('test'); + done(); + }); + + it('accepts options', function (done) { + + Joi.validate('5', Joi.number(), { convert: false }, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('accepts options (no callback)', function (done) { + + var result = Joi.validate('5', Joi.number(), { convert: false }); + expect(result.error).to.exist(); + done(); + }); + + it('accepts null options', function (done) { + + Joi.validate('test', Joi.string(), null, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('accepts undefined options', function (done) { + + Joi.validate('test', Joi.string(), undefined, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + describe('#describe', function () { + + var schema = Joi.object({ + sub: { + email: Joi.string().email(), + date: Joi.date(), + child: Joi.object({ + alphanum: Joi.string().alphanum() + }), + }, + min: [Joi.number(), Joi.string().min(3)], + max: Joi.string().max(3), + required: Joi.string().required(), + xor: Joi.string(), + renamed: Joi.string().valid('456'), + notEmpty: Joi.string().required().description('a').notes('b').tags('c') + }).rename('renamed', 'required').without('required', 'xor').without('xor', 'required'); + + var result = { + type: 'object', + children: { + sub: { + type: 'object', + children: { + email: { + type: 'string', + invalids: [''], + rules: [{ name: 'email' }] + }, + date: { + type: 'date' + }, + child: { + type: 'object', + children: { + alphanum: { + type: 'string', + invalids: [''], + rules: [{ name: 'alphanum' }] + } + } + } + } + }, + min: { + type: 'alternatives', + alternatives: [ + { + type: 'number', + invalids: [Infinity, -Infinity] + }, + { + type: 'string', + invalids: [''], + rules: [{ name: 'min', arg: 3 }] + } + ] + }, + max: { + type: 'string', + invalids: [''], + rules: [{ name: 'max', arg: 3 }] + }, + required: { + type: 'string', + flags: { + presence: 'required' + }, + invalids: [ ''] + }, + xor: { + type: 'string', + invalids: [''] + }, + renamed: { + type: 'string', + flags: { + allowOnly: true + }, + valids: ['456'], + invalids: [''] + }, + notEmpty: { + type: 'string', + flags: { + presence: 'required' + }, + description: 'a', + notes: ['b'], + tags: ['c'], + invalids: [''] + } + }, + dependencies: [ + { + type: 'without', + key: 'required', + peers: ['xor'] + }, + { + type: 'without', + key: 'xor', + peers: ['required'] + } + ] + }; + + it('describes schema (direct)', function (done) { + + var description = schema.describe(); + expect(description).to.deep.equal(result); + done(); + }); + + it('describes schema (root)', function (done) { + + var description = Joi.describe(schema); + expect(description).to.deep.equal(result); + done(); + }); + + it('describes schema (any)', function (done) { + + var any = Joi; + var description = any.describe(); + expect(description).to.deep.equal({ + type: 'any' + }); + done(); + }); + + it('describes schema without invalids', function (done) { + + var description = Joi.allow(null).describe(); + expect(description.invalids).to.not.exist(); + done(); + }) + }); + + describe('#assert', function () { + + it('throws on invalid value', function (done) { + + expect(function () { + + Joi.assert('x', Joi.number()); + }).to.throw('"x"\n\u001b[31m\n[1] value must be a number\u001b[0m'); + done(); + }); + + it('does not throw on valid value', function (done) { + + expect(function () { + + Joi.assert('4', Joi.number()); + }).to.not.throw(); + done(); + }); + + it('throws on invalid value with message', function (done) { + + expect(function () { + + Joi.assert('x', Joi.number(), 'the reason is'); + }).to.throw('the reason is "x"\n\u001b[31m\n[1] value must be a number\u001b[0m'); + done(); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/test/number.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/test/number.js new file mode 100755 index 0000000..84d05b1 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/test/number.js @@ -0,0 +1,589 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('number', function () { + + it('fails on boolean', function (done) { + + var schema = Joi.number(); + Helper.validate(schema, [ + [true, false], + [false, false] + ], done); + }); + + describe('#validate', function () { + + it('should, by default, allow undefined', function (done) { + + Helper.validate(Joi.number(), [ + [undefined, true] + ], done); + }); + + it('should, when .required(), deny undefined', function (done) { + + Helper.validate(Joi.number().required(), [ + [undefined, false] + ], done); + }); + + it('should return false for denied value', function (done) { + + var text = Joi.number().invalid(50); + text.validate(50, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('should validate integer', function (done) { + + var t = Joi.number().integer(); + Helper.validate(t, [ + [100, true], + [0, true], + [null, false], + [1.02, false], + [0.01, false] + ], done); + }); + + it('should return false for Infinity', function(done) { + + var t = Joi.number(); + Helper.validate(t, [ + [Infinity, false], + [-Infinity, false] + ], done); + }); + + it('should return true for allowed Infinity', function(done) { + + var t = Joi.number().allow(Infinity, -Infinity); + Helper.validate(t, [ + [Infinity, true], + [-Infinity, true] + ], done); + }); + + it('can accept string numbers', function (done) { + + var t = Joi.number(); + Helper.validate(t, [ + ['1', true], + ['100', true], + ['1e3', true], + ['1 some text', false], + ['\t\r', false], + [' ', false], + [' 2', true], + ['\t\r43', true], + ['43 ', true], + ['', false] + ], done); + }); + + it('required validates correctly', function (done) { + + var t = Joi.number().required(); + Helper.validate(t, [ + [NaN, false], + ['100', true] + ], done); + }); + + it('converts an object string to a number', function (done) { + + var config = { a: Joi.number() }; + var obj = { a: '123' }; + + Joi.compile(config).validate(obj, function (err, value) { + + expect(err).to.not.exist(); + expect(value.a).to.equal(123); + done(); + }); + }); + + it('converts a string to a number', function (done) { + + Joi.number().validate('1', function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.equal(1); + done(); + }); + }); + + it('errors on null', function (done) { + + Joi.number().validate(null, function (err, value) { + + expect(err).to.exist(); + expect(value).to.equal(null); + done(); + }); + }); + + it('should handle combination of min and max', function (done) { + + var rule = Joi.number().min(8).max(10); + Helper.validate(rule, [ + [1, false], + [11, false], + [8, true], + [9, true], + [null, false] + ], done); + }); + + it('should handle combination of min, max, and null allowed', function (done) { + + var rule = Joi.number().min(8).max(10).allow(null); + Helper.validate(rule, [ + [1, false], + [11, false], + [8, true], + [9, true], + [null, true] + ], done); + }); + + it('should handle combination of min and positive', function (done) { + + var rule = Joi.number().min(-3).positive(); + Helper.validate(rule, [ + [1, true], + [-2, false], + [8, true], + [null, false] + ], done); + }); + + it('should handle combination of max and positive', function (done) { + + var rule = Joi.number().max(5).positive(); + Helper.validate(rule, [ + [4, true], + [-2, false], + [8, false], + [null, false] + ], done); + }); + + it('should handle combination of min and negative', function (done) { + + var rule = Joi.number().min(-3).negative(); + Helper.validate(rule, [ + [4, false], + [-2, true], + [-4, false], + [null, false] + ], done); + }); + + it('should handle combination of negative and positive', function (done) { + + var rule = Joi.number().negative().positive(); + Helper.validate(rule, [ + [4, false], + [-2, false], + [0, false], + [null, false] + ], done); + }); + + it('should handle combination of negative and allow', function (done) { + + var rule = Joi.number().negative().allow(1); + Helper.validate(rule, [ + [1, true], + [-10, true], + [8, false], + [0, false], + [null, false] + ], done); + }); + + it('should handle combination of positive and allow', function (done) { + + var rule = Joi.number().positive().allow(-1); + Helper.validate(rule, [ + [1, true], + [-1, true], + [8, true], + [-10, false], + [null, false] + ], done); + }); + + it('should handle combination of positive, allow, and null allowed', function (done) { + + var rule = Joi.number().positive().allow(-1).allow(null); + Helper.validate(rule, [ + [1, true], + [-1, true], + [8, true], + [-10, false], + [null, true] + ], done); + }); + + it('should handle combination of negative, allow, and null allowed', function (done) { + + var rule = Joi.number().negative().allow(1).allow(null); + Helper.validate(rule, [ + [1, true], + [-10, true], + [8, false], + [0, false], + [null, true] + ], done); + }); + + it('should handle combination of positive, allow, null allowed, and invalid', function (done) { + + var rule = Joi.number().positive().allow(-1).allow(null).invalid(1); + Helper.validate(rule, [ + [1, false], + [-1, true], + [8, true], + [-10, false], + [null, true] + ], done); + }); + + it('should handle combination of negative, allow, null allowed, and invalid', function (done) { + + var rule = Joi.number().negative().allow(1).allow(null).invalid(-5); + Helper.validate(rule, [ + [1, true], + [-10, true], + [-5, false], + [8, false], + [0, false], + [null, true] + ], done); + }); + + it('should handle combination of min, max, and allow', function (done) { + + var rule = Joi.number().min(8).max(10).allow(1); + Helper.validate(rule, [ + [1, true], + [11, false], + [8, true], + [9, true], + [null, false] + ], done); + }); + + it('should handle combination of min, max, allow, and null allowed', function (done) { + + var rule = Joi.number().min(8).max(10).allow(1).allow(null); + Helper.validate(rule, [ + [1, true], + [11, false], + [8, true], + [9, true], + [null, true] + ], done); + }); + + it('should handle combination of min, max, allow, and invalid', function (done) { + + var rule = Joi.number().min(8).max(10).allow(1).invalid(9); + Helper.validate(rule, [ + [1, true], + [11, false], + [8, true], + [9, false], + [null, false] + ], done); + }); + + it('should handle combination of min, max, allow, invalid, and null allowed', function (done) { + + var rule = Joi.number().min(8).max(10).allow(1).invalid(9).allow(null); + Helper.validate(rule, [ + [1, true], + [11, false], + [8, true], + [9, false], + [null, true] + ], done); + }); + + it('should handle combination of min, max, and integer', function (done) { + + var rule = Joi.number().min(8).max(10).integer(); + Helper.validate(rule, [ + [1, false], + [11, false], + [8, true], + [9, true], + [9.1, false], + [null, false] + ], done); + }); + + it('should handle combination of min, max, integer, and allow', function (done) { + + var rule = Joi.number().min(8).max(10).integer().allow(9.1); + Helper.validate(rule, [ + [1, false], + [11, false], + [8, true], + [9, true], + [9.1, true], + [9.2, false], + [null, false] + ], done); + }); + + it('should handle combination of min, max, integer, allow, and invalid', function (done) { + + var rule = Joi.number().min(8).max(10).integer().allow(9.1).invalid(8); + Helper.validate(rule, [ + [1, false], + [11, false], + [8, false], + [9, true], + [9.1, true], + [9.2, false], + [null, false] + ], done); + }); + + it('should handle combination of min, max, integer, allow, invalid, and null allowed', function (done) { + + var rule = Joi.number().min(8).max(10).integer().allow(9.1).invalid(8).allow(null); + Helper.validate(rule, [ + [1, false], + [11, false], + [8, false], + [9, true], + [9.1, true], + [9.2, false], + [null, true] + ], done); + }); + + it('should handle limiting the number of decimal places', function (done) { + + var rule = Joi.number().precision(1).options({ convert: false }); + Helper.validate(rule, [ + [1, true], + [9.1, true], + [9.21, false], + [9.9999, false], + [9.999e99, true], + [9.9e-99, false], + [9.9e3, true], + [null, false] + ], done); + }); + + it('should handle combination of min, max, integer, allow, invalid, null allowed and precision', function (done) { + + var rule = Joi.number().min(8).max(10).integer().allow(9.1).invalid(8).allow(null).precision(1).options({ convert: false }); + Helper.validate(rule, [ + [1, false], + [11, false], + [8, false], + [9, true], + [9.1, true], + [9.11, false], + [9.2, false], + [9.22, false], + [null, true] + ], done); + }); + + it('should handle combination of greater and less', function (done) { + + var rule = Joi.number().greater(5).less(10); + Helper.validate(rule, [ + [0, false], + [11, false], + [5, false], + [10, false], + [8, true], + [5.01, true], + [9.99, true], + [null, false] + ], done); + }); + + it('should handle combination of greater, less, and integer', function (done) { + + var rule = Joi.number().integer().greater(5).less(10); + Helper.validate(rule, [ + [0, false], + [11, false], + [5, false], + [10, false], + [6, true], + [9, true], + [5.01, false], + [9.99, false] + ], done); + }); + + it('should handle combination of greater, less, and null allowed', function (done) { + + var rule = Joi.number().greater(5).less(10).allow(null); + Helper.validate(rule, [ + [0, false], + [11, false], + [5, false], + [10, false], + [8, true], + [5.01, true], + [9.99, true], + [null, true] + ], done); + }); + + it('should handle combination of greater, less, invalid, and allow', function (done) { + + var rule = Joi.number().greater(5).less(10).invalid(6).allow(-3); + Helper.validate(rule, [ + [0, false], + [11, false], + [5, false], + [10, false], + [6, false], + [8, true], + [5.01, true], + [9.99, true], + [-3, true], + [null, false] + ], done); + }); + }); + + it('should instantiate separate copies on invocation', function (done) { + + var result1 = Joi.number().min(5); + var result2 = Joi.number().max(5); + + expect(Object.keys(result1)).to.not.equal(Object.keys(result2)); + done(); + }); + + it('should show resulting object with #valueOf', function (done) { + + var result = Joi.number().min(5); + expect(result.valueOf()).to.exist(); + done(); + }); + + describe('error message', function () { + + it('should display correctly for int type', function (done) { + + var t = Joi.number().integer(); + Joi.compile(t).validate('1.1', function (err, value) { + + expect(err.message).to.contain('integer'); + done(); + }); + }); + }); + + describe('#min', function () { + + it('throws when limit is not a number', function (done) { + + expect(function () { + + Joi.number().min('a'); + }).to.throw('limit must be an integer'); + done(); + }); + + it('supports 64bit numbers', function (done) { + + var schema = Joi.number().min(1394035612500); + var input = 1394035612552 + + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.equal(input); + done(); + }); + }); + }); + + describe('#max', function () { + + it('throws when limit is not a number', function (done) { + + expect(function () { + + Joi.number().max('a'); + }).to.throw('limit must be an integer'); + done(); + }); + }); + + describe('#precision', function (done) { + + it('converts numbers', function (done) { + + var rule = Joi.number().precision(4); + Helper.validate(rule, [ + [1.5, true, null, 1.5], + [0.12345, true, null, 0.1235], + [123456, true, null, 123456], + [123456.123456, true, null, 123456.1235], + ["123456.123456", true, null, 123456.1235], + ["abc", false], + [NaN, false] + ], done); + }); + }); + + describe('#describe', function () { + + it('should describe a minimum of 0', function (done) { + + var schema = Joi.number().min(0); + expect(schema.describe()).to.deep.equal({ + "type": "number", + "invalids": [Infinity, -Infinity], + "rules": [ + { + "name": "min", + "arg": 0 + } + ] + }); + done(); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/test/object.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/test/object.js new file mode 100755 index 0000000..021401b --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/test/object.js @@ -0,0 +1,1058 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('object', function () { + + it('converts a json string to an object', function (done) { + + Joi.object().validate('{"hi":true}', function (err, value) { + + expect(err).to.not.exist(); + expect(value.hi).to.equal(true); + done(); + }); + }); + + it('errors on non-object string', function (done) { + + Joi.object().validate('a string', function (err, value) { + + expect(err).to.exist(); + expect(value).to.equal('a string'); + done(); + }); + }); + + it('validates an object', function (done) { + + var schema = Joi.object().required(); + Helper.validate(schema, [ + [{}, true], + [{ hi: true }, true], + ['', false] + ], done); + }); + + it('return object reference when no rules specified', function (done) { + + var schema = Joi.object({ + a: Joi.object() + }); + + var item = { x: 5 }; + schema.validate({ a: item }, function (err, value) { + + expect(value.a).to.equal(item); + done(); + }); + }); + + it('retains ignored values', function (done) { + + var schema = Joi.object(); + schema.validate({ a: 5 }, function (err, value) { + + expect(value.a).to.equal(5); + done(); + }); + }); + + it('retains skipped values', function (done) { + + var schema = Joi.object({ b: 5 }).unknown(true); + schema.validate({ b: '5', a: 5 }, function (err, value) { + + expect(value.a).to.equal(5); + expect(value.b).to.equal(5); + done(); + }); + }); + + it('allows any key when schema is undefined', function (done) { + + Joi.object().validate({ a: 4 }, function (err, value) { + + expect(err).to.not.exist(); + + Joi.object(undefined).validate({ a: 4 }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + }); + + it('allows any key when schema is null', function (done) { + + Joi.object(null).validate({ a: 4 }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('throws on invalid object schema', function (done) { + + expect(function () { + + Joi.object(4); + }).to.throw('Object schema must be a valid object'); + done(); + }); + + it('throws on joi object schema', function (done) { + + expect(function () { + + Joi.object(Joi.object()); + }).to.throw('Object schema cannot be a joi schema'); + done(); + }); + + it('skips conversion when value is undefined', function (done) { + + Joi.object({ a: Joi.object() }).validate(undefined, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.not.exist(); + done(); + }); + }); + + it('errors on array', function (done) { + + Joi.object().validate([1, 2, 3], function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('should prevent extra keys from existing by default', function (done) { + + var schema = Joi.object({ item: Joi.string().required() }).required(); + Helper.validate(schema, [ + [{ item: 'something' }, true], + [{ item: 'something', item2: 'something else' }, false], + ['', false] + ], done); + }); + + it('should validate count when min is set', function (done) { + + var schema = Joi.object().min(3); + Helper.validate(schema, [ + [{ item: 'something' }, false], + [{ item: 'something', item2: 'something else' }, false], + [{ item: 'something', item2: 'something else', item3: 'something something else' }, true], + ['', false] + ], done); + }); + + it('should validate count when max is set', function (done) { + + var schema = Joi.object().max(2); + Helper.validate(schema, [ + [{ item: 'something' }, true], + [{ item: 'something', item2: 'something else' }, true], + [{ item: 'something', item2: 'something else', item3: 'something something else' }, false], + ['', false] + ], done); + }); + + it('should validate count when min and max is set', function (done) { + + var schema = Joi.object().max(3).min(2); + Helper.validate(schema, [ + [{ item: 'something' }, false], + [{ item: 'something', item2: 'something else' }, true], + [{ item: 'something', item2: 'something else', item3: 'something something else' }, true], + [{ item: 'something', item2: 'something else', item3: 'something something else', item4: 'item4' }, false], + ['', false] + ], done); + }); + + it('should validate count when length is set', function (done) { + + var schema = Joi.object().length(2); + Helper.validate(schema, [ + [{ item: 'something' }, false], + [{ item: 'something', item2: 'something else' }, true], + [{ item: 'something', item2: 'something else', item3: 'something something else' }, false], + ['', false] + ], done); + }); + + it('should validate constructor when type is set', function (done) { + + var schema = Joi.object().type(RegExp); + Helper.validate(schema, [ + [{ item: 'something' }, false], + ['', false], + [new Date(), false], + [/abcd/, true], + [new RegExp(), true] + ], done); + }); + + it('should traverse an object and validate all properties in the top level', function (done) { + + var schema = Joi.object({ + num: Joi.number() + }); + + Helper.validate(schema, [ + [{ num: 1 }, true], + [{ num: [1, 2, 3] }, false] + ], done); + }); + + it('should traverse an object and child objects and validate all properties', function (done) { + + var schema = Joi.object({ + num: Joi.number(), + obj: Joi.object({ + item: Joi.string() + }) + }); + + Helper.validate(schema, [ + [{ num: 1 }, true], + [{ num: [1, 2, 3] }, false], + [{ num: 1, obj: { item: 'something' } }, true], + [{ num: 1, obj: { item: 123 } }, false] + ], done); + }); + + it('should traverse an object several levels', function (done) { + + var schema = Joi.object({ + obj: Joi.object({ + obj: Joi.object({ + obj: Joi.object({ + item: Joi.boolean() + }) + }) + }) + }); + + Helper.validate(schema, [ + [{ num: 1 }, false], + [{ obj: {} }, true], + [{ obj: { obj: {} } }, true], + [{ obj: { obj: { obj: {} } } }, true], + [{ obj: { obj: { obj: { item: true } } } }, true], + [{ obj: { obj: { obj: { item: 10 } } } }, false] + ], done); + }); + + it('should traverse an object several levels with required levels', function (done) { + + var schema = Joi.object({ + obj: Joi.object({ + obj: Joi.object({ + obj: Joi.object({ + item: Joi.boolean() + }) + }).required() + }) + }); + + Helper.validate(schema, [ + [null, false], + [undefined, true], + [{}, true], + [{ obj: {} }, false], + [{ obj: { obj: {} } }, true], + [{ obj: { obj: { obj: {} } } }, true], + [{ obj: { obj: { obj: { item: true } } } }, true], + [{ obj: { obj: { obj: { item: 10 } } } }, false] + ], done); + }); + + it('should traverse an object several levels with required levels (without Joi.obj())', function (done) { + + var schema = { + obj: { + obj: { + obj: { + item: Joi.boolean().required() + } + } + } + }; + + Helper.validate(schema, [ + [null, false], + [undefined, true], + [{}, true], + [{ obj: {} }, true], + [{ obj: { obj: {} } }, true], + [{ obj: { obj: { obj: {} } } }, false], + [{ obj: { obj: { obj: { item: true } } } }, true], + [{ obj: { obj: { obj: { item: 10 } } } }, false] + ], done); + }); + + it('errors on unknown keys when functions allows', function (done) { + + var schema = Joi.object({ a: Joi.number() }).options({ skipFunctions: true }); + var obj = { a: 5, b: 'value' }; + schema.validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('validates both valid() and with()', function (done) { + + var schema = Joi.object({ + first: Joi.valid('value'), + second: Joi.any() + }).with('first', 'second'); + + Helper.validate(schema, [ + [{ first: 'value' }, false] + ], done); + }); + + describe('#keys', function () { + + it('allows any key', function (done) { + + var a = Joi.object({ a: 4 }); + var b = a.keys(); + a.validate({ b: 3 }, function (err, value) { + + expect(err).to.exist(); + b.validate({ b: 3 }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + }); + + it('forbids all keys', function (done) { + + var a = Joi.object(); + var b = a.keys({}); + a.validate({ b: 3 }, function (err, value) { + + expect(err).to.not.exist(); + b.validate({ b: 3 }, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + }); + + it('adds to existing keys', function (done) { + + var a = Joi.object({ a: 1 }); + var b = a.keys({ b: 2 }); + a.validate({ a: 1, b: 2 }, function (err, value) { + + expect(err).to.exist(); + b.validate({ a: 1, b: 2 }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + }); + }); + + describe('#unknown', function () { + + it('allows local unknown without applying to children', function (done) { + + var schema = Joi.object({ + a: { + b: Joi.number() + } + }).unknown(); + + Helper.validate(schema, [ + [{ a: { b: 5 } }, true], + [{ a: { b: 'x' } }, false], + [{ a: { b: 5 }, c: 'ignore' }, true], + [{ a: { b: 5, c: 'ignore' } }, false] + ], done); + }); + + it('forbids local unknown without applying to children', function (done) { + + var schema = Joi.object({ + a: Joi.object({ + b: Joi.number() + }).unknown() + }).options({ allowUnknown: false }); + + Helper.validate(schema, [ + [{ a: { b: 5 } }, true], + [{ a: { b: 'x' } }, false], + [{ a: { b: 5 }, c: 'ignore' }, false], + [{ a: { b: 5, c: 'ignore' } }, true] + ], done); + }); + }); + + describe('#rename', function () { + + it('allows renaming multiple times with multiple enabled', function (done) { + + var schema = Joi.object({ + test: Joi.string() + }).rename('test1', 'test').rename('test2', 'test', { multiple: true }); + + Joi.compile(schema).validate({ test1: 'a', test2: 'b' }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('errors renaming multiple times with multiple disabled', function (done) { + + var schema = Joi.object({ + test: Joi.string() + }).rename('test1', 'test').rename('test2', 'test'); + + Joi.compile(schema).validate({ test1: 'a', test2: 'b' }, function (err, value) { + + expect(err.message).to.equal('value cannot rename child test2 because multiple renames are disabled and another key was already renamed to test'); + done(); + }); + }); + + it('errors multiple times when abortEarly is false', function (done) { + + Joi.object().rename('a', 'b').rename('c', 'b').rename('d', 'b').options({ abortEarly: false }).validate({ a: 1, c: 1, d: 1 }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('value cannot rename child c because multiple renames are disabled and another key was already renamed to b. value cannot rename child d because multiple renames are disabled and another key was already renamed to b'); + done(); + }); + }); + + it('aliases a key', function (done) { + + var schema = Joi.object({ + a: Joi.number(), + b: Joi.number() + }).rename('a', 'b', { alias: true }); + + var obj = { a: 10 }; + + Joi.compile(schema).validate(obj, function (err, value) { + + expect(err).to.not.exist(); + expect(value.a).to.equal(10); + expect(value.b).to.equal(10); + done(); + }); + }); + + it('with override disabled should not allow overwriting existing value', function (done) { + + var schema = Joi.object({ + test1: Joi.string() + }).rename('test', 'test1'); + + schema.validate({ test: 'b', test1: 'a' }, function (err, value) { + + expect(err.message).to.equal('value cannot rename child test because override is disabled and target test1 exists'); + done(); + }); + }); + + it('with override enabled should allow overwriting existing value', function (done) { + + var schema = Joi.object({ + test1: Joi.string() + }).rename('test', 'test1', { override: true }); + + schema.validate({ test: 'b', test1: 'a' }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('renames when data is nested in an array via includes', function (done) { + + var schema = { + arr: Joi.array().includes(Joi.object({ + one: Joi.string(), + two: Joi.string() + }).rename('uno', 'one').rename('dos', 'two')) + }; + + var data = { arr: [{ uno: '1', dos: '2' }] }; + Joi.object(schema).validate(data, function (err, value) { + + expect(err).to.not.exist(); + expect(value.arr[0].one).to.equal('1'); + expect(value.arr[0].two).to.equal('2'); + done(); + }); + }); + + it('applies rename and validation in the correct order regardless of key order', function (done) { + + var schema1 = Joi.object({ + a: Joi.number() + }).rename('b', 'a'); + + var input1 = { b: '5' }; + + schema1.validate(input1, function (err1, value1) { + + expect(err1).to.not.exist(); + expect(value1.b).to.not.exist(); + expect(value1.a).to.equal(5); + + var schema2 = Joi.object({ a: Joi.number(), b: Joi.any() }).rename('b', 'a'); + var input2 = { b: '5' }; + + schema2.validate(input2, function (err2, value2) { + + expect(err2).to.not.exist(); + expect(value2.b).to.not.exist(); + expect(value2.a).to.equal(5); + + done(); + }); + }); + }); + + it('sets the default value after key is renamed', function (done) { + + var schema = Joi.object({ + foo2: Joi.string().default('test') + }).rename('foo', 'foo2'); + + var input = {}; + + Joi.validate(input, schema, function (err, value) { + + expect(err).to.not.exist(); + expect(value.foo2).to.equal('test'); + + done(); + }); + }); + + it('should be able to rename keys that are empty strings', function (done) { + + var schema = Joi.object().rename('', 'notEmpty'); + var input = { + '': 'something' + }; + + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + expect(value['']).to.not.exist(); + expect(value.notEmpty).to.equal('something'); + done(); + }); + }); + + it('should not create new keys when they key in question does not exist', function (done) { + + var schema = Joi.object().rename('b', '_b'); + + var input = { + a: 'something' + }; + + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + expect(Object.keys(value)).to.include('a'); + expect(value.a).to.equal('something'); + done(); + }); + }); + }); + + describe('#describe', function () { + + it('return empty description when no schema defined', function (done) { + + var schema = Joi.object(); + var desc = schema.describe(); + expect(desc).to.deep.equal({ + type: 'object' + }); + done(); + }); + + it('respects the shallow parameter', function (done) { + + var schema = Joi.object({ + name: Joi.string(), + child: Joi.object({ + name: Joi.string() + }) + }); + + expect(Object.keys(schema.describe(true))).to.not.include('children'); + expect(Object.keys(schema.describe())).to.include('children'); + + done(); + }); + + it('describes patterns', function (done) { + + var schema = Joi.object({ + a: Joi.string() + }).pattern(/\w\d/i, Joi.boolean()); + + expect(schema.describe()).to.deep.equal({ + type: 'object', + children: { + a: { + type: 'string', + invalids: [''] + } + }, + patterns: [ + { + regex: '/\\w\\d/i', + rule: { + type: 'boolean' + } + } + ] + }); + + done(); + }); + }); + + describe('#length', function () { + + it('throws when length is not a number', function (done) { + + expect(function () { + + Joi.object().length('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + }); + + describe('#min', function () { + + it('throws when limit is not a number', function (done) { + + expect(function () { + + Joi.object().min('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + }); + + describe('#max', function () { + + it('throws when limit is not a number', function (done) { + + expect(function () { + + Joi.object().max('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + }); + + describe('#pattern', function () { + + it('validates unknown keys using a pattern', function (done) { + + var schema = Joi.object({ + a: Joi.number() + }).pattern(/\d+/, Joi.boolean()).pattern(/\w\w+/, 'x'); + + Joi.validate({ bb: 'y', 5: 'x' }, schema, { abortEarly: false }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('5 must be a boolean. bb must be one of x'); + + Helper.validate(schema, [ + [{ a: 5 }, true], + [{ a: 'x' }, false], + [{ b: 'x' }, false], + [{ bb: 'x' }, true], + [{ 5: 'x' }, false], + [{ 5: false }, true], + [{ 5: undefined }, true] + ], done) + }); + }); + + it('validates unknown keys using a pattern (nested)', function (done) { + + var schema = { + x: Joi.object({ + a: Joi.number() + }).pattern(/\d+/, Joi.boolean()).pattern(/\w\w+/, 'x') + }; + + Joi.validate({ x: { bb: 'y', 5: 'x' } }, schema, { abortEarly: false }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('5 must be a boolean. bb must be one of x'); + done(); + }); + }); + + it('errors when using a pattern on empty schema with unknown(false) and pattern mismatch', function (done) { + + var schema = Joi.object().pattern(/\d/, Joi.number()).unknown(false); + + Joi.validate({ a: 5 }, schema, { abortEarly: false }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('a is not allowed'); + done(); + }); + }); + + it('removes global flag from patterns', function (done) { + + var schema = Joi.object().pattern(/a/g, Joi.number()); + + Joi.validate({ a1: 5, a2: 6 }, schema, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + }); + + describe('#with', function () { + + it('should throw an error when a parameter is not a string', function (done) { + + try { + Joi.object().with({}); + var error = false; + } + catch (e) { + error = true; + } + expect(error).to.equal(true); + + try { + Joi.object().with(123); + error = false; + } + catch (e) { + error = true; + } + expect(error).to.equal(true); + done(); + }); + + it('should validate correctly when key is an empty string', function (done) { + + var schema = Joi.object().with('', 'b'); + Helper.validate(schema, [ + [{ c: 'hi', d: 'there' }, true], + ]); + done(); + }); + }); + + describe('#without', function () { + + it('should throw an error when a parameter is not a string', function (done) { + + try { + Joi.object().without({}); + var error = false; + } + catch (e) { + error = true; + } + expect(error).to.equal(true); + + try { + Joi.object().without(123); + error = false; + } + catch (e) { + error = true; + } + expect(error).to.equal(true); + + + done(); + }); + + it('should validate correctly when key is an empty string', function (done) { + + var schema = Joi.object().without('', 'b'); + Helper.validate(schema, [ + [{ a: 'hi', b: 'there' }, true] + ]); + done(); + }); + }); + + describe('#xor', function () { + + it('should throw an error when a parameter is not a string', function (done) { + + try { + Joi.object().xor({}); + var error = false; + } + catch (e) { + error = true; + } + expect(error).to.equal(true); + + try { + Joi.object().xor(123); + error = false; + } + catch (e) { + error = true; + } + expect(error).to.equal(true); + done(); + }); + }); + + describe('#or', function () { + + it('should throw an error when a parameter is not a string', function (done) { + + try { + Joi.object().or({}); + var error = false; + } + catch (e) { + error = true; + } + expect(error).to.equal(true); + + try { + Joi.object().or(123); + error = false; + } + catch (e) { + error = true; + } + expect(error).to.equal(true); + done(); + }); + + it('errors multiple levels deep', function (done) { + + Joi.object({ + a: { + b: Joi.object().or('x', 'y') + } + }).validate({ a: { b: { c: 1 } } }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('value must contain at least one of x, y'); + done(); + }); + }); + }); + + describe('#assert', function () { + + it('validates upwards reference', function (done) { + + var schema = Joi.object({ + a: { + b: Joi.string(), + c: Joi.number() + }, + d: { + e: Joi.any() + } + }).assert(Joi.ref('d/e', { separator: '/' }), Joi.ref('a.c'), 'equal to a.c'); + + schema.validate({ a: { b: 'x', c: 5 }, d: { e: 6 } }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('value validation failed because d.e failed to equal to a.c'); + + Helper.validate(schema, [ + [{ a: { b: 'x', c: 5 }, d: { e: 5 } }, true] + ], done); + }); + }); + + it('validates upwards reference with implicit context', function (done) { + + var schema = Joi.object({ + a: { + b: Joi.string(), + c: Joi.number() + }, + d: { + e: Joi.any() + } + }).assert('d.e', Joi.ref('a.c'), 'equal to a.c'); + + schema.validate({ a: { b: 'x', c: 5 }, d: { e: 6 } }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('value validation failed because d.e failed to equal to a.c'); + + Helper.validate(schema, [ + [{ a: { b: 'x', c: 5 }, d: { e: 5 } }, true] + ], done); + }); + }); + + it('throws when context is at root level', function (done) { + + expect(function () { + + var schema = Joi.object({ + a: { + b: Joi.string(), + c: Joi.number() + }, + d: { + e: Joi.any() + } + }).assert('a', Joi.ref('d.e'), 'equal to d.e'); + }).to.throw('Cannot use assertions for root level references - use direct key rules instead'); + done(); + }); + + it('allows root level context ref', function (done) { + + expect(function () { + + var schema = Joi.object({ + a: { + b: Joi.string(), + c: Joi.number() + }, + d: { + e: Joi.any() + } + }).assert('$a', Joi.ref('d.e'), 'equal to d.e'); + }).to.not.throw(); + done(); + }); + + it('provides a default message for failed assertions', function (done) { + + var schema = Joi.object({ + a: { + b: Joi.string(), + c: Joi.number() + }, + d: { + e: Joi.any() + } + }).assert('d.e', Joi.boolean()); + + schema.validate({ + d: { + e:[] + } + }, function (err) { + + expect(err).to.exist(); + expect(err.message).to.equal('value validation failed because d.e failed to pass the assertion test'); + done(); + }); + }); + }); + + describe('#type', function () { + + it('uses constructor name for default type name', function (done) { + + function Foo () {} + + var schema = Joi.object().type(Foo); + schema.validate({}, function (err) { + + expect(err).to.exist(); + expect(err.message).to.equal('value must be an instance of Foo'); + done(); + }); + }); + + it('uses custom type name if supplied', function (done) { + + var Foo = function () {}; + + var schema = Joi.object().type(Foo, 'Bar'); + schema.validate({}, function (err) { + + expect(err).to.exist(); + expect(err.message).to.equal('value must be an instance of Bar'); + done(); + }); + }); + + it('overrides constructor name with custom name', function (done) { + + function Foo () {} + + var schema = Joi.object().type(Foo, 'Bar'); + schema.validate({}, function (err) { + + expect(err).to.exist(); + expect(err.message).to.equal('value must be an instance of Bar'); + done(); + }); + }); + + it('throws when constructor is not a function', function (done) { + + expect(function () { + + var schema = Joi.object().type(''); + }).to.throw('type must be a constructor function'); + done(); + }); + + it('uses the constructor name in the schema description', function (done) { + + var description = Joi.object().type(RegExp).describe(); + + expect(description.rules).to.deep.include({ name: 'type', arg: 'RegExp' }); + done(); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/test/ref.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/test/ref.js new file mode 100755 index 0000000..3cc1ae8 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/test/ref.js @@ -0,0 +1,389 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('ref', function () { + + it('uses ref as a valid value', function (done) { + + var schema = Joi.object({ + a: Joi.ref('b'), + b: Joi.any() + }); + + schema.validate({ a: 5, b: 6 }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('a must be one of ref:b'); + + Helper.validate(schema, [ + [{ a: 5 }, false], + [{ b: 5 }, true], + [{ a: 5, b: 5 }, true], + [{ a: '5', b: '5' }, true] + ], done); + }); + }); + + it('uses ref as a valid value (empty key)', function (done) { + + var schema = Joi.object({ + a: Joi.ref(''), + '': Joi.any() + }); + + schema.validate({ a: 5, '': 6 }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('a must be one of ref:'); + + Helper.validate(schema, [ + [{ a: 5 }, false], + [{ '': 5 }, true], + [{ a: 5, '': 5 }, true], + [{ a: '5', '': '5' }, true] + ], done); + }); + }); + + it('uses ref with nested keys as a valid value', function (done) { + + var schema = Joi.object({ + a: Joi.ref('b.c'), + b: { + c: Joi.any() + } + }); + + schema.validate({ a: 5, b: { c: 6 } }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('a must be one of ref:b.c'); + + Helper.validate(schema, [ + [{ a: 5 }, false], + [{ b: { c: 5 } }, true], + [{ a: 5, b: 5 }, false], + [{ a: '5', b: { c: '5' } }, true] + ], done); + }); + }); + + it('uses ref with combined nested keys in sub child', function (done) { + + var ref = Joi.ref('b.c'); + expect(ref.root).to.equal('b'); + + var schema = Joi.object({ + a: ref, + b: { + c: Joi.any() + } + }); + + var input = { a: 5, b: { c: 5 } }; + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + + var parent = Joi.object({ + e: schema + }); + + parent.validate({ e: input }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + }); + + it('uses ref reach options', function (done) { + + var ref = Joi.ref('b/c', { separator: '/' }); + expect(ref.root).to.equal('b'); + + var schema = Joi.object({ + a: ref, + b: { + c: Joi.any() + } + }); + + schema.validate({ a: 5, b: { c: 5 } }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('ignores the order in which keys are defined', function (done) { + + var ab = Joi.object({ + a: { + c: Joi.number() + }, + b: Joi.ref('a.c') + }); + + ab.validate({ a: { c: '5' }, b: 5 }, function (err, value) { + + expect(err).to.not.exist(); + + var ba = Joi.object({ + b: Joi.ref('a.c'), + a: { + c: Joi.number() + } + }); + + ba.validate({ a: { c: '5' }, b: 5 }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + }); + + it('uses ref as default value', function (done) { + + var schema = Joi.object({ + a: Joi.default(Joi.ref('b')), + b: Joi.any() + }); + + schema.validate({ b: 6 }, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal({ a: 6, b: 6 }); + done(); + }); + }); + + it('uses ref as default value regardless of order', function (done) { + + var ab = Joi.object({ + a: Joi.default(Joi.ref('b')), + b: Joi.number() + }); + + ab.validate({ b: '6' }, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal({ a: 6, b: 6 }); + + var ba = Joi.object({ + b: Joi.number(), + a: Joi.default(Joi.ref('b')) + }); + + ba.validate({ b: '6' }, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal({ a: 6, b: 6 }); + done(); + }); + }); + }); + + it('ignores the order in which keys are defined with alternatives', function (done) { + + var a = { c: Joi.number() }; + var b = [Joi.ref('a.c'), Joi.ref('c')]; + var c = Joi.number(); + + Helper.validate({ a: a, b: b, c: c }, [ + [{ a: {} }, true], + [{ a: { c: '5' }, b: 5 }, true], + [{ a: { c: '5' }, b: 6, c: '6' }, true], + [{ a: { c: '5' }, b: 7, c: '6' }, false] + ]); + + Helper.validate({ b: b, a: a, c: c }, [ + [{ a: {} }, true], + [{ a: { c: '5' }, b: 5 }, true], + [{ a: { c: '5' }, b: 6, c: '6' }, true], + [{ a: { c: '5' }, b: 7, c: '6' }, false] + ]); + + Helper.validate({ b: b, c: c, a: a }, [ + [{ a: {} }, true], + [{ a: { c: '5' }, b: 5 }, true], + [{ a: { c: '5' }, b: 6, c: '6' }, true], + [{ a: { c: '5' }, b: 7, c: '6' }, false] + ]); + + Helper.validate({ a: a, c: c, b: b }, [ + [{ a: {} }, true], + [{ a: { c: '5' }, b: 5 }, true], + [{ a: { c: '5' }, b: 6, c: '6' }, true], + [{ a: { c: '5' }, b: 7, c: '6' }, false] + ]); + + Helper.validate({ c: c, a: a, b: b }, [ + [{ a: {} }, true], + [{ a: { c: '5' }, b: 5 }, true], + [{ a: { c: '5' }, b: 6, c: '6' }, true], + [{ a: { c: '5' }, b: 7, c: '6' }, false] + ]); + + Helper.validate({ c: c, b: b, a: a }, [ + [{ a: {} }, true], + [{ a: { c: '5' }, b: 5 }, true], + [{ a: { c: '5' }, b: 6, c: '6' }, true], + [{ a: { c: '5' }, b: 7, c: '6' }, false] + ], done); + }); + + it('uses context as default value', function (done) { + + var schema = Joi.object({ + a: Joi.default(Joi.ref('$x')), + b: Joi.any() + }); + + Joi.validate({ b: 6 }, schema, { context: { x: 22 } }, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal({ a: 22, b: 6 }); + done(); + }); + }); + + it('uses context as default value with custom prefix', function (done) { + + var schema = Joi.object({ + a: Joi.default(Joi.ref('%x', { contextPrefix: '%' })), + b: Joi.any() + }); + + Joi.validate({ b: 6 }, schema, { context: { x: 22 } }, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal({ a: 22, b: 6 }); + done(); + }); + }); + + it('uses context as a valid value', function (done) { + + var schema = Joi.object({ + a: Joi.ref('$x'), + b: Joi.any() + }); + + Joi.validate({ a: 5, b: 6 }, schema, { context: { x: 22 } }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('a must be one of context:x'); + + Helper.validateOptions(schema, [ + [{ a: 5 }, false], + [{ a: 22 }, true], + [{ b: 5 }, true], + [{ a: 22, b: 5 }, true], + [{ a: '22', b: '5' }, false] + ], { context: { x: 22 } }, done); + }); + }); + + it('uses context in when condition', function (done) { + + var schema = { + a: Joi.boolean().when('$x', { is: Joi.exist(), otherwise: Joi.forbidden() }) + }; + + Helper.validate(schema, [ + [{}, true], + [{ a: 'x' }, false], + [{ a: true }, false], + [{}, true, { context: {} }], + [{ a: 'x' }, false, { context: {} }], + [{ a: true }, false, { context: {} }], + [{}, true, { context: { x: 1 } }], + [{ a: 'x' }, false, { context: { x: 1 } }], + [{ a: true }, true, { context: { x: 1 } }] + ], done); + }); + + it('uses nested context in when condition', function (done) { + + var schema = { + a: Joi.boolean().when('$x.y', { is: Joi.exist(), otherwise: Joi.forbidden() }) + }; + + Helper.validate(schema, [ + [{}, true], + [{ a: 'x' }, false], + [{ a: true }, false], + [{}, true, { context: {} }], + [{ a: 'x' }, false, { context: {} }], + [{ a: true }, false, { context: {} }], + [{}, true, { context: { x: 1 } }], + [{ a: 'x' }, false, { context: { x: 1 } }], + [{ a: true }, false, { context: { x: 1 } }], + [{}, true, { context: { x: {} } }], + [{ a: 'x' }, false, { context: { x: {} } }], + [{ a: true }, false, { context: { x: {} } }], + [{}, true, { context: { x: { y: 1 } } }], + [{ a: 'x' }, false, { context: { x: { y: 1 } } }], + [{ a: true }, true, { context: { x: { y: 1 } } }] + ], done); + }); + + it('describes schema with ref', function (done) { + + var desc = Joi.compile(Joi.ref('a.b')).describe(); + expect(Joi.isRef(desc.valids[0])).to.be.true(); + done(); + }); + + describe('#create', function () { + + it('throws when key is missing', function (done) { + + expect(function () { + + Joi.ref(5); + }).to.throw('Invalid reference key: 5'); + done(); + }); + + it('finds root with default separator', function (done) { + + expect(Joi.ref('a.b.c').root).to.equal('a'); + done(); + }); + + it('finds root with default separator and options', function (done) { + + expect(Joi.ref('a.b.c', {}).root).to.equal('a'); + done(); + }); + + it('finds root with custom separator', function (done) { + + expect(Joi.ref('a+b+c', { separator: '+' }).root).to.equal('a'); + done(); + }); + }); +}); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/heavy/node_modules/joi/test/string.js b/node_modules/hapi/node_modules/heavy/node_modules/joi/test/string.js new file mode 100755 index 0000000..c9c61c0 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/node_modules/joi/test/string.js @@ -0,0 +1,1797 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('string', function () { + + it('fails on boolean', function (done) { + + var schema = Joi.string(); + Helper.validate(schema, [ + [true, false], + [false, false] + ], done); + }); + + describe('#valid', function () { + + it('should throw error on input not matching type', function (done) { + + expect(function () { + + Joi.string().valid({}); + }).to.throw(); + done(); + }); + + it('should not throw on input matching type', function (done) { + + expect(function () { + + Joi.string().valid('joi'); + }).to.not.throw(); + done(); + }); + + it('validates case sensitive values', function (done) { + + Helper.validate(Joi.string().valid('a', 'b'), [ + ['a', true], + ['b', true], + ['A', false], + ['B', false] + ], done); + }); + + it('validates case insensitive values', function (done) { + + Helper.validate(Joi.string().valid('a', 'b').insensitive(), [ + ['a', true], + ['b', true], + ['A', true], + ['B', true], + [4, false] + ], done); + }); + + it('validates case insensitive values with non-strings', function (done) { + + Helper.validate(Joi.string().valid('a', 'b', 5).insensitive(), [ + ['a', true], + ['b', true], + ['A', true], + ['B', true], + [4, false], + [5, true] + ], done); + }); + }); + + describe('#invalid', function () { + + it('should throw error on input not matching type', function (done) { + + expect(function () { + + Joi.string().invalid({}); + }).to.throw(); + done(); + }); + + it('should not throw on input matching type', function (done) { + + expect(function () { + + Joi.string().invalid('joi'); + }).to.not.throw(); + done(); + }); + + it('invalidates case sensitive values', function (done) { + + Helper.validate(Joi.string().invalid('a', 'b'), [ + ['a', false], + ['b', false], + ['A', true], + ['B', true] + ], done); + }); + + it('invalidates case insensitive values', function (done) { + + Helper.validate(Joi.string().invalid('a', 'b').insensitive(), [ + ['a', false], + ['b', false], + ['A', false], + ['B', false] + ], done); + }); + }); + + describe('#min', function () { + + it('throws when limit is not a number', function (done) { + + expect(function () { + + Joi.string().min('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('throws when limit is not an integer', function (done) { + + expect(function () { + + Joi.string().min(1.2); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('enforces a limit using byte count', function (done) { + + var schema = Joi.string().min(2, 'utf8'); + Helper.validate(schema, [ + ['\u00bd', true], + ['a', false] + ], done); + }); + }); + + describe('#max', function () { + + it('throws when limit is not a number', function (done) { + + expect(function () { + + Joi.string().max('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('throws when limit is not an integer', function (done) { + + expect(function () { + + Joi.string().max(1.2); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('enforces a limit using byte count', function (done) { + + var schema = Joi.string().max(1, 'utf8'); + Helper.validate(schema, [ + ['\u00bd', false], + ['a', true] + ], done); + }); + }); + + describe('#creditCard', function () { + + it('should validate credit card', function (done) { + + var t = Joi.string().creditCard(); + t.validate('4111111111111112', function (err, value) { + + expect(err.message).to.equal('value must be a credit card'); + + Helper.validate(t, [ + ['378734493671000', true], // american express + ['371449635398431', true], // american express + ['378282246310005', true], // american express + ['341111111111111', true], // american express + ['5610591081018250', true], // australian bank + ['5019717010103742', true], // dankort pbs + ['38520000023237', true], // diners club + ['30569309025904', true], // diners club + ['6011000990139424', true], // discover + ['6011111111111117', true], // discover + ['6011601160116611', true], // discover + ['3566002020360505', true], // jbc + ['3530111333300000', true], // jbc + ['5105105105105100', true], // mastercard + ['5555555555554444', true], // mastercard + ['5431111111111111', true], // mastercard + ['6331101999990016', true], // switch/solo paymentech + ['4222222222222', true], // visa + ['4012888888881881', true], // visa + ['4111111111111111', true], // visa + ['4111111111111112', false], + [null, false], + ], done); + }); + }); + }); + + describe('#length', function () { + + it('throws when limit is not a number', function (done) { + + expect(function () { + + Joi.string().length('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('throws when limit is not an integer', function (done) { + + expect(function () { + + Joi.string().length(1.2); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('enforces a limit using byte count', function (done) { + + var schema = Joi.string().length(2, 'utf8'); + Helper.validate(schema, [ + ['\u00bd', true], + ['a', false] + ], done); + }); + }); + + describe('#hostname', function () { + + it('validates hostnames', function (done) { + + var schema = Joi.string().hostname(); + Helper.validate(schema, [ + ['www.example.com', true], + ['domain.local', true], + ['3domain.local', true], + ['hostname', true], + ['host:name', false], + ['-', false], + ['2387628', true], + ['01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789', false], + ['::1', true], + ['0:0:0:0:0:0:0:1', true], + ['0:?:0:0:0:0:0:1', false] + ], done); + }); + }); + + describe('#lowercase', function () { + + it('only allows strings that are entirely lowercase', function (done) { + + var schema = Joi.string().lowercase(); + Helper.validateOptions(schema, [ + ['this is all lowercase', true], + ['5', true], + ['lower\tcase', true], + ['Uppercase', false], + ['MixEd cAsE', false], + [1, false] + ], { convert: false }, done); + }); + + it('coerce string to lowercase before validation', function (done) { + + var schema = Joi.string().lowercase(); + schema.validate('UPPER TO LOWER', function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.equal('upper to lower'); + done(); + }); + }); + + it('should work in combination with a trim', function (done) { + + var schema = Joi.string().lowercase().trim(); + Helper.validate(schema, [ + [' abc', true], + [' ABC', true], + ['ABC', true], + [1, false] + ], done); + }); + }); + + describe('#uppercase', function () { + + it('only allow strings that are entirely uppercase', function (done) { + + var schema = Joi.string().uppercase(); + Helper.validateOptions(schema, [ + ['THIS IS ALL UPPERCASE', true], + ['5', true], + ['UPPER\nCASE', true], + ['lOWERCASE', false], + ['MixEd cAsE', false], + [1, false] + ], { convert: false }, done); + }); + + it('coerce string to uppercase before validation', function (done) { + + var schema = Joi.string().uppercase(); + schema.validate('lower to upper', function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.equal('LOWER TO UPPER'); + done(); + }); + }); + + it('works in combination with a forced trim', function (done) { + + var schema = Joi.string().uppercase().trim(); + Helper.validate(schema, [ + [' abc', true], + [' ABC', true], + ['ABC', true], + [1, false] + ], done); + }); + }); + + describe('#trim', function () { + + it('only allow strings that have no leading or trailing whitespace', function (done) { + + var schema = Joi.string().trim(); + Helper.validateOptions(schema, [ + [' something', false], + ['something ', false], + ['something\n', false], + ['some thing', true], + ['something', true] + ], { convert: false }, done); + }); + + it('removes leading and trailing whitespace before validation', function (done) { + + var schema = Joi.string().trim(); + schema.validate(' trim this ', function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.equal('trim this'); + done(); + }); + }); + + it('removes leading and trailing whitespace before validation', function (done) { + + var schema = Joi.string().trim().allow(''); + schema.validate(' ', function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.equal(''); + done(); + }); + }); + + it('should work in combination with min', function (done) { + + var schema = Joi.string().min(4).trim(); + Helper.validate(schema, [ + [' a ', false], + ['abc ', false], + ['abcd ', true] + ], done); + }); + + it('should work in combination with max', function (done) { + + var schema = Joi.string().max(4).trim(); + Helper.validate(schema, [ + [' abcde ', false], + ['abc ', true], + ['abcd ', true] + ], done); + }); + + it('should work in combination with length', function (done) { + + var schema = Joi.string().length(4).trim(); + Helper.validate(schema, [ + [' ab ', false], + ['abc ', false], + ['abcd ', true] + ], done); + }); + + it('should work in combination with a case change', function (done) { + + var schema = Joi.string().trim().lowercase(); + Helper.validate(schema, [ + [' abc', true], + [' ABC', true], + ['ABC', true] + ], done); + }); + }); + + describe('#regex', function () { + + it('should not include a pattern name by default', function (done) { + + var schema = Joi.string().regex(/[a-z]+/).regex(/[0-9]+/); + schema.validate('abcd', function (err, value) { + + expect(err.message).to.contain('required pattern'); + done(); + }); + }); + + it('should include a pattern name if specified', function (done) { + + var schema = Joi.string().regex(/[a-z]+/, 'letters').regex(/[0-9]+/, 'numbers'); + schema.validate('abcd', function (err, value) { + + expect(err.message).to.contain('numbers pattern'); + done(); + }); + }); + }); + + describe('#validate', function () { + + it('should, by default, allow undefined, deny empty string', function (done) { + + Helper.validate(Joi.string(), [ + [undefined, true], + ['', false] + ], done); + }); + + it('should, when .required(), deny undefined, deny empty string', function (done) { + + Helper.validate(Joi.string().required(), [ + [undefined, false], + ['', false] + ], done); + }); + + it('should, when .required(), print a friend error message for an empty string', function (done) { + + var schema = Joi.string().required(); + Joi.compile(schema).validate('', function (err, value) { + + expect(err.message).to.contain('be empty'); + done(); + }); + }); + + it('should, when .required(), validate non-empty strings', function (done) { + + var schema = Joi.string().required(); + Helper.validate(schema, [ + ['test', true], + ['0', true], + [null, false] + ], done); + }); + + it('validates invalid values', function (done) { + + var schema = Joi.string().invalid('a', 'b', 'c'); + Helper.validate(schema, [ + ['x', true], + ['a', false], + ['c', false] + ], done); + }); + + it('should invalidate invalid values', function (done) { + + var schema = Joi.string().valid('a', 'b', 'c'); + Helper.validate(schema, [ + ['x', false], + ['a', true], + ['c', true] + ], done); + }); + + it('validates array arguments correctly', function (done) { + + var schema = Joi.string().valid(['a', 'b', 'c']); + Helper.validate(schema, [ + ['x', false], + ['a', true], + ['c', true] + ], done); + }); + + it('validates minimum length when min is used', function (done) { + + var schema = Joi.string().min(3); + Helper.validate(schema, [ + ['test', true], + ['0', false], + [null, false] + ], done); + }); + + it('validates minimum length when min is 0', function (done) { + + var schema = Joi.string().min(0).required(); + Helper.validate(schema, [ + ['0', true], + [null, false], + [undefined, false] + ], done); + }); + + it('should return false with minimum length and a null value passed in', function (done) { + + var schema = Joi.string().min(3); + Helper.validate(schema, [ + [null, false] + ], done); + }); + + it('null allowed overrides min length requirement', function (done) { + + var schema = Joi.string().min(3).allow(null); + Helper.validate(schema, [ + [null, true] + ], done); + }); + + it('validates maximum length when max is used', function (done) { + + var schema = Joi.string().max(3); + Helper.validate(schema, [ + ['test', false], + ['0', true], + [null, false] + ], done); + }); + + it('should return true with max and not required when value is undefined', function (done) { + + var schema = Joi.string().max(3); + Helper.validate(schema, [ + [undefined, true] + ], done); + }); + + it('validates length requirements', function (done) { + + var schema = Joi.string().length(3); + Helper.validate(schema, [ + ['test', false], + ['0', false], + [null, false], + ['abc', true] + ], done); + }); + + it('validates regex', function (done) { + + var schema = Joi.string().regex(/^[0-9][-][a-z]+$/); + Helper.validate(schema, [ + ['van', false], + ['0-www', true] + ], done); + }); + + it('validates regex (ignoring global flag)', function (done) { + + var schema = Joi.string().regex(/a/g); + Helper.validate(schema, [ + ['ab', true], + ['ac', true] + ], done); + }); + + it('validates token', function (done) { + + var schema = Joi.string().token(); + Helper.validate(schema, [ + ['w0rld_of_w4lm4rtl4bs', true], + ['w0rld of_w4lm4rtl4bs', false], + ['abcd#f?h1j orly?', false] + ], done); + }); + + it('validates alphanum', function (done) { + + var schema = Joi.string().alphanum(); + Helper.validate(schema, [ + ['w0rld of w4lm4rtl4bs', false], + ['w0rldofw4lm4rtl4bs', true], + ['abcd#f?h1j orly?', false] + ], done); + }); + + it('validates email', function (done) { + + var schema = Joi.string().email(); + Helper.validate(schema, [ + ['joe@example.com', true], + ['"joe"@example.com', true], + ['@iaminvalid.com', false], + ['joe@[IPv6:2a00:1450:4001:c02::1b]', true], + ['12345678901234567890123456789012345678901234567890123456789012345@walmartlabs.com', false], + ['123456789012345678901234567890123456789012345678901234567890@12345678901234567890123456789012345678901234567890123456789.12345678901234567890123456789012345678901234567890123456789.12345678901234567890123456789012345678901234567890123456789.12345.toolong.com', false] + ], done); + }); + + it('validates email with a friendly error message', function (done) { + + var schema = { item: Joi.string().email() }; + Joi.compile(schema).validate({ item: 'something' }, function (err, value) { + + expect(err.message).to.contain('must be a valid email'); + done(); + }); + }); + + it('should return false for denied value', function (done) { + + var text = Joi.string().invalid('joi'); + text.validate('joi', function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('should return true for allowed value', function (done) { + + var text = Joi.string().allow('hapi'); + text.validate('result', function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('validates with one validator (min)', function (done) { + + var text = Joi.string().min(3); + text.validate('joi', function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('validates with two validators (min, required)', function (done) { + + var text = Joi.string().min(3).required(); + text.validate('joi', function (err, value) { + + expect(err).to.not.exist(); + + text.validate('', function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + }); + + it('validates null with allow(null)', function (done) { + + Helper.validate(Joi.string().allow(null), [ + [null, true] + ], done); + }); + + it('validates "" (empty string) with allow(\'\')', function (done) { + + Helper.validate(Joi.string().allow(''), [ + ['', true], + ['', true] + ], done); + }); + + it('validates combination of required and min', function (done) { + + var rule = Joi.string().required().min(3); + Helper.validate(rule, [ + ['x', false], + ['123', true], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of required and max', function (done) { + + var rule = Joi.string().required().max(3); + Helper.validate(rule, [ + ['x', true], + ['123', true], + ['1234', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of allow(\'\') and min', function (done) { + + var rule = Joi.string().allow('').min(3); + Helper.validate(rule, [ + ['x', false], + ['123', true], + ['1234', true], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of allow(\'\') and max', function (done) { + + var rule = Joi.string().allow('').max(3); + Helper.validate(rule, [ + ['x', true], + ['123', true], + ['1234', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of null allowed and max', function (done) { + var rule = Joi.string().allow(null).max(3); + Helper.validate(rule, [ + ['x', true], + ['123', true], + ['1234', false], + ['', false], + [null, true] + ], done); + }); + + it('validates combination of min and max', function (done) { + + var rule = Joi.string().min(2).max(3); + Helper.validate(rule, [ + ['x', false], + ['123', true], + ['1234', false], + ['12', true], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of min, max, and allow(\'\')', function (done) { + + var rule = Joi.string().min(2).max(3).allow(''); + Helper.validate(rule, [ + ['x', false], + ['123', true], + ['1234', false], + ['12', true], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of min, max, and required', function (done) { + + var rule = Joi.string().min(2).max(3).required(); + Helper.validate(rule, [ + ['x', false], + ['123', true], + ['1234', false], + ['12', true], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of min, max, and regex', function (done) { + + var rule = Joi.string().min(2).max(3).regex(/^a/); + Helper.validate(rule, [ + ['x', false], + ['123', false], + ['1234', false], + ['12', false], + ['ab', true], + ['abc', true], + ['abcd', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of min, max, regex, and allow(\'\')', function (done) { + + var rule = Joi.string().min(2).max(3).regex(/^a/).allow(''); + Helper.validate(rule, [ + ['x', false], + ['123', false], + ['1234', false], + ['12', false], + ['ab', true], + ['abc', true], + ['abcd', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of min, max, regex, and required', function (done) { + + var rule = Joi.string().min(2).max(3).regex(/^a/).required(); + Helper.validate(rule, [ + ['x', false], + ['123', false], + ['1234', false], + ['12', false], + ['ab', true], + ['abc', true], + ['abcd', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of min, max, and alphanum', function (done) { + + var rule = Joi.string().min(2).max(3).alphanum(); + Helper.validate(rule, [ + ['x', false], + ['123', true], + ['1234', false], + ['12', true], + ['ab', true], + ['abc', true], + ['abcd', false], + ['*ab', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of min, max, alphanum, and allow(\'\')', function (done) { + + var rule = Joi.string().min(2).max(3).alphanum().allow(''); + Helper.validate(rule, [ + ['x', false], + ['123', true], + ['1234', false], + ['12', true], + ['ab', true], + ['abc', true], + ['abcd', false], + ['*ab', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of min, max, alphanum, and required', function (done) { + + var rule = Joi.string().min(2).max(3).alphanum().required(); + Helper.validate(rule, [ + ['x', false], + ['123', true], + ['1234', false], + ['12', true], + ['ab', true], + ['abc', true], + ['abcd', false], + ['*ab', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of min, max, alphanum, and regex', function (done) { + + var rule = Joi.string().min(2).max(3).alphanum().regex(/^a/); + Helper.validate(rule, [ + ['x', false], + ['123', false], + ['1234', false], + ['12', false], + ['ab', true], + ['abc', true], + ['a2c', true], + ['abcd', false], + ['*ab', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of min, max, alphanum, required, and regex', function (done) { + + var rule = Joi.string().min(2).max(3).alphanum().required().regex(/^a/); + Helper.validate(rule, [ + ['x', false], + ['123', false], + ['1234', false], + ['12', false], + ['ab', true], + ['abc', true], + ['a2c', true], + ['abcd', false], + ['*ab', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of min, max, alphanum, allow(\'\'), and regex', function (done) { + + var rule = Joi.string().min(2).max(3).alphanum().allow('').regex(/^a/); + Helper.validate(rule, [ + ['x', false], + ['123', false], + ['1234', false], + ['12', false], + ['ab', true], + ['abc', true], + ['a2c', true], + ['abcd', false], + ['*ab', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of email and min', function (done) { + + var rule = Joi.string().email().min(8); + Helper.validate(rule, [ + ['x@x.com', false], + ['123@x.com', true], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of email, min, and max', function (done) { + + var rule = Joi.string().email().min(8).max(10); + Helper.validate(rule, [ + ['x@x.com', false], + ['123@x.com', true], + ['1234@x.com', true], + ['12345@x.com', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, and invalid', function (done) { + + var rule = Joi.string().email().min(8).max(10).invalid('123@x.com'); + Helper.validate(rule, [ + ['x@x.com', false], + ['123@x.com', false], + ['1234@x.com', true], + ['12345@x.com', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, and allow', function (done) { + + var rule = Joi.string().email().min(8).max(10).allow('x@x.com'); + Helper.validate(rule, [ + ['x@x.com', true], + ['123@x.com', true], + ['1234@x.com', true], + ['12345@x.com', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, allow, and invalid', function (done) { + + var rule = Joi.string().email().min(8).max(10).allow('x@x.com').invalid('123@x.com'); + Helper.validate(rule, [ + ['x@x.com', true], + ['123@x.com', false], + ['1234@x.com', true], + ['12345@x.com', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, allow, invalid, and allow(\'\')', function (done) { + + var rule = Joi.string().email().min(8).max(10).allow('x@x.com').invalid('123@x.com').allow(''); + Helper.validate(rule, [ + ['x@x.com', true], + ['123@x.com', false], + ['1234@x.com', true], + ['12345@x.com', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, allow, and allow(\'\')', function (done) { + + var rule = Joi.string().email().min(8).max(10).allow('x@x.com').allow(''); + Helper.validate(rule, [ + ['x@x.com', true], + ['123@x.com', true], + ['1234@x.com', true], + ['12345@x.com', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, allow, invalid, and regex', function (done) { + + var rule = Joi.string().email().min(8).max(10).allow('x@x.com').invalid('123@x.com').regex(/^1/); + Helper.validate(rule, [ + ['x@x.com', true], + ['123@x.com', false], + ['1234@x.com', true], + ['12345@x.com', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, allow, invalid, regex, and allow(\'\')', function (done) { + + var rule = Joi.string().email().min(8).max(10).allow('x@x.com').invalid('123@x.com').regex(/^1/).allow(''); + Helper.validate(rule, [ + ['x@x.com', true], + ['123@x.com', false], + ['1234@x.com', true], + ['12345@x.com', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, and allow(\'\')', function (done) { + + var rule = Joi.string().email().min(8).max(10).allow(''); + Helper.validate(rule, [ + ['x@x.com', false], + ['123@x.com', true], + ['1234@x.com', true], + ['12345@x.com', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, and regex', function (done) { + + var rule = Joi.string().email().min(8).max(10).regex(/^1234/); + Helper.validate(rule, [ + ['x@x.com', false], + ['123@x.com', false], + ['1234@x.com', true], + ['12345@x.com', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, regex, and allow(\'\')', function (done) { + + var rule = Joi.string().email().min(8).max(10).regex(/^1234/).allow(''); + Helper.validate(rule, [ + ['x@x.com', false], + ['123@x.com', false], + ['1234@x.com', true], + ['12345@x.com', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, regex, and required', function (done) { + + var rule = Joi.string().email().min(8).max(10).regex(/^1234/).required(); + Helper.validate(rule, [ + ['x@x.com', false], + ['123@x.com', false], + ['1234@x.com', true], + ['12345@x.com', false], + ['', false], + [null, false] + ], done); + }); + + it('validates isoDate', function (done) { + + Helper.validate(Joi.string().isoDate(), [ + ['2013-06-07T14:21:46.295Z', true], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', true], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', true], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', true], + ['2013-06-07T14:21:46-07:00', true], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', true], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', true], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', true], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false] + ], done); + }); + + it('validates isoDate with a friendly error message', function (done) { + + var schema = { item: Joi.string().isoDate() }; + Joi.compile(schema).validate({ item: 'something' }, function (err, value) { + + expect(err.message).to.contain('must be a valid ISO 8601 date'); + done(); + }); + }); + + it('validates combination of isoDate and min', function (done) { + + var rule = Joi.string().isoDate().min(23); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', true], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', true], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', true], + ['2013-06-07T14:21:46Z', false], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', true], + ['2013-06-07T14:21:46-07:00', true], + ['2013-06-07T14:21Z', false], + ['2013-06-07T14:21+07:00', false], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', false], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min and max', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', false], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', true], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', true], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max and invalid', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).invalid('2013-06-07T14:21+07:00'); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', false], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', false], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', true], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max and allow', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).allow('2013-06-07T14:21:46.295+07:00'); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', true], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', true], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', true], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max, allow and invalid', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).allow('2013-06-07T14:21:46.295+07:00').invalid('2013-06-07T14:21+07:00'); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', true], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', false], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', true], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max, allow, invalid and allow(\'\')', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).allow('2013-06-07T14:21:46.295+07:00').invalid('2013-06-07T14:21+07:00').allow(''); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', true], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', false], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', true], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max, allow, invalid and allow(\'\')', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).allow('2013-06-07T14:21:46.295+07:00').allow(''); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', true], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', true], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', true], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max, allow, invalid and regex', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).allow('2013-06-07T14:21:46.295+07:00').invalid('2013-06-07T14:21Z').regex(/Z$/); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', true], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', false], + ['2013-06-07T14:21+07:00', false], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', false], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max, allow, invalid, regex and allow(\'\')', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).allow('2013-06-07T14:21:46.295+07:00').invalid('2013-06-07T14:21Z').regex(/Z$/).allow(''); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', true], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', false], + ['2013-06-07T14:21+07:00', false], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', false], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max and allow(\'\')', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).allow(''); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', false], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', true], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', true], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max and regex', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).regex(/Z$/); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', false], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', false], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', false], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max, regex and allow(\'\')', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).regex(/Z$/).allow(''); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', false], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', false], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', false], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max, regex and required', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).regex(/Z$/).required(); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', false], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', false], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', false], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', false], + [null, false] + ], done); + }); + + it('validates guid', function (done) { + + Helper.validate(Joi.string().guid(), [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', true], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], + ['69593D62-71EA-4548-85E4-04FC71357423', true], + ['677E2553DD4D43B09DA77414DB1EB8EA', true], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', true], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', true], + ['b4b2fb69c6244e5eb0698e0c6ec66618', true], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false] + ], done); + }); + + it('validates guid with a friendly error message', function (done) { + + var schema = { item: Joi.string().guid() }; + Joi.compile(schema).validate({ item: 'something' }, function (err, value) { + + expect(err.message).to.contain('must be a valid GUID'); + done(); + }); + }); + + it('validates combination of guid and min', function (done) { + + var rule = Joi.string().guid().min(36); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', true], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', false], + ['69593D62-71EA-4548-85E4-04FC71357423', true], + ['677E2553DD4D43B09DA77414DB1EB8EA', false], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', true], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', false], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', true], + ['b4b2fb69c6244e5eb0698e0c6ec66618', false], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of guid, min and max', function (done) { + + var rule = Joi.string().guid().min(32).max(34); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', true], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', true], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max and invalid', function (done) { + + var rule = Joi.string().guid().min(32).max(34).invalid('b4b2fb69c6244e5eb0698e0c6ec66618'); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', true], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', false], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max and allow', function (done) { + + var rule = Joi.string().guid().min(32).max(34).allow('{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D'); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', true], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', true], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', true], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max, allow and invalid', function (done) { + + var rule = Joi.string().guid().min(32).max(34).allow('{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D').invalid('b4b2fb69c6244e5eb0698e0c6ec66618'); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', true], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', false], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', true], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max, allow, invalid and allow(\'\')', function (done) { + + var rule = Joi.string().guid().min(32).max(34).allow('{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D').invalid('b4b2fb69c6244e5eb0698e0c6ec66618').allow(''); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', true], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', false], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', true], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max, allow and allow(\'\')', function (done) { + + var rule = Joi.string().guid().min(32).max(34).allow('{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D').allow(''); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', true], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', true], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', true], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max, allow, invalid and regex', function (done) { + + var rule = Joi.string().guid().min(32).max(34).allow('{D1A5279D-B27D-4CD4-A05E-EFDD53D08').invalid('b4b2fb69c6244e5eb0698e0c6ec66618').regex(/^{7e908/); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', false], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', false], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', false], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08', true], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max, allow, invalid, regex and allow(\'\')', function (done) { + + var rule = Joi.string().guid().min(32).max(34).allow('{D1A5279D-B27D-4CD4-A05E-EFDD53D08').invalid('b4b2fb69c6244e5eb0698e0c6ec66618').regex(/^{7e908/).allow(''); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', false], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', false], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', false], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08', true], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max and allow(\'\')', function (done) { + + var rule = Joi.string().guid().min(32).max(34).allow(''); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', true], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', true], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max and regex', function (done) { + + var rule = Joi.string().guid().min(32).max(34).regex(/^{7e9081/i); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', false], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', false], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', false], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max, regex and allow(\'\')', function (done) { + + var rule = Joi.string().guid().min(32).max(34).regex(/^{7e9081/i).allow(''); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', false], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', false], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', false], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max, regex and required', function (done) { + + var rule = Joi.string().guid().min(32).max(34).regex(/^{7e9081/i).required(); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', false], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', false], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', false], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', false], + [null, false] + ], done); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/heavy/package.json b/node_modules/hapi/node_modules/heavy/package.json new file mode 100755 index 0000000..dd16936 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/package.json @@ -0,0 +1,49 @@ +{ + "name": "heavy", + "description": "Measure process load", + "version": "3.0.0", + "repository": { + "type": "git", + "url": "git://github.com/hapijs/heavy" + }, + "main": "index", + "keywords": [ + "process", + "load", + "measure", + "delay", + "memory" + ], + "engines": { + "node": ">=0.10.32" + }, + "dependencies": { + "boom": "2.x.x", + "hoek": "2.x.x", + "joi": "5.x.x" + }, + "devDependencies": { + "code": "1.x.x", + "lab": "5.x.x" + }, + "scripts": { + "test": "make test-cov" + }, + "licenses": [ + { + "type": "BSD", + "url": "http://github.com/hapijs/heavy/raw/master/LICENSE" + } + ], + "readme": "#heavy\n\nMeasure process load.\n\n[![Build Status](https://secure.travis-ci.org/hapijs/heavy.png)](http://travis-ci.org/hapijs/heavy)\n\nLead Maintainer - [Kevin Decker](https://github.com/kpdecker)\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/hapijs/heavy/issues" + }, + "_id": "heavy@3.0.0", + "dist": { + "shasum": "771aa3194a10986c287904951612be4ab553e64b" + }, + "_from": "heavy@3.0.0", + "_resolved": "https://registry.npmjs.org/heavy/-/heavy-3.0.0.tgz" +} diff --git a/node_modules/hapi/node_modules/heavy/test/index.js b/node_modules/hapi/node_modules/heavy/test/index.js new file mode 100755 index 0000000..237a309 --- /dev/null +++ b/node_modules/hapi/node_modules/heavy/test/index.js @@ -0,0 +1,184 @@ +// Load modules + +var Code = require('code'); +var Heavy = require('..'); +var Lab = require('lab'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('Heavy', { parallel: false }, function () { + + it('requires load interval when maxEventLoopDelay is set', function (done) { + + var heavy = new Heavy({ sampleInterval: 0 }); + expect(function () { + + heavy.policy({ maxEventLoopDelay: 10, maxHeapUsedBytes: 0, maxRssBytes: 0 }); + }).to.throw('Load sample interval must be set to enable load limits'); + done(); + }); + + it('requires load interval when maxHeapUsedBytes is set', function (done) { + + var heavy = new Heavy({ sampleInterval: 0 }); + expect(function () { + + heavy.policy({ maxEventLoopDelay: 0, maxHeapUsedBytes: 10, maxRssBytes: 0 }); + }).to.throw('Load sample interval must be set to enable load limits'); + done(); + }); + + it('requires load interval when maxRssBytes is set', function (done) { + + var heavy = new Heavy({ sampleInterval: 0 }); + expect(function () { + + heavy.policy({ maxEventLoopDelay: 0, maxHeapUsedBytes: 0, maxRssBytes: 10 }); + }).to.throw('Load sample interval must be set to enable load limits'); + done(); + }); + + var sleep = function (msec) { + + var start = Date.now(); + while (Date.now() - start < msec) {} + }; + + it('measures load', function (done) { + + var heavy = new Heavy({ sampleInterval: 4 }); + heavy.start(); + + expect(heavy.load.eventLoopDelay).to.equal(0); + sleep(5); + setImmediate(function () { + + sleep(5); + expect(heavy.load.eventLoopDelay).to.be.above(0); + + setImmediate(function () { + + sleep(5); + + expect(heavy.load.eventLoopDelay).to.be.above(0); + expect(heavy.load.heapUsed).to.be.above(1024 * 1024); + expect(heavy.load.rss).to.be.above(1024 * 1024); + heavy.stop(); + done(); + }); + }); + }); + + it('throws when process not started', function (done) { + + var heavy = new Heavy({ sampleInterval: 5 }); + var policy = heavy.policy({ maxRssBytes: 1 }); + + expect(function () { + + policy.check(); + }).to.throw('Cannot check load when sampler is not started'); + done(); + }); + + it('fails check due to high rss load', function (done) { + + var heavy = new Heavy({ sampleInterval: 5 }); + var policy = heavy.policy({ maxRssBytes: 1 }); + + heavy.start(); + expect(policy.check()).to.equal(null); + + setTimeout(function () { + + expect(policy.check().message).to.equal('Server under heavy load (rss)'); + expect(heavy.load.rss).to.be.above(10000); + heavy.stop(); + done(); + }, 10); + }); + + it('fails check due to high heap load', function (done) { + + var heavy = new Heavy({ sampleInterval: 5 }); + var policy = heavy.policy({ maxHeapUsedBytes: 1 }); + + heavy.start(); + expect(policy.check()).to.equal(null); + + setTimeout(function () { + + expect(policy.check().message).to.equal('Server under heavy load (heap)'); + expect(heavy.load.heapUsed).to.be.above(0); + heavy.stop(); + done(); + }, 10); + }); + + it('fails check due to high event loop delay load', function (done) { + + var heavy = new Heavy({ sampleInterval: 1 }); + var policy = heavy.policy({ maxEventLoopDelay: 5 }); + + heavy.start(); + + expect(policy.check()).to.equal(null); + expect(heavy.load.eventLoopDelay).to.equal(0); + setImmediate(function () { + + sleep(10); + + setImmediate(function () { + + expect(policy.check().message).to.equal('Server under heavy load (event loop)'); + expect(heavy.load.eventLoopDelay).to.be.above(0); + heavy.stop(); + done(); + }); + }); + }); + + it('fails check due to high event loop delay load (delayed measure)', function (done) { + + var heavy = new Heavy({ sampleInterval: 1 }); + var policy = heavy.policy({ maxEventLoopDelay: 5 }); + + heavy.start(); + + expect(policy.check()).to.equal(null); + expect(heavy.load.eventLoopDelay).to.equal(0); + sleep(10); + + expect(policy.check().message).to.equal('Server under heavy load (event loop)'); + expect(heavy.load.eventLoopDelay).to.be.above(0); + heavy.stop(); + done(); + }); + + it('disabled by default', function (done) { + + var heavy = new Heavy(); + var policy = heavy.policy(); + + heavy.start(); + setImmediate(function () { + + expect(heavy.load.rss).to.equal(0); + expect(policy.check()).to.equal(null); + heavy.stop(); + done(); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/hoek/.npmignore b/node_modules/hapi/node_modules/hoek/.npmignore new file mode 100644 index 0000000..7e1574d --- /dev/null +++ b/node_modules/hapi/node_modules/hoek/.npmignore @@ -0,0 +1,18 @@ +.idea +*.iml +npm-debug.log +dump.rdb +node_modules +results.tap +results.xml +npm-shrinkwrap.json +config.json +.DS_Store +*/.DS_Store +*/*/.DS_Store +._* +*/._* +*/*/._* +coverage.* +lib-cov +complexity.md diff --git a/node_modules/hapi/node_modules/hoek/.travis.yml b/node_modules/hapi/node_modules/hoek/.travis.yml new file mode 100755 index 0000000..c84aade --- /dev/null +++ b/node_modules/hapi/node_modules/hoek/.travis.yml @@ -0,0 +1,7 @@ +language: node_js + +node_js: + - 0.10 + - 0.12 + - iojs + diff --git a/node_modules/hapi/node_modules/hoek/CONTRIBUTING.md b/node_modules/hapi/node_modules/hoek/CONTRIBUTING.md new file mode 100644 index 0000000..8928361 --- /dev/null +++ b/node_modules/hapi/node_modules/hoek/CONTRIBUTING.md @@ -0,0 +1 @@ +Please view our [hapijs contributing guide](https://github.com/hapijs/hapi/blob/master/CONTRIBUTING.md). diff --git a/node_modules/hapi/node_modules/hoek/LICENSE b/node_modules/hapi/node_modules/hoek/LICENSE new file mode 100755 index 0000000..5530904 --- /dev/null +++ b/node_modules/hapi/node_modules/hoek/LICENSE @@ -0,0 +1,31 @@ +Copyright (c) 2011-2014, Walmart and other contributors. +Copyright (c) 2011, Yahoo Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/hapi/graphs/contributors +Portions of this project were initially based on the Yahoo! Inc. Postmile project, +published at https://github.com/yahoo/postmile. diff --git a/node_modules/hapi/node_modules/hoek/Makefile b/node_modules/hapi/node_modules/hoek/Makefile new file mode 100755 index 0000000..83aaf0c --- /dev/null +++ b/node_modules/hapi/node_modules/hoek/Makefile @@ -0,0 +1,8 @@ +test: + @node node_modules/lab/bin/lab -a code +test-cov: + @node node_modules/lab/bin/lab -a code -t 100 -L +test-cov-html: + @node node_modules/lab/bin/lab -a code -r html -o coverage.html + +.PHONY: test test-cov test-cov-html diff --git a/node_modules/hapi/node_modules/hoek/README.md b/node_modules/hapi/node_modules/hoek/README.md new file mode 100755 index 0000000..a22fa06 --- /dev/null +++ b/node_modules/hapi/node_modules/hoek/README.md @@ -0,0 +1,543 @@ +![hoek Logo](https://raw.github.com/hapijs/hoek/master/images/hoek.png) + +Utility methods for the hapi ecosystem. This module is not intended to solve every problem for everyone, but rather as a central place to store hapi-specific methods. If you're looking for a general purpose utility module, check out [lodash](https://github.com/lodash/lodash) or [underscore](https://github.com/jashkenas/underscore). + +[![Build Status](https://secure.travis-ci.org/hapijs/hoek.png)](http://travis-ci.org/hapijs/hoek) + +Lead Maintainer: [Nathan LaFreniere](https://github.com/nlf) + +# Table of Contents + +* [Introduction](#introduction "Introduction") +* [Object](#object "Object") + * [clone](#cloneobj "clone") + * [cloneWithShallow](#clonewithshallowobj-keys "cloneWithShallow") + * [merge](#mergetarget-source-isnulloverride-ismergearrays "merge") + * [applyToDefaults](#applytodefaultsdefaults-options "applyToDefaults") + * [applyToDefaultsWithShallow](#applytodefaultswithshallowdefaults-options-keys "applyToDefaultsWithShallow") + * [deepEqual](#deepequala-b "deepEqual") + * [unique](#uniquearray-key "unique") + * [mapToObject](#maptoobjectarray-key "mapToObject") + * [intersect](#intersectarray1-array2 "intersect") + * [contain](#containref-values-options "contain") + * [flatten](#flattenarray-target "flatten") + * [reach](#reachobj-chain-options "reach") + * [transform](#transformobj-transform-options "transform") + * [shallow](#shallowobj "shallow") + * [stringify](#stringifyobj "stringify") +* [Timer](#timer "Timer") +* [Bench](#bench "Bench") +* [Binary Encoding/Decoding](#binary-encodingdecoding "Binary Encoding/Decoding") + * [base64urlEncode](#base64urlencodevalue "binary64urlEncode") + * [base64urlDecode](#base64urldecodevalue "binary64urlDecode") +* [Escaping Characters](#escaping-characters "Escaping Characters") + * [escapeHtml](#escapehtmlstring "escapeHtml") + * [escapeHeaderAttribute](#escapeheaderattributeattribute "escapeHeaderAttribute") + * [escapeRegex](#escaperegexstring "escapeRegex") +* [Errors](#errors "Errors") + * [assert](#assertcondition-message "assert") + * [abort](#abortmessage "abort") + * [displayStack](#displaystackslice "displayStack") + * [callStack](#callstackslice "callStack") +* [Function](#function "Function") + * [nextTick](#nexttickfn "nextTick") + * [once](#oncefn "once") + * [ignore](#ignore "ignore") +* [Miscellaneous](#miscellaneous "Miscellaneous") + * [uniqueFilename](#uniquefilename "uniqueFilename") + * [isInteger](#isInteger "isInteger") + + + +# Introduction + +The *Hoek* library contains some common functions used within the hapi ecosystem. It comes with useful methods for Arrays (clone, merge, applyToDefaults), Objects (removeKeys, copy), Asserting and more. + +For example, to use Hoek to set configuration with default options: +```javascript +var Hoek = require('hoek'); + +var default = {url : "www.github.com", port : "8000", debug : true}; + +var config = Hoek.applyToDefaults(default, {port : "3000", admin : true}); + +// In this case, config would be { url: 'www.github.com', port: '3000', debug: true, admin: true } +``` + +Under each of the sections (such as Array), there are subsections which correspond to Hoek methods. Each subsection will explain how to use the corresponding method. In each js excerpt below, the `var Hoek = require('hoek');` is omitted for brevity. + +## Object + +Hoek provides several helpful methods for objects and arrays. + +### clone(obj) + +This method is used to clone an object or an array. A *deep copy* is made (duplicates everything, including values that are objects). + +```javascript + +var nestedObj = { + w: /^something$/ig, + x: { + a: [1, 2, 3], + b: 123456, + c: new Date() + }, + y: 'y', + z: new Date() + }; + +var copy = Hoek.clone(nestedObj); + +copy.x.b = 100; + +console.log(copy.y); // results in 'y' +console.log(nestedObj.x.b); // results in 123456 +console.log(copy.x.b); // results in 100 +``` + +### cloneWithShallow(obj, keys) +keys is an array of key names to shallow copy + +This method is also used to clone an object or array, however any keys listed in the `keys` array are shallow copied while those not listed are deep copied. + +```javascript + +var nestedObj = { + w: /^something$/ig, + x: { + a: [1, 2, 3], + b: 123456, + c: new Date() + }, + y: 'y', + z: new Date() + }; + +var copy = Hoek.cloneWithShallow(nestedObj, ['x']); + +copy.x.b = 100; + +console.log(copy.y); // results in 'y' +console.log(nestedObj.x.b); // results in 100 +console.log(copy.x.b); // results in 100 +``` + +### merge(target, source, isNullOverride, isMergeArrays) +isNullOverride, isMergeArrays default to true + +Merge all the properties of source into target, source wins in conflict, and by default null and undefined from source are applied. +Merge is destructive where the target is modified. For non destructive merge, use `applyToDefaults`. + + +```javascript + +var target = {a: 1, b : 2}; +var source = {a: 0, c: 5}; +var source2 = {a: null, c: 5}; + +Hoek.merge(target, source); // results in {a: 0, b: 2, c: 5} +Hoek.merge(target, source2); // results in {a: null, b: 2, c: 5} +Hoek.merge(target, source2, false); // results in {a: 1, b: 2, c: 5} + +var targetArray = [1, 2, 3]; +var sourceArray = [4, 5]; + +Hoek.merge(targetArray, sourceArray); // results in [1, 2, 3, 4, 5] +Hoek.merge(targetArray, sourceArray, true, false); // results in [4, 5] +``` + +### applyToDefaults(defaults, options) + +Apply options to a copy of the defaults + +```javascript + +var defaults = { host: "localhost", port: 8000 }; +var options = { port: 8080 }; + +var config = Hoek.applyToDefaults(defaults, options); // results in { host: "localhost", port: 8080 } +``` + +### applyToDefaultsWithShallow(defaults, options, keys) +keys is an array of key names to shallow copy + +Apply options to a copy of the defaults. Keys specified in the last parameter are shallow copied from options instead of merged. + +```javascript + +var defaults = { + server: { + host: "localhost", + port: 8000 + }, + name: 'example' + }; + +var options = { server: { port: 8080 } }; + +var config = Hoek.applyToDefaults(defaults, options); // results in { server: { port: 8080 }, name: 'example' } +``` + +### deepEqual(b, a) + +Performs a deep comparison of the two values including support for circular dependencies, prototype, and properties. + +```javascript +Hoek.deepEqual({ a: [1, 2], b: 'string', c: { d: true } }, { a: [1, 2], b: 'string', c: { d: true } }); +``` + +### unique(array, key) + +Remove duplicate items from Array + +```javascript + +var array = [1, 2, 2, 3, 3, 4, 5, 6]; + +var newArray = Hoek.unique(array); // results in [1,2,3,4,5,6] + +array = [{id: 1}, {id: 1}, {id: 2}]; + +newArray = Hoek.unique(array, "id"); // results in [{id: 1}, {id: 2}] +``` + +### mapToObject(array, key) + +Convert an Array into an Object + +```javascript + +var array = [1,2,3]; +var newObject = Hoek.mapToObject(array); // results in [{"1": true}, {"2": true}, {"3": true}] + +array = [{id: 1}, {id: 2}]; +newObject = Hoek.mapToObject(array, "id"); // results in [{"id": 1}, {"id": 2}] +``` + +### intersect(array1, array2) + +Find the common unique items in two arrays + +```javascript + +var array1 = [1, 2, 3]; +var array2 = [1, 4, 5]; + +var newArray = Hoek.intersect(array1, array2); // results in [1] +``` + +### contain(ref, values, [options]) + +Tests if the reference value contains the provided values where: +- `ref` - the reference string, array, or object. +- `values` - a single or array of values to find within the `ref` value. If `ref` is an object, `values` can be a key name, + an array of key names, or an object with key-value pairs to compare. +- `options` - an optional object with the following optional settings: + - `deep` - if `true`, performed a deep comparison of the values. + - `once` - if `true`, allows only one occurrence of each value. + - `only` - if `true`, does not allow values not explicitly listed. + - `part` - if `true`, allows partial match of the values (at least one must always match). + +Note: comparing a string to overlapping values will result in failed comparison (e.g. `contain('abc', ['ab', 'bc'])`). +Also, if an object key's value does not match the provided value, `false` is returned even when `part` is specified. + +```javascript +Hoek.contain('aaa', 'a', { only: true }); // true +Hoek.contain([{ a: 1 }], [{ a: 1 }], { deep: true }); // true +Hoek.contain([1, 2, 2], [1, 2], { once: true }); // false +Hoek.contain({ a: 1, b: 2, c: 3 }, { a: 1, d: 4 }, { part: true }); // true +``` + +### flatten(array, [target]) + +Flatten an array + +```javascript + +var array = [1, [2, 3]]; + +var flattenedArray = Hoek.flatten(array); // results in [1, 2, 3] + +array = [1, [2, 3]]; +target = [4, [5]]; + +flattenedArray = Hoek.flatten(array, target); // results in [4, [5], 1, 2, 3] +``` + +### reach(obj, chain, [options]) + +Converts an object key chain string to reference + +- `options` - optional settings + - `separator` - string to split chain path on, defaults to '.' + - `default` - value to return if the path or value is not present, default is `undefined` + - `strict` - if `true`, will throw an error on missing member, default is `false` + - `functions` - if `true` allow traversing functions for properties. `false` will throw an error if a function is part of the chain. + +A chain including negative numbers will work like negative indices on an +array. + +```javascript + +var chain = 'a.b.c'; +var obj = {a : {b : { c : 1}}}; + +Hoek.reach(obj, chain); // returns 1 + +var chain = 'a.b.-1'; +var obj = {a : {b : [2,3,6]}}; + +Hoek.reach(obj, chain); // returns 6 +``` + +### transform(obj, transform, [options]) + +Transforms an existing object into a new one based on the supplied `obj` and `transform` map. `options` are the same as the `reach` options. + +```javascript +var source = { + address: { + one: '123 main street', + two: 'PO Box 1234' + }, + title: 'Warehouse', + state: 'CA' +}; + +var result = Hoek.transform(source, { + 'person.address.lineOne': 'address.one', + 'person.address.lineTwo': 'address.two', + 'title': 'title', + 'person.address.region': 'state' +}); +// Results in +// { +// person: { +// address: { +// lineOne: '123 main street', +// lineTwo: 'PO Box 1234', +// region: 'CA' +// } +// }, +// title: 'Warehouse' +// } +``` + +### shallow(obj) + +Performs a shallow copy by copying the references of all the top level children where: +- `obj` - the object to be copied. + +```javascript +var shallow = Hoek.shallow({ a: { b: 1 } }); +``` + +### stringify(obj) + +Converts an object to string using the built-in `JSON.stringify()` method with the difference that any errors are caught +and reported back in the form of the returned string. Used as a shortcut for displaying information to the console (e.g. in +error message) without the need to worry about invalid conversion. + +```javascript +var a = {}; +a.b = a; +Hoek.stringify(a); // Returns '[Cannot display object: Converting circular structure to JSON]' +``` + +# Timer + +A Timer object. Initializing a new timer object sets the ts to the number of milliseconds elapsed since 1 January 1970 00:00:00 UTC. + +```javascript + +var timerObj = new Hoek.Timer(); +console.log("Time is now: " + timerObj.ts); +console.log("Elapsed time from initialization: " + timerObj.elapsed() + 'milliseconds'); +``` + + +# Bench + +Same as Timer with the exception that `ts` stores the internal node clock which is not related to `Date.now()` and cannot be used to display +human-readable timestamps. More accurate for benchmarking or internal timers. + +# Binary Encoding/Decoding + +### base64urlEncode(value) + +Encodes value in Base64 or URL encoding + +### base64urlDecode(value) + +Decodes data in Base64 or URL encoding. +# Escaping Characters + +Hoek provides convenient methods for escaping html characters. The escaped characters are as followed: + +```javascript + +internals.htmlEscaped = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' +}; +``` + +### escapeHtml(string) + +```javascript + +var string = ' hey '; +var escapedString = Hoek.escapeHtml(string); // returns <html> hey </html> +``` + +### escapeHeaderAttribute(attribute) + +Escape attribute value for use in HTTP header + +```javascript + +var a = Hoek.escapeHeaderAttribute('I said "go w\\o me"'); //returns I said \"go w\\o me\" +``` + + +### escapeRegex(string) + +Escape string for Regex construction + +```javascript + +var a = Hoek.escapeRegex('4^f$s.4*5+-_?%=#!:@|~\\/`"(>)[<]d{}s,'); // returns 4\^f\$s\.4\*5\+\-_\?%\=#\!\:@\|~\\\/`"\(>\)\[<\]d\{\}s\, +``` + +# Errors + +### assert(condition, message) + +```javascript + +var a = 1, b = 2; + +Hoek.assert(a === b, 'a should equal b'); // Throws 'a should equal b' +``` + +Note that you may also pass an already created Error object as the second parameter, and `assert` will throw that object. + +```javascript + +var a = 1, b = 2; + +Hoek.assert(a === b, new Error('a should equal b')); // Throws the given error object +``` + +### abort(message) + +First checks if `process.env.NODE_ENV === 'test'`, and if so, throws error message. Otherwise, +displays most recent stack and then exits process. + + + +### displayStack(slice) + +Displays the trace stack + +```javascript + +var stack = Hoek.displayStack(); +console.log(stack); // returns something like: + +[ 'null (/Users/user/Desktop/hoek/test.js:4:18)', + 'Module._compile (module.js:449:26)', + 'Module._extensions..js (module.js:467:10)', + 'Module.load (module.js:356:32)', + 'Module._load (module.js:312:12)', + 'Module.runMain (module.js:492:10)', + 'startup.processNextTick.process._tickCallback (node.js:244:9)' ] +``` + +### callStack(slice) + +Returns a trace stack array. + +```javascript + +var stack = Hoek.callStack(); +console.log(stack); // returns something like: + +[ [ '/Users/user/Desktop/hoek/test.js', 4, 18, null, false ], + [ 'module.js', 449, 26, 'Module._compile', false ], + [ 'module.js', 467, 10, 'Module._extensions..js', false ], + [ 'module.js', 356, 32, 'Module.load', false ], + [ 'module.js', 312, 12, 'Module._load', false ], + [ 'module.js', 492, 10, 'Module.runMain', false ], + [ 'node.js', + 244, + 9, + 'startup.processNextTick.process._tickCallback', + false ] ] +``` + +## Function + +### nextTick(fn) + +Returns a new function that wraps `fn` in `process.nextTick`. + +```javascript + +var myFn = function () { + console.log('Do this later'); +}; + +var nextFn = Hoek.nextTick(myFn); + +nextFn(); +console.log('Do this first'); + +// Results in: +// +// Do this first +// Do this later +``` + +### once(fn) + +Returns a new function that can be run multiple times, but makes sure `fn` is only run once. + +```javascript + +var myFn = function () { + console.log('Ran myFn'); +}; + +var onceFn = Hoek.once(myFn); +onceFn(); // results in "Ran myFn" +onceFn(); // results in undefined +``` + +### ignore + +A simple no-op function. It does nothing at all. + +## Miscellaneous + +### uniqueFilename(path, extension) +`path` to prepend with the randomly generated file name. `extension` is the optional file extension, defaults to `''`. + +Returns a randomly generated file name at the specified `path`. The result is a fully resolved path to a file. + +```javascript +var result = Hoek.uniqueFilename('./test/modules', 'txt'); // results in "full/path/test/modules/{random}.txt" +``` + +### isInteger(value) + +Check `value` to see if it is an integer. Returns true/false. + +```javascript +var result = Hoek.isInteger('23') +``` diff --git a/node_modules/hapi/node_modules/hoek/images/hoek.png b/node_modules/hapi/node_modules/hoek/images/hoek.png new file mode 100755 index 0000000000000000000000000000000000000000..6ccfcb12be76a7a8331428c87337b20b901e869c GIT binary patch literal 37939 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 256) { + return '\\u' + internals.padLeft('' + charCode, 4); + } + + var hexValue = new Buffer(String.fromCharCode(charCode), 'ascii').toString('hex'); + return '\\x' + internals.padLeft(hexValue, 2); +}; + + +internals.escapeHtmlChar = function (charCode) { + + var namedEscape = internals.namedHtml[charCode]; + if (typeof namedEscape !== 'undefined') { + return namedEscape; + } + + if (charCode >= 256) { + return '&#' + charCode + ';'; + } + + var hexValue = new Buffer(String.fromCharCode(charCode), 'ascii').toString('hex'); + return '&#x' + internals.padLeft(hexValue, 2) + ';'; +}; + + +internals.padLeft = function (str, len) { + + while (str.length < len) { + str = '0' + str; + } + + return str; +}; + + +internals.isSafe = function (charCode) { + + return (typeof internals.safeCharCodes[charCode] !== 'undefined'); +}; + + +internals.namedHtml = { + '38': '&', + '60': '<', + '62': '>', + '34': '"', + '160': ' ', + '162': '¢', + '163': '£', + '164': '¤', + '169': '©', + '174': '®' +}; + + +internals.safeCharCodes = (function () { + + var safe = {}; + + for (var i = 32; i < 123; ++i) { + + if ((i >= 97) || // a-z + (i >= 65 && i <= 90) || // A-Z + (i >= 48 && i <= 57) || // 0-9 + i === 32 || // space + i === 46 || // . + i === 44 || // , + i === 45 || // - + i === 58 || // : + i === 95) { // _ + + safe[i] = null; + } + } + + return safe; +}()); diff --git a/node_modules/hapi/node_modules/hoek/lib/index.js b/node_modules/hapi/node_modules/hoek/lib/index.js new file mode 100755 index 0000000..368e19c --- /dev/null +++ b/node_modules/hapi/node_modules/hoek/lib/index.js @@ -0,0 +1,932 @@ +// Load modules + +var Crypto = require('crypto'); +var Path = require('path'); +var Util = require('util'); +var Escape = require('./escape'); + + +// Declare internals + +var internals = {}; + + +// Clone object or array + +exports.clone = function (obj, seen) { + + if (typeof obj !== 'object' || + obj === null) { + + return obj; + } + + seen = seen || { orig: [], copy: [] }; + + var lookup = seen.orig.indexOf(obj); + if (lookup !== -1) { + return seen.copy[lookup]; + } + + var newObj; + var cloneDeep = false; + + if (!Array.isArray(obj)) { + if (Buffer.isBuffer(obj)) { + newObj = new Buffer(obj); + } + else if (obj instanceof Date) { + newObj = new Date(obj.getTime()); + } + else if (obj instanceof RegExp) { + newObj = new RegExp(obj); + } + else { + var proto = Object.getPrototypeOf(obj); + if (!proto || proto.isImmutable) { + newObj = obj; + } + else { + newObj = Object.create(proto); + cloneDeep = true; + } + } + } + else { + newObj = []; + cloneDeep = true; + } + + seen.orig.push(obj); + seen.copy.push(newObj); + + if (cloneDeep) { + var keys = Object.getOwnPropertyNames(obj); + for (var i = 0, il = keys.length; i < il; ++i) { + var key = keys[i]; + var descriptor = Object.getOwnPropertyDescriptor(obj, key); + if (descriptor.get || + descriptor.set) { + + Object.defineProperty(newObj, key, descriptor); + } + else { + newObj[key] = exports.clone(obj[key], seen); + } + } + } + + return newObj; +}; + + +// Merge all the properties of source into target, source wins in conflict, and by default null and undefined from source are applied + +exports.merge = function (target, source, isNullOverride /* = true */, isMergeArrays /* = true */) { + + exports.assert(target && typeof target === 'object', 'Invalid target value: must be an object'); + exports.assert(source === null || source === undefined || typeof source === 'object', 'Invalid source value: must be null, undefined, or an object'); + + if (!source) { + return target; + } + + if (Array.isArray(source)) { + exports.assert(Array.isArray(target), 'Cannot merge array onto an object'); + if (isMergeArrays === false) { // isMergeArrays defaults to true + target.length = 0; // Must not change target assignment + } + + for (var i = 0, il = source.length; i < il; ++i) { + target.push(exports.clone(source[i])); + } + + return target; + } + + var keys = Object.keys(source); + for (var k = 0, kl = keys.length; k < kl; ++k) { + var key = keys[k]; + var value = source[key]; + if (value && + typeof value === 'object') { + + if (!target[key] || + typeof target[key] !== 'object' || + (Array.isArray(target[key]) ^ Array.isArray(value)) || + value instanceof Date || + Buffer.isBuffer(value) || + value instanceof RegExp) { + + target[key] = exports.clone(value); + } + else { + exports.merge(target[key], value, isNullOverride, isMergeArrays); + } + } + else { + if (value !== null && + value !== undefined) { // Explicit to preserve empty strings + + target[key] = value; + } + else if (isNullOverride !== false) { // Defaults to true + target[key] = value; + } + } + } + + return target; +}; + + +// Apply options to a copy of the defaults + +exports.applyToDefaults = function (defaults, options) { + + exports.assert(defaults && typeof defaults === 'object', 'Invalid defaults value: must be an object'); + exports.assert(!options || options === true || typeof options === 'object', 'Invalid options value: must be true, falsy or an object'); + + if (!options) { // If no options, return null + return null; + } + + var copy = exports.clone(defaults); + + if (options === true) { // If options is set to true, use defaults + return copy; + } + + return exports.merge(copy, options, false, false); +}; + + +// Clone an object except for the listed keys which are shallow copied + +exports.cloneWithShallow = function (source, keys) { + + if (!source || + typeof source !== 'object') { + + return source; + } + + var storage = internals.store(source, keys); // Move shallow copy items to storage + var copy = exports.clone(source); // Deep copy the rest + internals.restore(copy, source, storage); // Shallow copy the stored items and restore + return copy; +}; + + +internals.store = function (source, keys) { + + var storage = {}; + for (var i = 0, il = keys.length; i < il; ++i) { + var key = keys[i]; + var value = exports.reach(source, key); + if (value !== undefined) { + storage[key] = value; + internals.reachSet(source, key, undefined); + } + } + + return storage; +}; + + +internals.restore = function (copy, source, storage) { + + var keys = Object.keys(storage); + for (var i = 0, il = keys.length; i < il; ++i) { + var key = keys[i]; + internals.reachSet(copy, key, storage[key]); + internals.reachSet(source, key, storage[key]); + } +}; + + +internals.reachSet = function (obj, key, value) { + + var path = key.split('.'); + var ref = obj; + for (var i = 0, il = path.length; i < il; ++i) { + var segment = path[i]; + if (i + 1 === il) { + ref[segment] = value; + } + + ref = ref[segment]; + } +}; + + +// Apply options to defaults except for the listed keys which are shallow copied from option without merging + +exports.applyToDefaultsWithShallow = function (defaults, options, keys) { + + exports.assert(defaults && typeof defaults === 'object', 'Invalid defaults value: must be an object'); + exports.assert(!options || options === true || typeof options === 'object', 'Invalid options value: must be true, falsy or an object'); + exports.assert(keys && Array.isArray(keys), 'Invalid keys'); + + if (!options) { // If no options, return null + return null; + } + + var copy = exports.cloneWithShallow(defaults, keys); + + if (options === true) { // If options is set to true, use defaults + return copy; + } + + var storage = internals.store(options, keys); // Move shallow copy items to storage + exports.merge(copy, options, false, false); // Deep copy the rest + internals.restore(copy, options, storage); // Shallow copy the stored items and restore + return copy; +}; + + +// Deep object or array comparison + +exports.deepEqual = function (obj, ref, seen) { + + var type = typeof obj; + if (type !== typeof ref) { + return false; + } + + if (type !== 'object' || + obj === null || + ref === null) { + + if (obj === ref) { // Copied from Deep-eql, copyright(c) 2013 Jake Luer, jake@alogicalparadox.com, MIT Licensed, https://github.com/chaijs/deep-eql + return obj !== 0 || 1 / obj === 1 / ref; // -0 / +0 + } + + return obj !== obj && ref !== ref; // NaN + } + + seen = seen || []; + if (seen.indexOf(obj) !== -1) { + return true; // If previous comparison failed, it would have stopped execution + } + + seen.push(obj); + + if (Array.isArray(obj)) { + if (!Array.isArray(ref)) { + return false; + } + + if (obj.length !== ref.length) { + return false; + } + + for (var i = 0, il = obj.length; i < il; ++i) { + if (!exports.deepEqual(obj[i], ref[i])) { + return false; + } + } + + return true; + } + + if (Buffer.isBuffer(obj)) { + if (!Buffer.isBuffer(ref)) { + return false; + } + + if (obj.length !== ref.length) { + return false; + } + + for (var j = 0, jl = obj.length; j < jl; ++j) { + if (obj[j] !== ref[j]) { + return false; + } + } + + return true; + } + + if (obj instanceof Date) { + return (ref instanceof Date && obj.getTime() === ref.getTime()); + } + + if (obj instanceof RegExp) { + return (ref instanceof RegExp && obj.toString() === ref.toString()); + } + + if (Object.getPrototypeOf(obj) !== Object.getPrototypeOf(ref)) { + return false; + } + + var keys = Object.getOwnPropertyNames(obj); + + if (keys.length !== Object.getOwnPropertyNames(ref).length) { + return false; + } + + for (var k = 0, kl = keys.length; k < kl; ++k) { + var key = keys[k]; + var descriptor = Object.getOwnPropertyDescriptor(obj, key); + if (descriptor.get) { + if (!exports.deepEqual(descriptor, Object.getOwnPropertyDescriptor(ref, key), seen)) { + return false; + } + } + else if (!exports.deepEqual(obj[key], ref[key], seen)) { + return false; + } + } + + return true; +}; + + +// Remove duplicate items from array + +exports.unique = function (array, key) { + + var index = {}; + var result = []; + + for (var i = 0, il = array.length; i < il; ++i) { + var id = (key ? array[i][key] : array[i]); + if (index[id] !== true) { + + result.push(array[i]); + index[id] = true; + } + } + + return result; +}; + + +// Convert array into object + +exports.mapToObject = function (array, key) { + + if (!array) { + return null; + } + + var obj = {}; + for (var i = 0, il = array.length; i < il; ++i) { + if (key) { + if (array[i][key]) { + obj[array[i][key]] = true; + } + } + else { + obj[array[i]] = true; + } + } + + return obj; +}; + + +// Find the common unique items in two arrays + +exports.intersect = function (array1, array2, justFirst) { + + if (!array1 || !array2) { + return []; + } + + var common = []; + var hash = (Array.isArray(array1) ? exports.mapToObject(array1) : array1); + var found = {}; + for (var i = 0, il = array2.length; i < il; ++i) { + if (hash[array2[i]] && !found[array2[i]]) { + if (justFirst) { + return array2[i]; + } + + common.push(array2[i]); + found[array2[i]] = true; + } + } + + return (justFirst ? null : common); +}; + + +// Test if the reference contains the values + +exports.contain = function (ref, values, options) { + + /* + string -> string(s) + array -> item(s) + object -> key(s) + object -> object (key:value) + */ + + var valuePairs = null; + if (typeof ref === 'object' && + typeof values === 'object' && + !Array.isArray(ref) && + !Array.isArray(values)) { + + valuePairs = values; + values = Object.keys(values); + } + else { + values = [].concat(values); + } + + options = options || {}; // deep, once, only, part + + exports.assert(arguments.length >= 2, 'Insufficient arguments'); + exports.assert(typeof ref === 'string' || typeof ref === 'object', 'Reference must be string or an object'); + exports.assert(values.length, 'Values array cannot be empty'); + + var compare = options.deep ? exports.deepEqual : function (a, b) { return a === b; }; + + var misses = false; + var matches = new Array(values.length); + for (var i = 0, il = matches.length; i < il; ++i) { + matches[i] = 0; + } + + if (typeof ref === 'string') { + var pattern = '('; + for (i = 0, il = values.length; i < il; ++i) { + var value = values[i]; + exports.assert(typeof value === 'string', 'Cannot compare string reference to non-string value'); + pattern += (i ? '|' : '') + exports.escapeRegex(value); + } + + var regex = new RegExp(pattern + ')', 'g'); + var leftovers = ref.replace(regex, function ($0, $1) { + + var index = values.indexOf($1); + ++matches[index]; + return ''; // Remove from string + }); + + misses = !!leftovers; + } + else if (Array.isArray(ref)) { + for (i = 0, il = ref.length; i < il; ++i) { + for (var j = 0, jl = values.length, matched = false; j < jl && matched === false; ++j) { + matched = compare(ref[i], values[j]) && j; + } + + if (matched !== false) { + ++matches[matched]; + } + else { + misses = true; + } + } + } + else { + var keys = Object.keys(ref); + for (i = 0, il = keys.length; i < il; ++i) { + var key = keys[i]; + var pos = values.indexOf(key); + if (pos !== -1) { + if (valuePairs && + !compare(ref[key], valuePairs[key])) { + + return false; + } + + ++matches[pos]; + } + else { + misses = true; + } + } + } + + var result = false; + for (i = 0, il = matches.length; i < il; ++i) { + result = result || !!matches[i]; + if ((options.once && matches[i] > 1) || + (!options.part && !matches[i])) { + + return false; + } + } + + if (options.only && + misses) { + + return false; + } + + return result; +}; + + +// Flatten array + +exports.flatten = function (array, target) { + + var result = target || []; + + for (var i = 0, il = array.length; i < il; ++i) { + if (Array.isArray(array[i])) { + exports.flatten(array[i], result); + } + else { + result.push(array[i]); + } + } + + return result; +}; + + +// Convert an object key chain string ('a.b.c') to reference (object[a][b][c]) + +exports.reach = function (obj, chain, options) { + + options = options || {}; + if (typeof options === 'string') { + options = { separator: options }; + } + + var path = chain.split(options.separator || '.'); + var ref = obj; + for (var i = 0, il = path.length; i < il; ++i) { + var key = path[i]; + if (key[0] === '-' && Array.isArray(ref)) { + key = key.slice(1, key.length); + key = ref.length - key; + } + + if (!ref || + !ref.hasOwnProperty(key) || + (typeof ref !== 'object' && options.functions === false)) { // Only object and function can have properties + + exports.assert(!options.strict || i + 1 === il, 'Missing segment', key, 'in reach path ', chain); + exports.assert(typeof ref === 'object' || options.functions === true || typeof ref !== 'function', 'Invalid segment', key, 'in reach path ', chain); + ref = options.default; + break; + } + + ref = ref[key]; + } + + return ref; +}; + + +exports.formatStack = function (stack) { + + var trace = []; + for (var i = 0, il = stack.length; i < il; ++i) { + var item = stack[i]; + trace.push([item.getFileName(), item.getLineNumber(), item.getColumnNumber(), item.getFunctionName(), item.isConstructor()]); + } + + return trace; +}; + + +exports.formatTrace = function (trace) { + + var display = []; + + for (var i = 0, il = trace.length; i < il; ++i) { + var row = trace[i]; + display.push((row[4] ? 'new ' : '') + row[3] + ' (' + row[0] + ':' + row[1] + ':' + row[2] + ')'); + } + + return display; +}; + + +exports.callStack = function (slice) { + + // http://code.google.com/p/v8/wiki/JavaScriptStackTraceApi + + var v8 = Error.prepareStackTrace; + Error.prepareStackTrace = function (err, stack) { + + return stack; + }; + + var capture = {}; + Error.captureStackTrace(capture, arguments.callee); /*eslint no-caller:0 */ + var stack = capture.stack; + + Error.prepareStackTrace = v8; + + var trace = exports.formatStack(stack); + + if (slice) { + return trace.slice(slice); + } + + return trace; +}; + + +exports.displayStack = function (slice) { + + var trace = exports.callStack(slice === undefined ? 1 : slice + 1); + + return exports.formatTrace(trace); +}; + + +exports.abortThrow = false; + + +exports.abort = function (message, hideStack) { + + if (process.env.NODE_ENV === 'test' || exports.abortThrow === true) { + throw new Error(message || 'Unknown error'); + } + + var stack = ''; + if (!hideStack) { + stack = exports.displayStack(1).join('\n\t'); + } + console.log('ABORT: ' + message + '\n\t' + stack); + process.exit(1); +}; + + +exports.assert = function (condition /*, msg1, msg2, msg3 */) { + + if (condition) { + return; + } + + if (arguments.length === 2 && arguments[1] instanceof Error) { + throw arguments[1]; + } + + var msgs = []; + for (var i = 1, il = arguments.length; i < il; ++i) { + if (arguments[i] !== '') { + msgs.push(arguments[i]); // Avoids Array.slice arguments leak, allowing for V8 optimizations + } + } + + msgs = msgs.map(function (msg) { + + return typeof msg === 'string' ? msg : msg instanceof Error ? msg.message : exports.stringify(msg); + }); + throw new Error(msgs.join(' ') || 'Unknown error'); +}; + + +exports.Timer = function () { + + this.ts = 0; + this.reset(); +}; + + +exports.Timer.prototype.reset = function () { + + this.ts = Date.now(); +}; + + +exports.Timer.prototype.elapsed = function () { + + return Date.now() - this.ts; +}; + + +exports.Bench = function () { + + this.ts = 0; + this.reset(); +}; + + +exports.Bench.prototype.reset = function () { + + this.ts = exports.Bench.now(); +}; + + +exports.Bench.prototype.elapsed = function () { + + return exports.Bench.now() - this.ts; +}; + + +exports.Bench.now = function () { + + var ts = process.hrtime(); + return (ts[0] * 1e3) + (ts[1] / 1e6); +}; + + +// Escape string for Regex construction + +exports.escapeRegex = function (string) { + + // Escape ^$.*+-?=!:|\/()[]{}, + return string.replace(/[\^\$\.\*\+\-\?\=\!\:\|\\\/\(\)\[\]\{\}\,]/g, '\\$&'); +}; + + +// Base64url (RFC 4648) encode + +exports.base64urlEncode = function (value, encoding) { + + var buf = (Buffer.isBuffer(value) ? value : new Buffer(value, encoding || 'binary')); + return buf.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/\=/g, ''); +}; + + +// Base64url (RFC 4648) decode + +exports.base64urlDecode = function (value, encoding) { + + if (value && + !/^[\w\-]*$/.test(value)) { + + return new Error('Invalid character'); + } + + try { + var buf = new Buffer(value, 'base64'); + return (encoding === 'buffer' ? buf : buf.toString(encoding || 'binary')); + } + catch (err) { + return err; + } +}; + + +// Escape attribute value for use in HTTP header + +exports.escapeHeaderAttribute = function (attribute) { + + // Allowed value characters: !#$%&'()*+,-./:;<=>?@[]^_`{|}~ and space, a-z, A-Z, 0-9, \, " + + exports.assert(/^[ \w\!#\$%&'\(\)\*\+,\-\.\/\:;<\=>\?@\[\]\^`\{\|\}~\"\\]*$/.test(attribute), 'Bad attribute value (' + attribute + ')'); + + return attribute.replace(/\\/g, '\\\\').replace(/\"/g, '\\"'); // Escape quotes and slash +}; + + +exports.escapeHtml = function (string) { + + return Escape.escapeHtml(string); +}; + + +exports.escapeJavaScript = function (string) { + + return Escape.escapeJavaScript(string); +}; + + +exports.nextTick = function (callback) { + + return function () { + + var args = arguments; + process.nextTick(function () { + + callback.apply(null, args); + }); + }; +}; + + +exports.once = function (method) { + + if (method._hoekOnce) { + return method; + } + + var once = false; + var wrapped = function () { + + if (!once) { + once = true; + method.apply(null, arguments); + } + }; + + wrapped._hoekOnce = true; + + return wrapped; +}; + + +exports.isAbsolutePath = function (path, platform) { + + if (!path) { + return false; + } + + if (Path.isAbsolute) { // node >= 0.11 + return Path.isAbsolute(path); + } + + platform = platform || process.platform; + + // Unix + + if (platform !== 'win32') { + return path[0] === '/'; + } + + // Windows + + return !!/^(?:[a-zA-Z]:[\\\/])|(?:[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/])/.test(path); // C:\ or \\something\something +}; + + +exports.isInteger = function (value) { + + return (typeof value === 'number' && + parseFloat(value) === parseInt(value, 10) && + !isNaN(value)); +}; + + +exports.ignore = function () { }; + + +exports.inherits = Util.inherits; + + +exports.format = Util.format; + + +exports.transform = function (source, transform, options) { + + exports.assert(source === null || source === undefined || typeof source === 'object', 'Invalid source object: must be null, undefined, or an object'); + + var result = {}; + var keys = Object.keys(transform); + + for (var k = 0, kl = keys.length; k < kl; ++k) { + var key = keys[k]; + var path = key.split('.'); + var sourcePath = transform[key]; + + exports.assert(typeof sourcePath === 'string', 'All mappings must be "." delineated strings'); + + var segment; + var res = result; + + while (path.length > 1) { + segment = path.shift(); + if (!res[segment]) { + res[segment] = {}; + } + res = res[segment]; + } + segment = path.shift(); + res[segment] = exports.reach(source, sourcePath, options); + } + + return result; +}; + + +exports.uniqueFilename = function (path, extension) { + + if (extension) { + extension = extension[0] !== '.' ? '.' + extension : extension; + } + else { + extension = ''; + } + + path = Path.resolve(path); + var name = [Date.now(), process.pid, Crypto.randomBytes(8).toString('hex')].join('-') + extension; + return Path.join(path, name); +}; + + +exports.stringify = function () { + + try { + return JSON.stringify.apply(null, arguments); + } + catch (err) { + return '[Cannot display object: ' + err.message + ']'; + } +}; + + +exports.shallow = function (source) { + + var target = {}; + var keys = Object.keys(source); + for (var i = 0, il = keys.length; i < il; ++i) { + var key = keys[i]; + target[key] = source[key]; + } + + return target; +}; diff --git a/node_modules/hapi/node_modules/hoek/package.json b/node_modules/hapi/node_modules/hoek/package.json new file mode 100644 index 0000000..dcbe8bf --- /dev/null +++ b/node_modules/hapi/node_modules/hoek/package.json @@ -0,0 +1,41 @@ +{ + "name": "hoek", + "description": "General purpose node utilities", + "version": "2.11.1", + "repository": { + "type": "git", + "url": "git://github.com/hapijs/hoek" + }, + "main": "index", + "keywords": [ + "utilities" + ], + "engines": { + "node": ">=0.8.0" + }, + "dependencies": {}, + "devDependencies": { + "code": "1.x.x", + "lab": "5.x.x" + }, + "scripts": { + "test": "make test-cov" + }, + "licenses": [ + { + "type": "BSD", + "url": "http://github.com/hapijs/hoek/raw/master/LICENSE" + } + ], + "readme": "![hoek Logo](https://raw.github.com/hapijs/hoek/master/images/hoek.png)\n\nUtility methods for the hapi ecosystem. This module is not intended to solve every problem for everyone, but rather as a central place to store hapi-specific methods. If you're looking for a general purpose utility module, check out [lodash](https://github.com/lodash/lodash) or [underscore](https://github.com/jashkenas/underscore).\n\n[![Build Status](https://secure.travis-ci.org/hapijs/hoek.png)](http://travis-ci.org/hapijs/hoek)\n\nLead Maintainer: [Nathan LaFreniere](https://github.com/nlf)\n\n# Table of Contents\n\n* [Introduction](#introduction \"Introduction\")\n* [Object](#object \"Object\")\n * [clone](#cloneobj \"clone\")\n * [cloneWithShallow](#clonewithshallowobj-keys \"cloneWithShallow\")\n * [merge](#mergetarget-source-isnulloverride-ismergearrays \"merge\")\n * [applyToDefaults](#applytodefaultsdefaults-options \"applyToDefaults\")\n * [applyToDefaultsWithShallow](#applytodefaultswithshallowdefaults-options-keys \"applyToDefaultsWithShallow\")\n * [deepEqual](#deepequala-b \"deepEqual\")\n * [unique](#uniquearray-key \"unique\")\n * [mapToObject](#maptoobjectarray-key \"mapToObject\")\n * [intersect](#intersectarray1-array2 \"intersect\")\n * [contain](#containref-values-options \"contain\")\n * [flatten](#flattenarray-target \"flatten\")\n * [reach](#reachobj-chain-options \"reach\")\n * [transform](#transformobj-transform-options \"transform\")\n * [shallow](#shallowobj \"shallow\")\n * [stringify](#stringifyobj \"stringify\")\n* [Timer](#timer \"Timer\")\n* [Bench](#bench \"Bench\")\n* [Binary Encoding/Decoding](#binary-encodingdecoding \"Binary Encoding/Decoding\")\n * [base64urlEncode](#base64urlencodevalue \"binary64urlEncode\")\n * [base64urlDecode](#base64urldecodevalue \"binary64urlDecode\")\n* [Escaping Characters](#escaping-characters \"Escaping Characters\")\n * [escapeHtml](#escapehtmlstring \"escapeHtml\")\n * [escapeHeaderAttribute](#escapeheaderattributeattribute \"escapeHeaderAttribute\")\n * [escapeRegex](#escaperegexstring \"escapeRegex\")\n* [Errors](#errors \"Errors\")\n * [assert](#assertcondition-message \"assert\")\n * [abort](#abortmessage \"abort\")\n * [displayStack](#displaystackslice \"displayStack\")\n * [callStack](#callstackslice \"callStack\")\n* [Function](#function \"Function\")\n * [nextTick](#nexttickfn \"nextTick\")\n * [once](#oncefn \"once\")\n * [ignore](#ignore \"ignore\")\n* [Miscellaneous](#miscellaneous \"Miscellaneous\")\n * [uniqueFilename](#uniquefilename \"uniqueFilename\")\n * [isInteger](#isInteger \"isInteger\")\n\n\n\n# Introduction\n\nThe *Hoek* library contains some common functions used within the hapi ecosystem. It comes with useful methods for Arrays (clone, merge, applyToDefaults), Objects (removeKeys, copy), Asserting and more.\n\nFor example, to use Hoek to set configuration with default options:\n```javascript\nvar Hoek = require('hoek');\n\nvar default = {url : \"www.github.com\", port : \"8000\", debug : true};\n\nvar config = Hoek.applyToDefaults(default, {port : \"3000\", admin : true});\n\n// In this case, config would be { url: 'www.github.com', port: '3000', debug: true, admin: true }\n```\n\nUnder each of the sections (such as Array), there are subsections which correspond to Hoek methods. Each subsection will explain how to use the corresponding method. In each js excerpt below, the `var Hoek = require('hoek');` is omitted for brevity.\n\n## Object\n\nHoek provides several helpful methods for objects and arrays.\n\n### clone(obj)\n\nThis method is used to clone an object or an array. A *deep copy* is made (duplicates everything, including values that are objects).\n\n```javascript\n\nvar nestedObj = {\n w: /^something$/ig,\n x: {\n a: [1, 2, 3],\n b: 123456,\n c: new Date()\n },\n y: 'y',\n z: new Date()\n };\n\nvar copy = Hoek.clone(nestedObj);\n\ncopy.x.b = 100;\n\nconsole.log(copy.y); // results in 'y'\nconsole.log(nestedObj.x.b); // results in 123456\nconsole.log(copy.x.b); // results in 100\n```\n\n### cloneWithShallow(obj, keys)\nkeys is an array of key names to shallow copy\n\nThis method is also used to clone an object or array, however any keys listed in the `keys` array are shallow copied while those not listed are deep copied.\n\n```javascript\n\nvar nestedObj = {\n w: /^something$/ig,\n x: {\n a: [1, 2, 3],\n b: 123456,\n c: new Date()\n },\n y: 'y',\n z: new Date()\n };\n\nvar copy = Hoek.cloneWithShallow(nestedObj, ['x']);\n\ncopy.x.b = 100;\n\nconsole.log(copy.y); // results in 'y'\nconsole.log(nestedObj.x.b); // results in 100\nconsole.log(copy.x.b); // results in 100\n```\n\n### merge(target, source, isNullOverride, isMergeArrays)\nisNullOverride, isMergeArrays default to true\n\nMerge all the properties of source into target, source wins in conflict, and by default null and undefined from source are applied.\nMerge is destructive where the target is modified. For non destructive merge, use `applyToDefaults`.\n\n\n```javascript\n\nvar target = {a: 1, b : 2};\nvar source = {a: 0, c: 5};\nvar source2 = {a: null, c: 5};\n\nHoek.merge(target, source); // results in {a: 0, b: 2, c: 5}\nHoek.merge(target, source2); // results in {a: null, b: 2, c: 5}\nHoek.merge(target, source2, false); // results in {a: 1, b: 2, c: 5}\n\nvar targetArray = [1, 2, 3];\nvar sourceArray = [4, 5];\n\nHoek.merge(targetArray, sourceArray); // results in [1, 2, 3, 4, 5]\nHoek.merge(targetArray, sourceArray, true, false); // results in [4, 5]\n```\n\n### applyToDefaults(defaults, options)\n\nApply options to a copy of the defaults\n\n```javascript\n\nvar defaults = { host: \"localhost\", port: 8000 };\nvar options = { port: 8080 };\n\nvar config = Hoek.applyToDefaults(defaults, options); // results in { host: \"localhost\", port: 8080 }\n```\n\n### applyToDefaultsWithShallow(defaults, options, keys)\nkeys is an array of key names to shallow copy\n\nApply options to a copy of the defaults. Keys specified in the last parameter are shallow copied from options instead of merged.\n\n```javascript\n\nvar defaults = {\n server: {\n host: \"localhost\",\n port: 8000\n },\n name: 'example'\n };\n\nvar options = { server: { port: 8080 } };\n\nvar config = Hoek.applyToDefaults(defaults, options); // results in { server: { port: 8080 }, name: 'example' }\n```\n\n### deepEqual(b, a)\n\nPerforms a deep comparison of the two values including support for circular dependencies, prototype, and properties.\n\n```javascript\nHoek.deepEqual({ a: [1, 2], b: 'string', c: { d: true } }, { a: [1, 2], b: 'string', c: { d: true } });\n```\n\n### unique(array, key)\n\nRemove duplicate items from Array\n\n```javascript\n\nvar array = [1, 2, 2, 3, 3, 4, 5, 6];\n\nvar newArray = Hoek.unique(array); // results in [1,2,3,4,5,6]\n\narray = [{id: 1}, {id: 1}, {id: 2}];\n\nnewArray = Hoek.unique(array, \"id\"); // results in [{id: 1}, {id: 2}]\n```\n\n### mapToObject(array, key)\n\nConvert an Array into an Object\n\n```javascript\n\nvar array = [1,2,3];\nvar newObject = Hoek.mapToObject(array); // results in [{\"1\": true}, {\"2\": true}, {\"3\": true}]\n\narray = [{id: 1}, {id: 2}];\nnewObject = Hoek.mapToObject(array, \"id\"); // results in [{\"id\": 1}, {\"id\": 2}]\n```\n\n### intersect(array1, array2)\n\nFind the common unique items in two arrays\n\n```javascript\n\nvar array1 = [1, 2, 3];\nvar array2 = [1, 4, 5];\n\nvar newArray = Hoek.intersect(array1, array2); // results in [1]\n```\n\n### contain(ref, values, [options])\n\nTests if the reference value contains the provided values where:\n- `ref` - the reference string, array, or object.\n- `values` - a single or array of values to find within the `ref` value. If `ref` is an object, `values` can be a key name,\n an array of key names, or an object with key-value pairs to compare.\n- `options` - an optional object with the following optional settings:\n - `deep` - if `true`, performed a deep comparison of the values.\n - `once` - if `true`, allows only one occurrence of each value.\n - `only` - if `true`, does not allow values not explicitly listed.\n - `part` - if `true`, allows partial match of the values (at least one must always match).\n\nNote: comparing a string to overlapping values will result in failed comparison (e.g. `contain('abc', ['ab', 'bc'])`).\nAlso, if an object key's value does not match the provided value, `false` is returned even when `part` is specified.\n\n```javascript\nHoek.contain('aaa', 'a', { only: true });\t\t\t\t\t\t\t// true\nHoek.contain([{ a: 1 }], [{ a: 1 }], { deep: true });\t\t\t\t// true\nHoek.contain([1, 2, 2], [1, 2], { once: true });\t\t\t\t\t// false\nHoek.contain({ a: 1, b: 2, c: 3 }, { a: 1, d: 4 }, { part: true }); // true\n```\n\n### flatten(array, [target])\n\nFlatten an array\n\n```javascript\n\nvar array = [1, [2, 3]];\n\nvar flattenedArray = Hoek.flatten(array); // results in [1, 2, 3]\n\narray = [1, [2, 3]];\ntarget = [4, [5]];\n\nflattenedArray = Hoek.flatten(array, target); // results in [4, [5], 1, 2, 3]\n```\n\n### reach(obj, chain, [options])\n\nConverts an object key chain string to reference\n\n- `options` - optional settings\n - `separator` - string to split chain path on, defaults to '.'\n - `default` - value to return if the path or value is not present, default is `undefined`\n - `strict` - if `true`, will throw an error on missing member, default is `false`\n - `functions` - if `true` allow traversing functions for properties. `false` will throw an error if a function is part of the chain.\n\nA chain including negative numbers will work like negative indices on an\narray.\n\n```javascript\n\nvar chain = 'a.b.c';\nvar obj = {a : {b : { c : 1}}};\n\nHoek.reach(obj, chain); // returns 1\n\nvar chain = 'a.b.-1';\nvar obj = {a : {b : [2,3,6]}};\n\nHoek.reach(obj, chain); // returns 6\n```\n\n### transform(obj, transform, [options])\n\nTransforms an existing object into a new one based on the supplied `obj` and `transform` map. `options` are the same as the `reach` options.\n\n```javascript\nvar source = {\n address: {\n one: '123 main street',\n two: 'PO Box 1234'\n },\n title: 'Warehouse',\n state: 'CA'\n};\n\nvar result = Hoek.transform(source, {\n 'person.address.lineOne': 'address.one',\n 'person.address.lineTwo': 'address.two',\n 'title': 'title',\n 'person.address.region': 'state'\n});\n// Results in\n// {\n// person: {\n// address: {\n// lineOne: '123 main street',\n// lineTwo: 'PO Box 1234',\n// region: 'CA'\n// }\n// },\n// title: 'Warehouse'\n// }\n```\n\n### shallow(obj)\n\nPerforms a shallow copy by copying the references of all the top level children where:\n- `obj` - the object to be copied.\n\n```javascript\nvar shallow = Hoek.shallow({ a: { b: 1 } });\n```\n\n### stringify(obj)\n\nConverts an object to string using the built-in `JSON.stringify()` method with the difference that any errors are caught\nand reported back in the form of the returned string. Used as a shortcut for displaying information to the console (e.g. in\nerror message) without the need to worry about invalid conversion.\n\n```javascript\nvar a = {};\na.b = a;\nHoek.stringify(a);\t\t// Returns '[Cannot display object: Converting circular structure to JSON]'\n```\n\n# Timer\n\nA Timer object. Initializing a new timer object sets the ts to the number of milliseconds elapsed since 1 January 1970 00:00:00 UTC.\n\n```javascript\n\nvar timerObj = new Hoek.Timer();\nconsole.log(\"Time is now: \" + timerObj.ts);\nconsole.log(\"Elapsed time from initialization: \" + timerObj.elapsed() + 'milliseconds');\n```\n\n\n# Bench\n\nSame as Timer with the exception that `ts` stores the internal node clock which is not related to `Date.now()` and cannot be used to display\nhuman-readable timestamps. More accurate for benchmarking or internal timers.\n\n# Binary Encoding/Decoding\n\n### base64urlEncode(value)\n\nEncodes value in Base64 or URL encoding\n\n### base64urlDecode(value)\n\nDecodes data in Base64 or URL encoding.\n# Escaping Characters\n\nHoek provides convenient methods for escaping html characters. The escaped characters are as followed:\n\n```javascript\n\ninternals.htmlEscaped = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '`': '`'\n};\n```\n\n### escapeHtml(string)\n\n```javascript\n\nvar string = ' hey ';\nvar escapedString = Hoek.escapeHtml(string); // returns <html> hey </html>\n```\n\n### escapeHeaderAttribute(attribute)\n\nEscape attribute value for use in HTTP header\n\n```javascript\n\nvar a = Hoek.escapeHeaderAttribute('I said \"go w\\\\o me\"'); //returns I said \\\"go w\\\\o me\\\"\n```\n\n\n### escapeRegex(string)\n\nEscape string for Regex construction\n\n```javascript\n\nvar a = Hoek.escapeRegex('4^f$s.4*5+-_?%=#!:@|~\\\\/`\"(>)[<]d{}s,'); // returns 4\\^f\\$s\\.4\\*5\\+\\-_\\?%\\=#\\!\\:@\\|~\\\\\\/`\"\\(>\\)\\[<\\]d\\{\\}s\\,\n```\n\n# Errors\n\n### assert(condition, message)\n\n```javascript\n\nvar a = 1, b = 2;\n\nHoek.assert(a === b, 'a should equal b'); // Throws 'a should equal b'\n```\n\nNote that you may also pass an already created Error object as the second parameter, and `assert` will throw that object.\n\n```javascript\n\nvar a = 1, b = 2;\n\nHoek.assert(a === b, new Error('a should equal b')); // Throws the given error object\n```\n\n### abort(message)\n\nFirst checks if `process.env.NODE_ENV === 'test'`, and if so, throws error message. Otherwise,\ndisplays most recent stack and then exits process.\n\n\n\n### displayStack(slice)\n\nDisplays the trace stack\n\n```javascript\n\nvar stack = Hoek.displayStack();\nconsole.log(stack); // returns something like:\n\n[ 'null (/Users/user/Desktop/hoek/test.js:4:18)',\n 'Module._compile (module.js:449:26)',\n 'Module._extensions..js (module.js:467:10)',\n 'Module.load (module.js:356:32)',\n 'Module._load (module.js:312:12)',\n 'Module.runMain (module.js:492:10)',\n 'startup.processNextTick.process._tickCallback (node.js:244:9)' ]\n```\n\n### callStack(slice)\n\nReturns a trace stack array.\n\n```javascript\n\nvar stack = Hoek.callStack();\nconsole.log(stack); // returns something like:\n\n[ [ '/Users/user/Desktop/hoek/test.js', 4, 18, null, false ],\n [ 'module.js', 449, 26, 'Module._compile', false ],\n [ 'module.js', 467, 10, 'Module._extensions..js', false ],\n [ 'module.js', 356, 32, 'Module.load', false ],\n [ 'module.js', 312, 12, 'Module._load', false ],\n [ 'module.js', 492, 10, 'Module.runMain', false ],\n [ 'node.js',\n 244,\n 9,\n 'startup.processNextTick.process._tickCallback',\n false ] ]\n```\n\n## Function\n\n### nextTick(fn)\n\nReturns a new function that wraps `fn` in `process.nextTick`.\n\n```javascript\n\nvar myFn = function () {\n console.log('Do this later');\n};\n\nvar nextFn = Hoek.nextTick(myFn);\n\nnextFn();\nconsole.log('Do this first');\n\n// Results in:\n// \n// Do this first\n// Do this later\n```\n\n### once(fn)\n\nReturns a new function that can be run multiple times, but makes sure `fn` is only run once.\n\n```javascript\n\nvar myFn = function () {\n console.log('Ran myFn');\n};\n\nvar onceFn = Hoek.once(myFn);\nonceFn(); // results in \"Ran myFn\"\nonceFn(); // results in undefined\n```\n\n### ignore\n\nA simple no-op function. It does nothing at all.\n\n## Miscellaneous\n\n### uniqueFilename(path, extension)\n`path` to prepend with the randomly generated file name. `extension` is the optional file extension, defaults to `''`.\n\nReturns a randomly generated file name at the specified `path`. The result is a fully resolved path to a file.\n\n```javascript\nvar result = Hoek.uniqueFilename('./test/modules', 'txt'); // results in \"full/path/test/modules/{random}.txt\"\n```\n\n### isInteger(value)\n\nCheck `value` to see if it is an integer. Returns true/false.\n\n```javascript\nvar result = Hoek.isInteger('23')\n```\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/hapijs/hoek/issues" + }, + "_id": "hoek@2.11.1", + "dist": { + "shasum": "72e269455257e5f7a6111e7584bd11fd11c4908f" + }, + "_from": "hoek@2.11.1", + "_resolved": "https://registry.npmjs.org/hoek/-/hoek-2.11.1.tgz" +} diff --git a/node_modules/hapi/node_modules/hoek/test/escaper.js b/node_modules/hapi/node_modules/hoek/test/escaper.js new file mode 100755 index 0000000..a5d048f --- /dev/null +++ b/node_modules/hapi/node_modules/hoek/test/escaper.js @@ -0,0 +1,88 @@ +// Load modules + +var Code = require('code'); +var Hoek = require('../lib'); +var Lab = require('lab'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var describe = lab.experiment; +var it = lab.test; +var expect = Code.expect; + + +describe('escapeJavaScript()', function () { + + it('encodes / characters', function (done) { + + var encoded = Hoek.escapeJavaScript(''); + expect(encoded).to.equal('\\x3cscript\\x3ealert\\x281\\x29\\x3c\\x2fscript\\x3e'); + done(); + }); + + it('encodes \' characters', function (done) { + + var encoded = Hoek.escapeJavaScript('something(\'param\')'); + expect(encoded).to.equal('something\\x28\\x27param\\x27\\x29'); + done(); + }); + + it('encodes large unicode characters with the correct padding', function (done) { + + var encoded = Hoek.escapeJavaScript(String.fromCharCode(500) + String.fromCharCode(1000)); + expect(encoded).to.equal('\\u0500\\u1000'); + done(); + }); + + it('doesn\'t throw an exception when passed null', function (done) { + + var encoded = Hoek.escapeJavaScript(null); + expect(encoded).to.equal(''); + done(); + }); +}); + +describe('escapeHtml()', function () { + + it('encodes / characters', function (done) { + + var encoded = Hoek.escapeHtml(''); + expect(encoded).to.equal('<script>alert(1)</script>'); + done(); + }); + + it('encodes < and > as named characters', function (done) { + + var encoded = Hoek.escapeHtml(' + \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/examples/cms/views/edit.html b/node_modules/hapi/node_modules/vision/examples/cms/views/edit.html new file mode 100755 index 0000000..5b780ff --- /dev/null +++ b/node_modules/hapi/node_modules/vision/examples/cms/views/edit.html @@ -0,0 +1,25 @@ +

+
+
+ + +
+
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/examples/cms/views/index.html b/node_modules/hapi/node_modules/vision/examples/cms/views/index.html new file mode 100755 index 0000000..b12f5a8 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/examples/cms/views/index.html @@ -0,0 +1,34 @@ +{{#if pages}} +

Sitemap

+
    + {{#each pages}} +
  • {{this}}

  • + {{/each}} +
+{{else}} +
+ Create a page +
+
+ + +
+
+ + +
+
+ +
+
+
+ + + +{{/if}} \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/examples/cms/views/layout.html b/node_modules/hapi/node_modules/vision/examples/cms/views/layout.html new file mode 100755 index 0000000..0612ce4 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/examples/cms/views/layout.html @@ -0,0 +1,25 @@ + + + + {{title}} + + + + + + {{> nav}} +
+ {{{ content }}} +
+
+
+
+ {{> footer}} +
+
+ + \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/examples/cms/views/page.html b/node_modules/hapi/node_modules/vision/examples/cms/views/page.html new file mode 100755 index 0000000..fa42b6f --- /dev/null +++ b/node_modules/hapi/node_modules/vision/examples/cms/views/page.html @@ -0,0 +1,4 @@ +

{{page.name}}

+
+ {{{page.contents}}} +
\ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/examples/cms/views/partials/footer.html b/node_modules/hapi/node_modules/vision/examples/cms/views/partials/footer.html new file mode 100755 index 0000000..5f43518 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/examples/cms/views/partials/footer.html @@ -0,0 +1 @@ +

© @Someone 2013

\ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/examples/cms/views/partials/nav.html b/node_modules/hapi/node_modules/vision/examples/cms/views/partials/nav.html new file mode 100755 index 0000000..b0f1468 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/examples/cms/views/partials/nav.html @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/examples/handlebars/basic.js b/node_modules/hapi/node_modules/vision/examples/handlebars/basic.js new file mode 100755 index 0000000..13d8d41 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/examples/handlebars/basic.js @@ -0,0 +1,35 @@ +// Load modules + +var Hapi = require('hapi'); + + +// Declare internals + +var internals = {}; + + +var handler = function (request, reply) { + + reply.view('basic/index', { + title: 'examples/views/handlebars/basic.js | Hapi ' + Hapi.version, + message: 'Hello World!' + }); +}; + + +internals.main = function () { + + var server = new Hapi.Server(); + server.connection({ port: 8000 }); + + server.views({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates' + }); + + server.route({ method: 'GET', path: '/', handler: handler }); + server.start(); +}; + + +internals.main(); diff --git a/node_modules/hapi/node_modules/vision/examples/handlebars/layout.js b/node_modules/hapi/node_modules/vision/examples/handlebars/layout.js new file mode 100755 index 0000000..ab3d621 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/examples/handlebars/layout.js @@ -0,0 +1,36 @@ +// Load modules + +var Hapi = require('hapi'); + + +// Declare internals + +var internals = {}; + + +var handler = function (request, reply) { + + reply.view('withLayout/index', { + title: 'examples/views/handlebars/layout.js | Hapi ' + Hapi.version, + message: 'Hello World!\n' + }); +}; + + +internals.main = function () { + + var server = new Hapi.Server(); + server.connection({ port: 8000 }); + + server.views({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates', + layout: true + }); + + server.route({ method: 'GET', path: '/', handler: handler }); + server.start(); +}; + + +internals.main(); diff --git a/node_modules/hapi/node_modules/vision/examples/handlebars/partials.js b/node_modules/hapi/node_modules/vision/examples/handlebars/partials.js new file mode 100755 index 0000000..f1ab919 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/examples/handlebars/partials.js @@ -0,0 +1,36 @@ +// Load modules + +var Hapi = require('hapi'); + + +// Declare internals + +var internals = {}; + + +var handler = function (request, reply) { + + reply.view('withPartials/index', { + title: 'examples/views/handlebars/partials.js | Hapi ' + Hapi.version, + message: 'Hello World!\n' + }); +}; + + +internals.main = function () { + + var server = new Hapi.Server(); + server.connection({ port: 8000 }); + + server.views({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates', + partialsPath: __dirname + '/templates/withPartials' + }); + + server.route({ method: 'GET', path: '/', handler: handler }); + server.start(); +}; + + +internals.main(); diff --git a/node_modules/hapi/node_modules/vision/examples/handlebars/templates/basic/index.html b/node_modules/hapi/node_modules/vision/examples/handlebars/templates/basic/index.html new file mode 100755 index 0000000..06a1feb --- /dev/null +++ b/node_modules/hapi/node_modules/vision/examples/handlebars/templates/basic/index.html @@ -0,0 +1,11 @@ + + + + {{title}} + + +
+

{{message}}

+
+ + diff --git a/node_modules/hapi/node_modules/vision/examples/handlebars/templates/layout.html b/node_modules/hapi/node_modules/vision/examples/handlebars/templates/layout.html new file mode 100755 index 0000000..21d6170 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/examples/handlebars/templates/layout.html @@ -0,0 +1,11 @@ + + + + {{title}} + + +

Layout header

+ {{{ content }}} +

Layout footer

+ + diff --git a/node_modules/hapi/node_modules/vision/examples/handlebars/templates/withLayout/index.html b/node_modules/hapi/node_modules/vision/examples/handlebars/templates/withLayout/index.html new file mode 100755 index 0000000..8a57a8f --- /dev/null +++ b/node_modules/hapi/node_modules/vision/examples/handlebars/templates/withLayout/index.html @@ -0,0 +1,3 @@ +
+

{{message}}

+
\ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/examples/handlebars/templates/withPartials/footer.html b/node_modules/hapi/node_modules/vision/examples/handlebars/templates/withPartials/footer.html new file mode 100755 index 0000000..102617d --- /dev/null +++ b/node_modules/hapi/node_modules/vision/examples/handlebars/templates/withPartials/footer.html @@ -0,0 +1,3 @@ +
+

hapi.js 2013

+
\ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/examples/handlebars/templates/withPartials/header.html b/node_modules/hapi/node_modules/vision/examples/handlebars/templates/withPartials/header.html new file mode 100755 index 0000000..c23da54 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/examples/handlebars/templates/withPartials/header.html @@ -0,0 +1,3 @@ +
+

Views with Partials

+
diff --git a/node_modules/hapi/node_modules/vision/examples/handlebars/templates/withPartials/index.html b/node_modules/hapi/node_modules/vision/examples/handlebars/templates/withPartials/index.html new file mode 100755 index 0000000..11d647d --- /dev/null +++ b/node_modules/hapi/node_modules/vision/examples/handlebars/templates/withPartials/index.html @@ -0,0 +1,13 @@ + + + + {{title}} + + + {{> header}} +
+

{{message}}

+
+ {{> footer}} + + diff --git a/node_modules/hapi/node_modules/vision/examples/jade/index.js b/node_modules/hapi/node_modules/vision/examples/jade/index.js new file mode 100755 index 0000000..58de44e --- /dev/null +++ b/node_modules/hapi/node_modules/vision/examples/jade/index.js @@ -0,0 +1,47 @@ +// Load modules + +var Hapi = require('hapi'); + + +// Declare internals + +var internals = {}; + + +var rootHandler = function (request, reply) { + + reply.view('index', { + title: 'examples/views/jade/index.js | Hapi ' + Hapi.version, + message: 'Index - Hello World!' + }); +}; + +var aboutHandler = function (request, reply) { + + reply.view('about', { + title: 'examples/views/jade/index.js | Hapi ' + Hapi.version, + message: 'About - Hello World!' + }); +}; + + +internals.main = function () { + + var server = new Hapi.Server(); + server.connection({ port: 8000 }); + + server.views({ + engines: { jade: require('jade') }, + path: __dirname + '/templates', + compileOptions: { + pretty: true + } + }); + + server.route({ method: 'GET', path: '/', handler: rootHandler }); + server.route({ method: 'GET', path: '/about', handler: aboutHandler }); + server.start(); +}; + + +internals.main(); diff --git a/node_modules/hapi/node_modules/vision/examples/jade/templates/about.jade b/node_modules/hapi/node_modules/vision/examples/jade/templates/about.jade new file mode 100755 index 0000000..ac539de --- /dev/null +++ b/node_modules/hapi/node_modules/vision/examples/jade/templates/about.jade @@ -0,0 +1,5 @@ +extends layout + +block content + h1= title + p= message diff --git a/node_modules/hapi/node_modules/vision/examples/jade/templates/includes/foot.jade b/node_modules/hapi/node_modules/vision/examples/jade/templates/includes/foot.jade new file mode 100755 index 0000000..9cb2279 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/examples/jade/templates/includes/foot.jade @@ -0,0 +1,2 @@ +#footer + p hapi.js 2013 \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/examples/jade/templates/includes/head.jade b/node_modules/hapi/node_modules/vision/examples/jade/templates/includes/head.jade new file mode 100755 index 0000000..defc566 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/examples/jade/templates/includes/head.jade @@ -0,0 +1,2 @@ +head + script(src='//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js') \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/examples/jade/templates/index.jade b/node_modules/hapi/node_modules/vision/examples/jade/templates/index.jade new file mode 100755 index 0000000..ac539de --- /dev/null +++ b/node_modules/hapi/node_modules/vision/examples/jade/templates/index.jade @@ -0,0 +1,5 @@ +extends layout + +block content + h1= title + p= message diff --git a/node_modules/hapi/node_modules/vision/examples/jade/templates/layout.jade b/node_modules/hapi/node_modules/vision/examples/jade/templates/layout.jade new file mode 100755 index 0000000..9d46b1c --- /dev/null +++ b/node_modules/hapi/node_modules/vision/examples/jade/templates/layout.jade @@ -0,0 +1,5 @@ +html + include includes/head + body + block content + include includes/foot \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/examples/mixed/index.js b/node_modules/hapi/node_modules/vision/examples/mixed/index.js new file mode 100755 index 0000000..925d7bf --- /dev/null +++ b/node_modules/hapi/node_modules/vision/examples/mixed/index.js @@ -0,0 +1,46 @@ +// Load modules + +var Hapi = require('hapi'); + + +// Declare internals + +var internals = {}; + +var ctx = { + title: 'examples/views/mixed | Hapi ' + Hapi.version, + message: 'Hello World!' +}; + + +var oneHandler = function (request, reply) { + + reply.view('index.jade', ctx); +}; + +var twoHandler = function (request, reply) { + + reply.view('handlebars.html', ctx); +}; + + +internals.main = function () { + + var server = new Hapi.Server(); + server.connection({ port: 8000 }); + + server.views({ + engines: { + 'html': require('handlebars'), + 'jade': require('jade') + }, + path: __dirname + '/templates' + }); + + server.route({ method: 'GET', path: '/one', handler: oneHandler }); + server.route({ method: 'GET', path: '/two', handler: twoHandler }); + server.start(); +}; + + +internals.main(); diff --git a/node_modules/hapi/node_modules/vision/examples/mixed/templates/handlebars.html b/node_modules/hapi/node_modules/vision/examples/mixed/templates/handlebars.html new file mode 100755 index 0000000..8db62cf --- /dev/null +++ b/node_modules/hapi/node_modules/vision/examples/mixed/templates/handlebars.html @@ -0,0 +1,7 @@ + + {{title}} + +

I am rendered with handlebars!

+ Jade Version + + \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/examples/mixed/templates/index.jade b/node_modules/hapi/node_modules/vision/examples/mixed/templates/index.jade new file mode 100755 index 0000000..dcd1c43 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/examples/mixed/templates/index.jade @@ -0,0 +1,4 @@ +html + body + p "I am rendered with Jade" + a(href="/two") Handlebars Version \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/index.js b/node_modules/hapi/node_modules/vision/index.js new file mode 100755 index 0000000..bb0a047 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/index.js @@ -0,0 +1 @@ +module.exports = require('./lib'); diff --git a/node_modules/hapi/node_modules/vision/lib/index.js b/node_modules/hapi/node_modules/vision/lib/index.js new file mode 100755 index 0000000..cb43258 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/lib/index.js @@ -0,0 +1,106 @@ +// Load modules + +var Fs = require('fs'); +var Path = require('path'); +var Boom = require('boom'); +var Hoek = require('hoek'); +var Joi = require('joi'); +var Items = require('items'); +var Manager = require('./manager'); +// Additional helper modules required in constructor + + +// Declare internals + +var internals = {}; + + +internals.schema = Joi.alternatives([ + Joi.string(), + Joi.object({ + template: Joi.string(), + context: Joi.object(), + options: Joi.object() + }) +]); + + +exports.register = function (server, options, next) { + + server.decorate('server', 'views', function (options) { + + Hoek.assert(options, 'Missing views options'); + this.realm.plugins.vision = this.realm.plugins.vision || {}; + Hoek.assert(!this.realm.plugins.vision.manager, 'Cannot set views manager more than once'); + + if (!options.relativeTo && + this.realm.settings.files.relativeTo) { + + options = Hoek.shallow(options); + options.relativeTo = this.realm.settings.files.relativeTo; + } + + this.realm.plugins.vision.manager = new Manager(options); + }); + + server.decorate('server', 'render', function (template, context, options, callback) { + + callback = (typeof callback === 'function' ? callback : options); + options = (options === callback ? {} : options); + + var vision = (this.realm.plugins.vision || this.root.realm.plugins.vision || {}); + Hoek.assert(vision.manager, 'Missing views manager'); + return vision.manager.render(template, context, options, callback); + }); + + server.handler('view', internals.handler); + + server.decorate('reply', 'view', function (template, context, options) { + + var realm = (this.realm.plugins.vision || this.request.server.realm.plugins.vision || {}); + Hoek.assert(realm.manager, 'Cannot render view without a views manager configured'); + return this.response(realm.manager._response(template, context, options, this.request)); + }); + + return next(); +}; + +exports.register.attributes = { + pkg: require('../package.json') +}; + + +internals.handler = function (route, options) { + + Joi.assert(options, internals.schema, 'Invalid view handler options (' + route.path + ')'); + + if (typeof options === 'string') { + options = { template: options }; + } + + var settings = { // Shallow copy to allow making dynamic changes to context + template: options.template, + context: options.context, + options: options.options + }; + + return function (request, reply) { + + var context = { + params: request.params, + payload: request.payload, + query: request.query, + pre: request.pre + }; + + if (settings.context) { // Shallow copy to avoid cloning unknown objects + var keys = Object.keys(settings.context); + for (var i = 0, il = keys.length; i < il; ++i) { + var key = keys[i]; + context[key] = settings.context[key]; + } + } + + reply.view(settings.template, context, settings.options); + }; +}; diff --git a/node_modules/hapi/node_modules/vision/lib/manager.js b/node_modules/hapi/node_modules/vision/lib/manager.js new file mode 100755 index 0000000..dc3aa29 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/lib/manager.js @@ -0,0 +1,504 @@ +// Load modules + +var Fs = require('fs'); +var Path = require('path'); +var Boom = require('boom'); +var Hoek = require('hoek'); +var Joi = require('joi'); +var Items = require('items'); +// Additional helper modules required in constructor + + +// Declare internals + +var internals = {}; + + +internals.defaults = { + // defaultExtension: '', + // path: '', + // relativeTo: '', + compileOptions: {}, + runtimeOptions: {}, + layout: false, + layoutKeyword: 'content', + encoding: 'utf8', + isCached: true, + allowAbsolutePaths: false, + allowInsecureAccess: false, + // partialsPath: '', + contentType: 'text/html', + compileMode: 'sync', + context: null +}; + + +internals.schema = {}; + + +internals.schema.viewOverride = Joi.object({ + path: [Joi.array().includes(Joi.string()), Joi.string()], + relativeTo: Joi.string(), + compileOptions: Joi.object(), + runtimeOptions: Joi.object(), + layout: Joi.string().allow(false, true), + layoutKeyword: Joi.string(), + layoutPath: [Joi.array().includes(Joi.string()), Joi.string()], + encoding: Joi.string(), + allowAbsolutePaths: Joi.boolean(), + allowInsecureAccess: Joi.boolean(), + contentType: Joi.string() +}); + + +internals.schema.viewBase = internals.schema.viewOverride.keys({ + partialsPath: [Joi.array().includes(Joi.string()), Joi.string()], + helpersPath: [Joi.array().includes(Joi.string()), Joi.string()], + isCached: Joi.boolean(), + compileMode: Joi.string().valid('sync', 'async'), + defaultExtension: Joi.string() +}); + + +internals.schema.manager = internals.schema.viewBase.keys({ + engines: Joi.object().required(), + context: [Joi.object(), Joi.func()] +}); + + +internals.schema.view = internals.schema.viewBase.keys({ + module: Joi.object({ + compile: Joi.func().required() + }) + .options({ allowUnknown: true }) + .required() +}); + + +exports = module.exports = internals.Manager = function (options) { + + var self = this; + + Joi.assert(options, internals.schema.manager); + + // Save non-defaults values + + var engines = options.engines; + var defaultExtension = options.defaultExtension; + + // Clone options + + var defaults = Hoek.applyToDefaultsWithShallow(internals.defaults, options, ['engines', 'context']); + delete defaults.engines; + delete defaults.defaultExtension; + + // Prepare manager state + + var extensions = Object.keys(engines); + Hoek.assert(extensions.length, 'Views manager requires at least one registered extension handler'); + + this._context = defaults.context; + this._engines = {}; + this._defaultExtension = defaultExtension || (extensions.length === 1 ? extensions[0] : ''); + + // Load engines + + extensions.forEach(function (extension) { + + var config = engines[extension]; + var engine = {}; + + if (config.compile && + typeof config.compile === 'function') { + + engine.module = config; + engine.config = defaults; + } + else { + Joi.assert(config, internals.schema.view); + + engine.module = config.module; + engine.config = Hoek.applyToDefaultsWithShallow(defaults, config, ['module']); + } + + engine.suffix = '.' + extension; + engine.compileFunc = engine.module.compile; + + if (engine.config.compileMode === 'sync') { + engine.compileFunc = function (str, opt, next) { + + var compiled = null; + try { + compiled = engine.module.compile(str, opt); + } + catch (err) { + return next(err); + } + + var renderer = function (context, runtimeOptions, renderNext) { + + var rendered = null; + try { + rendered = compiled(context, runtimeOptions); + } + catch (err) { + return renderNext(err); + } + + return renderNext(null, rendered); + }; + + return next(null, renderer); + }; + } + + if (engine.config.isCached) { + engine.cache = {}; + } + + // Load partials and helpers + + self._loadPartials(engine); + self._loadHelpers(engine); + + // Set engine + + self._engines[extension] = engine; + }); +}; + + +internals.Manager.prototype._loadPartials = function (engine) { + + if (!engine.config.partialsPath || + !engine.module.registerPartial || + typeof engine.module.registerPartial !== 'function') { + + return; + } + + var load = function () { + + var partialsPaths = [].concat(engine.config.partialsPath); + + partialsPaths.forEach(function (partialsPath) { + + var path = internals.path(engine.config.relativeTo, partialsPath); + var files = traverse(path); + files.forEach(function (file) { + + var offset = path.slice(-1) === Path.sep ? 0 : 1; + var name = file.slice(path.length + offset, -engine.suffix.length).replace(/\\/g, '/'); + var src = Fs.readFileSync(file).toString(engine.config.encoding); + engine.module.registerPartial(name, src); + }); + }); + }; + + var traverse = function (path) { + + var files = []; + + Fs.readdirSync(path).forEach(function (file) { + + file = Path.join(path, file); + var stat = Fs.statSync(file); + if (stat.isDirectory()) { + files = files.concat(traverse(file)); + return; + } + + if (Path.basename(file)[0] !== '.' && + Path.extname(file) === engine.suffix) { + + files.push(file); + } + }); + + return files; + }; + + load(); +}; + + +internals.Manager.prototype._loadHelpers = function (engine) { + + if (!engine.config.helpersPath || + !engine.module.registerHelper || + typeof engine.module.registerHelper !== 'function') { + + return; + } + + var helpersPaths = [].concat(engine.config.helpersPath); + + helpersPaths.forEach(function (helpersPath) { + + var path = internals.path(engine.config.relativeTo, helpersPath); + if (!Hoek.isAbsolutePath(path)) { + path = Path.join(process.cwd(), path); + } + + Fs.readdirSync(path).forEach(function (file) { + + file = Path.join(path, file); + var stat = Fs.statSync(file); + if (!stat.isDirectory() && + Path.basename(file)[0] !== '.') { + + try { + var helper = require(file); + if (typeof helper === 'function') { + var offset = path.slice(-1) === Path.sep ? 0 : 1; + var name = file.slice(path.length + offset, -3); + engine.module.registerHelper(name, helper); + } + } + catch (err) { } + } + }); + }); +}; + + +internals.Manager.prototype.render = function (filename, context, options, callback) { + + var self = this; + + options = options || {}; + + if (this._context) { + var base = typeof this._context === 'function' ? this._context() : this._context; + if (context) { + base = Hoek.shallow(base); + var keys = Object.keys(context); + for (var i = 0, il = keys.length; i < il; ++i) { + var key = keys[i]; + base[key] = context[key]; + } + } + + context = base; + } + + context = context || {}; + + var engine = null; + + var fileExtension = Path.extname(filename).slice(1); + var extension = fileExtension || this._defaultExtension; + if (!extension) { + return callback(Boom.badImplementation('Unknown extension and no defaultExtension configured for view template: ' + filename)); + } + + engine = this._engines[extension]; + if (!engine) { + return callback(Boom.badImplementation('No view engine found for file: ' + filename)); + } + + var settings = Hoek.applyToDefaults(engine.config, options); + + this._path(filename + (fileExtension ? '' : engine.suffix), settings, false, function (err, templatePath) { + + if (err) { + return callback(err); + } + + self._compile(templatePath, engine, settings, function (err, compiled) { + + if (err) { + return callback(err); + } + + // No layout + + if (!settings.layout) { + compiled(context, settings.runtimeOptions, function (err, rendered) { + + if (err) { + return callback(Boom.badImplementation(err.message, err)); + } + + return callback(null, rendered, settings); + }); + + return; + } + + // With layout + + if (context.hasOwnProperty(settings.layoutKeyword)) { + return callback(Boom.badImplementation('settings.layoutKeyword conflict', { context: context, keyword: settings.layoutKeyword })); + } + + self._path((settings.layout === true ? 'layout' : settings.layout) + engine.suffix, settings, true, function (err, layoutPath) { + + if (err) { + return callback(err); + } + + self._compile(layoutPath, engine, settings, function (err, layout) { + + if (err) { + return callback(err); + } + + compiled(context, settings.runtimeOptions, function (err, rendered) { + + if (err) { + return callback(Boom.badImplementation(err.message, err)); + } + + context[settings.layoutKeyword] = rendered; + layout(context, settings.runtimeOptions, function (err, rendered) { + + delete context[settings.layoutKeyword]; + + if (err) { + return callback(Boom.badImplementation(err.message, err)); + } + + return callback(null, rendered, settings); + }); + }); + }); + }); + }); + }); +}; + + +internals.Manager.prototype._path = function (template, settings, isLayout, next) { + + // Validate path + + var isAbsolutePath = Hoek.isAbsolutePath(template); + var isInsecurePath = template.match(/\.\.\//g); + + if (!settings.allowAbsolutePaths && + isAbsolutePath) { + + return next(Boom.badImplementation('Absolute paths are not allowed in views')); + } + + if (!settings.allowInsecureAccess && + isInsecurePath) { + + return next(Boom.badImplementation('View paths cannot lookup templates outside root path (path includes one or more \'../\')')); + } + + // Resolve path and extension + + var paths; + if (isAbsolutePath) { + paths = [template]; + } + else { + paths = [].concat((isLayout && settings.layoutPath) || settings.path); + + for (var i = 0, il = paths.length; i < il; ++i) { + paths[i] = internals.path(settings.relativeTo, paths[i], template); + } + } + + Items.serial(paths, function (path, nextFile) { + + Fs.stat(path, function (err, stats) { + + if (!err && + stats.isFile()) { + + return next(null, path); + } + + return nextFile(); + }); + }, + function () { + + return next(Boom.badImplementation('View file not found: ' + template)); + }); +}; + + +internals.path = function (base, path, file) { + + if (path && + Hoek.isAbsolutePath(path)) { + + return Path.join(path, file || ''); + } + + return Path.join(base || '', path || '', file || ''); +}; + + +internals.Manager.prototype._compile = function (template, engine, settings, callback) { + + if (engine.cache && + engine.cache[template]) { + + return callback(null, engine.cache[template]); + } + + settings.compileOptions.filename = template; // Pass the template to Jade via this copy of compileOptions + + // Read file + + Fs.readFile(template, { encoding: settings.encoding }, function (err, data) { + + if (err) { + return callback(Boom.badImplementation('Failed to read view file: ' + template)); + } + + engine.compileFunc(data, settings.compileOptions, function (err, compiled) { + + if (err) { + return callback(Boom.wrap(err)); + } + + if (engine.cache) { + engine.cache[template] = compiled; + } + + return callback(null, compiled); + }); + }); +}; + + +internals.Manager.prototype._response = function (template, context, options, request) { + + Joi.assert(options, internals.schema.viewOverride); + + var source = { + manager: this, + template: template, + context: context, + options: options + }; + + return request.generateResponse(source, { variety: 'view', marshal: internals.marshal }); +}; + + +internals.marshal = function (response, callback) { + + var manager = response.source.manager; + + manager.render(response.source.template, response.source.context, response.source.options, function (err, rendered, config) { + + if (err) { + return callback(err); + } + + if (!response.headers['content-type']) { + response.type(config.contentType); + } + + response.encoding(config.encoding); + + return callback(null, rendered); + }); +}; diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/.npmignore b/node_modules/hapi/node_modules/vision/node_modules/joi/.npmignore new file mode 100644 index 0000000..2dfb3b9 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/.npmignore @@ -0,0 +1,20 @@ +.c9 +.idea +*.iml +npm-debug.log +dump.rdb +node_modules +results.tap +results.xml +npm-shrinkwrap.json +config.json +.DS_Store +*/.DS_Store +*/*/.DS_Store +._* +*/._* +*/*/._* +coverage.* +lib-cov +complexity.md +sandbox.js diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/.travis.yml b/node_modules/hapi/node_modules/vision/node_modules/joi/.travis.yml new file mode 100755 index 0000000..afcae46 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/.travis.yml @@ -0,0 +1,22 @@ +# Travis optimizations, see http://docs.travis-ci.com/user/workers/container-based-infrastructure/ +sudo: false +cache: + directories: + - node_modules + +language: node_js + +node_js: + - "0.10" + - "0.11" + +deploy: + provider: npm + email: marsup@gmail.com + api_key: + secure: IuIigctAboFy2AGAcv/jUgRaVEQr23FX8ao+MM5fvmVpRZ/isHNQdJ2y1AAnCu5mCU+FgjNaXw/sB37J3Le5emMKhZMivXMTwAuLIbusEiQI6lzXflE7/+QK59jEcf/e5o6guTCf3CLMKo/yCrROYc/5sBuZuUqX2yDS6acGmZs= + on: + branch: master + tags: true + repo: hapijs/joi + node: "0.10" diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/CONTRIBUTING.md b/node_modules/hapi/node_modules/vision/node_modules/joi/CONTRIBUTING.md new file mode 100755 index 0000000..713d376 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/CONTRIBUTING.md @@ -0,0 +1,14 @@ +# How to contribute +We welcome contributions from the community and are pleased to have them. Please follow this guide when logging issues or making code changes. + +## Logging Issues +All issues should be created using the [new issue form](https://github.com/hapijs/joi/issues/new). Clearly describe the issue including steps to reproduce if there are any. Also, make sure to indicate the earliest version that has the issue being reported. + +## Patching Code +Code changes are welcome and should follow the guidelines below. + +* Fork the repository on GitHub. +* Fix the issue ensuring that your code follows the [style guide](https://github.com/hapijs/contrib/blob/master/Style.md). +* Add tests for your new code ensuring that you have 100% code coverage (we can help you reach 100% but will not merge without it). + * Run `npm test` to generate a report of test coverage +* [Pull requests](http://help.github.com/send-pull-requests/) should be made to the [master branch](https://github.com/hapijs/joi/tree/master). diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/LICENSE b/node_modules/hapi/node_modules/vision/node_modules/joi/LICENSE new file mode 100755 index 0000000..03afbde --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2012-2014, Walmart and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/joi/graphs/contributors \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/README.md b/node_modules/hapi/node_modules/vision/node_modules/joi/README.md new file mode 100755 index 0000000..de221ba --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/README.md @@ -0,0 +1,1240 @@ +![joi Logo](https://raw.github.com/hapijs/joi/master/images/joi.png) + +Object schema description language and validator for JavaScript objects. + +[![npm version](https://badge.fury.io/js/joi.svg)](http://badge.fury.io/js/joi) +[![Build Status](https://secure.travis-ci.org/hapijs/joi.svg)](http://travis-ci.org/hapijs/joi) +[![Dependencies Status](https://david-dm.org/hapijs/joi.svg)](https://david-dm.org/hapijs/joi) +[![DevDependencies Status](https://david-dm.org/hapijs/joi/dev-status.svg)](https://david-dm.org/hapijs/joi#info=devDependencies) + +Lead Maintainer: [Nicolas Morel](https://github.com/marsup) + +## Table of Contents + + +- [Example](#example) +- [Usage](#usage) + - [`validate(value, schema, [options], [callback])`](#validatevalue-schema-options-callback) + - [`compile(schema)`](#compileschema) + - [`assert(value, schema, [message])`](#assertvalue-schema-message) + - [`any`](#any) + - [`any.allow(value)`](#anyallowvalue) + - [`any.valid(value)`](#anyvalidvalue) + - [`any.invalid(value)`](#anyinvalidvalue) + - [`any.required()`](#anyrequired) + - [`any.optional()`](#anyoptional) + - [`any.forbidden()`](#anyforbidden) + - [`any.description(desc)`](#anydescriptiondesc) + - [`any.notes(notes)`](#anynotesnotes) + - [`any.tags(tags)`](#anytagstags) + - [`any.meta(meta)`](#anymetameta) + - [`any.example(value)`](#anyexamplevalue) + - [`any.unit(name)`](#anyunitname) + - [`any.options(options)`](#anyoptionsoptions) + - [`any.strict()`](#anystrict) + - [`any.default(value)`](#anydefaultvalue) + - [`any.concat(schema)`](#anyconcatschema) + - [`any.when(ref, options)`](#anywhenref-options) + - [`any.label(name)`](#anylabelname) + - [`any.raw(isRaw)`](#anyrawisraw) + - [`array`](#array) + - [`array.sparse(enabled)`](#arraysparseenabled) + - [`array.includes(type)`](#arrayincludestype) + - [`array.excludes(type)`](#arrayexcludestype) + - [`array.min(limit)`](#arrayminlimit) + - [`array.max(limit)`](#arraymaxlimit) + - [`array.length(limit)`](#arraylengthlimit) + - [`array.unique()`](#arrayunique) + - [`binary`](#binary) + - [`binary.encoding(encoding)`](#binaryencodingencoding) + - [`binary.min(limit)`](#binaryminlimit) + - [`binary.max(limit)`](#binarymaxlimit) + - [`binary.length(limit)`](#binarylengthlimit) + - [`boolean()`](#boolean) + - [`date`](#date) + - [`date.min(date)`](#datemindate) + - [`date.max(date)`](#datemaxdate) + - [`date.format(format)`](#dateformatformat) + - [`date.iso()`](#dateiso) + - [`func`](#func) + - [`number`](#number) + - [`number.min(limit)`](#numberminlimit) + - [`number.max(limit)`](#numbermaxlimit) + - [`number.greater(limit)`](#numbergreaterlimit) + - [`number.less(limit)`](#numberlesslimit) + - [`number.integer()`](#numberinteger) + - [`number.precision(limit)`](#numberprecisionlimit) + - [`object`](#object) + - [`object.keys([schema])`](#objectkeysschema) + - [`object.min(limit)`](#objectminlimit) + - [`object.max(limit)`](#objectmaxlimit) + - [`object.length(limit)`](#objectlengthlimit) + - [`object.pattern(regex, schema)`](#objectpatternregex-schema) + - [`object.and(peers)`](#objectandpeers) + - [`object.nand(peers)`](#objectnandpeers) + - [`object.or(peers)`](#objectorpeers) + - [`object.xor(peers)`](#objectxorpeers) + - [`object.with(key, peers)`](#objectwithkey-peers) + - [`object.without(key, peers)`](#objectwithoutkey-peers) + - [`object.rename(from, to, [options])`](#objectrenamefrom-to-options) + - [`object.assert(ref, schema, [message])`](#objectassertref-schema-message) + - [`object.unknown([allow])`](#objectunknownallow) + - [`object.type(constructor, [name])`](#objecttypeconstructorname) + - [`object.requiredKeys(children)`](#objectrequiredkeyschildren) + - [`object.optionalKeys(children)`](#objectoptionalkeyschildren) + - [`string`](#string) + - [`string.insensitive()`](#stringinsensitive) + - [`string.min(limit, [encoding])`](#stringminlimit-encoding) + - [`string.max(limit, [encoding])`](#stringmaxlimit-encoding) + - [`string.creditCard()`](#stringcreditCard) + - [`string.length(limit, [encoding])`](#stringlengthlimit-encoding) + - [`string.regex(pattern, [name])`](#stringregexpattern-name) + - [`string.alphanum()`](#stringalphanum) + - [`string.token()`](#stringtoken) + - [`string.email()`](#stringemail) + - [`string.guid()`](#stringguid) + - [`string.hostname()`](#stringhostname) + - [`string.lowercase()`](#stringlowercase) + - [`string.uppercase()`](#stringuppercase) + - [`string.trim()`](#stringtrim) + - [`alternatives`](#alternatives) + - [`alternatives.try(schemas)`](#alternativestryschemas) + - [`alternatives.when(ref, options)`](#alternativeswhenref-options) + - [`ref(key, [options])`](#refkey-options) + +# Example + +```javascript +var Joi = require('joi'); + +var schema = Joi.object().keys({ + username: Joi.string().alphanum().min(3).max(30).required(), + password: Joi.string().regex(/[a-zA-Z0-9]{3,30}/), + access_token: [Joi.string(), Joi.number()], + birthyear: Joi.number().integer().min(1900).max(2013), + email: Joi.string().email() +}).with('username', 'birthyear').without('password', 'access_token'); + +Joi.validate({ username: 'abc', birthyear: 1994 }, schema, function (err, value) { }); // err === null -> valid +``` + +The above schema defines the following constraints: +* `username` + * a required string + * must contain only alphanumeric characters + * at least 3 characters long but no more than 30 + * must be accompanied by `birthyear` +* `password` + * an optional string + * must satisfy the custom regex + * cannot appear together with `access_token` +* `access_token` + * an optional, unconstrained string or number +* `birthyear` + * an integer between 1900 and 2013 +* `email` + * a valid email address string + +# Usage + +Usage is a two steps process. First, a schema is constructed using the provided types and constraints: + +```javascript +var schema = { + a: Joi.string() +}; +``` + +Note that **joi** schema objects are immutable which means every additional rule added (e.g. `.min(5)`) will return a +new schema object. + +Then the value is validated against the schema: + +```javascript +Joi.validate({ a: 'a string' }, schema, function (err, value) { }); +``` + +If the value is valid, `null` is returned, otherwise an `Error` object. + +The schema can be a plain JavaScript object where every key is assigned a **joi** type, or it can be a **joi** type directly: + +```javascript +var schema = Joi.string().min(10); +``` + +If the schema is a **joi** type, the `schema.validate(value, callback)` can be called directly on the type. When passing a non-type schema object, +the module converts it internally to an object() type equivalent to: + +```javascript +var schema = Joi.object().keys({ + a: Joi.string() +}); +``` + +When validating a schema: +* Keys are optional by default. +* Strings are utf-8 encoded by default. +* Rules are defined in an additive fashion and evaluated in order after whitelist and blacklist checks. + +### `validate(value, schema, [options], [callback])` + +Validates a value using the given schema and options where: +- `value` - the value being validated. +- `schema` - the validation schema. Can be a **joi** type object or a plain object where every key is assigned a **joi** type object. +- `options` - an optional object with the following optional keys: + - `abortEarly` - when `true`, stops validation on the first error, otherwise returns all the errors found. Defaults to `true`. + - `convert` - when `true`, attempts to cast values to the required types (e.g. a string to a number). Defaults to `true`. + - `allowUnknown` - when `true`, allows object to contain unknown keys which are ignored. Defaults to `false`. + - `skipFunctions` - when `true`, ignores unknown keys with a function value. Defaults to `false`. + - `stripUnknown` - when `true`, unknown keys are deleted (only when value is an object). Defaults to `false`. + - `language` - overrides individual error messages, when `'label'` is set, it overrides the key name in the error message. Defaults to no override (`{}`). + - `presence` - sets the default presence requirements. Supported modes: `'optional'`, `'required'`, and `'forbidden'`. + Defaults to `'optional'`. + - `context` - provides an external data set to be used in [references](#refkey-options). Can only be set as an external option to + `validate()` and not using `any.options()`. +- `callback` - the optional synchronous callback method using the signature `function(err, value)` where: + - `err` - if validation failed, the error reason, otherwise `null`. + - `value` - the validated value with any type conversions and other modifiers applied (the input is left unchanged). `value` can be + incomplete if validation failed and `abortEarly` is `true`. If callback is not provided, then returns an object with error + and value properties. + +```javascript +var schema = { + a: Joi.number() +}; + +var value = { + a: '123' +}; + +Joi.validate(value, schema, function (err, value) { }); +// err -> null +// value.a -> 123 (number, not string) + +// or +var result = Joi.validate(value, schema); +// result.error -> null +// result.value -> { "a" : 123 } +``` + +### `compile(schema)` + +Converts literal schema definition to **joi** schema object (or returns the same back if already a **joi** schema object) where: +- `schema` - the schema definition to compile. + +```javascript +var definition = ['key', 5, { a: true, b: [/^a/, 'boom'] }]; +var schema = Joi.compile(definition); + +// Same as: + +var schema = Joi.alternatives().try([ + Joi.string().valid('key'), + Joi.number().valid(5), + Joi.object().keys({ + a: Joi.boolean().valid(true), + b: Joi.alternatives().try([ + Joi.string().regex(/^a/), + Joi.string().valid('boom') + ]) + }) +]); +``` + +### `assert(value, schema, [message])` + +Validates a value against a schema and throws if validation fails where: +- `value` - the value to validate. +- `schema` - the schema object. +- `message` - optional message sting prefix added in front of the error message. + +```javascript +Joi.assert('x', Joi.number()); +``` + +### `any` + +Generates a schema object that matches any data type. + +```javascript +var any = Joi.any(); +any.validate('a', function (err, value) { }); +``` + +#### `any.allow(value)` + +Whitelists a value where: +- `value` - the allowed value which can be of any type and will be matched against the validated value before applying any other rules. + `value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options). + +```javascript +var schema = { + a: Joi.any().allow('a'), + b: Joi.any().allow('b', 'B'), + c: Joi.any().allow(['c', 'C']) +}; +``` + +#### `any.valid(value)` + +Adds the provided values into the allowed whitelist and marks them as the only valid values allowed where: +- `value` - the allowed value which can be of any type and will be matched against the validated value before applying any other rules. + `value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options). + +```javascript +var schema = { + a: Joi.any().valid('a'), + b: Joi.any().valid('b', 'B'), + c: Joi.any().valid(['c', 'C']) +}; +``` + +#### `any.invalid(value)` + +Blacklists a value where: +- `value` - the forbidden value which can be of any type and will be matched against the validated value before applying any other rules. + `value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options). + +```javascript +var schema = { + a: Joi.any().invalid('a'), + b: Joi.any().invalid('b', 'B'), + c: Joi.any().invalid(['c', 'C']) +}; +``` + +#### `any.required()` + +Marks a key as required which will not allow `undefined` as value. All keys are optional by default. + +```javascript +var schema = Joi.any().required(); +``` + +#### `any.optional()` + +Marks a key as optional which will allow `undefined` as values. Used to annotate the schema for readability as all keys are optional by default. + +```javascript +var schema = Joi.any().optional(); +``` + +#### `any.forbidden()` + +Marks a key as forbidden which will not allow any value except `undefined`. Used to explicitly forbid keys. + +```javascript +var schema = { + a: Joi.any().forbidden() +}; +``` + +#### `any.description(desc)` + +Annotates the key where: +- `desc` - the description string. + +```javascript +var schema = Joi.any().description('this key will match anything you give it'); +``` + +#### `any.notes(notes)` + +Annotates the key where: +- `notes` - the notes string or array of strings. + +```javascript +var schema = Joi.any().notes(['this is special', 'this is important']); +``` + +#### `any.tags(tags)` + +Annotates the key where: +- `tags` - the tag string or array of strings. + +```javascript +var schema = Joi.any().tags(['api', 'user']); +``` + +#### `any.meta(meta)` + +Attaches metadata to the key where: +- `meta` - the meta object to attach. + +```javascript +var schema = Joi.any().meta({ index: true }); +``` + +#### `any.example(value)` + +Annotates the key where: +- `value` - an example value. + +If the example fails to pass validation, the function will throw. + +```javascript +var schema = Joi.string().min(4).example('abcd'); +``` + +#### `any.unit(name)` + +Annotates the key where: +- `name` - the unit name of the value. + +```javascript +var schema = Joi.number().unit('milliseconds'); +``` + +#### `any.options(options)` + +Overrides the global `validate()` options for the current key and any sub-key where: +- `options` - an object with the same optional keys as [`Joi.validate(value, schema, options, callback)`](#joivalidatevalue-schema-options-callback). + +```javascript +var schema = Joi.any().options({ convert: false }); +``` + +#### `any.strict()` + +Sets the `options.convert` options to `false` which prevent type casting for the current key and any child keys. + +```javascript +var schema = Joi.any().strict(); +``` + +#### `any.default(value)` + +Sets a default value if the original value is undefined where: +- `value` - the value. `value` supports [references](#refkey-options). + +Note that if `value` is an object, any changes to the object after `default()` is called will change the reference +and any future assignment. + +```javascript +var schema = { + username: Joi.string().default('new_user') +}; +Joi.validate({}, schema, function (err, value) { }); +// value === { username: "new_user" } +``` + +#### `any.concat(schema)` + +Returns a new type that is the result of adding the rules of one type to another where: +- `schema` - a **joi** type to merge into the current schema. Can only be of the same type as the context type or `any`. + +```javascript +var a = Joi.string().valid('a'); +var b = Joi.string().valid('b'); +var ab = a.concat(b); +``` + +#### `any.when(ref, options)` + +Converts the type into an [`alternatives`](#alternatives) type where the conditions are merged into the type definition where: +- `ref` - the key name or [reference](#refkey-options). +- `options` - an object with: + - `is` - the required condition **joi** type. + - `then` - the alternative schema type if the condition is true. Required if `otherwise` is missing. + - `otherwise` - the alternative schema type if the condition is false. Required if `then` is missing. + +```javascript +var schema = { + a: Joi.any().valid('x').when('b', { is: 5, then: Joi.valid('y'), otherwise: Joi.valid('z') }), + b: Joi.any() +}; +``` + +Alternatively, if you want to specify a specific type such as `string`, `array`, etc, you can do so like this: + +```javascript +var schema = { + a: Joi.valid('a', 'b', 'other'), + other: Joi.string() + .when('a', { is: 'other', then: Joi.required() }), +}; +``` + +#### `any.label(name)` + +Overrides the key name in error messages. +- `name` - the name of the key. + +```javascript +var schema = { + first_name: Joi.string().label('First Name') +}; +``` + +#### `any.raw(isRaw)` + +Outputs the original untouched value instead of the casted value. +- `isRaw` - whether to enable raw mode or not. Defaults to true. + +```javascript +var schema = { + timestamp: Joi.date().format('YYYYMMDD').raw() +}; +``` + +### `array` + +Generates a schema object that matches an array data type. Note that undefined values inside arrays are not allowed by default but can be by using `sparse()`. + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var array = Joi.array().includes(Joi.string().valid('a', 'b')); +array.validate(['a', 'b', 'a'], function (err, value) { }); +``` + +#### `array.sparse(enabled)` + +Allow this array to be sparse. `enabled` can be used with a falsy value to go back to the default behavior. + +```javascript +var schema = Joi.array().sparse(); // undefined values are now allowed +schema = schema.sparse(false); // undefined values are now denied +``` + +#### `array.single(enabled)` + +Allow single values to be checked against rules as if it were provided as an array. + +`enabled` can be used with a falsy value to go back to the default behavior. + +```javascript +var schema = Joi.array().includes(Joi.number()).single(); +schema.validate([4]); // returns `{ error: null, value: [ 4 ] }` +schema.validate(4); // returns `{ error: null, value: [ 4 ] }` +``` + +#### `array.includes(type)` + +List the types allowed for the array values where: +- `type` - a **joi** schema object to validate each array item against. `type` can be an array of values, or multiple values can be passed as individual arguments. + +```javascript +var schema = Joi.array().includes(Joi.string(), Joi.number()); +``` + +#### `array.excludes(type)` + +List the types forbidden for the array values where: +- `type` - a **joi** schema object to validate each array item against. `type` can be an array of values, or multiple values can be passed as individual arguments. + +```javascript +var schema = Joi.array().excludes(Joi.object()); +``` + +#### `array.min(limit)` + +Specifies the minimum number of items in the array where: +- `limit` - the lowest number of array items allowed. + +```javascript +var schema = Joi.array().min(2); +``` + +#### `array.max(limit)` + +Specifies the maximum number of items in the array where: +- `limit` - the highest number of array items allowed. + +```javascript +var schema = Joi.array().max(10); +``` + +#### `array.length(limit)` + +Specifies the exact number of items in the array where: +- `limit` - the number of array items allowed. + +```javascript +var schema = Joi.array().length(5); +``` + +#### `array.unique()` + +Requires the array values to be unique. + +Be aware that a deep equality is performed on elements of the array having a type of `object`, a performance penalty is to be expected for this kind of operation. + +```javascript +var schema = Joi.array().unique(); +``` + +### `boolean` + +Generates a schema object that matches a boolean data type (as well as the strings 'true', 'false', 'yes', and 'no'). Can also be called via `bool()`. + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var boolean = Joi.boolean(); +boolean.validate(true, function (err, value) { }); +``` + +### `binary` + +Generates a schema object that matches a Buffer data type (as well as the strings which will be converted to Buffers). + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var schema = Joi.binary(); +``` + +#### `binary.encoding(encoding)` + +Sets the string encoding format if a string input is converted to a buffer where: +- `encoding` - the encoding scheme. + +```javascript +var schema = Joi.binary().encoding('base64'); +``` + +#### `binary.min(limit)` + +Specifies the minimum length of the buffer where: +- `limit` - the lowest size of the buffer. + +```javascript +var schema = Joi.binary().min(2); +``` + +#### `binary.max(limit)` + +Specifies the maximum length of the buffer where: +- `limit` - the highest size of the buffer. + +```javascript +var schema = Joi.binary().max(10); +``` + +#### `binary.length(limit)` + +Specifies the exact length of the buffer: +- `limit` - the size of buffer allowed. + +```javascript +var schema = Joi.binary().length(5); +``` + +### `date` + +Generates a schema object that matches a date type (as well as a JavaScript date string or number of milliseconds). + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var date = Joi.date(); +date.validate('12-21-2012', function (err, value) { }); +``` + +#### `date.min(date)` + +Specifies the oldest date allowed where: +- `date` - the oldest date allowed. + +```javascript +var schema = Joi.date().min('1-1-1974'); +``` + +Notes: `'now'` can be passed in lieu of `date` so as to always compare relatively to the current date, allowing to explicitly ensure a date is either in the past or in the future. + +```javascript +var schema = Joi.date().min('now'); +``` + +It can also be a reference to another field. + +```javascript +var schema = Joi.object({ + from: Joi.date().required(), + to: Joi.date().min(Joi.ref('from')).required() +}); +``` + +#### `date.max(date)` + +Specifies the latest date allowed where: +- `date` - the latest date allowed. + +```javascript +var schema = Joi.date().max('12-31-2020'); +``` + +Notes: `'now'` can be passed in lieu of `date` so as to always compare relatively to the current date, allowing to explicitly ensure a date is either in the past or in the future. + +```javascript +var schema = Joi.date().max('now'); +``` + +It can also be a reference to another field. + +```javascript +var schema = Joi.object({ + from: Joi.date().max(Joi.ref('to')).required(), + to: Joi.date().required() +}); +``` + +#### `date.format(format)` + +Specifies the allowed date format: +- `format` - string or array of strings that follow the `moment.js` [format](http://momentjs.com/docs/#/parsing/string-format/). + +```javascript +var schema = Joi.date().format('YYYY/MM/DD'); +``` + +#### `date.iso()` + +Requires the string value to be in valid ISO 8601 date format. + +```javascript +var schema = Joi.date().iso(); +``` + +### `func` + +Generates a schema object that matches a function type. + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var func = Joi.func(); +func.validate(function () {}, function (err, value) { }); +``` + +### `number` + +Generates a schema object that matches a number data type (as well as strings that can be converted to numbers). + +`Infinity` and `-Infinity` are invalid by default, you can change that behavior by calling `allow(Infinity, -Infinity)`. + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var number = Joi.number(); +number.validate(5, function (err, value) { }); +``` + +#### `number.min(limit)` + +Specifies the minimum value where: +- `limit` - the minimum value allowed. + +```javascript +var schema = Joi.number().min(2); +``` + +#### `number.max(limit)` + +Specifies the maximum value where: +- `limit` - the maximum value allowed. + +```javascript +var schema = Joi.number().max(10); +``` + +#### `number.greater(limit)` + +Specifies that the value must be greater than `limit`. + +```javascript +var schema = Joi.number().greater(5); +``` + +#### `number.less(limit)` + +Specifies that the value must be less than `limit`. + +```javascript +var schema = Joi.number().less(10); +``` + +#### `number.integer()` + +Requires the number to be an integer (no floating point). + +```javascript +var schema = Joi.number().integer(); +``` + +#### `number.precision(limit)` + +Specifies the maximum number of decimal places where: +- `limit` - the maximum number of decimal places allowed. + +```javascript +var schema = Joi.number().precision(2); +``` + +### `object` + +Generates a schema object that matches an object data type (as well as JSON strings that parsed into objects). Defaults +to allowing any child key. + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var object = Joi.object().keys({ + a: Joi.number().min(1).max(10).integer(), + b: 'some string' +}); + +object.validate({ a: 5 }, function (err, value) { }); +``` + +#### `object.keys([schema])` + +Sets or extends the allowed object keys where: +- `schema` - optional object where each key is assigned a **joi** type object. If `schema` is `{}` no keys allowed. + If `schema` is `null` or `undefined`, any key allowed. If `schema` is an object with keys, the keys are added to any + previously defined keys (but narrows the selection if all keys previously allowed). Defaults to 'undefined' which + allows any child key. + +```javascript +var base = Joi.object().keys({ + a: Joi.number(), + b: Joi.string() +}); +// Validate keys a, b and c. +var extended = base.keys({ + c: Joi.boolean() +}); +``` + +#### `object.min(limit)` + +Specifies the minimum number of keys in the object where: +- `limit` - the lowest number of keys allowed. + +```javascript +var schema = Joi.object().min(2); +``` + +#### `object.max(limit)` + +Specifies the maximum number of keys in the object where: +- `limit` - the highest number of object keys allowed. + +```javascript +var schema = Joi.object().max(10); +``` + +#### `object.length(limit)` + +Specifies the exact number of keys in the object where: +- `limit` - the number of object keys allowed. + +```javascript +var schema = Joi.object().length(5); +``` + +#### `object.pattern(regex, schema)` + +Specify validation rules for unknown keys matching a pattern where: +- `regex` - a regular expression tested against the unknown key names. +- `schema` - the schema object matching keys much validate against. + +```javascrip +var schema = Joi.object({ + a: Joi.string() +}).pattern(/\w\d/, Joi.boolean()); +``` + +#### `object.and(peers)` + +Defines an all-or-nothing relationship between keys where if one of the peers is present, all of them are required as +well where: +- `peers` - the key names of which if one present, all are required. `peers` can be a single string value, an + array of string values, or each peer provided as an argument. + +```javascript +var schema = Joi.object().keys({ + a: Joi.any(), + b: Joi.any() +}).and('a', 'b'); +``` + +#### `object.nand(peers)` + +Defines a relationship between keys where not all peers can be present at the +same time where: +- `peers` - the key names of which if one present, the others may not all be present. `peers` can be a single string value, an + array of string values, or each peer provided as an argument. + +```javascript +var schema = Joi.object().keys({ + a: Joi.any(), + b: Joi.any() +}).nand('a', 'b'); +``` + +#### `object.or(peers)` + +Defines a relationship between keys where one of the peers is required (and more than one is allowed) where: +- `peers` - the key names of which at least one must appear. `peers` can be a single string value, an + array of string values, or each peer provided as an argument. + +```javascript +var schema = Joi.object().keys({ + a: Joi.any(), + b: Joi.any() +}).or('a', 'b'); +``` + +#### `object.xor(peers)` + +Defines an exclusive relationship between a set of keys where one of them is required but not at the same time where: +- `peers` - the exclusive key names that must not appear together but where one of them is required. `peers` can be a single string value, an + array of string values, or each peer provided as an argument. + +```javascript +var schema = Joi.object().keys({ + a: Joi.any(), + b: Joi.any() +}).xor('a', 'b'); +``` + +#### `object.with(key, peers)` + +Requires the presence of other keys whenever the specified key is present where: +- `key` - the reference key. +- `peers` - the required peer key names that must appear together with `key`. `peers` can be a single string value or an array of string values. + +Note that unlike [`object.and()`](#objectandpeers), `with()` creates a dependency only between the `key` and each of the `peers`, not +between the `peers` themselves. + +```javascript +var schema = Joi.object().keys({ + a: Joi.any(), + b: Joi.any() +}).with('a', 'b'); +``` + +#### `object.without(key, peers)` + +Forbids the presence of other keys whenever the specified is present where: +- `key` - the reference key. +- `peers` - the forbidden peer key names that must not appear together with `key`. `peers` can be a single string value or an array of string values. + +```javascript +var schema = Joi.object().keys({ + a: Joi.any(), + b: Joi.any() +}).without('a', ['b']); +``` + +#### `object.rename(from, to, [options])` + +Renames a key to another name (deletes the renamed key) where: +- `from` - the original key name. +- `to` - the new key name. +- `options` - an optional object with the following optional keys: + - `alias` - if `true`, does not delete the old key name, keeping both the new and old keys in place. Defaults to `false`. + - `multiple` - if `true`, allows renaming multiple keys to the same destination where the last rename wins. Defaults to `false`. + - `override` - if `true`, allows renaming a key over an existing key. Defaults to `false`. + +Keys are renamed before any other validation rules are applied. + +```javascript +var object = Joi.object().keys({ + a: Joi.number() +}).rename('b', 'a'); + +object.validate({ b: 5 }, function (err, value) { }); +``` + +#### `object.assert(ref, schema, [message])` + +Verifies an assertion where: +- `ref` - the key name or [reference](#refkey-options). +- `schema` - the validation rules required to satisfy the assertion. If the `schema` includes references, they are resolved against + the object value, not the value of the `ref` target. +- `message` - optional human-readable message used when the assertion fails. Defaults to 'failed to pass the assertion test'. + +```javascript +var schema = Joi.object().keys({ + a: { + b: Joi.string(), + c: Joi.number() + }, + d: { + e: Joi.any() + } +}).assert('d.e', Joi.ref('a.c'), 'equal to a.c'); +``` + +#### `object.unknown([allow])` + +Overrides the handling of unknown keys for the scope of the current object only (does not apply to children) where: +- `allow` - if `false`, unknown keys are not allowed, otherwise unknown keys are ignored. + +```javascript +var schema = Joi.object({ a: Joi.any() }).unknown(); +``` + +#### `object.type(constructor, [name])` + +Requires the object to be an instance of a given constructor where: +- `constructor` - the constructor function that the object must be an instance of. +- `name` - an alternate name to use in validation errors. This is useful when the constructor function does not have a name. + +```javascript +var schema = Joi.object().type(RegExp); +``` + +#### `object.requiredKeys(children)` + +Sets the specified children to required. +- `children` - can be a single string value, an array of string values, or each child provided as an argument. + +```javascript +var schema = Joi.object().keys({ a: { b: Joi.number() }, c: { d: Joi.string() } }); +var requiredSchema = schema.requiredKeys('', 'a.b', 'c', 'c.d'); +``` + +Note that in this example `''` means the current object, `a` is not required but `b` is, as well as `c` and `d`. + +#### `object.optionalKeys(children)` + +Sets the specified children to optional. +- `children` - can be a single string value, an array of string values, or each child provided as an argument. + +```javascript +var schema = Joi.object().keys({ a: { b: Joi.number().required() }, c: { d: Joi.string().required() } }); +var requiredSchema = schema.optionalKeys('a.b', 'c.d'); +``` + +The behavior is exactly the same as `requiredKeys`. + +### `string` + +Generates a schema object that matches a string data type. Note that empty strings are not allowed by default and must be enabled with `allow('')`. + +Supports the same methods of the [`any()`](#any) type. + +```javascript +var schema = Joi.string().min(1).max(10); +schema.validate('12345', function (err, value) { }); +``` + +#### `string.insensitive()` + +Allows the value to match any whitelist of blacklist item in a case insensitive comparison. + +```javascript +var schema = Joi.string().valid('a').insensitive(); +``` + +#### `string.min(limit, [encoding])` + +Specifies the minimum number string characters where: +- `limit` - the minimum number of string characters required. +- `encoding` - is specified, the string length is calculated in bytes using the provided encoding. + +```javascript +var schema = Joi.string().min(2); +``` + +#### `string.max(limit, [encoding])` + +Specifies the maximum number of string characters where: +- `limit` - the maximum number of string characters allowed. +- `encoding` - is specified, the string length is calculated in bytes using the provided encoding. + +```javascript +var schema = Joi.string().max(10); +``` + +#### `string.creditCard()` + +Requires the number to be a credit card number (Using [Lunh +Algorithm](http://en.wikipedia.org/wiki/Luhn_algorithm)). + +```javascript +var schema = Joi.string().creditCard(); +``` + +#### `string.length(limit, [encoding])` + +Specifies the exact string length required where: +- `limit` - the required string length. +- `encoding` - is specified, the string length is calculated in bytes using the provided encoding. + +```javascript +var schema = Joi.string().length(5); +``` + +#### `string.regex(pattern, [name])` + +Defines a regular expression rule where: +- `pattern` - a regular expression object the string value must match against. +- `name` - optional name for patterns (useful with multiple patterns). Defaults to 'required'. + +```javascript +var schema = Joi.string().regex(/^[abc]+$/); +``` + +#### `string.alphanum()` + +Requires the string value to only contain a-z, A-Z, and 0-9. + +```javascript +var schema = Joi.string().alphanum(); +``` + +#### `string.token()` + +Requires the string value to only contain a-z, A-Z, 0-9, and underscore _. + +```javascript +var schema = Joi.string().token(); +``` + +#### `string.email()` + +Requires the string value to be a valid email address. + +```javascript +var schema = Joi.string().email(); +``` + +#### `string.guid()` + +Requires the string value to be a valid GUID. + +```javascript +var schema = Joi.string().guid(); +``` + +#### `string.hostname()` + +Requires the string value to be a valid hostname as per [RFC1123](http://tools.ietf.org/html/rfc1123). + +```javascript +var schema = Joi.string().hostname(); +``` + +#### `string.lowercase()` + +Requires the string value to be all lowercase. If the validation `convert` option is on (enabled by default), the string +will be forced to lowercase. + +```javascript +var schema = Joi.string().lowercase(); +``` + +#### `string.uppercase()` + +Requires the string value to be all uppercase. If the validation `convert` option is on (enabled by default), the string +will be forced to uppercase. + +```javascript +var schema = Joi.string().uppercase(); +``` + +#### `string.trim()` + +Requires the string value to contain no whitespace before or after. If the validation `convert` option is on (enabled by +default), the string will be trimmed. + +```javascript +var schema = Joi.string().trim(); +``` + +### `alternatives` + +Generates a type that will match one of the provided alternative schemas via the [`try()`](#alternativestryschemas) +method. If no schemas are added, the type will not match any value except for `undefined`. + +Supports the same methods of the [`any()`](#any) type. + +Alternatives can be expressed using the shorter `[]` notation. + +```javascript +var alt = Joi.alternatives().try(Joi.number(), Joi.string()); +// Same as [Joi.number(), Joi.string()] +``` + +#### `alternatives.try(schemas)` + +Adds an alternative schema type for attempting to match against the validated value where: +- `schema` - an array of alternative **joi** types. Also supports providing each type as a separate argument. + +```javascript +var alt = Joi.alternatives().try(Joi.number(), Joi.string()); +alt.validate('a', function (err, value) { }); +``` + +#### `alternatives.when(ref, options)` + +Adds a conditional alternative schema type based on another key (not the same as `any.when()`) value where: +- `ref` - the key name or [reference](#refkey-options). +- `options` - an object with: + - `is` - the required condition **joi** type. + - `then` - the alternative schema type to **try** if the condition is true. Required if `otherwise` is missing. + - `otherwise` - the alternative schema type to **try** if the condition is false. Required if `then` is missing. + +```javascript +var schema = { + a: Joi.alternatives().when('b', { is: 5, then: Joi.string(), otherwise: Joi.number() }), + b: Joi.any() +}; +``` + +Note that `when()` only adds additional alternatives to try and does not impact the overall type. Setting +a `required()` rule on a single alternative will not apply to the overall key. For example, +this definition of `a`: + +```javascript +var schema = { + a: Joi.alternatives().when('b', { is: true, then: Joi.required() }), + b: Joi.boolean() +}; +``` + +Does not turn `a` into a required key when `b` is `true`. Instead, it tells the validator to try and match the +value to anything that's not `undefined`. However, since `Joi.alternatives()` by itself allows `undefined`, the rule +does not accomplish turning `a` to a required value. This rule is the same as `Joi.alternatives([Joi.required()])` +when `b` is `true` which will allow any value including `undefined`. + +To accomplish the desired result above use: + +```javascript +var schema = { + a: Joi.when('b', { is: true, then: Joi.required() }), + b: Joi.boolean() +}; +``` + +### `ref(key, [options])` + +Generates a reference to the value of the named key. References are resolved at validation time and in order of dependency +so that if one key validation depends on another, the dependent key is validated second after the reference is validated. +References support the following arguments: +- `key` - the reference target. References cannot point up the object tree, only to sibling keys, but they can point to + their siblings' children (e.g. 'a.b.c') using the `.` separator. If a `key` starts with `$` is signifies a context reference + which is looked up in the `context` option object. +- `options` - optional settings: + - `separator` - overrides the default `.` hierarchy separator. + - `contextPrefix` - overrides the default `$` context prefix signifier. + +Note that references can only be used where explicitly supported such as in `valid()` or `invalid()` rules. If upwards +(parents) references are needed, use [`object.assert()`](#objectassertref-schema-message). + +```javascript +var schema = Joi.object().keys({ + a: Joi.ref('b.c'), + b: { + c: Joi.any() + }, + c: Joi.ref('$x') +}); + +Joi.validate({ a: 5, b: { c: 5 } }, schema, { context: { x: 5 } }, function (err, value) {}); +``` diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/examples/conditionalRequire.js b/node_modules/hapi/node_modules/vision/node_modules/joi/examples/conditionalRequire.js new file mode 100644 index 0000000..8ed0a6a --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/examples/conditionalRequire.js @@ -0,0 +1,43 @@ +// This is an example of a survey to obtain the reputation of Parisians +// It contains examples of how to conditionally require keys based on values of other keys + +var Joi = require("../"); + +// This is a valid value for integer rating 1 - 5 +var intRating = Joi.number().integer().min(1).max(5); + +var schema = Joi.object().keys({ + // Do you know any French people? yes or no (required) + q1: Joi.boolean().required(), + // Do you know any Parisians? yes or no (required if answered yes in q1) + q2: Joi.boolean() + .when('q1', { is: true, then: Joi.required() }), + // How many french in paris do you know? 1-6, 6-10, 11-50 or 50+ (required if answered yes in q2) + q3: Joi.string() + .when('q2', { is: true, then: Joi.valid('1-5', '6-10', '11-50', '50+').required() }), + // Rate 20% of most friendly Parisians, from how many people you know answered in q3, individually on 1-5 rating + q4: Joi.array() + .when('q3', {is: '1-5', then: Joi.array().min(0).max(1).includes(intRating).required() }) + .when('q3', {is: '6-10', then: Joi.array().min(1).max(2).includes(intRating).required() }) + .when('q3', {is: '11-50', then: Joi.array().min(2).max(10).includes(intRating).required() }) + .when('q3', {is: '50+' , then: Joi.array().min(10).includes(intRating).required() }), + // Rate remaining 80% of Parisians, from how many people you know answered in q3, individually on 1-5 rating + q5: Joi.array() + .when('q3', {is: '1-5', then: Joi.array().min(1).max(4).includes(intRating).required() }) + .when('q3', {is: '6-10', then: Joi.array().min(4).max(8).includes(intRating).required() }) + .when('q3', {is: '11-50', then: Joi.array().min(8).max(40).includes(intRating).required() }) + .when('q3', {is: '50+' , then: Joi.array().min(40).includes(intRating).required().required() }), + // Rate the reputation of Parisians in general, 1-5 rating + q6: intRating.required() +}); + +var response = { + q1: true, + q2: true, + q3: '1-5', + q4: [5], + q4: [1], + q6: 2 +}; + +Joi.assert(response, schema); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/examples/customMessage.js b/node_modules/hapi/node_modules/vision/node_modules/joi/examples/customMessage.js new file mode 100755 index 0000000..38cd28a --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/examples/customMessage.js @@ -0,0 +1,22 @@ +var Joi = require('../'); + + +var schema = Joi.object().options({ abortEarly: false }).keys({ + email: Joi.string().email().required().label('User Email'), + password: Joi.string().min(8).required(), + password_confirmation: Joi.any().valid(Joi.ref('password')).required().options({ language: { any: { allowOnly: 'must match password' }, label: 'Password Confirmation' } }).label('This label is not used because language.label takes precedence'), + first_name: Joi.string().required(), + last_name: Joi.string().required(), + company: Joi.string().optional() +}); + + +var data = { + email: 'not_a_valid_email_to_show_custom_label', + password: 'abcd1234', + password_confirmation: 'abc1', + first_name: 'Joe', + last_name: 'Doe' +}; + +Joi.assert(data, schema); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/examples/multipleWhen.js b/node_modules/hapi/node_modules/vision/node_modules/joi/examples/multipleWhen.js new file mode 100755 index 0000000..b13cba9 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/examples/multipleWhen.js @@ -0,0 +1,17 @@ +var Joi = require('../'); + + +var schema = { + type: Joi.string().required(), + subtype: Joi.alternatives() + .when('type', {is: 'video', then: Joi.valid('mp4', 'wav')}) + .when('type', {is: 'audio', then: Joi.valid('mp3')}) + .when('type', {is: 'image', then: Joi.valid('jpg', 'png')}) + .when('type', {is: 'pdf' , then: Joi.valid('document')}) +}; + + +Joi.assert({ type: 'video', subtype: 'mp4' }, schema); // Pass +Joi.assert({ type: 'video', subtype: 'wav' }, schema); // Pass +Joi.assert({ type: 'other', subtype: 'something' }, schema); // Fail +Joi.assert({ type: 'audio', subtype: 'mp4' }, schema); // Fail diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/images/joi.png b/node_modules/hapi/node_modules/vision/node_modules/joi/images/joi.png new file mode 100755 index 0000000000000000000000000000000000000000..d240833802bcd4e4e0becde614466a3f36f09480 GIT binary patch literal 30662 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�bm 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

Hr1>gKd}HOXUrnp$Jk^n( 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 0, 'limit must be a positive integer'); + + return this._test('min', limit, function (value, state, options) { + + if (value.length >= limit) { + return null; + } + + return Errors.create('array.min', { limit: limit }, state, options); + }); +}; + + +internals.Array.prototype.max = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('max', limit, function (value, state, options) { + + if (value.length <= limit) { + return null; + } + + return Errors.create('array.max', { limit: limit }, state, options); + }); +}; + + +internals.Array.prototype.length = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('length', limit, function (value, state, options) { + + if (value.length === limit) { + return null; + } + + return Errors.create('array.length', { limit: limit }, state, options); + }); +}; + + +internals.Array.prototype.unique = function () { + + return this._test('unique', undefined, function (value, state, options) { + + var found = { + string: {}, + number: {}, + undefined: {}, + boolean: {}, + object: [], + function: [] + }; + + for (var i = 0, il = value.length; i < il; ++i) { + var item = value[i]; + var type = typeof item; + var records = found[type]; + + // All available types are supported, so it's not possible to reach 100% coverage without ignoring this line. + // I still want to keep the test for future js versions with new types (eg. Symbol). + if (/* $lab:coverage:off$ */ records /* $lab:coverage:on$ */) { + if (Array.isArray(records)) { + for (var r = 0, rl = records.length; r < rl; ++r) { + if (Hoek.deepEqual(records[r], item)) { + return Errors.create('array.unique', { pos: i }, state, options); + } + } + + records.push(item); + } + else { + if (records[item]) { + return Errors.create('array.unique', { pos: i }, state, options); + } + + records[item] = true; + } + } + } + }); +}; + + +internals.Array.prototype.sparse = function (enabled) { + + var obj = this.clone(); + obj._flags.sparse = enabled === undefined ? true : !!enabled; + return obj; +}; + + +internals.Array.prototype.single = function (enabled) { + + var obj = this.clone(); + obj._flags.single = enabled === undefined ? true : !!enabled; + return obj; +} + + +module.exports = new internals.Array(); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/binary.js b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/binary.js new file mode 100755 index 0000000..83715b8 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/binary.js @@ -0,0 +1,98 @@ +// Load modules + +var Any = require('./any'); +var Errors = require('./errors'); +var Hoek = require('hoek'); + + +// Declare internals + +var internals = {}; + + +internals.Binary = function () { + + Any.call(this); + this._type = 'binary'; +}; + +Hoek.inherits(internals.Binary, Any); + + +internals.Binary.prototype._base = function (value, state, options) { + + var result = { + value: value + }; + + if (typeof value === 'string' && + options.convert) { + + try { + var converted = new Buffer(value, this._flags.encoding); + result.value = converted; + } + catch (e) { } + } + + result.errors = Buffer.isBuffer(result.value) ? null : Errors.create('binary.base', null, state, options); + return result; +}; + + +internals.Binary.prototype.encoding = function (encoding) { + + Hoek.assert(Buffer.isEncoding(encoding), 'Invalid encoding:', encoding); + + var obj = this.clone(); + obj._flags.encoding = encoding; + return obj; +}; + + +internals.Binary.prototype.min = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('min', limit, function (value, state, options) { + + if (value.length >= limit) { + return null; + } + + return Errors.create('binary.min', { limit: limit }, state, options); + }); +}; + + +internals.Binary.prototype.max = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('max', limit, function (value, state, options) { + + if (value.length <= limit) { + return null; + } + + return Errors.create('binary.max', { limit: limit }, state, options); + }); +}; + + +internals.Binary.prototype.length = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('length', limit, function (value, state, options) { + + if (value.length === limit) { + return null; + } + + return Errors.create('binary.length', { limit: limit }, state, options); + }); +}; + + +module.exports = new internals.Binary(); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/boolean.js b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/boolean.js new file mode 100755 index 0000000..b182a01 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/boolean.js @@ -0,0 +1,41 @@ +// Load modules + +var Any = require('./any'); +var Errors = require('./errors'); +var Hoek = require('hoek'); + + +// Declare internals + +var internals = {}; + + +internals.Boolean = function () { + + Any.call(this); + this._type = 'boolean'; +}; + +Hoek.inherits(internals.Boolean, Any); + + +internals.Boolean.prototype._base = function (value, state, options) { + + var result = { + value: value + }; + + if (typeof value === 'string' && + options.convert) { + + var lower = value.toLowerCase(); + result.value = (lower === 'true' || lower === 'yes' || lower === 'on' ? true + : (lower === 'false' || lower === 'no' || lower === 'off' ? false : value)); + } + + result.errors = (typeof result.value === 'boolean') ? null : Errors.create('boolean.base', null, state, options); + return result; +}; + + +module.exports = new internals.Boolean(); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/cast.js b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/cast.js new file mode 100755 index 0000000..41fd99b --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/cast.js @@ -0,0 +1,74 @@ +// Load modules + +var Hoek = require('hoek'); +var Ref = require('./ref'); +// Type modules are delay-loaded to prevent circular dependencies + + +// Declare internals + +var internals = { + any: null, + date: require('./date'), + string: require('./string'), + number: require('./number'), + boolean: require('./boolean'), + alt: null, + object: null +}; + + +exports.schema = function (config) { + + internals.any = internals.any || new (require('./any'))(); + internals.alt = internals.alt || require('./alternatives'); + internals.object = internals.object || require('./object'); + + if (config && + typeof config === 'object') { + + if (config.isJoi) { + return config; + } + + if (Array.isArray(config)) { + return internals.alt.try(config); + } + + if (config instanceof RegExp) { + return internals.string.regex(config); + } + + if (config instanceof Date) { + return internals.date.valid(config); + } + + return internals.object.keys(config); + } + + if (typeof config === 'string') { + return internals.string.valid(config); + } + + if (typeof config === 'number') { + return internals.number.valid(config); + } + + if (typeof config === 'boolean') { + return internals.boolean.valid(config); + } + + if (Ref.isRef(config)) { + return internals.any.valid(config); + } + + Hoek.assert(config === null, 'Invalid schema content:', config); + + return internals.any.valid(null); +}; + + +exports.ref = function (id) { + + return Ref.isRef(id) ? id : Ref.create(id); +}; \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/date.js b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/date.js new file mode 100755 index 0000000..1fa8f7b --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/date.js @@ -0,0 +1,168 @@ +// Load modules + +var Any = require('./any'); +var Errors = require('./errors'); +var Ref = require('./ref'); +var Hoek = require('hoek'); +var Moment = require('moment'); + + +// Declare internals + +var internals = {}; + +internals.isoDate = /^((\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\d))$/; +internals.invalidDate = new Date(''); +internals.isIsoDate = (function() { + + var isoString = internals.isoDate.toString(); + + return function (date) { + + return date && (date.toString() === isoString); + }; +})(); + +internals.Date = function () { + + Any.call(this); + this._type = 'date'; +}; + +Hoek.inherits(internals.Date, Any); + + +internals.Date.prototype._base = function (value, state, options) { + + var result = { + value: (options.convert && internals.toDate(value, this._flags.format)) || value + }; + + if (result.value instanceof Date && !isNaN(result.value.getTime())) { + result.errors = null; + } + else { + result.errors = Errors.create(internals.isIsoDate(this._flags.format) ? 'date.isoDate' : 'date.base', null, state, options); + } + + return result; +}; + + +internals.toDate = function (value, format) { + + if (value instanceof Date) { + return value; + } + + if (typeof value === 'string' || + Hoek.isInteger(value)) { + + if (typeof value === 'string' && + /^[+-]?\d+$/.test(value)) { + + value = parseInt(value, 10); + } + + var date; + if (format) { + if (internals.isIsoDate(format)) { + date = format.test(value) ? new Date(value) : internals.invalidDate; + } + else { + date = Moment(value, format, true); + date = date.isValid() ? date.toDate() : internals.invalidDate; + } + } + else { + date = new Date(value); + } + + if (!isNaN(date.getTime())) { + return date; + } + } + + return null; +}; + + +internals.compare = function (type, compare) { + + return function (date) { + + var isNow = date === 'now'; + var isRef = Ref.isRef(date); + + if (!isNow && !isRef) { + date = internals.toDate(date); + } + + Hoek.assert(date, 'Invalid date format'); + + return this._test(type, date, function (value, state, options) { + + var compareTo; + if (isNow) { + compareTo = Date.now(); + } + else if (isRef) { + compareTo = internals.toDate(date(state.parent)); + + if (!compareTo) { + return Errors.create('date.ref', { ref: date.key }, state, options); + } + + compareTo = compareTo.getTime(); + } + else { + compareTo = date.getTime(); + } + + if (compare(value.getTime(), compareTo)) { + return null; + } + + return Errors.create('date.' + type, { limit: new Date(compareTo) }, state, options); + }); + }; +}; + + +internals.Date.prototype.min = internals.compare('min', function (value, date) { + + return value >= date; +}); + + +internals.Date.prototype.max = internals.compare('max', function (value, date) { + + return value <= date; +}); + + +internals.Date.prototype.format = function (format) { + + Hoek.assert(typeof format === 'string' || (Array.isArray(format) && format.every(function (f) { + + return typeof f === 'string'; + })), 'Invalid format.'); + + var obj = this.clone(); + obj._flags.format = format; + return obj; +}; + +internals.Date.prototype.iso = function () { + + var obj = this.clone(); + obj._flags.format = internals.isoDate; + return obj; +}; + +internals.Date.prototype._isIsoDate = function (value) { + + return internals.isoDate.test(value); +}; + +module.exports = new internals.Date(); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/errors.js b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/errors.js new file mode 100755 index 0000000..034642a --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/errors.js @@ -0,0 +1,159 @@ +// Load modules + +var Hoek = require('hoek'); +var Language = require('./language'); + + +// Declare internals + +var internals = {}; + + +internals.Err = function (type, context, state, options) { + + this.type = type; + this.context = context || {}; + this.context.key = state.key; + this.path = state.path; + this.options = options; +}; + + +internals.Err.prototype.toString = function () { + + var self = this; + + var localized = this.options.language; + this.context.key = localized.label || this.context.key || localized.root || Language.errors.root; + + var format = Hoek.reach(localized, this.type) || Hoek.reach(Language.errors, this.type); + var hasKey = /\{\{\!?key\}\}/.test(format); + format = (hasKey ? format : '{{!key}} ' + format); + var message = format.replace(/\{\{(\!?)([^}]+)\}\}/g, function ($0, isSecure, name) { + + var value = Hoek.reach(self.context, name); + var normalized = Array.isArray(value) ? value.join(', ') : value.toString(); + return (isSecure ? Hoek.escapeHtml(normalized) : normalized); + }); + + return message; +}; + + +exports.create = function (type, context, state, options) { + + return new internals.Err(type, context, state, options); +}; + + +exports.process = function (errors, object) { + + if (!errors || !errors.length) { + return null; + } + + var details = []; + for (var i = 0, il = errors.length; i < il; ++i) { + var item = errors[i]; + details.push({ + message: item.toString(), + path: internals.getPath(item), + type: item.type, + context: item.context + }); + } + + // Construct error + + var message = ''; + details.forEach(function (error) { + + message += (message ? '. ' : '') + error.message; + }); + + var error = new Error(message); + error.name = 'ValidationError'; + error.details = details; + error._object = object; + error.annotate = internals.annotate; + return error; +}; + + +internals.getPath = function (item) { + + var recursePath = function (it) { + + var reachedItem = Hoek.reach(it, 'context.reason.0'); + if (reachedItem && reachedItem.context) { + return recursePath(reachedItem); + } + + return it.path; + }; + + return recursePath(item) || item.context.key; +}; + + +internals.annotate = function () { + + var obj = Hoek.clone(this._object || {}); + + var lookup = {}; + var el = this.details.length; + for (var e = el - 1; e >= 0; --e) { // Reverse order to process deepest child first + var pos = el - e; + var error = this.details[e]; + var path = error.path.split('.'); + var ref = obj; + for (var i = 0, il = path.length; i < il && ref; ++i) { + var seg = path[i]; + if (i + 1 < il) { + ref = ref[seg]; + } + else { + var value = ref[seg]; + if (value !== undefined) { + delete ref[seg]; + var label = seg + '_$key$_' + pos + '_$end$_'; + ref[label] = value; + lookup[error.path] = label; + } + else if (lookup[error.path]) { + var replacement = lookup[error.path]; + var appended = replacement.replace('_$end$_', ', ' + pos + '_$end$_'); + ref[appended] = ref[replacement]; + lookup[error.path] = appended; + delete ref[replacement]; + } + else { + ref['_$miss$_' + seg + '|' + pos + '_$end$_'] = '__missing__'; + } + } + } + } + + var annotated = JSON.stringify(obj, null, 2); + + annotated = annotated.replace(/_\$key\$_([, \d]+)_\$end\$_\"/g, function ($0, $1) { + + return '" \u001b[31m[' + $1 + ']\u001b[0m'; + }); + + var message = annotated.replace(/\"_\$miss\$_([^\|]+)\|(\d+)_\$end\$_\"\: \"__missing__\"/g, function ($0, $1, $2) { + + return '\u001b[41m"' + $1 + '"\u001b[0m\u001b[31m [' + $2 + ']: -- missing --\u001b[0m'; + }); + + message += '\n\u001b[31m'; + + for (e = 0; e < el; ++e) { + message += '\n[' + (e + 1) + '] ' + this.details[e].message; + } + + message += '\u001b[0m'; + + return message; +}; + diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/function.js b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/function.js new file mode 100755 index 0000000..a11f72c --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/function.js @@ -0,0 +1,31 @@ +// Load modules + +var Any = require('./any'); +var Errors = require('./errors'); +var Hoek = require('hoek'); + + +// Declare internals + +var internals = {}; + + +internals.Function = function () { + + Any.call(this); + this._type = 'func'; +}; + +Hoek.inherits(internals.Function, Any); + + +internals.Function.prototype._base = function (value, state, options) { + + return { + value: value, + errors: (typeof value === 'function') ? null : Errors.create('function.base', null, state, options) + }; +}; + + +module.exports = new internals.Function(); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/index.js b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/index.js new file mode 100755 index 0000000..2db8d5d --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/index.js @@ -0,0 +1,129 @@ +// Load modules + +var Hoek = require('hoek'); +var Any = require('./any'); +var Cast = require('./cast'); +var Ref = require('./ref'); + + +// Declare internals + +var internals = { + alternatives: require('./alternatives'), + array: require('./array'), + boolean: require('./boolean'), + binary: require('./binary'), + date: require('./date'), + func: require('./function'), + number: require('./number'), + object: require('./object'), + string: require('./string') +}; + + +internals.root = function () { + + var any = new Any(); + + var root = any.clone(); + root.any = function () { + + return any; + }; + + root.alternatives = root.alt = function () { + + return arguments.length ? internals.alternatives.try.apply(internals.alternatives, arguments) : internals.alternatives; + }; + + root.array = function () { + + return internals.array; + }; + + root.boolean = root.bool = function () { + + return internals.boolean; + }; + + root.binary = function () { + + return internals.binary; + }; + + root.date = function () { + + return internals.date; + }; + + root.func = function () { + + return internals.func; + }; + + root.number = function () { + + return internals.number; + }; + + root.object = function () { + + return arguments.length ? internals.object.keys.apply(internals.object, arguments) : internals.object; + }; + + root.string = function () { + + return internals.string; + }; + + root.ref = function () { + + return Ref.create.apply(null, arguments); + }; + + root.isRef = function (ref) { + + return Ref.isRef(ref); + }; + + root.validate = function (value /*, [schema], [options], callback */) { + + var last = arguments[arguments.length - 1]; + var callback = typeof last === 'function' ? last : null; + + var count = arguments.length - (callback ? 1 : 0); + if (count === 1) { + return any.validate(value, callback); + } + + var options = count === 3 ? arguments[2] : {}; + var schema = Cast.schema(arguments[1]); + + return schema._validateWithOptions(value, options, callback); + }; + + root.describe = function () { + + var schema = arguments.length ? Cast.schema(arguments[0]) : any; + return schema.describe(); + }; + + root.compile = function (schema) { + + return Cast.schema(schema); + }; + + root.assert = function (value, schema, message) { + + message = (message ? message + ' ' : ''); + var error = root.validate(value, schema).error; + if (error) { + throw new Error(message + error.annotate()); + } + }; + + return root; +}; + + +module.exports = internals.root(); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/language.js b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/language.js new file mode 100755 index 0000000..64246b2 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/language.js @@ -0,0 +1,106 @@ +// Load modules + + +// Declare internals + +var internals = {}; + + +exports.errors = { + root: 'value', + any: { + unknown: 'is not allowed', + invalid: 'contains an invalid value', + empty: 'is not allowed to be empty', + required: 'is required', + allowOnly: 'must be one of {{valids}}' + }, + alternatives: { + base: 'not matching any of the allowed alternatives' + }, + array: { + base: 'must be an array', + includes: 'at position {{pos}} does not match any of the allowed types', + includesSingle: 'single value of {{!key}} does not match any of the allowed types', + includesOne: 'at position {{pos}} fails because {{reason}}', + includesOneSingle: 'single value of {{!key}} fails because {{reason}}', + excludes: 'at position {{pos}} contains an excluded value', + excludesSingle: 'single value of {{!key}} contains an excluded value', + min: 'must contain at least {{limit}} items', + max: 'must contain less than or equal to {{limit}} items', + length: 'must contain {{limit}} items', + sparse: 'must not be a sparse array', + unique: 'position {{pos}} contains a duplicate value' + }, + boolean: { + base: 'must be a boolean' + }, + binary: { + base: 'must be a buffer or a string', + min: 'must be at least {{limit}} bytes', + max: 'must be less than or equal to {{limit}} bytes', + length: 'must be {{limit}} bytes' + }, + date: { + base: 'must be a number of milliseconds or valid date string', + min: 'must be larger than or equal to {{limit}}', + max: 'must be less than or equal to {{limit}}', + isoDate: 'must be a valid ISO 8601 date', + ref: 'references {{ref}} which is not a date' + }, + function: { + base: 'must be a Function' + }, + object: { + base: 'must be an object', + min: 'must have at least {{limit}} children', + max: 'must have less than or equal to {{limit}} children', + length: 'must have {{limit}} children', + allowUnknown: 'is not allowed', + with: 'missing required peer {{peer}}', + without: 'conflict with forbidden peer {{peer}}', + missing: 'must contain at least one of {{peers}}', + xor: 'contains a conflict between exclusive peers {{peers}}', + or: 'must contain at least one of {{peers}}', + and: 'contains {{present}} without its required peers {{missing}}', + nand: '{{main}} must not exist simultaneously with {{peers}}', + assert: 'validation failed because {{ref}} failed to {{message}}', + rename: { + multiple: 'cannot rename child {{from}} because multiple renames are disabled and another key was already renamed to {{to}}', + override: 'cannot rename child {{from}} because override is disabled and target {{to}} exists' + }, + type: 'must be an instance of {{type}}' + }, + number: { + base: 'must be a number', + min: 'must be larger than or equal to {{limit}}', + max: 'must be less than or equal to {{limit}}', + less: 'must be less than {{limit}}', + greater: 'must be greater than {{limit}}', + float: 'must be a float or double', + integer: 'must be an integer', + negative: 'must be a negative number', + positive: 'must be a positive number', + precision: 'must have no more than {{limit}} decimal places' + }, + string: { + base: 'must be a string', + min: 'length must be at least {{limit}} characters long', + max: 'length must be less than or equal to {{limit}} characters long', + length: 'length must be {{limit}} characters long', + alphanum: 'must only contain alpha-numeric characters', + token: 'must only contain alpha-numeric and underscore characters', + regex: { + base: 'fails to match the required pattern', + name: 'fails to match the {{name}} pattern' + }, + email: 'must be a valid email', + isoDate: 'must be a valid ISO 8601 date', + guid: 'must be a valid GUID', + hostname: 'must be a valid hostname', + lowercase: 'must only contain lowercase characters', + uppercase: 'must only contain uppercase characters', + trim: 'must not have leading or trailing whitespace', + creditCard: 'must be a credit card' + } +}; diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/number.js b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/number.js new file mode 100755 index 0000000..0d2f693 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/number.js @@ -0,0 +1,170 @@ +// Load modules + +var Any = require('./any'); +var Errors = require('./errors'); +var Hoek = require('hoek'); + + +// Declare internals + +var internals = {}; + + +internals.Number = function () { + + Any.call(this); + this._type = 'number'; + this._invalids.add(Infinity); + this._invalids.add(-Infinity); +}; + +Hoek.inherits(internals.Number, Any); + + +internals.Number.prototype._base = function (value, state, options) { + + var result = { + errors: null, + value: value + }; + + if (typeof value === 'string' && + options.convert) { + + var number = parseFloat(value); + result.value = (isNaN(number) || !isFinite(value)) ? NaN : number; + } + + var isNumber = typeof result.value === 'number' && !isNaN(result.value); + + if (options.convert && 'precision' in this._flags && isNumber) { + // This is conceptually equivalent to using toFixed but it should be much faster + var precision = Math.pow(10, this._flags.precision); + result.value = Math.round(result.value * precision) / precision; + } + + result.errors = isNumber ? null : Errors.create('number.base', null, state, options); + return result; +}; + + +internals.Number.prototype.min = function (limit) { + + Hoek.assert(Hoek.isInteger(limit), 'limit must be an integer'); + + return this._test('min', limit, function (value, state, options) { + + if (value >= limit) { + return null; + } + + return Errors.create('number.min', { limit: limit }, state, options); + }); +}; + + +internals.Number.prototype.max = function (limit) { + + Hoek.assert(Hoek.isInteger(limit), 'limit must be an integer'); + + return this._test('max', limit, function (value, state, options) { + + if (value <= limit) { + return null; + } + + return Errors.create('number.max', { limit: limit }, state, options); + }); +}; + + +internals.Number.prototype.greater = function (limit) { + + Hoek.assert(Hoek.isInteger(limit), 'limit must be an integer'); + + return this._test('greater', limit, function (value, state, options) { + + if (value > limit) { + return null; + } + + return Errors.create('number.greater', { limit: limit }, state, options); + }); +}; + + +internals.Number.prototype.less = function (limit) { + + Hoek.assert(Hoek.isInteger(limit), 'limit must be an integer'); + + return this._test('less', limit, function (value, state, options) { + + if (value < limit) { + return null; + } + + return Errors.create('number.less', { limit: limit }, state, options); + }); +}; + + +internals.Number.prototype.integer = function () { + + return this._test('integer', undefined, function (value, state, options) { + + return Hoek.isInteger(value) ? null : Errors.create('number.integer', null, state, options); + }); +}; + + +internals.Number.prototype.negative = function () { + + return this._test('negative', undefined, function (value, state, options) { + + if (value < 0) { + return null; + } + + return Errors.create('number.negative', null, state, options); + }); +}; + + +internals.Number.prototype.positive = function () { + + return this._test('positive', undefined, function (value, state, options) { + + if (value > 0) { + return null; + } + + return Errors.create('number.positive', null, state, options); + }); +}; + + +internals.precisionRx = /(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/; + + +internals.Number.prototype.precision = function (limit) { + + Hoek.assert(Hoek.isInteger(limit), 'limit must be an integer'); + Hoek.assert(!('precision' in this._flags), 'precision already set'); + + var obj = this._test('precision', limit, function (value, state, options){ + + var places = value.toString().match(internals.precisionRx); + var decimals = Math.max((places[1] ? places[1].length : 0) - (places[2] ? parseInt(places[2], 10) : 0), 0); + if (decimals <= limit) { + return null; + } + + return Errors.create('number.precision', {limit: limit}, state, options); + }); + + obj._flags.precision = limit; + return obj; +}; + + +module.exports = new internals.Number(); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/object.js b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/object.js new file mode 100755 index 0000000..99acacf --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/object.js @@ -0,0 +1,685 @@ +// Load modules + +var Hoek = require('hoek'); +var Topo = require('topo'); +var Any = require('./any'); +var Cast = require('./cast'); +var Errors = require('./errors'); + + +// Declare internals + +var internals = {}; + + +internals.Object = function () { + + Any.call(this); + this._type = 'object'; + this._inner.children = null; + this._inner.renames = []; + this._inner.dependencies = []; + this._inner.patterns = []; +}; + +Hoek.inherits(internals.Object, Any); + + +internals.Object.prototype._base = function (value, state, options) { + + var target = value; + var errors = []; + var finish = function () { + + return { + value: target, + errors: errors.length ? errors : null + }; + }; + + if (typeof value === 'string' && + options.convert) { + + try { + value = JSON.parse(value); + } + catch (err) { } + } + + if (!value || + typeof value !== 'object' || + Array.isArray(value)) { + + errors.push(Errors.create('object.base', null, state, options)); + return finish(); + } + + // Skip if there are no other rules to test + + if (!this._inner.renames.length && + !this._inner.dependencies.length && + !this._inner.children && // null allows any keys + !this._inner.patterns.length) { + + target = value; + return finish(); + } + + // Ensure target is a local copy (parsed) or shallow copy + + if (target === value) { + target = Object.create(Object.getPrototypeOf(value)); + var valueKeys = Object.keys(value); + for (var t = 0, tl = valueKeys.length; t < tl; ++t) { + target[valueKeys[t]] = value[valueKeys[t]]; + } + } + else { + target = value; + } + + // Rename keys + + var renamed = {}; + for (var r = 0, rl = this._inner.renames.length; r < rl; ++r) { + var item = this._inner.renames[r]; + + if (target[item.from] === undefined) { + continue; + } + + if (!item.options.multiple && + renamed[item.to]) { + + errors.push(Errors.create('object.rename.multiple', { from: item.from, to: item.to }, state, options)); + if (options.abortEarly) { + return finish(); + } + } + + if (target.hasOwnProperty(item.to) && + !item.options.override && + !renamed[item.to]) { + + errors.push(Errors.create('object.rename.override', { from: item.from, to: item.to }, state, options)); + if (options.abortEarly) { + return finish(); + } + } + + target[item.to] = target[item.from]; + renamed[item.to] = true; + + if (!item.options.alias) { + delete target[item.from]; + } + } + + // Validate dependencies + + for (var d = 0, dl = this._inner.dependencies.length; d < dl; ++d) { + var dep = this._inner.dependencies[d]; + var err = internals[dep.type](dep.key !== null && value[dep.key], dep.peers, target, { key: dep.key, path: (state.path ? state.path + '.' : '') + dep.key }, options); + if (err) { + errors.push(err); + if (options.abortEarly) { + return finish(); + } + } + } + + // Validate schema + + if (!this._inner.children && // null allows any keys + !this._inner.patterns.length) { + + return finish(); + } + + var unprocessed = Hoek.mapToObject(Object.keys(target)); + var key; + + if (this._inner.children) { + for (var i = 0, il = this._inner.children.length; i < il; ++i) { + var child = this._inner.children[i]; + var key = child.key; + var item = target[key]; + + delete unprocessed[key]; + + var localState = { key: key, path: (state.path ? state.path + '.' : '') + key, parent: target, reference: state.reference }; + var result = child.schema._validate(item, localState, options); + if (result.errors) { + errors = errors.concat(result.errors); + if (options.abortEarly) { + return finish(); + } + } + + if (result.value !== undefined) { + target[key] = result.value; + } + } + } + + // Unknown keys + + var unprocessedKeys = Object.keys(unprocessed); + if (unprocessedKeys.length && + this._inner.patterns.length) { + + for (i = 0, il = unprocessedKeys.length; i < il; ++i) { + var key = unprocessedKeys[i]; + + for (var p = 0, pl = this._inner.patterns.length; p < pl; ++p) { + var pattern = this._inner.patterns[p]; + + if (pattern.regex.test(key)) { + delete unprocessed[key]; + + var item = target[key]; + var localState = { key: key, path: (state.path ? state.path + '.' : '') + key, parent: target, reference: state.reference }; + var result = pattern.rule._validate(item, localState, options); + if (result.errors) { + errors = errors.concat(result.errors); + if (options.abortEarly) { + return finish(); + } + } + + if (result.value !== undefined) { + target[key] = result.value; + } + } + } + } + + unprocessedKeys = Object.keys(unprocessed); + } + + if (unprocessedKeys.length) { + if (options.stripUnknown || + options.skipFunctions) { + + var hasFunctions = false; + for (var k = 0, kl = unprocessedKeys.length; k < kl; ++k) { + key = unprocessedKeys[k]; + + if (options.stripUnknown) { + delete target[key]; + } + else if (typeof target[key] === 'function') { + delete unprocessed[key]; + hasFunctions = true; + } + } + + if (options.stripUnknown) { + return finish(); + } + + if (hasFunctions) { + unprocessedKeys = Object.keys(unprocessed); + } + } + + if (unprocessedKeys.length && + (this._flags.allowUnknown !== undefined ? !this._flags.allowUnknown : !options.allowUnknown)) { + + for (var e = 0, el = unprocessedKeys.length; e < el; ++e) { + errors.push(Errors.create('object.allowUnknown', null, { key: unprocessedKeys[e], path: state.path }, options)); + } + } + } + + return finish(); +}; + + +internals.Object.prototype.keys = function (schema) { + + Hoek.assert(schema === null || schema === undefined || typeof schema === 'object', 'Object schema must be a valid object'); + Hoek.assert(!schema || !schema.isJoi, 'Object schema cannot be a joi schema'); + + var obj = this.clone(); + + if (!schema) { + obj._inner.children = null; + return obj; + } + + var children = Object.keys(schema); + + if (!children.length) { + obj._inner.children = []; + return obj; + } + + var topo = new Topo(); + if (obj._inner.children) { + for (var i = 0, il = obj._inner.children.length; i < il; ++i) { + var child = obj._inner.children[i]; + topo.add(child, { after: child._refs, group: child.key }); + } + } + + for (var c = 0, cl = children.length; c < cl; ++c) { + var key = children[c]; + var child = schema[key]; + var cast = Cast.schema(child); + topo.add({ key: key, schema: cast }, { after: cast._refs, group: key }); + } + + obj._inner.children = topo.nodes; + + return obj; +}; + + +internals.Object.prototype.unknown = function (allow) { + + var obj = this.clone(); + obj._flags.allowUnknown = (allow !== false); + return obj; +}; + + +internals.Object.prototype.length = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('length', limit, function (value, state, options) { + + if (Object.keys(value).length === limit) { + return null; + } + + return Errors.create('object.length', { limit: limit }, state, options); + }); +}; + + +internals.Object.prototype.min = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('min', limit, function (value, state, options) { + + if (Object.keys(value).length >= limit) { + return null; + } + + return Errors.create('object.min', { limit: limit }, state, options); + }); +}; + + +internals.Object.prototype.max = function (limit) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + + return this._test('max', limit, function (value, state, options) { + + if (Object.keys(value).length <= limit) { + return null; + } + + return Errors.create('object.max', { limit: limit }, state, options); + }); +}; + + +internals.Object.prototype.pattern = function (pattern, schema) { + + Hoek.assert(pattern instanceof RegExp, 'Invalid regular expression'); + Hoek.assert(schema !== undefined, 'Invalid rule'); + + pattern = new RegExp(pattern.source, pattern.ignoreCase ? 'i' : undefined); // Future version should break this and forbid unsupported regex flags + + var obj = this.clone(); + obj._inner.patterns.push({ regex: pattern, rule: Cast.schema(schema) }); + return obj; +}; + + +internals.Object.prototype.with = function (key, peers) { + + return this._dependency('with', key, peers); +}; + + +internals.Object.prototype.without = function (key, peers) { + + return this._dependency('without', key, peers); +}; + + +internals.Object.prototype.xor = function () { + + var peers = Hoek.flatten(Array.prototype.slice.call(arguments)); + return this._dependency('xor', null, peers); +}; + + +internals.Object.prototype.or = function () { + + var peers = Hoek.flatten(Array.prototype.slice.call(arguments)); + return this._dependency('or', null, peers); +}; + + +internals.Object.prototype.and = function () { + + var peers = Hoek.flatten(Array.prototype.slice.call(arguments)); + return this._dependency('and', null, peers); +}; + + +internals.Object.prototype.nand = function () { + + var peers = Hoek.flatten(Array.prototype.slice.call(arguments)); + return this._dependency('nand', null, peers); +}; + + +internals.Object.prototype.requiredKeys = function (children) { + + children = Hoek.flatten(Array.prototype.slice.call(arguments)); + return this.applyFunctionToChildren(children, 'required'); +}; + + +internals.Object.prototype.optionalKeys = function (children) { + + children = Hoek.flatten(Array.prototype.slice.call(arguments)); + return this.applyFunctionToChildren(children, 'optional'); +}; + + +internals.renameDefaults = { + alias: false, // Keep old value in place + multiple: false, // Allow renaming multiple keys into the same target + override: false // Overrides an existing key +}; + + +internals.Object.prototype.rename = function (from, to, options) { + + Hoek.assert(typeof from === 'string', 'Rename missing the from argument'); + Hoek.assert(typeof to === 'string', 'Rename missing the to argument'); + Hoek.assert(to !== from, 'Cannot rename key to same name:', from); + + for (var i = 0, il = this._inner.renames.length; i < il; ++i) { + Hoek.assert(this._inner.renames[i].from !== from, 'Cannot rename the same key multiple times'); + } + + var obj = this.clone(); + + obj._inner.renames.push({ + from: from, + to: to, + options: Hoek.applyToDefaults(internals.renameDefaults, options || {}) + }); + + return obj; +}; + + +internals.groupChildren = function (children) { + + children.sort(); + + var grouped = {}; + + for (var c = 0, lc = children.length; c < lc; c++) { + var child = children[c]; + Hoek.assert(typeof child === 'string', 'children must be strings'); + var group = child.split('.')[0]; + var childGroup = grouped[group] = (grouped[group] || []); + childGroup.push(child.substring(group.length + 1)); + } + + return grouped; +}; + + +internals.Object.prototype.applyFunctionToChildren = function (children, fn, args, root) { + + children = [].concat(children); + Hoek.assert(children.length > 0, 'expected at least one children'); + + var groupedChildren = internals.groupChildren(children); + var obj; + + if ('' in groupedChildren) { + obj = this[fn].apply(this, args); + delete groupedChildren['']; + } + else { + obj = this.clone(); + } + + if (obj._inner.children) { + root = root ? (root + '.') : ''; + + for (var i = 0, il = obj._inner.children.length; i < il; ++i) { + var child = obj._inner.children[i]; + var group = groupedChildren[child.key]; + + if (group) { + obj._inner.children[i] = { + key: child.key, + _refs: child._refs, + schema: child.schema.applyFunctionToChildren(group, fn, args, root + child.key) + }; + + delete groupedChildren[child.key]; + } + } + } + + var remaining = Object.keys(groupedChildren); + Hoek.assert(remaining.length === 0, 'unknown key(s)', remaining.join(', ')); + + return obj; +}; + + +internals.Object.prototype._dependency = function (type, key, peers) { + + peers = [].concat(peers); + for (var i = 0, li = peers.length; i < li; i++) { + Hoek.assert(typeof peers[i] === 'string', type, 'peers must be a string or array of strings'); + } + + var obj = this.clone(); + obj._inner.dependencies.push({ type: type, key: key, peers: peers }); + return obj; +}; + + +internals.with = function (value, peers, parent, state, options) { + + if (value === undefined) { + return null; + } + + for (var i = 0, il = peers.length; i < il; ++i) { + var peer = peers[i]; + if (!parent.hasOwnProperty(peer) || + parent[peer] === undefined) { + + return Errors.create('object.with', { peer: peer }, state, options); + } + } + + return null; +}; + + +internals.without = function (value, peers, parent, state, options) { + + if (value === undefined) { + return null; + } + + for (var i = 0, il = peers.length; i < il; ++i) { + var peer = peers[i]; + if (parent.hasOwnProperty(peer) && + parent[peer] !== undefined) { + + return Errors.create('object.without', { peer: peer }, state, options); + } + } + + return null; +}; + + +internals.xor = function (value, peers, parent, state, options) { + + var present = []; + for (var i = 0, il = peers.length; i < il; ++i) { + var peer = peers[i]; + if (parent.hasOwnProperty(peer) && + parent[peer] !== undefined) { + + present.push(peer); + } + } + + if (present.length === 1) { + return null; + } + + if (present.length === 0) { + return Errors.create('object.missing', { peers: peers }, state, options); + } + + return Errors.create('object.xor', { peers: peers }, state, options); +}; + + +internals.or = function (value, peers, parent, state, options) { + + for (var i = 0, il = peers.length; i < il; ++i) { + var peer = peers[i]; + if (parent.hasOwnProperty(peer) && + parent[peer] !== undefined) { + return null; + } + } + + return Errors.create('object.missing', { peers: peers }, state, options); +}; + + +internals.and = function (value, peers, parent, state, options) { + + var missing = []; + var present = []; + var count = peers.length; + for (var i = 0; i < count; ++i) { + var peer = peers[i]; + if (!parent.hasOwnProperty(peer) || + parent[peer] === undefined) { + + missing.push(peer); + } + else { + present.push(peer); + } + } + + var aon = (missing.length === count || present.length === count); + return !aon ? Errors.create('object.and', { present: present, missing: missing }, state, options) : null; +}; + + +internals.nand = function (value, peers, parent, state, options) { + + var present = []; + for (var i = 0, il = peers.length; i < il; ++i) { + var peer = peers[i]; + if (parent.hasOwnProperty(peer) && + parent[peer] !== undefined) { + + present.push(peer); + } + } + + var values = Hoek.clone(peers); + var main = values.splice(0,1); + var allPresent = (present.length === peers.length); + return allPresent ? Errors.create('object.nand', { main: main, peers: values }, state, options) : null; +}; + + +internals.Object.prototype.describe = function (shallow) { + + var description = Any.prototype.describe.call(this); + + if (this._inner.children && + !shallow) { + + description.children = {}; + for (var i = 0, il = this._inner.children.length; i < il; ++i) { + var child = this._inner.children[i]; + description.children[child.key] = child.schema.describe(); + } + } + + if (this._inner.dependencies.length) { + description.dependencies = Hoek.clone(this._inner.dependencies); + } + + if (this._inner.patterns.length) { + description.patterns = []; + + for (var p = 0, pl = this._inner.patterns.length; p < pl; ++p) { + var pattern = this._inner.patterns[p]; + description.patterns.push({ regex: pattern.regex.toString(), rule: pattern.rule.describe() }); + } + } + + return description; +}; + + +internals.Object.prototype.assert = function (ref, schema, message) { + + ref = Cast.ref(ref); + Hoek.assert(ref.isContext || ref.depth > 1, 'Cannot use assertions for root level references - use direct key rules instead'); + message = message || 'pass the assertion test'; + + var cast = Cast.schema(schema); + + return this._test('assert', { cast: cast, ref: ref }, function (value, state, options) { + + var result = cast._validate(ref(value), null, options, value); + if (!result.errors) { + return null; + } + + return Errors.create('object.assert', { ref: ref.path.join('.'), message: message }, state, options); + }); +}; + + +internals.Object.prototype.type = function (constructor, name) { + + Hoek.assert(typeof constructor === 'function', 'type must be a constructor function'); + name = name || constructor.name; + + return this._test('type', name, function (value, state, options) { + + if (value instanceof constructor) { + return null; + } + + return Errors.create('object.type', { type: name }, state, options); + }); +}; + + +module.exports = new internals.Object(); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/ref.js b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/ref.js new file mode 100755 index 0000000..7bc1842 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/ref.js @@ -0,0 +1,51 @@ +// Load modules + +var Hoek = require('hoek'); + + +// Declare internals + +var internals = {}; + + +exports.create = function (key, options) { + + Hoek.assert(typeof key === 'string', 'Invalid reference key:', key); + + var settings = Hoek.clone(options); // options can be reused and modified + + var ref = function (value, validationOptions) { + + return Hoek.reach(ref.isContext ? validationOptions.context : value, ref.key, settings); + }; + + ref.isContext = (key[0] === ((settings && settings.contextPrefix) || '$')); + ref.key = (ref.isContext ? key.slice(1) : key); + ref.path = ref.key.split((settings && settings.separator) || '.'); + ref.depth = ref.path.length; + ref.root = ref.path[0]; + ref.isJoi = true; + + ref.toString = function () { + + return (ref.isContext ? 'context:' : 'ref:') + ref.key; + }; + + return ref; +}; + + +exports.isRef = function (ref) { + + return typeof ref === 'function' && ref.isJoi; +}; + + +exports.push = function (array, ref) { + + if (exports.isRef(ref) && + !ref.isContext) { + + array.push(ref.root); + } +}; \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/string.js b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/string.js new file mode 100755 index 0000000..1b22802 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/string.js @@ -0,0 +1,282 @@ +// Load modules + +var Net = require('net'); +var Hoek = require('hoek'); +var Isemail = require('isemail'); +var Any = require('./any'); +var JoiDate = require('./date'); +var Errors = require('./errors'); + +// Declare internals + +var internals = {}; + + +internals.String = function () { + + Any.call(this); + this._type = 'string'; + this._invalids.add(''); +}; + +Hoek.inherits(internals.String, Any); + + +internals.String.prototype._base = function (value, state, options) { + + if (typeof value === 'string' && + options.convert) { + + if (this._flags.case) { + value = (this._flags.case === 'upper' ? value.toLocaleUpperCase() : value.toLocaleLowerCase()); + } + + if (this._flags.trim) { + value = value.trim(); + } + } + + return { + value: value, + errors: (typeof value === 'string') ? null : Errors.create('string.base', null, state, options) + }; +}; + + +internals.String.prototype.insensitive = function () { + + var obj = this.clone(); + obj._flags.insensitive = true; + return obj; +}; + + +internals.String.prototype.min = function (limit, encoding) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + Hoek.assert(!encoding || Buffer.isEncoding(encoding), 'Invalid encoding:', encoding); + + return this._test('min', limit, function (value, state, options) { + + var length = encoding ? Buffer.byteLength(value, encoding) : value.length; + if (length >= limit) { + return null; + } + + return Errors.create('string.min', { limit: limit }, state, options); + }); +}; + + +internals.String.prototype.max = function (limit, encoding) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + Hoek.assert(!encoding || Buffer.isEncoding(encoding), 'Invalid encoding:', encoding); + + return this._test('max', limit, function (value, state, options) { + + var length = encoding ? Buffer.byteLength(value, encoding) : value.length; + if (length <= limit) { + return null; + } + + return Errors.create('string.max', { limit: limit }, state, options); + }); +}; + + +internals.String.prototype.creditCard = function () { + + return this._test('creditCard', undefined, function (value, state, options) { + + var i = value.length; + var sum = 0; + var mul = 1; + var char; + + while (i--) { + char = value.charAt(i) * mul; + sum += char - (char > 9) * 9; + mul ^= 3; + } + + var check = (sum % 10 === 0) && (sum > 0); + return check ? null : Errors.create('string.creditCard', null, state, options); + }); +}; + + +internals.String.prototype.length = function (limit, encoding) { + + Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); + Hoek.assert(!encoding || Buffer.isEncoding(encoding), 'Invalid encoding:', encoding); + + return this._test('length', limit, function (value, state, options) { + + var length = encoding ? Buffer.byteLength(value, encoding) : value.length; + if (length === limit) { + return null; + } + + return Errors.create('string.length', { limit: limit }, state, options); + }); +}; + + +internals.String.prototype.regex = function (pattern, name) { + + Hoek.assert(pattern instanceof RegExp, 'pattern must be a RegExp'); + + pattern = new RegExp(pattern.source, pattern.ignoreCase ? 'i' : undefined); // Future version should break this and forbid unsupported regex flags + + return this._test('regex', pattern, function (value, state, options) { + + if (pattern.test(value)) { + return null; + } + + return Errors.create((name ? 'string.regex.name' : 'string.regex.base'), { name: name }, state, options); + }); +}; + + +internals.String.prototype.alphanum = function () { + + return this._test('alphanum', undefined, function (value, state, options) { + + if (/^[a-zA-Z0-9]+$/.test(value)) { + return null; + } + + return Errors.create('string.alphanum', null, state, options); + }); +}; + + +internals.String.prototype.token = function () { + + return this._test('token', undefined, function (value, state, options) { + + if (/^\w+$/.test(value)) { + return null; + } + + return Errors.create('string.token', null, state, options); + }); +}; + + +internals.String.prototype.email = function () { + + return this._test('email', undefined, function (value, state, options) { + + if (Isemail(value)) { + return null; + } + + return Errors.create('string.email', null, state, options); + }); +}; + + +internals.String.prototype.isoDate = function () { + + return this._test('isoDate', undefined, function (value, state, options) { + + if (JoiDate._isIsoDate(value)) { + return null; + } + + return Errors.create('string.isoDate', null, state, options); + }); +}; + + +internals.String.prototype.guid = function () { + + var regex = /^[A-F0-9]{8}(?:-?[A-F0-9]{4}){3}-?[A-F0-9]{12}$/i; + var regex2 = /^\{[A-F0-9]{8}(?:-?[A-F0-9]{4}){3}-?[A-F0-9]{12}\}$/i; + + return this._test('guid', undefined, function (value, state, options) { + + if (regex.test(value) || regex2.test(value)) { + return null; + } + + return Errors.create('string.guid', null, state, options); + }); +}; + + +internals.String.prototype.hostname = function () { + + var regex = /^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$/; + + return this._test('hostname', undefined, function (value, state, options) { + + if ((value.length <= 255 && regex.test(value)) || + Net.isIPv6(value)) { + + return null; + } + + return Errors.create("string.hostname", null, state, options); + }); +}; + + +internals.String.prototype.lowercase = function () { + + var obj = this._test('lowercase', undefined, function (value, state, options) { + + if (options.convert || + value === value.toLocaleLowerCase()) { + + return null; + } + + return Errors.create('string.lowercase', null, state, options); + }); + + obj._flags.case = 'lower'; + return obj; +}; + + +internals.String.prototype.uppercase = function (options) { + + var obj = this._test('uppercase', undefined, function (value, state, options) { + + if (options.convert || + value === value.toLocaleUpperCase()) { + + return null; + } + + return Errors.create('string.uppercase', null, state, options); + }); + + obj._flags.case = 'upper'; + return obj; +}; + + +internals.String.prototype.trim = function () { + + var obj = this._test('trim', undefined, function (value, state, options) { + + if (options.convert || + value === value.trim()) { + + return null; + } + + return Errors.create('string.trim', null, state, options); + }); + + obj._flags.trim = true; + return obj; +}; + + +module.exports = new internals.String(); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/.npmignore b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/.npmignore new file mode 100644 index 0000000..5761e0a --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/.npmignore @@ -0,0 +1,2 @@ +isemail.sublime-* +node_modules diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/.travis.yml b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/.travis.yml new file mode 100644 index 0000000..1bc77fb --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/.travis.yml @@ -0,0 +1,8 @@ +language: node_js +node_js: + - "0.8" + - "0.10" +notifications: + hipchat: + rooms: + secure: lzNdJmq9QLPpKWKiFE+w1DNUhw+jp1OF1SIMlxSnT++H8M7NLVWchXzPIyoaE4enmy8n2JxMA9FGTaQvOER+G9UswuyOO2nUDjlt/I949SeN9DyVAf4XAwXnKbhXcmGuCho2odO7VeKPmrJXgoxbJYy3Ne0lS7zLU6rEkNJotIg= diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/LICENSE b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/LICENSE new file mode 100644 index 0000000..67e5251 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/LICENSE @@ -0,0 +1,11 @@ +Copyright © 2008-2011, Dominic Sayers +Copyright © 2013, GlobeSherpa +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +- Neither the name of Dominic Sayers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/Makefile b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/Makefile new file mode 100644 index 0000000..86b2d13 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/Makefile @@ -0,0 +1,4 @@ +test: + npm test + +.PHONY: test diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/README.md b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/README.md new file mode 100644 index 0000000..7e3f979 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/README.md @@ -0,0 +1,92 @@ +isemail +======= + +[![Build Status](https://travis-ci.org/globesherpa/node-isemail.png)](https://travis-ci.org/globesherpa/node-isemail) +[![Coverage Status](https://coveralls.io/repos/globesherpa/node-isemail/badge.png?branch=master)](https://coveralls.io/r/globesherpa/node-isemail?branch=master) + +This first version of `isemail` is a port of the PHP `is_email` function by Dominic Sayers. + +Future versions will improve upon the current version, optimizing it for efficient usage and DRYing the code. + +Install +------- + +```sh +$ npm install isemail +``` + +Test +---- + +The tests were pulled from is_email's extensive [test suite][tests] on October 15, 2013. Many thanks to the contributors! + +Run any of the following. + +```sh +$ mocha +$ npm test +$ make test +``` + +_remember to_ `npm install`! + +API +--- + +### isEmail(email, [options], [callback]) + +Determines whether the `email` is valid or not, for various definitions thereof. Optionally accepts an `options` object and a `callback` function. Options may include `errorLevel` and `checkDNS`. The `callback` function will always be called if specified, and the result of the operation supplied as the only parameter to the callback function. If `isEmail` is not asked to check for the existence of the domain (`checkDNS`), it will also synchronously return the result of the operation. + +Use `errorLevel` to specify the type of result for `isEmail`. Passing a `false` literal will result in a true or false boolean indicating whether the email address is sufficiently defined for use in sending an email. Passing a `true` literal will result in a more granular numeric status, with zero being a perfectly valid email address. Passing a number will return `0` if the numeric status is below the `errorLevel` and the numeric status otherwise. + +The `tldWhitelist` option can be either an object lookup table or an array of valid top-level domains. If the email address has a top-level domain that is not in the whitelist, the email will be marked as invalid. + +The `minDomainAtoms` option is an optional positive integer that specifies the minimum number of domain atoms that must be included for the email address to be considered valid. Be careful with the option, as some top-level domains, like `io`, directly support email addresses. + +#### Examples + +```js +$ node +> var isEmail = require('isemail'); +undefined +> var log = console.log.bind(console, 'result'); +undefined +> isEmail('test@iana.org'); +true +> isEmail('test@iana.org', log); +result true +true +> isEmail('test@iana.org', {checkDNS: true}); +undefined +> isEmail('test@iana.org', {checkDNS: true}, log); +undefined +result true +> isEmail('test@iana.org', {errorLevel: true}); +0 +> isEmail('test@iana.org', {errorLevel: true}, log); +result 0 +0 +> isEmail('test@e.com'); +true +> isEmail('test@e.com', {checkDNS: true, errorLevel: true}, log); +undefined +result 6 +> isEmail('test@e.com', {checkDNS: true, errorLevel: 7}, log); +undefined +result 0 +> isEmail('test@e.com', {checkDNS: true, errorLevel: 6}, log); +undefined +result 6 +``` + +TODO +==== + +Add tests for library usage, not just functionality comparisons. + +License +======= + +[BSD License](http://www.opensource.org/licenses/bsd-license.php) + +[tests]: http://isemail.info/_system/is_email/test/?all‎ "is_email test suite" diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/dns-no-mx.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/dns-no-mx.js new file mode 100755 index 0000000..c868304 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/dns-no-mx.js @@ -0,0 +1,80 @@ +#!/usr/bin/env node + +var dns = require('dns'); + +function check(domain, callback) { + var done = false, count = 3; + + dns.resolveCname(domain, handleRecords); + dns.resolve4(domain, handleRecords); + dns.resolve6(domain, handleRecords); + + function handleRecords(err, records) { + if (done) return; + count--; + if (!err && records && records.length) { + done = true; + return dns.resolveMx(domain, handleMail); + } + if (count === 0) { + done = true; + // ain't got time for node style callbacks + callback(false); + } + } + + function handleMail(err, records) { + if ((!err || err.code === dns.NODATA) && records && records.length) { + return callback(false); + } + callback(true); + } +} + +function spin(max, concurrent) { + if (!(max >= 0)) { + max = 1; + } + if (!(concurrent > 0)) { + concurrent = 4; + } + var active = 0, domain = domains(4, ['com', 'org', 'net']); + (function next() { + active++; + var d = domain(); + check(d, function(nomx) { + active--; + if (nomx) { + console.log(d); + if (!--max) { + process.exit(); + } + } + if (active < concurrent) { + next(); + } + }); + if (active < concurrent) { + next(); + } + })(); +} + +spin(1, 16); + +function domains(length, tops) { + var index = 0, end = Math.pow(26, length) * tops.length; + tops = tops.slice(); + return function next() { + if (index === end) return; + var active = index++, domain = ''; + var main = tops[active % tops.length]; + active = (active / tops.length) | 0; + for (var i = 0; i < length; i++) { + domain = String.fromCharCode(97 + active % 26) + domain; + active = (active / 26) | 0; + } + domain += '.' + main; + return domain; + }; +} diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/index.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/index.js new file mode 100644 index 0000000..d7a780e --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/index.js @@ -0,0 +1 @@ +module.exports = require('./lib/isemail'); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/lib/isemail.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/lib/isemail.js new file mode 100644 index 0000000..e948bbd --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/lib/isemail.js @@ -0,0 +1,1279 @@ +/** + * To validate an email address according to RFCs 5321, 5322 and others + * + * Copyright © 2008-2011, Dominic Sayers + * Test schema documentation Copyright © 2011, Daniel Marschall + * Port for Node.js Copyright © 2013, GlobeSherpa + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Neither the name of Dominic Sayers nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @author Dominic Sayers + * @author Eli Skeggs + * @copyright 2008-2011 Dominic Sayers + * @copyright 2013-2014 GlobeSherpa + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @link http://www.dominicsayers.com/isemail + * @link https://github.com/globesherpa/isemail + * @version 1.1.1 - Optimization pass, simplify constants, style, dead code. + */ + +// lazy-loaded +var dns, HAS_REQUIRE = typeof require !== 'undefined'; + +// categories +var ISEMAIL_VALID_CATEGORY = 1; +var ISEMAIL_DNSWARN = 7; +var ISEMAIL_RFC5321 = 15; +var ISEMAIL_CFWS = 31; +var ISEMAIL_DEPREC = 63; +var ISEMAIL_RFC5322 = 127; +var ISEMAIL_ERR = 255; + +// diagnoses +// address is valid +var ISEMAIL_VALID = 0; +// address is valid but a DNS check was not successful +var ISEMAIL_DNSWARN_NO_MX_RECORD = 5; +var ISEMAIL_DNSWARN_NO_RECORD = 6; +// address is valid for SMTP but has unusual elements +var ISEMAIL_RFC5321_TLD = 9; +var ISEMAIL_RFC5321_TLDNUMERIC = 10; +var ISEMAIL_RFC5321_QUOTEDSTRING = 11; +var ISEMAIL_RFC5321_ADDRESSLITERAL = 12; +var ISEMAIL_RFC5321_IPV6DEPRECATED = 13; +// address is valid within the message but cannot be used unmodified for the +// envelope +var ISEMAIL_CFWS_COMMENT = 17; +var ISEMAIL_CFWS_FWS = 18; +// address contains deprecated elements but may still be valid in restricted +// contexts +var ISEMAIL_DEPREC_LOCALPART = 33; +var ISEMAIL_DEPREC_FWS = 34; +var ISEMAIL_DEPREC_QTEXT = 35; +var ISEMAIL_DEPREC_QP = 36; +var ISEMAIL_DEPREC_COMMENT = 37; +var ISEMAIL_DEPREC_CTEXT = 38; +var ISEMAIL_DEPREC_CFWS_NEAR_AT = 49; +// the address is only valid according to the broad definition of RFC 5322, but +// otherwise invalid +var ISEMAIL_RFC5322_DOMAIN = 65; +var ISEMAIL_RFC5322_TOOLONG = 66; +var ISEMAIL_RFC5322_LOCAL_TOOLONG = 67; +var ISEMAIL_RFC5322_DOMAIN_TOOLONG = 68; +var ISEMAIL_RFC5322_LABEL_TOOLONG = 69; +var ISEMAIL_RFC5322_DOMAINLITERAL = 70; +var ISEMAIL_RFC5322_DOMLIT_OBSDTEXT = 71; +var ISEMAIL_RFC5322_IPV6_GRPCOUNT = 72; +var ISEMAIL_RFC5322_IPV6_2X2XCOLON = 73; +var ISEMAIL_RFC5322_IPV6_BADCHAR = 74; +var ISEMAIL_RFC5322_IPV6_MAXGRPS = 75; +var ISEMAIL_RFC5322_IPV6_COLONSTRT = 76; +var ISEMAIL_RFC5322_IPV6_COLONEND = 77; +// address is invalid for any purpose +var ISEMAIL_ERR_EXPECTING_DTEXT = 129; +var ISEMAIL_ERR_NOLOCALPART = 130; +var ISEMAIL_ERR_NODOMAIN = 131; +var ISEMAIL_ERR_CONSECUTIVEDOTS = 132; +var ISEMAIL_ERR_ATEXT_AFTER_CFWS = 133; +var ISEMAIL_ERR_ATEXT_AFTER_QS = 134; +var ISEMAIL_ERR_ATEXT_AFTER_DOMLIT = 135; +var ISEMAIL_ERR_EXPECTING_QPAIR = 136; +var ISEMAIL_ERR_EXPECTING_ATEXT = 137; +var ISEMAIL_ERR_EXPECTING_QTEXT = 138; +var ISEMAIL_ERR_EXPECTING_CTEXT = 139; +var ISEMAIL_ERR_BACKSLASHEND = 140; +var ISEMAIL_ERR_DOT_START = 141; +var ISEMAIL_ERR_DOT_END = 142; +var ISEMAIL_ERR_DOMAINHYPHENSTART = 143; +var ISEMAIL_ERR_DOMAINHYPHENEND = 144; +var ISEMAIL_ERR_UNCLOSEDQUOTEDSTR = 145; +var ISEMAIL_ERR_UNCLOSEDCOMMENT = 146; +var ISEMAIL_ERR_UNCLOSEDDOMLIT = 147; +var ISEMAIL_ERR_FWS_CRLF_X2 = 148; +var ISEMAIL_ERR_FWS_CRLF_END = 149; +var ISEMAIL_ERR_CR_NO_LF = 150; +var ISEMAIL_ERR_UNKNOWN_TLD = 160; +var ISEMAIL_ERR_TOOSHORT_DOMAIN = 161; + +// function control +var THRESHOLD = 16; +// email parts +var COMPONENT_LOCALPART = 0; +var COMPONENT_DOMAIN = 1; +var COMPONENT_LITERAL = 2; +var CONTEXT_COMMENT = 3; +var CONTEXT_FWS = 4; +var CONTEXT_QUOTEDSTRING = 5; +var CONTEXT_QUOTEDPAIR = 6; + +// US-ASCII visible characters not valid for atext +// (http://tools.ietf.org/html/rfc5322#section-3.2.3) +var SPECIALS = '()<>[]:;@\\,."'; + +function optimizeLookup(string) { + var body = '', min = 0x100, max = 0, lookup = new Array(min); + for (var i = min - 1; i >= 0; i--) { + lookup[i] = false; + } + for (var i = 0; i < string.length; i++) { + var chr = string.charCodeAt(i); + if (chr < min) { + min = chr; + } + if (chr > max) { + max = chr; + } + lookup[chr] = true; + } + lookup.length = max; + var body = 'var lookup = ' + JSON.stringify(lookup) + ';\n'; + body += 'return function(code) {\n'; + body += ' if (code < ' + min + ' || code > ' + max + ') {\n'; + body += ' return false;\n'; + body += ' }\n'; + body += ' return lookup[code];\n'; + body += '}'; + return (new Function(body))(); +} + +var specialsLookup = optimizeLookup(SPECIALS); + +// matches valid IPv4 addresses from the end of a string +var IPv4_REGEX = + /\b(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/; +var IPv6_REGEX = /^[a-fA-F\d]{0,4}$/; +var IPv6_REGEX_TEST = IPv6_REGEX.test.bind(IPv6_REGEX); + +var hasOwn = Object.prototype.hasOwnProperty; + +/** + * Get the largest number in the array. + * + * Returns -Infinity if the array is empty. + * + * @param {Array.} array The array to scan. + * @return {number} The largest number contained. + */ +function maxValue(array) { + var v = -Infinity, i = 0, n = array.length; + + for (; i < n; i++) { + if (array[i] > v) { + v = array[i]; + } + } + + return v; +} + +/** + * Check that an email address conforms to RFCs 5321, 5322 and others + * + * As of Version 3.0, we are now distinguishing clearly between a Mailbox + * as defined by RFC 5321 and an addr-spec as defined by RFC 5322. Depending + * on the context, either can be regarded as a valid email address. The + * RFC 5321 Mailbox specification is more restrictive (comments, white space + * and obsolete forms are not allowed). + * + * @param {string} email The email address to check. + * @param {boolean} checkDNS If true then will check DNS for MX records. If true + * this isEmail _will_ be asynchronous. + * @param {*} errorLevel Determines the boundary between valid and invalid + * addresses. Status codes above this number will be returned as-is, status + * codes below will be returned as ISEMAIL_VALID. Thus the calling program can + * simply look for ISEMAIL_VALID if it is only interested in whether an + * address is valid or not. The errorLevel will determine how "picky" + * isEmail() is about the address. If omitted or passed as false then + * isEmail() will return true or false rather than an integer error or + * warning. NB Note the difference between errorLevel = false and + * errorLevel = 0. + * @return {*} + */ +function isEmail(email, options, callback) { + if (typeof options === 'function') { + callback = options; + options = {}; + } + options || (options = {}); + + var threshold, diagnose; + if (typeof options.errorLevel === 'number') { + diagnose = true; + threshold = options.errorLevel; + } else { + diagnose = !!options.errorLevel; + threshold = ISEMAIL_VALID; + } + + if (options.tldWhitelist && typeof options.tldWhitelist !== 'object') { + throw new TypeError('expected array or object tldWhitelist'); + } + + if (options.minDomainAtoms && (options.minDomainAtoms !== + ((+options.minDomainAtoms) | 0) || options.minDomainAtoms < 0)) { + throw new TypeError('expected positive integer minDomainAtoms'); + } + + var maxResult = ISEMAIL_VALID; + + function updateResult(value) { + if (value > maxResult) { + maxResult = value; + } + } + + var context = { + now: COMPONENT_LOCALPART, + prev: COMPONENT_LOCALPART, + stack: [COMPONENT_LOCALPART] + }; + + var token = '', prevToken = '', charCode = 0; + var parseData = {local: '', domain: ''}; + var atomList = {local: [''], domain: ['']}; + + var elementCount = 0, elementLength = 0, crlfCount = 0; + var hyphenFlag = false, assertEnd = false; + + for (var i = 0; i < email.length; i++) { + token = email[i]; + + switch (context.now) { + // local-part + case COMPONENT_LOCALPART: + // http://tools.ietf.org/html/rfc5322#section-3.4.1 + // local-part = dot-atom / quoted-string / obs-local-part + // + // dot-atom = [CFWS] dot-atom-text [CFWS] + // + // dot-atom-text = 1*atext *("." 1*atext) + // + // quoted-string = [CFWS] + // DQUOTE *([FWS] qcontent) [FWS] DQUOTE + // [CFWS] + // + // obs-local-part = word *("." word) + // + // word = atom / quoted-string + // + // atom = [CFWS] 1*atext [CFWS] + switch (token) { + // comment + case '(': + if (elementLength === 0) { + // comments are OK at the beginning of an element + updateResult(elementCount === 0 ? ISEMAIL_CFWS_COMMENT : + ISEMAIL_DEPREC_COMMENT); + } else { + updateResult(ISEMAIL_CFWS_COMMENT); + // can't start a comment in an element, should be end + assertEnd = true; + } + context.stack.push(context.now); + context.now = CONTEXT_COMMENT; + break; + // next dot-atom element + case '.': + if (elementLength === 0) { + // another dot, already? + updateResult(elementCount === 0 ? ISEMAIL_ERR_DOT_START : + ISEMAIL_ERR_CONSECUTIVEDOTS); + } else { + // the entire local-part can be a quoted string for RFC 5321 + // if it's just one atom that is quoted then it's an RFC 5322 obsolete + // form + if (assertEnd) { + updateResult(ISEMAIL_DEPREC_LOCALPART); + } + + // CFWS & quoted strings are OK again now we're at the beginning of an + // element (although they are obsolete forms) + assertEnd = false; + elementLength = 0; + elementCount++; + parseData.local += token; + atomList.local[elementCount] = ''; // TODO: push? + } + break; + // quoted string + case '"': + if (elementLength === 0) { + // the entire local-part can be a quoted string for RFC 5321 + // if it's just one atom that is quoted then it's an RFC 5322 obsolete + // form + updateResult(elementCount === 0 ? ISEMAIL_RFC5321_QUOTEDSTRING : + ISEMAIL_DEPREC_LOCALPART); + + parseData.local += token; + atomList.local[elementCount] += token; + elementLength++; + assertEnd = true; // quoted string must be the entire element + context.stack.push(context.now); + context.now = CONTEXT_QUOTEDSTRING; + } else { + updateResult(ISEMAIL_ERR_EXPECTING_ATEXT); + } + break; + // folding white space + case '\r': + if ((++i === email.length) || email[i] !== '\n') { + // fatal error + updateResult(ISEMAIL_ERR_CR_NO_LF); + break; + } + case ' ': + case '\t': + if (elementLength === 0) { + updateResult(elementCount === 0 ? ISEMAIL_CFWS_FWS : + ISEMAIL_DEPREC_FWS); + } else { + // we can't start FWS in the middle of an element, better be end + assertEnd = true; + } + + context.stack.push(context.now); + context.now = CONTEXT_FWS; + prevToken = token; + break; + // @ + case '@': + // at this point we should have a valid local-part + /* istanbul ignore next: logically unreachable */ + if (context.stack.length !== 1) { + throw new Error('unexpected item on context stack'); + } + + if (parseData.local.length === 0) { + // fatal error + updateResult(ISEMAIL_ERR_NOLOCALPART); + } else if (elementLength === 0) { + // fatal error + updateResult(ISEMAIL_ERR_DOT_END); + // http://tools.ietf.org/html/rfc5321#section-4.5.3.1.1 + // the maximum total length of a user name or other local-part is 64 + // octets + } else if (parseData.local.length > 64) { + updateResult(ISEMAIL_RFC5322_LOCAL_TOOLONG); + // http://tools.ietf.org/html/rfc5322#section-3.4.1 + // comments and folding white space + // SHOULD NOT be used around the "@" in the addr-spec + // + // http://tools.ietf.org/html/rfc2119 + // 4. SHOULD NOT this phrase, or the phrase "NOT RECOMMENDED" mean that + // there may exist valid reasons in particular circumstances when the + // particular behavior is acceptable or even useful, but the full + // implications should be understood and the case carefully weighed + // before implementing any behavior described with this label + } else if ((context.prev === CONTEXT_COMMENT) || + (context.prev === CONTEXT_FWS)) { + updateResult(ISEMAIL_DEPREC_CFWS_NEAR_AT); + } + + // clear everything down for the domain parsing + context.now = COMPONENT_DOMAIN; // where we are + context.stack[0] = COMPONENT_DOMAIN; // where we have been + elementCount = 0; + elementLength = 0; + assertEnd = false; // CFWS can only appear at the end of the element + break; + // atext + default: + // http://tools.ietf.org/html/rfc5322#section-3.2.3 + // atext = ALPHA / DIGIT / ; Printable US-ASCII + // "!" / "#" / ; characters not including + // "$" / "%" / ; specials. Used for atoms. + // "&" / "'" / + // "*" / "+" / + // "-" / "/" / + // "=" / "?" / + // "^" / "_" / + // "`" / "{" / + // "|" / "}" / + // "~" + if (assertEnd) { + // we have encountered atext where it is no longer valid + switch (context.prev) { + case CONTEXT_COMMENT: + case CONTEXT_FWS: + updateResult(ISEMAIL_ERR_ATEXT_AFTER_CFWS); + break; + case CONTEXT_QUOTEDSTRING: + updateResult(ISEMAIL_ERR_ATEXT_AFTER_QS); + break; + /* istanbul ignore next: logically unreachable */ + default: + throw new Error('more atext found where none is allowed, ' + + 'but unrecognized prev context: ' + context.prev); + } + } else { + context.prev = context.now; + charCode = token.charCodeAt(0); + + if (charCode < 33 || charCode > 126 || charCode === 10 || + specialsLookup(charCode)) { + // fatal error + updateResult(ISEMAIL_ERR_EXPECTING_ATEXT); + } + + parseData.local += token; + atomList.local[elementCount] += token; + elementLength++; + } + } + break; + case COMPONENT_DOMAIN: + // http://tools.ietf.org/html/rfc5322#section-3.4.1 + // domain = dot-atom / domain-literal / obs-domain + // + // dot-atom = [CFWS] dot-atom-text [CFWS] + // + // dot-atom-text = 1*atext *("." 1*atext) + // + // domain-literal = [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS] + // + // dtext = %d33-90 / ; Printable US-ASCII + // %d94-126 / ; characters not including + // obs-dtext ; "[", "]", or "\" + // + // obs-domain = atom *("." atom) + // + // atom = [CFWS] 1*atext [CFWS] + + // http://tools.ietf.org/html/rfc5321#section-4.1.2 + // Mailbox = Local-part "@" ( Domain / address-literal ) + // + // Domain = sub-domain *("." sub-domain) + // + // address-literal = "[" ( IPv4-address-literal / + // IPv6-address-literal / + // General-address-literal ) "]" + // ; See Section 4.1.3 + + // http://tools.ietf.org/html/rfc5322#section-3.4.1 + // Note: A liberal syntax for the domain portion of addr-spec is + // given here. However, the domain portion contains addressing + // information specified by and used in other protocols (e.g., + // [RFC1034], [RFC1035], [RFC1123], [RFC5321]). It is therefore + // incumbent upon implementations to conform to the syntax of + // addresses for the context in which they are used. + // is_email() author's note: it's not clear how to interpret this in + // the context of a general email address validator. The conclusion I + // have reached is this: "addressing information" must comply with + // RFC 5321 (and in turn RFC 1035), anything that is "semantically + // invisible" must comply only with RFC 5322. + switch (token) { + // comment + case '(': + if (elementLength === 0) { + // comments at the start of the domain are deprecated in the text + // comments at the start of a subdomain are obs-domain + // (http://tools.ietf.org/html/rfc5322#section-3.4.1) + updateResult(elementCount === 0 ? ISEMAIL_DEPREC_CFWS_NEAR_AT : + ISEMAIL_DEPREC_COMMENT); + } else { + updateResult(ISEMAIL_CFWS_COMMENT); + assertEnd = true; // can't start a comment mid-element, better be end + } + + context.stack.push(context.now); + context.now = CONTEXT_COMMENT; + break; + // next dot-atom element + case '.': + if (elementLength === 0) { + // another dot, already? fatal error + updateResult(elementCount === 0 ? ISEMAIL_ERR_DOT_START : + ISEMAIL_ERR_CONSECUTIVEDOTS); + } else if (hyphenFlag) { + // previous subdomain ended in a hyphen + updateResult(ISEMAIL_ERR_DOMAINHYPHENEND); // fatal error + } else if (elementLength > 63) { + // Nowhere in RFC 5321 does it say explicitly that the + // domain part of a Mailbox must be a valid domain according + // to the DNS standards set out in RFC 1035, but this *is* + // implied in several places. For instance, wherever the idea + // of host routing is discussed the RFC says that the domain + // must be looked up in the DNS. This would be nonsense unless + // the domain was designed to be a valid DNS domain. Hence we + // must conclude that the RFC 1035 restriction on label length + // also applies to RFC 5321 domains. + // + // http://tools.ietf.org/html/rfc1035#section-2.3.4 + // labels 63 octets or less + + updateResult(ISEMAIL_RFC5322_LABEL_TOOLONG); + } + + // CFWS is OK again now we're at the beginning of an element (although + // it may be obsolete CFWS) + assertEnd = false; + elementLength = 0; + elementCount++; + atomList.domain[elementCount] = ''; + parseData.domain += token; + + break; + // domain literal + case '[': + if (parseData.domain.length === 0) { + // domain literal must be the only component + assertEnd = true; + elementLength++; + context.stack.push(context.now); + context.now = COMPONENT_LITERAL; + parseData.domain += token; + atomList.domain[elementCount] += token; + parseData.literal = ''; + } else { + // fatal error + updateResult(ISEMAIL_ERR_EXPECTING_ATEXT); + } + break; + // folding white space + case '\r': + if ((++i === email.length) || email[i] !== '\n') { + // fatal error + updateResult(ISEMAIL_ERR_CR_NO_LF); + break; + } + case ' ': + case '\t': + if (elementLength === 0) { + updateResult(elementCount === 0 ? ISEMAIL_DEPREC_CFWS_NEAR_AT : + ISEMAIL_DEPREC_FWS); + } else { + // we can't start FWS in the middle of an element, so this better be + // the end + updateResult(ISEMAIL_CFWS_FWS); + assertEnd = true; + } + + context.stack.push(context.now); + context.now = CONTEXT_FWS; + prevToken = token; + break; + // atext + default: + // RFC 5322 allows any atext... + // http://tools.ietf.org/html/rfc5322#section-3.2.3 + // atext = ALPHA / DIGIT / ; Printable US-ASCII + // "!" / "#" / ; characters not including + // "$" / "%" / ; specials. Used for atoms. + // "&" / "'" / + // "*" / "+" / + // "-" / "/" / + // "=" / "?" / + // "^" / "_" / + // "`" / "{" / + // "|" / "}" / + // "~" + + // But RFC 5321 only allows letter-digit-hyphen to comply with DNS rules + // (RFCs 1034 & 1123) + // http://tools.ietf.org/html/rfc5321#section-4.1.2 + // sub-domain = Let-dig [Ldh-str] + // + // Let-dig = ALPHA / DIGIT + // + // Ldh-str = *( ALPHA / DIGIT / "-" ) Let-dig + // + if (assertEnd) { + // we have encountered atext where it is no longer valid + switch (context.prev) { + case CONTEXT_COMMENT: + case CONTEXT_FWS: + updateResult(ISEMAIL_ERR_ATEXT_AFTER_CFWS); + break; + case COMPONENT_LITERAL: + updateResult(ISEMAIL_ERR_ATEXT_AFTER_DOMLIT); + break; + /* istanbul ignore next: logically unreachable */ + default: + throw new Error('more atext found where none is allowed, ' + + 'but unrecognized prev context: ' + context.prev); + } + } + + charCode = token.charCodeAt(0); + // assume this token isn't a hyphen unless we discover it is + hyphenFlag = false; + + if (charCode < 33 || charCode > 126 || specialsLookup(charCode)) { + // fatal error + updateResult(ISEMAIL_ERR_EXPECTING_ATEXT); + } else if (token === '-') { + if (elementLength === 0) { + // hyphens can't be at the beginning of a subdomain + updateResult(ISEMAIL_ERR_DOMAINHYPHENSTART); // fatal error + } + + hyphenFlag = true; + } else if (!((charCode > 47 && charCode < 58) || + (charCode > 64 && charCode < 91) || + (charCode > 96 && charCode < 123))) { + // not an RFC 5321 subdomain, but still OK by RFC 5322 + updateResult(ISEMAIL_RFC5322_DOMAIN); + } + + parseData.domain += token; + atomList.domain[elementCount] += token; + elementLength++; + } + break; + // domain literal + case COMPONENT_LITERAL: + // http://tools.ietf.org/html/rfc5322#section-3.4.1 + // domain-literal = [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS] + // + // dtext = %d33-90 / ; Printable US-ASCII + // %d94-126 / ; characters not including + // obs-dtext ; "[", "]", or "\" + // + // obs-dtext = obs-NO-WS-CTL / quoted-pair + switch (token) { + // end of domain literal + case ']': + if (maxResult < ISEMAIL_DEPREC) { + // Could be a valid RFC 5321 address literal, so let's check + + // http://tools.ietf.org/html/rfc5321#section-4.1.2 + // address-literal = "[" ( IPv4-address-literal / + // IPv6-address-literal / + // General-address-literal ) "]" + // ; See Section 4.1.3 + // + // http://tools.ietf.org/html/rfc5321#section-4.1.3 + // IPv4-address-literal = Snum 3("." Snum) + // + // IPv6-address-literal = "IPv6:" IPv6-addr + // + // General-address-literal = Standardized-tag ":" 1*dcontent + // + // Standardized-tag = Ldh-str + // ; Standardized-tag MUST be specified in a + // ; Standards-Track RFC and registered with IANA + // + // dcontent = %d33-90 / ; Printable US-ASCII + // %d94-126 ; excl. "[", "\", "]" + // + // Snum = 1*3DIGIT + // ; representing a decimal integer + // ; value in the range 0 through 255 + // + // IPv6-addr = IPv6-full / IPv6-comp / IPv6v4-full / IPv6v4-comp + // + // IPv6-hex = 1*4HEXDIG + // + // IPv6-full = IPv6-hex 7(":" IPv6-hex) + // + // IPv6-comp = [IPv6-hex *5(":" IPv6-hex)] "::" + // [IPv6-hex *5(":" IPv6-hex)] + // ; The "::" represents at least 2 16-bit groups of + // ; zeros. No more than 6 groups in addition to the + // ; "::" may be present. + // + // IPv6v4-full = IPv6-hex 5(":" IPv6-hex) ":" IPv4-address-literal + // + // IPv6v4-comp = [IPv6-hex *3(":" IPv6-hex)] "::" + // [IPv6-hex *3(":" IPv6-hex) ":"] + // IPv4-address-literal + // ; The "::" represents at least 2 16-bit groups of + // ; zeros. No more than 4 groups in addition to the + // ; "::" and IPv4-address-literal may be present. + // + // is_email() author's note: We can't use ip2long() to validate + // IPv4 addresses because it accepts abbreviated addresses + // (xxx.xxx.xxx), expanding the last group to complete the address. + // filter_var() validates IPv6 address inconsistently (up to PHP 5.3.3 + // at least) -- see http://bugs.php.net/bug.php?id=53236 for example + + // TODO: var here? + var maxGroups = 8, matchesIP, index = false; + var addressLiteral = parseData.literal; + + // maybe extract IPv4 part from the end of the address-literal + if (matchesIP = IPv4_REGEX.exec(addressLiteral)) { + if ((index = matchesIP.index) !== 0) { + // convert IPv4 part to IPv6 format for futher testing + addressLiteral = addressLiteral.slice(0, matchesIP.index) + '0:0'; + } + } + + if (index === 0) { + // nothing there except a valid IPv4 address, so... + updateResult(ISEMAIL_RFC5321_ADDRESSLITERAL); + } else if (addressLiteral.slice(0, 5).toLowerCase() !== 'ipv6:') { + updateResult(ISEMAIL_RFC5322_DOMAINLITERAL); + } else { + var match = addressLiteral.substr(5); + matchesIP = match.split(':'); + index = match.indexOf('::'); + + if (!~index) { + // need exactly the right number of groups + if (matchesIP.length !== maxGroups) { + updateResult(ISEMAIL_RFC5322_IPV6_GRPCOUNT); + } + } else if (index !== match.lastIndexOf('::')) { + updateResult(ISEMAIL_RFC5322_IPV6_2X2XCOLON); + } else { + if (index === 0 || index === match.length - 2) { + // RFC 4291 allows :: at the start or end of an address with + // 7 other groups in addition + maxGroups++; + } + + if (matchesIP.length > maxGroups) { + updateResult(ISEMAIL_RFC5322_IPV6_MAXGRPS); + } else if (matchesIP.length === maxGroups) { + // eliding a single "::" + updateResult(ISEMAIL_RFC5321_IPV6DEPRECATED); + } + } + + // IPv6 testing strategy + if (match[0] === ':' && match[1] !== ':') { + updateResult(ISEMAIL_RFC5322_IPV6_COLONSTRT); + } else if (match[match.length - 1] === ':' && + match[match.length - 2] !== ':') { + updateResult(ISEMAIL_RFC5322_IPV6_COLONEND); + } else if (matchesIP.every(IPv6_REGEX_TEST)) { + updateResult(ISEMAIL_RFC5321_ADDRESSLITERAL); + } else { + updateResult(ISEMAIL_RFC5322_IPV6_BADCHAR); + } + } + } else { + updateResult(ISEMAIL_RFC5322_DOMAINLITERAL); + } + + parseData.domain += token; + atomList.domain[elementCount] += token; + elementLength++; + context.prev = context.now; + context.now = context.stack.pop(); + break; + case '\\': + updateResult(ISEMAIL_RFC5322_DOMLIT_OBSDTEXT); + context.stack.push(context.now); + context.now = CONTEXT_QUOTEDPAIR; + break; + // folding white space + case '\r': + if ((++i === email.length) || email[i] !== '\n') { + // fatal error + updateResult(ISEMAIL_ERR_CR_NO_LF); + break; + } + case ' ': + case '\t': + updateResult(ISEMAIL_CFWS_FWS); + + context.stack.push(context.now); + context.now = CONTEXT_FWS; + prevToken = token; + break; + // dtext + default: + // http://tools.ietf.org/html/rfc5322#section-3.4.1 + // dtext = %d33-90 / ; Printable US-ASCII + // %d94-126 / ; characters not including + // obs-dtext ; "[", "]", or "\" + // + // obs-dtext = obs-NO-WS-CTL / quoted-pair + // + // obs-NO-WS-CTL = %d1-8 / ; US-ASCII control + // %d11 / ; characters that do not + // %d12 / ; include the carriage + // %d14-31 / ; return, line feed, and + // %d127 ; white space characters + charCode = token.charCodeAt(0); + + // CR, LF, SP & HTAB have already been parsed above + if (charCode > 127 || charCode === 0 || token === '[') { + // fatal error + updateResult(ISEMAIL_ERR_EXPECTING_DTEXT); + break; + } else if (charCode < 33 || charCode === 127) { + updateResult(ISEMAIL_RFC5322_DOMLIT_OBSDTEXT); + } + + parseData.literal += token; + parseData.domain += token; + atomList.domain[elementCount] += token; + elementLength++; + } + break; + // quoted string + case CONTEXT_QUOTEDSTRING: + // http://tools.ietf.org/html/rfc5322#section-3.2.4 + // quoted-string = [CFWS] + // DQUOTE *([FWS] qcontent) [FWS] DQUOTE + // [CFWS] + // + // qcontent = qtext / quoted-pair + switch (token) { + // quoted pair + case '\\': + context.stack.push(context.now); + context.now = CONTEXT_QUOTEDPAIR; + break; + // folding white space + // inside a quoted string, spaces are allowed as regular characters + // it's only FWS if we include HTAB or CRLF + case '\r': + if ((++i === email.length) || email[i] !== '\n') { + // fatal error + updateResult(ISEMAIL_ERR_CR_NO_LF); + break; + } + case '\t': + // http://tools.ietf.org/html/rfc5322#section-3.2.2 + // Runs of FWS, comment, or CFWS that occur between lexical tokens in + // a structured header field are semantically interpreted as a single + // space character. + + // http://tools.ietf.org/html/rfc5322#section-3.2.4 + // the CRLF in any FWS/CFWS that appears within the quoted-string [is] + // semantically "invisible" and therefore not part of the + // quoted-string + + parseData.local += ' '; + atomList.local[elementCount] += ' '; + elementLength++; + + updateResult(ISEMAIL_CFWS_FWS); + context.stack.push(context.now); + context.now = CONTEXT_FWS; + prevToken = token; + break; + // end of quoted string + case '"': + parseData.local += token; + atomList.local[elementCount] += token; + elementLength++; + context.prev = context.now; + context.now = context.stack.pop(); + break; + // qtext + default: + // http://tools.ietf.org/html/rfc5322#section-3.2.4 + // qtext = %d33 / ; Printable US-ASCII + // %d35-91 / ; characters not including + // %d93-126 / ; "\" or the quote character + // obs-qtext + // + // obs-qtext = obs-NO-WS-CTL + // + // obs-NO-WS-CTL = %d1-8 / ; US-ASCII control + // %d11 / ; characters that do not + // %d12 / ; include the carriage + // %d14-31 / ; return, line feed, and + // %d127 ; white space characters + charCode = token.charCodeAt(0); + + if (charCode > 127 || charCode === 0 || charCode === 10) { + updateResult(ISEMAIL_ERR_EXPECTING_QTEXT); + } else if (charCode < 32 || charCode === 127) { + updateResult(ISEMAIL_DEPREC_QTEXT); + } + + parseData.local += token; + atomList.local[elementCount] += token; + elementLength++; + } + + // http://tools.ietf.org/html/rfc5322#section-3.4.1 + // If the string can be represented as a dot-atom (that is, it contains + // no characters other than atext characters or "." surrounded by atext + // characters), then the dot-atom form SHOULD be used and the quoted- + // string form SHOULD NOT be used. + + break; + // quoted pair + case CONTEXT_QUOTEDPAIR: + // http://tools.ietf.org/html/rfc5322#section-3.2.1 + // quoted-pair = ("\" (VCHAR / WSP)) / obs-qp + // + // VCHAR = %d33-126 ; visible (printing) characters + // WSP = SP / HTAB ; white space + // + // obs-qp = "\" (%d0 / obs-NO-WS-CTL / LF / CR) + // + // obs-NO-WS-CTL = %d1-8 / ; US-ASCII control + // %d11 / ; characters that do not + // %d12 / ; include the carriage + // %d14-31 / ; return, line feed, and + // %d127 ; white space characters + // + // i.e. obs-qp = "\" (%d0-8, %d10-31 / %d127) + charCode = token.charCodeAt(0); + + if (charCode > 127) { + // fatal error + updateResult(ISEMAIL_ERR_EXPECTING_QPAIR); + } else if ((charCode < 31 && charCode !== 9) || charCode === 127) { + // SP & HTAB are allowed + updateResult(ISEMAIL_DEPREC_QP); + } + + // At this point we know where this qpair occurred so + // we could check to see if the character actually + // needed to be quoted at all. + // http://tools.ietf.org/html/rfc5321#section-4.1.2 + // the sending system SHOULD transmit the + // form that uses the minimum quoting possible. + + // TODO: check whether the character needs to be quoted (escaped) + // in this context + + context.prev = context.now; + context.now = context.stack.pop(); // end of qpair + token = '\\' + token; + + switch (context.now) { + case CONTEXT_COMMENT: break; + case CONTEXT_QUOTEDSTRING: + parseData.local += token; + atomList.local[elementCount] += token; + + // the maximum sizes specified by RFC 5321 are octet counts, + // so we must include the backslash + elementLength += 2; + break; + case COMPONENT_LITERAL: + parseData.domain += token; + atomList.domain[elementCount] += token; + + // the maximum sizes specified by RFC 5321 are octet counts, + // so we must include the backslash + elementLength += 2; + break; + /* istanbul ignore next: logically unreachable */ + default: + throw new Error('quoted pair logic invoked in an invalid context: ' + + context.now); + } + break; + // comment + case CONTEXT_COMMENT: + // http://tools.ietf.org/html/rfc5322#section-3.2.2 + // comment = "(" *([FWS] ccontent) [FWS] ")" + // + // ccontent = ctext / quoted-pair / comment + switch (token) { + // nested comment + case '(': + // nested comments are ok + context.stack.push(context.now); + context.now = CONTEXT_COMMENT; + break; + // end of comment + case ')': + context.prev = context.now; + context.now = context.stack.pop(); + + break; + // quoted pair + case '\\': + context.stack.push(context.now); + context.now = CONTEXT_QUOTEDPAIR; + break; + // folding white space + case '\r': + if ((++i === email.length) || email[i] !== '\n') { + // fatal error + updateResult(ISEMAIL_ERR_CR_NO_LF); + break; + } + case ' ': + case '\t': + updateResult(ISEMAIL_CFWS_FWS); + + context.stack.push(context.now); + context.now = CONTEXT_FWS; + prevToken = token; + break; + // ctext + default: + // http://tools.ietf.org/html/rfc5322#section-3.2.3 + // ctext = %d33-39 / ; Printable US-ASCII + // %d42-91 / ; characters not including + // %d93-126 / ; "(", ")", or "\" + // obs-ctext + // + // obs-ctext = obs-NO-WS-CTL + // + // obs-NO-WS-CTL = %d1-8 / ; US-ASCII control + // %d11 / ; characters that do not + // %d12 / ; include the carriage + // %d14-31 / ; return, line feed, and + // %d127 ; white space characters + charCode = token.charCodeAt(0); + + if (charCode > 127 || charCode === 0 || charCode === 10) { + // fatal error + updateResult(ISEMAIL_ERR_EXPECTING_CTEXT); + break; + } else if (charCode < 32 || charCode === 127) { + updateResult(ISEMAIL_DEPREC_CTEXT); + } + } + break; + // folding white space + case CONTEXT_FWS: + // http://tools.ietf.org/html/rfc5322#section-3.2.2 + // FWS = ([*WSP CRLF] 1*WSP) / obs-FWS + // ; Folding white space + + // But note the erratum: + // http://www.rfc-editor.org/errata_search.php?rfc=5322&eid=1908: + // In the obsolete syntax, any amount of folding white space MAY be + // inserted where the obs-FWS rule is allowed. This creates the + // possibility of having two consecutive "folds" in a line, and + // therefore the possibility that a line which makes up a folded header + // field could be composed entirely of white space. + // + // obs-FWS = 1*([CRLF] WSP) + + if (prevToken === '\r') { + if (token === '\r') { + // fatal error + updateResult(ISEMAIL_ERR_FWS_CRLF_X2); + break; + } + + if (++crlfCount > 1) { + // multiple folds = obsolete FWS + updateResult(ISEMAIL_DEPREC_FWS); + } else { + crlfCount = 1; + } + } + + switch (token) { + case '\r': + if ((++i === email.length) || email[i] !== '\n') { + // fatal error + updateResult(ISEMAIL_ERR_CR_NO_LF); + } + break; + case ' ': + case '\t': + break; + default: + if (prevToken === '\r') { + // fatal error + updateResult(ISEMAIL_ERR_FWS_CRLF_END); + } + + crlfCount = 0; + + context.prev = context.now; + context.now = context.stack.pop(); // end of FWS + + i--; // look at this token again in the parent context + } + prevToken = token; + break; + // unexpected context + /* istanbul ignore next: logically unreachable */ + default: + throw new Error('unknown context: ' + context.now); + } // primary state machine + + if (maxResult > ISEMAIL_RFC5322) { + // fatal error, no point continuing + break; + } + } // token loop + + // check for errors + if (maxResult < ISEMAIL_RFC5322) { + // fatal errors + if (context.now === CONTEXT_QUOTEDSTRING) { + updateResult(ISEMAIL_ERR_UNCLOSEDQUOTEDSTR); + } else if (context.now === CONTEXT_QUOTEDPAIR) { + updateResult(ISEMAIL_ERR_BACKSLASHEND); + } else if (context.now === CONTEXT_COMMENT) { + updateResult(ISEMAIL_ERR_UNCLOSEDCOMMENT); + } else if (context.now === COMPONENT_LITERAL) { + updateResult(ISEMAIL_ERR_UNCLOSEDDOMLIT); + } else if (token === '\r') { + updateResult(ISEMAIL_ERR_FWS_CRLF_END); + } else if (parseData.domain.length === 0) { + updateResult(ISEMAIL_ERR_NODOMAIN); + } else if (elementLength === 0) { + updateResult(ISEMAIL_ERR_DOT_END); + } else if (hyphenFlag) { + updateResult(ISEMAIL_ERR_DOMAINHYPHENEND); + + // other errors + } else if (parseData.domain.length > 255) { + // http://tools.ietf.org/html/rfc5321#section-4.5.3.1.2 + // The maximum total length of a domain name or number is 255 octets. + updateResult(ISEMAIL_RFC5322_DOMAIN_TOOLONG); + } else if (parseData.local.length + parseData.domain.length + /* '@' */ 1 > + 254) { + // http://tools.ietf.org/html/rfc5321#section-4.1.2 + // Forward-path = Path + // + // Path = "<" [ A-d-l ":" ] Mailbox ">" + // + // http://tools.ietf.org/html/rfc5321#section-4.5.3.1.3 + // The maximum total length of a reverse-path or forward-path is 256 + // octets (including the punctuation and element separators). + // + // Thus, even without (obsolete) routing information, the Mailbox can + // only be 254 characters long. This is confirmed by this verified + // erratum to RFC 3696: + // + // http://www.rfc-editor.org/errata_search.php?rfc=3696&eid=1690 + // However, there is a restriction in RFC 2821 on the length of an + // address in MAIL and RCPT commands of 254 characters. Since addresses + // that do not fit in those fields are not normally useful, the upper + // limit on address lengths should normally be considered to be 254. + updateResult(ISEMAIL_RFC5322_TOOLONG); + } else if (elementLength > 63) { + // http://tools.ietf.org/html/rfc1035#section-2.3.4 + // labels 63 octets or less + updateResult(ISEMAIL_RFC5322_LABEL_TOOLONG); + } else if (options.minDomainAtoms && atomList.domain.length < + options.minDomainAtoms) { + updateResult(ISEMAIL_ERR_TOOSHORT_DOMAIN); + } else if (options.tldWhitelist) { + var tldAtom = atomList.domain[elementCount], tldValid = false, n; + if (Array.isArray(options.tldWhitelist)) { + for (i = 0, n = options.tldWhitelist.length; i < n; i++) { + if (tldAtom === options.tldWhitelist[i]) { + tldValid = true; + break; + } + } + } else { + tldValid = hasOwn.call(options.tldWhitelist, tldAtom); + } + if (!tldValid) { + updateResult(ISEMAIL_ERR_UNKNOWN_TLD); + } + } + } // check for errors + + var dnsPositive = false; + + if (options.checkDNS && maxResult < ISEMAIL_DNSWARN && HAS_REQUIRE) { + dns || (dns = require('dns')); + // http://tools.ietf.org/html/rfc5321#section-2.3.5 + // Names that can + // be resolved to MX RRs or address (i.e., A or AAAA) RRs (as discussed + // in Section 5) are permitted, as are CNAME RRs whose targets can be + // resolved, in turn, to MX or address RRs. + // + // http://tools.ietf.org/html/rfc5321#section-5.1 + // The lookup first attempts to locate an MX record associated with the + // name. If a CNAME record is found, the resulting name is processed as + // if it were the initial name. ... If an empty list of MXs is returned, + // the address is treated as if it was associated with an implicit MX + // RR, with a preference of 0, pointing to that host. + // + // isEmail() author's note: We will regard the existence of a CNAME to be + // sufficient evidence of the domain's existence. For performance reasons + // we will not repeat the DNS lookup for the CNAME's target, but we will + // raise a warning because we didn't immediately find an MX record. + if (elementCount === 0) { + // checking TLD DNS only works if you explicitly check from the root + parseData.domain += '.'; + } + + var dnsDomain = parseData.domain; + dns.resolveMx(dnsDomain, function(err, records) { + if ((err && err.code !== dns.NODATA) || (!err && !records)) { + updateResult(ISEMAIL_DNSWARN_NO_RECORD); + return finish(); + } + if (records && records.length) { + dnsPositive = true; + return finish(); + } + var done = false, count = 3; + updateResult(ISEMAIL_DNSWARN_NO_MX_RECORD); + dns.resolveCname(dnsDomain, handleRecords); + dns.resolve4(dnsDomain, handleRecords); + dns.resolve6(dnsDomain, handleRecords); + function handleRecords(err, records) { + if (done) return; + count--; + if (!err && records && records.length) { + done = true; + return finish(); + } + if (count === 0) { + // no usable records for the domain can be found + updateResult(ISEMAIL_DNSWARN_NO_RECORD); + done = true; + finish(); + } + } + }); + } else if (options.checkDNS) { + // guarantee asynchronicity + typeof process !== 'undefined' && process && + typeof process.nextTick === 'function' + ? process.nextTick(finish) + : setTimeout(finish, 1); + } else { + return finish(); + } // checkDNS + + function finish() { + if (!dnsPositive && maxResult < ISEMAIL_DNSWARN) { + if (elementCount === 0) { + updateResult(ISEMAIL_RFC5321_TLD); + } else { + var charCode = atomList.domain[elementCount].charCodeAt(0); + if (charCode >= 48 && charCode <= 57) { + updateResult(ISEMAIL_RFC5321_TLDNUMERIC); + } + } + } + + if (maxResult < threshold) { + maxResult = ISEMAIL_VALID; + } + + if (!diagnose) { + maxResult = maxResult < THRESHOLD; + } + + if (typeof callback === 'function') { + callback(maxResult); + } + + return maxResult; + } // finish +} // isEmail + +module.exports = isEmail; diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/package.json b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/package.json new file mode 100644 index 0000000..ba3eac0 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/package.json @@ -0,0 +1,52 @@ +{ + "name": "isemail", + "version": "1.1.1", + "author": { + "name": "Eli Skeggs", + "email": "skeggse@gmail.com" + }, + "description": "validate an email address according to RFCs 5321, 5322, and others", + "main": "./index", + "scripts": { + "test": "./node_modules/.bin/mocha" + }, + "repository": { + "type": "git", + "url": "https://github.com/globesherpa/node-isemail.git" + }, + "homepage": "https://github.com/globesherpa/node-isemail", + "bugs": { + "url": "https://github.com/globesherpa/node-isemail/issues" + }, + "keywords": [ + "isemail", + "validation", + "check", + "checking", + "verification", + "email", + "address", + "email address" + ], + "devDependencies": { + "mocha": "~1.13.0", + "chai": "~1.9.1" + }, + "licenses": [ + { + "type": "BSD", + "url": "http://www.opensource.org/licenses/bsd-license.php" + } + ], + "engines": { + "node": "*" + }, + "readme": "isemail\n=======\n\n[![Build Status](https://travis-ci.org/globesherpa/node-isemail.png)](https://travis-ci.org/globesherpa/node-isemail)\n[![Coverage Status](https://coveralls.io/repos/globesherpa/node-isemail/badge.png?branch=master)](https://coveralls.io/r/globesherpa/node-isemail?branch=master)\n\nThis first version of `isemail` is a port of the PHP `is_email` function by Dominic Sayers.\n\nFuture versions will improve upon the current version, optimizing it for efficient usage and DRYing the code.\n\nInstall\n-------\n\n```sh\n$ npm install isemail\n```\n\nTest\n----\n\nThe tests were pulled from is_email's extensive [test suite][tests] on October 15, 2013. Many thanks to the contributors!\n\nRun any of the following.\n\n```sh\n$ mocha\n$ npm test\n$ make test\n```\n\n_remember to_ `npm install`!\n\nAPI\n---\n\n### isEmail(email, [options], [callback])\n\nDetermines whether the `email` is valid or not, for various definitions thereof. Optionally accepts an `options` object and a `callback` function. Options may include `errorLevel` and `checkDNS`. The `callback` function will always be called if specified, and the result of the operation supplied as the only parameter to the callback function. If `isEmail` is not asked to check for the existence of the domain (`checkDNS`), it will also synchronously return the result of the operation.\n\nUse `errorLevel` to specify the type of result for `isEmail`. Passing a `false` literal will result in a true or false boolean indicating whether the email address is sufficiently defined for use in sending an email. Passing a `true` literal will result in a more granular numeric status, with zero being a perfectly valid email address. Passing a number will return `0` if the numeric status is below the `errorLevel` and the numeric status otherwise.\n\nThe `tldWhitelist` option can be either an object lookup table or an array of valid top-level domains. If the email address has a top-level domain that is not in the whitelist, the email will be marked as invalid.\n\nThe `minDomainAtoms` option is an optional positive integer that specifies the minimum number of domain atoms that must be included for the email address to be considered valid. Be careful with the option, as some top-level domains, like `io`, directly support email addresses.\n\n#### Examples\n\n```js\n$ node\n> var isEmail = require('isemail');\nundefined\n> var log = console.log.bind(console, 'result');\nundefined\n> isEmail('test@iana.org');\ntrue\n> isEmail('test@iana.org', log);\nresult true\ntrue\n> isEmail('test@iana.org', {checkDNS: true});\nundefined\n> isEmail('test@iana.org', {checkDNS: true}, log);\nundefined\nresult true\n> isEmail('test@iana.org', {errorLevel: true});\n0\n> isEmail('test@iana.org', {errorLevel: true}, log);\nresult 0\n0\n> isEmail('test@e.com');\ntrue\n> isEmail('test@e.com', {checkDNS: true, errorLevel: true}, log);\nundefined\nresult 6\n> isEmail('test@e.com', {checkDNS: true, errorLevel: 7}, log);\nundefined\nresult 0\n> isEmail('test@e.com', {checkDNS: true, errorLevel: 6}, log);\nundefined\nresult 6\n```\n\nTODO\n====\n\nAdd tests for library usage, not just functionality comparisons.\n\nLicense\n=======\n\n[BSD License](http://www.opensource.org/licenses/bsd-license.php)\n\n[tests]: http://isemail.info/_system/is_email/test/?all‎ \"is_email test suite\"\n", + "readmeFilename": "README.md", + "_id": "isemail@1.1.1", + "dist": { + "shasum": "1dc5963b585bcbfc8e794ab5f3dd1c4c7ab93cb8" + }, + "_from": "isemail@1.x.x", + "_resolved": "https://registry.npmjs.org/isemail/-/isemail-1.1.1.tgz" +} diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/test/isemail.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/test/isemail.js new file mode 100644 index 0000000..3bdfe7a --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/test/isemail.js @@ -0,0 +1,279 @@ +var expect = require('chai').expect; + +// diagnoses +var diagnoses = { + ISEMAIL_VALID: 0, + ISEMAIL_DNSWARN_NO_MX_RECORD: 5, + ISEMAIL_DNSWARN_NO_RECORD: 6, + ISEMAIL_RFC5321_TLD: 9, + ISEMAIL_RFC5321_TLDNUMERIC: 10, + ISEMAIL_RFC5321_QUOTEDSTRING: 11, + ISEMAIL_RFC5321_ADDRESSLITERAL: 12, + ISEMAIL_RFC5321_IPV6DEPRECATED: 13, + ISEMAIL_CFWS_COMMENT: 17, + ISEMAIL_CFWS_FWS: 18, + ISEMAIL_DEPREC_LOCALPART: 33, + ISEMAIL_DEPREC_FWS: 34, + ISEMAIL_DEPREC_QTEXT: 35, + ISEMAIL_DEPREC_QP: 36, + ISEMAIL_DEPREC_COMMENT: 37, + ISEMAIL_DEPREC_CTEXT: 38, + ISEMAIL_DEPREC_CFWS_NEAR_AT: 49, + ISEMAIL_RFC5322_DOMAIN: 65, + ISEMAIL_RFC5322_TOOLONG: 66, + ISEMAIL_RFC5322_LOCAL_TOOLONG: 67, + ISEMAIL_RFC5322_DOMAIN_TOOLONG: 68, + ISEMAIL_RFC5322_LABEL_TOOLONG: 69, + ISEMAIL_RFC5322_DOMAINLITERAL: 70, + ISEMAIL_RFC5322_DOMLIT_OBSDTEXT: 71, + ISEMAIL_RFC5322_IPV6_GRPCOUNT: 72, + ISEMAIL_RFC5322_IPV6_2X2XCOLON: 73, + ISEMAIL_RFC5322_IPV6_BADCHAR: 74, + ISEMAIL_RFC5322_IPV6_MAXGRPS: 75, + ISEMAIL_RFC5322_IPV6_COLONSTRT: 76, + ISEMAIL_RFC5322_IPV6_COLONEND: 77, + ISEMAIL_ERR_EXPECTING_DTEXT: 129, + ISEMAIL_ERR_NOLOCALPART: 130, + ISEMAIL_ERR_NODOMAIN: 131, + ISEMAIL_ERR_CONSECUTIVEDOTS: 132, + ISEMAIL_ERR_ATEXT_AFTER_CFWS: 133, + ISEMAIL_ERR_ATEXT_AFTER_QS: 134, + ISEMAIL_ERR_ATEXT_AFTER_DOMLIT: 135, + ISEMAIL_ERR_EXPECTING_QPAIR: 136, + ISEMAIL_ERR_EXPECTING_ATEXT: 137, + ISEMAIL_ERR_EXPECTING_QTEXT: 138, + ISEMAIL_ERR_EXPECTING_CTEXT: 139, + ISEMAIL_ERR_BACKSLASHEND: 140, + ISEMAIL_ERR_DOT_START: 141, + ISEMAIL_ERR_DOT_END: 142, + ISEMAIL_ERR_DOMAINHYPHENSTART: 143, + ISEMAIL_ERR_DOMAINHYPHENEND: 144, + ISEMAIL_ERR_UNCLOSEDQUOTEDSTR: 145, + ISEMAIL_ERR_UNCLOSEDCOMMENT: 146, + ISEMAIL_ERR_UNCLOSEDDOMLIT: 147, + ISEMAIL_ERR_FWS_CRLF_X2: 148, + ISEMAIL_ERR_FWS_CRLF_END: 149, + ISEMAIL_ERR_CR_NO_LF: 150, + ISEMAIL_ERR_UNKNOWN_TLD: 160, + ISEMAIL_ERR_TOOSHORT_TLD: 161 +}; + +// expectations +var expectations = [ + ['', diagnoses.ISEMAIL_ERR_NODOMAIN], + ['test', diagnoses.ISEMAIL_ERR_NODOMAIN], + ['@', diagnoses.ISEMAIL_ERR_NOLOCALPART], + ['test@', diagnoses.ISEMAIL_ERR_NODOMAIN], + ['test@io', diagnoses.ISEMAIL_VALID], + ['@io', diagnoses.ISEMAIL_ERR_NOLOCALPART], + ['@iana.org', diagnoses.ISEMAIL_ERR_NOLOCALPART], + ['test@iana.org', diagnoses.ISEMAIL_VALID], + ['test@nominet.org.uk', diagnoses.ISEMAIL_VALID], + ['test@about.museum', diagnoses.ISEMAIL_VALID], + ['a@iana.org', diagnoses.ISEMAIL_VALID], + ['test@e.com', diagnoses.ISEMAIL_DNSWARN_NO_RECORD], + ['test@iana.a', diagnoses.ISEMAIL_DNSWARN_NO_RECORD], + ['test.test@iana.org', diagnoses.ISEMAIL_VALID], + ['.test@iana.org', diagnoses.ISEMAIL_ERR_DOT_START], + ['test.@iana.org', diagnoses.ISEMAIL_ERR_DOT_END], + ['test..iana.org', diagnoses.ISEMAIL_ERR_CONSECUTIVEDOTS], + ['test_exa-mple.com', diagnoses.ISEMAIL_ERR_NODOMAIN], + ['!#$%&`*+/=?^`{|}~@iana.org', diagnoses.ISEMAIL_VALID], + ['test\\@test@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['123@iana.org', diagnoses.ISEMAIL_VALID], + ['test@123.com', diagnoses.ISEMAIL_VALID], + ['test@iana.123', diagnoses.ISEMAIL_RFC5321_TLDNUMERIC], + ['test@255.255.255.255', diagnoses.ISEMAIL_RFC5321_TLDNUMERIC], + ['abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@iana.org', diagnoses.ISEMAIL_VALID], + ['abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklmn@iana.org', diagnoses.ISEMAIL_RFC5322_LOCAL_TOOLONG], + ['test@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm', diagnoses.ISEMAIL_RFC5322_LABEL_TOOLONG], + ['test@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.com', diagnoses.ISEMAIL_DNSWARN_NO_RECORD], + ['test@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm.com', diagnoses.ISEMAIL_RFC5322_LABEL_TOOLONG], + ['test@mason-dixon.com', diagnoses.ISEMAIL_VALID], + ['test@-iana.org', diagnoses.ISEMAIL_ERR_DOMAINHYPHENSTART], + ['test@iana-.com', diagnoses.ISEMAIL_ERR_DOMAINHYPHENEND], + ['test@aaad.com', diagnoses.ISEMAIL_DNSWARN_NO_MX_RECORD], + ['test@iana.co-uk', diagnoses.ISEMAIL_DNSWARN_NO_RECORD], + ['test@.iana.org', diagnoses.ISEMAIL_ERR_DOT_START], + ['test@iana.org.', diagnoses.ISEMAIL_ERR_DOT_END], + ['test@iana..com', diagnoses.ISEMAIL_ERR_CONSECUTIVEDOTS], + ['a@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.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.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.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.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v', diagnoses.ISEMAIL_DNSWARN_NO_RECORD], + ['abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghi', diagnoses.ISEMAIL_DNSWARN_NO_RECORD], + ['abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghij', diagnoses.ISEMAIL_RFC5322_TOOLONG], + ['a@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.hij', diagnoses.ISEMAIL_RFC5322_TOOLONG], + ['a@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.hijk', diagnoses.ISEMAIL_RFC5322_DOMAIN_TOOLONG], + ['"test"@iana.org', diagnoses.ISEMAIL_RFC5321_QUOTEDSTRING], + ['""@iana.org', diagnoses.ISEMAIL_RFC5321_QUOTEDSTRING], + ['"""@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['"\\a"@iana.org', diagnoses.ISEMAIL_RFC5321_QUOTEDSTRING], + ['"\\""@iana.org', diagnoses.ISEMAIL_RFC5321_QUOTEDSTRING], + ['"\\"@iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDQUOTEDSTR], + ['"\\\\"@iana.org', diagnoses.ISEMAIL_RFC5321_QUOTEDSTRING], + ['test"@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['"test@iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDQUOTEDSTR], + ['"test"test@iana.org', diagnoses.ISEMAIL_ERR_ATEXT_AFTER_QS], + ['test"text"@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['"test""test"@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['"test"."test"@iana.org', diagnoses.ISEMAIL_DEPREC_LOCALPART], + ['"test\\ test"@iana.org', diagnoses.ISEMAIL_RFC5321_QUOTEDSTRING], + ['"test".test@iana.org', diagnoses.ISEMAIL_DEPREC_LOCALPART], + ['"test\0"@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_QTEXT], + ['"test\\\0"@iana.org', diagnoses.ISEMAIL_DEPREC_QP], + ['"test\r\n test"@iana.org', diagnoses.ISEMAIL_CFWS_FWS], + ['"abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz abcdefghj"@iana.org', diagnoses.ISEMAIL_RFC5322_LOCAL_TOOLONG], + ['"abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz abcdefg\\h"@iana.org', diagnoses.ISEMAIL_RFC5322_LOCAL_TOOLONG], + ['test@[255.255.255.255]', diagnoses.ISEMAIL_RFC5321_ADDRESSLITERAL], + ['test@a[255.255.255.255]', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['test@[255.255.255]', diagnoses.ISEMAIL_RFC5322_DOMAINLITERAL], + ['test@[255.255.255.255.255]', diagnoses.ISEMAIL_RFC5322_DOMAINLITERAL], + ['test@[255.255.255.256]', diagnoses.ISEMAIL_RFC5322_DOMAINLITERAL], + ['test@[1111:2222:3333:4444:5555:6666:7777:8888]', diagnoses.ISEMAIL_RFC5322_DOMAINLITERAL], + ['test@[IPv6:1111:2222:3333:4444:5555:6666:7777]', diagnoses.ISEMAIL_RFC5322_IPV6_GRPCOUNT], + ['test@[IPv6:1111:2222:3333:4444:5555:6666:7777:8888]', diagnoses.ISEMAIL_RFC5321_ADDRESSLITERAL], + ['test@[IPv6:1111:2222:3333:4444:5555:6666:7777:8888:9999]', diagnoses.ISEMAIL_RFC5322_IPV6_GRPCOUNT], + ['test@[IPv6:1111:2222:3333:4444:5555:6666:7777:888G]', diagnoses.ISEMAIL_RFC5322_IPV6_BADCHAR], + ['test@[IPv6:1111:2222:3333:4444:5555:6666::8888]', diagnoses.ISEMAIL_RFC5321_IPV6DEPRECATED], + ['test@[IPv6:1111:2222:3333:4444:5555::8888]', diagnoses.ISEMAIL_RFC5321_ADDRESSLITERAL], + ['test@[IPv6:1111:2222:3333:4444:5555:6666::7777:8888]', diagnoses.ISEMAIL_RFC5322_IPV6_MAXGRPS], + ['test@[IPv6::3333:4444:5555:6666:7777:8888]', diagnoses.ISEMAIL_RFC5322_IPV6_COLONSTRT], + ['test@[IPv6:::3333:4444:5555:6666:7777:8888]', diagnoses.ISEMAIL_RFC5321_ADDRESSLITERAL], + ['test@[IPv6:1111::4444:5555::8888]', diagnoses.ISEMAIL_RFC5322_IPV6_2X2XCOLON], + ['test@[IPv6:::]', diagnoses.ISEMAIL_RFC5321_ADDRESSLITERAL], + ['test@[IPv6:1111:2222:3333:4444:5555:255.255.255.255]', diagnoses.ISEMAIL_RFC5322_IPV6_GRPCOUNT], + ['test@[IPv6:1111:2222:3333:4444:5555:6666:255.255.255.255]', diagnoses.ISEMAIL_RFC5321_ADDRESSLITERAL], + ['test@[IPv6:1111:2222:3333:4444:5555:6666:7777:255.255.255.255]', diagnoses.ISEMAIL_RFC5322_IPV6_GRPCOUNT], + ['test@[IPv6:1111:2222:3333:4444::255.255.255.255]', diagnoses.ISEMAIL_RFC5321_ADDRESSLITERAL], + ['test@[IPv6:1111:2222:3333:4444:5555:6666::255.255.255.255]', diagnoses.ISEMAIL_RFC5322_IPV6_MAXGRPS], + ['test@[IPv6:1111:2222:3333:4444:::255.255.255.255]', diagnoses.ISEMAIL_RFC5322_IPV6_2X2XCOLON], + ['test@[IPv6::255.255.255.255]', diagnoses.ISEMAIL_RFC5322_IPV6_COLONSTRT], + [' test @iana.org', diagnoses.ISEMAIL_DEPREC_CFWS_NEAR_AT], + ['test@ iana .com', diagnoses.ISEMAIL_DEPREC_CFWS_NEAR_AT], + ['test . test@iana.org', diagnoses.ISEMAIL_DEPREC_FWS], + ['\r\n test@iana.org', diagnoses.ISEMAIL_CFWS_FWS], + ['\r\n \r\n test@iana.org', diagnoses.ISEMAIL_DEPREC_FWS], + ['(comment)test@iana.org', diagnoses.ISEMAIL_CFWS_COMMENT], + ['((comment)test@iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDCOMMENT], + ['(comment(comment))test@iana.org', diagnoses.ISEMAIL_CFWS_COMMENT], + ['test@(comment)iana.org', diagnoses.ISEMAIL_DEPREC_CFWS_NEAR_AT], + ['test(comment)test@iana.org', diagnoses.ISEMAIL_ERR_ATEXT_AFTER_CFWS], + ['test@(comment)[255.255.255.255]', diagnoses.ISEMAIL_DEPREC_CFWS_NEAR_AT], + ['(comment)abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@iana.org', diagnoses.ISEMAIL_CFWS_COMMENT], + ['test@(comment)abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.com', diagnoses.ISEMAIL_DEPREC_CFWS_NEAR_AT], + ['(comment)test@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghik.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghik.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijk.abcdefghijklmnopqrstuvwxyzabcdefghijk.abcdefghijklmnopqrstu', diagnoses.ISEMAIL_CFWS_COMMENT], + ['test@iana.org\n', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['test@xn--hxajbheg2az3al.xn--jxalpdlp', diagnoses.ISEMAIL_DNSWARN_NO_RECORD], + ['xn--test@iana.org', diagnoses.ISEMAIL_VALID], + ['test@iana.org-', diagnoses.ISEMAIL_ERR_DOMAINHYPHENEND], + ['"test@iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDQUOTEDSTR], + ['(test@iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDCOMMENT], + ['test@(iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDCOMMENT], + ['test@[1.2.3.4', diagnoses.ISEMAIL_ERR_UNCLOSEDDOMLIT], + ['"test\\"@iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDQUOTEDSTR], + ['(comment\\)test@iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDCOMMENT], + ['test@iana.org(comment\\)', diagnoses.ISEMAIL_ERR_UNCLOSEDCOMMENT], + ['test@iana.org(comment\\', diagnoses.ISEMAIL_ERR_BACKSLASHEND], + ['test@[RFC-5322-domain-literal]', diagnoses.ISEMAIL_RFC5322_DOMAINLITERAL], + ['test@[RFC-5322]-domain-literal]', diagnoses.ISEMAIL_ERR_ATEXT_AFTER_DOMLIT], + ['test@[RFC-5322-[domain-literal]', diagnoses.ISEMAIL_ERR_EXPECTING_DTEXT], + ['test@[RFC-5322-\\\x07-domain-literal]', diagnoses.ISEMAIL_RFC5322_DOMLIT_OBSDTEXT], + ['test@[RFC-5322-\\\t-domain-literal]', diagnoses.ISEMAIL_RFC5322_DOMLIT_OBSDTEXT], + ['test@[RFC-5322-\\]-domain-literal]', diagnoses.ISEMAIL_RFC5322_DOMLIT_OBSDTEXT], + ['test@[RFC-5322-\x7f-domain-literal]', diagnoses.ISEMAIL_RFC5322_DOMLIT_OBSDTEXT], + ['test@[RFC-5322-domain-literal\\]', diagnoses.ISEMAIL_ERR_UNCLOSEDDOMLIT], + ['test@[RFC-5322-domain-literal\\', diagnoses.ISEMAIL_ERR_BACKSLASHEND], + ['test@[RFC 5322 domain literal]', diagnoses.ISEMAIL_RFC5322_DOMAINLITERAL], + ['test@[RFC-5322-domain-literal] (comment)', diagnoses.ISEMAIL_RFC5322_DOMAINLITERAL], + ['\x7f@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['test@\x7f.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['"\x7f"@iana.org', diagnoses.ISEMAIL_DEPREC_QTEXT], + ['"\\\x7f"@iana.org', diagnoses.ISEMAIL_DEPREC_QP], + ['(\x7f)test@iana.org', diagnoses.ISEMAIL_DEPREC_CTEXT], + ['test@iana.org\r', diagnoses.ISEMAIL_ERR_CR_NO_LF], + ['\rtest@iana.org', diagnoses.ISEMAIL_ERR_CR_NO_LF], + ['"\rtest"@iana.org', diagnoses.ISEMAIL_ERR_CR_NO_LF], + ['(\r)test@iana.org', diagnoses.ISEMAIL_ERR_CR_NO_LF], + ['test@iana.org(\r)', diagnoses.ISEMAIL_ERR_CR_NO_LF], + ['\ntest@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['"\n"@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_QTEXT], + ['"\\\n"@iana.org', diagnoses.ISEMAIL_DEPREC_QP], + ['(\n)test@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_CTEXT], + ['\x07@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['test@\x07.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], + ['"\x07"@iana.org', diagnoses.ISEMAIL_DEPREC_QTEXT], + ['"\\\x07"@iana.org', diagnoses.ISEMAIL_DEPREC_QP], + ['(\x07)test@iana.org', diagnoses.ISEMAIL_DEPREC_CTEXT], + ['\r\ntest@iana.org', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], + ['\r\n \r\ntest@iana.org', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], + [' \r\ntest@iana.org', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], + [' \r\n test@iana.org', diagnoses.ISEMAIL_CFWS_FWS], + [' \r\n \r\ntest@iana.org', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], + [' \r\n\r\ntest@iana.org', diagnoses.ISEMAIL_ERR_FWS_CRLF_X2], + [' \r\n\r\n test@iana.org', diagnoses.ISEMAIL_ERR_FWS_CRLF_X2], + ['test@iana.org\r\n ', diagnoses.ISEMAIL_CFWS_FWS], + ['test@iana.org\r\n \r\n ', diagnoses.ISEMAIL_DEPREC_FWS], + ['test@iana.org\r\n', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], + ['test@iana.org \r', diagnoses.ISEMAIL_ERR_CR_NO_LF], + ['test@iana.org\r\n \r\n', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], + ['test@iana.org \r\n', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], + ['test@iana.org \r\n ', diagnoses.ISEMAIL_CFWS_FWS], + ['test@iana.org \r\n \r\n', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], + ['test@iana.org \r\n\r\n', diagnoses.ISEMAIL_ERR_FWS_CRLF_X2], + ['test@iana.org \r\n\r\n ', diagnoses.ISEMAIL_ERR_FWS_CRLF_X2], + ['test@iana. org', diagnoses.ISEMAIL_DEPREC_FWS], + ['test@[\r', diagnoses.ISEMAIL_ERR_CR_NO_LF], + ['test@[\r\n', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], + [' test@iana.org', diagnoses.ISEMAIL_CFWS_FWS], + ['test@iana.org ', diagnoses.ISEMAIL_CFWS_FWS], + ['test@[IPv6:1::2:]', diagnoses.ISEMAIL_RFC5322_IPV6_COLONEND], + ['"test\\©"@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_QPAIR], + ['test@iana/icann.org', diagnoses.ISEMAIL_RFC5322_DOMAIN], + ['test.(comment)test@iana.org', diagnoses.ISEMAIL_DEPREC_COMMENT], + ['test@iana.(comment)org', diagnoses.ISEMAIL_DEPREC_COMMENT], + ['test@iana(comment)iana.org', diagnoses.ISEMAIL_ERR_ATEXT_AFTER_CFWS], + ['(comment\r\n comment)test@iana.org', diagnoses.ISEMAIL_CFWS_FWS], + ['test@org', diagnoses.ISEMAIL_RFC5321_TLD], + ['test@example.com', diagnoses.ISEMAIL_DNSWARN_NO_MX_RECORD], + ['test@nic.no', diagnoses.ISEMAIL_DNSWARN_NO_RECORD] +]; + +var tldExpectations = [ + ['shouldbe@invalid', diagnoses.ISEMAIL_ERR_UNKNOWN_TLD], + ['shouldbe@example.com', diagnoses.ISEMAIL_VALID] +]; + +describe('isEmail', function() { + var isEmail = require('..'); + + expectations.forEach(function(obj, i) { + var email = obj[0], result = obj[1]; + it('should handle test ' + (i + 1), function(done) { + isEmail(email, {errorLevel: 0, checkDNS: true}, function(res) { + expect(res).to.equal(result); + done(); + }); + }); + }); + + tldExpectations.forEach(function(obj, i) { + var email = obj[0], result = obj[1]; + it('should handle tld test ' + (i + 1), function() { + var res = isEmail(email, {errorLevel: 0, tldWhitelist: {com: true}}); + expect(res).to.equal(result); + + res = isEmail(email, {errorLevel: 0, tldWhitelist: ['com']}); + expect(res).to.equal(result); + }); + }); + + it('should handle domain atom test 1', function() { + var res = isEmail('shouldbe@invalid', {errorLevel: 0, minDomainAtoms: 2}); + + expect(res).to.equal(diagnoses.ISEMAIL_ERR_TOOSHORT_TLD); + }); + + it('should handle domain atom test 2', function() { + var res = isEmail('valid@example.com', {errorLevel: 0, minDomainAtoms: 2}); + + expect(res).to.equal(diagnoses.ISEMAIL_VALID); + }); +}); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/test/mocha.opts b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/test/mocha.opts new file mode 100644 index 0000000..84dcd68 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/test/mocha.opts @@ -0,0 +1,2 @@ +--reporter dot +--check-leaks diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/LICENSE b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/LICENSE new file mode 100644 index 0000000..bd17246 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2011-2014 Tim Wood, Iskren Chernev, Moment.js contributors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/README.md b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/README.md new file mode 100644 index 0000000..6c25b5e --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/README.md @@ -0,0 +1,39 @@ +[![NPM version][npm-version-image]][npm-url] [![NPM downloads][npm-downloads-image]][npm-url] [![MIT License][license-image]][license-url] [![Build Status][travis-image]][travis-url] + +A lightweight JavaScript date library for parsing, validating, manipulating, and formatting dates. + +## [Documentation](http://momentjs.com/docs/) + +## Upgrading to 2.0.0 + +There are a number of small backwards incompatible changes with version 2.0.0. [See the full descriptions here](https://gist.github.com/timrwood/e72f2eef320ed9e37c51#backwards-incompatible-changes) + + * Changed language ordinal method to return the number + ordinal instead of just the ordinal. + + * Changed two digit year parsing cutoff to match strptime. + + * Removed `moment#sod` and `moment#eod` in favor of `moment#startOf` and `moment#endOf`. + + * Removed `moment.humanizeDuration()` in favor of `moment.duration().humanize()`. + + * Removed the lang data objects from the top level namespace. + + * Duplicate `Date` passed to `moment()` instead of referencing it. + +## [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md) + +## [Contributing](https://github.com/moment/moment/blob/develop/CONTRIBUTING.md) + +## License + +Moment.js is freely distributable under the terms of the [MIT license](https://github.com/moment/moment/blob/develop/LICENSE). + +[license-image]: http://img.shields.io/badge/license-MIT-blue.svg?style=flat +[license-url]: LICENSE + +[npm-url]: https://npmjs.org/package/moment +[npm-version-image]: http://img.shields.io/npm/v/moment.svg?style=flat +[npm-downloads-image]: http://img.shields.io/npm/dm/moment.svg?style=flat + +[travis-url]: http://travis-ci.org/moment/moment +[travis-image]: http://img.shields.io/travis/moment/moment/develop.svg?style=flat diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/ender.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/ender.js new file mode 100644 index 0000000..71462a7 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/ender.js @@ -0,0 +1 @@ +$.ender({ moment: require('moment') }) diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/af.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/af.js new file mode 100644 index 0000000..9c7ad95 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/af.js @@ -0,0 +1,71 @@ +// moment.js locale configuration +// locale : afrikaans (af) +// author : Werner Mollentze : https://github.com/wernerm + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('af', { + months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'), + weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'), + weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'), + meridiemParse: /vm|nm/i, + isPM : function (input) { + return /^nm$/i.test(input); + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower ? 'vm' : 'VM'; + } else { + return isLower ? 'nm' : 'NM'; + } + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Vandag om] LT', + nextDay : '[Môre om] LT', + nextWeek : 'dddd [om] LT', + lastDay : '[Gister om] LT', + lastWeek : '[Laas] dddd [om] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'oor %s', + past : '%s gelede', + s : '\'n paar sekondes', + m : '\'n minuut', + mm : '%d minute', + h : '\'n uur', + hh : '%d ure', + d : '\'n dag', + dd : '%d dae', + M : '\'n maand', + MM : '%d maande', + y : '\'n jaar', + yy : '%d jaar' + }, + ordinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter + }, + week : { + dow : 1, // Maandag is die eerste dag van die week. + doy : 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ar-ma.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ar-ma.js new file mode 100644 index 0000000..7add172 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ar-ma.js @@ -0,0 +1,57 @@ +// moment.js locale configuration +// locale : Moroccan Arabic (ar-ma) +// author : ElFadili Yassine : https://github.com/ElFadiliY +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ar-ma', { + months : 'يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + monthsShort : 'يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'ÙÙŠ %s', + past : 'منذ %s', + s : 'ثوان', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ar-sa.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ar-sa.js new file mode 100644 index 0000000..731f97b --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ar-sa.js @@ -0,0 +1,101 @@ +// moment.js locale configuration +// locale : Arabic Saudi Arabia (ar-sa) +// author : Suhail Alkowaileet : https://github.com/xsoh + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': 'Ù¡', + '2': 'Ù¢', + '3': 'Ù£', + '4': 'Ù¤', + '5': 'Ù¥', + '6': 'Ù¦', + '7': 'Ù§', + '8': 'Ù¨', + '9': 'Ù©', + '0': 'Ù ' + }, numberMap = { + 'Ù¡': '1', + 'Ù¢': '2', + 'Ù£': '3', + 'Ù¤': '4', + 'Ù¥': '5', + 'Ù¦': '6', + 'Ù§': '7', + 'Ù¨': '8', + 'Ù©': '9', + 'Ù ': '0' + }; + + return moment.defineLocale('ar-sa', { + months : 'يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + monthsShort : 'يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + meridiemParse: /ص|Ù…/, + isPM : function (input) { + return 'Ù…' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'Ù…'; + } + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'ÙÙŠ %s', + past : 'منذ %s', + s : 'ثوان', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + preparse: function (string) { + return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return numberMap[match]; + }).replace(/ØŒ/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, 'ØŒ'); + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ar-tn.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ar-tn.js new file mode 100644 index 0000000..b1ddb4f --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ar-tn.js @@ -0,0 +1,55 @@ +// moment.js locale configuration +// locale : Tunisian Arabic (ar-tn) + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ar-tn', { + months: 'جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + monthsShort: 'جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin: 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS: 'LT:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd D MMMM YYYY LT' + }, + calendar: { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'ÙÙŠ %s', + past: 'منذ %s', + s: 'ثوان', + m: 'دقيقة', + mm: '%d دقائق', + h: 'ساعة', + hh: '%d ساعات', + d: 'يوم', + dd: '%d أيام', + M: 'شهر', + MM: '%d أشهر', + y: 'سنة', + yy: '%d سنوات' + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ar.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ar.js new file mode 100644 index 0000000..828e618 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ar.js @@ -0,0 +1,134 @@ +// moment.js locale configuration +// Locale: Arabic (ar) +// Author: Abdel Said: https://github.com/abdelsaid +// Changes in months, weekdays: Ahmed Elkhatib +// Native plural forms: forabi https://github.com/forabi + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': 'Ù¡', + '2': 'Ù¢', + '3': 'Ù£', + '4': 'Ù¤', + '5': 'Ù¥', + '6': 'Ù¦', + '7': 'Ù§', + '8': 'Ù¨', + '9': 'Ù©', + '0': 'Ù ' + }, numberMap = { + 'Ù¡': '1', + 'Ù¢': '2', + 'Ù£': '3', + 'Ù¤': '4', + 'Ù¥': '5', + 'Ù¦': '6', + 'Ù§': '7', + 'Ù¨': '8', + 'Ù©': '9', + 'Ù ': '0' + }, pluralForm = function (n) { + return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5; + }, plurals = { + s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'], + m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'], + h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'], + d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'], + M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'], + y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام'] + }, pluralize = function (u) { + return function (number, withoutSuffix, string, isFuture) { + var f = pluralForm(number), + str = plurals[u][pluralForm(number)]; + if (f === 2) { + str = str[withoutSuffix ? 0 : 1]; + } + return str.replace(/%d/i, number); + }; + }, months = [ + 'كانون الثاني يناير', + 'شباط Ùبراير', + 'آذار مارس', + 'نيسان أبريل', + 'أيار مايو', + 'حزيران يونيو', + 'تموز يوليو', + 'آب أغسطس', + 'أيلول سبتمبر', + 'تشرين الأول أكتوبر', + 'تشرين الثاني نوÙمبر', + 'كانون الأول ديسمبر' + ]; + + return moment.defineLocale('ar', { + months : months, + monthsShort : months, + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + meridiemParse: /ص|Ù…/, + isPM : function (input) { + return 'Ù…' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'Ù…'; + } + }, + calendar : { + sameDay: '[اليوم عند الساعة] LT', + nextDay: '[غدًا عند الساعة] LT', + nextWeek: 'dddd [عند الساعة] LT', + lastDay: '[أمس عند الساعة] LT', + lastWeek: 'dddd [عند الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'بعد %s', + past : 'منذ %s', + s : pluralize('s'), + m : pluralize('m'), + mm : pluralize('m'), + h : pluralize('h'), + hh : pluralize('h'), + d : pluralize('d'), + dd : pluralize('d'), + M : pluralize('M'), + MM : pluralize('M'), + y : pluralize('y'), + yy : pluralize('y') + }, + preparse: function (string) { + return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return numberMap[match]; + }).replace(/ØŒ/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, 'ØŒ'); + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/az.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/az.js new file mode 100644 index 0000000..7624fee --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/az.js @@ -0,0 +1,107 @@ +// moment.js locale configuration +// locale : azerbaijani (az) +// author : topchiyev : https://github.com/topchiyev + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var suffixes = { + 1: '-inci', + 5: '-inci', + 8: '-inci', + 70: '-inci', + 80: '-inci', + + 2: '-nci', + 7: '-nci', + 20: '-nci', + 50: '-nci', + + 3: '-üncü', + 4: '-üncü', + 100: '-üncü', + + 6: '-ncı', + + 9: '-uncu', + 10: '-uncu', + 30: '-uncu', + + 60: '-ıncı', + 90: '-ıncı' + }; + return moment.defineLocale('az', { + months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'), + monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'), + weekdays : 'Bazar_Bazar ertÉ™si_ÇərÅŸÉ™nbÉ™ axÅŸamı_ÇərÅŸÉ™nbÉ™_CümÉ™ axÅŸamı_CümÉ™_ŞənbÉ™'.split('_'), + weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'), + weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[bugün saat] LT', + nextDay : '[sabah saat] LT', + nextWeek : '[gÉ™lÉ™n hÉ™ftÉ™] dddd [saat] LT', + lastDay : '[dünÉ™n] LT', + lastWeek : '[keçən hÉ™ftÉ™] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s sonra', + past : '%s É™vvÉ™l', + s : 'birneçə saniyyÉ™', + m : 'bir dÉ™qiqÉ™', + mm : '%d dÉ™qiqÉ™', + h : 'bir saat', + hh : '%d saat', + d : 'bir gün', + dd : '%d gün', + M : 'bir ay', + MM : '%d ay', + y : 'bir il', + yy : '%d il' + }, + meridiemParse: /gecÉ™|sÉ™hÉ™r|gündüz|axÅŸam/, + isPM : function (input) { + return /^(gündüz|axÅŸam)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'gecÉ™'; + } else if (hour < 12) { + return 'sÉ™hÉ™r'; + } else if (hour < 17) { + return 'gündüz'; + } else { + return 'axÅŸam'; + } + }, + ordinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/, + ordinal : function (number) { + if (number === 0) { // special case for zero + return number + '-ıncı'; + } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + + return number + (suffixes[a] || suffixes[b] || suffixes[c]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/be.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/be.js new file mode 100644 index 0000000..d888e21 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/be.js @@ -0,0 +1,154 @@ +// moment.js locale configuration +// locale : belarusian (be) +// author : Dmitry Demidov : https://github.com/demidov91 +// author: Praleska: http://praleska.pro/ +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін', + 'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін', + 'dd': 'дзень_дні_дзён', + 'MM': 'меÑÑц_меÑÑцы_меÑÑцаў', + 'yy': 'год_гады_гадоў' + }; + if (key === 'm') { + return withoutSuffix ? 'хвіліна' : 'хвіліну'; + } + else if (key === 'h') { + return withoutSuffix ? 'гадзіна' : 'гадзіну'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñтудзень_люты_Ñакавік_краÑавік_травень_чÑрвень_ліпень_жнівень_вераÑень_каÑтрычнік_ліÑтапад_Ñнежань'.split('_'), + 'accusative': 'ÑтудзенÑ_лютага_Ñакавіка_краÑавіка_траўнÑ_чÑрвенÑ_ліпенÑ_жніўнÑ_вераÑнÑ_каÑтрычніка_ліÑтапада_ÑнежнÑ'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'нÑдзелÑ_панÑдзелак_аўторак_Ñерада_чацвер_пÑтніца_Ñубота'.split('_'), + 'accusative': 'нÑдзелю_панÑдзелак_аўторак_Ñераду_чацвер_пÑтніцу_Ñуботу'.split('_') + }, + + nounCase = (/\[ ?[Вв] ?(?:мінулую|наÑтупную)? ?\] ?dddd/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.defineLocale('be', { + months : monthsCaseReplace, + monthsShort : 'Ñтуд_лют_Ñак_краÑ_трав_чÑрв_ліп_жнів_вер_каÑÑ‚_ліÑÑ‚_Ñнеж'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'нд_пн_ат_ÑÑ€_чц_пт_Ñб'.split('_'), + weekdaysMin : 'нд_пн_ат_ÑÑ€_чц_пт_Ñб'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY г.', + LLL : 'D MMMM YYYY г., LT', + LLLL : 'dddd, D MMMM YYYY г., LT' + }, + calendar : { + sameDay: '[Ð¡Ñ‘Ð½Ð½Ñ Ñž] LT', + nextDay: '[Заўтра Ñž] LT', + lastDay: '[Учора Ñž] LT', + nextWeek: function () { + return '[У] dddd [Ñž] LT'; + }, + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return '[У мінулую] dddd [Ñž] LT'; + case 1: + case 2: + case 4: + return '[У мінулы] dddd [Ñž] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'праз %s', + past : '%s таму', + s : 'некалькі Ñекунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : relativeTimeWithPlural, + hh : relativeTimeWithPlural, + d : 'дзень', + dd : relativeTimeWithPlural, + M : 'меÑÑц', + MM : relativeTimeWithPlural, + y : 'год', + yy : relativeTimeWithPlural + }, + meridiemParse: /ночы|раніцы|днÑ|вечара/, + isPM : function (input) { + return /^(днÑ|вечара)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночы'; + } else if (hour < 12) { + return 'раніцы'; + } else if (hour < 17) { + return 'днÑ'; + } else { + return 'вечара'; + } + }, + + ordinalParse: /\d{1,2}-(Ñ–|Ñ‹|га)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-Ñ–' : number + '-Ñ‹'; + case 'D': + return number + '-га'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/bg.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/bg.js new file mode 100644 index 0000000..540e17b --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/bg.js @@ -0,0 +1,88 @@ +// moment.js locale configuration +// locale : bulgarian (bg) +// author : Krasen Borisov : https://github.com/kraz + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('bg', { + months : 'Ñнуари_февруари_март_април_май_юни_юли_авгуÑÑ‚_Ñептември_октомври_ноември_декември'.split('_'), + monthsShort : 'Ñнр_фев_мар_апр_май_юни_юли_авг_Ñеп_окт_ное_дек'.split('_'), + weekdays : 'неделÑ_понеделник_вторник_ÑÑ€Ñда_четвъртък_петък_Ñъбота'.split('_'), + weekdaysShort : 'нед_пон_вто_ÑÑ€Ñ_чет_пет_Ñъб'.split('_'), + weekdaysMin : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'D.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Ð”Ð½ÐµÑ Ð²] LT', + nextDay : '[Утре в] LT', + nextWeek : 'dddd [в] LT', + lastDay : '[Вчера в] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[Ð’ изминалата] dddd [в] LT'; + case 1: + case 2: + case 4: + case 5: + return '[Ð’ изминалиÑ] dddd [в] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'Ñлед %s', + past : 'преди %s', + s : 'нÑколко Ñекунди', + m : 'минута', + mm : '%d минути', + h : 'чаÑ', + hh : '%d чаÑа', + d : 'ден', + dd : '%d дни', + M : 'меÑец', + MM : '%d меÑеца', + y : 'година', + yy : '%d години' + }, + ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/bn.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/bn.js new file mode 100644 index 0000000..5b4ab51 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/bn.js @@ -0,0 +1,111 @@ +// moment.js locale configuration +// locale : Bengali (bn) +// author : Kaushik Gandhi : https://github.com/kaushikgandhi + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': '১', + '2': '২', + '3': '৩', + '4': '৪', + '5': '৫', + '6': '৬', + '7': '৭', + '8': '৮', + '9': '৯', + '0': '০' + }, + numberMap = { + '১': '1', + '২': '2', + '৩': '3', + '৪': '4', + '৫': '5', + '৬': '6', + '৭': '7', + '৮': '8', + '৯': '9', + '০': '0' + }; + + return moment.defineLocale('bn', { + months : 'জানà§à§Ÿà¦¾à¦°à§€_ফেবà§à§Ÿà¦¾à¦°à§€_মারà§à¦š_à¦à¦ªà§à¦°à¦¿à¦²_মে_জà§à¦¨_জà§à¦²à¦¾à¦‡_অগাসà§à¦Ÿ_সেপà§à¦Ÿà§‡à¦®à§à¦¬à¦°_অকà§à¦Ÿà§‹à¦¬à¦°_নভেমà§à¦¬à¦°_ডিসেমà§à¦¬à¦°'.split('_'), + monthsShort : 'জানà§_ফেব_মারà§à¦š_à¦à¦ªà¦°_মে_জà§à¦¨_জà§à¦²_অগ_সেপà§à¦Ÿ_অকà§à¦Ÿà§‹_নভ_ডিসেমà§'.split('_'), + weekdays : 'রবিবার_সোমবার_মঙà§à¦—লবার_বà§à¦§à¦¬à¦¾à¦°_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿à¦¬à¦¾à¦°_শà§à¦•à§à¦°à§à¦¬à¦¾à¦°_শনিবার'.split('_'), + weekdaysShort : 'রবি_সোম_মঙà§à¦—ল_বà§à¦§_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿_শà§à¦•à§à¦°à§_শনি'.split('_'), + weekdaysMin : 'রব_সম_মঙà§à¦—_বà§_বà§à¦°à¦¿à¦¹_শà§_শনি'.split('_'), + longDateFormat : { + LT : 'A h:mm সময়', + LTS : 'A h:mm:ss সময়', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[আজ] LT', + nextDay : '[আগামীকাল] LT', + nextWeek : 'dddd, LT', + lastDay : '[গতকাল] LT', + lastWeek : '[গত] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s পরে', + past : '%s আগে', + s : 'কà¦à¦• সেকেনà§à¦¡', + m : 'à¦à¦• মিনিট', + mm : '%d মিনিট', + h : 'à¦à¦• ঘনà§à¦Ÿà¦¾', + hh : '%d ঘনà§à¦Ÿà¦¾', + d : 'à¦à¦• দিন', + dd : '%d দিন', + M : 'à¦à¦• মাস', + MM : '%d মাস', + y : 'à¦à¦• বছর', + yy : '%d বছর' + }, + preparse: function (string) { + return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /রাত|শকাল|দà§à¦ªà§à¦°|বিকেল|রাত/, + isPM: function (input) { + return /^(দà§à¦ªà§à¦°|বিকেল|রাত)$/.test(input); + }, + //Bengali is a vast language its spoken + //in different forms in various parts of the world. + //I have just generalized with most common one used + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'রাত'; + } else if (hour < 10) { + return 'শকাল'; + } else if (hour < 17) { + return 'দà§à¦ªà§à¦°'; + } else if (hour < 20) { + return 'বিকেল'; + } else { + return 'রাত'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/bo.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/bo.js new file mode 100644 index 0000000..b8e7001 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/bo.js @@ -0,0 +1,108 @@ +// moment.js locale configuration +// locale : tibetan (bo) +// author : Thupten N. Chakrishar : https://github.com/vajradog + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': '༡', + '2': '༢', + '3': '༣', + '4': '༤', + '5': '༥', + '6': '༦', + '7': '༧', + '8': '༨', + '9': '༩', + '0': '༠' + }, + numberMap = { + '༡': '1', + '༢': '2', + '༣': '3', + '༤': '4', + '༥': '5', + '༦': '6', + '༧': '7', + '༨': '8', + '༩': '9', + '༠': '0' + }; + + return moment.defineLocale('bo', { + months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), + monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), + weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'), + weekdaysShort : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), + weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), + longDateFormat : { + LT : 'A h:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[དི་རིང] LT', + nextDay : '[སང་ཉིན] LT', + nextWeek : '[བདུན་ཕྲག་རྗེས་མ], LT', + lastDay : '[à½à¼‹à½¦à½„] LT', + lastWeek : '[བདུན་ཕྲག་མà½à½ à¼‹à½˜] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s ལ་', + past : '%s སྔན་ལ', + s : 'ལམ་སང', + m : 'སà¾à½¢à¼‹à½˜à¼‹à½‚ཅིག', + mm : '%d སà¾à½¢à¼‹à½˜', + h : 'ཆུ་ཚོད་གཅིག', + hh : '%d ཆུ་ཚོད', + d : 'ཉིན་གཅིག', + dd : '%d ཉིན་', + M : 'ཟླ་བ་གཅིག', + MM : '%d ཟླ་བ', + y : 'ལོ་གཅིག', + yy : '%d ལོ' + }, + preparse: function (string) { + return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/, + isPM: function (input) { + return /^(ཉིན་གུང|དགོང་དག|མཚན་མོ)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'མཚན་མོ'; + } else if (hour < 10) { + return 'ཞོགས་ཀས'; + } else if (hour < 17) { + return 'ཉིན་གུང'; + } else if (hour < 20) { + return 'དགོང་དག'; + } else { + return 'མཚན་མོ'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/br.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/br.js new file mode 100644 index 0000000..1f8dd61 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/br.js @@ -0,0 +1,109 @@ +// moment.js locale configuration +// locale : breton (br) +// author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function relativeTimeWithMutation(number, withoutSuffix, key) { + var format = { + 'mm': 'munutenn', + 'MM': 'miz', + 'dd': 'devezh' + }; + return number + ' ' + mutation(format[key], number); + } + + function specialMutationForYears(number) { + switch (lastNumber(number)) { + case 1: + case 3: + case 4: + case 5: + case 9: + return number + ' bloaz'; + default: + return number + ' vloaz'; + } + } + + function lastNumber(number) { + if (number > 9) { + return lastNumber(number % 10); + } + return number; + } + + function mutation(text, number) { + if (number === 2) { + return softMutation(text); + } + return text; + } + + function softMutation(text) { + var mutationTable = { + 'm': 'v', + 'b': 'v', + 'd': 'z' + }; + if (mutationTable[text.charAt(0)] === undefined) { + return text; + } + return mutationTable[text.charAt(0)] + text.substring(1); + } + + return moment.defineLocale('br', { + months : 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'), + monthsShort : 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'), + weekdays : 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'), + weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'), + weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'), + longDateFormat : { + LT : 'h[e]mm A', + LTS : 'h[e]mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D [a viz] MMMM YYYY', + LLL : 'D [a viz] MMMM YYYY LT', + LLLL : 'dddd, D [a viz] MMMM YYYY LT' + }, + calendar : { + sameDay : '[Hiziv da] LT', + nextDay : '[Warc\'hoazh da] LT', + nextWeek : 'dddd [da] LT', + lastDay : '[Dec\'h da] LT', + lastWeek : 'dddd [paset da] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'a-benn %s', + past : '%s \'zo', + s : 'un nebeud segondennoù', + m : 'ur vunutenn', + mm : relativeTimeWithMutation, + h : 'un eur', + hh : '%d eur', + d : 'un devezh', + dd : relativeTimeWithMutation, + M : 'ur miz', + MM : relativeTimeWithMutation, + y : 'ur bloaz', + yy : specialMutationForYears + }, + ordinalParse: /\d{1,2}(añ|vet)/, + ordinal : function (number) { + var output = (number === 1) ? 'añ' : 'vet'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/bs.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/bs.js new file mode 100644 index 0000000..c59f46b --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/bs.js @@ -0,0 +1,140 @@ +// moment.js locale configuration +// locale : bosnian (bs) +// author : Nedim Cholich : https://github.com/frontyard +// based on (hr) translation by Bojan Marković + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } + } + + return moment.defineLocale('bs', { + months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'), + monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'), + weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota'.split('_'), + weekdaysShort : 'ned._pon._uto._sri._Äet._pet._sub.'.split('_'), + weekdaysMin : 'ne_po_ut_sr_Äe_pe_su'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD. MM. YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[proÅ¡lu] dddd [u] LT'; + case 6: + return '[proÅ¡le] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[proÅ¡li] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'par sekundi', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'dan', + dd : translate, + M : 'mjesec', + MM : translate, + y : 'godinu', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ca.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ca.js new file mode 100644 index 0000000..4f0d3fe --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ca.js @@ -0,0 +1,77 @@ +// moment.js locale configuration +// locale : catalan (ca) +// author : Juan G. Hurtado : https://github.com/juanghurtado + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ca', { + months : 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'), + monthsShort : 'gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.'.split('_'), + weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'), + weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'), + weekdaysMin : 'Dg_Dl_Dt_Dc_Dj_Dv_Ds'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay : function () { + return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextDay : function () { + return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastDay : function () { + return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'fa %s', + s : 'uns segons', + m : 'un minut', + mm : '%d minuts', + h : 'una hora', + hh : '%d hores', + d : 'un dia', + dd : '%d dies', + M : 'un mes', + MM : '%d mesos', + y : 'un any', + yy : '%d anys' + }, + ordinalParse: /\d{1,2}(r|n|t|è|a)/, + ordinal : function (number, period) { + var output = (number === 1) ? 'r' : + (number === 2) ? 'n' : + (number === 3) ? 'r' : + (number === 4) ? 't' : 'è'; + if (period === 'w' || period === 'W') { + output = 'a'; + } + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/cs.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/cs.js new file mode 100644 index 0000000..b61658d --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/cs.js @@ -0,0 +1,157 @@ +// moment.js locale configuration +// locale : czech (cs) +// author : petrbela : https://github.com/petrbela + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var months = 'leden_únor_bÅ™ezen_duben_kvÄ›ten_Äerven_Äervenec_srpen_září_říjen_listopad_prosinec'.split('_'), + monthsShort = 'led_úno_bÅ™e_dub_kvÄ›_Ävn_Ävc_srp_zář_říj_lis_pro'.split('_'); + + function plural(n) { + return (n > 1) && (n < 5) && (~~(n / 10) !== 1); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami'; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minuty' : 'minut'); + } else { + return result + 'minutami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodin'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'den' : 'dnem'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dny' : 'dní'); + } else { + return result + 'dny'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mÄ›síc' : 'mÄ›sícem'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'mÄ›síce' : 'mÄ›síců'); + } else { + return result + 'mÄ›síci'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokem'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'let'); + } else { + return result + 'lety'; + } + break; + } + } + + return moment.defineLocale('cs', { + months : months, + monthsShort : monthsShort, + monthsParse : (function (months, monthsShort) { + var i, _monthsParse = []; + for (i = 0; i < 12; i++) { + // use custom parser to solve problem with July (Äervenec) + _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); + } + return _monthsParse; + }(months, monthsShort)), + weekdays : 'nedÄ›le_pondÄ›lí_úterý_stÅ™eda_Ätvrtek_pátek_sobota'.split('_'), + weekdaysShort : 'ne_po_út_st_Ät_pá_so'.split('_'), + weekdaysMin : 'ne_po_út_st_Ät_pá_so'.split('_'), + longDateFormat : { + LT: 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[dnes v] LT', + nextDay: '[zítra v] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedÄ›li v] LT'; + case 1: + case 2: + return '[v] dddd [v] LT'; + case 3: + return '[ve stÅ™edu v] LT'; + case 4: + return '[ve Ätvrtek v] LT'; + case 5: + return '[v pátek v] LT'; + case 6: + return '[v sobotu v] LT'; + } + }, + lastDay: '[vÄera v] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulou nedÄ›li v] LT'; + case 1: + case 2: + return '[minulé] dddd [v] LT'; + case 3: + return '[minulou stÅ™edu v] LT'; + case 4: + case 5: + return '[minulý] dddd [v] LT'; + case 6: + return '[minulou sobotu v] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pÅ™ed %s', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse : /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/cv.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/cv.js new file mode 100644 index 0000000..ea8e314 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/cv.js @@ -0,0 +1,61 @@ +// moment.js locale configuration +// locale : chuvash (cv) +// author : Anatoly Mironov : https://github.com/mirontoli + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('cv', { + months : 'кăрлач_нарăÑ_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав'.split('_'), + monthsShort : 'кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш'.split('_'), + weekdays : 'вырÑарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_Ñрнекун_шăматкун'.split('_'), + weekdaysShort : 'выр_тун_ытл_юн_кĕç_Ñрн_шăм'.split('_'), + weekdaysMin : 'вр_тн_Ñ‹Ñ‚_юн_кç_ÑÑ€_шм'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD-MM-YYYY', + LL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]', + LLL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT', + LLLL : 'dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT' + }, + calendar : { + sameDay: '[ПаÑн] LT [Ñехетре]', + nextDay: '[Ыран] LT [Ñехетре]', + lastDay: '[Ĕнер] LT [Ñехетре]', + nextWeek: '[ÇитеÑ] dddd LT [Ñехетре]', + lastWeek: '[Иртнĕ] dddd LT [Ñехетре]', + sameElse: 'L' + }, + relativeTime : { + future : function (output) { + var affix = /Ñехет$/i.exec(output) ? 'рен' : /çул$/i.exec(output) ? 'тан' : 'ран'; + return output + affix; + }, + past : '%s каÑлла', + s : 'пĕр-ик çеккунт', + m : 'пĕр минут', + mm : '%d минут', + h : 'пĕр Ñехет', + hh : '%d Ñехет', + d : 'пĕр кун', + dd : '%d кун', + M : 'пĕр уйăх', + MM : '%d уйăх', + y : 'пĕр çул', + yy : '%d çул' + }, + ordinalParse: /\d{1,2}-мĕш/, + ordinal : '%d-мĕш', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/cy.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/cy.js new file mode 100644 index 0000000..72b2f91 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/cy.js @@ -0,0 +1,79 @@ +// moment.js locale configuration +// locale : Welsh (cy) +// author : Robert Allen + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('cy', { + months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'), + monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'), + weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'), + weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'), + weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'), + // time formats are the same as en-gb + longDateFormat: { + LT: 'HH:mm', + LTS : 'LT:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd, D MMMM YYYY LT' + }, + calendar: { + sameDay: '[Heddiw am] LT', + nextDay: '[Yfory am] LT', + nextWeek: 'dddd [am] LT', + lastDay: '[Ddoe am] LT', + lastWeek: 'dddd [diwethaf am] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'mewn %s', + past: '%s yn ôl', + s: 'ychydig eiliadau', + m: 'munud', + mm: '%d munud', + h: 'awr', + hh: '%d awr', + d: 'diwrnod', + dd: '%d diwrnod', + M: 'mis', + MM: '%d mis', + y: 'blwyddyn', + yy: '%d flynedd' + }, + ordinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/, + // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh + ordinal: function (number) { + var b = number, + output = '', + lookup = [ + '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed + 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed + ]; + + if (b > 20) { + if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) { + output = 'fed'; // not 30ain, 70ain or 90ain + } else { + output = 'ain'; + } + } else if (b > 0) { + output = lookup[b]; + } + + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/da.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/da.js new file mode 100644 index 0000000..686ce00 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/da.js @@ -0,0 +1,58 @@ +// moment.js locale configuration +// locale : danish (da) +// author : Ulrik Nielsen : https://github.com/mrbase + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('da', { + months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), + weekdaysShort : 'søn_man_tir_ons_tor_fre_lør'.split('_'), + weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd [d.] D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[I dag kl.] LT', + nextDay : '[I morgen kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[I gÃ¥r kl.] LT', + lastWeek : '[sidste] dddd [kl] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'om %s', + past : '%s siden', + s : 'fÃ¥ sekunder', + m : 'et minut', + mm : '%d minutter', + h : 'en time', + hh : '%d timer', + d : 'en dag', + dd : '%d dage', + M : 'en mÃ¥ned', + MM : '%d mÃ¥neder', + y : 'et Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/de-at.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/de-at.js new file mode 100644 index 0000000..c982638 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/de-at.js @@ -0,0 +1,74 @@ +// moment.js locale configuration +// locale : austrian german (de-at) +// author : lluchs : https://github.com/lluchs +// author: Menelion Elensúle: https://github.com/Oire +// author : Martin Groller : https://github.com/MadMG + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + return moment.defineLocale('de-at', { + months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[Heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[Morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[Gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/de.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/de.js new file mode 100644 index 0000000..f6d89a9 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/de.js @@ -0,0 +1,73 @@ +// moment.js locale configuration +// locale : german (de) +// author : lluchs : https://github.com/lluchs +// author: Menelion Elensúle: https://github.com/Oire + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + return moment.defineLocale('de', { + months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[Heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[Morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[Gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/el.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/el.js new file mode 100644 index 0000000..6dc769e --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/el.js @@ -0,0 +1,94 @@ +// moment.js locale configuration +// locale : modern greek (el) +// author : Aggelos Karalias : https://github.com/mehiel + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('el', { + monthsNominativeEl : 'ΙανουάÏιος_ΦεβÏουάÏιος_ΜάÏτιος_ΑπÏίλιος_Μάιος_ΙοÏνιος_ΙοÏλιος_ΑÏγουστος_ΣεπτέμβÏιος_ΟκτώβÏιος_ÎοέμβÏιος_ΔεκέμβÏιος'.split('_'), + monthsGenitiveEl : 'ΙανουαÏίου_ΦεβÏουαÏίου_ΜαÏτίου_ΑπÏιλίου_ΜαÎου_Ιουνίου_Ιουλίου_ΑυγοÏστου_ΣεπτεμβÏίου_ΟκτωβÏίου_ÎοεμβÏίου_ΔεκεμβÏίου'.split('_'), + months : function (momentToFormat, format) { + if (/D/.test(format.substring(0, format.indexOf('MMMM')))) { // if there is a day number before 'MMMM' + return this._monthsGenitiveEl[momentToFormat.month()]; + } else { + return this._monthsNominativeEl[momentToFormat.month()]; + } + }, + monthsShort : 'Ιαν_Φεβ_ΜαÏ_ΑπÏ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Îοε_Δεκ'.split('_'), + weekdays : 'ΚυÏιακή_ΔευτέÏα_ΤÏίτη_ΤετάÏτη_Πέμπτη_ΠαÏασκευή_Σάββατο'.split('_'), + weekdaysShort : 'ΚυÏ_Δευ_ΤÏι_Τετ_Πεμ_ΠαÏ_Σαβ'.split('_'), + weekdaysMin : 'Κυ_Δε_ΤÏ_Τε_Πε_Πα_Σα'.split('_'), + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'μμ' : 'ΜΜ'; + } else { + return isLower ? 'πμ' : 'ΠΜ'; + } + }, + isPM : function (input) { + return ((input + '').toLowerCase()[0] === 'μ'); + }, + meridiemParse : /[ΠΜ]\.?Îœ?\.?/i, + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendarEl : { + sameDay : '[ΣήμεÏα {}] LT', + nextDay : '[ΑÏÏιο {}] LT', + nextWeek : 'dddd [{}] LT', + lastDay : '[Χθες {}] LT', + lastWeek : function () { + switch (this.day()) { + case 6: + return '[το Ï€ÏοηγοÏμενο] dddd [{}] LT'; + default: + return '[την Ï€ÏοηγοÏμενη] dddd [{}] LT'; + } + }, + sameElse : 'L' + }, + calendar : function (key, mom) { + var output = this._calendarEl[key], + hours = mom && mom.hours(); + + if (typeof output === 'function') { + output = output.apply(mom); + } + + return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις')); + }, + relativeTime : { + future : 'σε %s', + past : '%s Ï€Ïιν', + s : 'λίγα δευτεÏόλεπτα', + m : 'ένα λεπτό', + mm : '%d λεπτά', + h : 'μία ÏŽÏα', + hh : '%d ÏŽÏες', + d : 'μία μέÏα', + dd : '%d μέÏες', + M : 'ένας μήνας', + MM : '%d μήνες', + y : 'ένας χÏόνος', + yy : '%d χÏόνια' + }, + ordinalParse: /\d{1,2}η/, + ordinal: '%dη', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/en-au.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/en-au.js new file mode 100644 index 0000000..a382b0a --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/en-au.js @@ -0,0 +1,64 @@ +// moment.js locale configuration +// locale : australian english (en-au) + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('en-au', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + 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' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/en-ca.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/en-ca.js new file mode 100644 index 0000000..2dec8a6 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/en-ca.js @@ -0,0 +1,61 @@ +// moment.js locale configuration +// locale : canadian english (en-ca) +// author : Jonathan Abourbih : https://github.com/jonbca + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('en-ca', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'YYYY-MM-DD', + LL : 'D MMMM, YYYY', + LLL : 'D MMMM, YYYY LT', + LLLL : 'dddd, D MMMM, YYYY LT' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + 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' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/en-gb.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/en-gb.js new file mode 100644 index 0000000..4ea2b29 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/en-gb.js @@ -0,0 +1,65 @@ +// moment.js locale configuration +// locale : great britain english (en-gb) +// author : Chris Gedrim : https://github.com/chrisgedrim + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('en-gb', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + 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' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/eo.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/eo.js new file mode 100644 index 0000000..9e3d045 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/eo.js @@ -0,0 +1,71 @@ +// moment.js locale configuration +// locale : esperanto (eo) +// author : Colin Dean : https://github.com/colindean +// komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko. +// Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni! + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('eo', { + months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aÅ­gusto_septembro_oktobro_novembro_decembro'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aÅ­g_sep_okt_nov_dec'.split('_'), + weekdays : 'Dimanĉo_Lundo_Mardo_Merkredo_Ä´aÅ­do_Vendredo_Sabato'.split('_'), + weekdaysShort : 'Dim_Lun_Mard_Merk_Ä´aÅ­_Ven_Sab'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Ä´a_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'D[-an de] MMMM, YYYY', + LLL : 'D[-an de] MMMM, YYYY LT', + LLLL : 'dddd, [la] D[-an de] MMMM, YYYY LT' + }, + meridiemParse: /[ap]\.t\.m/i, + isPM: function (input) { + return input.charAt(0).toLowerCase() === 'p'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'p.t.m.' : 'P.T.M.'; + } else { + return isLower ? 'a.t.m.' : 'A.T.M.'; + } + }, + calendar : { + sameDay : '[HodiaÅ­ je] LT', + nextDay : '[MorgaÅ­ je] LT', + nextWeek : 'dddd [je] LT', + lastDay : '[HieraÅ­ je] LT', + lastWeek : '[pasinta] dddd [je] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'je %s', + past : 'antaÅ­ %s', + s : 'sekundoj', + m : 'minuto', + mm : '%d minutoj', + h : 'horo', + hh : '%d horoj', + d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo + dd : '%d tagoj', + M : 'monato', + MM : '%d monatoj', + y : 'jaro', + yy : '%d jaroj' + }, + ordinalParse: /\d{1,2}a/, + ordinal : '%da', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/es.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/es.js new file mode 100644 index 0000000..b6e30b1 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/es.js @@ -0,0 +1,77 @@ +// moment.js locale configuration +// locale : spanish (es) +// author : Julio Napurí : https://github.com/julionc + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), + monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); + + return moment.defineLocale('es', { + months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return monthsShort[m.month()]; + } else { + return monthsShortDot[m.month()]; + } + }, + weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), + weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), + weekdaysMin : 'Do_Lu_Ma_Mi_Ju_Vi_Sá'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY LT', + LLLL : 'dddd, D [de] MMMM [de] YYYY LT' + }, + calendar : { + sameDay : function () { + return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextDay : function () { + return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastDay : function () { + return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'hace %s', + s : 'unos segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'una hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un año', + yy : '%d años' + }, + ordinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/et.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/et.js new file mode 100644 index 0000000..7dbcee7 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/et.js @@ -0,0 +1,78 @@ +// moment.js locale configuration +// locale : estonian (et) +// author : Henry Kehlmann : https://github.com/madhenry +// improvements : Illimar Tambek : https://github.com/ragulka + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'], + 'm' : ['ühe minuti', 'üks minut'], + 'mm': [number + ' minuti', number + ' minutit'], + 'h' : ['ühe tunni', 'tund aega', 'üks tund'], + 'hh': [number + ' tunni', number + ' tundi'], + 'd' : ['ühe päeva', 'üks päev'], + 'M' : ['kuu aja', 'kuu aega', 'üks kuu'], + 'MM': [number + ' kuu', number + ' kuud'], + 'y' : ['ühe aasta', 'aasta', 'üks aasta'], + 'yy': [number + ' aasta', number + ' aastat'] + }; + if (withoutSuffix) { + return format[key][2] ? format[key][2] : format[key][1]; + } + return isFuture ? format[key][0] : format[key][1]; + } + + return moment.defineLocale('et', { + months : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'), + monthsShort : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'), + weekdays : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'), + weekdaysShort : 'P_E_T_K_N_R_L'.split('_'), + weekdaysMin : 'P_E_T_K_N_R_L'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[Täna,] LT', + nextDay : '[Homme,] LT', + nextWeek : '[Järgmine] dddd LT', + lastDay : '[Eile,] LT', + lastWeek : '[Eelmine] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s pärast', + past : '%s tagasi', + s : processRelativeTime, + m : processRelativeTime, + mm : processRelativeTime, + h : processRelativeTime, + hh : processRelativeTime, + d : processRelativeTime, + dd : '%d päeva', + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/eu.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/eu.js new file mode 100644 index 0000000..c455c46 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/eu.js @@ -0,0 +1,62 @@ +// moment.js locale configuration +// locale : euskara (eu) +// author : Eneko Illarramendi : https://github.com/eillarra + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('eu', { + months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'), + monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'), + weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'), + weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'), + weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY[ko] MMMM[ren] D[a]', + LLL : 'YYYY[ko] MMMM[ren] D[a] LT', + LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] LT', + l : 'YYYY-M-D', + ll : 'YYYY[ko] MMM D[a]', + lll : 'YYYY[ko] MMM D[a] LT', + llll : 'ddd, YYYY[ko] MMM D[a] LT' + }, + calendar : { + sameDay : '[gaur] LT[etan]', + nextDay : '[bihar] LT[etan]', + nextWeek : 'dddd LT[etan]', + lastDay : '[atzo] LT[etan]', + lastWeek : '[aurreko] dddd LT[etan]', + sameElse : 'L' + }, + relativeTime : { + future : '%s barru', + past : 'duela %s', + s : 'segundo batzuk', + m : 'minutu bat', + mm : '%d minutu', + h : 'ordu bat', + hh : '%d ordu', + d : 'egun bat', + dd : '%d egun', + M : 'hilabete bat', + MM : '%d hilabete', + y : 'urte bat', + yy : '%d urte' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fa.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fa.js new file mode 100644 index 0000000..6d76575 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fa.js @@ -0,0 +1,103 @@ +// moment.js locale configuration +// locale : Persian (fa) +// author : Ebrahim Byagowi : https://github.com/ebraminio + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': 'Û±', + '2': 'Û²', + '3': 'Û³', + '4': 'Û´', + '5': 'Ûµ', + '6': 'Û¶', + '7': 'Û·', + '8': 'Û¸', + '9': 'Û¹', + '0': 'Û°' + }, numberMap = { + 'Û±': '1', + 'Û²': '2', + 'Û³': '3', + 'Û´': '4', + 'Ûµ': '5', + 'Û¶': '6', + 'Û·': '7', + 'Û¸': '8', + 'Û¹': '9', + 'Û°': '0' + }; + + return moment.defineLocale('fa', { + months : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + monthsShort : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysMin : 'ÛŒ_د_س_Ú†_Ù¾_ج_Ø´'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + meridiemParse: /قبل از ظهر|بعد از ظهر/, + isPM: function (input) { + return /بعد از ظهر/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'قبل از ظهر'; + } else { + return 'بعد از ظهر'; + } + }, + calendar : { + sameDay : '[امروز ساعت] LT', + nextDay : '[Ùردا ساعت] LT', + nextWeek : 'dddd [ساعت] LT', + lastDay : '[دیروز ساعت] LT', + lastWeek : 'dddd [پیش] [ساعت] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'در %s', + past : '%s پیش', + s : 'چندین ثانیه', + m : 'یک دقیقه', + mm : '%d دقیقه', + h : 'یک ساعت', + hh : '%d ساعت', + d : 'یک روز', + dd : '%d روز', + M : 'یک ماه', + MM : '%d ماه', + y : 'یک سال', + yy : '%d سال' + }, + preparse: function (string) { + return string.replace(/[Û°-Û¹]/g, function (match) { + return numberMap[match]; + }).replace(/ØŒ/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, 'ØŒ'); + }, + ordinalParse: /\d{1,2}Ù…/, + ordinal : '%dÙ…', + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fi.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fi.js new file mode 100644 index 0000000..f884c3e --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fi.js @@ -0,0 +1,107 @@ +// moment.js locale configuration +// locale : finnish (fi) +// author : Tarmo Aidantausta : https://github.com/bleadof + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '), + numbersFuture = [ + 'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden', + numbersPast[7], numbersPast[8], numbersPast[9] + ]; + + function translate(number, withoutSuffix, key, isFuture) { + var result = ''; + switch (key) { + case 's': + return isFuture ? 'muutaman sekunnin' : 'muutama sekunti'; + case 'm': + return isFuture ? 'minuutin' : 'minuutti'; + case 'mm': + result = isFuture ? 'minuutin' : 'minuuttia'; + break; + case 'h': + return isFuture ? 'tunnin' : 'tunti'; + case 'hh': + result = isFuture ? 'tunnin' : 'tuntia'; + break; + case 'd': + return isFuture ? 'päivän' : 'päivä'; + case 'dd': + result = isFuture ? 'päivän' : 'päivää'; + break; + case 'M': + return isFuture ? 'kuukauden' : 'kuukausi'; + case 'MM': + result = isFuture ? 'kuukauden' : 'kuukautta'; + break; + case 'y': + return isFuture ? 'vuoden' : 'vuosi'; + case 'yy': + result = isFuture ? 'vuoden' : 'vuotta'; + break; + } + result = verbalNumber(number, isFuture) + ' ' + result; + return result; + } + + function verbalNumber(number, isFuture) { + return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number; + } + + return moment.defineLocale('fi', { + months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'), + monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'), + weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'), + weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'), + weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD.MM.YYYY', + LL : 'Do MMMM[ta] YYYY', + LLL : 'Do MMMM[ta] YYYY, [klo] LT', + LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] LT', + l : 'D.M.YYYY', + ll : 'Do MMM YYYY', + lll : 'Do MMM YYYY, [klo] LT', + llll : 'ddd, Do MMM YYYY, [klo] LT' + }, + calendar : { + sameDay : '[tänään] [klo] LT', + nextDay : '[huomenna] [klo] LT', + nextWeek : 'dddd [klo] LT', + lastDay : '[eilen] [klo] LT', + lastWeek : '[viime] dddd[na] [klo] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s päästä', + past : '%s sitten', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fo.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fo.js new file mode 100644 index 0000000..6b940e8 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fo.js @@ -0,0 +1,58 @@ +// moment.js locale configuration +// locale : faroese (fo) +// author : Ragnar Johannesen : https://github.com/ragnar123 + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('fo', { + months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'), + weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'), + weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D. MMMM, YYYY LT' + }, + calendar : { + sameDay : '[à dag kl.] LT', + nextDay : '[à morgin kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[à gjár kl.] LT', + lastWeek : '[síðstu] dddd [kl] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'um %s', + past : '%s síðani', + s : 'fá sekund', + m : 'ein minutt', + mm : '%d minuttir', + h : 'ein tími', + hh : '%d tímar', + d : 'ein dagur', + dd : '%d dagar', + M : 'ein mánaði', + MM : '%d mánaðir', + y : 'eitt ár', + yy : '%d ár' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fr-ca.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fr-ca.js new file mode 100644 index 0000000..6cac1b8 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fr-ca.js @@ -0,0 +1,56 @@ +// moment.js locale configuration +// locale : canadian french (fr-ca) +// author : Jonathan Abourbih : https://github.com/jonbca + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('fr-ca', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Aujourd\'hui à] LT', + nextDay: '[Demain à] LT', + nextWeek: 'dddd [à] LT', + lastDay: '[Hier à] LT', + lastWeek: 'dddd [dernier à] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + ordinalParse: /\d{1,2}(er|)/, + ordinal : function (number) { + return number + (number === 1 ? 'er' : ''); + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fr.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fr.js new file mode 100644 index 0000000..4a7cbcc --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fr.js @@ -0,0 +1,60 @@ +// moment.js locale configuration +// locale : french (fr) +// author : John Fischer : https://github.com/jfroffice + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('fr', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Aujourd\'hui à] LT', + nextDay: '[Demain à] LT', + nextWeek: 'dddd [à] LT', + lastDay: '[Hier à] LT', + lastWeek: 'dddd [dernier à] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + ordinalParse: /\d{1,2}(er|)/, + ordinal : function (number) { + return number + (number === 1 ? 'er' : ''); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fy.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fy.js new file mode 100644 index 0000000..f86c249 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fy.js @@ -0,0 +1,69 @@ +// moment.js locale configuration +// locale : frisian (fy) +// author : Robin van der Vliet : https://github.com/robin0van0der0v + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'); + + return moment.defineLocale('fy', { + months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'), + weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'), + weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[hjoed om] LT', + nextDay: '[moarn om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[juster om] LT', + lastWeek: '[ôfrûne] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'oer %s', + past : '%s lyn', + s : 'in pear sekonden', + m : 'ien minút', + mm : '%d minuten', + h : 'ien oere', + hh : '%d oeren', + d : 'ien dei', + dd : '%d dagen', + M : 'ien moanne', + MM : '%d moannen', + y : 'ien jier', + yy : '%d jierren' + }, + ordinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/gl.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/gl.js new file mode 100644 index 0000000..5ff9e3f --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/gl.js @@ -0,0 +1,73 @@ +// moment.js locale configuration +// locale : galician (gl) +// author : Juan G. Hurtado : https://github.com/juanghurtado + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('gl', { + months : 'Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro'.split('_'), + monthsShort : 'Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.'.split('_'), + weekdays : 'Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado'.split('_'), + weekdaysShort : 'Dom._Lun._Mar._Mér._Xov._Ven._Sáb.'.split('_'), + weekdaysMin : 'Do_Lu_Ma_Mé_Xo_Ve_Sá'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay : function () { + return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextDay : function () { + return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextWeek : function () { + return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + lastDay : function () { + return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT'; + }, + lastWeek : function () { + return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : function (str) { + if (str === 'uns segundos') { + return 'nuns segundos'; + } + return 'en ' + str; + }, + past : 'hai %s', + s : 'uns segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'unha hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un ano', + yy : '%d anos' + }, + ordinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/he.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/he.js new file mode 100644 index 0000000..d2f4b13 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/he.js @@ -0,0 +1,80 @@ +// moment.js locale configuration +// locale : Hebrew (he) +// author : Tomer Cohen : https://github.com/tomer +// author : Moshe Simantov : https://github.com/DevelopmentIL +// author : Tal Ater : https://github.com/TalAter + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('he', { + months : 'ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר'.split('_'), + monthsShort : 'ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳'.split('_'), + weekdays : 'ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'), + weekdaysShort : '×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'), + weekdaysMin : '×_ב_×’_ד_×”_ו_ש'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [ב]MMMM YYYY', + LLL : 'D [ב]MMMM YYYY LT', + LLLL : 'dddd, D [ב]MMMM YYYY LT', + l : 'D/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY LT', + llll : 'ddd, D MMM YYYY LT' + }, + calendar : { + sameDay : '[×”×™×•× ×‘Ö¾]LT', + nextDay : '[מחר ב־]LT', + nextWeek : 'dddd [בשעה] LT', + lastDay : '[×תמול ב־]LT', + lastWeek : '[ביו×] dddd [×”×חרון בשעה] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'בעוד %s', + past : 'לפני %s', + s : 'מספר שניות', + m : 'דקה', + mm : '%d דקות', + h : 'שעה', + hh : function (number) { + if (number === 2) { + return 'שעתיי×'; + } + return number + ' שעות'; + }, + d : 'יו×', + dd : function (number) { + if (number === 2) { + return 'יומיי×'; + } + return number + ' ימי×'; + }, + M : 'חודש', + MM : function (number) { + if (number === 2) { + return 'חודשיי×'; + } + return number + ' חודשי×'; + }, + y : 'שנה', + yy : function (number) { + if (number === 2) { + return 'שנתיי×'; + } else if (number % 10 === 0 && number !== 10) { + return number + ' שנה'; + } + return number + ' שני×'; + } + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/hi.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/hi.js new file mode 100644 index 0000000..173c4ee --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/hi.js @@ -0,0 +1,121 @@ +// moment.js locale configuration +// locale : hindi (hi) +// author : Mayank Singhal : https://github.com/mayanksinghal + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.defineLocale('hi', { + months : 'जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°'.split('_'), + monthsShort : 'जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.'.split('_'), + weekdays : 'रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split('_'), + weekdaysShort : 'रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split('_'), + weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split('_'), + longDateFormat : { + LT : 'A h:mm बजे', + LTS : 'A h:mm:ss बजे', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[कल] LT', + nextWeek : 'dddd, LT', + lastDay : '[कल] LT', + lastWeek : '[पिछले] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s में', + past : '%s पहले', + s : 'कà¥à¤› ही कà¥à¤·à¤£', + m : 'à¤à¤• मिनट', + mm : '%d मिनट', + h : 'à¤à¤• घंटा', + hh : '%d घंटे', + d : 'à¤à¤• दिन', + dd : '%d दिन', + M : 'à¤à¤• महीने', + MM : '%d महीने', + y : 'à¤à¤• वरà¥à¤·', + yy : '%d वरà¥à¤·' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + // Hindi notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi. + meridiemParse: /रात|सà¥à¤¬à¤¹|दोपहर|शाम/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'रात') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'सà¥à¤¬à¤¹') { + return hour; + } else if (meridiem === 'दोपहर') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'शाम') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'रात'; + } else if (hour < 10) { + return 'सà¥à¤¬à¤¹'; + } else if (hour < 17) { + return 'दोपहर'; + } else if (hour < 20) { + return 'शाम'; + } else { + return 'रात'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/hr.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/hr.js new file mode 100644 index 0000000..65264dc --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/hr.js @@ -0,0 +1,141 @@ +// moment.js locale configuration +// locale : hrvatski (hr) +// author : Bojan Marković : https://github.com/bmarkovic + +// based on (sl) translation by Robert SedovÅ¡ek + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } + } + + return moment.defineLocale('hr', { + months : 'sjeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_'), + monthsShort : 'sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'), + weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota'.split('_'), + weekdaysShort : 'ned._pon._uto._sri._Äet._pet._sub.'.split('_'), + weekdaysMin : 'ne_po_ut_sr_Äe_pe_su'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD. MM. YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[proÅ¡lu] dddd [u] LT'; + case 6: + return '[proÅ¡le] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[proÅ¡li] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'par sekundi', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'dan', + dd : translate, + M : 'mjesec', + MM : translate, + y : 'godinu', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/hu.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/hu.js new file mode 100644 index 0000000..de8cae9 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/hu.js @@ -0,0 +1,111 @@ +// moment.js locale configuration +// locale : hungarian (hu) +// author : Adam Brunner : https://github.com/adambrunner + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var weekEndings = 'vasárnap hétfÅ‘n kedden szerdán csütörtökön pénteken szombaton'.split(' '); + + function translate(number, withoutSuffix, key, isFuture) { + var num = number, + suffix; + + switch (key) { + case 's': + return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce'; + case 'm': + return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'mm': + return num + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'h': + return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'hh': + return num + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'd': + return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'dd': + return num + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'M': + return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'MM': + return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'y': + return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve'); + case 'yy': + return num + (isFuture || withoutSuffix ? ' év' : ' éve'); + } + + return ''; + } + + function week(isFuture) { + return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]'; + } + + return moment.defineLocale('hu', { + months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'), + monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'), + weekdays : 'vasárnap_hétfÅ‘_kedd_szerda_csütörtök_péntek_szombat'.split('_'), + weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'), + weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'YYYY.MM.DD.', + LL : 'YYYY. MMMM D.', + LLL : 'YYYY. MMMM D., LT', + LLLL : 'YYYY. MMMM D., dddd LT' + }, + meridiemParse: /de|du/i, + isPM: function (input) { + return input.charAt(1).toLowerCase() === 'u'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower === true ? 'de' : 'DE'; + } else { + return isLower === true ? 'du' : 'DU'; + } + }, + calendar : { + sameDay : '[ma] LT[-kor]', + nextDay : '[holnap] LT[-kor]', + nextWeek : function () { + return week.call(this, true); + }, + lastDay : '[tegnap] LT[-kor]', + lastWeek : function () { + return week.call(this, false); + }, + sameElse : 'L' + }, + relativeTime : { + future : '%s múlva', + past : '%s', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/hy-am.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/hy-am.js new file mode 100644 index 0000000..6e2de8b --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/hy-am.js @@ -0,0 +1,118 @@ +// moment.js locale configuration +// locale : Armenian (hy-am) +// author : Armendarabyan : https://github.com/armendarabyan + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€_Õ´Õ¡Ö€Õ¿_Õ¡ÕºÖ€Õ«Õ¬_Õ´Õ¡ÕµÕ«Õ½_Õ°Õ¸Ö‚Õ¶Õ«Õ½_Õ°Õ¸Ö‚Õ¬Õ«Õ½_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€'.split('_'), + 'accusative': 'Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€Õ«_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€Õ«_Õ´Õ¡Ö€Õ¿Õ«_Õ¡ÕºÖ€Õ«Õ¬Õ«_Õ´Õ¡ÕµÕ«Õ½Õ«_Õ°Õ¸Ö‚Õ¶Õ«Õ½Õ«_Õ°Õ¸Ö‚Õ¬Õ«Õ½Õ«_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½Õ«_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function monthsShortCaseReplace(m, format) { + var monthsShort = 'Õ°Õ¶Õ¾_ÖƒÕ¿Ö€_Õ´Ö€Õ¿_Õ¡ÕºÖ€_Õ´ÕµÕ½_Õ°Õ¶Õ½_Õ°Õ¬Õ½_Ö…Õ£Õ½_Õ½ÕºÕ¿_Õ°Õ¯Õ¿_Õ¶Õ´Õ¢_Õ¤Õ¯Õ¿'.split('_'); + + return monthsShort[m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = 'Õ¯Õ«Ö€Õ¡Õ¯Õ«_Õ¥Ö€Õ¯Õ¸Ö‚Õ·Õ¡Õ¢Õ©Õ«_Õ¥Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ¹Õ¸Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ°Õ«Õ¶Õ£Õ·Õ¡Õ¢Õ©Õ«_Õ¸Ö‚Ö€Õ¢Õ¡Õ©_Õ·Õ¡Õ¢Õ¡Õ©'.split('_'); + + return weekdays[m.day()]; + } + + return moment.defineLocale('hy-am', { + months : monthsCaseReplace, + monthsShort : monthsShortCaseReplace, + weekdays : weekdaysCaseReplace, + weekdaysShort : 'Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©'.split('_'), + weekdaysMin : 'Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY Õ©.', + LLL : 'D MMMM YYYY Õ©., LT', + LLLL : 'dddd, D MMMM YYYY Õ©., LT' + }, + calendar : { + sameDay: '[Õ¡ÕµÕ½Ö…Ö€] LT', + nextDay: '[Õ¾Õ¡Õ²Õ¨] LT', + lastDay: '[Õ¥Ö€Õ¥Õ¯] LT', + nextWeek: function () { + return 'dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT'; + }, + lastWeek: function () { + return '[Õ¡Õ¶ÖÕ¡Õ®] dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT'; + }, + sameElse: 'L' + }, + relativeTime : { + future : '%s Õ°Õ¥Õ¿Õ¸', + past : '%s Õ¡Õ¼Õ¡Õ»', + s : 'Õ´Õ« Ö„Õ¡Õ¶Õ« Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶', + m : 'Ö€Õ¸ÕºÕ¥', + mm : '%d Ö€Õ¸ÕºÕ¥', + h : 'ÕªÕ¡Õ´', + hh : '%d ÕªÕ¡Õ´', + d : 'Ö…Ö€', + dd : '%d Ö…Ö€', + M : 'Õ¡Õ´Õ«Õ½', + MM : '%d Õ¡Õ´Õ«Õ½', + y : 'Õ¿Õ¡Ö€Õ«', + yy : '%d Õ¿Õ¡Ö€Õ«' + }, + + meridiemParse: /Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡|Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡|ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶/, + isPM: function (input) { + return /^(ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶)$/.test(input); + }, + meridiem : function (hour) { + if (hour < 4) { + return 'Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡'; + } else if (hour < 12) { + return 'Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡'; + } else if (hour < 17) { + return 'ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡'; + } else { + return 'Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶'; + } + }, + + ordinalParse: /\d{1,2}|\d{1,2}-(Õ«Õ¶|Ö€Õ¤)/, + ordinal: function (number, period) { + switch (period) { + case 'DDD': + case 'w': + case 'W': + case 'DDDo': + if (number === 1) { + return number + '-Õ«Õ¶'; + } + return number + '-Ö€Õ¤'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/id.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/id.js new file mode 100644 index 0000000..fe04849 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/id.js @@ -0,0 +1,81 @@ +// moment.js locale configuration +// locale : Bahasa Indonesia (id) +// author : Mohammad Satrio Utomo : https://github.com/tyok +// reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('id', { + months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'), + weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'), + weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'LT.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] LT', + LLLL : 'dddd, D MMMM YYYY [pukul] LT' + }, + meridiemParse: /pagi|siang|sore|malam/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'siang') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'sore' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'siang'; + } else if (hours < 19) { + return 'sore'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Besok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kemarin pukul] LT', + lastWeek : 'dddd [lalu pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lalu', + s : 'beberapa detik', + m : 'semenit', + mm : '%d menit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/is.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/is.js new file mode 100644 index 0000000..21888aa --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/is.js @@ -0,0 +1,126 @@ +// moment.js locale configuration +// locale : icelandic (is) +// author : Hinrik Örn Sigurðsson : https://github.com/hinrik + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function plural(n) { + if (n % 100 === 11) { + return true; + } else if (n % 10 === 1) { + return false; + } + return true; + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': + return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum'; + case 'm': + return withoutSuffix ? 'mínúta' : 'mínútu'; + case 'mm': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum'); + } else if (withoutSuffix) { + return result + 'mínúta'; + } + return result + 'mínútu'; + case 'hh': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum'); + } + return result + 'klukkustund'; + case 'd': + if (withoutSuffix) { + return 'dagur'; + } + return isFuture ? 'dag' : 'degi'; + case 'dd': + if (plural(number)) { + if (withoutSuffix) { + return result + 'dagar'; + } + return result + (isFuture ? 'daga' : 'dögum'); + } else if (withoutSuffix) { + return result + 'dagur'; + } + return result + (isFuture ? 'dag' : 'degi'); + case 'M': + if (withoutSuffix) { + return 'mánuður'; + } + return isFuture ? 'mánuð' : 'mánuði'; + case 'MM': + if (plural(number)) { + if (withoutSuffix) { + return result + 'mánuðir'; + } + return result + (isFuture ? 'mánuði' : 'mánuðum'); + } else if (withoutSuffix) { + return result + 'mánuður'; + } + return result + (isFuture ? 'mánuð' : 'mánuði'); + case 'y': + return withoutSuffix || isFuture ? 'ár' : 'ári'; + case 'yy': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'ár' : 'árum'); + } + return result + (withoutSuffix || isFuture ? 'ár' : 'ári'); + } + } + + return moment.defineLocale('is', { + months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'), + weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'), + weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'), + weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] LT', + LLLL : 'dddd, D. MMMM YYYY [kl.] LT' + }, + calendar : { + sameDay : '[í dag kl.] LT', + nextDay : '[á morgun kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[í gær kl.] LT', + lastWeek : '[síðasta] dddd [kl.] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'eftir %s', + past : 'fyrir %s síðan', + s : translate, + m : translate, + mm : translate, + h : 'klukkustund', + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/it.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/it.js new file mode 100644 index 0000000..9d14714 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/it.js @@ -0,0 +1,68 @@ +// moment.js locale configuration +// locale : italian (it) +// author : Lorenzo : https://github.com/aliem +// author: Mattia Larentis: https://github.com/nostalgiaz + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('it', { + months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'), + monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'), + weekdays : 'Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato'.split('_'), + weekdaysShort : 'Dom_Lun_Mar_Mer_Gio_Ven_Sab'.split('_'), + weekdaysMin : 'D_L_Ma_Me_G_V_S'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Oggi alle] LT', + nextDay: '[Domani alle] LT', + nextWeek: 'dddd [alle] LT', + lastDay: '[Ieri alle] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[la scorsa] dddd [alle] LT'; + default: + return '[lo scorso] dddd [alle] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : function (s) { + return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s; + }, + past : '%s fa', + s : 'alcuni secondi', + m : 'un minuto', + mm : '%d minuti', + h : 'un\'ora', + hh : '%d ore', + d : 'un giorno', + dd : '%d giorni', + M : 'un mese', + MM : '%d mesi', + y : 'un anno', + yy : '%d anni' + }, + ordinalParse : /\d{1,2}º/, + ordinal: '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ja.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ja.js new file mode 100644 index 0000000..1feb202 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ja.js @@ -0,0 +1,63 @@ +// moment.js locale configuration +// locale : japanese (ja) +// author : LI Long : https://github.com/baryon + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ja', { + months : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '日曜日_月曜日_ç«æ›œæ—¥_水曜日_木曜日_金曜日_土曜日'.split('_'), + weekdaysShort : 'æ—¥_月_ç«_æ°´_木_金_土'.split('_'), + weekdaysMin : 'æ—¥_月_ç«_æ°´_木_金_土'.split('_'), + longDateFormat : { + LT : 'Ah時m分', + LTS : 'LTs秒', + L : 'YYYY/MM/DD', + LL : 'YYYYå¹´M月Dæ—¥', + LLL : 'YYYYå¹´M月Dæ—¥LT', + LLLL : 'YYYYå¹´M月Dæ—¥LT dddd' + }, + meridiemParse: /åˆå‰|åˆå¾Œ/i, + isPM : function (input) { + return input === 'åˆå¾Œ'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'åˆå‰'; + } else { + return 'åˆå¾Œ'; + } + }, + calendar : { + sameDay : '[今日] LT', + nextDay : '[明日] LT', + nextWeek : '[æ¥é€±]dddd LT', + lastDay : '[昨日] LT', + lastWeek : '[å‰é€±]dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s後', + past : '%så‰', + s : '数秒', + m : '1分', + mm : '%d分', + h : '1時間', + hh : '%d時間', + d : '1æ—¥', + dd : '%dæ—¥', + M : '1ヶ月', + MM : '%dヶ月', + y : '1å¹´', + yy : '%då¹´' + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ka.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ka.js new file mode 100644 index 0000000..b56e18c --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ka.js @@ -0,0 +1,109 @@ +// moment.js locale configuration +// locale : Georgian (ka) +// author : Irakli Janiashvili : https://github.com/irakli-janiashvili + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'იáƒáƒœáƒ•áƒáƒ áƒ˜_თებერვáƒáƒšáƒ˜_მáƒáƒ áƒ¢áƒ˜_áƒáƒžáƒ áƒ˜áƒšáƒ˜_მáƒáƒ˜áƒ¡áƒ˜_ივნისი_ივლისი_áƒáƒ’ვისტáƒ_სექტემბერი_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი_ნáƒáƒ”მბერი_დეკემბერი'.split('_'), + 'accusative': 'იáƒáƒœáƒ•áƒáƒ áƒ¡_თებერვáƒáƒšáƒ¡_მáƒáƒ áƒ¢áƒ¡_áƒáƒžáƒ áƒ˜áƒšáƒ˜áƒ¡_მáƒáƒ˜áƒ¡áƒ¡_ივნისს_ივლისს_áƒáƒ’ვისტს_სექტემბერს_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერს_ნáƒáƒ”მბერს_დეკემბერს'.split('_') + }, + + nounCase = (/D[oD] *MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'კვირáƒ_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ი_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი_ხუთშáƒáƒ‘áƒáƒ—ი_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი_შáƒáƒ‘áƒáƒ—ი'.split('_'), + 'accusative': 'კვირáƒáƒ¡_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ს_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ს_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ს_ხუთშáƒáƒ‘áƒáƒ—ს_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვს_შáƒáƒ‘áƒáƒ—ს'.split('_') + }, + + nounCase = (/(წინáƒ|შემდეგ)/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.defineLocale('ka', { + months : monthsCaseReplace, + monthsShort : 'იáƒáƒœ_თებ_მáƒáƒ _áƒáƒžáƒ _მáƒáƒ˜_ივნ_ივლ_áƒáƒ’ვ_სექ_áƒáƒ¥áƒ¢_ნáƒáƒ”_დეკ'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'კვი_áƒáƒ áƒ¨_სáƒáƒ›_áƒáƒ—ხ_ხუთ_პáƒáƒ _შáƒáƒ‘'.split('_'), + weekdaysMin : 'კვ_áƒáƒ _სáƒ_áƒáƒ—_ხუ_პáƒ_შáƒ'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[დღეს] LT[-ზე]', + nextDay : '[ხვáƒáƒš] LT[-ზე]', + lastDay : '[გუშინ] LT[-ზე]', + nextWeek : '[შემდეგ] dddd LT[-ზე]', + lastWeek : '[წინáƒ] dddd LT-ზე', + sameElse : 'L' + }, + relativeTime : { + future : function (s) { + return (/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|წელი)/).test(s) ? + s.replace(/ი$/, 'ში') : + s + 'ში'; + }, + past : function (s) { + if ((/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|დღე|თვე)/).test(s)) { + return s.replace(/(ი|ე)$/, 'ის წინ'); + } + if ((/წელი/).test(s)) { + return s.replace(/წელი$/, 'წლის წინ'); + } + }, + s : 'რáƒáƒ›áƒ“ენიმე წáƒáƒ›áƒ˜', + m : 'წუთი', + mm : '%d წუთი', + h : 'სáƒáƒáƒ—ი', + hh : '%d სáƒáƒáƒ—ი', + d : 'დღე', + dd : '%d დღე', + M : 'თვე', + MM : '%d თვე', + y : 'წელი', + yy : '%d წელი' + }, + ordinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/, + ordinal : function (number) { + if (number === 0) { + return number; + } + + if (number === 1) { + return number + '-ლი'; + } + + if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) { + return 'მე-' + number; + } + + return number + '-ე'; + }, + week : { + dow : 1, + doy : 7 + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/km.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/km.js new file mode 100644 index 0000000..8d7b9b8 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/km.js @@ -0,0 +1,56 @@ +// moment.js locale configuration +// locale : khmer (km) +// author : Kruy Vanna : https://github.com/kruyvanna + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('km', { + months: 'មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ'.split('_'), + monthsShort: 'មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ'.split('_'), + weekdays: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), + weekdaysShort: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), + weekdaysMin: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS : 'LT:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd, D MMMM YYYY LT' + }, + calendar: { + sameDay: '[ážáŸ’ងៃនៈ ម៉ោង] LT', + nextDay: '[ស្អែក ម៉ោង] LT', + nextWeek: 'dddd [ម៉ោង] LT', + lastDay: '[ម្សិលមិញ ម៉ោង] LT', + lastWeek: 'dddd [សប្ážáž¶áž áŸáž˜áž»áž“] [ម៉ោង] LT', + sameElse: 'L' + }, + relativeTime: { + future: '%sទៀáž', + past: '%sមុន', + s: 'ប៉ុន្មានវិនាទី', + m: 'មួយនាទី', + mm: '%d នាទី', + h: 'មួយម៉ោង', + hh: '%d ម៉ោង', + d: 'មួយážáŸ’ងៃ', + dd: '%d ážáŸ’ងៃ', + M: 'មួយážáŸ‚', + MM: '%d ážáŸ‚', + y: 'មួយឆ្នាំ', + yy: '%d ឆ្នាំ' + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ko.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ko.js new file mode 100644 index 0000000..8f9396f --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ko.js @@ -0,0 +1,65 @@ +// moment.js locale configuration +// locale : korean (ko) +// +// authors +// +// - Kyungwook, Park : https://github.com/kyungw00k +// - Jeeeyul Lee +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ko', { + months : '1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”'.split('_'), + monthsShort : '1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”'.split('_'), + weekdays : 'ì¼ìš”ì¼_월요ì¼_화요ì¼_수요ì¼_목요ì¼_금요ì¼_토요ì¼'.split('_'), + weekdaysShort : 'ì¼_ì›”_í™”_수_목_금_토'.split('_'), + weekdaysMin : 'ì¼_ì›”_í™”_수_목_금_토'.split('_'), + longDateFormat : { + LT : 'A hì‹œ m분', + LTS : 'A hì‹œ m분 sì´ˆ', + L : 'YYYY.MM.DD', + LL : 'YYYYë…„ MMMM Dì¼', + LLL : 'YYYYë…„ MMMM Dì¼ LT', + LLLL : 'YYYYë…„ MMMM Dì¼ dddd LT' + }, + calendar : { + sameDay : '오늘 LT', + nextDay : 'ë‚´ì¼ LT', + nextWeek : 'dddd LT', + lastDay : 'ì–´ì œ LT', + lastWeek : '지난주 dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s 후', + past : '%s ì „', + s : '몇초', + ss : '%dì´ˆ', + m : 'ì¼ë¶„', + mm : '%d분', + h : '한시간', + hh : '%d시간', + d : '하루', + dd : '%dì¼', + M : '한달', + MM : '%d달', + y : 'ì¼ë…„', + yy : '%dë…„' + }, + ordinalParse : /\d{1,2}ì¼/, + ordinal : '%dì¼', + meridiemParse : /오전|오후/, + isPM : function (token) { + return token === '오후'; + }, + meridiem : function (hour, minute, isUpper) { + return hour < 12 ? '오전' : '오후'; + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/lb.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/lb.js new file mode 100644 index 0000000..2e84dab --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/lb.js @@ -0,0 +1,139 @@ +// moment.js locale configuration +// locale : Luxembourgish (lb) +// author : mweimerskirch : https://github.com/mweimerskirch, David Raison : https://github.com/kwisatz + +// Note: Luxembourgish has a very particular phonological rule ('Eifeler Regel') that causes the +// deletion of the final 'n' in certain contexts. That's what the 'eifelerRegelAppliesToWeekday' +// and 'eifelerRegelAppliesToNumber' methods are meant for + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eng Minutt', 'enger Minutt'], + 'h': ['eng Stonn', 'enger Stonn'], + 'd': ['een Dag', 'engem Dag'], + 'M': ['ee Mount', 'engem Mount'], + 'y': ['ee Joer', 'engem Joer'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + function processFutureTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'a ' + string; + } + return 'an ' + string; + } + + function processPastTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'viru ' + string; + } + return 'virun ' + string; + } + + /** + * Returns true if the word before the given number loses the '-n' ending. + * e.g. 'an 10 Deeg' but 'a 5 Deeg' + * + * @param number {integer} + * @returns {boolean} + */ + function eifelerRegelAppliesToNumber(number) { + number = parseInt(number, 10); + if (isNaN(number)) { + return false; + } + if (number < 0) { + // Negative Number --> always true + return true; + } else if (number < 10) { + // Only 1 digit + if (4 <= number && number <= 7) { + return true; + } + return false; + } else if (number < 100) { + // 2 digits + var lastDigit = number % 10, firstDigit = number / 10; + if (lastDigit === 0) { + return eifelerRegelAppliesToNumber(firstDigit); + } + return eifelerRegelAppliesToNumber(lastDigit); + } else if (number < 10000) { + // 3 or 4 digits --> recursively check first digit + while (number >= 10) { + number = number / 10; + } + return eifelerRegelAppliesToNumber(number); + } else { + // Anything larger than 4 digits: recursively check first n-3 digits + number = number / 1000; + return eifelerRegelAppliesToNumber(number); + } + } + + return moment.defineLocale('lb', { + months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'), + weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'), + weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'), + longDateFormat: { + LT: 'H:mm [Auer]', + LTS: 'H:mm:ss [Auer]', + L: 'DD.MM.YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY LT', + LLLL: 'dddd, D. MMMM YYYY LT' + }, + calendar: { + sameDay: '[Haut um] LT', + sameElse: 'L', + nextDay: '[Muer um] LT', + nextWeek: 'dddd [um] LT', + lastDay: '[Gëschter um] LT', + lastWeek: function () { + // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule + switch (this.day()) { + case 2: + case 4: + return '[Leschten] dddd [um] LT'; + default: + return '[Leschte] dddd [um] LT'; + } + } + }, + relativeTime : { + future : processFutureTime, + past : processPastTime, + s : 'e puer Sekonnen', + m : processRelativeTime, + mm : '%d Minutten', + h : processRelativeTime, + hh : '%d Stonnen', + d : processRelativeTime, + dd : '%d Deeg', + M : processRelativeTime, + MM : '%d Méint', + y : processRelativeTime, + yy : '%d Joer' + }, + ordinalParse: /\d{1,2}\./, + ordinal: '%d.', + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/lt.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/lt.js new file mode 100644 index 0000000..2d87e04 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/lt.js @@ -0,0 +1,120 @@ +// moment.js locale configuration +// locale : Lithuanian (lt) +// author : Mindaugas MozÅ«ras : https://github.com/mmozuras + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var units = { + 'm' : 'minutÄ—_minutÄ—s_minutÄ™', + 'mm': 'minutÄ—s_minuÄių_minutes', + 'h' : 'valanda_valandos_valandÄ…', + 'hh': 'valandos_valandų_valandas', + 'd' : 'diena_dienos_dienÄ…', + 'dd': 'dienos_dienų_dienas', + 'M' : 'mÄ—nuo_mÄ—nesio_mÄ—nesį', + 'MM': 'mÄ—nesiai_mÄ—nesių_mÄ—nesius', + 'y' : 'metai_metų_metus', + 'yy': 'metai_metų_metus' + }, + weekDays = 'sekmadienis_pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis'.split('_'); + + function translateSeconds(number, withoutSuffix, key, isFuture) { + if (withoutSuffix) { + return 'kelios sekundÄ—s'; + } else { + return isFuture ? 'kelių sekundžių' : 'kelias sekundes'; + } + } + + function translateSingular(number, withoutSuffix, key, isFuture) { + return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]); + } + + function special(number) { + return number % 10 === 0 || (number > 10 && number < 20); + } + + function forms(key) { + return units[key].split('_'); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + if (number === 1) { + return result + translateSingular(number, withoutSuffix, key[0], isFuture); + } else if (withoutSuffix) { + return result + (special(number) ? forms(key)[1] : forms(key)[0]); + } else { + if (isFuture) { + return result + forms(key)[1]; + } else { + return result + (special(number) ? forms(key)[1] : forms(key)[2]); + } + } + } + + function relativeWeekDay(moment, format) { + var nominative = format.indexOf('dddd HH:mm') === -1, + weekDay = weekDays[moment.day()]; + + return nominative ? weekDay : weekDay.substring(0, weekDay.length - 2) + 'į'; + } + + return moment.defineLocale('lt', { + months : 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio'.split('_'), + monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'), + weekdays : relativeWeekDay, + weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Å eÅ¡'.split('_'), + weekdaysMin : 'S_P_A_T_K_Pn_Å '.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY [m.] MMMM D [d.]', + LLL : 'YYYY [m.] MMMM D [d.], LT [val.]', + LLLL : 'YYYY [m.] MMMM D [d.], dddd, LT [val.]', + l : 'YYYY-MM-DD', + ll : 'YYYY [m.] MMMM D [d.]', + lll : 'YYYY [m.] MMMM D [d.], LT [val.]', + llll : 'YYYY [m.] MMMM D [d.], ddd, LT [val.]' + }, + calendar : { + sameDay : '[Å iandien] LT', + nextDay : '[Rytoj] LT', + nextWeek : 'dddd LT', + lastDay : '[Vakar] LT', + lastWeek : '[PraÄ—jusį] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : 'po %s', + past : 'prieÅ¡ %s', + s : translateSeconds, + m : translateSingular, + mm : translate, + h : translateSingular, + hh : translate, + d : translateSingular, + dd : translate, + M : translateSingular, + MM : translate, + y : translateSingular, + yy : translate + }, + ordinalParse: /\d{1,2}-oji/, + ordinal : function (number) { + return number + '-oji'; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/lv.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/lv.js new file mode 100644 index 0000000..47a0708 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/lv.js @@ -0,0 +1,79 @@ +// moment.js locale configuration +// locale : latvian (lv) +// author : Kristaps Karlsons : https://github.com/skakri + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var units = { + 'mm': 'minÅ«ti_minÅ«tes_minÅ«te_minÅ«tes', + 'hh': 'stundu_stundas_stunda_stundas', + 'dd': 'dienu_dienas_diena_dienas', + 'MM': 'mÄ“nesi_mÄ“neÅ¡us_mÄ“nesis_mÄ“neÅ¡i', + 'yy': 'gadu_gadus_gads_gadi' + }; + + function format(word, number, withoutSuffix) { + var forms = word.split('_'); + if (withoutSuffix) { + return number % 10 === 1 && number !== 11 ? forms[2] : forms[3]; + } else { + return number % 10 === 1 && number !== 11 ? forms[0] : forms[1]; + } + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + return number + ' ' + format(units[key], number, withoutSuffix); + } + + return moment.defineLocale('lv', { + months : 'janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jÅ«n_jÅ«l_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'svÄ“tdiena_pirmdiena_otrdiena_treÅ¡diena_ceturtdiena_piektdiena_sestdiena'.split('_'), + weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'), + weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'YYYY. [gada] D. MMMM', + LLL : 'YYYY. [gada] D. MMMM, LT', + LLLL : 'YYYY. [gada] D. MMMM, dddd, LT' + }, + calendar : { + sameDay : '[Å odien pulksten] LT', + nextDay : '[RÄ«t pulksten] LT', + nextWeek : 'dddd [pulksten] LT', + lastDay : '[Vakar pulksten] LT', + lastWeek : '[PagÄjuÅ¡Ä] dddd [pulksten] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s vÄ“lÄk', + past : '%s agrÄk', + s : 'dažas sekundes', + m : 'minÅ«ti', + mm : relativeTimeWithPlural, + h : 'stundu', + hh : relativeTimeWithPlural, + d : 'dienu', + dd : relativeTimeWithPlural, + M : 'mÄ“nesi', + MM : relativeTimeWithPlural, + y : 'gadu', + yy : relativeTimeWithPlural + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/mk.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/mk.js new file mode 100644 index 0000000..de36631 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/mk.js @@ -0,0 +1,88 @@ +// moment.js locale configuration +// locale : macedonian (mk) +// author : Borislav Mickov : https://github.com/B0k0 + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('mk', { + months : 'јануари_февруари_март_април_мај_јуни_јули_авгуÑÑ‚_Ñептември_октомври_ноември_декември'.split('_'), + monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_Ñеп_окт_ное_дек'.split('_'), + weekdays : 'недела_понеделник_вторник_Ñреда_четврток_петок_Ñабота'.split('_'), + weekdaysShort : 'нед_пон_вто_Ñре_чет_пет_Ñаб'.split('_'), + weekdaysMin : 'нe_пo_вт_ÑÑ€_че_пе_Ña'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'D.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Ð”ÐµÐ½ÐµÑ Ð²Ð¾] LT', + nextDay : '[Утре во] LT', + nextWeek : 'dddd [во] LT', + lastDay : '[Вчера во] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[Во изминатата] dddd [во] LT'; + case 1: + case 2: + case 4: + case 5: + return '[Во изминатиот] dddd [во] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'поÑле %s', + past : 'пред %s', + s : 'неколку Ñекунди', + m : 'минута', + mm : '%d минути', + h : 'чаÑ', + hh : '%d чаÑа', + d : 'ден', + dd : '%d дена', + M : 'меÑец', + MM : '%d меÑеци', + y : 'година', + yy : '%d години' + }, + ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ml.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ml.js new file mode 100644 index 0000000..eb877bb --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ml.js @@ -0,0 +1,69 @@ +// moment.js locale configuration +// locale : malayalam (ml) +// author : Floyd Pink : https://github.com/floydpink + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ml', { + months : 'ജനàµà´µà´°à´¿_ഫെബàµà´°àµà´µà´°à´¿_മാർചàµà´šàµ_à´à´ªàµà´°à´¿àµ½_മേയàµ_ജൂൺ_ജൂലൈ_à´“à´—à´¸àµà´±àµà´±àµ_സെപàµà´±àµà´±à´‚ബർ_à´’à´•àµà´Ÿàµ‹à´¬àµ¼_നവംബർ_ഡിസംബർ'.split('_'), + monthsShort : 'ജനàµ._ഫെബàµà´°àµ._മാർ._à´à´ªàµà´°à´¿._മേയàµ_ജൂൺ_ജൂലൈ._à´“à´—._സെപàµà´±àµà´±._à´’à´•àµà´Ÿàµ‹._നവം._ഡിസം.'.split('_'), + weekdays : 'ഞായറാഴàµà´š_തിങàµà´•à´³à´¾à´´àµà´š_ചൊവàµà´µà´¾à´´àµà´š_à´¬àµà´§à´¨à´¾à´´àµà´š_à´µàµà´¯à´¾à´´à´¾à´´àµà´š_വെളàµà´³à´¿à´¯à´¾à´´àµà´š_ശനിയാഴàµà´š'.split('_'), + weekdaysShort : 'ഞായർ_തിങàµà´•àµ¾_ചൊവàµà´µ_à´¬àµà´§àµ»_à´µàµà´¯à´¾à´´à´‚_വെളàµà´³à´¿_ശനി'.split('_'), + weekdaysMin : 'à´žà´¾_തി_ചൊ_à´¬àµ_à´µàµà´¯à´¾_വെ_à´¶'.split('_'), + longDateFormat : { + LT : 'A h:mm -à´¨àµ', + LTS : 'A h:mm:ss -à´¨àµ', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[ഇനàµà´¨àµ] LT', + nextDay : '[നാളെ] LT', + nextWeek : 'dddd, LT', + lastDay : '[ഇനàµà´¨à´²àµ†] LT', + lastWeek : '[à´•à´´à´¿à´žàµà´ž] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s à´•à´´à´¿à´žàµà´žàµ', + past : '%s à´®àµàµ»à´ªàµ', + s : 'അൽപ നിമിഷങàµà´™àµ¾', + m : 'ഒരൠമിനിറàµà´±àµ', + mm : '%d മിനിറàµà´±àµ', + h : 'ഒരൠമണികàµà´•àµ‚ർ', + hh : '%d മണികàµà´•àµ‚ർ', + d : 'ഒരൠദിവസം', + dd : '%d ദിവസം', + M : 'ഒരൠമാസം', + MM : '%d മാസം', + y : 'ഒരൠവർഷം', + yy : '%d വർഷം' + }, + meridiemParse: /രാതàµà´°à´¿|രാവിലെ|ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿/i, + isPM : function (input) { + return /^(ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'രാതàµà´°à´¿'; + } else if (hour < 12) { + return 'രാവിലെ'; + } else if (hour < 17) { + return 'ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ'; + } else if (hour < 20) { + return 'വൈകàµà´¨àµà´¨àµ‡à´°à´‚'; + } else { + return 'രാതàµà´°à´¿'; + } + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/mr.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/mr.js new file mode 100644 index 0000000..93f0eea --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/mr.js @@ -0,0 +1,120 @@ +// moment.js locale configuration +// locale : Marathi (mr) +// author : Harshad Kale : https://github.com/kalehv + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.defineLocale('mr', { + months : 'जानेवारी_फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€_मारà¥à¤š_à¤à¤ªà¥à¤°à¤¿à¤²_मे_जून_जà¥à¤²à¥ˆ_ऑगसà¥à¤Ÿ_सपà¥à¤Ÿà¥‡à¤‚बर_ऑकà¥à¤Ÿà¥‹à¤¬à¤°_नोवà¥à¤¹à¥‡à¤‚बर_डिसेंबर'.split('_'), + monthsShort: 'जाने._फेबà¥à¤°à¥._मारà¥à¤š._à¤à¤ªà¥à¤°à¤¿._मे._जून._जà¥à¤²à¥ˆ._ऑग._सपà¥à¤Ÿà¥‡à¤‚._ऑकà¥à¤Ÿà¥‹._नोवà¥à¤¹à¥‡à¤‚._डिसें.'.split('_'), + weekdays : 'रविवार_सोमवार_मंगळवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split('_'), + weekdaysShort : 'रवि_सोम_मंगळ_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split('_'), + weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split('_'), + longDateFormat : { + LT : 'A h:mm वाजता', + LTS : 'A h:mm:ss वाजता', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[उदà¥à¤¯à¤¾] LT', + nextWeek : 'dddd, LT', + lastDay : '[काल] LT', + lastWeek: '[मागील] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s नंतर', + past : '%s पूरà¥à¤µà¥€', + s : 'सेकंद', + m: 'à¤à¤• मिनिट', + mm: '%d मिनिटे', + h : 'à¤à¤• तास', + hh : '%d तास', + d : 'à¤à¤• दिवस', + dd : '%d दिवस', + M : 'à¤à¤• महिना', + MM : '%d महिने', + y : 'à¤à¤• वरà¥à¤·', + yy : '%d वरà¥à¤·à¥‡' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /रातà¥à¤°à¥€|सकाळी|दà¥à¤ªà¤¾à¤°à¥€|सायंकाळी/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'रातà¥à¤°à¥€') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'सकाळी') { + return hour; + } else if (meridiem === 'दà¥à¤ªà¤¾à¤°à¥€') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'सायंकाळी') { + return hour + 12; + } + }, + meridiem: function (hour, minute, isLower) + { + if (hour < 4) { + return 'रातà¥à¤°à¥€'; + } else if (hour < 10) { + return 'सकाळी'; + } else if (hour < 17) { + return 'दà¥à¤ªà¤¾à¤°à¥€'; + } else if (hour < 20) { + return 'सायंकाळी'; + } else { + return 'रातà¥à¤°à¥€'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ms-my.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ms-my.js new file mode 100644 index 0000000..56d5e91 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ms-my.js @@ -0,0 +1,80 @@ +// moment.js locale configuration +// locale : Bahasa Malaysia (ms-MY) +// author : Weldan Jamili : https://github.com/weldan + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ms-my', { + months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), + monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), + weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), + weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), + weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'LT.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] LT', + LLLL : 'dddd, D MMMM YYYY [pukul] LT' + }, + meridiemParse: /pagi|tengahari|petang|malam/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'tengahari') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'petang' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'tengahari'; + } else if (hours < 19) { + return 'petang'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Esok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kelmarin pukul] LT', + lastWeek : 'dddd [lepas pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lepas', + s : 'beberapa saat', + m : 'seminit', + mm : '%d minit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/my.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/my.js new file mode 100644 index 0000000..31f5c9e --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/my.js @@ -0,0 +1,89 @@ +// moment.js locale configuration +// locale : Burmese (my) +// author : Squar team, mysquar.com + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': 'á', + '2': 'á‚', + '3': 'áƒ', + '4': 'á„', + '5': 'á…', + '6': 'á†', + '7': 'á‡', + '8': 'áˆ', + '9': 'á‰', + '0': 'á€' + }, numberMap = { + 'á': '1', + 'á‚': '2', + 'áƒ': '3', + 'á„': '4', + 'á…': '5', + 'á†': '6', + 'á‡': '7', + 'áˆ': '8', + 'á‰': '9', + 'á€': '0' + }; + return moment.defineLocale('my', { + months: 'ဇန်နá€á€«á€›á€®_ဖေဖော်á€á€«á€›á€®_မá€á€º_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုá€á€º_စက်á€á€„်ဘာ_အောက်á€á€­á€¯á€˜á€¬_နိုá€á€„်ဘာ_ဒီဇင်ဘာ'.split('_'), + monthsShort: 'ဇန်_ဖေ_မá€á€º_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'), + weekdays: 'á€á€”င်္ဂနွေ_á€á€”င်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပá€á€±á€¸_သောကြာ_စနေ'.split('_'), + weekdaysShort: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), + weekdaysMin: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd D MMMM YYYY LT' + }, + calendar: { + sameDay: '[ယနေ.] LT [မှာ]', + nextDay: '[မနက်ဖြန်] LT [မှာ]', + nextWeek: 'dddd LT [မှာ]', + lastDay: '[မနေ.က] LT [မှာ]', + lastWeek: '[ပြီးá€á€²á€·á€žá€±á€¬] dddd LT [မှာ]', + sameElse: 'L' + }, + relativeTime: { + future: 'လာမည့် %s မှာ', + past: 'လွန်á€á€²á€·á€žá€±á€¬ %s က', + s: 'စက္ကန်.အနည်းငယ်', + m: 'á€á€…်မိနစ်', + mm: '%d မိနစ်', + h: 'á€á€…်နာရီ', + hh: '%d နာရီ', + d: 'á€á€…်ရက်', + dd: '%d ရက်', + M: 'á€á€…်လ', + MM: '%d လ', + y: 'á€á€…်နှစ်', + yy: '%d နှစ်' + }, + preparse: function (string) { + return string.replace(/[áá‚áƒá„á…á†á‡áˆá‰á€]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/nb.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/nb.js new file mode 100644 index 0000000..4764b50 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/nb.js @@ -0,0 +1,59 @@ +// moment.js locale configuration +// locale : norwegian bokmÃ¥l (nb) +// authors : Espen Hovlandsdal : https://github.com/rexxars +// Sigurd Gartmann : https://github.com/sigurdga + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('nb', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), + weekdaysShort : 'søn_man_tirs_ons_tors_fre_lør'.split('_'), + weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'H.mm', + LTS : 'LT.ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] LT', + LLLL : 'dddd D. MMMM YYYY [kl.] LT' + }, + calendar : { + sameDay: '[i dag kl.] LT', + nextDay: '[i morgen kl.] LT', + nextWeek: 'dddd [kl.] LT', + lastDay: '[i gÃ¥r kl.] LT', + lastWeek: '[forrige] dddd [kl.] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'for %s siden', + s : 'noen sekunder', + m : 'ett minutt', + mm : '%d minutter', + h : 'en time', + hh : '%d timer', + d : 'en dag', + dd : '%d dager', + M : 'en mÃ¥ned', + MM : '%d mÃ¥neder', + y : 'ett Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ne.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ne.js new file mode 100644 index 0000000..eb25ebe --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ne.js @@ -0,0 +1,121 @@ +// moment.js locale configuration +// locale : nepali/nepalese +// author : suvash : https://github.com/suvash + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.defineLocale('ne', { + months : 'जनवरी_फेबà¥à¤°à¥à¤µà¤°à¥€_मारà¥à¤š_अपà¥à¤°à¤¿à¤²_मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ_अगषà¥à¤Ÿ_सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°_अकà¥à¤Ÿà¥‹à¤¬à¤°_नोभेमà¥à¤¬à¤°_डिसेमà¥à¤¬à¤°'.split('_'), + monthsShort : 'जन._फेबà¥à¤°à¥._मारà¥à¤š_अपà¥à¤°à¤¿._मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ._अग._सेपà¥à¤Ÿ._अकà¥à¤Ÿà¥‹._नोभे._डिसे.'.split('_'), + weekdays : 'आइतबार_सोमबार_मङà¥à¤—लबार_बà¥à¤§à¤¬à¤¾à¤°_बिहिबार_शà¥à¤•à¥à¤°à¤¬à¤¾à¤°_शनिबार'.split('_'), + weekdaysShort : 'आइत._सोम._मङà¥à¤—ल._बà¥à¤§._बिहि._शà¥à¤•à¥à¤°._शनि.'.split('_'), + weekdaysMin : 'आइ._सो._मङà¥_बà¥._बि._शà¥._श.'.split('_'), + longDateFormat : { + LT : 'Aको h:mm बजे', + LTS : 'Aको h:mm:ss बजे', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /राती|बिहान|दिउà¤à¤¸à¥‹|बेलà¥à¤•à¤¾|साà¤à¤|राती/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'राती') { + return hour < 3 ? hour : hour + 12; + } else if (meridiem === 'बिहान') { + return hour; + } else if (meridiem === 'दिउà¤à¤¸à¥‹') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'बेलà¥à¤•à¤¾' || meridiem === 'साà¤à¤') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 3) { + return 'राती'; + } else if (hour < 10) { + return 'बिहान'; + } else if (hour < 15) { + return 'दिउà¤à¤¸à¥‹'; + } else if (hour < 18) { + return 'बेलà¥à¤•à¤¾'; + } else if (hour < 20) { + return 'साà¤à¤'; + } else { + return 'राती'; + } + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[भोली] LT', + nextWeek : '[आउà¤à¤¦à¥‹] dddd[,] LT', + lastDay : '[हिजो] LT', + lastWeek : '[गà¤à¤•à¥‹] dddd[,] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%sमा', + past : '%s अगाडी', + s : 'केही समय', + m : 'à¤à¤• मिनेट', + mm : '%d मिनेट', + h : 'à¤à¤• घणà¥à¤Ÿà¤¾', + hh : '%d घणà¥à¤Ÿà¤¾', + d : 'à¤à¤• दिन', + dd : '%d दिन', + M : 'à¤à¤• महिना', + MM : '%d महिना', + y : 'à¤à¤• बरà¥à¤·', + yy : '%d बरà¥à¤·' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/nl.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/nl.js new file mode 100644 index 0000000..9f4fdfe --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/nl.js @@ -0,0 +1,69 @@ +// moment.js locale configuration +// locale : dutch (nl) +// author : Joris Röling : https://github.com/jjupiter + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); + + return moment.defineLocale('nl', { + months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), + weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), + weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[vandaag om] LT', + nextDay: '[morgen om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[gisteren om] LT', + lastWeek: '[afgelopen] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'over %s', + past : '%s geleden', + s : 'een paar seconden', + m : 'één minuut', + mm : '%d minuten', + h : 'één uur', + hh : '%d uur', + d : 'één dag', + dd : '%d dagen', + M : 'één maand', + MM : '%d maanden', + y : 'één jaar', + yy : '%d jaar' + }, + ordinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/nn.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/nn.js new file mode 100644 index 0000000..d7a8238 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/nn.js @@ -0,0 +1,58 @@ +// moment.js locale configuration +// locale : norwegian nynorsk (nn) +// author : https://github.com/mechuwind + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('nn', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sundag_mÃ¥ndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'), + weekdaysShort : 'sun_mÃ¥n_tys_ons_tor_fre_lau'.split('_'), + weekdaysMin : 'su_mÃ¥_ty_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[I dag klokka] LT', + nextDay: '[I morgon klokka] LT', + nextWeek: 'dddd [klokka] LT', + lastDay: '[I gÃ¥r klokka] LT', + lastWeek: '[FøregÃ¥ande] dddd [klokka] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'for %s sidan', + s : 'nokre sekund', + m : 'eit minutt', + mm : '%d minutt', + h : 'ein time', + hh : '%d timar', + d : 'ein dag', + dd : '%d dagar', + M : 'ein mÃ¥nad', + MM : '%d mÃ¥nader', + y : 'eit Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/pl.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/pl.js new file mode 100644 index 0000000..418ca81 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/pl.js @@ -0,0 +1,100 @@ +// moment.js locale configuration +// locale : polish (pl) +// author : Rafal Hirsz : https://github.com/evoL + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var monthsNominative = 'styczeÅ„_luty_marzec_kwiecieÅ„_maj_czerwiec_lipiec_sierpieÅ„_wrzesieÅ„_październik_listopad_grudzieÅ„'.split('_'), + monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrzeÅ›nia_października_listopada_grudnia'.split('_'); + + function plural(n) { + return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1); + } + + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'minuta' : 'minutÄ™'; + case 'mm': + return result + (plural(number) ? 'minuty' : 'minut'); + case 'h': + return withoutSuffix ? 'godzina' : 'godzinÄ™'; + case 'hh': + return result + (plural(number) ? 'godziny' : 'godzin'); + case 'MM': + return result + (plural(number) ? 'miesiÄ…ce' : 'miesiÄ™cy'); + case 'yy': + return result + (plural(number) ? 'lata' : 'lat'); + } + } + + return moment.defineLocale('pl', { + months : function (momentToFormat, format) { + if (/D MMMM/.test(format)) { + return monthsSubjective[momentToFormat.month()]; + } else { + return monthsNominative[momentToFormat.month()]; + } + }, + monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'), + weekdays : 'niedziela_poniedziaÅ‚ek_wtorek_Å›roda_czwartek_piÄ…tek_sobota'.split('_'), + weekdaysShort : 'nie_pon_wt_Å›r_czw_pt_sb'.split('_'), + weekdaysMin : 'N_Pn_Wt_Åšr_Cz_Pt_So'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay: '[DziÅ› o] LT', + nextDay: '[Jutro o] LT', + nextWeek: '[W] dddd [o] LT', + lastDay: '[Wczoraj o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[W zeszÅ‚Ä… niedzielÄ™ o] LT'; + case 3: + return '[W zeszÅ‚Ä… Å›rodÄ™ o] LT'; + case 6: + return '[W zeszÅ‚Ä… sobotÄ™ o] LT'; + default: + return '[W zeszÅ‚y] dddd [o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : '%s temu', + s : 'kilka sekund', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : '1 dzieÅ„', + dd : '%d dni', + M : 'miesiÄ…c', + MM : translate, + y : 'rok', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/pt-br.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/pt-br.js new file mode 100644 index 0000000..813c2de --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/pt-br.js @@ -0,0 +1,58 @@ +// moment.js locale configuration +// locale : brazilian portuguese (pt-br) +// author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('pt-br', { + months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), + monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), + weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'), + weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'), + weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY [às] LT', + LLLL : 'dddd, D [de] MMMM [de] YYYY [às] LT' + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : 'em %s', + past : '%s atrás', + s : 'segundos', + m : 'um minuto', + mm : '%d minutos', + h : 'uma hora', + hh : '%d horas', + d : 'um dia', + dd : '%d dias', + M : 'um mês', + MM : '%d meses', + y : 'um ano', + yy : '%d anos' + }, + ordinalParse: /\d{1,2}º/, + ordinal : '%dº' + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/pt.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/pt.js new file mode 100644 index 0000000..4afd564 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/pt.js @@ -0,0 +1,62 @@ +// moment.js locale configuration +// locale : portuguese (pt) +// author : Jefferson : https://github.com/jalex79 + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('pt', { + months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), + monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), + weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'), + weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'), + weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY LT', + LLLL : 'dddd, D [de] MMMM [de] YYYY LT' + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : 'em %s', + past : 'há %s', + s : 'segundos', + m : 'um minuto', + mm : '%d minutos', + h : 'uma hora', + hh : '%d horas', + d : 'um dia', + dd : '%d dias', + M : 'um mês', + MM : '%d meses', + y : 'um ano', + yy : '%d anos' + }, + ordinalParse: /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ro.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ro.js new file mode 100644 index 0000000..fcc7d07 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ro.js @@ -0,0 +1,73 @@ +// moment.js locale configuration +// locale : romanian (ro) +// author : Vlad Gurdiga : https://github.com/gurdiga +// author : Valentin Agachi : https://github.com/avaly + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': 'minute', + 'hh': 'ore', + 'dd': 'zile', + 'MM': 'luni', + 'yy': 'ani' + }, + separator = ' '; + if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) { + separator = ' de '; + } + + return number + separator + format[key]; + } + + return moment.defineLocale('ro', { + months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'), + monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'), + weekdays : 'duminică_luni_marÈ›i_miercuri_joi_vineri_sâmbătă'.split('_'), + weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'), + weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY H:mm', + LLLL : 'dddd, D MMMM YYYY H:mm' + }, + calendar : { + sameDay: '[azi la] LT', + nextDay: '[mâine la] LT', + nextWeek: 'dddd [la] LT', + lastDay: '[ieri la] LT', + lastWeek: '[fosta] dddd [la] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'peste %s', + past : '%s în urmă', + s : 'câteva secunde', + m : 'un minut', + mm : relativeTimeWithPlural, + h : 'o oră', + hh : relativeTimeWithPlural, + d : 'o zi', + dd : relativeTimeWithPlural, + M : 'o lună', + MM : relativeTimeWithPlural, + y : 'un an', + yy : relativeTimeWithPlural + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ru.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ru.js new file mode 100644 index 0000000..5adfa9a --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ru.js @@ -0,0 +1,176 @@ +// moment.js locale configuration +// locale : russian (ru) +// author : Viktorminator : https://github.com/Viktorminator +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут', + 'hh': 'чаÑ_чаÑа_чаÑов', + 'dd': 'день_днÑ_дней', + 'MM': 'меÑÑц_меÑÑца_меÑÑцев', + 'yy': 'год_года_лет' + }; + if (key === 'm') { + return withoutSuffix ? 'минута' : 'минуту'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь'.split('_'), + 'accusative': 'ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function monthsShortCaseReplace(m, format) { + var monthsShort = { + 'nominative': 'Ñнв_фев_март_апр_май_июнь_июль_авг_Ñен_окт_ноÑ_дек'.split('_'), + 'accusative': 'Ñнв_фев_мар_апр_маÑ_июнÑ_июлÑ_авг_Ñен_окт_ноÑ_дек'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return monthsShort[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота'.split('_'), + 'accusative': 'воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу'.split('_') + }, + + nounCase = (/\[ ?[Вв] ?(?:прошлую|Ñледующую|Ñту)? ?\] ?dddd/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.defineLocale('ru', { + months : monthsCaseReplace, + monthsShort : monthsShortCaseReplace, + weekdays : weekdaysCaseReplace, + weekdaysShort : 'вÑ_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + weekdaysMin : 'вÑ_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + monthsParse : [/^Ñнв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[й|Ñ]/i, /^июн/i, /^июл/i, /^авг/i, /^Ñен/i, /^окт/i, /^ноÑ/i, /^дек/i], + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY г.', + LLL : 'D MMMM YYYY г., LT', + LLLL : 'dddd, D MMMM YYYY г., LT' + }, + calendar : { + sameDay: '[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT', + nextDay: '[Завтра в] LT', + lastDay: '[Вчера в] LT', + nextWeek: function () { + return this.day() === 2 ? '[Во] dddd [в] LT' : '[Ð’] dddd [в] LT'; + }, + lastWeek: function (now) { + if (now.week() !== this.week()) { + switch (this.day()) { + case 0: + return '[Ð’ прошлое] dddd [в] LT'; + case 1: + case 2: + case 4: + return '[Ð’ прошлый] dddd [в] LT'; + case 3: + case 5: + case 6: + return '[Ð’ прошлую] dddd [в] LT'; + } + } else { + if (this.day() === 2) { + return '[Во] dddd [в] LT'; + } else { + return '[Ð’] dddd [в] LT'; + } + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'через %s', + past : '%s назад', + s : 'неÑколько Ñекунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : 'чаÑ', + hh : relativeTimeWithPlural, + d : 'день', + dd : relativeTimeWithPlural, + M : 'меÑÑц', + MM : relativeTimeWithPlural, + y : 'год', + yy : relativeTimeWithPlural + }, + + meridiemParse: /ночи|утра|днÑ|вечера/i, + isPM : function (input) { + return /^(днÑ|вечера)$/.test(input); + }, + + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночи'; + } else if (hour < 12) { + return 'утра'; + } else if (hour < 17) { + return 'днÑ'; + } else { + return 'вечера'; + } + }, + + ordinalParse: /\d{1,2}-(й|го|Ñ)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + return number + '-й'; + case 'D': + return number + '-го'; + case 'w': + case 'W': + return number + '-Ñ'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sk.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sk.js new file mode 100644 index 0000000..f9d74c5 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sk.js @@ -0,0 +1,158 @@ +// moment.js locale configuration +// locale : slovak (sk) +// author : Martin Minka : https://github.com/k2s +// based on work of petrbela : https://github.com/petrbela + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'), + monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_'); + + function plural(n) { + return (n > 1) && (n < 5); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami'; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minúty' : 'minút'); + } else { + return result + 'minútami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodín'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'deň' : 'dňom'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dni' : 'dní'); + } else { + return result + 'dňami'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'mesiace' : 'mesiacov'); + } else { + return result + 'mesiacmi'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokom'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'rokov'); + } else { + return result + 'rokmi'; + } + break; + } + } + + return moment.defineLocale('sk', { + months : months, + monthsShort : monthsShort, + monthsParse : (function (months, monthsShort) { + var i, _monthsParse = []; + for (i = 0; i < 12; i++) { + // use custom parser to solve problem with July (Äervenec) + _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); + } + return _monthsParse; + }(months, monthsShort)), + weekdays : 'nedeľa_pondelok_utorok_streda_Å¡tvrtok_piatok_sobota'.split('_'), + weekdaysShort : 'ne_po_ut_st_Å¡t_pi_so'.split('_'), + weekdaysMin : 'ne_po_ut_st_Å¡t_pi_so'.split('_'), + longDateFormat : { + LT: 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[dnes o] LT', + nextDay: '[zajtra o] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedeľu o] LT'; + case 1: + case 2: + return '[v] dddd [o] LT'; + case 3: + return '[v stredu o] LT'; + case 4: + return '[vo Å¡tvrtok o] LT'; + case 5: + return '[v piatok o] LT'; + case 6: + return '[v sobotu o] LT'; + } + }, + lastDay: '[vÄera o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulú nedeľu o] LT'; + case 1: + case 2: + return '[minulý] dddd [o] LT'; + case 3: + return '[minulú stredu o] LT'; + case 4: + case 5: + return '[minulý] dddd [o] LT'; + case 6: + return '[minulú sobotu o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pred %s', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sl.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sl.js new file mode 100644 index 0000000..232695f --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sl.js @@ -0,0 +1,146 @@ +// moment.js locale configuration +// locale : slovenian (sl) +// author : Robert SedovÅ¡ek : https://github.com/sedovsek + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'ena minuta' : 'eno minuto'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2) { + result += 'minuti'; + } else if (number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minut'; + } + return result; + case 'h': + return withoutSuffix ? 'ena ura' : 'eno uro'; + case 'hh': + if (number === 1) { + result += 'ura'; + } else if (number === 2) { + result += 'uri'; + } else if (number === 3 || number === 4) { + result += 'ure'; + } else { + result += 'ur'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dni'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mesec'; + } else if (number === 2) { + result += 'meseca'; + } else if (number === 3 || number === 4) { + result += 'mesece'; + } else { + result += 'mesecev'; + } + return result; + case 'yy': + if (number === 1) { + result += 'leto'; + } else if (number === 2) { + result += 'leti'; + } else if (number === 3 || number === 4) { + result += 'leta'; + } else { + result += 'let'; + } + return result; + } + } + + return moment.defineLocale('sl', { + months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'), + monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'), + weekdays : 'nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota'.split('_'), + weekdaysShort : 'ned._pon._tor._sre._Äet._pet._sob.'.split('_'), + weekdaysMin : 'ne_po_to_sr_Äe_pe_so'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD. MM. YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[danes ob] LT', + nextDay : '[jutri ob] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[v] [nedeljo] [ob] LT'; + case 3: + return '[v] [sredo] [ob] LT'; + case 6: + return '[v] [soboto] [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[v] dddd [ob] LT'; + } + }, + lastDay : '[vÄeraj ob] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[prejÅ¡nja] dddd [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[prejÅ¡nji] dddd [ob] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'Äez %s', + past : '%s nazaj', + s : 'nekaj sekund', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'en dan', + dd : translate, + M : 'en mesec', + MM : translate, + y : 'eno leto', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sq.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sq.js new file mode 100644 index 0000000..9a5bc09 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sq.js @@ -0,0 +1,67 @@ +// moment.js locale configuration +// locale : Albanian (sq) +// author : Flakërim Ismani : https://github.com/flakerimi +// author: Menelion Elensúle: https://github.com/Oire (tests) +// author : Oerd Cukalla : https://github.com/oerd (fixes) + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('sq', { + months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'), + monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'), + weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'), + weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'), + weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'), + meridiemParse: /PD|MD/, + isPM: function (input) { + return input.charAt(0) === 'M'; + }, + meridiem : function (hours, minutes, isLower) { + return hours < 12 ? 'PD' : 'MD'; + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Sot në] LT', + nextDay : '[Nesër në] LT', + nextWeek : 'dddd [në] LT', + lastDay : '[Dje në] LT', + lastWeek : 'dddd [e kaluar në] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'në %s', + past : '%s më parë', + s : 'disa sekonda', + m : 'një minutë', + mm : '%d minuta', + h : 'një orë', + hh : '%d orë', + d : 'një ditë', + dd : '%d ditë', + M : 'një muaj', + MM : '%d muaj', + y : 'një vit', + yy : '%d vite' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sr-cyrl.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sr-cyrl.js new file mode 100644 index 0000000..57619b6 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sr-cyrl.js @@ -0,0 +1,107 @@ +// moment.js locale configuration +// locale : Serbian-cyrillic (sr-cyrl) +// author : Milan JanaÄković : https://github.com/milan-j + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var translator = { + words: { //Different grammatical cases + m: ['један минут', 'једне минуте'], + mm: ['минут', 'минуте', 'минута'], + h: ['један Ñат', 'једног Ñата'], + hh: ['Ñат', 'Ñата', 'Ñати'], + dd: ['дан', 'дана', 'дана'], + MM: ['меÑец', 'меÑеца', 'меÑеци'], + yy: ['година', 'године', 'година'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } + }; + + return moment.defineLocale('sr-cyrl', { + months: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'авгуÑÑ‚', 'Ñептембар', 'октобар', 'новембар', 'децембар'], + monthsShort: ['јан.', 'феб.', 'мар.', 'апр.', 'мај', 'јун', 'јул', 'авг.', 'Ñеп.', 'окт.', 'нов.', 'дец.'], + weekdays: ['недеља', 'понедељак', 'уторак', 'Ñреда', 'четвртак', 'петак', 'Ñубота'], + weekdaysShort: ['нед.', 'пон.', 'уто.', 'Ñре.', 'чет.', 'пет.', 'Ñуб.'], + weekdaysMin: ['не', 'по', 'ут', 'ÑÑ€', 'че', 'пе', 'Ñу'], + longDateFormat: { + LT: 'H:mm', + LTS : 'LT:ss', + L: 'DD. MM. YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY LT', + LLLL: 'dddd, D. MMMM YYYY LT' + }, + calendar: { + sameDay: '[Ð´Ð°Ð½Ð°Ñ Ñƒ] LT', + nextDay: '[Ñутра у] LT', + + nextWeek: function () { + switch (this.day()) { + case 0: + return '[у] [недељу] [у] LT'; + case 3: + return '[у] [Ñреду] [у] LT'; + case 6: + return '[у] [Ñуботу] [у] LT'; + case 1: + case 2: + case 4: + case 5: + return '[у] dddd [у] LT'; + } + }, + lastDay : '[јуче у] LT', + lastWeek : function () { + var lastWeekDays = [ + '[прошле] [недеље] [у] LT', + '[прошлог] [понедељка] [у] LT', + '[прошлог] [уторка] [у] LT', + '[прошле] [Ñреде] [у] LT', + '[прошлог] [четвртка] [у] LT', + '[прошлог] [петка] [у] LT', + '[прошле] [Ñуботе] [у] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'за %s', + past : 'пре %s', + s : 'неколико Ñекунди', + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'дан', + dd : translator.translate, + M : 'меÑец', + MM : translator.translate, + y : 'годину', + yy : translator.translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sr.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sr.js new file mode 100644 index 0000000..6f14284 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sr.js @@ -0,0 +1,107 @@ +// moment.js locale configuration +// locale : Serbian-latin (sr) +// author : Milan JanaÄković : https://github.com/milan-j + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var translator = { + words: { //Different grammatical cases + m: ['jedan minut', 'jedne minute'], + mm: ['minut', 'minute', 'minuta'], + h: ['jedan sat', 'jednog sata'], + hh: ['sat', 'sata', 'sati'], + dd: ['dan', 'dana', 'dana'], + MM: ['mesec', 'meseca', 'meseci'], + yy: ['godina', 'godine', 'godina'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } + }; + + return moment.defineLocale('sr', { + months: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'], + monthsShort: ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun', 'jul', 'avg.', 'sep.', 'okt.', 'nov.', 'dec.'], + weekdays: ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'Äetvrtak', 'petak', 'subota'], + weekdaysShort: ['ned.', 'pon.', 'uto.', 'sre.', 'Äet.', 'pet.', 'sub.'], + weekdaysMin: ['ne', 'po', 'ut', 'sr', 'Äe', 'pe', 'su'], + longDateFormat: { + LT: 'H:mm', + LTS : 'LT:ss', + L: 'DD. MM. YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY LT', + LLLL: 'dddd, D. MMMM YYYY LT' + }, + calendar: { + sameDay: '[danas u] LT', + nextDay: '[sutra u] LT', + + nextWeek: function () { + switch (this.day()) { + case 0: + return '[u] [nedelju] [u] LT'; + case 3: + return '[u] [sredu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄe u] LT', + lastWeek : function () { + var lastWeekDays = [ + '[proÅ¡le] [nedelje] [u] LT', + '[proÅ¡log] [ponedeljka] [u] LT', + '[proÅ¡log] [utorka] [u] LT', + '[proÅ¡le] [srede] [u] LT', + '[proÅ¡log] [Äetvrtka] [u] LT', + '[proÅ¡log] [petka] [u] LT', + '[proÅ¡le] [subote] [u] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pre %s', + s : 'nekoliko sekundi', + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'dan', + dd : translator.translate, + M : 'mesec', + MM : translator.translate, + y : 'godinu', + yy : translator.translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sv.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sv.js new file mode 100644 index 0000000..6e14958 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sv.js @@ -0,0 +1,65 @@ +// moment.js locale configuration +// locale : swedish (sv) +// author : Jens Alm : https://github.com/ulmus + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('sv', { + months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'söndag_mÃ¥ndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'), + weekdaysShort : 'sön_mÃ¥n_tis_ons_tor_fre_lör'.split('_'), + weekdaysMin : 'sö_mÃ¥_ti_on_to_fr_lö'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Idag] LT', + nextDay: '[Imorgon] LT', + lastDay: '[IgÃ¥r] LT', + nextWeek: 'dddd LT', + lastWeek: '[Förra] dddd[en] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'för %s sedan', + s : 'nÃ¥gra sekunder', + m : 'en minut', + mm : '%d minuter', + h : 'en timme', + hh : '%d timmar', + d : 'en dag', + dd : '%d dagar', + M : 'en mÃ¥nad', + MM : '%d mÃ¥nader', + y : 'ett Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}(e|a)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'e' : + (b === 1) ? 'a' : + (b === 2) ? 'a' : + (b === 3) ? 'e' : 'e'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ta.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ta.js new file mode 100644 index 0000000..8c86b4b --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ta.js @@ -0,0 +1,130 @@ +// moment.js locale configuration +// locale : tamil (ta) +// author : Arjunkumar Krishnamoorthy : https://github.com/tk120404 + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + /*var symbolMap = { + '1': '௧', + '2': '௨', + '3': '௩', + '4': '௪', + '5': '௫', + '6': '௬', + '7': '௭', + '8': '௮', + '9': '௯', + '0': '௦' + }, + numberMap = { + '௧': '1', + '௨': '2', + '௩': '3', + '௪': '4', + '௫': '5', + '௬': '6', + '௭': '7', + '௮': '8', + '௯': '9', + '௦': '0' + }; */ + + return moment.defineLocale('ta', { + months : 'ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯'.split('_'), + monthsShort : 'ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯'.split('_'), + weekdays : 'ஞாயிறà¯à®±à¯à®•à¯à®•à®¿à®´à®®à¯ˆ_திஙà¯à®•à®Ÿà¯à®•à®¿à®´à®®à¯ˆ_செவà¯à®µà®¾à®¯à¯à®•à®¿à®´à®®à¯ˆ_பà¯à®¤à®©à¯à®•à®¿à®´à®®à¯ˆ_வியாழகà¯à®•à®¿à®´à®®à¯ˆ_வெளà¯à®³à®¿à®•à¯à®•à®¿à®´à®®à¯ˆ_சனிகà¯à®•à®¿à®´à®®à¯ˆ'.split('_'), + weekdaysShort : 'ஞாயிறà¯_திஙà¯à®•à®³à¯_செவà¯à®µà®¾à®¯à¯_பà¯à®¤à®©à¯_வியாழனà¯_வெளà¯à®³à®¿_சனி'.split('_'), + weekdaysMin : 'ஞா_தி_செ_பà¯_வி_வெ_ச'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[இனà¯à®±à¯] LT', + nextDay : '[நாளை] LT', + nextWeek : 'dddd, LT', + lastDay : '[நேறà¯à®±à¯] LT', + lastWeek : '[கடநà¯à®¤ வாரமà¯] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s இலà¯', + past : '%s à®®à¯à®©à¯', + s : 'ஒர௠சில விநாடிகளà¯', + m : 'ஒர௠நிமிடமà¯', + mm : '%d நிமிடஙà¯à®•à®³à¯', + h : 'ஒர௠மணி நேரமà¯', + hh : '%d மணி நேரமà¯', + d : 'ஒர௠நாளà¯', + dd : '%d நாடà¯à®•à®³à¯', + M : 'ஒர௠மாதமà¯', + MM : '%d மாதஙà¯à®•à®³à¯', + y : 'ஒர௠வரà¯à®Ÿà®®à¯', + yy : '%d ஆணà¯à®Ÿà¯à®•à®³à¯' + }, +/* preparse: function (string) { + return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + },*/ + ordinalParse: /\d{1,2}வதà¯/, + ordinal : function (number) { + return number + 'வதà¯'; + }, + + + // refer http://ta.wikipedia.org/s/1er1 + meridiemParse: /யாமமà¯|வைகறை|காலை|நணà¯à®ªà®•à®²à¯|எறà¯à®ªà®¾à®Ÿà¯|மாலை/, + meridiem : function (hour, minute, isLower) { + if (hour < 2) { + return ' யாமமà¯'; + } else if (hour < 6) { + return ' வைகறை'; // வைகறை + } else if (hour < 10) { + return ' காலை'; // காலை + } else if (hour < 14) { + return ' நணà¯à®ªà®•à®²à¯'; // நணà¯à®ªà®•à®²à¯ + } else if (hour < 18) { + return ' எறà¯à®ªà®¾à®Ÿà¯'; // எறà¯à®ªà®¾à®Ÿà¯ + } else if (hour < 22) { + return ' மாலை'; // மாலை + } else { + return ' யாமமà¯'; + } + }, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'யாமமà¯') { + return hour < 2 ? hour : hour + 12; + } else if (meridiem === 'வைகறை' || meridiem === 'காலை') { + return hour; + } else if (meridiem === 'நணà¯à®ªà®•à®²à¯') { + return hour >= 10 ? hour : hour + 12; + } else { + return hour + 12; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/th.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/th.js new file mode 100644 index 0000000..ec9b840 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/th.js @@ -0,0 +1,63 @@ +// moment.js locale configuration +// locale : thai (th) +// author : Kridsada Thanabulpong : https://github.com/sirn + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('th', { + months : 'มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม'.split('_'), + monthsShort : 'มà¸à¸£à¸²_à¸à¸¸à¸¡à¸ à¸²_มีนา_เมษา_พฤษภา_มิถุนา_à¸à¸£à¸à¸Žà¸²_สิงหา_à¸à¸±à¸™à¸¢à¸²_ตุลา_พฤศจิà¸à¸²_ธันวา'.split('_'), + weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์'.split('_'), + weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์'.split('_'), // yes, three characters difference + weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'), + longDateFormat : { + LT : 'H นาฬิà¸à¸² m นาที', + LTS : 'LT s วินาที', + L : 'YYYY/MM/DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY เวลา LT', + LLLL : 'วันddddที่ D MMMM YYYY เวลา LT' + }, + meridiemParse: /à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง|หลังเที่ยง/, + isPM: function (input) { + return input === 'หลังเที่ยง'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง'; + } else { + return 'หลังเที่ยง'; + } + }, + calendar : { + sameDay : '[วันนี้ เวลา] LT', + nextDay : '[พรุ่งนี้ เวลา] LT', + nextWeek : 'dddd[หน้า เวลา] LT', + lastDay : '[เมื่อวานนี้ เวลา] LT', + lastWeek : '[วัน]dddd[ที่à¹à¸¥à¹‰à¸§ เวลา] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'อีภ%s', + past : '%sที่à¹à¸¥à¹‰à¸§', + s : 'ไม่à¸à¸µà¹ˆà¸§à¸´à¸™à¸²à¸—ี', + m : '1 นาที', + mm : '%d นาที', + h : '1 ชั่วโมง', + hh : '%d ชั่วโมง', + d : '1 วัน', + dd : '%d วัน', + M : '1 เดือน', + MM : '%d เดือน', + y : '1 ปี', + yy : '%d ปี' + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/tl-ph.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/tl-ph.js new file mode 100644 index 0000000..40dbb07 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/tl-ph.js @@ -0,0 +1,60 @@ +// moment.js locale configuration +// locale : Tagalog/Filipino (tl-ph) +// author : Dan Hagman + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('tl-ph', { + months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'), + monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'), + weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'), + weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'), + weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'MM/D/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY LT', + LLLL : 'dddd, MMMM DD, YYYY LT' + }, + calendar : { + sameDay: '[Ngayon sa] LT', + nextDay: '[Bukas sa] LT', + nextWeek: 'dddd [sa] LT', + lastDay: '[Kahapon sa] LT', + lastWeek: 'dddd [huling linggo] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'sa loob ng %s', + past : '%s ang nakalipas', + s : 'ilang segundo', + m : 'isang minuto', + mm : '%d minuto', + h : 'isang oras', + hh : '%d oras', + d : 'isang araw', + dd : '%d araw', + M : 'isang buwan', + MM : '%d buwan', + y : 'isang taon', + yy : '%d taon' + }, + ordinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/tr.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/tr.js new file mode 100644 index 0000000..cd0a746 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/tr.js @@ -0,0 +1,94 @@ +// moment.js locale configuration +// locale : turkish (tr) +// authors : Erhan Gundogan : https://github.com/erhangundogan, +// Burak YiÄŸit Kaya: https://github.com/BYK + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var suffixes = { + 1: '\'inci', + 5: '\'inci', + 8: '\'inci', + 70: '\'inci', + 80: '\'inci', + + 2: '\'nci', + 7: '\'nci', + 20: '\'nci', + 50: '\'nci', + + 3: '\'üncü', + 4: '\'üncü', + 100: '\'üncü', + + 6: '\'ncı', + + 9: '\'uncu', + 10: '\'uncu', + 30: '\'uncu', + + 60: '\'ıncı', + 90: '\'ıncı' + }; + + return moment.defineLocale('tr', { + months : 'Ocak_Åžubat_Mart_Nisan_Mayıs_Haziran_Temmuz_AÄŸustos_Eylül_Ekim_Kasım_Aralık'.split('_'), + monthsShort : 'Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara'.split('_'), + weekdays : 'Pazar_Pazartesi_Salı_ÇarÅŸamba_PerÅŸembe_Cuma_Cumartesi'.split('_'), + weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'), + weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[bugün saat] LT', + nextDay : '[yarın saat] LT', + nextWeek : '[haftaya] dddd [saat] LT', + lastDay : '[dün] LT', + lastWeek : '[geçen hafta] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s sonra', + past : '%s önce', + s : 'birkaç saniye', + m : 'bir dakika', + mm : '%d dakika', + h : 'bir saat', + hh : '%d saat', + d : 'bir gün', + dd : '%d gün', + M : 'bir ay', + MM : '%d ay', + y : 'bir yıl', + yy : '%d yıl' + }, + ordinalParse: /\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/, + ordinal : function (number) { + if (number === 0) { // special case for zero + return number + '\'ıncı'; + } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + + return number + (suffixes[a] || suffixes[b] || suffixes[c]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/tzm-latn.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/tzm-latn.js new file mode 100644 index 0000000..34592b4 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/tzm-latn.js @@ -0,0 +1,56 @@ +// moment.js locale configuration +// locale : Morocco Central Atlas TamaziÉ£t in Latin (tzm-latn) +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('tzm-latn', { + months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), + weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), + weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[asdkh g] LT', + nextDay: '[aska g] LT', + nextWeek: 'dddd [g] LT', + lastDay: '[assant g] LT', + lastWeek: 'dddd [g] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dadkh s yan %s', + past : 'yan %s', + s : 'imik', + m : 'minuá¸', + mm : '%d minuá¸', + h : 'saÉ›a', + hh : '%d tassaÉ›in', + d : 'ass', + dd : '%d ossan', + M : 'ayowr', + MM : '%d iyyirn', + y : 'asgas', + yy : '%d isgasn' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/tzm.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/tzm.js new file mode 100644 index 0000000..9591521 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/tzm.js @@ -0,0 +1,56 @@ +// moment.js locale configuration +// locale : Morocco Central Atlas TamaziÉ£t (tzm) +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('tzm', { + months : 'ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”'.split('_'), + monthsShort : 'ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”'.split('_'), + weekdays : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + weekdaysShort : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS: 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[ⴰⵙⴷⵅ â´´] LT', + nextDay: '[ⴰⵙⴽⴰ â´´] LT', + nextWeek: 'dddd [â´´] LT', + lastDay: '[ⴰⵚⴰâµâµœ â´´] LT', + lastWeek: 'dddd [â´´] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'â´·â´°â´·âµ… âµ™ ⵢⴰⵠ%s', + past : 'ⵢⴰⵠ%s', + s : 'ⵉⵎⵉⴽ', + m : 'ⵎⵉâµâµ“â´º', + mm : '%d ⵎⵉâµâµ“â´º', + h : 'ⵙⴰⵄⴰ', + hh : '%d ⵜⴰⵙⵙⴰⵄⵉâµ', + d : 'ⴰⵙⵙ', + dd : '%d oⵙⵙⴰâµ', + M : 'â´°âµ¢oⵓⵔ', + MM : '%d ⵉⵢⵢⵉⵔâµ', + y : 'ⴰⵙⴳⴰⵙ', + yy : '%d ⵉⵙⴳⴰⵙâµ' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/uk.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/uk.js new file mode 100644 index 0000000..84e11ce --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/uk.js @@ -0,0 +1,163 @@ +// moment.js locale configuration +// locale : ukrainian (uk) +// author : zemlanin : https://github.com/zemlanin +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': 'хвилина_хвилини_хвилин', + 'hh': 'година_години_годин', + 'dd': 'день_дні_днів', + 'MM': 'міÑÑць_міÑÑці_міÑÑців', + 'yy': 'рік_роки_років' + }; + if (key === 'm') { + return withoutSuffix ? 'хвилина' : 'хвилину'; + } + else if (key === 'h') { + return withoutSuffix ? 'година' : 'годину'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень'.split('_'), + 'accusative': 'ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ'.split('_') + }, + + nounCase = (/D[oD]? *MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота'.split('_'), + 'accusative': 'неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу'.split('_'), + 'genitive': 'неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи'.split('_') + }, + + nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ? + 'accusative' : + ((/\[?(?:минулої|наÑтупної)? ?\] ?dddd/).test(format) ? + 'genitive' : + 'nominative'); + + return weekdays[nounCase][m.day()]; + } + + function processHoursFunction(str) { + return function () { + return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT'; + }; + } + + return moment.defineLocale('uk', { + months : monthsCaseReplace, + monthsShort : 'Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + weekdaysMin : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY Ñ€.', + LLL : 'D MMMM YYYY Ñ€., LT', + LLLL : 'dddd, D MMMM YYYY Ñ€., LT' + }, + calendar : { + sameDay: processHoursFunction('[Сьогодні '), + nextDay: processHoursFunction('[Завтра '), + lastDay: processHoursFunction('[Вчора '), + nextWeek: processHoursFunction('[У] dddd ['), + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return processHoursFunction('[Минулої] dddd [').call(this); + case 1: + case 2: + case 4: + return processHoursFunction('[Минулого] dddd [').call(this); + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'за %s', + past : '%s тому', + s : 'декілька Ñекунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : 'годину', + hh : relativeTimeWithPlural, + d : 'день', + dd : relativeTimeWithPlural, + M : 'міÑÑць', + MM : relativeTimeWithPlural, + y : 'рік', + yy : relativeTimeWithPlural + }, + + // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason + + meridiemParse: /ночі|ранку|днÑ|вечора/, + isPM: function (input) { + return /^(днÑ|вечора)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночі'; + } else if (hour < 12) { + return 'ранку'; + } else if (hour < 17) { + return 'днÑ'; + } else { + return 'вечора'; + } + }, + + ordinalParse: /\d{1,2}-(й|го)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return number + '-й'; + case 'D': + return number + '-го'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/uz.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/uz.js new file mode 100644 index 0000000..139e4de --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/uz.js @@ -0,0 +1,56 @@ +// moment.js locale configuration +// locale : uzbek (uz) +// author : Sardor Muminov : https://github.com/muminoff + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('uz', { + months : 'Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь'.split('_'), + monthsShort : 'Ñнв_фев_мар_апр_май_июн_июл_авг_Ñен_окт_ноÑ_дек'.split('_'), + weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'), + weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'), + weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'D MMMM YYYY, dddd LT' + }, + calendar : { + sameDay : '[Бугун Ñоат] LT [да]', + nextDay : '[Эртага] LT [да]', + nextWeek : 'dddd [куни Ñоат] LT [да]', + lastDay : '[Кеча Ñоат] LT [да]', + lastWeek : '[Утган] dddd [куни Ñоат] LT [да]', + sameElse : 'L' + }, + relativeTime : { + future : 'Якин %s ичида', + past : 'Бир неча %s олдин', + s : 'фурÑат', + m : 'бир дакика', + mm : '%d дакика', + h : 'бир Ñоат', + hh : '%d Ñоат', + d : 'бир кун', + dd : '%d кун', + M : 'бир ой', + MM : '%d ой', + y : 'бир йил', + yy : '%d йил' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/vi.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/vi.js new file mode 100644 index 0000000..15ec7dd --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/vi.js @@ -0,0 +1,64 @@ +// moment.js locale configuration +// locale : vietnamese (vi) +// author : Bang Nguyen : https://github.com/bangnk + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('vi', { + months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'), + monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'), + weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tÆ°_thứ năm_thứ sáu_thứ bảy'.split('_'), + weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM [năm] YYYY', + LLL : 'D MMMM [năm] YYYY LT', + LLLL : 'dddd, D MMMM [năm] YYYY LT', + l : 'DD/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY LT', + llll : 'ddd, D MMM YYYY LT' + }, + calendar : { + sameDay: '[Hôm nay lúc] LT', + nextDay: '[Ngày mai lúc] LT', + nextWeek: 'dddd [tuần tá»›i lúc] LT', + lastDay: '[Hôm qua lúc] LT', + lastWeek: 'dddd [tuần rồi lúc] LT', + sameElse: 'L' + }, + relativeTime : { + future : '%s tá»›i', + past : '%s trÆ°á»›c', + s : 'vài giây', + m : 'má»™t phút', + mm : '%d phút', + h : 'má»™t giá»', + hh : '%d giá»', + d : 'má»™t ngày', + dd : '%d ngày', + M : 'má»™t tháng', + MM : '%d tháng', + y : 'má»™t năm', + yy : '%d năm' + }, + ordinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/zh-cn.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/zh-cn.js new file mode 100644 index 0000000..da83416 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/zh-cn.js @@ -0,0 +1,125 @@ +// moment.js locale configuration +// locale : chinese (zh-cn) +// author : suupic : https://github.com/suupic +// author : Zeno Zeng : https://github.com/zenozeng + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('zh-cn', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'), + weekdaysMin : 'æ—¥_一_二_三_å››_五_å…­'.split('_'), + longDateFormat : { + LT : 'Ah点mm', + LTS : 'Ah点m分s秒', + L : 'YYYY-MM-DD', + LL : 'YYYYå¹´MMMDæ—¥', + LLL : 'YYYYå¹´MMMDæ—¥LT', + LLLL : 'YYYYå¹´MMMDæ—¥ddddLT', + l : 'YYYY-MM-DD', + ll : 'YYYYå¹´MMMDæ—¥', + lll : 'YYYYå¹´MMMDæ—¥LT', + llll : 'YYYYå¹´MMMDæ—¥ddddLT' + }, + meridiemParse: /凌晨|早上|上åˆ|中åˆ|下åˆ|晚上/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '凌晨' || meridiem === '早上' || + meridiem === '上åˆ') { + return hour; + } else if (meridiem === '下åˆ' || meridiem === '晚上') { + return hour + 12; + } else { + // '中åˆ' + return hour >= 11 ? hour : hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return '凌晨'; + } else if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上åˆ'; + } else if (hm < 1230) { + return '中åˆ'; + } else if (hm < 1800) { + return '下åˆ'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : function () { + return this.minutes() === 0 ? '[今天]Ah[点整]' : '[今天]LT'; + }, + nextDay : function () { + return this.minutes() === 0 ? '[明天]Ah[点整]' : '[明天]LT'; + }, + lastDay : function () { + return this.minutes() === 0 ? '[昨天]Ah[点整]' : '[昨天]LT'; + }, + nextWeek : function () { + var startOfWeek, prefix; + startOfWeek = moment().startOf('week'); + prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]'; + return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; + }, + lastWeek : function () { + var startOfWeek, prefix; + startOfWeek = moment().startOf('week'); + prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]'; + return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; + }, + sameElse : 'LL' + }, + ordinalParse: /\d{1,2}(æ—¥|月|周)/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + 'æ—¥'; + case 'M': + return number + '月'; + case 'w': + case 'W': + return number + '周'; + default: + return number; + } + }, + relativeTime : { + future : '%s内', + past : '%så‰', + s : '几秒', + m : '1分钟', + mm : '%d分钟', + h : '1å°æ—¶', + hh : '%då°æ—¶', + d : '1天', + dd : '%d天', + M : '1个月', + MM : '%d个月', + y : '1å¹´', + yy : '%då¹´' + }, + week : { + // GB/T 7408-1994《数æ®å…ƒå’Œäº¤æ¢æ ¼å¼Â·ä¿¡æ¯äº¤æ¢Â·æ—¥æœŸå’Œæ—¶é—´è¡¨ç¤ºæ³•ã€‹ä¸ŽISO 8601:1988等效 + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/zh-tw.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/zh-tw.js new file mode 100644 index 0000000..75c974d --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/zh-tw.js @@ -0,0 +1,99 @@ +// moment.js locale configuration +// locale : traditional chinese (zh-tw) +// author : Ben : https://github.com/ben-lin + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('zh-tw', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), + weekdaysMin : 'æ—¥_一_二_三_å››_五_å…­'.split('_'), + longDateFormat : { + LT : 'Ah點mm', + LTS : 'Ah點m分s秒', + L : 'YYYYå¹´MMMDæ—¥', + LL : 'YYYYå¹´MMMDæ—¥', + LLL : 'YYYYå¹´MMMDæ—¥LT', + LLLL : 'YYYYå¹´MMMDæ—¥ddddLT', + l : 'YYYYå¹´MMMDæ—¥', + ll : 'YYYYå¹´MMMDæ—¥', + lll : 'YYYYå¹´MMMDæ—¥LT', + llll : 'YYYYå¹´MMMDæ—¥ddddLT' + }, + meridiemParse: /早上|上åˆ|中åˆ|下åˆ|晚上/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '早上' || meridiem === '上åˆ') { + return hour; + } else if (meridiem === '中åˆ') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === '下åˆ' || meridiem === '晚上') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上åˆ'; + } else if (hm < 1230) { + return '中åˆ'; + } else if (hm < 1800) { + return '下åˆ'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : '[今天]LT', + nextDay : '[明天]LT', + nextWeek : '[下]ddddLT', + lastDay : '[昨天]LT', + lastWeek : '[上]ddddLT', + sameElse : 'L' + }, + ordinalParse: /\d{1,2}(æ—¥|月|週)/, + ordinal : function (number, period) { + switch (period) { + case 'd' : + case 'D' : + case 'DDD' : + return number + 'æ—¥'; + case 'M' : + return number + '月'; + case 'w' : + case 'W' : + return number + '週'; + default : + return number; + } + }, + relativeTime : { + future : '%så…§', + past : '%så‰', + s : '幾秒', + m : '一分é˜', + mm : '%d分é˜', + h : '一å°æ™‚', + hh : '%då°æ™‚', + d : '一天', + dd : '%d天', + M : '一個月', + MM : '%d個月', + y : '一年', + yy : '%då¹´' + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/locales.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/locales.js new file mode 100644 index 0000000..e93562b --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/locales.js @@ -0,0 +1,7306 @@ +// moment.js locale configuration +// locale : afrikaans (af) +// author : Werner Mollentze : https://github.com/wernerm + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('af', { + months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'), + weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'), + weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'), + meridiemParse: /vm|nm/i, + isPM : function (input) { + return /^nm$/i.test(input); + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower ? 'vm' : 'VM'; + } else { + return isLower ? 'nm' : 'NM'; + } + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Vandag om] LT', + nextDay : '[Môre om] LT', + nextWeek : 'dddd [om] LT', + lastDay : '[Gister om] LT', + lastWeek : '[Laas] dddd [om] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'oor %s', + past : '%s gelede', + s : '\'n paar sekondes', + m : '\'n minuut', + mm : '%d minute', + h : '\'n uur', + hh : '%d ure', + d : '\'n dag', + dd : '%d dae', + M : '\'n maand', + MM : '%d maande', + y : '\'n jaar', + yy : '%d jaar' + }, + ordinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter + }, + week : { + dow : 1, // Maandag is die eerste dag van die week. + doy : 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar. + } + }); +})); + +// moment.js locale configuration +// locale : Moroccan Arabic (ar-ma) +// author : ElFadili Yassine : https://github.com/ElFadiliY +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ar-ma', { + months : 'يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + monthsShort : 'يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'ÙÙŠ %s', + past : 'منذ %s', + s : 'ثوان', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Arabic Saudi Arabia (ar-sa) +// author : Suhail Alkowaileet : https://github.com/xsoh + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': 'Ù¡', + '2': 'Ù¢', + '3': 'Ù£', + '4': 'Ù¤', + '5': 'Ù¥', + '6': 'Ù¦', + '7': 'Ù§', + '8': 'Ù¨', + '9': 'Ù©', + '0': 'Ù ' + }, numberMap = { + 'Ù¡': '1', + 'Ù¢': '2', + 'Ù£': '3', + 'Ù¤': '4', + 'Ù¥': '5', + 'Ù¦': '6', + 'Ù§': '7', + 'Ù¨': '8', + 'Ù©': '9', + 'Ù ': '0' + }; + + return moment.defineLocale('ar-sa', { + months : 'يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + monthsShort : 'يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + meridiemParse: /ص|Ù…/, + isPM : function (input) { + return 'Ù…' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'Ù…'; + } + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'ÙÙŠ %s', + past : 'منذ %s', + s : 'ثوان', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + preparse: function (string) { + return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return numberMap[match]; + }).replace(/ØŒ/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, 'ØŒ'); + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Tunisian Arabic (ar-tn) + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ar-tn', { + months: 'جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + monthsShort: 'جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin: 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS: 'LT:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd D MMMM YYYY LT' + }, + calendar: { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'ÙÙŠ %s', + past: 'منذ %s', + s: 'ثوان', + m: 'دقيقة', + mm: '%d دقائق', + h: 'ساعة', + hh: '%d ساعات', + d: 'يوم', + dd: '%d أيام', + M: 'شهر', + MM: '%d أشهر', + y: 'سنة', + yy: '%d سنوات' + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// Locale: Arabic (ar) +// Author: Abdel Said: https://github.com/abdelsaid +// Changes in months, weekdays: Ahmed Elkhatib +// Native plural forms: forabi https://github.com/forabi + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': 'Ù¡', + '2': 'Ù¢', + '3': 'Ù£', + '4': 'Ù¤', + '5': 'Ù¥', + '6': 'Ù¦', + '7': 'Ù§', + '8': 'Ù¨', + '9': 'Ù©', + '0': 'Ù ' + }, numberMap = { + 'Ù¡': '1', + 'Ù¢': '2', + 'Ù£': '3', + 'Ù¤': '4', + 'Ù¥': '5', + 'Ù¦': '6', + 'Ù§': '7', + 'Ù¨': '8', + 'Ù©': '9', + 'Ù ': '0' + }, pluralForm = function (n) { + return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5; + }, plurals = { + s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'], + m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'], + h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'], + d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'], + M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'], + y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام'] + }, pluralize = function (u) { + return function (number, withoutSuffix, string, isFuture) { + var f = pluralForm(number), + str = plurals[u][pluralForm(number)]; + if (f === 2) { + str = str[withoutSuffix ? 0 : 1]; + } + return str.replace(/%d/i, number); + }; + }, months = [ + 'كانون الثاني يناير', + 'شباط Ùبراير', + 'آذار مارس', + 'نيسان أبريل', + 'أيار مايو', + 'حزيران يونيو', + 'تموز يوليو', + 'آب أغسطس', + 'أيلول سبتمبر', + 'تشرين الأول أكتوبر', + 'تشرين الثاني نوÙمبر', + 'كانون الأول ديسمبر' + ]; + + return moment.defineLocale('ar', { + months : months, + monthsShort : months, + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + meridiemParse: /ص|Ù…/, + isPM : function (input) { + return 'Ù…' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'Ù…'; + } + }, + calendar : { + sameDay: '[اليوم عند الساعة] LT', + nextDay: '[غدًا عند الساعة] LT', + nextWeek: 'dddd [عند الساعة] LT', + lastDay: '[أمس عند الساعة] LT', + lastWeek: 'dddd [عند الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'بعد %s', + past : 'منذ %s', + s : pluralize('s'), + m : pluralize('m'), + mm : pluralize('m'), + h : pluralize('h'), + hh : pluralize('h'), + d : pluralize('d'), + dd : pluralize('d'), + M : pluralize('M'), + MM : pluralize('M'), + y : pluralize('y'), + yy : pluralize('y') + }, + preparse: function (string) { + return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return numberMap[match]; + }).replace(/ØŒ/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, 'ØŒ'); + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : azerbaijani (az) +// author : topchiyev : https://github.com/topchiyev + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var suffixes = { + 1: '-inci', + 5: '-inci', + 8: '-inci', + 70: '-inci', + 80: '-inci', + + 2: '-nci', + 7: '-nci', + 20: '-nci', + 50: '-nci', + + 3: '-üncü', + 4: '-üncü', + 100: '-üncü', + + 6: '-ncı', + + 9: '-uncu', + 10: '-uncu', + 30: '-uncu', + + 60: '-ıncı', + 90: '-ıncı' + }; + return moment.defineLocale('az', { + months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'), + monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'), + weekdays : 'Bazar_Bazar ertÉ™si_ÇərÅŸÉ™nbÉ™ axÅŸamı_ÇərÅŸÉ™nbÉ™_CümÉ™ axÅŸamı_CümÉ™_ŞənbÉ™'.split('_'), + weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'), + weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[bugün saat] LT', + nextDay : '[sabah saat] LT', + nextWeek : '[gÉ™lÉ™n hÉ™ftÉ™] dddd [saat] LT', + lastDay : '[dünÉ™n] LT', + lastWeek : '[keçən hÉ™ftÉ™] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s sonra', + past : '%s É™vvÉ™l', + s : 'birneçə saniyyÉ™', + m : 'bir dÉ™qiqÉ™', + mm : '%d dÉ™qiqÉ™', + h : 'bir saat', + hh : '%d saat', + d : 'bir gün', + dd : '%d gün', + M : 'bir ay', + MM : '%d ay', + y : 'bir il', + yy : '%d il' + }, + meridiemParse: /gecÉ™|sÉ™hÉ™r|gündüz|axÅŸam/, + isPM : function (input) { + return /^(gündüz|axÅŸam)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'gecÉ™'; + } else if (hour < 12) { + return 'sÉ™hÉ™r'; + } else if (hour < 17) { + return 'gündüz'; + } else { + return 'axÅŸam'; + } + }, + ordinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/, + ordinal : function (number) { + if (number === 0) { // special case for zero + return number + '-ıncı'; + } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + + return number + (suffixes[a] || suffixes[b] || suffixes[c]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : belarusian (be) +// author : Dmitry Demidov : https://github.com/demidov91 +// author: Praleska: http://praleska.pro/ +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін', + 'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін', + 'dd': 'дзень_дні_дзён', + 'MM': 'меÑÑц_меÑÑцы_меÑÑцаў', + 'yy': 'год_гады_гадоў' + }; + if (key === 'm') { + return withoutSuffix ? 'хвіліна' : 'хвіліну'; + } + else if (key === 'h') { + return withoutSuffix ? 'гадзіна' : 'гадзіну'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñтудзень_люты_Ñакавік_краÑавік_травень_чÑрвень_ліпень_жнівень_вераÑень_каÑтрычнік_ліÑтапад_Ñнежань'.split('_'), + 'accusative': 'ÑтудзенÑ_лютага_Ñакавіка_краÑавіка_траўнÑ_чÑрвенÑ_ліпенÑ_жніўнÑ_вераÑнÑ_каÑтрычніка_ліÑтапада_ÑнежнÑ'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'нÑдзелÑ_панÑдзелак_аўторак_Ñерада_чацвер_пÑтніца_Ñубота'.split('_'), + 'accusative': 'нÑдзелю_панÑдзелак_аўторак_Ñераду_чацвер_пÑтніцу_Ñуботу'.split('_') + }, + + nounCase = (/\[ ?[Вв] ?(?:мінулую|наÑтупную)? ?\] ?dddd/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.defineLocale('be', { + months : monthsCaseReplace, + monthsShort : 'Ñтуд_лют_Ñак_краÑ_трав_чÑрв_ліп_жнів_вер_каÑÑ‚_ліÑÑ‚_Ñнеж'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'нд_пн_ат_ÑÑ€_чц_пт_Ñб'.split('_'), + weekdaysMin : 'нд_пн_ат_ÑÑ€_чц_пт_Ñб'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY г.', + LLL : 'D MMMM YYYY г., LT', + LLLL : 'dddd, D MMMM YYYY г., LT' + }, + calendar : { + sameDay: '[Ð¡Ñ‘Ð½Ð½Ñ Ñž] LT', + nextDay: '[Заўтра Ñž] LT', + lastDay: '[Учора Ñž] LT', + nextWeek: function () { + return '[У] dddd [Ñž] LT'; + }, + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return '[У мінулую] dddd [Ñž] LT'; + case 1: + case 2: + case 4: + return '[У мінулы] dddd [Ñž] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'праз %s', + past : '%s таму', + s : 'некалькі Ñекунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : relativeTimeWithPlural, + hh : relativeTimeWithPlural, + d : 'дзень', + dd : relativeTimeWithPlural, + M : 'меÑÑц', + MM : relativeTimeWithPlural, + y : 'год', + yy : relativeTimeWithPlural + }, + meridiemParse: /ночы|раніцы|днÑ|вечара/, + isPM : function (input) { + return /^(днÑ|вечара)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночы'; + } else if (hour < 12) { + return 'раніцы'; + } else if (hour < 17) { + return 'днÑ'; + } else { + return 'вечара'; + } + }, + + ordinalParse: /\d{1,2}-(Ñ–|Ñ‹|га)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-Ñ–' : number + '-Ñ‹'; + case 'D': + return number + '-га'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : bulgarian (bg) +// author : Krasen Borisov : https://github.com/kraz + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('bg', { + months : 'Ñнуари_февруари_март_април_май_юни_юли_авгуÑÑ‚_Ñептември_октомври_ноември_декември'.split('_'), + monthsShort : 'Ñнр_фев_мар_апр_май_юни_юли_авг_Ñеп_окт_ное_дек'.split('_'), + weekdays : 'неделÑ_понеделник_вторник_ÑÑ€Ñда_четвъртък_петък_Ñъбота'.split('_'), + weekdaysShort : 'нед_пон_вто_ÑÑ€Ñ_чет_пет_Ñъб'.split('_'), + weekdaysMin : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'D.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Ð”Ð½ÐµÑ Ð²] LT', + nextDay : '[Утре в] LT', + nextWeek : 'dddd [в] LT', + lastDay : '[Вчера в] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[Ð’ изминалата] dddd [в] LT'; + case 1: + case 2: + case 4: + case 5: + return '[Ð’ изминалиÑ] dddd [в] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'Ñлед %s', + past : 'преди %s', + s : 'нÑколко Ñекунди', + m : 'минута', + mm : '%d минути', + h : 'чаÑ', + hh : '%d чаÑа', + d : 'ден', + dd : '%d дни', + M : 'меÑец', + MM : '%d меÑеца', + y : 'година', + yy : '%d години' + }, + ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Bengali (bn) +// author : Kaushik Gandhi : https://github.com/kaushikgandhi + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': '১', + '2': '২', + '3': '৩', + '4': '৪', + '5': '৫', + '6': '৬', + '7': '৭', + '8': '৮', + '9': '৯', + '0': '০' + }, + numberMap = { + '১': '1', + '২': '2', + '৩': '3', + '৪': '4', + '৫': '5', + '৬': '6', + '৭': '7', + '৮': '8', + '৯': '9', + '০': '0' + }; + + return moment.defineLocale('bn', { + months : 'জানà§à§Ÿà¦¾à¦°à§€_ফেবà§à§Ÿà¦¾à¦°à§€_মারà§à¦š_à¦à¦ªà§à¦°à¦¿à¦²_মে_জà§à¦¨_জà§à¦²à¦¾à¦‡_অগাসà§à¦Ÿ_সেপà§à¦Ÿà§‡à¦®à§à¦¬à¦°_অকà§à¦Ÿà§‹à¦¬à¦°_নভেমà§à¦¬à¦°_ডিসেমà§à¦¬à¦°'.split('_'), + monthsShort : 'জানà§_ফেব_মারà§à¦š_à¦à¦ªà¦°_মে_জà§à¦¨_জà§à¦²_অগ_সেপà§à¦Ÿ_অকà§à¦Ÿà§‹_নভ_ডিসেমà§'.split('_'), + weekdays : 'রবিবার_সোমবার_মঙà§à¦—লবার_বà§à¦§à¦¬à¦¾à¦°_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿à¦¬à¦¾à¦°_শà§à¦•à§à¦°à§à¦¬à¦¾à¦°_শনিবার'.split('_'), + weekdaysShort : 'রবি_সোম_মঙà§à¦—ল_বà§à¦§_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿_শà§à¦•à§à¦°à§_শনি'.split('_'), + weekdaysMin : 'রব_সম_মঙà§à¦—_বà§_বà§à¦°à¦¿à¦¹_শà§_শনি'.split('_'), + longDateFormat : { + LT : 'A h:mm সময়', + LTS : 'A h:mm:ss সময়', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[আজ] LT', + nextDay : '[আগামীকাল] LT', + nextWeek : 'dddd, LT', + lastDay : '[গতকাল] LT', + lastWeek : '[গত] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s পরে', + past : '%s আগে', + s : 'কà¦à¦• সেকেনà§à¦¡', + m : 'à¦à¦• মিনিট', + mm : '%d মিনিট', + h : 'à¦à¦• ঘনà§à¦Ÿà¦¾', + hh : '%d ঘনà§à¦Ÿà¦¾', + d : 'à¦à¦• দিন', + dd : '%d দিন', + M : 'à¦à¦• মাস', + MM : '%d মাস', + y : 'à¦à¦• বছর', + yy : '%d বছর' + }, + preparse: function (string) { + return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /রাত|শকাল|দà§à¦ªà§à¦°|বিকেল|রাত/, + isPM: function (input) { + return /^(দà§à¦ªà§à¦°|বিকেল|রাত)$/.test(input); + }, + //Bengali is a vast language its spoken + //in different forms in various parts of the world. + //I have just generalized with most common one used + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'রাত'; + } else if (hour < 10) { + return 'শকাল'; + } else if (hour < 17) { + return 'দà§à¦ªà§à¦°'; + } else if (hour < 20) { + return 'বিকেল'; + } else { + return 'রাত'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : tibetan (bo) +// author : Thupten N. Chakrishar : https://github.com/vajradog + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': '༡', + '2': '༢', + '3': '༣', + '4': '༤', + '5': '༥', + '6': '༦', + '7': '༧', + '8': '༨', + '9': '༩', + '0': '༠' + }, + numberMap = { + '༡': '1', + '༢': '2', + '༣': '3', + '༤': '4', + '༥': '5', + '༦': '6', + '༧': '7', + '༨': '8', + '༩': '9', + '༠': '0' + }; + + return moment.defineLocale('bo', { + months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), + monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), + weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'), + weekdaysShort : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), + weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), + longDateFormat : { + LT : 'A h:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[དི་རིང] LT', + nextDay : '[སང་ཉིན] LT', + nextWeek : '[བདུན་ཕྲག་རྗེས་མ], LT', + lastDay : '[à½à¼‹à½¦à½„] LT', + lastWeek : '[བདུན་ཕྲག་མà½à½ à¼‹à½˜] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s ལ་', + past : '%s སྔན་ལ', + s : 'ལམ་སང', + m : 'སà¾à½¢à¼‹à½˜à¼‹à½‚ཅིག', + mm : '%d སà¾à½¢à¼‹à½˜', + h : 'ཆུ་ཚོད་གཅིག', + hh : '%d ཆུ་ཚོད', + d : 'ཉིན་གཅིག', + dd : '%d ཉིན་', + M : 'ཟླ་བ་གཅིག', + MM : '%d ཟླ་བ', + y : 'ལོ་གཅིག', + yy : '%d ལོ' + }, + preparse: function (string) { + return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/, + isPM: function (input) { + return /^(ཉིན་གུང|དགོང་དག|མཚན་མོ)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'མཚན་མོ'; + } else if (hour < 10) { + return 'ཞོགས་ཀས'; + } else if (hour < 17) { + return 'ཉིན་གུང'; + } else if (hour < 20) { + return 'དགོང་དག'; + } else { + return 'མཚན་མོ'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : breton (br) +// author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function relativeTimeWithMutation(number, withoutSuffix, key) { + var format = { + 'mm': 'munutenn', + 'MM': 'miz', + 'dd': 'devezh' + }; + return number + ' ' + mutation(format[key], number); + } + + function specialMutationForYears(number) { + switch (lastNumber(number)) { + case 1: + case 3: + case 4: + case 5: + case 9: + return number + ' bloaz'; + default: + return number + ' vloaz'; + } + } + + function lastNumber(number) { + if (number > 9) { + return lastNumber(number % 10); + } + return number; + } + + function mutation(text, number) { + if (number === 2) { + return softMutation(text); + } + return text; + } + + function softMutation(text) { + var mutationTable = { + 'm': 'v', + 'b': 'v', + 'd': 'z' + }; + if (mutationTable[text.charAt(0)] === undefined) { + return text; + } + return mutationTable[text.charAt(0)] + text.substring(1); + } + + return moment.defineLocale('br', { + months : 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'), + monthsShort : 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'), + weekdays : 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'), + weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'), + weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'), + longDateFormat : { + LT : 'h[e]mm A', + LTS : 'h[e]mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D [a viz] MMMM YYYY', + LLL : 'D [a viz] MMMM YYYY LT', + LLLL : 'dddd, D [a viz] MMMM YYYY LT' + }, + calendar : { + sameDay : '[Hiziv da] LT', + nextDay : '[Warc\'hoazh da] LT', + nextWeek : 'dddd [da] LT', + lastDay : '[Dec\'h da] LT', + lastWeek : 'dddd [paset da] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'a-benn %s', + past : '%s \'zo', + s : 'un nebeud segondennoù', + m : 'ur vunutenn', + mm : relativeTimeWithMutation, + h : 'un eur', + hh : '%d eur', + d : 'un devezh', + dd : relativeTimeWithMutation, + M : 'ur miz', + MM : relativeTimeWithMutation, + y : 'ur bloaz', + yy : specialMutationForYears + }, + ordinalParse: /\d{1,2}(añ|vet)/, + ordinal : function (number) { + var output = (number === 1) ? 'añ' : 'vet'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : bosnian (bs) +// author : Nedim Cholich : https://github.com/frontyard +// based on (hr) translation by Bojan Marković + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } + } + + return moment.defineLocale('bs', { + months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'), + monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'), + weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota'.split('_'), + weekdaysShort : 'ned._pon._uto._sri._Äet._pet._sub.'.split('_'), + weekdaysMin : 'ne_po_ut_sr_Äe_pe_su'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD. MM. YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[proÅ¡lu] dddd [u] LT'; + case 6: + return '[proÅ¡le] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[proÅ¡li] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'par sekundi', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'dan', + dd : translate, + M : 'mjesec', + MM : translate, + y : 'godinu', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : catalan (ca) +// author : Juan G. Hurtado : https://github.com/juanghurtado + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ca', { + months : 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'), + monthsShort : 'gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.'.split('_'), + weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'), + weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'), + weekdaysMin : 'Dg_Dl_Dt_Dc_Dj_Dv_Ds'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay : function () { + return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextDay : function () { + return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastDay : function () { + return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'fa %s', + s : 'uns segons', + m : 'un minut', + mm : '%d minuts', + h : 'una hora', + hh : '%d hores', + d : 'un dia', + dd : '%d dies', + M : 'un mes', + MM : '%d mesos', + y : 'un any', + yy : '%d anys' + }, + ordinalParse: /\d{1,2}(r|n|t|è|a)/, + ordinal : function (number, period) { + var output = (number === 1) ? 'r' : + (number === 2) ? 'n' : + (number === 3) ? 'r' : + (number === 4) ? 't' : 'è'; + if (period === 'w' || period === 'W') { + output = 'a'; + } + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : czech (cs) +// author : petrbela : https://github.com/petrbela + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var months = 'leden_únor_bÅ™ezen_duben_kvÄ›ten_Äerven_Äervenec_srpen_září_říjen_listopad_prosinec'.split('_'), + monthsShort = 'led_úno_bÅ™e_dub_kvÄ›_Ävn_Ävc_srp_zář_říj_lis_pro'.split('_'); + + function plural(n) { + return (n > 1) && (n < 5) && (~~(n / 10) !== 1); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami'; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minuty' : 'minut'); + } else { + return result + 'minutami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodin'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'den' : 'dnem'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dny' : 'dní'); + } else { + return result + 'dny'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mÄ›síc' : 'mÄ›sícem'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'mÄ›síce' : 'mÄ›síců'); + } else { + return result + 'mÄ›síci'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokem'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'let'); + } else { + return result + 'lety'; + } + break; + } + } + + return moment.defineLocale('cs', { + months : months, + monthsShort : monthsShort, + monthsParse : (function (months, monthsShort) { + var i, _monthsParse = []; + for (i = 0; i < 12; i++) { + // use custom parser to solve problem with July (Äervenec) + _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); + } + return _monthsParse; + }(months, monthsShort)), + weekdays : 'nedÄ›le_pondÄ›lí_úterý_stÅ™eda_Ätvrtek_pátek_sobota'.split('_'), + weekdaysShort : 'ne_po_út_st_Ät_pá_so'.split('_'), + weekdaysMin : 'ne_po_út_st_Ät_pá_so'.split('_'), + longDateFormat : { + LT: 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[dnes v] LT', + nextDay: '[zítra v] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedÄ›li v] LT'; + case 1: + case 2: + return '[v] dddd [v] LT'; + case 3: + return '[ve stÅ™edu v] LT'; + case 4: + return '[ve Ätvrtek v] LT'; + case 5: + return '[v pátek v] LT'; + case 6: + return '[v sobotu v] LT'; + } + }, + lastDay: '[vÄera v] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulou nedÄ›li v] LT'; + case 1: + case 2: + return '[minulé] dddd [v] LT'; + case 3: + return '[minulou stÅ™edu v] LT'; + case 4: + case 5: + return '[minulý] dddd [v] LT'; + case 6: + return '[minulou sobotu v] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pÅ™ed %s', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse : /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : chuvash (cv) +// author : Anatoly Mironov : https://github.com/mirontoli + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('cv', { + months : 'кăрлач_нарăÑ_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав'.split('_'), + monthsShort : 'кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш'.split('_'), + weekdays : 'вырÑарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_Ñрнекун_шăматкун'.split('_'), + weekdaysShort : 'выр_тун_ытл_юн_кĕç_Ñрн_шăм'.split('_'), + weekdaysMin : 'вр_тн_Ñ‹Ñ‚_юн_кç_ÑÑ€_шм'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD-MM-YYYY', + LL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]', + LLL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT', + LLLL : 'dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT' + }, + calendar : { + sameDay: '[ПаÑн] LT [Ñехетре]', + nextDay: '[Ыран] LT [Ñехетре]', + lastDay: '[Ĕнер] LT [Ñехетре]', + nextWeek: '[ÇитеÑ] dddd LT [Ñехетре]', + lastWeek: '[Иртнĕ] dddd LT [Ñехетре]', + sameElse: 'L' + }, + relativeTime : { + future : function (output) { + var affix = /Ñехет$/i.exec(output) ? 'рен' : /çул$/i.exec(output) ? 'тан' : 'ран'; + return output + affix; + }, + past : '%s каÑлла', + s : 'пĕр-ик çеккунт', + m : 'пĕр минут', + mm : '%d минут', + h : 'пĕр Ñехет', + hh : '%d Ñехет', + d : 'пĕр кун', + dd : '%d кун', + M : 'пĕр уйăх', + MM : '%d уйăх', + y : 'пĕр çул', + yy : '%d çул' + }, + ordinalParse: /\d{1,2}-мĕш/, + ordinal : '%d-мĕш', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Welsh (cy) +// author : Robert Allen + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('cy', { + months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'), + monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'), + weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'), + weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'), + weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'), + // time formats are the same as en-gb + longDateFormat: { + LT: 'HH:mm', + LTS : 'LT:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd, D MMMM YYYY LT' + }, + calendar: { + sameDay: '[Heddiw am] LT', + nextDay: '[Yfory am] LT', + nextWeek: 'dddd [am] LT', + lastDay: '[Ddoe am] LT', + lastWeek: 'dddd [diwethaf am] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'mewn %s', + past: '%s yn ôl', + s: 'ychydig eiliadau', + m: 'munud', + mm: '%d munud', + h: 'awr', + hh: '%d awr', + d: 'diwrnod', + dd: '%d diwrnod', + M: 'mis', + MM: '%d mis', + y: 'blwyddyn', + yy: '%d flynedd' + }, + ordinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/, + // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh + ordinal: function (number) { + var b = number, + output = '', + lookup = [ + '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed + 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed + ]; + + if (b > 20) { + if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) { + output = 'fed'; // not 30ain, 70ain or 90ain + } else { + output = 'ain'; + } + } else if (b > 0) { + output = lookup[b]; + } + + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : danish (da) +// author : Ulrik Nielsen : https://github.com/mrbase + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('da', { + months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), + weekdaysShort : 'søn_man_tir_ons_tor_fre_lør'.split('_'), + weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd [d.] D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[I dag kl.] LT', + nextDay : '[I morgen kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[I gÃ¥r kl.] LT', + lastWeek : '[sidste] dddd [kl] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'om %s', + past : '%s siden', + s : 'fÃ¥ sekunder', + m : 'et minut', + mm : '%d minutter', + h : 'en time', + hh : '%d timer', + d : 'en dag', + dd : '%d dage', + M : 'en mÃ¥ned', + MM : '%d mÃ¥neder', + y : 'et Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : austrian german (de-at) +// author : lluchs : https://github.com/lluchs +// author: Menelion Elensúle: https://github.com/Oire +// author : Martin Groller : https://github.com/MadMG + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + return moment.defineLocale('de-at', { + months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[Heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[Morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[Gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : german (de) +// author : lluchs : https://github.com/lluchs +// author: Menelion Elensúle: https://github.com/Oire + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + return moment.defineLocale('de', { + months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[Heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[Morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[Gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : modern greek (el) +// author : Aggelos Karalias : https://github.com/mehiel + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('el', { + monthsNominativeEl : 'ΙανουάÏιος_ΦεβÏουάÏιος_ΜάÏτιος_ΑπÏίλιος_Μάιος_ΙοÏνιος_ΙοÏλιος_ΑÏγουστος_ΣεπτέμβÏιος_ΟκτώβÏιος_ÎοέμβÏιος_ΔεκέμβÏιος'.split('_'), + monthsGenitiveEl : 'ΙανουαÏίου_ΦεβÏουαÏίου_ΜαÏτίου_ΑπÏιλίου_ΜαÎου_Ιουνίου_Ιουλίου_ΑυγοÏστου_ΣεπτεμβÏίου_ΟκτωβÏίου_ÎοεμβÏίου_ΔεκεμβÏίου'.split('_'), + months : function (momentToFormat, format) { + if (/D/.test(format.substring(0, format.indexOf('MMMM')))) { // if there is a day number before 'MMMM' + return this._monthsGenitiveEl[momentToFormat.month()]; + } else { + return this._monthsNominativeEl[momentToFormat.month()]; + } + }, + monthsShort : 'Ιαν_Φεβ_ΜαÏ_ΑπÏ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Îοε_Δεκ'.split('_'), + weekdays : 'ΚυÏιακή_ΔευτέÏα_ΤÏίτη_ΤετάÏτη_Πέμπτη_ΠαÏασκευή_Σάββατο'.split('_'), + weekdaysShort : 'ΚυÏ_Δευ_ΤÏι_Τετ_Πεμ_ΠαÏ_Σαβ'.split('_'), + weekdaysMin : 'Κυ_Δε_ΤÏ_Τε_Πε_Πα_Σα'.split('_'), + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'μμ' : 'ΜΜ'; + } else { + return isLower ? 'πμ' : 'ΠΜ'; + } + }, + isPM : function (input) { + return ((input + '').toLowerCase()[0] === 'μ'); + }, + meridiemParse : /[ΠΜ]\.?Îœ?\.?/i, + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendarEl : { + sameDay : '[ΣήμεÏα {}] LT', + nextDay : '[ΑÏÏιο {}] LT', + nextWeek : 'dddd [{}] LT', + lastDay : '[Χθες {}] LT', + lastWeek : function () { + switch (this.day()) { + case 6: + return '[το Ï€ÏοηγοÏμενο] dddd [{}] LT'; + default: + return '[την Ï€ÏοηγοÏμενη] dddd [{}] LT'; + } + }, + sameElse : 'L' + }, + calendar : function (key, mom) { + var output = this._calendarEl[key], + hours = mom && mom.hours(); + + if (typeof output === 'function') { + output = output.apply(mom); + } + + return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις')); + }, + relativeTime : { + future : 'σε %s', + past : '%s Ï€Ïιν', + s : 'λίγα δευτεÏόλεπτα', + m : 'ένα λεπτό', + mm : '%d λεπτά', + h : 'μία ÏŽÏα', + hh : '%d ÏŽÏες', + d : 'μία μέÏα', + dd : '%d μέÏες', + M : 'ένας μήνας', + MM : '%d μήνες', + y : 'ένας χÏόνος', + yy : '%d χÏόνια' + }, + ordinalParse: /\d{1,2}η/, + ordinal: '%dη', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : australian english (en-au) + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('en-au', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + 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' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : canadian english (en-ca) +// author : Jonathan Abourbih : https://github.com/jonbca + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('en-ca', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'YYYY-MM-DD', + LL : 'D MMMM, YYYY', + LLL : 'D MMMM, YYYY LT', + LLLL : 'dddd, D MMMM, YYYY LT' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + 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' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); +})); + +// moment.js locale configuration +// locale : great britain english (en-gb) +// author : Chris Gedrim : https://github.com/chrisgedrim + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('en-gb', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + 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' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : esperanto (eo) +// author : Colin Dean : https://github.com/colindean +// komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko. +// Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni! + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('eo', { + months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aÅ­gusto_septembro_oktobro_novembro_decembro'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aÅ­g_sep_okt_nov_dec'.split('_'), + weekdays : 'Dimanĉo_Lundo_Mardo_Merkredo_Ä´aÅ­do_Vendredo_Sabato'.split('_'), + weekdaysShort : 'Dim_Lun_Mard_Merk_Ä´aÅ­_Ven_Sab'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Ä´a_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'D[-an de] MMMM, YYYY', + LLL : 'D[-an de] MMMM, YYYY LT', + LLLL : 'dddd, [la] D[-an de] MMMM, YYYY LT' + }, + meridiemParse: /[ap]\.t\.m/i, + isPM: function (input) { + return input.charAt(0).toLowerCase() === 'p'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'p.t.m.' : 'P.T.M.'; + } else { + return isLower ? 'a.t.m.' : 'A.T.M.'; + } + }, + calendar : { + sameDay : '[HodiaÅ­ je] LT', + nextDay : '[MorgaÅ­ je] LT', + nextWeek : 'dddd [je] LT', + lastDay : '[HieraÅ­ je] LT', + lastWeek : '[pasinta] dddd [je] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'je %s', + past : 'antaÅ­ %s', + s : 'sekundoj', + m : 'minuto', + mm : '%d minutoj', + h : 'horo', + hh : '%d horoj', + d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo + dd : '%d tagoj', + M : 'monato', + MM : '%d monatoj', + y : 'jaro', + yy : '%d jaroj' + }, + ordinalParse: /\d{1,2}a/, + ordinal : '%da', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : spanish (es) +// author : Julio Napurí : https://github.com/julionc + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), + monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); + + return moment.defineLocale('es', { + months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return monthsShort[m.month()]; + } else { + return monthsShortDot[m.month()]; + } + }, + weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), + weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), + weekdaysMin : 'Do_Lu_Ma_Mi_Ju_Vi_Sá'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY LT', + LLLL : 'dddd, D [de] MMMM [de] YYYY LT' + }, + calendar : { + sameDay : function () { + return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextDay : function () { + return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastDay : function () { + return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'hace %s', + s : 'unos segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'una hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un año', + yy : '%d años' + }, + ordinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : estonian (et) +// author : Henry Kehlmann : https://github.com/madhenry +// improvements : Illimar Tambek : https://github.com/ragulka + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'], + 'm' : ['ühe minuti', 'üks minut'], + 'mm': [number + ' minuti', number + ' minutit'], + 'h' : ['ühe tunni', 'tund aega', 'üks tund'], + 'hh': [number + ' tunni', number + ' tundi'], + 'd' : ['ühe päeva', 'üks päev'], + 'M' : ['kuu aja', 'kuu aega', 'üks kuu'], + 'MM': [number + ' kuu', number + ' kuud'], + 'y' : ['ühe aasta', 'aasta', 'üks aasta'], + 'yy': [number + ' aasta', number + ' aastat'] + }; + if (withoutSuffix) { + return format[key][2] ? format[key][2] : format[key][1]; + } + return isFuture ? format[key][0] : format[key][1]; + } + + return moment.defineLocale('et', { + months : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'), + monthsShort : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'), + weekdays : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'), + weekdaysShort : 'P_E_T_K_N_R_L'.split('_'), + weekdaysMin : 'P_E_T_K_N_R_L'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[Täna,] LT', + nextDay : '[Homme,] LT', + nextWeek : '[Järgmine] dddd LT', + lastDay : '[Eile,] LT', + lastWeek : '[Eelmine] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s pärast', + past : '%s tagasi', + s : processRelativeTime, + m : processRelativeTime, + mm : processRelativeTime, + h : processRelativeTime, + hh : processRelativeTime, + d : processRelativeTime, + dd : '%d päeva', + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : euskara (eu) +// author : Eneko Illarramendi : https://github.com/eillarra + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('eu', { + months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'), + monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'), + weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'), + weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'), + weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY[ko] MMMM[ren] D[a]', + LLL : 'YYYY[ko] MMMM[ren] D[a] LT', + LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] LT', + l : 'YYYY-M-D', + ll : 'YYYY[ko] MMM D[a]', + lll : 'YYYY[ko] MMM D[a] LT', + llll : 'ddd, YYYY[ko] MMM D[a] LT' + }, + calendar : { + sameDay : '[gaur] LT[etan]', + nextDay : '[bihar] LT[etan]', + nextWeek : 'dddd LT[etan]', + lastDay : '[atzo] LT[etan]', + lastWeek : '[aurreko] dddd LT[etan]', + sameElse : 'L' + }, + relativeTime : { + future : '%s barru', + past : 'duela %s', + s : 'segundo batzuk', + m : 'minutu bat', + mm : '%d minutu', + h : 'ordu bat', + hh : '%d ordu', + d : 'egun bat', + dd : '%d egun', + M : 'hilabete bat', + MM : '%d hilabete', + y : 'urte bat', + yy : '%d urte' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Persian (fa) +// author : Ebrahim Byagowi : https://github.com/ebraminio + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': 'Û±', + '2': 'Û²', + '3': 'Û³', + '4': 'Û´', + '5': 'Ûµ', + '6': 'Û¶', + '7': 'Û·', + '8': 'Û¸', + '9': 'Û¹', + '0': 'Û°' + }, numberMap = { + 'Û±': '1', + 'Û²': '2', + 'Û³': '3', + 'Û´': '4', + 'Ûµ': '5', + 'Û¶': '6', + 'Û·': '7', + 'Û¸': '8', + 'Û¹': '9', + 'Û°': '0' + }; + + return moment.defineLocale('fa', { + months : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + monthsShort : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysMin : 'ÛŒ_د_س_Ú†_Ù¾_ج_Ø´'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + meridiemParse: /قبل از ظهر|بعد از ظهر/, + isPM: function (input) { + return /بعد از ظهر/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'قبل از ظهر'; + } else { + return 'بعد از ظهر'; + } + }, + calendar : { + sameDay : '[امروز ساعت] LT', + nextDay : '[Ùردا ساعت] LT', + nextWeek : 'dddd [ساعت] LT', + lastDay : '[دیروز ساعت] LT', + lastWeek : 'dddd [پیش] [ساعت] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'در %s', + past : '%s پیش', + s : 'چندین ثانیه', + m : 'یک دقیقه', + mm : '%d دقیقه', + h : 'یک ساعت', + hh : '%d ساعت', + d : 'یک روز', + dd : '%d روز', + M : 'یک ماه', + MM : '%d ماه', + y : 'یک سال', + yy : '%d سال' + }, + preparse: function (string) { + return string.replace(/[Û°-Û¹]/g, function (match) { + return numberMap[match]; + }).replace(/ØŒ/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, 'ØŒ'); + }, + ordinalParse: /\d{1,2}Ù…/, + ordinal : '%dÙ…', + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : finnish (fi) +// author : Tarmo Aidantausta : https://github.com/bleadof + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '), + numbersFuture = [ + 'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden', + numbersPast[7], numbersPast[8], numbersPast[9] + ]; + + function translate(number, withoutSuffix, key, isFuture) { + var result = ''; + switch (key) { + case 's': + return isFuture ? 'muutaman sekunnin' : 'muutama sekunti'; + case 'm': + return isFuture ? 'minuutin' : 'minuutti'; + case 'mm': + result = isFuture ? 'minuutin' : 'minuuttia'; + break; + case 'h': + return isFuture ? 'tunnin' : 'tunti'; + case 'hh': + result = isFuture ? 'tunnin' : 'tuntia'; + break; + case 'd': + return isFuture ? 'päivän' : 'päivä'; + case 'dd': + result = isFuture ? 'päivän' : 'päivää'; + break; + case 'M': + return isFuture ? 'kuukauden' : 'kuukausi'; + case 'MM': + result = isFuture ? 'kuukauden' : 'kuukautta'; + break; + case 'y': + return isFuture ? 'vuoden' : 'vuosi'; + case 'yy': + result = isFuture ? 'vuoden' : 'vuotta'; + break; + } + result = verbalNumber(number, isFuture) + ' ' + result; + return result; + } + + function verbalNumber(number, isFuture) { + return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number; + } + + return moment.defineLocale('fi', { + months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'), + monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'), + weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'), + weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'), + weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD.MM.YYYY', + LL : 'Do MMMM[ta] YYYY', + LLL : 'Do MMMM[ta] YYYY, [klo] LT', + LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] LT', + l : 'D.M.YYYY', + ll : 'Do MMM YYYY', + lll : 'Do MMM YYYY, [klo] LT', + llll : 'ddd, Do MMM YYYY, [klo] LT' + }, + calendar : { + sameDay : '[tänään] [klo] LT', + nextDay : '[huomenna] [klo] LT', + nextWeek : 'dddd [klo] LT', + lastDay : '[eilen] [klo] LT', + lastWeek : '[viime] dddd[na] [klo] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s päästä', + past : '%s sitten', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : faroese (fo) +// author : Ragnar Johannesen : https://github.com/ragnar123 + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('fo', { + months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'), + weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'), + weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D. MMMM, YYYY LT' + }, + calendar : { + sameDay : '[à dag kl.] LT', + nextDay : '[à morgin kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[à gjár kl.] LT', + lastWeek : '[síðstu] dddd [kl] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'um %s', + past : '%s síðani', + s : 'fá sekund', + m : 'ein minutt', + mm : '%d minuttir', + h : 'ein tími', + hh : '%d tímar', + d : 'ein dagur', + dd : '%d dagar', + M : 'ein mánaði', + MM : '%d mánaðir', + y : 'eitt ár', + yy : '%d ár' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : canadian french (fr-ca) +// author : Jonathan Abourbih : https://github.com/jonbca + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('fr-ca', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Aujourd\'hui à] LT', + nextDay: '[Demain à] LT', + nextWeek: 'dddd [à] LT', + lastDay: '[Hier à] LT', + lastWeek: 'dddd [dernier à] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + ordinalParse: /\d{1,2}(er|)/, + ordinal : function (number) { + return number + (number === 1 ? 'er' : ''); + } + }); +})); + +// moment.js locale configuration +// locale : french (fr) +// author : John Fischer : https://github.com/jfroffice + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('fr', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Aujourd\'hui à] LT', + nextDay: '[Demain à] LT', + nextWeek: 'dddd [à] LT', + lastDay: '[Hier à] LT', + lastWeek: 'dddd [dernier à] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + ordinalParse: /\d{1,2}(er|)/, + ordinal : function (number) { + return number + (number === 1 ? 'er' : ''); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : frisian (fy) +// author : Robin van der Vliet : https://github.com/robin0van0der0v + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'); + + return moment.defineLocale('fy', { + months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'), + weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'), + weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[hjoed om] LT', + nextDay: '[moarn om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[juster om] LT', + lastWeek: '[ôfrûne] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'oer %s', + past : '%s lyn', + s : 'in pear sekonden', + m : 'ien minút', + mm : '%d minuten', + h : 'ien oere', + hh : '%d oeren', + d : 'ien dei', + dd : '%d dagen', + M : 'ien moanne', + MM : '%d moannen', + y : 'ien jier', + yy : '%d jierren' + }, + ordinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : galician (gl) +// author : Juan G. Hurtado : https://github.com/juanghurtado + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('gl', { + months : 'Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro'.split('_'), + monthsShort : 'Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.'.split('_'), + weekdays : 'Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado'.split('_'), + weekdaysShort : 'Dom._Lun._Mar._Mér._Xov._Ven._Sáb.'.split('_'), + weekdaysMin : 'Do_Lu_Ma_Mé_Xo_Ve_Sá'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay : function () { + return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextDay : function () { + return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextWeek : function () { + return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + lastDay : function () { + return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT'; + }, + lastWeek : function () { + return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : function (str) { + if (str === 'uns segundos') { + return 'nuns segundos'; + } + return 'en ' + str; + }, + past : 'hai %s', + s : 'uns segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'unha hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un ano', + yy : '%d anos' + }, + ordinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Hebrew (he) +// author : Tomer Cohen : https://github.com/tomer +// author : Moshe Simantov : https://github.com/DevelopmentIL +// author : Tal Ater : https://github.com/TalAter + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('he', { + months : 'ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר'.split('_'), + monthsShort : 'ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳'.split('_'), + weekdays : 'ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'), + weekdaysShort : '×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'), + weekdaysMin : '×_ב_×’_ד_×”_ו_ש'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [ב]MMMM YYYY', + LLL : 'D [ב]MMMM YYYY LT', + LLLL : 'dddd, D [ב]MMMM YYYY LT', + l : 'D/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY LT', + llll : 'ddd, D MMM YYYY LT' + }, + calendar : { + sameDay : '[×”×™×•× ×‘Ö¾]LT', + nextDay : '[מחר ב־]LT', + nextWeek : 'dddd [בשעה] LT', + lastDay : '[×תמול ב־]LT', + lastWeek : '[ביו×] dddd [×”×חרון בשעה] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'בעוד %s', + past : 'לפני %s', + s : 'מספר שניות', + m : 'דקה', + mm : '%d דקות', + h : 'שעה', + hh : function (number) { + if (number === 2) { + return 'שעתיי×'; + } + return number + ' שעות'; + }, + d : 'יו×', + dd : function (number) { + if (number === 2) { + return 'יומיי×'; + } + return number + ' ימי×'; + }, + M : 'חודש', + MM : function (number) { + if (number === 2) { + return 'חודשיי×'; + } + return number + ' חודשי×'; + }, + y : 'שנה', + yy : function (number) { + if (number === 2) { + return 'שנתיי×'; + } else if (number % 10 === 0 && number !== 10) { + return number + ' שנה'; + } + return number + ' שני×'; + } + } + }); +})); + +// moment.js locale configuration +// locale : hindi (hi) +// author : Mayank Singhal : https://github.com/mayanksinghal + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.defineLocale('hi', { + months : 'जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°'.split('_'), + monthsShort : 'जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.'.split('_'), + weekdays : 'रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split('_'), + weekdaysShort : 'रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split('_'), + weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split('_'), + longDateFormat : { + LT : 'A h:mm बजे', + LTS : 'A h:mm:ss बजे', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[कल] LT', + nextWeek : 'dddd, LT', + lastDay : '[कल] LT', + lastWeek : '[पिछले] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s में', + past : '%s पहले', + s : 'कà¥à¤› ही कà¥à¤·à¤£', + m : 'à¤à¤• मिनट', + mm : '%d मिनट', + h : 'à¤à¤• घंटा', + hh : '%d घंटे', + d : 'à¤à¤• दिन', + dd : '%d दिन', + M : 'à¤à¤• महीने', + MM : '%d महीने', + y : 'à¤à¤• वरà¥à¤·', + yy : '%d वरà¥à¤·' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + // Hindi notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi. + meridiemParse: /रात|सà¥à¤¬à¤¹|दोपहर|शाम/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'रात') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'सà¥à¤¬à¤¹') { + return hour; + } else if (meridiem === 'दोपहर') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'शाम') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'रात'; + } else if (hour < 10) { + return 'सà¥à¤¬à¤¹'; + } else if (hour < 17) { + return 'दोपहर'; + } else if (hour < 20) { + return 'शाम'; + } else { + return 'रात'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : hrvatski (hr) +// author : Bojan Marković : https://github.com/bmarkovic + +// based on (sl) translation by Robert SedovÅ¡ek + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } + } + + return moment.defineLocale('hr', { + months : 'sjeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_'), + monthsShort : 'sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'), + weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota'.split('_'), + weekdaysShort : 'ned._pon._uto._sri._Äet._pet._sub.'.split('_'), + weekdaysMin : 'ne_po_ut_sr_Äe_pe_su'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD. MM. YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[proÅ¡lu] dddd [u] LT'; + case 6: + return '[proÅ¡le] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[proÅ¡li] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'par sekundi', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'dan', + dd : translate, + M : 'mjesec', + MM : translate, + y : 'godinu', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : hungarian (hu) +// author : Adam Brunner : https://github.com/adambrunner + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var weekEndings = 'vasárnap hétfÅ‘n kedden szerdán csütörtökön pénteken szombaton'.split(' '); + + function translate(number, withoutSuffix, key, isFuture) { + var num = number, + suffix; + + switch (key) { + case 's': + return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce'; + case 'm': + return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'mm': + return num + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'h': + return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'hh': + return num + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'd': + return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'dd': + return num + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'M': + return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'MM': + return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'y': + return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve'); + case 'yy': + return num + (isFuture || withoutSuffix ? ' év' : ' éve'); + } + + return ''; + } + + function week(isFuture) { + return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]'; + } + + return moment.defineLocale('hu', { + months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'), + monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'), + weekdays : 'vasárnap_hétfÅ‘_kedd_szerda_csütörtök_péntek_szombat'.split('_'), + weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'), + weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'YYYY.MM.DD.', + LL : 'YYYY. MMMM D.', + LLL : 'YYYY. MMMM D., LT', + LLLL : 'YYYY. MMMM D., dddd LT' + }, + meridiemParse: /de|du/i, + isPM: function (input) { + return input.charAt(1).toLowerCase() === 'u'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower === true ? 'de' : 'DE'; + } else { + return isLower === true ? 'du' : 'DU'; + } + }, + calendar : { + sameDay : '[ma] LT[-kor]', + nextDay : '[holnap] LT[-kor]', + nextWeek : function () { + return week.call(this, true); + }, + lastDay : '[tegnap] LT[-kor]', + lastWeek : function () { + return week.call(this, false); + }, + sameElse : 'L' + }, + relativeTime : { + future : '%s múlva', + past : '%s', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Armenian (hy-am) +// author : Armendarabyan : https://github.com/armendarabyan + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€_Õ´Õ¡Ö€Õ¿_Õ¡ÕºÖ€Õ«Õ¬_Õ´Õ¡ÕµÕ«Õ½_Õ°Õ¸Ö‚Õ¶Õ«Õ½_Õ°Õ¸Ö‚Õ¬Õ«Õ½_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€'.split('_'), + 'accusative': 'Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€Õ«_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€Õ«_Õ´Õ¡Ö€Õ¿Õ«_Õ¡ÕºÖ€Õ«Õ¬Õ«_Õ´Õ¡ÕµÕ«Õ½Õ«_Õ°Õ¸Ö‚Õ¶Õ«Õ½Õ«_Õ°Õ¸Ö‚Õ¬Õ«Õ½Õ«_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½Õ«_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function monthsShortCaseReplace(m, format) { + var monthsShort = 'Õ°Õ¶Õ¾_ÖƒÕ¿Ö€_Õ´Ö€Õ¿_Õ¡ÕºÖ€_Õ´ÕµÕ½_Õ°Õ¶Õ½_Õ°Õ¬Õ½_Ö…Õ£Õ½_Õ½ÕºÕ¿_Õ°Õ¯Õ¿_Õ¶Õ´Õ¢_Õ¤Õ¯Õ¿'.split('_'); + + return monthsShort[m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = 'Õ¯Õ«Ö€Õ¡Õ¯Õ«_Õ¥Ö€Õ¯Õ¸Ö‚Õ·Õ¡Õ¢Õ©Õ«_Õ¥Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ¹Õ¸Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ°Õ«Õ¶Õ£Õ·Õ¡Õ¢Õ©Õ«_Õ¸Ö‚Ö€Õ¢Õ¡Õ©_Õ·Õ¡Õ¢Õ¡Õ©'.split('_'); + + return weekdays[m.day()]; + } + + return moment.defineLocale('hy-am', { + months : monthsCaseReplace, + monthsShort : monthsShortCaseReplace, + weekdays : weekdaysCaseReplace, + weekdaysShort : 'Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©'.split('_'), + weekdaysMin : 'Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY Õ©.', + LLL : 'D MMMM YYYY Õ©., LT', + LLLL : 'dddd, D MMMM YYYY Õ©., LT' + }, + calendar : { + sameDay: '[Õ¡ÕµÕ½Ö…Ö€] LT', + nextDay: '[Õ¾Õ¡Õ²Õ¨] LT', + lastDay: '[Õ¥Ö€Õ¥Õ¯] LT', + nextWeek: function () { + return 'dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT'; + }, + lastWeek: function () { + return '[Õ¡Õ¶ÖÕ¡Õ®] dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT'; + }, + sameElse: 'L' + }, + relativeTime : { + future : '%s Õ°Õ¥Õ¿Õ¸', + past : '%s Õ¡Õ¼Õ¡Õ»', + s : 'Õ´Õ« Ö„Õ¡Õ¶Õ« Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶', + m : 'Ö€Õ¸ÕºÕ¥', + mm : '%d Ö€Õ¸ÕºÕ¥', + h : 'ÕªÕ¡Õ´', + hh : '%d ÕªÕ¡Õ´', + d : 'Ö…Ö€', + dd : '%d Ö…Ö€', + M : 'Õ¡Õ´Õ«Õ½', + MM : '%d Õ¡Õ´Õ«Õ½', + y : 'Õ¿Õ¡Ö€Õ«', + yy : '%d Õ¿Õ¡Ö€Õ«' + }, + + meridiemParse: /Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡|Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡|ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶/, + isPM: function (input) { + return /^(ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶)$/.test(input); + }, + meridiem : function (hour) { + if (hour < 4) { + return 'Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡'; + } else if (hour < 12) { + return 'Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡'; + } else if (hour < 17) { + return 'ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡'; + } else { + return 'Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶'; + } + }, + + ordinalParse: /\d{1,2}|\d{1,2}-(Õ«Õ¶|Ö€Õ¤)/, + ordinal: function (number, period) { + switch (period) { + case 'DDD': + case 'w': + case 'W': + case 'DDDo': + if (number === 1) { + return number + '-Õ«Õ¶'; + } + return number + '-Ö€Õ¤'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Bahasa Indonesia (id) +// author : Mohammad Satrio Utomo : https://github.com/tyok +// reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('id', { + months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'), + weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'), + weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'LT.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] LT', + LLLL : 'dddd, D MMMM YYYY [pukul] LT' + }, + meridiemParse: /pagi|siang|sore|malam/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'siang') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'sore' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'siang'; + } else if (hours < 19) { + return 'sore'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Besok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kemarin pukul] LT', + lastWeek : 'dddd [lalu pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lalu', + s : 'beberapa detik', + m : 'semenit', + mm : '%d menit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : icelandic (is) +// author : Hinrik Örn Sigurðsson : https://github.com/hinrik + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function plural(n) { + if (n % 100 === 11) { + return true; + } else if (n % 10 === 1) { + return false; + } + return true; + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': + return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum'; + case 'm': + return withoutSuffix ? 'mínúta' : 'mínútu'; + case 'mm': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum'); + } else if (withoutSuffix) { + return result + 'mínúta'; + } + return result + 'mínútu'; + case 'hh': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum'); + } + return result + 'klukkustund'; + case 'd': + if (withoutSuffix) { + return 'dagur'; + } + return isFuture ? 'dag' : 'degi'; + case 'dd': + if (plural(number)) { + if (withoutSuffix) { + return result + 'dagar'; + } + return result + (isFuture ? 'daga' : 'dögum'); + } else if (withoutSuffix) { + return result + 'dagur'; + } + return result + (isFuture ? 'dag' : 'degi'); + case 'M': + if (withoutSuffix) { + return 'mánuður'; + } + return isFuture ? 'mánuð' : 'mánuði'; + case 'MM': + if (plural(number)) { + if (withoutSuffix) { + return result + 'mánuðir'; + } + return result + (isFuture ? 'mánuði' : 'mánuðum'); + } else if (withoutSuffix) { + return result + 'mánuður'; + } + return result + (isFuture ? 'mánuð' : 'mánuði'); + case 'y': + return withoutSuffix || isFuture ? 'ár' : 'ári'; + case 'yy': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'ár' : 'árum'); + } + return result + (withoutSuffix || isFuture ? 'ár' : 'ári'); + } + } + + return moment.defineLocale('is', { + months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'), + weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'), + weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'), + weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] LT', + LLLL : 'dddd, D. MMMM YYYY [kl.] LT' + }, + calendar : { + sameDay : '[í dag kl.] LT', + nextDay : '[á morgun kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[í gær kl.] LT', + lastWeek : '[síðasta] dddd [kl.] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'eftir %s', + past : 'fyrir %s síðan', + s : translate, + m : translate, + mm : translate, + h : 'klukkustund', + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : italian (it) +// author : Lorenzo : https://github.com/aliem +// author: Mattia Larentis: https://github.com/nostalgiaz + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('it', { + months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'), + monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'), + weekdays : 'Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato'.split('_'), + weekdaysShort : 'Dom_Lun_Mar_Mer_Gio_Ven_Sab'.split('_'), + weekdaysMin : 'D_L_Ma_Me_G_V_S'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Oggi alle] LT', + nextDay: '[Domani alle] LT', + nextWeek: 'dddd [alle] LT', + lastDay: '[Ieri alle] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[la scorsa] dddd [alle] LT'; + default: + return '[lo scorso] dddd [alle] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : function (s) { + return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s; + }, + past : '%s fa', + s : 'alcuni secondi', + m : 'un minuto', + mm : '%d minuti', + h : 'un\'ora', + hh : '%d ore', + d : 'un giorno', + dd : '%d giorni', + M : 'un mese', + MM : '%d mesi', + y : 'un anno', + yy : '%d anni' + }, + ordinalParse : /\d{1,2}º/, + ordinal: '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : japanese (ja) +// author : LI Long : https://github.com/baryon + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ja', { + months : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '日曜日_月曜日_ç«æ›œæ—¥_水曜日_木曜日_金曜日_土曜日'.split('_'), + weekdaysShort : 'æ—¥_月_ç«_æ°´_木_金_土'.split('_'), + weekdaysMin : 'æ—¥_月_ç«_æ°´_木_金_土'.split('_'), + longDateFormat : { + LT : 'Ah時m分', + LTS : 'LTs秒', + L : 'YYYY/MM/DD', + LL : 'YYYYå¹´M月Dæ—¥', + LLL : 'YYYYå¹´M月Dæ—¥LT', + LLLL : 'YYYYå¹´M月Dæ—¥LT dddd' + }, + meridiemParse: /åˆå‰|åˆå¾Œ/i, + isPM : function (input) { + return input === 'åˆå¾Œ'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'åˆå‰'; + } else { + return 'åˆå¾Œ'; + } + }, + calendar : { + sameDay : '[今日] LT', + nextDay : '[明日] LT', + nextWeek : '[æ¥é€±]dddd LT', + lastDay : '[昨日] LT', + lastWeek : '[å‰é€±]dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s後', + past : '%så‰', + s : '数秒', + m : '1分', + mm : '%d分', + h : '1時間', + hh : '%d時間', + d : '1æ—¥', + dd : '%dæ—¥', + M : '1ヶ月', + MM : '%dヶ月', + y : '1å¹´', + yy : '%då¹´' + } + }); +})); + +// moment.js locale configuration +// locale : Georgian (ka) +// author : Irakli Janiashvili : https://github.com/irakli-janiashvili + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'იáƒáƒœáƒ•áƒáƒ áƒ˜_თებერვáƒáƒšáƒ˜_მáƒáƒ áƒ¢áƒ˜_áƒáƒžáƒ áƒ˜áƒšáƒ˜_მáƒáƒ˜áƒ¡áƒ˜_ივნისი_ივლისი_áƒáƒ’ვისტáƒ_სექტემბერი_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი_ნáƒáƒ”მბერი_დეკემბერი'.split('_'), + 'accusative': 'იáƒáƒœáƒ•áƒáƒ áƒ¡_თებერვáƒáƒšáƒ¡_მáƒáƒ áƒ¢áƒ¡_áƒáƒžáƒ áƒ˜áƒšáƒ˜áƒ¡_მáƒáƒ˜áƒ¡áƒ¡_ივნისს_ივლისს_áƒáƒ’ვისტს_სექტემბერს_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერს_ნáƒáƒ”მბერს_დეკემბერს'.split('_') + }, + + nounCase = (/D[oD] *MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'კვირáƒ_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ი_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი_ხუთშáƒáƒ‘áƒáƒ—ი_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი_შáƒáƒ‘áƒáƒ—ი'.split('_'), + 'accusative': 'კვირáƒáƒ¡_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ს_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ს_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ს_ხუთშáƒáƒ‘áƒáƒ—ს_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვს_შáƒáƒ‘áƒáƒ—ს'.split('_') + }, + + nounCase = (/(წინáƒ|შემდეგ)/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.defineLocale('ka', { + months : monthsCaseReplace, + monthsShort : 'იáƒáƒœ_თებ_მáƒáƒ _áƒáƒžáƒ _მáƒáƒ˜_ივნ_ივლ_áƒáƒ’ვ_სექ_áƒáƒ¥áƒ¢_ნáƒáƒ”_დეკ'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'კვი_áƒáƒ áƒ¨_სáƒáƒ›_áƒáƒ—ხ_ხუთ_პáƒáƒ _შáƒáƒ‘'.split('_'), + weekdaysMin : 'კვ_áƒáƒ _სáƒ_áƒáƒ—_ხუ_პáƒ_შáƒ'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[დღეს] LT[-ზე]', + nextDay : '[ხვáƒáƒš] LT[-ზე]', + lastDay : '[გუშინ] LT[-ზე]', + nextWeek : '[შემდეგ] dddd LT[-ზე]', + lastWeek : '[წინáƒ] dddd LT-ზე', + sameElse : 'L' + }, + relativeTime : { + future : function (s) { + return (/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|წელი)/).test(s) ? + s.replace(/ი$/, 'ში') : + s + 'ში'; + }, + past : function (s) { + if ((/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|დღე|თვე)/).test(s)) { + return s.replace(/(ი|ე)$/, 'ის წინ'); + } + if ((/წელი/).test(s)) { + return s.replace(/წელი$/, 'წლის წინ'); + } + }, + s : 'რáƒáƒ›áƒ“ენიმე წáƒáƒ›áƒ˜', + m : 'წუთი', + mm : '%d წუთი', + h : 'სáƒáƒáƒ—ი', + hh : '%d სáƒáƒáƒ—ი', + d : 'დღე', + dd : '%d დღე', + M : 'თვე', + MM : '%d თვე', + y : 'წელი', + yy : '%d წელი' + }, + ordinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/, + ordinal : function (number) { + if (number === 0) { + return number; + } + + if (number === 1) { + return number + '-ლი'; + } + + if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) { + return 'მე-' + number; + } + + return number + '-ე'; + }, + week : { + dow : 1, + doy : 7 + } + }); +})); + +// moment.js locale configuration +// locale : khmer (km) +// author : Kruy Vanna : https://github.com/kruyvanna + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('km', { + months: 'មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ'.split('_'), + monthsShort: 'មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ'.split('_'), + weekdays: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), + weekdaysShort: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), + weekdaysMin: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS : 'LT:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd, D MMMM YYYY LT' + }, + calendar: { + sameDay: '[ážáŸ’ងៃនៈ ម៉ោង] LT', + nextDay: '[ស្អែក ម៉ោង] LT', + nextWeek: 'dddd [ម៉ោង] LT', + lastDay: '[ម្សិលមិញ ម៉ោង] LT', + lastWeek: 'dddd [សប្ážáž¶áž áŸáž˜áž»áž“] [ម៉ោង] LT', + sameElse: 'L' + }, + relativeTime: { + future: '%sទៀáž', + past: '%sមុន', + s: 'ប៉ុន្មានវិនាទី', + m: 'មួយនាទី', + mm: '%d នាទី', + h: 'មួយម៉ោង', + hh: '%d ម៉ោង', + d: 'មួយážáŸ’ងៃ', + dd: '%d ážáŸ’ងៃ', + M: 'មួយážáŸ‚', + MM: '%d ážáŸ‚', + y: 'មួយឆ្នាំ', + yy: '%d ឆ្នាំ' + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : korean (ko) +// +// authors +// +// - Kyungwook, Park : https://github.com/kyungw00k +// - Jeeeyul Lee +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ko', { + months : '1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”'.split('_'), + monthsShort : '1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”'.split('_'), + weekdays : 'ì¼ìš”ì¼_월요ì¼_화요ì¼_수요ì¼_목요ì¼_금요ì¼_토요ì¼'.split('_'), + weekdaysShort : 'ì¼_ì›”_í™”_수_목_금_토'.split('_'), + weekdaysMin : 'ì¼_ì›”_í™”_수_목_금_토'.split('_'), + longDateFormat : { + LT : 'A hì‹œ m분', + LTS : 'A hì‹œ m분 sì´ˆ', + L : 'YYYY.MM.DD', + LL : 'YYYYë…„ MMMM Dì¼', + LLL : 'YYYYë…„ MMMM Dì¼ LT', + LLLL : 'YYYYë…„ MMMM Dì¼ dddd LT' + }, + calendar : { + sameDay : '오늘 LT', + nextDay : 'ë‚´ì¼ LT', + nextWeek : 'dddd LT', + lastDay : 'ì–´ì œ LT', + lastWeek : '지난주 dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s 후', + past : '%s ì „', + s : '몇초', + ss : '%dì´ˆ', + m : 'ì¼ë¶„', + mm : '%d분', + h : '한시간', + hh : '%d시간', + d : '하루', + dd : '%dì¼', + M : '한달', + MM : '%d달', + y : 'ì¼ë…„', + yy : '%dë…„' + }, + ordinalParse : /\d{1,2}ì¼/, + ordinal : '%dì¼', + meridiemParse : /오전|오후/, + isPM : function (token) { + return token === '오후'; + }, + meridiem : function (hour, minute, isUpper) { + return hour < 12 ? '오전' : '오후'; + } + }); +})); + +// moment.js locale configuration +// locale : Luxembourgish (lb) +// author : mweimerskirch : https://github.com/mweimerskirch, David Raison : https://github.com/kwisatz + +// Note: Luxembourgish has a very particular phonological rule ('Eifeler Regel') that causes the +// deletion of the final 'n' in certain contexts. That's what the 'eifelerRegelAppliesToWeekday' +// and 'eifelerRegelAppliesToNumber' methods are meant for + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eng Minutt', 'enger Minutt'], + 'h': ['eng Stonn', 'enger Stonn'], + 'd': ['een Dag', 'engem Dag'], + 'M': ['ee Mount', 'engem Mount'], + 'y': ['ee Joer', 'engem Joer'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + function processFutureTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'a ' + string; + } + return 'an ' + string; + } + + function processPastTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'viru ' + string; + } + return 'virun ' + string; + } + + /** + * Returns true if the word before the given number loses the '-n' ending. + * e.g. 'an 10 Deeg' but 'a 5 Deeg' + * + * @param number {integer} + * @returns {boolean} + */ + function eifelerRegelAppliesToNumber(number) { + number = parseInt(number, 10); + if (isNaN(number)) { + return false; + } + if (number < 0) { + // Negative Number --> always true + return true; + } else if (number < 10) { + // Only 1 digit + if (4 <= number && number <= 7) { + return true; + } + return false; + } else if (number < 100) { + // 2 digits + var lastDigit = number % 10, firstDigit = number / 10; + if (lastDigit === 0) { + return eifelerRegelAppliesToNumber(firstDigit); + } + return eifelerRegelAppliesToNumber(lastDigit); + } else if (number < 10000) { + // 3 or 4 digits --> recursively check first digit + while (number >= 10) { + number = number / 10; + } + return eifelerRegelAppliesToNumber(number); + } else { + // Anything larger than 4 digits: recursively check first n-3 digits + number = number / 1000; + return eifelerRegelAppliesToNumber(number); + } + } + + return moment.defineLocale('lb', { + months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'), + weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'), + weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'), + longDateFormat: { + LT: 'H:mm [Auer]', + LTS: 'H:mm:ss [Auer]', + L: 'DD.MM.YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY LT', + LLLL: 'dddd, D. MMMM YYYY LT' + }, + calendar: { + sameDay: '[Haut um] LT', + sameElse: 'L', + nextDay: '[Muer um] LT', + nextWeek: 'dddd [um] LT', + lastDay: '[Gëschter um] LT', + lastWeek: function () { + // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule + switch (this.day()) { + case 2: + case 4: + return '[Leschten] dddd [um] LT'; + default: + return '[Leschte] dddd [um] LT'; + } + } + }, + relativeTime : { + future : processFutureTime, + past : processPastTime, + s : 'e puer Sekonnen', + m : processRelativeTime, + mm : '%d Minutten', + h : processRelativeTime, + hh : '%d Stonnen', + d : processRelativeTime, + dd : '%d Deeg', + M : processRelativeTime, + MM : '%d Méint', + y : processRelativeTime, + yy : '%d Joer' + }, + ordinalParse: /\d{1,2}\./, + ordinal: '%d.', + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Lithuanian (lt) +// author : Mindaugas MozÅ«ras : https://github.com/mmozuras + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var units = { + 'm' : 'minutÄ—_minutÄ—s_minutÄ™', + 'mm': 'minutÄ—s_minuÄių_minutes', + 'h' : 'valanda_valandos_valandÄ…', + 'hh': 'valandos_valandų_valandas', + 'd' : 'diena_dienos_dienÄ…', + 'dd': 'dienos_dienų_dienas', + 'M' : 'mÄ—nuo_mÄ—nesio_mÄ—nesį', + 'MM': 'mÄ—nesiai_mÄ—nesių_mÄ—nesius', + 'y' : 'metai_metų_metus', + 'yy': 'metai_metų_metus' + }, + weekDays = 'sekmadienis_pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis'.split('_'); + + function translateSeconds(number, withoutSuffix, key, isFuture) { + if (withoutSuffix) { + return 'kelios sekundÄ—s'; + } else { + return isFuture ? 'kelių sekundžių' : 'kelias sekundes'; + } + } + + function translateSingular(number, withoutSuffix, key, isFuture) { + return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]); + } + + function special(number) { + return number % 10 === 0 || (number > 10 && number < 20); + } + + function forms(key) { + return units[key].split('_'); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + if (number === 1) { + return result + translateSingular(number, withoutSuffix, key[0], isFuture); + } else if (withoutSuffix) { + return result + (special(number) ? forms(key)[1] : forms(key)[0]); + } else { + if (isFuture) { + return result + forms(key)[1]; + } else { + return result + (special(number) ? forms(key)[1] : forms(key)[2]); + } + } + } + + function relativeWeekDay(moment, format) { + var nominative = format.indexOf('dddd HH:mm') === -1, + weekDay = weekDays[moment.day()]; + + return nominative ? weekDay : weekDay.substring(0, weekDay.length - 2) + 'į'; + } + + return moment.defineLocale('lt', { + months : 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio'.split('_'), + monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'), + weekdays : relativeWeekDay, + weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Å eÅ¡'.split('_'), + weekdaysMin : 'S_P_A_T_K_Pn_Å '.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY [m.] MMMM D [d.]', + LLL : 'YYYY [m.] MMMM D [d.], LT [val.]', + LLLL : 'YYYY [m.] MMMM D [d.], dddd, LT [val.]', + l : 'YYYY-MM-DD', + ll : 'YYYY [m.] MMMM D [d.]', + lll : 'YYYY [m.] MMMM D [d.], LT [val.]', + llll : 'YYYY [m.] MMMM D [d.], ddd, LT [val.]' + }, + calendar : { + sameDay : '[Å iandien] LT', + nextDay : '[Rytoj] LT', + nextWeek : 'dddd LT', + lastDay : '[Vakar] LT', + lastWeek : '[PraÄ—jusį] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : 'po %s', + past : 'prieÅ¡ %s', + s : translateSeconds, + m : translateSingular, + mm : translate, + h : translateSingular, + hh : translate, + d : translateSingular, + dd : translate, + M : translateSingular, + MM : translate, + y : translateSingular, + yy : translate + }, + ordinalParse: /\d{1,2}-oji/, + ordinal : function (number) { + return number + '-oji'; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : latvian (lv) +// author : Kristaps Karlsons : https://github.com/skakri + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var units = { + 'mm': 'minÅ«ti_minÅ«tes_minÅ«te_minÅ«tes', + 'hh': 'stundu_stundas_stunda_stundas', + 'dd': 'dienu_dienas_diena_dienas', + 'MM': 'mÄ“nesi_mÄ“neÅ¡us_mÄ“nesis_mÄ“neÅ¡i', + 'yy': 'gadu_gadus_gads_gadi' + }; + + function format(word, number, withoutSuffix) { + var forms = word.split('_'); + if (withoutSuffix) { + return number % 10 === 1 && number !== 11 ? forms[2] : forms[3]; + } else { + return number % 10 === 1 && number !== 11 ? forms[0] : forms[1]; + } + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + return number + ' ' + format(units[key], number, withoutSuffix); + } + + return moment.defineLocale('lv', { + months : 'janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jÅ«n_jÅ«l_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'svÄ“tdiena_pirmdiena_otrdiena_treÅ¡diena_ceturtdiena_piektdiena_sestdiena'.split('_'), + weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'), + weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'YYYY. [gada] D. MMMM', + LLL : 'YYYY. [gada] D. MMMM, LT', + LLLL : 'YYYY. [gada] D. MMMM, dddd, LT' + }, + calendar : { + sameDay : '[Å odien pulksten] LT', + nextDay : '[RÄ«t pulksten] LT', + nextWeek : 'dddd [pulksten] LT', + lastDay : '[Vakar pulksten] LT', + lastWeek : '[PagÄjuÅ¡Ä] dddd [pulksten] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s vÄ“lÄk', + past : '%s agrÄk', + s : 'dažas sekundes', + m : 'minÅ«ti', + mm : relativeTimeWithPlural, + h : 'stundu', + hh : relativeTimeWithPlural, + d : 'dienu', + dd : relativeTimeWithPlural, + M : 'mÄ“nesi', + MM : relativeTimeWithPlural, + y : 'gadu', + yy : relativeTimeWithPlural + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : macedonian (mk) +// author : Borislav Mickov : https://github.com/B0k0 + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('mk', { + months : 'јануари_февруари_март_април_мај_јуни_јули_авгуÑÑ‚_Ñептември_октомври_ноември_декември'.split('_'), + monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_Ñеп_окт_ное_дек'.split('_'), + weekdays : 'недела_понеделник_вторник_Ñреда_четврток_петок_Ñабота'.split('_'), + weekdaysShort : 'нед_пон_вто_Ñре_чет_пет_Ñаб'.split('_'), + weekdaysMin : 'нe_пo_вт_ÑÑ€_че_пе_Ña'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'D.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Ð”ÐµÐ½ÐµÑ Ð²Ð¾] LT', + nextDay : '[Утре во] LT', + nextWeek : 'dddd [во] LT', + lastDay : '[Вчера во] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[Во изминатата] dddd [во] LT'; + case 1: + case 2: + case 4: + case 5: + return '[Во изминатиот] dddd [во] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'поÑле %s', + past : 'пред %s', + s : 'неколку Ñекунди', + m : 'минута', + mm : '%d минути', + h : 'чаÑ', + hh : '%d чаÑа', + d : 'ден', + dd : '%d дена', + M : 'меÑец', + MM : '%d меÑеци', + y : 'година', + yy : '%d години' + }, + ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : malayalam (ml) +// author : Floyd Pink : https://github.com/floydpink + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ml', { + months : 'ജനàµà´µà´°à´¿_ഫെബàµà´°àµà´µà´°à´¿_മാർചàµà´šàµ_à´à´ªàµà´°à´¿àµ½_മേയàµ_ജൂൺ_ജൂലൈ_à´“à´—à´¸àµà´±àµà´±àµ_സെപàµà´±àµà´±à´‚ബർ_à´’à´•àµà´Ÿàµ‹à´¬àµ¼_നവംബർ_ഡിസംബർ'.split('_'), + monthsShort : 'ജനàµ._ഫെബàµà´°àµ._മാർ._à´à´ªàµà´°à´¿._മേയàµ_ജൂൺ_ജൂലൈ._à´“à´—._സെപàµà´±àµà´±._à´’à´•àµà´Ÿàµ‹._നവം._ഡിസം.'.split('_'), + weekdays : 'ഞായറാഴàµà´š_തിങàµà´•à´³à´¾à´´àµà´š_ചൊവàµà´µà´¾à´´àµà´š_à´¬àµà´§à´¨à´¾à´´àµà´š_à´µàµà´¯à´¾à´´à´¾à´´àµà´š_വെളàµà´³à´¿à´¯à´¾à´´àµà´š_ശനിയാഴàµà´š'.split('_'), + weekdaysShort : 'ഞായർ_തിങàµà´•àµ¾_ചൊവàµà´µ_à´¬àµà´§àµ»_à´µàµà´¯à´¾à´´à´‚_വെളàµà´³à´¿_ശനി'.split('_'), + weekdaysMin : 'à´žà´¾_തി_ചൊ_à´¬àµ_à´µàµà´¯à´¾_വെ_à´¶'.split('_'), + longDateFormat : { + LT : 'A h:mm -à´¨àµ', + LTS : 'A h:mm:ss -à´¨àµ', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[ഇനàµà´¨àµ] LT', + nextDay : '[നാളെ] LT', + nextWeek : 'dddd, LT', + lastDay : '[ഇനàµà´¨à´²àµ†] LT', + lastWeek : '[à´•à´´à´¿à´žàµà´ž] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s à´•à´´à´¿à´žàµà´žàµ', + past : '%s à´®àµàµ»à´ªàµ', + s : 'അൽപ നിമിഷങàµà´™àµ¾', + m : 'ഒരൠമിനിറàµà´±àµ', + mm : '%d മിനിറàµà´±àµ', + h : 'ഒരൠമണികàµà´•àµ‚ർ', + hh : '%d മണികàµà´•àµ‚ർ', + d : 'ഒരൠദിവസം', + dd : '%d ദിവസം', + M : 'ഒരൠമാസം', + MM : '%d മാസം', + y : 'ഒരൠവർഷം', + yy : '%d വർഷം' + }, + meridiemParse: /രാതàµà´°à´¿|രാവിലെ|ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿/i, + isPM : function (input) { + return /^(ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'രാതàµà´°à´¿'; + } else if (hour < 12) { + return 'രാവിലെ'; + } else if (hour < 17) { + return 'ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ'; + } else if (hour < 20) { + return 'വൈകàµà´¨àµà´¨àµ‡à´°à´‚'; + } else { + return 'രാതàµà´°à´¿'; + } + } + }); +})); + +// moment.js locale configuration +// locale : Marathi (mr) +// author : Harshad Kale : https://github.com/kalehv + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.defineLocale('mr', { + months : 'जानेवारी_फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€_मारà¥à¤š_à¤à¤ªà¥à¤°à¤¿à¤²_मे_जून_जà¥à¤²à¥ˆ_ऑगसà¥à¤Ÿ_सपà¥à¤Ÿà¥‡à¤‚बर_ऑकà¥à¤Ÿà¥‹à¤¬à¤°_नोवà¥à¤¹à¥‡à¤‚बर_डिसेंबर'.split('_'), + monthsShort: 'जाने._फेबà¥à¤°à¥._मारà¥à¤š._à¤à¤ªà¥à¤°à¤¿._मे._जून._जà¥à¤²à¥ˆ._ऑग._सपà¥à¤Ÿà¥‡à¤‚._ऑकà¥à¤Ÿà¥‹._नोवà¥à¤¹à¥‡à¤‚._डिसें.'.split('_'), + weekdays : 'रविवार_सोमवार_मंगळवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split('_'), + weekdaysShort : 'रवि_सोम_मंगळ_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split('_'), + weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split('_'), + longDateFormat : { + LT : 'A h:mm वाजता', + LTS : 'A h:mm:ss वाजता', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[उदà¥à¤¯à¤¾] LT', + nextWeek : 'dddd, LT', + lastDay : '[काल] LT', + lastWeek: '[मागील] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s नंतर', + past : '%s पूरà¥à¤µà¥€', + s : 'सेकंद', + m: 'à¤à¤• मिनिट', + mm: '%d मिनिटे', + h : 'à¤à¤• तास', + hh : '%d तास', + d : 'à¤à¤• दिवस', + dd : '%d दिवस', + M : 'à¤à¤• महिना', + MM : '%d महिने', + y : 'à¤à¤• वरà¥à¤·', + yy : '%d वरà¥à¤·à¥‡' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /रातà¥à¤°à¥€|सकाळी|दà¥à¤ªà¤¾à¤°à¥€|सायंकाळी/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'रातà¥à¤°à¥€') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'सकाळी') { + return hour; + } else if (meridiem === 'दà¥à¤ªà¤¾à¤°à¥€') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'सायंकाळी') { + return hour + 12; + } + }, + meridiem: function (hour, minute, isLower) + { + if (hour < 4) { + return 'रातà¥à¤°à¥€'; + } else if (hour < 10) { + return 'सकाळी'; + } else if (hour < 17) { + return 'दà¥à¤ªà¤¾à¤°à¥€'; + } else if (hour < 20) { + return 'सायंकाळी'; + } else { + return 'रातà¥à¤°à¥€'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Bahasa Malaysia (ms-MY) +// author : Weldan Jamili : https://github.com/weldan + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('ms-my', { + months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), + monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), + weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), + weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), + weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'LT.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] LT', + LLLL : 'dddd, D MMMM YYYY [pukul] LT' + }, + meridiemParse: /pagi|tengahari|petang|malam/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'tengahari') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'petang' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'tengahari'; + } else if (hours < 19) { + return 'petang'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Esok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kelmarin pukul] LT', + lastWeek : 'dddd [lepas pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lepas', + s : 'beberapa saat', + m : 'seminit', + mm : '%d minit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Burmese (my) +// author : Squar team, mysquar.com + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': 'á', + '2': 'á‚', + '3': 'áƒ', + '4': 'á„', + '5': 'á…', + '6': 'á†', + '7': 'á‡', + '8': 'áˆ', + '9': 'á‰', + '0': 'á€' + }, numberMap = { + 'á': '1', + 'á‚': '2', + 'áƒ': '3', + 'á„': '4', + 'á…': '5', + 'á†': '6', + 'á‡': '7', + 'áˆ': '8', + 'á‰': '9', + 'á€': '0' + }; + return moment.defineLocale('my', { + months: 'ဇန်နá€á€«á€›á€®_ဖေဖော်á€á€«á€›á€®_မá€á€º_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုá€á€º_စက်á€á€„်ဘာ_အောက်á€á€­á€¯á€˜á€¬_နိုá€á€„်ဘာ_ဒီဇင်ဘာ'.split('_'), + monthsShort: 'ဇန်_ဖေ_မá€á€º_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'), + weekdays: 'á€á€”င်္ဂနွေ_á€á€”င်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပá€á€±á€¸_သောကြာ_စနေ'.split('_'), + weekdaysShort: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), + weekdaysMin: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd D MMMM YYYY LT' + }, + calendar: { + sameDay: '[ယနေ.] LT [မှာ]', + nextDay: '[မနက်ဖြန်] LT [မှာ]', + nextWeek: 'dddd LT [မှာ]', + lastDay: '[မနေ.က] LT [မှာ]', + lastWeek: '[ပြီးá€á€²á€·á€žá€±á€¬] dddd LT [မှာ]', + sameElse: 'L' + }, + relativeTime: { + future: 'လာမည့် %s မှာ', + past: 'လွန်á€á€²á€·á€žá€±á€¬ %s က', + s: 'စက္ကန်.အနည်းငယ်', + m: 'á€á€…်မိနစ်', + mm: '%d မိနစ်', + h: 'á€á€…်နာရီ', + hh: '%d နာရီ', + d: 'á€á€…်ရက်', + dd: '%d ရက်', + M: 'á€á€…်လ', + MM: '%d လ', + y: 'á€á€…်နှစ်', + yy: '%d နှစ်' + }, + preparse: function (string) { + return string.replace(/[áá‚áƒá„á…á†á‡áˆá‰á€]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : norwegian bokmÃ¥l (nb) +// authors : Espen Hovlandsdal : https://github.com/rexxars +// Sigurd Gartmann : https://github.com/sigurdga + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('nb', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), + weekdaysShort : 'søn_man_tirs_ons_tors_fre_lør'.split('_'), + weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'H.mm', + LTS : 'LT.ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] LT', + LLLL : 'dddd D. MMMM YYYY [kl.] LT' + }, + calendar : { + sameDay: '[i dag kl.] LT', + nextDay: '[i morgen kl.] LT', + nextWeek: 'dddd [kl.] LT', + lastDay: '[i gÃ¥r kl.] LT', + lastWeek: '[forrige] dddd [kl.] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'for %s siden', + s : 'noen sekunder', + m : 'ett minutt', + mm : '%d minutter', + h : 'en time', + hh : '%d timer', + d : 'en dag', + dd : '%d dager', + M : 'en mÃ¥ned', + MM : '%d mÃ¥neder', + y : 'ett Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : nepali/nepalese +// author : suvash : https://github.com/suvash + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.defineLocale('ne', { + months : 'जनवरी_फेबà¥à¤°à¥à¤µà¤°à¥€_मारà¥à¤š_अपà¥à¤°à¤¿à¤²_मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ_अगषà¥à¤Ÿ_सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°_अकà¥à¤Ÿà¥‹à¤¬à¤°_नोभेमà¥à¤¬à¤°_डिसेमà¥à¤¬à¤°'.split('_'), + monthsShort : 'जन._फेबà¥à¤°à¥._मारà¥à¤š_अपà¥à¤°à¤¿._मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ._अग._सेपà¥à¤Ÿ._अकà¥à¤Ÿà¥‹._नोभे._डिसे.'.split('_'), + weekdays : 'आइतबार_सोमबार_मङà¥à¤—लबार_बà¥à¤§à¤¬à¤¾à¤°_बिहिबार_शà¥à¤•à¥à¤°à¤¬à¤¾à¤°_शनिबार'.split('_'), + weekdaysShort : 'आइत._सोम._मङà¥à¤—ल._बà¥à¤§._बिहि._शà¥à¤•à¥à¤°._शनि.'.split('_'), + weekdaysMin : 'आइ._सो._मङà¥_बà¥._बि._शà¥._श.'.split('_'), + longDateFormat : { + LT : 'Aको h:mm बजे', + LTS : 'Aको h:mm:ss बजे', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /राती|बिहान|दिउà¤à¤¸à¥‹|बेलà¥à¤•à¤¾|साà¤à¤|राती/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'राती') { + return hour < 3 ? hour : hour + 12; + } else if (meridiem === 'बिहान') { + return hour; + } else if (meridiem === 'दिउà¤à¤¸à¥‹') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'बेलà¥à¤•à¤¾' || meridiem === 'साà¤à¤') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 3) { + return 'राती'; + } else if (hour < 10) { + return 'बिहान'; + } else if (hour < 15) { + return 'दिउà¤à¤¸à¥‹'; + } else if (hour < 18) { + return 'बेलà¥à¤•à¤¾'; + } else if (hour < 20) { + return 'साà¤à¤'; + } else { + return 'राती'; + } + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[भोली] LT', + nextWeek : '[आउà¤à¤¦à¥‹] dddd[,] LT', + lastDay : '[हिजो] LT', + lastWeek : '[गà¤à¤•à¥‹] dddd[,] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%sमा', + past : '%s अगाडी', + s : 'केही समय', + m : 'à¤à¤• मिनेट', + mm : '%d मिनेट', + h : 'à¤à¤• घणà¥à¤Ÿà¤¾', + hh : '%d घणà¥à¤Ÿà¤¾', + d : 'à¤à¤• दिन', + dd : '%d दिन', + M : 'à¤à¤• महिना', + MM : '%d महिना', + y : 'à¤à¤• बरà¥à¤·', + yy : '%d बरà¥à¤·' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : dutch (nl) +// author : Joris Röling : https://github.com/jjupiter + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); + + return moment.defineLocale('nl', { + months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), + weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), + weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[vandaag om] LT', + nextDay: '[morgen om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[gisteren om] LT', + lastWeek: '[afgelopen] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'over %s', + past : '%s geleden', + s : 'een paar seconden', + m : 'één minuut', + mm : '%d minuten', + h : 'één uur', + hh : '%d uur', + d : 'één dag', + dd : '%d dagen', + M : 'één maand', + MM : '%d maanden', + y : 'één jaar', + yy : '%d jaar' + }, + ordinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : norwegian nynorsk (nn) +// author : https://github.com/mechuwind + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('nn', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sundag_mÃ¥ndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'), + weekdaysShort : 'sun_mÃ¥n_tys_ons_tor_fre_lau'.split('_'), + weekdaysMin : 'su_mÃ¥_ty_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[I dag klokka] LT', + nextDay: '[I morgon klokka] LT', + nextWeek: 'dddd [klokka] LT', + lastDay: '[I gÃ¥r klokka] LT', + lastWeek: '[FøregÃ¥ande] dddd [klokka] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'for %s sidan', + s : 'nokre sekund', + m : 'eit minutt', + mm : '%d minutt', + h : 'ein time', + hh : '%d timar', + d : 'ein dag', + dd : '%d dagar', + M : 'ein mÃ¥nad', + MM : '%d mÃ¥nader', + y : 'eit Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : polish (pl) +// author : Rafal Hirsz : https://github.com/evoL + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var monthsNominative = 'styczeÅ„_luty_marzec_kwiecieÅ„_maj_czerwiec_lipiec_sierpieÅ„_wrzesieÅ„_październik_listopad_grudzieÅ„'.split('_'), + monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrzeÅ›nia_października_listopada_grudnia'.split('_'); + + function plural(n) { + return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1); + } + + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'minuta' : 'minutÄ™'; + case 'mm': + return result + (plural(number) ? 'minuty' : 'minut'); + case 'h': + return withoutSuffix ? 'godzina' : 'godzinÄ™'; + case 'hh': + return result + (plural(number) ? 'godziny' : 'godzin'); + case 'MM': + return result + (plural(number) ? 'miesiÄ…ce' : 'miesiÄ™cy'); + case 'yy': + return result + (plural(number) ? 'lata' : 'lat'); + } + } + + return moment.defineLocale('pl', { + months : function (momentToFormat, format) { + if (/D MMMM/.test(format)) { + return monthsSubjective[momentToFormat.month()]; + } else { + return monthsNominative[momentToFormat.month()]; + } + }, + monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'), + weekdays : 'niedziela_poniedziaÅ‚ek_wtorek_Å›roda_czwartek_piÄ…tek_sobota'.split('_'), + weekdaysShort : 'nie_pon_wt_Å›r_czw_pt_sb'.split('_'), + weekdaysMin : 'N_Pn_Wt_Åšr_Cz_Pt_So'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay: '[DziÅ› o] LT', + nextDay: '[Jutro o] LT', + nextWeek: '[W] dddd [o] LT', + lastDay: '[Wczoraj o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[W zeszÅ‚Ä… niedzielÄ™ o] LT'; + case 3: + return '[W zeszÅ‚Ä… Å›rodÄ™ o] LT'; + case 6: + return '[W zeszÅ‚Ä… sobotÄ™ o] LT'; + default: + return '[W zeszÅ‚y] dddd [o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : '%s temu', + s : 'kilka sekund', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : '1 dzieÅ„', + dd : '%d dni', + M : 'miesiÄ…c', + MM : translate, + y : 'rok', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : brazilian portuguese (pt-br) +// author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('pt-br', { + months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), + monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), + weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'), + weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'), + weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY [às] LT', + LLLL : 'dddd, D [de] MMMM [de] YYYY [às] LT' + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : 'em %s', + past : '%s atrás', + s : 'segundos', + m : 'um minuto', + mm : '%d minutos', + h : 'uma hora', + hh : '%d horas', + d : 'um dia', + dd : '%d dias', + M : 'um mês', + MM : '%d meses', + y : 'um ano', + yy : '%d anos' + }, + ordinalParse: /\d{1,2}º/, + ordinal : '%dº' + }); +})); + +// moment.js locale configuration +// locale : portuguese (pt) +// author : Jefferson : https://github.com/jalex79 + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('pt', { + months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), + monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), + weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'), + weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'), + weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY LT', + LLLL : 'dddd, D [de] MMMM [de] YYYY LT' + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : 'em %s', + past : 'há %s', + s : 'segundos', + m : 'um minuto', + mm : '%d minutos', + h : 'uma hora', + hh : '%d horas', + d : 'um dia', + dd : '%d dias', + M : 'um mês', + MM : '%d meses', + y : 'um ano', + yy : '%d anos' + }, + ordinalParse: /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : romanian (ro) +// author : Vlad Gurdiga : https://github.com/gurdiga +// author : Valentin Agachi : https://github.com/avaly + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': 'minute', + 'hh': 'ore', + 'dd': 'zile', + 'MM': 'luni', + 'yy': 'ani' + }, + separator = ' '; + if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) { + separator = ' de '; + } + + return number + separator + format[key]; + } + + return moment.defineLocale('ro', { + months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'), + monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'), + weekdays : 'duminică_luni_marÈ›i_miercuri_joi_vineri_sâmbătă'.split('_'), + weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'), + weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY H:mm', + LLLL : 'dddd, D MMMM YYYY H:mm' + }, + calendar : { + sameDay: '[azi la] LT', + nextDay: '[mâine la] LT', + nextWeek: 'dddd [la] LT', + lastDay: '[ieri la] LT', + lastWeek: '[fosta] dddd [la] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'peste %s', + past : '%s în urmă', + s : 'câteva secunde', + m : 'un minut', + mm : relativeTimeWithPlural, + h : 'o oră', + hh : relativeTimeWithPlural, + d : 'o zi', + dd : relativeTimeWithPlural, + M : 'o lună', + MM : relativeTimeWithPlural, + y : 'un an', + yy : relativeTimeWithPlural + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : russian (ru) +// author : Viktorminator : https://github.com/Viktorminator +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут', + 'hh': 'чаÑ_чаÑа_чаÑов', + 'dd': 'день_днÑ_дней', + 'MM': 'меÑÑц_меÑÑца_меÑÑцев', + 'yy': 'год_года_лет' + }; + if (key === 'm') { + return withoutSuffix ? 'минута' : 'минуту'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь'.split('_'), + 'accusative': 'ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function monthsShortCaseReplace(m, format) { + var monthsShort = { + 'nominative': 'Ñнв_фев_март_апр_май_июнь_июль_авг_Ñен_окт_ноÑ_дек'.split('_'), + 'accusative': 'Ñнв_фев_мар_апр_маÑ_июнÑ_июлÑ_авг_Ñен_окт_ноÑ_дек'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return monthsShort[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота'.split('_'), + 'accusative': 'воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу'.split('_') + }, + + nounCase = (/\[ ?[Вв] ?(?:прошлую|Ñледующую|Ñту)? ?\] ?dddd/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.defineLocale('ru', { + months : monthsCaseReplace, + monthsShort : monthsShortCaseReplace, + weekdays : weekdaysCaseReplace, + weekdaysShort : 'вÑ_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + weekdaysMin : 'вÑ_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + monthsParse : [/^Ñнв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[й|Ñ]/i, /^июн/i, /^июл/i, /^авг/i, /^Ñен/i, /^окт/i, /^ноÑ/i, /^дек/i], + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY г.', + LLL : 'D MMMM YYYY г., LT', + LLLL : 'dddd, D MMMM YYYY г., LT' + }, + calendar : { + sameDay: '[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT', + nextDay: '[Завтра в] LT', + lastDay: '[Вчера в] LT', + nextWeek: function () { + return this.day() === 2 ? '[Во] dddd [в] LT' : '[Ð’] dddd [в] LT'; + }, + lastWeek: function (now) { + if (now.week() !== this.week()) { + switch (this.day()) { + case 0: + return '[Ð’ прошлое] dddd [в] LT'; + case 1: + case 2: + case 4: + return '[Ð’ прошлый] dddd [в] LT'; + case 3: + case 5: + case 6: + return '[Ð’ прошлую] dddd [в] LT'; + } + } else { + if (this.day() === 2) { + return '[Во] dddd [в] LT'; + } else { + return '[Ð’] dddd [в] LT'; + } + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'через %s', + past : '%s назад', + s : 'неÑколько Ñекунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : 'чаÑ', + hh : relativeTimeWithPlural, + d : 'день', + dd : relativeTimeWithPlural, + M : 'меÑÑц', + MM : relativeTimeWithPlural, + y : 'год', + yy : relativeTimeWithPlural + }, + + meridiemParse: /ночи|утра|днÑ|вечера/i, + isPM : function (input) { + return /^(днÑ|вечера)$/.test(input); + }, + + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночи'; + } else if (hour < 12) { + return 'утра'; + } else if (hour < 17) { + return 'днÑ'; + } else { + return 'вечера'; + } + }, + + ordinalParse: /\d{1,2}-(й|го|Ñ)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + return number + '-й'; + case 'D': + return number + '-го'; + case 'w': + case 'W': + return number + '-Ñ'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : slovak (sk) +// author : Martin Minka : https://github.com/k2s +// based on work of petrbela : https://github.com/petrbela + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'), + monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_'); + + function plural(n) { + return (n > 1) && (n < 5); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami'; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minúty' : 'minút'); + } else { + return result + 'minútami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodín'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'deň' : 'dňom'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dni' : 'dní'); + } else { + return result + 'dňami'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'mesiace' : 'mesiacov'); + } else { + return result + 'mesiacmi'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokom'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'rokov'); + } else { + return result + 'rokmi'; + } + break; + } + } + + return moment.defineLocale('sk', { + months : months, + monthsShort : monthsShort, + monthsParse : (function (months, monthsShort) { + var i, _monthsParse = []; + for (i = 0; i < 12; i++) { + // use custom parser to solve problem with July (Äervenec) + _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); + } + return _monthsParse; + }(months, monthsShort)), + weekdays : 'nedeľa_pondelok_utorok_streda_Å¡tvrtok_piatok_sobota'.split('_'), + weekdaysShort : 'ne_po_ut_st_Å¡t_pi_so'.split('_'), + weekdaysMin : 'ne_po_ut_st_Å¡t_pi_so'.split('_'), + longDateFormat : { + LT: 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[dnes o] LT', + nextDay: '[zajtra o] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedeľu o] LT'; + case 1: + case 2: + return '[v] dddd [o] LT'; + case 3: + return '[v stredu o] LT'; + case 4: + return '[vo Å¡tvrtok o] LT'; + case 5: + return '[v piatok o] LT'; + case 6: + return '[v sobotu o] LT'; + } + }, + lastDay: '[vÄera o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulú nedeľu o] LT'; + case 1: + case 2: + return '[minulý] dddd [o] LT'; + case 3: + return '[minulú stredu o] LT'; + case 4: + case 5: + return '[minulý] dddd [o] LT'; + case 6: + return '[minulú sobotu o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pred %s', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : slovenian (sl) +// author : Robert SedovÅ¡ek : https://github.com/sedovsek + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'ena minuta' : 'eno minuto'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2) { + result += 'minuti'; + } else if (number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minut'; + } + return result; + case 'h': + return withoutSuffix ? 'ena ura' : 'eno uro'; + case 'hh': + if (number === 1) { + result += 'ura'; + } else if (number === 2) { + result += 'uri'; + } else if (number === 3 || number === 4) { + result += 'ure'; + } else { + result += 'ur'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dni'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mesec'; + } else if (number === 2) { + result += 'meseca'; + } else if (number === 3 || number === 4) { + result += 'mesece'; + } else { + result += 'mesecev'; + } + return result; + case 'yy': + if (number === 1) { + result += 'leto'; + } else if (number === 2) { + result += 'leti'; + } else if (number === 3 || number === 4) { + result += 'leta'; + } else { + result += 'let'; + } + return result; + } + } + + return moment.defineLocale('sl', { + months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'), + monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'), + weekdays : 'nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota'.split('_'), + weekdaysShort : 'ned._pon._tor._sre._Äet._pet._sob.'.split('_'), + weekdaysMin : 'ne_po_to_sr_Äe_pe_so'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD. MM. YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[danes ob] LT', + nextDay : '[jutri ob] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[v] [nedeljo] [ob] LT'; + case 3: + return '[v] [sredo] [ob] LT'; + case 6: + return '[v] [soboto] [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[v] dddd [ob] LT'; + } + }, + lastDay : '[vÄeraj ob] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[prejÅ¡nja] dddd [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[prejÅ¡nji] dddd [ob] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'Äez %s', + past : '%s nazaj', + s : 'nekaj sekund', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'en dan', + dd : translate, + M : 'en mesec', + MM : translate, + y : 'eno leto', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Albanian (sq) +// author : Flakërim Ismani : https://github.com/flakerimi +// author: Menelion Elensúle: https://github.com/Oire (tests) +// author : Oerd Cukalla : https://github.com/oerd (fixes) + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('sq', { + months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'), + monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'), + weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'), + weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'), + weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'), + meridiemParse: /PD|MD/, + isPM: function (input) { + return input.charAt(0) === 'M'; + }, + meridiem : function (hours, minutes, isLower) { + return hours < 12 ? 'PD' : 'MD'; + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Sot në] LT', + nextDay : '[Nesër në] LT', + nextWeek : 'dddd [në] LT', + lastDay : '[Dje në] LT', + lastWeek : 'dddd [e kaluar në] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'në %s', + past : '%s më parë', + s : 'disa sekonda', + m : 'një minutë', + mm : '%d minuta', + h : 'një orë', + hh : '%d orë', + d : 'një ditë', + dd : '%d ditë', + M : 'një muaj', + MM : '%d muaj', + y : 'një vit', + yy : '%d vite' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Serbian-cyrillic (sr-cyrl) +// author : Milan JanaÄković : https://github.com/milan-j + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var translator = { + words: { //Different grammatical cases + m: ['један минут', 'једне минуте'], + mm: ['минут', 'минуте', 'минута'], + h: ['један Ñат', 'једног Ñата'], + hh: ['Ñат', 'Ñата', 'Ñати'], + dd: ['дан', 'дана', 'дана'], + MM: ['меÑец', 'меÑеца', 'меÑеци'], + yy: ['година', 'године', 'година'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } + }; + + return moment.defineLocale('sr-cyrl', { + months: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'авгуÑÑ‚', 'Ñептембар', 'октобар', 'новембар', 'децембар'], + monthsShort: ['јан.', 'феб.', 'мар.', 'апр.', 'мај', 'јун', 'јул', 'авг.', 'Ñеп.', 'окт.', 'нов.', 'дец.'], + weekdays: ['недеља', 'понедељак', 'уторак', 'Ñреда', 'четвртак', 'петак', 'Ñубота'], + weekdaysShort: ['нед.', 'пон.', 'уто.', 'Ñре.', 'чет.', 'пет.', 'Ñуб.'], + weekdaysMin: ['не', 'по', 'ут', 'ÑÑ€', 'че', 'пе', 'Ñу'], + longDateFormat: { + LT: 'H:mm', + LTS : 'LT:ss', + L: 'DD. MM. YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY LT', + LLLL: 'dddd, D. MMMM YYYY LT' + }, + calendar: { + sameDay: '[Ð´Ð°Ð½Ð°Ñ Ñƒ] LT', + nextDay: '[Ñутра у] LT', + + nextWeek: function () { + switch (this.day()) { + case 0: + return '[у] [недељу] [у] LT'; + case 3: + return '[у] [Ñреду] [у] LT'; + case 6: + return '[у] [Ñуботу] [у] LT'; + case 1: + case 2: + case 4: + case 5: + return '[у] dddd [у] LT'; + } + }, + lastDay : '[јуче у] LT', + lastWeek : function () { + var lastWeekDays = [ + '[прошле] [недеље] [у] LT', + '[прошлог] [понедељка] [у] LT', + '[прошлог] [уторка] [у] LT', + '[прошле] [Ñреде] [у] LT', + '[прошлог] [четвртка] [у] LT', + '[прошлог] [петка] [у] LT', + '[прошле] [Ñуботе] [у] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'за %s', + past : 'пре %s', + s : 'неколико Ñекунди', + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'дан', + dd : translator.translate, + M : 'меÑец', + MM : translator.translate, + y : 'годину', + yy : translator.translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Serbian-latin (sr) +// author : Milan JanaÄković : https://github.com/milan-j + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var translator = { + words: { //Different grammatical cases + m: ['jedan minut', 'jedne minute'], + mm: ['minut', 'minute', 'minuta'], + h: ['jedan sat', 'jednog sata'], + hh: ['sat', 'sata', 'sati'], + dd: ['dan', 'dana', 'dana'], + MM: ['mesec', 'meseca', 'meseci'], + yy: ['godina', 'godine', 'godina'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } + }; + + return moment.defineLocale('sr', { + months: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'], + monthsShort: ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun', 'jul', 'avg.', 'sep.', 'okt.', 'nov.', 'dec.'], + weekdays: ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'Äetvrtak', 'petak', 'subota'], + weekdaysShort: ['ned.', 'pon.', 'uto.', 'sre.', 'Äet.', 'pet.', 'sub.'], + weekdaysMin: ['ne', 'po', 'ut', 'sr', 'Äe', 'pe', 'su'], + longDateFormat: { + LT: 'H:mm', + LTS : 'LT:ss', + L: 'DD. MM. YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY LT', + LLLL: 'dddd, D. MMMM YYYY LT' + }, + calendar: { + sameDay: '[danas u] LT', + nextDay: '[sutra u] LT', + + nextWeek: function () { + switch (this.day()) { + case 0: + return '[u] [nedelju] [u] LT'; + case 3: + return '[u] [sredu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄe u] LT', + lastWeek : function () { + var lastWeekDays = [ + '[proÅ¡le] [nedelje] [u] LT', + '[proÅ¡log] [ponedeljka] [u] LT', + '[proÅ¡log] [utorka] [u] LT', + '[proÅ¡le] [srede] [u] LT', + '[proÅ¡log] [Äetvrtka] [u] LT', + '[proÅ¡log] [petka] [u] LT', + '[proÅ¡le] [subote] [u] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pre %s', + s : 'nekoliko sekundi', + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'dan', + dd : translator.translate, + M : 'mesec', + MM : translator.translate, + y : 'godinu', + yy : translator.translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : swedish (sv) +// author : Jens Alm : https://github.com/ulmus + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('sv', { + months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'söndag_mÃ¥ndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'), + weekdaysShort : 'sön_mÃ¥n_tis_ons_tor_fre_lör'.split('_'), + weekdaysMin : 'sö_mÃ¥_ti_on_to_fr_lö'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Idag] LT', + nextDay: '[Imorgon] LT', + lastDay: '[IgÃ¥r] LT', + nextWeek: 'dddd LT', + lastWeek: '[Förra] dddd[en] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'för %s sedan', + s : 'nÃ¥gra sekunder', + m : 'en minut', + mm : '%d minuter', + h : 'en timme', + hh : '%d timmar', + d : 'en dag', + dd : '%d dagar', + M : 'en mÃ¥nad', + MM : '%d mÃ¥nader', + y : 'ett Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}(e|a)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'e' : + (b === 1) ? 'a' : + (b === 2) ? 'a' : + (b === 3) ? 'e' : 'e'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : tamil (ta) +// author : Arjunkumar Krishnamoorthy : https://github.com/tk120404 + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + /*var symbolMap = { + '1': '௧', + '2': '௨', + '3': '௩', + '4': '௪', + '5': '௫', + '6': '௬', + '7': '௭', + '8': '௮', + '9': '௯', + '0': '௦' + }, + numberMap = { + '௧': '1', + '௨': '2', + '௩': '3', + '௪': '4', + '௫': '5', + '௬': '6', + '௭': '7', + '௮': '8', + '௯': '9', + '௦': '0' + }; */ + + return moment.defineLocale('ta', { + months : 'ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯'.split('_'), + monthsShort : 'ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯'.split('_'), + weekdays : 'ஞாயிறà¯à®±à¯à®•à¯à®•à®¿à®´à®®à¯ˆ_திஙà¯à®•à®Ÿà¯à®•à®¿à®´à®®à¯ˆ_செவà¯à®µà®¾à®¯à¯à®•à®¿à®´à®®à¯ˆ_பà¯à®¤à®©à¯à®•à®¿à®´à®®à¯ˆ_வியாழகà¯à®•à®¿à®´à®®à¯ˆ_வெளà¯à®³à®¿à®•à¯à®•à®¿à®´à®®à¯ˆ_சனிகà¯à®•à®¿à®´à®®à¯ˆ'.split('_'), + weekdaysShort : 'ஞாயிறà¯_திஙà¯à®•à®³à¯_செவà¯à®µà®¾à®¯à¯_பà¯à®¤à®©à¯_வியாழனà¯_வெளà¯à®³à®¿_சனி'.split('_'), + weekdaysMin : 'ஞா_தி_செ_பà¯_வி_வெ_ச'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[இனà¯à®±à¯] LT', + nextDay : '[நாளை] LT', + nextWeek : 'dddd, LT', + lastDay : '[நேறà¯à®±à¯] LT', + lastWeek : '[கடநà¯à®¤ வாரமà¯] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s இலà¯', + past : '%s à®®à¯à®©à¯', + s : 'ஒர௠சில விநாடிகளà¯', + m : 'ஒர௠நிமிடமà¯', + mm : '%d நிமிடஙà¯à®•à®³à¯', + h : 'ஒர௠மணி நேரமà¯', + hh : '%d மணி நேரமà¯', + d : 'ஒர௠நாளà¯', + dd : '%d நாடà¯à®•à®³à¯', + M : 'ஒர௠மாதமà¯', + MM : '%d மாதஙà¯à®•à®³à¯', + y : 'ஒர௠வரà¯à®Ÿà®®à¯', + yy : '%d ஆணà¯à®Ÿà¯à®•à®³à¯' + }, +/* preparse: function (string) { + return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + },*/ + ordinalParse: /\d{1,2}வதà¯/, + ordinal : function (number) { + return number + 'வதà¯'; + }, + + + // refer http://ta.wikipedia.org/s/1er1 + meridiemParse: /யாமமà¯|வைகறை|காலை|நணà¯à®ªà®•à®²à¯|எறà¯à®ªà®¾à®Ÿà¯|மாலை/, + meridiem : function (hour, minute, isLower) { + if (hour < 2) { + return ' யாமமà¯'; + } else if (hour < 6) { + return ' வைகறை'; // வைகறை + } else if (hour < 10) { + return ' காலை'; // காலை + } else if (hour < 14) { + return ' நணà¯à®ªà®•à®²à¯'; // நணà¯à®ªà®•à®²à¯ + } else if (hour < 18) { + return ' எறà¯à®ªà®¾à®Ÿà¯'; // எறà¯à®ªà®¾à®Ÿà¯ + } else if (hour < 22) { + return ' மாலை'; // மாலை + } else { + return ' யாமமà¯'; + } + }, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'யாமமà¯') { + return hour < 2 ? hour : hour + 12; + } else if (meridiem === 'வைகறை' || meridiem === 'காலை') { + return hour; + } else if (meridiem === 'நணà¯à®ªà®•à®²à¯') { + return hour >= 10 ? hour : hour + 12; + } else { + return hour + 12; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : thai (th) +// author : Kridsada Thanabulpong : https://github.com/sirn + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('th', { + months : 'มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม'.split('_'), + monthsShort : 'มà¸à¸£à¸²_à¸à¸¸à¸¡à¸ à¸²_มีนา_เมษา_พฤษภา_มิถุนา_à¸à¸£à¸à¸Žà¸²_สิงหา_à¸à¸±à¸™à¸¢à¸²_ตุลา_พฤศจิà¸à¸²_ธันวา'.split('_'), + weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์'.split('_'), + weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์'.split('_'), // yes, three characters difference + weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'), + longDateFormat : { + LT : 'H นาฬิà¸à¸² m นาที', + LTS : 'LT s วินาที', + L : 'YYYY/MM/DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY เวลา LT', + LLLL : 'วันddddที่ D MMMM YYYY เวลา LT' + }, + meridiemParse: /à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง|หลังเที่ยง/, + isPM: function (input) { + return input === 'หลังเที่ยง'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง'; + } else { + return 'หลังเที่ยง'; + } + }, + calendar : { + sameDay : '[วันนี้ เวลา] LT', + nextDay : '[พรุ่งนี้ เวลา] LT', + nextWeek : 'dddd[หน้า เวลา] LT', + lastDay : '[เมื่อวานนี้ เวลา] LT', + lastWeek : '[วัน]dddd[ที่à¹à¸¥à¹‰à¸§ เวลา] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'อีภ%s', + past : '%sที่à¹à¸¥à¹‰à¸§', + s : 'ไม่à¸à¸µà¹ˆà¸§à¸´à¸™à¸²à¸—ี', + m : '1 นาที', + mm : '%d นาที', + h : '1 ชั่วโมง', + hh : '%d ชั่วโมง', + d : '1 วัน', + dd : '%d วัน', + M : '1 เดือน', + MM : '%d เดือน', + y : '1 ปี', + yy : '%d ปี' + } + }); +})); + +// moment.js locale configuration +// locale : Tagalog/Filipino (tl-ph) +// author : Dan Hagman + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('tl-ph', { + months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'), + monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'), + weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'), + weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'), + weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'MM/D/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY LT', + LLLL : 'dddd, MMMM DD, YYYY LT' + }, + calendar : { + sameDay: '[Ngayon sa] LT', + nextDay: '[Bukas sa] LT', + nextWeek: 'dddd [sa] LT', + lastDay: '[Kahapon sa] LT', + lastWeek: 'dddd [huling linggo] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'sa loob ng %s', + past : '%s ang nakalipas', + s : 'ilang segundo', + m : 'isang minuto', + mm : '%d minuto', + h : 'isang oras', + hh : '%d oras', + d : 'isang araw', + dd : '%d araw', + M : 'isang buwan', + MM : '%d buwan', + y : 'isang taon', + yy : '%d taon' + }, + ordinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : turkish (tr) +// authors : Erhan Gundogan : https://github.com/erhangundogan, +// Burak YiÄŸit Kaya: https://github.com/BYK + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + var suffixes = { + 1: '\'inci', + 5: '\'inci', + 8: '\'inci', + 70: '\'inci', + 80: '\'inci', + + 2: '\'nci', + 7: '\'nci', + 20: '\'nci', + 50: '\'nci', + + 3: '\'üncü', + 4: '\'üncü', + 100: '\'üncü', + + 6: '\'ncı', + + 9: '\'uncu', + 10: '\'uncu', + 30: '\'uncu', + + 60: '\'ıncı', + 90: '\'ıncı' + }; + + return moment.defineLocale('tr', { + months : 'Ocak_Åžubat_Mart_Nisan_Mayıs_Haziran_Temmuz_AÄŸustos_Eylül_Ekim_Kasım_Aralık'.split('_'), + monthsShort : 'Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara'.split('_'), + weekdays : 'Pazar_Pazartesi_Salı_ÇarÅŸamba_PerÅŸembe_Cuma_Cumartesi'.split('_'), + weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'), + weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[bugün saat] LT', + nextDay : '[yarın saat] LT', + nextWeek : '[haftaya] dddd [saat] LT', + lastDay : '[dün] LT', + lastWeek : '[geçen hafta] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s sonra', + past : '%s önce', + s : 'birkaç saniye', + m : 'bir dakika', + mm : '%d dakika', + h : 'bir saat', + hh : '%d saat', + d : 'bir gün', + dd : '%d gün', + M : 'bir ay', + MM : '%d ay', + y : 'bir yıl', + yy : '%d yıl' + }, + ordinalParse: /\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/, + ordinal : function (number) { + if (number === 0) { // special case for zero + return number + '\'ıncı'; + } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + + return number + (suffixes[a] || suffixes[b] || suffixes[c]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Morocco Central Atlas TamaziÉ£t in Latin (tzm-latn) +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('tzm-latn', { + months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), + weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), + weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[asdkh g] LT', + nextDay: '[aska g] LT', + nextWeek: 'dddd [g] LT', + lastDay: '[assant g] LT', + lastWeek: 'dddd [g] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dadkh s yan %s', + past : 'yan %s', + s : 'imik', + m : 'minuá¸', + mm : '%d minuá¸', + h : 'saÉ›a', + hh : '%d tassaÉ›in', + d : 'ass', + dd : '%d ossan', + M : 'ayowr', + MM : '%d iyyirn', + y : 'asgas', + yy : '%d isgasn' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : Morocco Central Atlas TamaziÉ£t (tzm) +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('tzm', { + months : 'ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”'.split('_'), + monthsShort : 'ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”'.split('_'), + weekdays : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + weekdaysShort : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS: 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[ⴰⵙⴷⵅ â´´] LT', + nextDay: '[ⴰⵙⴽⴰ â´´] LT', + nextWeek: 'dddd [â´´] LT', + lastDay: '[ⴰⵚⴰâµâµœ â´´] LT', + lastWeek: 'dddd [â´´] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'â´·â´°â´·âµ… âµ™ ⵢⴰⵠ%s', + past : 'ⵢⴰⵠ%s', + s : 'ⵉⵎⵉⴽ', + m : 'ⵎⵉâµâµ“â´º', + mm : '%d ⵎⵉâµâµ“â´º', + h : 'ⵙⴰⵄⴰ', + hh : '%d ⵜⴰⵙⵙⴰⵄⵉâµ', + d : 'ⴰⵙⵙ', + dd : '%d oⵙⵙⴰâµ', + M : 'â´°âµ¢oⵓⵔ', + MM : '%d ⵉⵢⵢⵉⵔâµ', + y : 'ⴰⵙⴳⴰⵙ', + yy : '%d ⵉⵙⴳⴰⵙâµ' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : ukrainian (uk) +// author : zemlanin : https://github.com/zemlanin +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': 'хвилина_хвилини_хвилин', + 'hh': 'година_години_годин', + 'dd': 'день_дні_днів', + 'MM': 'міÑÑць_міÑÑці_міÑÑців', + 'yy': 'рік_роки_років' + }; + if (key === 'm') { + return withoutSuffix ? 'хвилина' : 'хвилину'; + } + else if (key === 'h') { + return withoutSuffix ? 'година' : 'годину'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень'.split('_'), + 'accusative': 'ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ'.split('_') + }, + + nounCase = (/D[oD]? *MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота'.split('_'), + 'accusative': 'неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу'.split('_'), + 'genitive': 'неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи'.split('_') + }, + + nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ? + 'accusative' : + ((/\[?(?:минулої|наÑтупної)? ?\] ?dddd/).test(format) ? + 'genitive' : + 'nominative'); + + return weekdays[nounCase][m.day()]; + } + + function processHoursFunction(str) { + return function () { + return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT'; + }; + } + + return moment.defineLocale('uk', { + months : monthsCaseReplace, + monthsShort : 'Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + weekdaysMin : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY Ñ€.', + LLL : 'D MMMM YYYY Ñ€., LT', + LLLL : 'dddd, D MMMM YYYY Ñ€., LT' + }, + calendar : { + sameDay: processHoursFunction('[Сьогодні '), + nextDay: processHoursFunction('[Завтра '), + lastDay: processHoursFunction('[Вчора '), + nextWeek: processHoursFunction('[У] dddd ['), + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return processHoursFunction('[Минулої] dddd [').call(this); + case 1: + case 2: + case 4: + return processHoursFunction('[Минулого] dddd [').call(this); + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'за %s', + past : '%s тому', + s : 'декілька Ñекунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : 'годину', + hh : relativeTimeWithPlural, + d : 'день', + dd : relativeTimeWithPlural, + M : 'міÑÑць', + MM : relativeTimeWithPlural, + y : 'рік', + yy : relativeTimeWithPlural + }, + + // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason + + meridiemParse: /ночі|ранку|днÑ|вечора/, + isPM: function (input) { + return /^(днÑ|вечора)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночі'; + } else if (hour < 12) { + return 'ранку'; + } else if (hour < 17) { + return 'днÑ'; + } else { + return 'вечора'; + } + }, + + ordinalParse: /\d{1,2}-(й|го)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return number + '-й'; + case 'D': + return number + '-го'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : uzbek (uz) +// author : Sardor Muminov : https://github.com/muminoff + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('uz', { + months : 'Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь'.split('_'), + monthsShort : 'Ñнв_фев_мар_апр_май_июн_июл_авг_Ñен_окт_ноÑ_дек'.split('_'), + weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'), + weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'), + weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'D MMMM YYYY, dddd LT' + }, + calendar : { + sameDay : '[Бугун Ñоат] LT [да]', + nextDay : '[Эртага] LT [да]', + nextWeek : 'dddd [куни Ñоат] LT [да]', + lastDay : '[Кеча Ñоат] LT [да]', + lastWeek : '[Утган] dddd [куни Ñоат] LT [да]', + sameElse : 'L' + }, + relativeTime : { + future : 'Якин %s ичида', + past : 'Бир неча %s олдин', + s : 'фурÑат', + m : 'бир дакика', + mm : '%d дакика', + h : 'бир Ñоат', + hh : '%d Ñоат', + d : 'бир кун', + dd : '%d кун', + M : 'бир ой', + MM : '%d ой', + y : 'бир йил', + yy : '%d йил' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : vietnamese (vi) +// author : Bang Nguyen : https://github.com/bangnk + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('vi', { + months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'), + monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'), + weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tÆ°_thứ năm_thứ sáu_thứ bảy'.split('_'), + weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM [năm] YYYY', + LLL : 'D MMMM [năm] YYYY LT', + LLLL : 'dddd, D MMMM [năm] YYYY LT', + l : 'DD/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY LT', + llll : 'ddd, D MMM YYYY LT' + }, + calendar : { + sameDay: '[Hôm nay lúc] LT', + nextDay: '[Ngày mai lúc] LT', + nextWeek: 'dddd [tuần tá»›i lúc] LT', + lastDay: '[Hôm qua lúc] LT', + lastWeek: 'dddd [tuần rồi lúc] LT', + sameElse: 'L' + }, + relativeTime : { + future : '%s tá»›i', + past : '%s trÆ°á»›c', + s : 'vài giây', + m : 'má»™t phút', + mm : '%d phút', + h : 'má»™t giá»', + hh : '%d giá»', + d : 'má»™t ngày', + dd : '%d ngày', + M : 'má»™t tháng', + MM : '%d tháng', + y : 'má»™t năm', + yy : '%d năm' + }, + ordinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : chinese (zh-cn) +// author : suupic : https://github.com/suupic +// author : Zeno Zeng : https://github.com/zenozeng + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('zh-cn', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'), + weekdaysMin : 'æ—¥_一_二_三_å››_五_å…­'.split('_'), + longDateFormat : { + LT : 'Ah点mm', + LTS : 'Ah点m分s秒', + L : 'YYYY-MM-DD', + LL : 'YYYYå¹´MMMDæ—¥', + LLL : 'YYYYå¹´MMMDæ—¥LT', + LLLL : 'YYYYå¹´MMMDæ—¥ddddLT', + l : 'YYYY-MM-DD', + ll : 'YYYYå¹´MMMDæ—¥', + lll : 'YYYYå¹´MMMDæ—¥LT', + llll : 'YYYYå¹´MMMDæ—¥ddddLT' + }, + meridiemParse: /凌晨|早上|上åˆ|中åˆ|下åˆ|晚上/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '凌晨' || meridiem === '早上' || + meridiem === '上åˆ') { + return hour; + } else if (meridiem === '下åˆ' || meridiem === '晚上') { + return hour + 12; + } else { + // '中åˆ' + return hour >= 11 ? hour : hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return '凌晨'; + } else if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上åˆ'; + } else if (hm < 1230) { + return '中åˆ'; + } else if (hm < 1800) { + return '下åˆ'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : function () { + return this.minutes() === 0 ? '[今天]Ah[点整]' : '[今天]LT'; + }, + nextDay : function () { + return this.minutes() === 0 ? '[明天]Ah[点整]' : '[明天]LT'; + }, + lastDay : function () { + return this.minutes() === 0 ? '[昨天]Ah[点整]' : '[昨天]LT'; + }, + nextWeek : function () { + var startOfWeek, prefix; + startOfWeek = moment().startOf('week'); + prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]'; + return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; + }, + lastWeek : function () { + var startOfWeek, prefix; + startOfWeek = moment().startOf('week'); + prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]'; + return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; + }, + sameElse : 'LL' + }, + ordinalParse: /\d{1,2}(æ—¥|月|周)/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + 'æ—¥'; + case 'M': + return number + '月'; + case 'w': + case 'W': + return number + '周'; + default: + return number; + } + }, + relativeTime : { + future : '%s内', + past : '%så‰', + s : '几秒', + m : '1分钟', + mm : '%d分钟', + h : '1å°æ—¶', + hh : '%då°æ—¶', + d : '1天', + dd : '%d天', + M : '1个月', + MM : '%d个月', + y : '1å¹´', + yy : '%då¹´' + }, + week : { + // GB/T 7408-1994《数æ®å…ƒå’Œäº¤æ¢æ ¼å¼Â·ä¿¡æ¯äº¤æ¢Â·æ—¥æœŸå’Œæ—¶é—´è¡¨ç¤ºæ³•ã€‹ä¸ŽISO 8601:1988等效 + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js locale configuration +// locale : traditional chinese (zh-tw) +// author : Ben : https://github.com/ben-lin + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory((typeof global !== 'undefined' ? global : this).moment); // node or other global + } +}(function (moment) { + return moment.defineLocale('zh-tw', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), + weekdaysMin : 'æ—¥_一_二_三_å››_五_å…­'.split('_'), + longDateFormat : { + LT : 'Ah點mm', + LTS : 'Ah點m分s秒', + L : 'YYYYå¹´MMMDæ—¥', + LL : 'YYYYå¹´MMMDæ—¥', + LLL : 'YYYYå¹´MMMDæ—¥LT', + LLLL : 'YYYYå¹´MMMDæ—¥ddddLT', + l : 'YYYYå¹´MMMDæ—¥', + ll : 'YYYYå¹´MMMDæ—¥', + lll : 'YYYYå¹´MMMDæ—¥LT', + llll : 'YYYYå¹´MMMDæ—¥ddddLT' + }, + meridiemParse: /早上|上åˆ|中åˆ|下åˆ|晚上/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '早上' || meridiem === '上åˆ') { + return hour; + } else if (meridiem === '中åˆ') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === '下åˆ' || meridiem === '晚上') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上åˆ'; + } else if (hm < 1230) { + return '中åˆ'; + } else if (hm < 1800) { + return '下åˆ'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : '[今天]LT', + nextDay : '[明天]LT', + nextWeek : '[下]ddddLT', + lastDay : '[昨天]LT', + lastWeek : '[上]ddddLT', + sameElse : 'L' + }, + ordinalParse: /\d{1,2}(æ—¥|月|週)/, + ordinal : function (number, period) { + switch (period) { + case 'd' : + case 'D' : + case 'DDD' : + return number + 'æ—¥'; + case 'M' : + return number + '月'; + case 'w' : + case 'W' : + return number + '週'; + default : + return number; + } + }, + relativeTime : { + future : '%så…§', + past : '%så‰', + s : '幾秒', + m : '一分é˜', + mm : '%d分é˜', + h : '一å°æ™‚', + hh : '%då°æ™‚', + d : '一天', + dd : '%d天', + M : '一個月', + MM : '%d個月', + y : '一年', + yy : '%då¹´' + } + }); +})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/locales.min.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/locales.min.js new file mode 100644 index 0000000..b35ba6d --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/locales.min.js @@ -0,0 +1,4 @@ +!function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(a){return/^nm$/i.test(a)},meridiem:function(a,b,c){return 12>a?c?"vm":"VM":c?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[Môre om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ar-ma",{months:"يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:6,doy:12}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"Ù¡",2:"Ù¢",3:"Ù£",4:"Ù¤",5:"Ù¥",6:"Ù¦",7:"Ù§",8:"Ù¨",9:"Ù©",0:"Ù "},c={"Ù¡":"1","Ù¢":"2","Ù£":"3","Ù¤":"4","Ù¥":"5","Ù¦":"6","Ù§":"7","Ù¨":"8","Ù©":"9","Ù ":"0"};return a.defineLocale("ar-sa",{months:"يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),monthsShort:"يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiemParse:/ص|Ù…/,isPM:function(a){return"Ù…"===a},meridiem:function(a){return 12>a?"ص":"Ù…"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(a){return a.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(a){return c[a]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]}).replace(/,/g,"ØŒ")},week:{dow:6,doy:12}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ar-tn",{months:"جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),monthsShort:"جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"Ù¡",2:"Ù¢",3:"Ù£",4:"Ù¤",5:"Ù¥",6:"Ù¦",7:"Ù§",8:"Ù¨",9:"Ù©",0:"Ù "},c={"Ù¡":"1","Ù¢":"2","Ù£":"3","Ù¤":"4","Ù¥":"5","Ù¦":"6","Ù§":"7","Ù¨":"8","Ù©":"9","Ù ":"0"},d=function(a){return 0===a?0:1===a?1:2===a?2:a%100>=3&&10>=a%100?3:a%100>=11?4:5},e={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},f=function(a){return function(b,c){var f=d(b),g=e[a][d(b)];return 2===f&&(g=g[c?0:1]),g.replace(/%d/i,b)}},g=["كانون الثاني يناير","شباط Ùبراير","آذار مارس","نيسان أبريل","أيار مايو","حزيران يونيو","تموز يوليو","آب أغسطس","أيلول سبتمبر","تشرين الأول أكتوبر","تشرين الثاني نوÙمبر","كانون الأول ديسمبر"];return a.defineLocale("ar",{months:g,monthsShort:g,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiemParse:/ص|Ù…/,isPM:function(a){return"Ù…"===a},meridiem:function(a){return 12>a?"ص":"Ù…"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:f("s"),m:f("m"),mm:f("m"),h:f("h"),hh:f("h"),d:f("d"),dd:f("d"),M:f("M"),MM:f("M"),y:f("y"),yy:f("y")},preparse:function(a){return a.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(a){return c[a]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]}).replace(/,/g,"ØŒ")},week:{dow:6,doy:12}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"-inci",5:"-inci",8:"-inci",70:"-inci",80:"-inci",2:"-nci",7:"-nci",20:"-nci",50:"-nci",3:"-üncü",4:"-üncü",100:"-üncü",6:"-ncı",9:"-uncu",10:"-uncu",30:"-uncu",60:"-ıncı",90:"-ıncı"};return a.defineLocale("az",{months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekdays:"Bazar_Bazar ertÉ™si_ÇərÅŸÉ™nbÉ™ axÅŸamı_ÇərÅŸÉ™nbÉ™_CümÉ™ axÅŸamı_CümÉ™_ŞənbÉ™".split("_"),weekdaysShort:"Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən".split("_"),weekdaysMin:"Bz_BE_ÇA_Çə_CA_Cü_Şə".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[sabah saat] LT",nextWeek:"[gÉ™lÉ™n hÉ™ftÉ™] dddd [saat] LT",lastDay:"[dünÉ™n] LT",lastWeek:"[keçən hÉ™ftÉ™] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s É™vvÉ™l",s:"birneçə saniyyÉ™",m:"bir dÉ™qiqÉ™",mm:"%d dÉ™qiqÉ™",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},meridiemParse:/gecÉ™|sÉ™hÉ™r|gündüz|axÅŸam/,isPM:function(a){return/^(gündüz|axÅŸam)$/.test(a)},meridiem:function(a){return 4>a?"gecÉ™":12>a?"sÉ™hÉ™r":17>a?"gündüz":"axÅŸam"},ordinalParse:/\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,ordinal:function(a){if(0===a)return a+"-ıncı";var c=a%10,d=a%100-c,e=a>=100?100:null;return a+(b[c]||b[d]||b[e])},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:c?"хвіліна_хвіліны_хвілін":"хвіліну_хвіліны_хвілін",hh:c?"гадзіна_гадзіны_гадзін":"гадзіну_гадзіны_гадзін",dd:"дзень_дні_дзён",MM:"меÑÑц_меÑÑцы_меÑÑцаў",yy:"год_гады_гадоў"};return"m"===d?c?"хвіліна":"хвіліну":"h"===d?c?"гадзіна":"гадзіну":a+" "+b(e[d],+a)}function d(a,b){var c={nominative:"Ñтудзень_люты_Ñакавік_краÑавік_травень_чÑрвень_ліпень_жнівень_вераÑень_каÑтрычнік_ліÑтапад_Ñнежань".split("_"),accusative:"ÑтудзенÑ_лютага_Ñакавіка_краÑавіка_траўнÑ_чÑрвенÑ_ліпенÑ_жніўнÑ_вераÑнÑ_каÑтрычніка_ліÑтапада_ÑнежнÑ".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function e(a,b){var c={nominative:"нÑдзелÑ_панÑдзелак_аўторак_Ñерада_чацвер_пÑтніца_Ñубота".split("_"),accusative:"нÑдзелю_панÑдзелак_аўторак_Ñераду_чацвер_пÑтніцу_Ñуботу".split("_")},d=/\[ ?[Вв] ?(?:мінулую|наÑтупную)? ?\] ?dddd/.test(b)?"accusative":"nominative";return c[d][a.day()]}return a.defineLocale("be",{months:d,monthsShort:"Ñтуд_лют_Ñак_краÑ_трав_чÑрв_ліп_жнів_вер_каÑÑ‚_ліÑÑ‚_Ñнеж".split("_"),weekdays:e,weekdaysShort:"нд_пн_ат_ÑÑ€_чц_пт_Ñб".split("_"),weekdaysMin:"нд_пн_ат_ÑÑ€_чц_пт_Ñб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., LT",LLLL:"dddd, D MMMM YYYY г., LT"},calendar:{sameDay:"[Ð¡Ñ‘Ð½Ð½Ñ Ñž] LT",nextDay:"[Заўтра Ñž] LT",lastDay:"[Учора Ñž] LT",nextWeek:function(){return"[У] dddd [Ñž] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[У мінулую] dddd [Ñž] LT";case 1:case 2:case 4:return"[У мінулы] dddd [Ñž] LT"}},sameElse:"L"},relativeTime:{future:"праз %s",past:"%s таму",s:"некалькі Ñекунд",m:c,mm:c,h:c,hh:c,d:"дзень",dd:c,M:"меÑÑц",MM:c,y:"год",yy:c},meridiemParse:/ночы|раніцы|днÑ|вечара/,isPM:function(a){return/^(днÑ|вечара)$/.test(a)},meridiem:function(a){return 4>a?"ночы":12>a?"раніцы":17>a?"днÑ":"вечара"},ordinalParse:/\d{1,2}-(Ñ–|Ñ‹|га)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":case"w":case"W":return a%10!==2&&a%10!==3||a%100===12||a%100===13?a+"-Ñ‹":a+"-Ñ–";case"D":return a+"-га";default:return a}},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("bg",{months:"Ñнуари_февруари_март_април_май_юни_юли_авгуÑÑ‚_Ñептември_октомври_ноември_декември".split("_"),monthsShort:"Ñнр_фев_мар_апр_май_юни_юли_авг_Ñеп_окт_ное_дек".split("_"),weekdays:"неделÑ_понеделник_вторник_ÑÑ€Ñда_четвъртък_петък_Ñъбота".split("_"),weekdaysShort:"нед_пон_вто_ÑÑ€Ñ_чет_пет_Ñъб".split("_"),weekdaysMin:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Ð”Ð½ÐµÑ Ð²] LT",nextDay:"[Утре в] LT",nextWeek:"dddd [в] LT",lastDay:"[Вчера в] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Ð’ изминалата] dddd [в] LT";case 1:case 2:case 4:case 5:return"[Ð’ изминалиÑ] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"Ñлед %s",past:"преди %s",s:"нÑколко Ñекунди",m:"минута",mm:"%d минути",h:"чаÑ",hh:"%d чаÑа",d:"ден",dd:"%d дни",M:"меÑец",MM:"%d меÑеца",y:"година",yy:"%d години"},ordinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(a){var b=a%10,c=a%100;return 0===a?a+"-ев":0===c?a+"-ен":c>10&&20>c?a+"-ти":1===b?a+"-ви":2===b?a+"-ри":7===b||8===b?a+"-ми":a+"-ти"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"১",2:"২",3:"৩",4:"৪",5:"৫",6:"৬",7:"৭",8:"৮",9:"৯",0:"০"},c={"১":"1","২":"2","৩":"3","৪":"4","৫":"5","৬":"6","৭":"7","৮":"8","৯":"9","০":"0"};return a.defineLocale("bn",{months:"জানà§à§Ÿà¦¾à¦°à§€_ফেবà§à§Ÿà¦¾à¦°à§€_মারà§à¦š_à¦à¦ªà§à¦°à¦¿à¦²_মে_জà§à¦¨_জà§à¦²à¦¾à¦‡_অগাসà§à¦Ÿ_সেপà§à¦Ÿà§‡à¦®à§à¦¬à¦°_অকà§à¦Ÿà§‹à¦¬à¦°_নভেমà§à¦¬à¦°_ডিসেমà§à¦¬à¦°".split("_"),monthsShort:"জানà§_ফেব_মারà§à¦š_à¦à¦ªà¦°_মে_জà§à¦¨_জà§à¦²_অগ_সেপà§à¦Ÿ_অকà§à¦Ÿà§‹_নভ_ডিসেমà§".split("_"),weekdays:"রবিবার_সোমবার_মঙà§à¦—লবার_বà§à¦§à¦¬à¦¾à¦°_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿à¦¬à¦¾à¦°_শà§à¦•à§à¦°à§à¦¬à¦¾à¦°_শনিবার".split("_"),weekdaysShort:"রবি_সোম_মঙà§à¦—ল_বà§à¦§_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿_শà§à¦•à§à¦°à§_শনি".split("_"),weekdaysMin:"রব_সম_মঙà§à¦—_বà§_বà§à¦°à¦¿à¦¹_শà§_শনি".split("_"),longDateFormat:{LT:"A h:mm সময়",LTS:"A h:mm:ss সময়",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[আজ] LT",nextDay:"[আগামীকাল] LT",nextWeek:"dddd, LT",lastDay:"[গতকাল] LT",lastWeek:"[গত] dddd, LT",sameElse:"L"},relativeTime:{future:"%s পরে",past:"%s আগে",s:"কà¦à¦• সেকেনà§à¦¡",m:"à¦à¦• মিনিট",mm:"%d মিনিট",h:"à¦à¦• ঘনà§à¦Ÿà¦¾",hh:"%d ঘনà§à¦Ÿà¦¾",d:"à¦à¦• দিন",dd:"%d দিন",M:"à¦à¦• মাস",MM:"%d মাস",y:"à¦à¦• বছর",yy:"%d বছর"},preparse:function(a){return a.replace(/[১২৩৪৫৬৭৮৯০]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/রাত|শকাল|দà§à¦ªà§à¦°|বিকেল|রাত/,isPM:function(a){return/^(দà§à¦ªà§à¦°|বিকেল|রাত)$/.test(a)},meridiem:function(a){return 4>a?"রাত":10>a?"শকাল":17>a?"দà§à¦ªà§à¦°":20>a?"বিকেল":"রাত"},week:{dow:0,doy:6}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"༡",2:"༢",3:"༣",4:"༤",5:"༥",6:"༦",7:"༧",8:"༨",9:"༩",0:"༠"},c={"༡":"1","༢":"2","༣":"3","༤":"4","༥":"5","༦":"6","༧":"7","༨":"8","༩":"9","༠":"0"};return a.defineLocale("bo",{months:"ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ".split("_"),monthsShort:"ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ".split("_"),weekdays:"གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་".split("_"),weekdaysShort:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),weekdaysMin:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),longDateFormat:{LT:"A h:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[དི་རིང] LT",nextDay:"[སང་ཉིན] LT",nextWeek:"[བདུན་ཕྲག་རྗེས་མ], LT",lastDay:"[à½à¼‹à½¦à½„] LT",lastWeek:"[བདུན་ཕྲག་མà½à½ à¼‹à½˜] dddd, LT",sameElse:"L"},relativeTime:{future:"%s ལ་",past:"%s སྔན་ལ",s:"ལམ་སང",m:"སà¾à½¢à¼‹à½˜à¼‹à½‚ཅིག",mm:"%d སà¾à½¢à¼‹à½˜",h:"ཆུ་ཚོད་གཅིག",hh:"%d ཆུ་ཚོད",d:"ཉིན་གཅིག",dd:"%d ཉིན་",M:"ཟླ་བ་གཅིག",MM:"%d ཟླ་བ",y:"ལོ་གཅིག",yy:"%d ལོ"},preparse:function(a){return a.replace(/[༡༢༣༤༥༦༧༨༩༠]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,isPM:function(a){return/^(ཉིན་གུང|དགོང་དག|མཚན་མོ)$/.test(a)},meridiem:function(a){return 4>a?"མཚན་མོ":10>a?"ཞོགས་ཀས":17>a?"ཉིན་གུང":20>a?"དགོང་དག":"མཚན་མོ"},week:{dow:0,doy:6}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d={mm:"munutenn",MM:"miz",dd:"devezh"};return a+" "+e(d[c],a)}function c(a){switch(d(a)){case 1:case 3:case 4:case 5:case 9:return a+" bloaz";default:return a+" vloaz"}}function d(a){return a>9?d(a%10):a}function e(a,b){return 2===b?f(a):a}function f(a){var b={m:"v",b:"v",d:"z"};return void 0===b[a.charAt(0)]?a:b[a.charAt(0)]+a.substring(1)}return a.defineLocale("br",{months:"Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),longDateFormat:{LT:"h[e]mm A",LTS:"h[e]mm:ss A",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY LT",LLLL:"dddd, D [a viz] MMMM YYYY LT"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc'hoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec'h da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s 'zo",s:"un nebeud segondennoù",m:"ur vunutenn",mm:b,h:"un eur",hh:"%d eur",d:"un devezh",dd:b,M:"ur miz",MM:b,y:"ur bloaz",yy:c},ordinalParse:/\d{1,2}(añ|vet)/,ordinal:function(a){var b=1===a?"añ":"vet";return a+b},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d=a+" ";switch(c){case"m":return b?"jedna minuta":"jedne minute";case"mm":return d+=1===a?"minuta":2===a||3===a||4===a?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return d+=1===a?"sat":2===a||3===a||4===a?"sata":"sati";case"dd":return d+=1===a?"dan":"dana";case"MM":return d+=1===a?"mjesec":2===a||3===a||4===a?"mjeseca":"mjeseci";case"yy":return d+=1===a?"godina":2===a||3===a||4===a?"godine":"godina"}}return a.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),weekdays:"nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._Äet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_Äe_pe_su".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[proÅ¡lu] dddd [u] LT";case 6:return"[proÅ¡le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[proÅ¡li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:b,mm:b,h:b,hh:b,d:"dan",dd:b,M:"mjesec",MM:b,y:"godinu",yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ca",{months:"gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),monthsShort:"gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.".split("_"),weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[demà a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"fa %s",s:"uns segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},ordinalParse:/\d{1,2}(r|n|t|è|a)/,ordinal:function(a,b){var c=1===a?"r":2===a?"n":3===a?"r":4===a?"t":"è";return("w"===b||"W"===b)&&(c="a"),a+c},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a){return a>1&&5>a&&1!==~~(a/10)}function c(a,c,d,e){var f=a+" ";switch(d){case"s":return c||e?"pár sekund":"pár sekundami";case"m":return c?"minuta":e?"minutu":"minutou";case"mm":return c||e?f+(b(a)?"minuty":"minut"):f+"minutami";break;case"h":return c?"hodina":e?"hodinu":"hodinou";case"hh":return c||e?f+(b(a)?"hodiny":"hodin"):f+"hodinami";break;case"d":return c||e?"den":"dnem";case"dd":return c||e?f+(b(a)?"dny":"dní"):f+"dny";break;case"M":return c||e?"mÄ›síc":"mÄ›sícem";case"MM":return c||e?f+(b(a)?"mÄ›síce":"mÄ›síců"):f+"mÄ›síci";break;case"y":return c||e?"rok":"rokem";case"yy":return c||e?f+(b(a)?"roky":"let"):f+"lety"}}var d="leden_únor_bÅ™ezen_duben_kvÄ›ten_Äerven_Äervenec_srpen_září_říjen_listopad_prosinec".split("_"),e="led_úno_bÅ™e_dub_kvÄ›_Ävn_Ävc_srp_zář_říj_lis_pro".split("_");return a.defineLocale("cs",{months:d,monthsShort:e,monthsParse:function(a,b){var c,d=[];for(c=0;12>c;c++)d[c]=new RegExp("^"+a[c]+"$|^"+b[c]+"$","i");return d}(d,e),weekdays:"nedÄ›le_pondÄ›lí_úterý_stÅ™eda_Ätvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_Ät_pá_so".split("_"),weekdaysMin:"ne_po_út_st_Ät_pá_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedÄ›li v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve stÅ™edu v] LT";case 4:return"[ve Ätvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[vÄera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou nedÄ›li v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou stÅ™edu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pÅ™ed %s",s:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("cv",{months:"кăрлач_нарăÑ_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав".split("_"),monthsShort:"кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш".split("_"),weekdays:"вырÑарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_Ñрнекун_шăматкун".split("_"),weekdaysShort:"выр_тун_ытл_юн_кĕç_Ñрн_шăм".split("_"),weekdaysMin:"вр_тн_Ñ‹Ñ‚_юн_кç_ÑÑ€_шм".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD-MM-YYYY",LL:"YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]",LLL:"YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT",LLLL:"dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT"},calendar:{sameDay:"[ПаÑн] LT [Ñехетре]",nextDay:"[Ыран] LT [Ñехетре]",lastDay:"[Ĕнер] LT [Ñехетре]",nextWeek:"[ÇитеÑ] dddd LT [Ñехетре]",lastWeek:"[Иртнĕ] dddd LT [Ñехетре]",sameElse:"L"},relativeTime:{future:function(a){var b=/Ñехет$/i.exec(a)?"рен":/çул$/i.exec(a)?"тан":"ран";return a+b},past:"%s каÑлла",s:"пĕр-ик çеккунт",m:"пĕр минут",mm:"%d минут",h:"пĕр Ñехет",hh:"%d Ñехет",d:"пĕр кун",dd:"%d кун",M:"пĕр уйăх",MM:"%d уйăх",y:"пĕр çул",yy:"%d çул"},ordinalParse:/\d{1,2}-мĕш/,ordinal:"%d-мĕш",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("cy",{months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Heddiw am] LT",nextDay:"[Yfory am] LT",nextWeek:"dddd [am] LT",lastDay:"[Ddoe am] LT",lastWeek:"dddd [diwethaf am] LT",sameElse:"L"},relativeTime:{future:"mewn %s",past:"%s yn ôl",s:"ychydig eiliadau",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"},ordinalParse:/\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,ordinal:function(a){var b=a,c="",d=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"];return b>20?c=40===b||50===b||60===b||80===b||100===b?"fed":"ain":b>0&&(c=d[b]),a+c},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd [d.] D. MMMM YYYY LT"},calendar:{sameDay:"[I dag kl.] LT",nextDay:"[I morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[I gÃ¥r kl.] LT",lastWeek:"[sidste] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"fÃ¥ sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en mÃ¥ned",MM:"%d mÃ¥neder",y:"et Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[a+" Tage",a+" Tagen"],M:["ein Monat","einem Monat"],MM:[a+" Monate",a+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[a+" Jahre",a+" Jahren"]};return b?d[c][0]:d[c][1]}return a.defineLocale("de-at",{months:"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT [Uhr]",sameElse:"L",nextDay:"[Morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[Gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:b,mm:"%d Minuten",h:b,hh:"%d Stunden",d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[a+" Tage",a+" Tagen"],M:["ein Monat","einem Monat"],MM:[a+" Monate",a+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[a+" Jahre",a+" Jahren"]};return b?d[c][0]:d[c][1]}return a.defineLocale("de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT [Uhr]",sameElse:"L",nextDay:"[Morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[Gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:b,mm:"%d Minuten",h:b,hh:"%d Stunden",d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("el",{monthsNominativeEl:"ΙανουάÏιος_ΦεβÏουάÏιος_ΜάÏτιος_ΑπÏίλιος_Μάιος_ΙοÏνιος_ΙοÏλιος_ΑÏγουστος_ΣεπτέμβÏιος_ΟκτώβÏιος_ÎοέμβÏιος_ΔεκέμβÏιος".split("_"),monthsGenitiveEl:"ΙανουαÏίου_ΦεβÏουαÏίου_ΜαÏτίου_ΑπÏιλίου_ΜαÎου_Ιουνίου_Ιουλίου_ΑυγοÏστου_ΣεπτεμβÏίου_ΟκτωβÏίου_ÎοεμβÏίου_ΔεκεμβÏίου".split("_"),months:function(a,b){return/D/.test(b.substring(0,b.indexOf("MMMM")))?this._monthsGenitiveEl[a.month()]:this._monthsNominativeEl[a.month()]},monthsShort:"Ιαν_Φεβ_ΜαÏ_ΑπÏ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Îοε_Δεκ".split("_"),weekdays:"ΚυÏιακή_ΔευτέÏα_ΤÏίτη_ΤετάÏτη_Πέμπτη_ΠαÏασκευή_Σάββατο".split("_"),weekdaysShort:"ΚυÏ_Δευ_ΤÏι_Τετ_Πεμ_ΠαÏ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_ΤÏ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(a,b,c){return a>11?c?"μμ":"ΜΜ":c?"πμ":"ΠΜ"},isPM:function(a){return"μ"===(a+"").toLowerCase()[0]},meridiemParse:/[ΠΜ]\.?Îœ?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendarEl:{sameDay:"[ΣήμεÏα {}] LT",nextDay:"[ΑÏÏιο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[το Ï€ÏοηγοÏμενο] dddd [{}] LT";default:return"[την Ï€ÏοηγοÏμενη] dddd [{}] LT"}},sameElse:"L"},calendar:function(a,b){var c=this._calendarEl[a],d=b&&b.hours();return"function"==typeof c&&(c=c.apply(b)),c.replace("{}",d%12===1?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s Ï€Ïιν",s:"λίγα δευτεÏόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ÏŽÏα",hh:"%d ÏŽÏες",d:"μία μέÏα",dd:"%d μέÏες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χÏόνος",yy:"%d χÏόνια"},ordinalParse:/\d{1,2}η/,ordinal:"%dη",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},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"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th"; +return a+c},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"D MMMM, YYYY",LLL:"D MMMM, YYYY LT",LLLL:"dddd, D MMMM, YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},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"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},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"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_aÅ­gusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aÅ­g_sep_okt_nov_dec".split("_"),weekdays:"Dimanĉo_Lundo_Mardo_Merkredo_Ä´aÅ­do_Vendredo_Sabato".split("_"),weekdaysShort:"Dim_Lun_Mard_Merk_Ä´aÅ­_Ven_Sab".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Ä´a_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"D[-an de] MMMM, YYYY",LLL:"D[-an de] MMMM, YYYY LT",LLLL:"dddd, [la] D[-an de] MMMM, YYYY LT"},meridiemParse:/[ap]\.t\.m/i,isPM:function(a){return"p"===a.charAt(0).toLowerCase()},meridiem:function(a,b,c){return a>11?c?"p.t.m.":"P.T.M.":c?"a.t.m.":"A.T.M."},calendar:{sameDay:"[HodiaÅ­ je] LT",nextDay:"[MorgaÅ­ je] LT",nextWeek:"dddd [je] LT",lastDay:"[HieraÅ­ je] LT",lastWeek:"[pasinta] dddd [je] LT",sameElse:"L"},relativeTime:{future:"je %s",past:"antaÅ­ %s",s:"sekundoj",m:"minuto",mm:"%d minutoj",h:"horo",hh:"%d horoj",d:"tago",dd:"%d tagoj",M:"monato",MM:"%d monatoj",y:"jaro",yy:"%d jaroj"},ordinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),c="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");return a.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(a,d){return/-MMM-/.test(d)?c[a.month()]:b[a.month()]},weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c,d){var e={s:["mõne sekundi","mõni sekund","paar sekundit"],m:["ühe minuti","üks minut"],mm:[a+" minuti",a+" minutit"],h:["ühe tunni","tund aega","üks tund"],hh:[a+" tunni",a+" tundi"],d:["ühe päeva","üks päev"],M:["kuu aja","kuu aega","üks kuu"],MM:[a+" kuu",a+" kuud"],y:["ühe aasta","aasta","üks aasta"],yy:[a+" aasta",a+" aastat"]};return b?e[c][2]?e[c][2]:e[c][1]:d?e[c][0]:e[c][1]}return a.defineLocale("et",{months:"jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Täna,] LT",nextDay:"[Homme,] LT",nextWeek:"[Järgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s pärast",past:"%s tagasi",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:"%d päeva",M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] LT",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] LT",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] LT",llll:"ddd, YYYY[ko] MMM D[a] LT"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"Û±",2:"Û²",3:"Û³",4:"Û´",5:"Ûµ",6:"Û¶",7:"Û·",8:"Û¸",9:"Û¹",0:"Û°"},c={"Û±":"1","Û²":"2","Û³":"3","Û´":"4","Ûµ":"5","Û¶":"6","Û·":"7","Û¸":"8","Û¹":"9","Û°":"0"};return a.defineLocale("fa",{months:"ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ÛŒ_د_س_Ú†_Ù¾_ج_Ø´".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},meridiemParse:/قبل از ظهر|بعد از ظهر/,isPM:function(a){return/بعد از ظهر/.test(a)},meridiem:function(a){return 12>a?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[Ùردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چندین ثانیه",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(a){return a.replace(/[Û°-Û¹]/g,function(a){return c[a]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]}).replace(/,/g,"ØŒ")},ordinalParse:/\d{1,2}Ù…/,ordinal:"%dÙ…",week:{dow:6,doy:12}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,d,e){var f="";switch(d){case"s":return e?"muutaman sekunnin":"muutama sekunti";case"m":return e?"minuutin":"minuutti";case"mm":f=e?"minuutin":"minuuttia";break;case"h":return e?"tunnin":"tunti";case"hh":f=e?"tunnin":"tuntia";break;case"d":return e?"päivän":"päivä";case"dd":f=e?"päivän":"päivää";break;case"M":return e?"kuukauden":"kuukausi";case"MM":f=e?"kuukauden":"kuukautta";break;case"y":return e?"vuoden":"vuosi";case"yy":f=e?"vuoden":"vuotta"}return f=c(a,e)+" "+f}function c(a,b){return 10>a?b?e[a]:d[a]:a}var d="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),e=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",d[7],d[8],d[9]];return a.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] LT",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] LT",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] LT",llll:"ddd, Do MMM YYYY, [klo] LT"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("fo",{months:"januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur".split("_"),weekdaysShort:"sun_mán_týs_mik_hós_frí_ley".split("_"),weekdaysMin:"su_má_tý_mi_hó_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D. MMMM, YYYY LT"},calendar:{sameDay:"[à dag kl.] LT",nextDay:"[à morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[à gjár kl.] LT",lastWeek:"[síðstu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s síðani",s:"fá sekund",m:"ein minutt",mm:"%d minuttir",h:"ein tími",hh:"%d tímar",d:"ein dagur",dd:"%d dagar",M:"ein mánaði",MM:"%d mánaðir",y:"eitt ár",yy:"%d ár"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|)/,ordinal:function(a){return a+(1===a?"er":"")}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|)/,ordinal:function(a){return a+(1===a?"er":"")},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b="jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.".split("_"),c="jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_");return a.defineLocale("fy",{months:"jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber".split("_"),monthsShort:function(a,d){return/-MMM-/.test(d)?c[a.month()]:b[a.month()]},weekdays:"snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon".split("_"),weekdaysShort:"si._mo._ti._wo._to._fr._so.".split("_"),weekdaysMin:"Si_Mo_Ti_Wo_To_Fr_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[hjoed om] LT",nextDay:"[moarn om] LT",nextWeek:"dddd [om] LT",lastDay:"[juster om] LT",lastWeek:"[ôfrûne] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oer %s",past:"%s lyn",s:"in pear sekonden",m:"ien minút",mm:"%d minuten",h:"ien oere",hh:"%d oeren",d:"ien dei",dd:"%d dagen",M:"ien moanne",MM:"%d moannen",y:"ien jier",yy:"%d jierren"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("gl",{months:"Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro".split("_"),monthsShort:"Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.".split("_"),weekdays:"Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado".split("_"),weekdaysShort:"Dom._Lun._Mar._Mér._Xov._Ven._Sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mé_Xo_Ve_Sá".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"ás":"á")+"] LT"},nextDay:function(){return"[mañá "+(1!==this.hours()?"ás":"á")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"ás":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"á":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"ás":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(a){return"uns segundos"===a?"nuns segundos":"en "+a},past:"hai %s",s:"uns segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("he",{months:"ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר".split("_"),monthsShort:"ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳".split("_"),weekdays:"ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),weekdaysShort:"×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),weekdaysMin:"×_ב_×’_ד_×”_ו_ש".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY LT",LLLL:"dddd, D [ב]MMMM YYYY LT",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY LT",llll:"ddd, D MMM YYYY LT"},calendar:{sameDay:"[×”×™×•× ×‘Ö¾]LT",nextDay:"[מחר ב־]LT",nextWeek:"dddd [בשעה] LT",lastDay:"[×תמול ב־]LT",lastWeek:"[ביו×] dddd [×”×חרון בשעה] LT",sameElse:"L"},relativeTime:{future:"בעוד %s",past:"לפני %s",s:"מספר שניות",m:"דקה",mm:"%d דקות",h:"שעה",hh:function(a){return 2===a?"שעתיי×":a+" שעות"},d:"יו×",dd:function(a){return 2===a?"יומיי×":a+" ימי×"},M:"חודש",MM:function(a){return 2===a?"חודשיי×":a+" חודשי×"},y:"שנה",yy:function(a){return 2===a?"שנתיי×":a%10===0&&10!==a?a+" שנה":a+" שני×"}}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return a.defineLocale("hi",{months:"जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°".split("_"),monthsShort:"जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.".split("_"),weekdays:"रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि".split("_"),weekdaysMin:"र_सो_मं_बà¥_गà¥_शà¥_श".split("_"),longDateFormat:{LT:"A h:mm बजे",LTS:"A h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कà¥à¤› ही कà¥à¤·à¤£",m:"à¤à¤• मिनट",mm:"%d मिनट",h:"à¤à¤• घंटा",hh:"%d घंटे",d:"à¤à¤• दिन",dd:"%d दिन",M:"à¤à¤• महीने",MM:"%d महीने",y:"à¤à¤• वरà¥à¤·",yy:"%d वरà¥à¤·"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/रात|सà¥à¤¬à¤¹|दोपहर|शाम/,meridiemHour:function(a,b){return 12===a&&(a=0),"रात"===b?4>a?a:a+12:"सà¥à¤¬à¤¹"===b?a:"दोपहर"===b?a>=10?a:a+12:"शाम"===b?a+12:void 0},meridiem:function(a){return 4>a?"रात":10>a?"सà¥à¤¬à¤¹":17>a?"दोपहर":20>a?"शाम":"रात"},week:{dow:0,doy:6}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d=a+" ";switch(c){case"m":return b?"jedna minuta":"jedne minute";case"mm":return d+=1===a?"minuta":2===a||3===a||4===a?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return d+=1===a?"sat":2===a||3===a||4===a?"sata":"sati";case"dd":return d+=1===a?"dan":"dana";case"MM":return d+=1===a?"mjesec":2===a||3===a||4===a?"mjeseca":"mjeseci";case"yy":return d+=1===a?"godina":2===a||3===a||4===a?"godine":"godina"}}return a.defineLocale("hr",{months:"sjeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_"),monthsShort:"sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),weekdays:"nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._Äet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_Äe_pe_su".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[proÅ¡lu] dddd [u] LT";case 6:return"[proÅ¡le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[proÅ¡li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:b,mm:b,h:b,hh:b,d:"dan",dd:b,M:"mjesec",MM:b,y:"godinu",yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c,d){var e=a;switch(c){case"s":return d||b?"néhány másodperc":"néhány másodperce";case"m":return"egy"+(d||b?" perc":" perce");case"mm":return e+(d||b?" perc":" perce");case"h":return"egy"+(d||b?" óra":" órája");case"hh":return e+(d||b?" óra":" órája");case"d":return"egy"+(d||b?" nap":" napja");case"dd":return e+(d||b?" nap":" napja");case"M":return"egy"+(d||b?" hónap":" hónapja");case"MM":return e+(d||b?" hónap":" hónapja");case"y":return"egy"+(d||b?" év":" éve");case"yy":return e+(d||b?" év":" éve")}return""}function c(a){return(a?"":"[múlt] ")+"["+d[this.day()]+"] LT[-kor]"}var d="vasárnap hétfÅ‘n kedden szerdán csütörtökön pénteken szombaton".split(" ");return a.defineLocale("hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfÅ‘_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D., LT",LLLL:"YYYY. MMMM D., dddd LT"},meridiemParse:/de|du/i,isPM:function(a){return"u"===a.charAt(1).toLowerCase()},meridiem:function(a,b,c){return 12>a?c===!0?"de":"DE":c===!0?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return c.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return c.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b){var c={nominative:"Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€_Õ´Õ¡Ö€Õ¿_Õ¡ÕºÖ€Õ«Õ¬_Õ´Õ¡ÕµÕ«Õ½_Õ°Õ¸Ö‚Õ¶Õ«Õ½_Õ°Õ¸Ö‚Õ¬Õ«Õ½_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€".split("_"),accusative:"Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€Õ«_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€Õ«_Õ´Õ¡Ö€Õ¿Õ«_Õ¡ÕºÖ€Õ«Õ¬Õ«_Õ´Õ¡ÕµÕ«Õ½Õ«_Õ°Õ¸Ö‚Õ¶Õ«Õ½Õ«_Õ°Õ¸Ö‚Õ¬Õ«Õ½Õ«_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½Õ«_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function c(a){var b="Õ°Õ¶Õ¾_ÖƒÕ¿Ö€_Õ´Ö€Õ¿_Õ¡ÕºÖ€_Õ´ÕµÕ½_Õ°Õ¶Õ½_Õ°Õ¬Õ½_Ö…Õ£Õ½_Õ½ÕºÕ¿_Õ°Õ¯Õ¿_Õ¶Õ´Õ¢_Õ¤Õ¯Õ¿".split("_");return b[a.month()]}function d(a){var b="Õ¯Õ«Ö€Õ¡Õ¯Õ«_Õ¥Ö€Õ¯Õ¸Ö‚Õ·Õ¡Õ¢Õ©Õ«_Õ¥Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ¹Õ¸Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ°Õ«Õ¶Õ£Õ·Õ¡Õ¢Õ©Õ«_Õ¸Ö‚Ö€Õ¢Õ¡Õ©_Õ·Õ¡Õ¢Õ¡Õ©".split("_");return b[a.day()]}return a.defineLocale("hy-am",{months:b,monthsShort:c,weekdays:d,weekdaysShort:"Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©".split("_"),weekdaysMin:"Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY Õ©.",LLL:"D MMMM YYYY Õ©., LT",LLLL:"dddd, D MMMM YYYY Õ©., LT"},calendar:{sameDay:"[Õ¡ÕµÕ½Ö…Ö€] LT",nextDay:"[Õ¾Õ¡Õ²Õ¨] LT",lastDay:"[Õ¥Ö€Õ¥Õ¯] LT",nextWeek:function(){return"dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT"},lastWeek:function(){return"[Õ¡Õ¶ÖÕ¡Õ®] dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT"},sameElse:"L"},relativeTime:{future:"%s Õ°Õ¥Õ¿Õ¸",past:"%s Õ¡Õ¼Õ¡Õ»",s:"Õ´Õ« Ö„Õ¡Õ¶Õ« Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶",m:"Ö€Õ¸ÕºÕ¥",mm:"%d Ö€Õ¸ÕºÕ¥",h:"ÕªÕ¡Õ´",hh:"%d ÕªÕ¡Õ´",d:"Ö…Ö€",dd:"%d Ö…Ö€",M:"Õ¡Õ´Õ«Õ½",MM:"%d Õ¡Õ´Õ«Õ½",y:"Õ¿Õ¡Ö€Õ«",yy:"%d Õ¿Õ¡Ö€Õ«"},meridiemParse:/Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡|Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡|ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶/,isPM:function(a){return/^(ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶)$/.test(a)},meridiem:function(a){return 4>a?"Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡":12>a?"Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡":17>a?"ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡":"Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶"},ordinalParse:/\d{1,2}|\d{1,2}-(Õ«Õ¶|Ö€Õ¤)/,ordinal:function(a,b){switch(b){case"DDD":case"w":case"W":case"DDDo":return 1===a?a+"-Õ«Õ¶":a+"-Ö€Õ¤";default:return a}},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"LT.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] LT",LLLL:"dddd, D MMMM YYYY [pukul] LT"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(a,b){return 12===a&&(a=0),"pagi"===b?a:"siang"===b?a>=11?a:a+12:"sore"===b||"malam"===b?a+12:void 0},meridiem:function(a){return 11>a?"pagi":15>a?"siang":19>a?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a){return a%100===11?!0:a%10===1?!1:!0}function c(a,c,d,e){var f=a+" ";switch(d){case"s":return c||e?"nokkrar sekúndur":"nokkrum sekúndum";case"m":return c?"mínúta":"mínútu";case"mm":return b(a)?f+(c||e?"mínútur":"mínútum"):c?f+"mínúta":f+"mínútu";case"hh":return b(a)?f+(c||e?"klukkustundir":"klukkustundum"):f+"klukkustund";case"d":return c?"dagur":e?"dag":"degi";case"dd":return b(a)?c?f+"dagar":f+(e?"daga":"dögum"):c?f+"dagur":f+(e?"dag":"degi");case"M":return c?"mánuður":e?"mánuð":"mánuði";case"MM":return b(a)?c?f+"mánuðir":f+(e?"mánuði":"mánuðum"):c?f+"mánuður":f+(e?"mánuð":"mánuði");case"y":return c||e?"ár":"ári";case"yy":return b(a)?f+(c||e?"ár":"árum"):f+(c||e?"ár":"ári")}}return a.defineLocale("is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd, D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:c,m:c,mm:c,h:"klukkustund",hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),weekdaysShort:"Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),weekdaysMin:"D_L_Ma_Me_G_V_S".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(a){return(/^[0-9].+$/.test(a)?"tra":"in")+" "+a},past:"%s fa",s:"alcuni secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_ç«æ›œæ—¥_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"æ—¥_月_ç«_æ°´_木_金_土".split("_"),weekdaysMin:"æ—¥_月_ç«_æ°´_木_金_土".split("_"),longDateFormat:{LT:"Ah時m分",LTS:"LTs秒",L:"YYYY/MM/DD",LL:"YYYYå¹´M月Dæ—¥",LLL:"YYYYå¹´M月Dæ—¥LT",LLLL:"YYYYå¹´M月Dæ—¥LT dddd"},meridiemParse:/åˆå‰|åˆå¾Œ/i,isPM:function(a){return"åˆå¾Œ"===a},meridiem:function(a){return 12>a?"åˆå‰":"åˆå¾Œ"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:"[æ¥é€±]dddd LT",lastDay:"[昨日] LT",lastWeek:"[å‰é€±]dddd LT",sameElse:"L"},relativeTime:{future:"%s後",past:"%så‰",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1æ—¥",dd:"%dæ—¥",M:"1ヶ月",MM:"%dヶ月",y:"1å¹´",yy:"%då¹´"}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b){var c={nominative:"იáƒáƒœáƒ•áƒáƒ áƒ˜_თებერვáƒáƒšáƒ˜_მáƒáƒ áƒ¢áƒ˜_áƒáƒžáƒ áƒ˜áƒšáƒ˜_მáƒáƒ˜áƒ¡áƒ˜_ივნისი_ივლისი_áƒáƒ’ვისტáƒ_სექტემბერი_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი_ნáƒáƒ”მბერი_დეკემბერი".split("_"),accusative:"იáƒáƒœáƒ•áƒáƒ áƒ¡_თებერვáƒáƒšáƒ¡_მáƒáƒ áƒ¢áƒ¡_áƒáƒžáƒ áƒ˜áƒšáƒ˜áƒ¡_მáƒáƒ˜áƒ¡áƒ¡_ივნისს_ივლისს_áƒáƒ’ვისტს_სექტემბერს_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერს_ნáƒáƒ”მბერს_დეკემბერს".split("_")},d=/D[oD] *MMMM?/.test(b)?"accusative":"nominative"; +return c[d][a.month()]}function c(a,b){var c={nominative:"კვირáƒ_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ი_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი_ხუთშáƒáƒ‘áƒáƒ—ი_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი_შáƒáƒ‘áƒáƒ—ი".split("_"),accusative:"კვირáƒáƒ¡_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ს_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ს_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ს_ხუთშáƒáƒ‘áƒáƒ—ს_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვს_შáƒáƒ‘áƒáƒ—ს".split("_")},d=/(წინáƒ|შემდეგ)/.test(b)?"accusative":"nominative";return c[d][a.day()]}return a.defineLocale("ka",{months:b,monthsShort:"იáƒáƒœ_თებ_მáƒáƒ _áƒáƒžáƒ _მáƒáƒ˜_ივნ_ივლ_áƒáƒ’ვ_სექ_áƒáƒ¥áƒ¢_ნáƒáƒ”_დეკ".split("_"),weekdays:c,weekdaysShort:"კვი_áƒáƒ áƒ¨_სáƒáƒ›_áƒáƒ—ხ_ხუთ_პáƒáƒ _შáƒáƒ‘".split("_"),weekdaysMin:"კვ_áƒáƒ _სáƒ_áƒáƒ—_ხუ_პáƒ_შáƒ".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[დღეს] LT[-ზე]",nextDay:"[ხვáƒáƒš] LT[-ზე]",lastDay:"[გუშინ] LT[-ზე]",nextWeek:"[შემდეგ] dddd LT[-ზე]",lastWeek:"[წინáƒ] dddd LT-ზე",sameElse:"L"},relativeTime:{future:function(a){return/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|წელი)/.test(a)?a.replace(/ი$/,"ში"):a+"ში"},past:function(a){return/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|დღე|თვე)/.test(a)?a.replace(/(ი|ე)$/,"ის წინ"):/წელი/.test(a)?a.replace(/წელი$/,"წლის წინ"):void 0},s:"რáƒáƒ›áƒ“ენიმე წáƒáƒ›áƒ˜",m:"წუთი",mm:"%d წუთი",h:"სáƒáƒáƒ—ი",hh:"%d სáƒáƒáƒ—ი",d:"დღე",dd:"%d დღე",M:"თვე",MM:"%d თვე",y:"წელი",yy:"%d წელი"},ordinalParse:/0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/,ordinal:function(a){return 0===a?a:1===a?a+"-ლი":20>a||100>=a&&a%20===0||a%100===0?"მე-"+a:a+"-ე"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("km",{months:"មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ".split("_"),monthsShort:"មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ".split("_"),weekdays:"អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ".split("_"),weekdaysShort:"អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ".split("_"),weekdaysMin:"អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[ážáŸ’ងៃនៈ ម៉ោង] LT",nextDay:"[ស្អែក ម៉ោង] LT",nextWeek:"dddd [ម៉ោង] LT",lastDay:"[ម្សិលមិញ ម៉ោង] LT",lastWeek:"dddd [សប្ážáž¶áž áŸáž˜áž»áž“] [ម៉ោង] LT",sameElse:"L"},relativeTime:{future:"%sទៀáž",past:"%sមុន",s:"ប៉ុន្មានវិនាទី",m:"មួយនាទី",mm:"%d នាទី",h:"មួយម៉ោង",hh:"%d ម៉ោង",d:"មួយážáŸ’ងៃ",dd:"%d ážáŸ’ងៃ",M:"មួយážáŸ‚",MM:"%d ážáŸ‚",y:"មួយឆ្នាំ",yy:"%d ឆ្នាំ"},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ko",{months:"1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"),monthsShort:"1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"),weekdays:"ì¼ìš”ì¼_월요ì¼_화요ì¼_수요ì¼_목요ì¼_금요ì¼_토요ì¼".split("_"),weekdaysShort:"ì¼_ì›”_í™”_수_목_금_토".split("_"),weekdaysMin:"ì¼_ì›”_í™”_수_목_금_토".split("_"),longDateFormat:{LT:"A hì‹œ m분",LTS:"A hì‹œ m분 sì´ˆ",L:"YYYY.MM.DD",LL:"YYYYë…„ MMMM Dì¼",LLL:"YYYYë…„ MMMM Dì¼ LT",LLLL:"YYYYë…„ MMMM Dì¼ dddd LT"},calendar:{sameDay:"오늘 LT",nextDay:"ë‚´ì¼ LT",nextWeek:"dddd LT",lastDay:"ì–´ì œ LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s ì „",s:"몇초",ss:"%dì´ˆ",m:"ì¼ë¶„",mm:"%d분",h:"한시간",hh:"%d시간",d:"하루",dd:"%dì¼",M:"한달",MM:"%d달",y:"ì¼ë…„",yy:"%dë…„"},ordinalParse:/\d{1,2}ì¼/,ordinal:"%dì¼",meridiemParse:/오전|오후/,isPM:function(a){return"오후"===a},meridiem:function(a){return 12>a?"오전":"오후"}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return b?d[c][0]:d[c][1]}function c(a){var b=a.substr(0,a.indexOf(" "));return e(b)?"a "+a:"an "+a}function d(a){var b=a.substr(0,a.indexOf(" "));return e(b)?"viru "+a:"virun "+a}function e(a){if(a=parseInt(a,10),isNaN(a))return!1;if(0>a)return!0;if(10>a)return a>=4&&7>=a?!0:!1;if(100>a){var b=a%10,c=a/10;return e(0===b?c:b)}if(1e4>a){for(;a>=10;)a/=10;return e(a)}return a/=1e3,e(a)}return a.defineLocale("lb",{months:"Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._Mé._Dë._Më._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mé_Dë_Më_Do_Fr_Sa".split("_"),longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gëschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:c,past:d,s:"e puer Sekonnen",m:b,mm:"%d Minutten",h:b,hh:"%d Stonnen",d:b,dd:"%d Deeg",M:b,MM:"%d Méint",y:b,yy:"%d Joer"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c,d){return b?"kelios sekundÄ—s":d?"kelių sekundžių":"kelias sekundes"}function c(a,b,c,d){return b?e(c)[0]:d?e(c)[1]:e(c)[2]}function d(a){return a%10===0||a>10&&20>a}function e(a){return h[a].split("_")}function f(a,b,f,g){var h=a+" ";return 1===a?h+c(a,b,f[0],g):b?h+(d(a)?e(f)[1]:e(f)[0]):g?h+e(f)[1]:h+(d(a)?e(f)[1]:e(f)[2])}function g(a,b){var c=-1===b.indexOf("dddd HH:mm"),d=i[a.day()];return c?d:d.substring(0,d.length-2)+"į"}var h={m:"minutÄ—_minutÄ—s_minutÄ™",mm:"minutÄ—s_minuÄių_minutes",h:"valanda_valandos_valandÄ…",hh:"valandos_valandų_valandas",d:"diena_dienos_dienÄ…",dd:"dienos_dienų_dienas",M:"mÄ—nuo_mÄ—nesio_mÄ—nesį",MM:"mÄ—nesiai_mÄ—nesių_mÄ—nesius",y:"metai_metų_metus",yy:"metai_metų_metus"},i="sekmadienis_pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis".split("_");return a.defineLocale("lt",{months:"sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio".split("_"),monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:g,weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Å eÅ¡".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Å ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], LT [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, LT [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], LT [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, LT [val.]"},calendar:{sameDay:"[Å iandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[PraÄ—jusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieÅ¡ %s",s:b,m:c,mm:f,h:c,hh:f,d:c,dd:f,M:c,MM:f,y:c,yy:f},ordinalParse:/\d{1,2}-oji/,ordinal:function(a){return a+"-oji"},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d=a.split("_");return c?b%10===1&&11!==b?d[2]:d[3]:b%10===1&&11!==b?d[0]:d[1]}function c(a,c,e){return a+" "+b(d[e],a,c)}var d={mm:"minÅ«ti_minÅ«tes_minÅ«te_minÅ«tes",hh:"stundu_stundas_stunda_stundas",dd:"dienu_dienas_diena_dienas",MM:"mÄ“nesi_mÄ“neÅ¡us_mÄ“nesis_mÄ“neÅ¡i",yy:"gadu_gadus_gads_gadi"};return a.defineLocale("lv",{months:"janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jÅ«n_jÅ«l_aug_sep_okt_nov_dec".split("_"),weekdays:"svÄ“tdiena_pirmdiena_otrdiena_treÅ¡diena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, LT",LLLL:"YYYY. [gada] D. MMMM, dddd, LT"},calendar:{sameDay:"[Å odien pulksten] LT",nextDay:"[RÄ«t pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[PagÄjuÅ¡Ä] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"%s vÄ“lÄk",past:"%s agrÄk",s:"dažas sekundes",m:"minÅ«ti",mm:c,h:"stundu",hh:c,d:"dienu",dd:c,M:"mÄ“nesi",MM:c,y:"gadu",yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("mk",{months:"јануари_февруари_март_април_мај_јуни_јули_авгуÑÑ‚_Ñептември_октомври_ноември_декември".split("_"),monthsShort:"јан_фев_мар_апр_мај_јун_јул_авг_Ñеп_окт_ное_дек".split("_"),weekdays:"недела_понеделник_вторник_Ñреда_четврток_петок_Ñабота".split("_"),weekdaysShort:"нед_пон_вто_Ñре_чет_пет_Ñаб".split("_"),weekdaysMin:"нe_пo_вт_ÑÑ€_че_пе_Ña".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Ð”ÐµÐ½ÐµÑ Ð²Ð¾] LT",nextDay:"[Утре во] LT",nextWeek:"dddd [во] LT",lastDay:"[Вчера во] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Во изминатата] dddd [во] LT";case 1:case 2:case 4:case 5:return"[Во изминатиот] dddd [во] LT"}},sameElse:"L"},relativeTime:{future:"поÑле %s",past:"пред %s",s:"неколку Ñекунди",m:"минута",mm:"%d минути",h:"чаÑ",hh:"%d чаÑа",d:"ден",dd:"%d дена",M:"меÑец",MM:"%d меÑеци",y:"година",yy:"%d години"},ordinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(a){var b=a%10,c=a%100;return 0===a?a+"-ев":0===c?a+"-ен":c>10&&20>c?a+"-ти":1===b?a+"-ви":2===b?a+"-ри":7===b||8===b?a+"-ми":a+"-ти"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ml",{months:"ജനàµà´µà´°à´¿_ഫെബàµà´°àµà´µà´°à´¿_മാർചàµà´šàµ_à´à´ªàµà´°à´¿àµ½_മേയàµ_ജൂൺ_ജൂലൈ_à´“à´—à´¸àµà´±àµà´±àµ_സെപàµà´±àµà´±à´‚ബർ_à´’à´•àµà´Ÿàµ‹à´¬àµ¼_നവംബർ_ഡിസംബർ".split("_"),monthsShort:"ജനàµ._ഫെബàµà´°àµ._മാർ._à´à´ªàµà´°à´¿._മേയàµ_ജൂൺ_ജൂലൈ._à´“à´—._സെപàµà´±àµà´±._à´’à´•àµà´Ÿàµ‹._നവം._ഡിസം.".split("_"),weekdays:"ഞായറാഴàµà´š_തിങàµà´•à´³à´¾à´´àµà´š_ചൊവàµà´µà´¾à´´àµà´š_à´¬àµà´§à´¨à´¾à´´àµà´š_à´µàµà´¯à´¾à´´à´¾à´´àµà´š_വെളàµà´³à´¿à´¯à´¾à´´àµà´š_ശനിയാഴàµà´š".split("_"),weekdaysShort:"ഞായർ_തിങàµà´•àµ¾_ചൊവàµà´µ_à´¬àµà´§àµ»_à´µàµà´¯à´¾à´´à´‚_വെളàµà´³à´¿_ശനി".split("_"),weekdaysMin:"à´žà´¾_തി_ചൊ_à´¬àµ_à´µàµà´¯à´¾_വെ_à´¶".split("_"),longDateFormat:{LT:"A h:mm -à´¨àµ",LTS:"A h:mm:ss -à´¨àµ",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[ഇനàµà´¨àµ] LT",nextDay:"[നാളെ] LT",nextWeek:"dddd, LT",lastDay:"[ഇനàµà´¨à´²àµ†] LT",lastWeek:"[à´•à´´à´¿à´žàµà´ž] dddd, LT",sameElse:"L"},relativeTime:{future:"%s à´•à´´à´¿à´žàµà´žàµ",past:"%s à´®àµàµ»à´ªàµ",s:"അൽപ നിമിഷങàµà´™àµ¾",m:"ഒരൠമിനിറàµà´±àµ",mm:"%d മിനിറàµà´±àµ",h:"ഒരൠമണികàµà´•àµ‚ർ",hh:"%d മണികàµà´•àµ‚ർ",d:"ഒരൠദിവസം",dd:"%d ദിവസം",M:"ഒരൠമാസം",MM:"%d മാസം",y:"ഒരൠവർഷം",yy:"%d വർഷം"},meridiemParse:/രാതàµà´°à´¿|രാവിലെ|ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿/i,isPM:function(a){return/^(ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿)$/.test(a)},meridiem:function(a){return 4>a?"രാതàµà´°à´¿":12>a?"രാവിലെ":17>a?"ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ":20>a?"വൈകàµà´¨àµà´¨àµ‡à´°à´‚":"രാതàµà´°à´¿"}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return a.defineLocale("mr",{months:"जानेवारी_फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€_मारà¥à¤š_à¤à¤ªà¥à¤°à¤¿à¤²_मे_जून_जà¥à¤²à¥ˆ_ऑगसà¥à¤Ÿ_सपà¥à¤Ÿà¥‡à¤‚बर_ऑकà¥à¤Ÿà¥‹à¤¬à¤°_नोवà¥à¤¹à¥‡à¤‚बर_डिसेंबर".split("_"),monthsShort:"जाने._फेबà¥à¤°à¥._मारà¥à¤š._à¤à¤ªà¥à¤°à¤¿._मे._जून._जà¥à¤²à¥ˆ._ऑग._सपà¥à¤Ÿà¥‡à¤‚._ऑकà¥à¤Ÿà¥‹._नोवà¥à¤¹à¥‡à¤‚._डिसें.".split("_"),weekdays:"रविवार_सोमवार_मंगळवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगळ_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि".split("_"),weekdaysMin:"र_सो_मं_बà¥_गà¥_शà¥_श".split("_"),longDateFormat:{LT:"A h:mm वाजता",LTS:"A h:mm:ss वाजता",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[आज] LT",nextDay:"[उदà¥à¤¯à¤¾] LT",nextWeek:"dddd, LT",lastDay:"[काल] LT",lastWeek:"[मागील] dddd, LT",sameElse:"L"},relativeTime:{future:"%s नंतर",past:"%s पूरà¥à¤µà¥€",s:"सेकंद",m:"à¤à¤• मिनिट",mm:"%d मिनिटे",h:"à¤à¤• तास",hh:"%d तास",d:"à¤à¤• दिवस",dd:"%d दिवस",M:"à¤à¤• महिना",MM:"%d महिने",y:"à¤à¤• वरà¥à¤·",yy:"%d वरà¥à¤·à¥‡"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/रातà¥à¤°à¥€|सकाळी|दà¥à¤ªà¤¾à¤°à¥€|सायंकाळी/,meridiemHour:function(a,b){return 12===a&&(a=0),"रातà¥à¤°à¥€"===b?4>a?a:a+12:"सकाळी"===b?a:"दà¥à¤ªà¤¾à¤°à¥€"===b?a>=10?a:a+12:"सायंकाळी"===b?a+12:void 0},meridiem:function(a){return 4>a?"रातà¥à¤°à¥€":10>a?"सकाळी":17>a?"दà¥à¤ªà¤¾à¤°à¥€":20>a?"सायंकाळी":"रातà¥à¤°à¥€"},week:{dow:0,doy:6}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"LT.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] LT",LLLL:"dddd, D MMMM YYYY [pukul] LT"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(a,b){return 12===a&&(a=0),"pagi"===b?a:"tengahari"===b?a>=11?a:a+12:"petang"===b||"malam"===b?a+12:void 0},meridiem:function(a){return 11>a?"pagi":15>a?"tengahari":19>a?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"á",2:"á‚",3:"áƒ",4:"á„",5:"á…",6:"á†",7:"á‡",8:"áˆ",9:"á‰",0:"á€"},c={"á":"1","á‚":"2","áƒ":"3","á„":"4","á…":"5","á†":"6","á‡":"7","áˆ":"8","á‰":"9","á€":"0"};return a.defineLocale("my",{months:"ဇန်နá€á€«á€›á€®_ဖေဖော်á€á€«á€›á€®_မá€á€º_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုá€á€º_စက်á€á€„်ဘာ_အောက်á€á€­á€¯á€˜á€¬_နိုá€á€„်ဘာ_ဒီဇင်ဘာ".split("_"),monthsShort:"ဇန်_ဖေ_မá€á€º_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ".split("_"),weekdays:"á€á€”င်္ဂနွေ_á€á€”င်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပá€á€±á€¸_သောကြာ_စနေ".split("_"),weekdaysShort:"နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),weekdaysMin:"နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[ယနေ.] LT [မှာ]",nextDay:"[မနက်ဖြန်] LT [မှာ]",nextWeek:"dddd LT [မှာ]",lastDay:"[မနေ.က] LT [မှာ]",lastWeek:"[ပြီးá€á€²á€·á€žá€±á€¬] dddd LT [မှာ]",sameElse:"L"},relativeTime:{future:"လာမည့် %s မှာ",past:"လွန်á€á€²á€·á€žá€±á€¬ %s က",s:"စက္ကန်.အနည်းငယ်",m:"á€á€…်မိနစ်",mm:"%d မိနစ်",h:"á€á€…်နာရီ",hh:"%d နာရီ",d:"á€á€…်ရက်",dd:"%d ရက်",M:"á€á€…်လ",MM:"%d လ",y:"á€á€…်နှစ်",yy:"%d နှစ်"},preparse:function(a){return a.replace(/[áá‚áƒá„á…á†á‡áˆá‰á€]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tirs_ons_tors_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"H.mm",LTS:"LT.ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i gÃ¥r kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"for %s siden",s:"noen sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en mÃ¥ned",MM:"%d mÃ¥neder",y:"ett Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return a.defineLocale("ne",{months:"जनवरी_फेबà¥à¤°à¥à¤µà¤°à¥€_मारà¥à¤š_अपà¥à¤°à¤¿à¤²_मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ_अगषà¥à¤Ÿ_सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°_अकà¥à¤Ÿà¥‹à¤¬à¤°_नोभेमà¥à¤¬à¤°_डिसेमà¥à¤¬à¤°".split("_"),monthsShort:"जन._फेबà¥à¤°à¥._मारà¥à¤š_अपà¥à¤°à¤¿._मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ._अग._सेपà¥à¤Ÿ._अकà¥à¤Ÿà¥‹._नोभे._डिसे.".split("_"),weekdays:"आइतबार_सोमबार_मङà¥à¤—लबार_बà¥à¤§à¤¬à¤¾à¤°_बिहिबार_शà¥à¤•à¥à¤°à¤¬à¤¾à¤°_शनिबार".split("_"),weekdaysShort:"आइत._सोम._मङà¥à¤—ल._बà¥à¤§._बिहि._शà¥à¤•à¥à¤°._शनि.".split("_"),weekdaysMin:"आइ._सो._मङà¥_बà¥._बि._शà¥._श.".split("_"),longDateFormat:{LT:"Aको h:mm बजे",LTS:"Aको h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/राती|बिहान|दिउà¤à¤¸à¥‹|बेलà¥à¤•à¤¾|साà¤à¤|राती/,meridiemHour:function(a,b){return 12===a&&(a=0),"राती"===b?3>a?a:a+12:"बिहान"===b?a:"दिउà¤à¤¸à¥‹"===b?a>=10?a:a+12:"बेलà¥à¤•à¤¾"===b||"साà¤à¤"===b?a+12:void 0},meridiem:function(a){return 3>a?"राती":10>a?"बिहान":15>a?"दिउà¤à¤¸à¥‹":18>a?"बेलà¥à¤•à¤¾":20>a?"साà¤à¤":"राती"},calendar:{sameDay:"[आज] LT",nextDay:"[भोली] LT",nextWeek:"[आउà¤à¤¦à¥‹] dddd[,] LT",lastDay:"[हिजो] LT",lastWeek:"[गà¤à¤•à¥‹] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%sमा",past:"%s अगाडी",s:"केही समय",m:"à¤à¤• मिनेट",mm:"%d मिनेट",h:"à¤à¤• घणà¥à¤Ÿà¤¾",hh:"%d घणà¥à¤Ÿà¤¾",d:"à¤à¤• दिन",dd:"%d दिन",M:"à¤à¤• महिना",MM:"%d महिना",y:"à¤à¤• बरà¥à¤·",yy:"%d बरà¥à¤·"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),c="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_");return a.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(a,d){return/-MMM-/.test(d)?c[a.month()]:b[a.month()]},weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_mÃ¥ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_mÃ¥n_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_mÃ¥_ty_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I gÃ¥r klokka] LT",lastWeek:"[FøregÃ¥ande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"for %s sidan",s:"nokre sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",M:"ein mÃ¥nad",MM:"%d mÃ¥nader",y:"eit Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a){return 5>a%10&&a%10>1&&~~(a/10)%10!==1}function c(a,c,d){var e=a+" ";switch(d){case"m":return c?"minuta":"minutÄ™";case"mm":return e+(b(a)?"minuty":"minut");case"h":return c?"godzina":"godzinÄ™";case"hh":return e+(b(a)?"godziny":"godzin");case"MM":return e+(b(a)?"miesiÄ…ce":"miesiÄ™cy");case"yy":return e+(b(a)?"lata":"lat")}}var d="styczeÅ„_luty_marzec_kwiecieÅ„_maj_czerwiec_lipiec_sierpieÅ„_wrzesieÅ„_październik_listopad_grudzieÅ„".split("_"),e="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrzeÅ›nia_października_listopada_grudnia".split("_");return a.defineLocale("pl",{months:function(a,b){return/D MMMM/.test(b)?e[a.month()]:d[a.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziaÅ‚ek_wtorek_Å›roda_czwartek_piÄ…tek_sobota".split("_"),weekdaysShort:"nie_pon_wt_Å›r_czw_pt_sb".split("_"),weekdaysMin:"N_Pn_Wt_Åšr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[DziÅ› o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszÅ‚Ä… niedzielÄ™ o] LT";case 3:return"[W zeszÅ‚Ä… Å›rodÄ™ o] LT";case 6:return"[W zeszÅ‚Ä… sobotÄ™ o] LT";default:return"[W zeszÅ‚y] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:c,mm:c,h:c,hh:c,d:"1 dzieÅ„",dd:"%d dni",M:"miesiÄ…c",MM:c,y:"rok",yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("pt-br",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] LT",LLLL:"dddd, D [de] MMMM [de] YYYY [às] LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº"})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("pt",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d={mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"},e=" ";return(a%100>=20||a>=100&&a%100===0)&&(e=" de "),a+e+d[c]}return a.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),weekdays:"duminică_luni_marÈ›i_miercuri_joi_vineri_sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",m:"un minut",mm:b,h:"o oră",hh:b,d:"o zi",dd:b,M:"o lună",MM:b,y:"un an",yy:b},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:c?"минута_минуты_минут":"минуту_минуты_минут",hh:"чаÑ_чаÑа_чаÑов",dd:"день_днÑ_дней",MM:"меÑÑц_меÑÑца_меÑÑцев",yy:"год_года_лет"};return"m"===d?c?"минута":"минуту":a+" "+b(e[d],+a)}function d(a,b){var c={nominative:"Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь".split("_"),accusative:"ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function e(a,b){var c={nominative:"Ñнв_фев_март_апр_май_июнь_июль_авг_Ñен_окт_ноÑ_дек".split("_"),accusative:"Ñнв_фев_мар_апр_маÑ_июнÑ_июлÑ_авг_Ñен_окт_ноÑ_дек".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function f(a,b){var c={nominative:"воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота".split("_"),accusative:"воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу".split("_")},d=/\[ ?[Вв] ?(?:прошлую|Ñледующую|Ñту)? ?\] ?dddd/.test(b)?"accusative":"nominative";return c[d][a.day()]}return a.defineLocale("ru",{months:d,monthsShort:e,weekdays:f,weekdaysShort:"вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),weekdaysMin:"вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),monthsParse:[/^Ñнв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[й|Ñ]/i,/^июн/i,/^июл/i,/^авг/i,/^Ñен/i,/^окт/i,/^ноÑ/i,/^дек/i],longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., LT",LLLL:"dddd, D MMMM YYYY г., LT"},calendar:{sameDay:"[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT",nextDay:"[Завтра в] LT",lastDay:"[Вчера в] LT",nextWeek:function(){return 2===this.day()?"[Во] dddd [в] LT":"[Ð’] dddd [в] LT"},lastWeek:function(a){if(a.week()===this.week())return 2===this.day()?"[Во] dddd [в] LT":"[Ð’] dddd [в] LT";switch(this.day()){case 0:return"[Ð’ прошлое] dddd [в] LT";case 1:case 2:case 4:return"[Ð’ прошлый] dddd [в] LT";case 3:case 5:case 6:return"[Ð’ прошлую] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"неÑколько Ñекунд",m:c,mm:c,h:"чаÑ",hh:c,d:"день",dd:c,M:"меÑÑц",MM:c,y:"год",yy:c},meridiemParse:/ночи|утра|днÑ|вечера/i,isPM:function(a){return/^(днÑ|вечера)$/.test(a)},meridiem:function(a){return 4>a?"ночи":12>a?"утра":17>a?"днÑ":"вечера"},ordinalParse:/\d{1,2}-(й|го|Ñ)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":return a+"-й";case"D":return a+"-го";case"w":case"W":return a+"-Ñ";default:return a}},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a){return a>1&&5>a}function c(a,c,d,e){var f=a+" ";switch(d){case"s":return c||e?"pár sekúnd":"pár sekundami";case"m":return c?"minúta":e?"minútu":"minútou";case"mm":return c||e?f+(b(a)?"minúty":"minút"):f+"minútami";break;case"h":return c?"hodina":e?"hodinu":"hodinou";case"hh":return c||e?f+(b(a)?"hodiny":"hodín"):f+"hodinami";break;case"d":return c||e?"deň":"dňom";case"dd":return c||e?f+(b(a)?"dni":"dní"):f+"dňami";break;case"M":return c||e?"mesiac":"mesiacom";case"MM":return c||e?f+(b(a)?"mesiace":"mesiacov"):f+"mesiacmi";break;case"y":return c||e?"rok":"rokom";case"yy":return c||e?f+(b(a)?"roky":"rokov"):f+"rokmi"}}var d="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),e="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");return a.defineLocale("sk",{months:d,monthsShort:e,monthsParse:function(a,b){var c,d=[];for(c=0;12>c;c++)d[c]=new RegExp("^"+a[c]+"$|^"+b[c]+"$","i");return d}(d,e),weekdays:"nedeľa_pondelok_utorok_streda_Å¡tvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_Å¡t_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_Å¡t_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo Å¡tvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[vÄera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT";case 1:case 2:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 4:case 5:return"[minulý] dddd [o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d=a+" ";switch(c){case"m":return b?"ena minuta":"eno minuto";case"mm":return d+=1===a?"minuta":2===a?"minuti":3===a||4===a?"minute":"minut";case"h":return b?"ena ura":"eno uro";case"hh":return d+=1===a?"ura":2===a?"uri":3===a||4===a?"ure":"ur";case"dd":return d+=1===a?"dan":"dni"; +case"MM":return d+=1===a?"mesec":2===a?"meseca":3===a||4===a?"mesece":"mesecev";case"yy":return d+=1===a?"leto":2===a?"leti":3===a||4===a?"leta":"let"}}return a.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),weekdays:"nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._Äet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_Äe_pe_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[vÄeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[prejÅ¡nja] dddd [ob] LT";case 1:case 2:case 4:case 5:return"[prejÅ¡nji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"Äez %s",past:"%s nazaj",s:"nekaj sekund",m:b,mm:b,h:b,hh:b,d:"en dan",dd:b,M:"en mesec",MM:b,y:"eno leto",yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"),weekdays:"E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë".split("_"),weekdaysShort:"Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_Më_E_P_Sh".split("_"),meridiemParse:/PD|MD/,isPM:function(a){return"M"===a.charAt(0)},meridiem:function(a){return 12>a?"PD":"MD"},longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Sot në] LT",nextDay:"[Nesër në] LT",nextWeek:"dddd [në] LT",lastDay:"[Dje në] LT",lastWeek:"dddd [e kaluar në] LT",sameElse:"L"},relativeTime:{future:"në %s",past:"%s më parë",s:"disa sekonda",m:"një minutë",mm:"%d minuta",h:"një orë",hh:"%d orë",d:"një ditë",dd:"%d ditë",M:"një muaj",MM:"%d muaj",y:"një vit",yy:"%d vite"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={words:{m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један Ñат","једног Ñата"],hh:["Ñат","Ñата","Ñати"],dd:["дан","дана","дана"],MM:["меÑец","меÑеца","меÑеци"],yy:["година","године","година"]},correctGrammaticalCase:function(a,b){return 1===a?b[0]:a>=2&&4>=a?b[1]:b[2]},translate:function(a,c,d){var e=b.words[d];return 1===d.length?c?e[0]:e[1]:a+" "+b.correctGrammaticalCase(a,e)}};return a.defineLocale("sr-cyrl",{months:["јануар","фебруар","март","април","мај","јун","јул","авгуÑÑ‚","Ñептембар","октобар","новембар","децембар"],monthsShort:["јан.","феб.","мар.","апр.","мај","јун","јул","авг.","Ñеп.","окт.","нов.","дец."],weekdays:["недеља","понедељак","уторак","Ñреда","четвртак","петак","Ñубота"],weekdaysShort:["нед.","пон.","уто.","Ñре.","чет.","пет.","Ñуб."],weekdaysMin:["не","по","ут","ÑÑ€","че","пе","Ñу"],longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Ð´Ð°Ð½Ð°Ñ Ñƒ] LT",nextDay:"[Ñутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [Ñреду] [у] LT";case 6:return"[у] [Ñуботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){var a=["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [Ñреде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [Ñуботе] [у] LT"];return a[this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико Ñекунди",m:b.translate,mm:b.translate,h:b.translate,hh:b.translate,d:"дан",dd:b.translate,M:"меÑец",MM:b.translate,y:"годину",yy:b.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={words:{m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(a,b){return 1===a?b[0]:a>=2&&4>=a?b[1]:b[2]},translate:function(a,c,d){var e=b.words[d];return 1===d.length?c?e[0]:e[1]:a+" "+b.correctGrammaticalCase(a,e)}};return a.defineLocale("sr",{months:["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar"],monthsShort:["jan.","feb.","mar.","apr.","maj","jun","jul","avg.","sep.","okt.","nov.","dec."],weekdays:["nedelja","ponedeljak","utorak","sreda","Äetvrtak","petak","subota"],weekdaysShort:["ned.","pon.","uto.","sre.","Äet.","pet.","sub."],weekdaysMin:["ne","po","ut","sr","Äe","pe","su"],longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄe u] LT",lastWeek:function(){var a=["[proÅ¡le] [nedelje] [u] LT","[proÅ¡log] [ponedeljka] [u] LT","[proÅ¡log] [utorka] [u] LT","[proÅ¡le] [srede] [u] LT","[proÅ¡log] [Äetvrtka] [u] LT","[proÅ¡log] [petka] [u] LT","[proÅ¡le] [subote] [u] LT"];return a[this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",m:b.translate,mm:b.translate,h:b.translate,hh:b.translate,d:"dan",dd:b.translate,M:"mesec",MM:b.translate,y:"godinu",yy:b.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_mÃ¥ndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mÃ¥n_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_mÃ¥_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[IgÃ¥r] LT",nextWeek:"dddd LT",lastWeek:"[Förra] dddd[en] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"nÃ¥gra sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en mÃ¥nad",MM:"%d mÃ¥nader",y:"ett Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}(e|a)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"e":1===b?"a":2===b?"a":"e";return a+c},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ta",{months:"ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯".split("_"),monthsShort:"ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯".split("_"),weekdays:"ஞாயிறà¯à®±à¯à®•à¯à®•à®¿à®´à®®à¯ˆ_திஙà¯à®•à®Ÿà¯à®•à®¿à®´à®®à¯ˆ_செவà¯à®µà®¾à®¯à¯à®•à®¿à®´à®®à¯ˆ_பà¯à®¤à®©à¯à®•à®¿à®´à®®à¯ˆ_வியாழகà¯à®•à®¿à®´à®®à¯ˆ_வெளà¯à®³à®¿à®•à¯à®•à®¿à®´à®®à¯ˆ_சனிகà¯à®•à®¿à®´à®®à¯ˆ".split("_"),weekdaysShort:"ஞாயிறà¯_திஙà¯à®•à®³à¯_செவà¯à®µà®¾à®¯à¯_பà¯à®¤à®©à¯_வியாழனà¯_வெளà¯à®³à®¿_சனி".split("_"),weekdaysMin:"ஞா_தி_செ_பà¯_வி_வெ_ச".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[இனà¯à®±à¯] LT",nextDay:"[நாளை] LT",nextWeek:"dddd, LT",lastDay:"[நேறà¯à®±à¯] LT",lastWeek:"[கடநà¯à®¤ வாரமà¯] dddd, LT",sameElse:"L"},relativeTime:{future:"%s இலà¯",past:"%s à®®à¯à®©à¯",s:"ஒர௠சில விநாடிகளà¯",m:"ஒர௠நிமிடமà¯",mm:"%d நிமிடஙà¯à®•à®³à¯",h:"ஒர௠மணி நேரமà¯",hh:"%d மணி நேரமà¯",d:"ஒர௠நாளà¯",dd:"%d நாடà¯à®•à®³à¯",M:"ஒர௠மாதமà¯",MM:"%d மாதஙà¯à®•à®³à¯",y:"ஒர௠வரà¯à®Ÿà®®à¯",yy:"%d ஆணà¯à®Ÿà¯à®•à®³à¯"},ordinalParse:/\d{1,2}வதà¯/,ordinal:function(a){return a+"வதà¯"},meridiemParse:/யாமமà¯|வைகறை|காலை|நணà¯à®ªà®•à®²à¯|எறà¯à®ªà®¾à®Ÿà¯|மாலை/,meridiem:function(a){return 2>a?" யாமமà¯":6>a?" வைகறை":10>a?" காலை":14>a?" நணà¯à®ªà®•à®²à¯":18>a?" எறà¯à®ªà®¾à®Ÿà¯":22>a?" மாலை":" யாமமà¯"},meridiemHour:function(a,b){return 12===a&&(a=0),"யாமமà¯"===b?2>a?a:a+12:"வைகறை"===b||"காலை"===b?a:"நணà¯à®ªà®•à®²à¯"===b&&a>=10?a:a+12},week:{dow:0,doy:6}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("th",{months:"มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม".split("_"),monthsShort:"มà¸à¸£à¸²_à¸à¸¸à¸¡à¸ à¸²_มีนา_เมษา_พฤษภา_มิถุนา_à¸à¸£à¸à¸Žà¸²_สิงหา_à¸à¸±à¸™à¸¢à¸²_ตุลา_พฤศจิà¸à¸²_ธันวา".split("_"),weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),longDateFormat:{LT:"H นาฬิà¸à¸² m นาที",LTS:"LT s วินาที",L:"YYYY/MM/DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา LT",LLLL:"วันddddที่ D MMMM YYYY เวลา LT"},meridiemParse:/à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง|หลังเที่ยง/,isPM:function(a){return"หลังเที่ยง"===a},meridiem:function(a){return 12>a?"à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่à¹à¸¥à¹‰à¸§ เวลา] LT",sameElse:"L"},relativeTime:{future:"อีภ%s",past:"%sที่à¹à¸¥à¹‰à¸§",s:"ไม่à¸à¸µà¹ˆà¸§à¸´à¸™à¸²à¸—ี",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY LT",LLLL:"dddd, MMMM DD, YYYY LT"},calendar:{sameDay:"[Ngayon sa] LT",nextDay:"[Bukas sa] LT",nextWeek:"dddd [sa] LT",lastDay:"[Kahapon sa] LT",lastWeek:"dddd [huling linggo] LT",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},ordinalParse:/\d{1,2}/,ordinal:function(a){return a},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"};return a.defineLocale("tr",{months:"Ocak_Åžubat_Mart_Nisan_Mayıs_Haziran_Temmuz_AÄŸustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_ÇarÅŸamba_PerÅŸembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[haftaya] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen hafta] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinalParse:/\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/,ordinal:function(a){if(0===a)return a+"'ıncı";var c=a%10,d=a%100-c,e=a>=100?100:null;return a+(b[c]||b[d]||b[e])},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("tzm-latn",{months:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",m:"minuá¸",mm:"%d minuá¸",h:"saÉ›a",hh:"%d tassaÉ›in",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("tzm",{months:"ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”".split("_"),monthsShort:"ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”".split("_"),weekdays:"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysShort:"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysMin:"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[ⴰⵙⴷⵅ â´´] LT",nextDay:"[ⴰⵙⴽⴰ â´´] LT",nextWeek:"dddd [â´´] LT",lastDay:"[ⴰⵚⴰâµâµœ â´´] LT",lastWeek:"dddd [â´´] LT",sameElse:"L"},relativeTime:{future:"â´·â´°â´·âµ… âµ™ ⵢⴰⵠ%s",past:"ⵢⴰⵠ%s",s:"ⵉⵎⵉⴽ",m:"ⵎⵉâµâµ“â´º",mm:"%d ⵎⵉâµâµ“â´º",h:"ⵙⴰⵄⴰ",hh:"%d ⵜⴰⵙⵙⴰⵄⵉâµ",d:"ⴰⵙⵙ",dd:"%d oⵙⵙⴰâµ",M:"â´°âµ¢oⵓⵔ",MM:"%d ⵉⵢⵢⵉⵔâµ",y:"ⴰⵙⴳⴰⵙ",yy:"%d ⵉⵙⴳⴰⵙâµ"},week:{dow:6,doy:12}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:"хвилина_хвилини_хвилин",hh:"година_години_годин",dd:"день_дні_днів",MM:"міÑÑць_міÑÑці_міÑÑців",yy:"рік_роки_років"};return"m"===d?c?"хвилина":"хвилину":"h"===d?c?"година":"годину":a+" "+b(e[d],+a)}function d(a,b){var c={nominative:"Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень".split("_"),accusative:"ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ".split("_")},d=/D[oD]? *MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function e(a,b){var c={nominative:"неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота".split("_"),accusative:"неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу".split("_"),genitive:"неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи".split("_")},d=/(\[[ВвУу]\]) ?dddd/.test(b)?"accusative":/\[?(?:минулої|наÑтупної)? ?\] ?dddd/.test(b)?"genitive":"nominative";return c[d][a.day()]}function f(a){return function(){return a+"о"+(11===this.hours()?"б":"")+"] LT"}}return a.defineLocale("uk",{months:d,monthsShort:"Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд".split("_"),weekdays:e,weekdaysShort:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),weekdaysMin:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY Ñ€.",LLL:"D MMMM YYYY Ñ€., LT",LLLL:"dddd, D MMMM YYYY Ñ€., LT"},calendar:{sameDay:f("[Сьогодні "),nextDay:f("[Завтра "),lastDay:f("[Вчора "),nextWeek:f("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return f("[Минулої] dddd [").call(this);case 1:case 2:case 4:return f("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька Ñекунд",m:c,mm:c,h:"годину",hh:c,d:"день",dd:c,M:"міÑÑць",MM:c,y:"рік",yy:c},meridiemParse:/ночі|ранку|днÑ|вечора/,isPM:function(a){return/^(днÑ|вечора)$/.test(a)},meridiem:function(a){return 4>a?"ночі":12>a?"ранку":17>a?"днÑ":"вечора"},ordinalParse:/\d{1,2}-(й|го)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":case"w":case"W":return a+"-й";case"D":return a+"-го";default:return a}},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("uz",{months:"Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь".split("_"),monthsShort:"Ñнв_фев_мар_апр_май_июн_июл_авг_Ñен_окт_ноÑ_дек".split("_"),weekdays:"Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"),weekdaysShort:"Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"),weekdaysMin:"Як_Ду_Се_Чо_Па_Жу_Ша".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"D MMMM YYYY, dddd LT"},calendar:{sameDay:"[Бугун Ñоат] LT [да]",nextDay:"[Эртага] LT [да]",nextWeek:"dddd [куни Ñоат] LT [да]",lastDay:"[Кеча Ñоат] LT [да]",lastWeek:"[Утган] dddd [куни Ñоат] LT [да]",sameElse:"L"},relativeTime:{future:"Якин %s ичида",past:"Бир неча %s олдин",s:"фурÑат",m:"бир дакика",mm:"%d дакика",h:"бир Ñоат",hh:"%d Ñоат",d:"бир кун",dd:"%d кун",M:"бир ой",MM:"%d ой",y:"бир йил",yy:"%d йил"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("vi",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),weekdays:"chủ nhật_thứ hai_thứ ba_thứ tÆ°_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY LT",LLLL:"dddd, D MMMM [năm] YYYY LT",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY LT",llll:"ddd, D MMM YYYY LT"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tá»›i lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần rồi lúc] LT",sameElse:"L"},relativeTime:{future:"%s tá»›i",past:"%s trÆ°á»›c",s:"vài giây",m:"má»™t phút",mm:"%d phút",h:"má»™t giá»",hh:"%d giá»",d:"má»™t ngày",dd:"%d ngày",M:"má»™t tháng",MM:"%d tháng",y:"má»™t năm",yy:"%d năm"},ordinalParse:/\d{1,2}/,ordinal:function(a){return a},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"æ—¥_一_二_三_å››_五_å…­".split("_"),longDateFormat:{LT:"Ah点mm",LTS:"Ah点m分s秒",L:"YYYY-MM-DD",LL:"YYYYå¹´MMMDæ—¥",LLL:"YYYYå¹´MMMDæ—¥LT",LLLL:"YYYYå¹´MMMDæ—¥ddddLT",l:"YYYY-MM-DD",ll:"YYYYå¹´MMMDæ—¥",lll:"YYYYå¹´MMMDæ—¥LT",llll:"YYYYå¹´MMMDæ—¥ddddLT"},meridiemParse:/凌晨|早上|上åˆ|中åˆ|下åˆ|晚上/,meridiemHour:function(a,b){return 12===a&&(a=0),"凌晨"===b||"早上"===b||"上åˆ"===b?a:"下åˆ"===b||"晚上"===b?a+12:a>=11?a:a+12},meridiem:function(a,b){var c=100*a+b;return 600>c?"凌晨":900>c?"早上":1130>c?"上åˆ":1230>c?"中åˆ":1800>c?"下åˆ":"晚上"},calendar:{sameDay:function(){return 0===this.minutes()?"[今天]Ah[点整]":"[今天]LT"},nextDay:function(){return 0===this.minutes()?"[明天]Ah[点整]":"[明天]LT"},lastDay:function(){return 0===this.minutes()?"[昨天]Ah[点整]":"[昨天]LT"},nextWeek:function(){var b,c;return b=a().startOf("week"),c=this.unix()-b.unix()>=604800?"[下]":"[本]",0===this.minutes()?c+"dddAh点整":c+"dddAh点mm"},lastWeek:function(){var b,c;return b=a().startOf("week"),c=this.unix()=11?a:a+12:"下åˆ"===b||"晚上"===b?a+12:void 0},meridiem:function(a,b){var c=100*a+b;return 900>c?"早上":1130>c?"上åˆ":1230>c?"中åˆ":1800>c?"下åˆ":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},ordinalParse:/\d{1,2}(æ—¥|月|週)/,ordinal:function(a,b){switch(b){case"d":case"D":case"DDD":return a+"æ—¥";case"M":return a+"月";case"w":case"W":return a+"週";default:return a}},relativeTime:{future:"%så…§",past:"%så‰",s:"幾秒",m:"一分é˜",mm:"%d分é˜",h:"一å°æ™‚",hh:"%då°æ™‚",d:"一天",dd:"%d天",M:"一個月",MM:"%d個月",y:"一年",yy:"%då¹´"}})}); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/moment-with-locales.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/moment-with-locales.js new file mode 100644 index 0000000..202450a --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/moment-with-locales.js @@ -0,0 +1,9792 @@ +//! moment.js +//! version : 2.9.0 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com + +(function (undefined) { + /************************************ + Constants + ************************************/ + + var moment, + VERSION = '2.9.0', + // the global-scope this is NOT the global object in Node.js + globalScope = (typeof global !== 'undefined' && (typeof window === 'undefined' || window === global.window)) ? global : this, + oldGlobalMoment, + round = Math.round, + hasOwnProperty = Object.prototype.hasOwnProperty, + i, + + YEAR = 0, + MONTH = 1, + DATE = 2, + HOUR = 3, + MINUTE = 4, + SECOND = 5, + MILLISECOND = 6, + + // internal storage for locale config files + locales = {}, + + // extra moment internal properties (plugins register props here) + momentProperties = [], + + // check for nodeJS + hasModule = (typeof module !== 'undefined' && module && module.exports), + + // ASP.NET json date format regex + aspNetJsonRegex = /^\/?Date\((\-?\d+)/i, + aspNetTimeSpanJsonRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/, + + // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html + // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere + isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/, + + // format tokens + formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|x|X|zz?|ZZ?|.)/g, + localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, + + // parsing token regexes + parseTokenOneOrTwoDigits = /\d\d?/, // 0 - 99 + parseTokenOneToThreeDigits = /\d{1,3}/, // 0 - 999 + parseTokenOneToFourDigits = /\d{1,4}/, // 0 - 9999 + parseTokenOneToSixDigits = /[+\-]?\d{1,6}/, // -999,999 - 999,999 + parseTokenDigits = /\d+/, // nonzero number of digits + parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i, // any word (or two) characters or numbers including two/three word month in arabic. + parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z + parseTokenT = /T/i, // T (ISO separator) + parseTokenOffsetMs = /[\+\-]?\d+/, // 1234567890123 + parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123 + + //strict parsing regexes + parseTokenOneDigit = /\d/, // 0 - 9 + parseTokenTwoDigits = /\d\d/, // 00 - 99 + parseTokenThreeDigits = /\d{3}/, // 000 - 999 + parseTokenFourDigits = /\d{4}/, // 0000 - 9999 + parseTokenSixDigits = /[+-]?\d{6}/, // -999,999 - 999,999 + parseTokenSignedNumber = /[+-]?\d+/, // -inf - inf + + // iso 8601 regex + // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) + isoRegex = /^\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)?)?$/, + + isoFormat = 'YYYY-MM-DDTHH:mm:ssZ', + + isoDates = [ + ['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}/] + ], + + // iso time formats and regexes + isoTimes = [ + ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d+/], + ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/], + ['HH:mm', /(T| )\d\d:\d\d/], + ['HH', /(T| )\d\d/] + ], + + // timezone chunker '+10:00' > ['10', '00'] or '-1530' > ['-', '15', '30'] + parseTimezoneChunker = /([\+\-]|\d\d)/gi, + + // getter and setter names + proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'), + unitMillisecondFactors = { + 'Milliseconds' : 1, + 'Seconds' : 1e3, + 'Minutes' : 6e4, + 'Hours' : 36e5, + 'Days' : 864e5, + 'Months' : 2592e6, + 'Years' : 31536e6 + }, + + unitAliases = { + ms : 'millisecond', + s : 'second', + m : 'minute', + h : 'hour', + d : 'day', + D : 'date', + w : 'week', + W : 'isoWeek', + M : 'month', + Q : 'quarter', + y : 'year', + DDD : 'dayOfYear', + e : 'weekday', + E : 'isoWeekday', + gg: 'weekYear', + GG: 'isoWeekYear' + }, + + camelFunctions = { + dayofyear : 'dayOfYear', + isoweekday : 'isoWeekday', + isoweek : 'isoWeek', + weekyear : 'weekYear', + isoweekyear : 'isoWeekYear' + }, + + // format function strings + formatFunctions = {}, + + // default relative time thresholds + relativeTimeThresholds = { + s: 45, // seconds to minute + m: 45, // minutes to hour + h: 22, // hours to day + d: 26, // days to month + M: 11 // months to year + }, + + // tokens to ordinalize and pad + ordinalizeTokens = 'DDD w W M D d'.split(' '), + paddedTokens = 'M D H h m s w W'.split(' '), + + formatTokenFunctions = { + M : function () { + return this.month() + 1; + }, + MMM : function (format) { + return this.localeData().monthsShort(this, format); + }, + MMMM : function (format) { + return this.localeData().months(this, format); + }, + D : function () { + return this.date(); + }, + DDD : function () { + return this.dayOfYear(); + }, + d : function () { + return this.day(); + }, + dd : function (format) { + return this.localeData().weekdaysMin(this, format); + }, + ddd : function (format) { + return this.localeData().weekdaysShort(this, format); + }, + dddd : function (format) { + return this.localeData().weekdays(this, format); + }, + w : function () { + return this.week(); + }, + W : function () { + return this.isoWeek(); + }, + YY : function () { + return leftZeroFill(this.year() % 100, 2); + }, + YYYY : function () { + return leftZeroFill(this.year(), 4); + }, + YYYYY : function () { + return leftZeroFill(this.year(), 5); + }, + YYYYYY : function () { + var y = this.year(), sign = y >= 0 ? '+' : '-'; + return sign + leftZeroFill(Math.abs(y), 6); + }, + gg : function () { + return leftZeroFill(this.weekYear() % 100, 2); + }, + gggg : function () { + return leftZeroFill(this.weekYear(), 4); + }, + ggggg : function () { + return leftZeroFill(this.weekYear(), 5); + }, + GG : function () { + return leftZeroFill(this.isoWeekYear() % 100, 2); + }, + GGGG : function () { + return leftZeroFill(this.isoWeekYear(), 4); + }, + GGGGG : function () { + return leftZeroFill(this.isoWeekYear(), 5); + }, + e : function () { + return this.weekday(); + }, + E : function () { + return this.isoWeekday(); + }, + a : function () { + return this.localeData().meridiem(this.hours(), this.minutes(), true); + }, + A : function () { + return this.localeData().meridiem(this.hours(), this.minutes(), false); + }, + 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 toInt(this.milliseconds() / 100); + }, + SS : function () { + return leftZeroFill(toInt(this.milliseconds() / 10), 2); + }, + SSS : function () { + return leftZeroFill(this.milliseconds(), 3); + }, + SSSS : function () { + return leftZeroFill(this.milliseconds(), 3); + }, + Z : function () { + var a = this.utcOffset(), + b = '+'; + if (a < 0) { + a = -a; + b = '-'; + } + return b + leftZeroFill(toInt(a / 60), 2) + ':' + leftZeroFill(toInt(a) % 60, 2); + }, + ZZ : function () { + var a = this.utcOffset(), + b = '+'; + if (a < 0) { + a = -a; + b = '-'; + } + return b + leftZeroFill(toInt(a / 60), 2) + leftZeroFill(toInt(a) % 60, 2); + }, + z : function () { + return this.zoneAbbr(); + }, + zz : function () { + return this.zoneName(); + }, + x : function () { + return this.valueOf(); + }, + X : function () { + return this.unix(); + }, + Q : function () { + return this.quarter(); + } + }, + + deprecations = {}, + + lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin'], + + updateInProgress = false; + + // Pick the first defined of two or three arguments. dfl comes from + // default. + function dfl(a, b, c) { + switch (arguments.length) { + case 2: return a != null ? a : b; + case 3: return a != null ? a : b != null ? b : c; + default: throw new Error('Implement me'); + } + } + + function hasOwnProp(a, b) { + return hasOwnProperty.call(a, b); + } + + function defaultParsingFlags() { + // We need to deep clone this object, and es5 standard is not very + // helpful. + return { + empty : false, + unusedTokens : [], + unusedInput : [], + overflow : -2, + charsLeftOver : 0, + nullInput : false, + invalidMonth : null, + invalidFormat : false, + userInvalidated : false, + iso: false + }; + } + + function printMsg(msg) { + if (moment.suppressDeprecationWarnings === false && + typeof console !== 'undefined' && console.warn) { + console.warn('Deprecation warning: ' + msg); + } + } + + function deprecate(msg, fn) { + var firstTime = true; + return extend(function () { + if (firstTime) { + printMsg(msg); + firstTime = false; + } + return fn.apply(this, arguments); + }, fn); + } + + function deprecateSimple(name, msg) { + if (!deprecations[name]) { + printMsg(msg); + deprecations[name] = true; + } + } + + function padToken(func, count) { + return function (a) { + return leftZeroFill(func.call(this, a), count); + }; + } + function ordinalizeToken(func, period) { + return function (a) { + return this.localeData().ordinal(func.call(this, a), period); + }; + } + + function monthDiff(a, b) { + // difference in months + var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), + // b is in (anchor - 1 month, anchor + 1 month) + anchor = a.clone().add(wholeMonthDiff, 'months'), + anchor2, adjust; + + if (b - anchor < 0) { + anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor - anchor2); + } else { + anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor2 - anchor); + } + + return -(wholeMonthDiff + adjust); + } + + while (ordinalizeTokens.length) { + i = ordinalizeTokens.pop(); + formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i); + } + while (paddedTokens.length) { + i = paddedTokens.pop(); + formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2); + } + formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3); + + + function meridiemFixWrap(locale, hour, meridiem) { + var isPm; + + if (meridiem == null) { + // nothing to do + return hour; + } + if (locale.meridiemHour != null) { + return locale.meridiemHour(hour, meridiem); + } else if (locale.isPM != null) { + // Fallback + isPm = locale.isPM(meridiem); + if (isPm && hour < 12) { + hour += 12; + } + if (!isPm && hour === 12) { + hour = 0; + } + return hour; + } else { + // thie is not supposed to happen + return hour; + } + } + + /************************************ + Constructors + ************************************/ + + function Locale() { + } + + // Moment prototype object + function Moment(config, skipOverflow) { + if (skipOverflow !== false) { + checkOverflow(config); + } + copyConfig(this, config); + this._d = new Date(+config._d); + // Prevent infinite loop in case updateOffset creates new moment + // objects. + if (updateInProgress === false) { + updateInProgress = true; + moment.updateOffset(this); + updateInProgress = false; + } + } + + // Duration Constructor + function Duration(duration) { + var normalizedInput = normalizeObjectUnits(duration), + years = normalizedInput.year || 0, + quarters = normalizedInput.quarter || 0, + months = normalizedInput.month || 0, + weeks = normalizedInput.week || 0, + days = normalizedInput.day || 0, + hours = normalizedInput.hour || 0, + minutes = normalizedInput.minute || 0, + seconds = normalizedInput.second || 0, + milliseconds = normalizedInput.millisecond || 0; + + // representation for dateAddRemove + this._milliseconds = +milliseconds + + seconds * 1e3 + // 1000 + minutes * 6e4 + // 1000 * 60 + hours * 36e5; // 1000 * 60 * 60 + // Because of dateAddRemove treats 24 hours as different from a + // day when working around DST, we need to store them separately + this._days = +days + + weeks * 7; + // It is impossible translate months into days without knowing + // which months you are are talking about, so we have to store + // it separately. + this._months = +months + + quarters * 3 + + years * 12; + + this._data = {}; + + this._locale = moment.localeData(); + + this._bubble(); + } + + /************************************ + Helpers + ************************************/ + + + function extend(a, b) { + for (var i in b) { + if (hasOwnProp(b, i)) { + a[i] = b[i]; + } + } + + if (hasOwnProp(b, 'toString')) { + a.toString = b.toString; + } + + if (hasOwnProp(b, 'valueOf')) { + a.valueOf = b.valueOf; + } + + return a; + } + + function copyConfig(to, from) { + var i, prop, val; + + if (typeof from._isAMomentObject !== 'undefined') { + to._isAMomentObject = from._isAMomentObject; + } + if (typeof from._i !== 'undefined') { + to._i = from._i; + } + if (typeof from._f !== 'undefined') { + to._f = from._f; + } + if (typeof from._l !== 'undefined') { + to._l = from._l; + } + if (typeof from._strict !== 'undefined') { + to._strict = from._strict; + } + if (typeof from._tzm !== 'undefined') { + to._tzm = from._tzm; + } + if (typeof from._isUTC !== 'undefined') { + to._isUTC = from._isUTC; + } + if (typeof from._offset !== 'undefined') { + to._offset = from._offset; + } + if (typeof from._pf !== 'undefined') { + to._pf = from._pf; + } + if (typeof from._locale !== 'undefined') { + to._locale = from._locale; + } + + if (momentProperties.length > 0) { + for (i in momentProperties) { + prop = momentProperties[i]; + val = from[prop]; + if (typeof val !== 'undefined') { + to[prop] = val; + } + } + } + + return to; + } + + function absRound(number) { + if (number < 0) { + return Math.ceil(number); + } else { + return Math.floor(number); + } + } + + // left zero fill a number + // see http://jsperf.com/left-zero-filling for performance comparison + function leftZeroFill(number, targetLength, forceSign) { + var output = '' + Math.abs(number), + sign = number >= 0; + + while (output.length < targetLength) { + output = '0' + output; + } + return (sign ? (forceSign ? '+' : '') : '-') + output; + } + + function positiveMomentsDifference(base, other) { + var res = {milliseconds: 0, months: 0}; + + res.months = other.month() - base.month() + + (other.year() - base.year()) * 12; + if (base.clone().add(res.months, 'M').isAfter(other)) { + --res.months; + } + + res.milliseconds = +other - +(base.clone().add(res.months, 'M')); + + return res; + } + + function momentsDifference(base, other) { + var res; + other = makeAs(other, base); + if (base.isBefore(other)) { + res = positiveMomentsDifference(base, other); + } else { + res = positiveMomentsDifference(other, base); + res.milliseconds = -res.milliseconds; + res.months = -res.months; + } + + return res; + } + + // TODO: remove 'name' arg after deprecation is removed + function createAdder(direction, name) { + return function (val, period) { + var dur, tmp; + //invert the arguments, but complain about it + if (period !== null && !isNaN(+period)) { + deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period).'); + tmp = val; val = period; period = tmp; + } + + val = typeof val === 'string' ? +val : val; + dur = moment.duration(val, period); + addOrSubtractDurationFromMoment(this, dur, direction); + return this; + }; + } + + function addOrSubtractDurationFromMoment(mom, duration, isAdding, updateOffset) { + var milliseconds = duration._milliseconds, + days = duration._days, + months = duration._months; + updateOffset = updateOffset == null ? true : updateOffset; + + if (milliseconds) { + mom._d.setTime(+mom._d + milliseconds * isAdding); + } + if (days) { + rawSetter(mom, 'Date', rawGetter(mom, 'Date') + days * isAdding); + } + if (months) { + rawMonthSetter(mom, rawGetter(mom, 'Month') + months * isAdding); + } + if (updateOffset) { + moment.updateOffset(mom, days || months); + } + } + + // check if is an array + function isArray(input) { + return Object.prototype.toString.call(input) === '[object Array]'; + } + + function isDate(input) { + return Object.prototype.toString.call(input) === '[object Date]' || + input instanceof Date; + } + + // compare two arrays, return the number of differences + function compareArrays(array1, array2, dontConvert) { + var len = Math.min(array1.length, array2.length), + lengthDiff = Math.abs(array1.length - array2.length), + diffs = 0, + i; + for (i = 0; i < len; i++) { + if ((dontConvert && array1[i] !== array2[i]) || + (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { + diffs++; + } + } + return diffs + lengthDiff; + } + + function normalizeUnits(units) { + if (units) { + var lowered = units.toLowerCase().replace(/(.)s$/, '$1'); + units = unitAliases[units] || camelFunctions[lowered] || lowered; + } + return units; + } + + function normalizeObjectUnits(inputObject) { + var normalizedInput = {}, + normalizedProp, + prop; + + for (prop in inputObject) { + if (hasOwnProp(inputObject, prop)) { + normalizedProp = normalizeUnits(prop); + if (normalizedProp) { + normalizedInput[normalizedProp] = inputObject[prop]; + } + } + } + + return normalizedInput; + } + + function makeList(field) { + var count, setter; + + if (field.indexOf('week') === 0) { + count = 7; + setter = 'day'; + } + else if (field.indexOf('month') === 0) { + count = 12; + setter = 'month'; + } + else { + return; + } + + moment[field] = function (format, index) { + var i, getter, + method = moment._locale[field], + results = []; + + if (typeof format === 'number') { + index = format; + format = undefined; + } + + getter = function (i) { + var m = moment().utc().set(setter, i); + return method.call(moment._locale, m, format || ''); + }; + + if (index != null) { + return getter(index); + } + else { + for (i = 0; i < count; i++) { + results.push(getter(i)); + } + return results; + } + }; + } + + function toInt(argumentForCoercion) { + var coercedNumber = +argumentForCoercion, + value = 0; + + if (coercedNumber !== 0 && isFinite(coercedNumber)) { + if (coercedNumber >= 0) { + value = Math.floor(coercedNumber); + } else { + value = Math.ceil(coercedNumber); + } + } + + return value; + } + + function daysInMonth(year, month) { + return new Date(Date.UTC(year, month + 1, 0)).getUTCDate(); + } + + function weeksInYear(year, dow, doy) { + return weekOfYear(moment([year, 11, 31 + dow - doy]), dow, doy).week; + } + + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; + } + + function isLeapYear(year) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; + } + + function checkOverflow(m) { + var overflow; + if (m._a && m._pf.overflow === -2) { + overflow = + m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH : + m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE : + m._a[HOUR] < 0 || m._a[HOUR] > 24 || + (m._a[HOUR] === 24 && (m._a[MINUTE] !== 0 || + m._a[SECOND] !== 0 || + m._a[MILLISECOND] !== 0)) ? HOUR : + m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE : + m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND : + m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND : + -1; + + if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { + overflow = DATE; + } + + m._pf.overflow = overflow; + } + } + + function isValid(m) { + if (m._isValid == null) { + m._isValid = !isNaN(m._d.getTime()) && + m._pf.overflow < 0 && + !m._pf.empty && + !m._pf.invalidMonth && + !m._pf.nullInput && + !m._pf.invalidFormat && + !m._pf.userInvalidated; + + if (m._strict) { + m._isValid = m._isValid && + m._pf.charsLeftOver === 0 && + m._pf.unusedTokens.length === 0 && + m._pf.bigHour === undefined; + } + } + return m._isValid; + } + + function normalizeLocale(key) { + return key ? key.toLowerCase().replace('_', '-') : key; + } + + // pick the locale from the array + // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each + // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root + function chooseLocale(names) { + var i = 0, j, next, locale, split; + + while (i < names.length) { + split = normalizeLocale(names[i]).split('-'); + j = split.length; + next = normalizeLocale(names[i + 1]); + next = next ? next.split('-') : null; + while (j > 0) { + locale = loadLocale(split.slice(0, j).join('-')); + if (locale) { + return locale; + } + if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { + //the next array item is better than a shallower substring of this one + break; + } + j--; + } + i++; + } + return null; + } + + function loadLocale(name) { + var oldLocale = null; + if (!locales[name] && hasModule) { + try { + oldLocale = moment.locale(); + require('./locale/' + name); + // because defineLocale currently also sets the global locale, we want to undo that for lazy loaded locales + moment.locale(oldLocale); + } catch (e) { } + } + return locales[name]; + } + + // Return a moment from input, that is local/utc/utcOffset equivalent to + // model. + function makeAs(input, model) { + var res, diff; + if (model._isUTC) { + res = model.clone(); + diff = (moment.isMoment(input) || isDate(input) ? + +input : +moment(input)) - (+res); + // Use low-level api, because this fn is low-level api. + res._d.setTime(+res._d + diff); + moment.updateOffset(res, false); + return res; + } else { + return moment(input).local(); + } + } + + /************************************ + Locale + ************************************/ + + + extend(Locale.prototype, { + + set : function (config) { + var prop, i; + for (i in config) { + prop = config[i]; + if (typeof prop === 'function') { + this[i] = prop; + } else { + this['_' + i] = prop; + } + } + // Lenient ordinal parsing accepts just a number in addition to + // number + (possibly) stuff coming from _ordinalParseLenient. + this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + /\d{1,2}/.source); + }, + + _months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + months : function (m) { + return this._months[m.month()]; + }, + + _monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + monthsShort : function (m) { + return this._monthsShort[m.month()]; + }, + + monthsParse : function (monthName, format, strict) { + var i, mom, regex; + + if (!this._monthsParse) { + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + } + + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = moment.utc([2000, i]); + if (strict && !this._longMonthsParse[i]) { + this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); + this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); + } + if (!strict && !this._monthsParse[i]) { + regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); + this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { + return i; + } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { + return i; + } else if (!strict && this._monthsParse[i].test(monthName)) { + return i; + } + } + }, + + _weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdays : function (m) { + return this._weekdays[m.day()]; + }, + + _weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysShort : function (m) { + return this._weekdaysShort[m.day()]; + }, + + _weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + weekdaysMin : function (m) { + return this._weekdaysMin[m.day()]; + }, + + weekdaysParse : function (weekdayName) { + var i, mom, regex; + + if (!this._weekdaysParse) { + this._weekdaysParse = []; + } + + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + if (!this._weekdaysParse[i]) { + mom = moment([2000, 1]).day(i); + regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); + this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (this._weekdaysParse[i].test(weekdayName)) { + return i; + } + } + }, + + _longDateFormat : { + LTS : 'h:mm:ss A', + 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 (key) { + var output = this._longDateFormat[key]; + if (!output && this._longDateFormat[key.toUpperCase()]) { + output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) { + return val.slice(1); + }); + this._longDateFormat[key] = output; + } + return output; + }, + + isPM : function (input) { + // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays + // Using charAt should be more compatible. + return ((input + '').toLowerCase().charAt(0) === 'p'); + }, + + _meridiemParse : /[ap]\.?m?\.?/i, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'pm' : 'PM'; + } else { + return isLower ? '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 (key, mom, now) { + var output = this._calendar[key]; + return typeof output === 'function' ? output.apply(mom, [now]) : output; + }, + + _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 (number, withoutSuffix, string, isFuture) { + var output = this._relativeTime[string]; + return (typeof output === 'function') ? + output(number, withoutSuffix, string, isFuture) : + output.replace(/%d/i, number); + }, + + pastFuture : function (diff, output) { + var format = this._relativeTime[diff > 0 ? 'future' : 'past']; + return typeof format === 'function' ? format(output) : format.replace(/%s/i, output); + }, + + ordinal : function (number) { + return this._ordinal.replace('%d', number); + }, + _ordinal : '%d', + _ordinalParse : /\d{1,2}/, + + preparse : function (string) { + return string; + }, + + postformat : function (string) { + return string; + }, + + week : function (mom) { + return weekOfYear(mom, this._week.dow, this._week.doy).week; + }, + + _week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + }, + + firstDayOfWeek : function () { + return this._week.dow; + }, + + firstDayOfYear : function () { + return this._week.doy; + }, + + _invalidDate: 'Invalid date', + invalidDate: function () { + return this._invalidDate; + } + }); + + /************************************ + Formatting + ************************************/ + + + function removeFormattingTokens(input) { + if (input.match(/\[[\s\S]/)) { + return input.replace(/^\[|\]$/g, ''); + } + return input.replace(/\\/g, ''); + } + + function makeFormatFunction(format) { + var array = format.match(formattingTokens), i, length; + + for (i = 0, length = array.length; i < length; i++) { + if (formatTokenFunctions[array[i]]) { + array[i] = formatTokenFunctions[array[i]]; + } else { + array[i] = removeFormattingTokens(array[i]); + } + } + + return function (mom) { + var output = ''; + for (i = 0; i < length; i++) { + output += array[i] instanceof Function ? array[i].call(mom, format) : array[i]; + } + return output; + }; + } + + // format date using native date object + function formatMoment(m, format) { + if (!m.isValid()) { + return m.localeData().invalidDate(); + } + + format = expandFormat(format, m.localeData()); + + if (!formatFunctions[format]) { + formatFunctions[format] = makeFormatFunction(format); + } + + return formatFunctions[format](m); + } + + function expandFormat(format, locale) { + var i = 5; + + function replaceLongDateFormatTokens(input) { + return locale.longDateFormat(input) || input; + } + + localFormattingTokens.lastIndex = 0; + while (i >= 0 && localFormattingTokens.test(format)) { + format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); + localFormattingTokens.lastIndex = 0; + i -= 1; + } + + return format; + } + + + /************************************ + Parsing + ************************************/ + + + // get the regex to find the next token + function getParseRegexForToken(token, config) { + var a, strict = config._strict; + switch (token) { + case 'Q': + return parseTokenOneDigit; + case 'DDDD': + return parseTokenThreeDigits; + case 'YYYY': + case 'GGGG': + case 'gggg': + return strict ? parseTokenFourDigits : parseTokenOneToFourDigits; + case 'Y': + case 'G': + case 'g': + return parseTokenSignedNumber; + case 'YYYYYY': + case 'YYYYY': + case 'GGGGG': + case 'ggggg': + return strict ? parseTokenSixDigits : parseTokenOneToSixDigits; + case 'S': + if (strict) { + return parseTokenOneDigit; + } + /* falls through */ + case 'SS': + if (strict) { + return parseTokenTwoDigits; + } + /* falls through */ + case 'SSS': + if (strict) { + return parseTokenThreeDigits; + } + /* falls through */ + case 'DDD': + return parseTokenOneToThreeDigits; + case 'MMM': + case 'MMMM': + case 'dd': + case 'ddd': + case 'dddd': + return parseTokenWord; + case 'a': + case 'A': + return config._locale._meridiemParse; + case 'x': + return parseTokenOffsetMs; + case 'X': + return parseTokenTimestampMs; + case 'Z': + case 'ZZ': + return parseTokenTimezone; + case 'T': + return parseTokenT; + case 'SSSS': + return parseTokenDigits; + case 'MM': + case 'DD': + case 'YY': + case 'GG': + case 'gg': + case 'HH': + case 'hh': + case 'mm': + case 'ss': + case 'ww': + case 'WW': + return strict ? parseTokenTwoDigits : parseTokenOneOrTwoDigits; + case 'M': + case 'D': + case 'd': + case 'H': + case 'h': + case 'm': + case 's': + case 'w': + case 'W': + case 'e': + case 'E': + return parseTokenOneOrTwoDigits; + case 'Do': + return strict ? config._locale._ordinalParse : config._locale._ordinalParseLenient; + default : + a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), 'i')); + return a; + } + } + + function utcOffsetFromString(string) { + string = string || ''; + var possibleTzMatches = (string.match(parseTokenTimezone) || []), + tzChunk = possibleTzMatches[possibleTzMatches.length - 1] || [], + parts = (tzChunk + '').match(parseTimezoneChunker) || ['-', 0, 0], + minutes = +(parts[1] * 60) + toInt(parts[2]); + + return parts[0] === '+' ? minutes : -minutes; + } + + // function to convert string input to date + function addTimeToArrayFromToken(token, input, config) { + var a, datePartArray = config._a; + + switch (token) { + // QUARTER + case 'Q': + if (input != null) { + datePartArray[MONTH] = (toInt(input) - 1) * 3; + } + break; + // MONTH + case 'M' : // fall through to MM + case 'MM' : + if (input != null) { + datePartArray[MONTH] = toInt(input) - 1; + } + break; + case 'MMM' : // fall through to MMMM + case 'MMMM' : + a = config._locale.monthsParse(input, token, config._strict); + // if we didn't find a month name, mark the date as invalid. + if (a != null) { + datePartArray[MONTH] = a; + } else { + config._pf.invalidMonth = input; + } + break; + // DAY OF MONTH + case 'D' : // fall through to DD + case 'DD' : + if (input != null) { + datePartArray[DATE] = toInt(input); + } + break; + case 'Do' : + if (input != null) { + datePartArray[DATE] = toInt(parseInt( + input.match(/\d{1,2}/)[0], 10)); + } + break; + // DAY OF YEAR + case 'DDD' : // fall through to DDDD + case 'DDDD' : + if (input != null) { + config._dayOfYear = toInt(input); + } + + break; + // YEAR + case 'YY' : + datePartArray[YEAR] = moment.parseTwoDigitYear(input); + break; + case 'YYYY' : + case 'YYYYY' : + case 'YYYYYY' : + datePartArray[YEAR] = toInt(input); + break; + // AM / PM + case 'a' : // fall through to A + case 'A' : + config._meridiem = input; + // config._isPm = config._locale.isPM(input); + break; + // HOUR + case 'h' : // fall through to hh + case 'hh' : + config._pf.bigHour = true; + /* falls through */ + case 'H' : // fall through to HH + case 'HH' : + datePartArray[HOUR] = toInt(input); + break; + // MINUTE + case 'm' : // fall through to mm + case 'mm' : + datePartArray[MINUTE] = toInt(input); + break; + // SECOND + case 's' : // fall through to ss + case 'ss' : + datePartArray[SECOND] = toInt(input); + break; + // MILLISECOND + case 'S' : + case 'SS' : + case 'SSS' : + case 'SSSS' : + datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000); + break; + // UNIX OFFSET (MILLISECONDS) + case 'x': + config._d = new Date(toInt(input)); + break; + // UNIX TIMESTAMP WITH MS + case 'X': + config._d = new Date(parseFloat(input) * 1000); + break; + // TIMEZONE + case 'Z' : // fall through to ZZ + case 'ZZ' : + config._useUTC = true; + config._tzm = utcOffsetFromString(input); + break; + // WEEKDAY - human + case 'dd': + case 'ddd': + case 'dddd': + a = config._locale.weekdaysParse(input); + // if we didn't get a weekday name, mark the date as invalid + if (a != null) { + config._w = config._w || {}; + config._w['d'] = a; + } else { + config._pf.invalidWeekday = input; + } + break; + // WEEK, WEEK DAY - numeric + case 'w': + case 'ww': + case 'W': + case 'WW': + case 'd': + case 'e': + case 'E': + token = token.substr(0, 1); + /* falls through */ + case 'gggg': + case 'GGGG': + case 'GGGGG': + token = token.substr(0, 2); + if (input) { + config._w = config._w || {}; + config._w[token] = toInt(input); + } + break; + case 'gg': + case 'GG': + config._w = config._w || {}; + config._w[token] = moment.parseTwoDigitYear(input); + } + } + + function dayOfYearFromWeekInfo(config) { + var w, weekYear, week, weekday, dow, doy, temp; + + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + dow = 1; + doy = 4; + + // TODO: We need to take the current isoWeekYear, but that depends on + // how we interpret now (local, utc, fixed offset). So create + // a now version of current config (take local/utc/offset flags, and + // create now). + weekYear = dfl(w.GG, config._a[YEAR], weekOfYear(moment(), 1, 4).year); + week = dfl(w.W, 1); + weekday = dfl(w.E, 1); + } else { + dow = config._locale._week.dow; + doy = config._locale._week.doy; + + weekYear = dfl(w.gg, config._a[YEAR], weekOfYear(moment(), dow, doy).year); + week = dfl(w.w, 1); + + if (w.d != null) { + // weekday -- low day numbers are considered next week + weekday = w.d; + if (weekday < dow) { + ++week; + } + } else if (w.e != null) { + // local weekday -- counting starts from begining of week + weekday = w.e + dow; + } else { + // default to begining of week + weekday = dow; + } + } + temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow); + + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } + + // convert an array to a date. + // the array should mirror the parameters below + // note: all values past the year are optional and will default to the lowest possible value. + // [year, month, day , hour, minute, second, millisecond] + function dateFromConfig(config) { + var i, date, input = [], currentDate, yearToUse; + + if (config._d) { + return; + } + + currentDate = currentDateArray(config); + + //compute day of the year from weeks and weekdays + if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { + dayOfYearFromWeekInfo(config); + } + + //if the day of the year is set, figure out what it is + if (config._dayOfYear) { + yearToUse = dfl(config._a[YEAR], currentDate[YEAR]); + + if (config._dayOfYear > daysInYear(yearToUse)) { + config._pf._overflowDayOfYear = true; + } + + date = makeUTCDate(yearToUse, 0, config._dayOfYear); + config._a[MONTH] = date.getUTCMonth(); + config._a[DATE] = date.getUTCDate(); + } + + // Default to current date. + // * if no year, month, day of month are given, default to today + // * if day of month is given, default month and year + // * if month is given, default only year + // * if year is given, don't default anything + for (i = 0; i < 3 && config._a[i] == null; ++i) { + config._a[i] = input[i] = currentDate[i]; + } + + // Zero out whatever was not defaulted, including time + for (; i < 7; i++) { + config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; + } + + // Check for 24:00:00.000 + if (config._a[HOUR] === 24 && + config._a[MINUTE] === 0 && + config._a[SECOND] === 0 && + config._a[MILLISECOND] === 0) { + config._nextDay = true; + config._a[HOUR] = 0; + } + + config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input); + // Apply timezone offset from input. The actual utcOffset can be changed + // with parseZone. + if (config._tzm != null) { + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); + } + + if (config._nextDay) { + config._a[HOUR] = 24; + } + } + + function dateFromObject(config) { + var normalizedInput; + + if (config._d) { + return; + } + + normalizedInput = normalizeObjectUnits(config._i); + config._a = [ + normalizedInput.year, + normalizedInput.month, + normalizedInput.day || normalizedInput.date, + normalizedInput.hour, + normalizedInput.minute, + normalizedInput.second, + normalizedInput.millisecond + ]; + + dateFromConfig(config); + } + + function currentDateArray(config) { + var now = new Date(); + if (config._useUTC) { + return [ + now.getUTCFullYear(), + now.getUTCMonth(), + now.getUTCDate() + ]; + } else { + return [now.getFullYear(), now.getMonth(), now.getDate()]; + } + } + + // date from string and format string + function makeDateFromStringAndFormat(config) { + if (config._f === moment.ISO_8601) { + parseISO(config); + return; + } + + config._a = []; + config._pf.empty = true; + + // This array is used to make a Date, either with `new Date` or `Date.UTC` + var string = '' + config._i, + i, parsedInput, tokens, token, skipped, + stringLength = string.length, + totalParsedInputLength = 0; + + tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; + + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; + if (parsedInput) { + skipped = string.substr(0, string.indexOf(parsedInput)); + if (skipped.length > 0) { + config._pf.unusedInput.push(skipped); + } + string = string.slice(string.indexOf(parsedInput) + parsedInput.length); + totalParsedInputLength += parsedInput.length; + } + // don't parse if it's not a known token + if (formatTokenFunctions[token]) { + if (parsedInput) { + config._pf.empty = false; + } + else { + config._pf.unusedTokens.push(token); + } + addTimeToArrayFromToken(token, parsedInput, config); + } + else if (config._strict && !parsedInput) { + config._pf.unusedTokens.push(token); + } + } + + // add remaining unparsed input length to the string + config._pf.charsLeftOver = stringLength - totalParsedInputLength; + if (string.length > 0) { + config._pf.unusedInput.push(string); + } + + // clear _12h flag if hour is <= 12 + if (config._pf.bigHour === true && config._a[HOUR] <= 12) { + config._pf.bigHour = undefined; + } + // handle meridiem + config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], + config._meridiem); + dateFromConfig(config); + checkOverflow(config); + } + + function unescapeFormat(s) { + return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { + return p1 || p2 || p3 || p4; + }); + } + + // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript + function regexpEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + } + + // date from string and array of format strings + function makeDateFromStringAndArray(config) { + var tempConfig, + bestMoment, + + scoreToBeat, + i, + currentScore; + + if (config._f.length === 0) { + config._pf.invalidFormat = true; + config._d = new Date(NaN); + return; + } + + for (i = 0; i < config._f.length; i++) { + currentScore = 0; + tempConfig = copyConfig({}, config); + if (config._useUTC != null) { + tempConfig._useUTC = config._useUTC; + } + tempConfig._pf = defaultParsingFlags(); + tempConfig._f = config._f[i]; + makeDateFromStringAndFormat(tempConfig); + + if (!isValid(tempConfig)) { + continue; + } + + // if there is any input that was not parsed add a penalty for that format + currentScore += tempConfig._pf.charsLeftOver; + + //or tokens + currentScore += tempConfig._pf.unusedTokens.length * 10; + + tempConfig._pf.score = currentScore; + + if (scoreToBeat == null || currentScore < scoreToBeat) { + scoreToBeat = currentScore; + bestMoment = tempConfig; + } + } + + extend(config, bestMoment || tempConfig); + } + + // date from iso format + function parseISO(config) { + var i, l, + string = config._i, + match = isoRegex.exec(string); + + if (match) { + config._pf.iso = true; + for (i = 0, l = isoDates.length; i < l; i++) { + if (isoDates[i][1].exec(string)) { + // match[5] should be 'T' or undefined + config._f = isoDates[i][0] + (match[6] || ' '); + break; + } + } + for (i = 0, l = isoTimes.length; i < l; i++) { + if (isoTimes[i][1].exec(string)) { + config._f += isoTimes[i][0]; + break; + } + } + if (string.match(parseTokenTimezone)) { + config._f += 'Z'; + } + makeDateFromStringAndFormat(config); + } else { + config._isValid = false; + } + } + + // date from iso format or fallback + function makeDateFromString(config) { + parseISO(config); + if (config._isValid === false) { + delete config._isValid; + moment.createFromInputFallback(config); + } + } + + function map(arr, fn) { + var res = [], i; + for (i = 0; i < arr.length; ++i) { + res.push(fn(arr[i], i)); + } + return res; + } + + function makeDateFromInput(config) { + var input = config._i, matched; + if (input === undefined) { + config._d = new Date(); + } else if (isDate(input)) { + config._d = new Date(+input); + } else if ((matched = aspNetJsonRegex.exec(input)) !== null) { + config._d = new Date(+matched[1]); + } else if (typeof input === 'string') { + makeDateFromString(config); + } else if (isArray(input)) { + config._a = map(input.slice(0), function (obj) { + return parseInt(obj, 10); + }); + dateFromConfig(config); + } else if (typeof(input) === 'object') { + dateFromObject(config); + } else if (typeof(input) === 'number') { + // from milliseconds + config._d = new Date(input); + } else { + moment.createFromInputFallback(config); + } + } + + function makeDate(y, m, d, h, M, s, ms) { + //can't just apply() to create a date: + //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply + var date = new Date(y, m, d, h, M, s, ms); + + //the date constructor doesn't accept years < 1970 + if (y < 1970) { + date.setFullYear(y); + } + return date; + } + + function makeUTCDate(y) { + var date = new Date(Date.UTC.apply(null, arguments)); + if (y < 1970) { + date.setUTCFullYear(y); + } + return date; + } + + function parseWeekday(input, locale) { + if (typeof input === 'string') { + if (!isNaN(input)) { + input = parseInt(input, 10); + } + else { + input = locale.weekdaysParse(input); + if (typeof input !== 'number') { + return null; + } + } + } + return input; + } + + /************************************ + Relative Time + ************************************/ + + + // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize + function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { + return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); + } + + function relativeTime(posNegDuration, withoutSuffix, locale) { + var duration = moment.duration(posNegDuration).abs(), + seconds = round(duration.as('s')), + minutes = round(duration.as('m')), + hours = round(duration.as('h')), + days = round(duration.as('d')), + months = round(duration.as('M')), + years = round(duration.as('y')), + + args = seconds < relativeTimeThresholds.s && ['s', seconds] || + minutes === 1 && ['m'] || + minutes < relativeTimeThresholds.m && ['mm', minutes] || + hours === 1 && ['h'] || + hours < relativeTimeThresholds.h && ['hh', hours] || + days === 1 && ['d'] || + days < relativeTimeThresholds.d && ['dd', days] || + months === 1 && ['M'] || + months < relativeTimeThresholds.M && ['MM', months] || + years === 1 && ['y'] || ['yy', years]; + + args[2] = withoutSuffix; + args[3] = +posNegDuration > 0; + args[4] = locale; + return substituteTimeAgo.apply({}, args); + } + + + /************************************ + Week of Year + ************************************/ + + + // firstDayOfWeek 0 = sun, 6 = sat + // the day of the week that starts the week + // (usually sunday or monday) + // firstDayOfWeekOfYear 0 = sun, 6 = sat + // the first week is the week that contains the first + // of this day of the week + // (eg. ISO weeks use thursday (4)) + function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) { + var end = firstDayOfWeekOfYear - firstDayOfWeek, + daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(), + adjustedMoment; + + + if (daysToDayOfWeek > end) { + daysToDayOfWeek -= 7; + } + + if (daysToDayOfWeek < end - 7) { + daysToDayOfWeek += 7; + } + + adjustedMoment = moment(mom).add(daysToDayOfWeek, 'd'); + return { + week: Math.ceil(adjustedMoment.dayOfYear() / 7), + year: adjustedMoment.year() + }; + } + + //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday + function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) { + var d = makeUTCDate(year, 0, 1).getUTCDay(), daysToAdd, dayOfYear; + + d = d === 0 ? 7 : d; + weekday = weekday != null ? weekday : firstDayOfWeek; + daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0); + dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1; + + return { + year: dayOfYear > 0 ? year : year - 1, + dayOfYear: dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear + }; + } + + /************************************ + Top Level Functions + ************************************/ + + function makeMoment(config) { + var input = config._i, + format = config._f, + res; + + config._locale = config._locale || moment.localeData(config._l); + + if (input === null || (format === undefined && input === '')) { + return moment.invalid({nullInput: true}); + } + + if (typeof input === 'string') { + config._i = input = config._locale.preparse(input); + } + + if (moment.isMoment(input)) { + return new Moment(input, true); + } else if (format) { + if (isArray(format)) { + makeDateFromStringAndArray(config); + } else { + makeDateFromStringAndFormat(config); + } + } else { + makeDateFromInput(config); + } + + res = new Moment(config); + if (res._nextDay) { + // Adding is smart enough around DST + res.add(1, 'd'); + res._nextDay = undefined; + } + + return res; + } + + moment = function (input, format, locale, strict) { + var c; + + if (typeof(locale) === 'boolean') { + strict = locale; + locale = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c = {}; + c._isAMomentObject = true; + c._i = input; + c._f = format; + c._l = locale; + c._strict = strict; + c._isUTC = false; + c._pf = defaultParsingFlags(); + + return makeMoment(c); + }; + + moment.suppressDeprecationWarnings = false; + + moment.createFromInputFallback = deprecate( + 'moment construction falls back to js Date. This is ' + + 'discouraged and will be removed in upcoming major ' + + 'release. Please refer to ' + + 'https://github.com/moment/moment/issues/1407 for more info.', + function (config) { + config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); + } + ); + + // Pick a moment m from moments so that m[fn](other) is true for all + // other. This relies on the function fn to be transitive. + // + // moments should either be an array of moment objects or an array, whose + // first element is an array of moment objects. + function pickBy(fn, moments) { + var res, i; + if (moments.length === 1 && isArray(moments[0])) { + moments = moments[0]; + } + if (!moments.length) { + return moment(); + } + res = moments[0]; + for (i = 1; i < moments.length; ++i) { + if (moments[i][fn](res)) { + res = moments[i]; + } + } + return res; + } + + moment.min = function () { + var args = [].slice.call(arguments, 0); + + return pickBy('isBefore', args); + }; + + moment.max = function () { + var args = [].slice.call(arguments, 0); + + return pickBy('isAfter', args); + }; + + // creating with utc + moment.utc = function (input, format, locale, strict) { + var c; + + if (typeof(locale) === 'boolean') { + strict = locale; + locale = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c = {}; + c._isAMomentObject = true; + c._useUTC = true; + c._isUTC = true; + c._l = locale; + c._i = input; + c._f = format; + c._strict = strict; + c._pf = defaultParsingFlags(); + + return makeMoment(c).utc(); + }; + + // creating with unix timestamp (in seconds) + moment.unix = function (input) { + return moment(input * 1000); + }; + + // duration + moment.duration = function (input, key) { + var duration = input, + // matching against regexp is expensive, do it on demand + match = null, + sign, + ret, + parseIso, + diffRes; + + if (moment.isDuration(input)) { + duration = { + ms: input._milliseconds, + d: input._days, + M: input._months + }; + } else if (typeof input === 'number') { + duration = {}; + if (key) { + duration[key] = input; + } else { + duration.milliseconds = input; + } + } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + duration = { + y: 0, + d: toInt(match[DATE]) * sign, + h: toInt(match[HOUR]) * sign, + m: toInt(match[MINUTE]) * sign, + s: toInt(match[SECOND]) * sign, + ms: toInt(match[MILLISECOND]) * sign + }; + } else if (!!(match = isoDurationRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + parseIso = function (inp) { + // We'd normally use ~~inp for this, but unfortunately it also + // converts floats to ints. + // inp may be undefined, so careful calling replace on it. + var res = inp && parseFloat(inp.replace(',', '.')); + // apply sign while we're at it + return (isNaN(res) ? 0 : res) * sign; + }; + duration = { + y: parseIso(match[2]), + M: parseIso(match[3]), + d: parseIso(match[4]), + h: parseIso(match[5]), + m: parseIso(match[6]), + s: parseIso(match[7]), + w: parseIso(match[8]) + }; + } else if (duration == null) {// checks for null or undefined + duration = {}; + } else if (typeof duration === 'object' && + ('from' in duration || 'to' in duration)) { + diffRes = momentsDifference(moment(duration.from), moment(duration.to)); + + duration = {}; + duration.ms = diffRes.milliseconds; + duration.M = diffRes.months; + } + + ret = new Duration(duration); + + if (moment.isDuration(input) && hasOwnProp(input, '_locale')) { + ret._locale = input._locale; + } + + return ret; + }; + + // version number + moment.version = VERSION; + + // default format + moment.defaultFormat = isoFormat; + + // constant that refers to the ISO standard + moment.ISO_8601 = function () {}; + + // Plugins that add properties should also add the key here (null value), + // so we can properly clone ourselves. + moment.momentProperties = momentProperties; + + // This function will be called whenever a moment is mutated. + // It is intended to keep the offset in sync with the timezone. + moment.updateOffset = function () {}; + + // This function allows you to set a threshold for relative time strings + moment.relativeTimeThreshold = function (threshold, limit) { + if (relativeTimeThresholds[threshold] === undefined) { + return false; + } + if (limit === undefined) { + return relativeTimeThresholds[threshold]; + } + relativeTimeThresholds[threshold] = limit; + return true; + }; + + moment.lang = deprecate( + 'moment.lang is deprecated. Use moment.locale instead.', + function (key, value) { + return moment.locale(key, value); + } + ); + + // This function will load locale and then set the global locale. If + // no arguments are passed in, it will simply return the current global + // locale key. + moment.locale = function (key, values) { + var data; + if (key) { + if (typeof(values) !== 'undefined') { + data = moment.defineLocale(key, values); + } + else { + data = moment.localeData(key); + } + + if (data) { + moment.duration._locale = moment._locale = data; + } + } + + return moment._locale._abbr; + }; + + moment.defineLocale = function (name, values) { + if (values !== null) { + values.abbr = name; + if (!locales[name]) { + locales[name] = new Locale(); + } + locales[name].set(values); + + // backwards compat for now: also set the locale + moment.locale(name); + + return locales[name]; + } else { + // useful for testing + delete locales[name]; + return null; + } + }; + + moment.langData = deprecate( + 'moment.langData is deprecated. Use moment.localeData instead.', + function (key) { + return moment.localeData(key); + } + ); + + // returns locale data + moment.localeData = function (key) { + var locale; + + if (key && key._locale && key._locale._abbr) { + key = key._locale._abbr; + } + + if (!key) { + return moment._locale; + } + + if (!isArray(key)) { + //short-circuit everything else + locale = loadLocale(key); + if (locale) { + return locale; + } + key = [key]; + } + + return chooseLocale(key); + }; + + // compare moment object + moment.isMoment = function (obj) { + return obj instanceof Moment || + (obj != null && hasOwnProp(obj, '_isAMomentObject')); + }; + + // for typechecking Duration objects + moment.isDuration = function (obj) { + return obj instanceof Duration; + }; + + for (i = lists.length - 1; i >= 0; --i) { + makeList(lists[i]); + } + + moment.normalizeUnits = function (units) { + return normalizeUnits(units); + }; + + moment.invalid = function (flags) { + var m = moment.utc(NaN); + if (flags != null) { + extend(m._pf, flags); + } + else { + m._pf.userInvalidated = true; + } + + return m; + }; + + moment.parseZone = function () { + return moment.apply(null, arguments).parseZone(); + }; + + moment.parseTwoDigitYear = function (input) { + return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); + }; + + moment.isDate = isDate; + + /************************************ + Moment Prototype + ************************************/ + + + extend(moment.fn = Moment.prototype, { + + clone : function () { + return moment(this); + }, + + valueOf : function () { + return +this._d - ((this._offset || 0) * 60000); + }, + + unix : function () { + return Math.floor(+this / 1000); + }, + + toString : function () { + return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); + }, + + toDate : function () { + return this._offset ? new Date(+this) : this._d; + }, + + toISOString : function () { + var m = moment(this).utc(); + if (0 < m.year() && m.year() <= 9999) { + if ('function' === typeof Date.prototype.toISOString) { + // native implementation is ~50x faster, use it when we can + return this.toDate().toISOString(); + } else { + return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } + } else { + return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } + }, + + toArray : function () { + var m = this; + return [ + m.year(), + m.month(), + m.date(), + m.hours(), + m.minutes(), + m.seconds(), + m.milliseconds() + ]; + }, + + isValid : function () { + return isValid(this); + }, + + isDSTShifted : function () { + if (this._a) { + return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0; + } + + return false; + }, + + parsingFlags : function () { + return extend({}, this._pf); + }, + + invalidAt: function () { + return this._pf.overflow; + }, + + utc : function (keepLocalTime) { + return this.utcOffset(0, keepLocalTime); + }, + + local : function (keepLocalTime) { + if (this._isUTC) { + this.utcOffset(0, keepLocalTime); + this._isUTC = false; + + if (keepLocalTime) { + this.subtract(this._dateUtcOffset(), 'm'); + } + } + return this; + }, + + format : function (inputString) { + var output = formatMoment(this, inputString || moment.defaultFormat); + return this.localeData().postformat(output); + }, + + add : createAdder(1, 'add'), + + subtract : createAdder(-1, 'subtract'), + + diff : function (input, units, asFloat) { + var that = makeAs(input, this), + zoneDiff = (that.utcOffset() - this.utcOffset()) * 6e4, + anchor, diff, output, daysAdjust; + + units = normalizeUnits(units); + + if (units === 'year' || units === 'month' || units === 'quarter') { + output = monthDiff(this, that); + if (units === 'quarter') { + output = output / 3; + } else if (units === 'year') { + output = output / 12; + } + } else { + diff = this - that; + output = units === 'second' ? diff / 1e3 : // 1000 + units === 'minute' ? diff / 6e4 : // 1000 * 60 + units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60 + units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst + units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst + diff; + } + return asFloat ? output : absRound(output); + }, + + from : function (time, withoutSuffix) { + return moment.duration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); + }, + + fromNow : function (withoutSuffix) { + return this.from(moment(), withoutSuffix); + }, + + calendar : function (time) { + // We want to compare the start of today, vs this. + // Getting start-of-today depends on whether we're locat/utc/offset + // or not. + var now = time || moment(), + sod = makeAs(now, this).startOf('day'), + diff = this.diff(sod, 'days', true), + format = diff < -6 ? 'sameElse' : + diff < -1 ? 'lastWeek' : + diff < 0 ? 'lastDay' : + diff < 1 ? 'sameDay' : + diff < 2 ? 'nextDay' : + diff < 7 ? 'nextWeek' : 'sameElse'; + return this.format(this.localeData().calendar(format, this, moment(now))); + }, + + isLeapYear : function () { + return isLeapYear(this.year()); + }, + + isDST : function () { + return (this.utcOffset() > this.clone().month(0).utcOffset() || + this.utcOffset() > this.clone().month(5).utcOffset()); + }, + + day : function (input) { + var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); + if (input != null) { + input = parseWeekday(input, this.localeData()); + return this.add(input - day, 'd'); + } else { + return day; + } + }, + + month : makeAccessor('Month', true), + + startOf : function (units) { + units = normalizeUnits(units); + // the following switch intentionally omits break keywords + // to utilize falling through the cases. + switch (units) { + case 'year': + this.month(0); + /* falls through */ + case 'quarter': + case 'month': + this.date(1); + /* falls through */ + case 'week': + case 'isoWeek': + case 'day': + this.hours(0); + /* falls through */ + case 'hour': + this.minutes(0); + /* falls through */ + case 'minute': + this.seconds(0); + /* falls through */ + case 'second': + this.milliseconds(0); + /* falls through */ + } + + // weeks are a special case + if (units === 'week') { + this.weekday(0); + } else if (units === 'isoWeek') { + this.isoWeekday(1); + } + + // quarters are also special + if (units === 'quarter') { + this.month(Math.floor(this.month() / 3) * 3); + } + + return this; + }, + + endOf: function (units) { + units = normalizeUnits(units); + if (units === undefined || units === 'millisecond') { + return this; + } + return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); + }, + + isAfter: function (input, units) { + var inputMs; + units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); + if (units === 'millisecond') { + input = moment.isMoment(input) ? input : moment(input); + return +this > +input; + } else { + inputMs = moment.isMoment(input) ? +input : +moment(input); + return inputMs < +this.clone().startOf(units); + } + }, + + isBefore: function (input, units) { + var inputMs; + units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); + if (units === 'millisecond') { + input = moment.isMoment(input) ? input : moment(input); + return +this < +input; + } else { + inputMs = moment.isMoment(input) ? +input : +moment(input); + return +this.clone().endOf(units) < inputMs; + } + }, + + isBetween: function (from, to, units) { + return this.isAfter(from, units) && this.isBefore(to, units); + }, + + isSame: function (input, units) { + var inputMs; + units = normalizeUnits(units || 'millisecond'); + if (units === 'millisecond') { + input = moment.isMoment(input) ? input : moment(input); + return +this === +input; + } else { + inputMs = +moment(input); + return +(this.clone().startOf(units)) <= inputMs && inputMs <= +(this.clone().endOf(units)); + } + }, + + min: deprecate( + 'moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548', + function (other) { + other = moment.apply(null, arguments); + return other < this ? this : other; + } + ), + + max: deprecate( + 'moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548', + function (other) { + other = moment.apply(null, arguments); + return other > this ? this : other; + } + ), + + zone : deprecate( + 'moment().zone is deprecated, use moment().utcOffset instead. ' + + 'https://github.com/moment/moment/issues/1779', + function (input, keepLocalTime) { + if (input != null) { + if (typeof input !== 'string') { + input = -input; + } + + this.utcOffset(input, keepLocalTime); + + return this; + } else { + return -this.utcOffset(); + } + } + ), + + // keepLocalTime = true means only change the timezone, without + // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> + // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset + // +0200, so we adjust the time as needed, to be valid. + // + // Keeping the time actually adds/subtracts (one hour) + // from the actual represented time. That is why we call updateOffset + // a second time. In case it wants us to change the offset again + // _changeInProgress == true case, then we have to adjust, because + // there is no such time in the given timezone. + utcOffset : function (input, keepLocalTime) { + var offset = this._offset || 0, + localAdjust; + if (input != null) { + if (typeof input === 'string') { + input = utcOffsetFromString(input); + } + if (Math.abs(input) < 16) { + input = input * 60; + } + if (!this._isUTC && keepLocalTime) { + localAdjust = this._dateUtcOffset(); + } + this._offset = input; + this._isUTC = true; + if (localAdjust != null) { + this.add(localAdjust, 'm'); + } + if (offset !== input) { + if (!keepLocalTime || this._changeInProgress) { + addOrSubtractDurationFromMoment(this, + moment.duration(input - offset, 'm'), 1, false); + } else if (!this._changeInProgress) { + this._changeInProgress = true; + moment.updateOffset(this, true); + this._changeInProgress = null; + } + } + + return this; + } else { + return this._isUTC ? offset : this._dateUtcOffset(); + } + }, + + isLocal : function () { + return !this._isUTC; + }, + + isUtcOffset : function () { + return this._isUTC; + }, + + isUtc : function () { + return this._isUTC && this._offset === 0; + }, + + zoneAbbr : function () { + return this._isUTC ? 'UTC' : ''; + }, + + zoneName : function () { + return this._isUTC ? 'Coordinated Universal Time' : ''; + }, + + parseZone : function () { + if (this._tzm) { + this.utcOffset(this._tzm); + } else if (typeof this._i === 'string') { + this.utcOffset(utcOffsetFromString(this._i)); + } + return this; + }, + + hasAlignedHourOffset : function (input) { + if (!input) { + input = 0; + } + else { + input = moment(input).utcOffset(); + } + + return (this.utcOffset() - input) % 60 === 0; + }, + + daysInMonth : function () { + return daysInMonth(this.year(), this.month()); + }, + + dayOfYear : function (input) { + var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1; + return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); + }, + + quarter : function (input) { + return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); + }, + + weekYear : function (input) { + var year = weekOfYear(this, this.localeData()._week.dow, this.localeData()._week.doy).year; + return input == null ? year : this.add((input - year), 'y'); + }, + + isoWeekYear : function (input) { + var year = weekOfYear(this, 1, 4).year; + return input == null ? year : this.add((input - year), 'y'); + }, + + week : function (input) { + var week = this.localeData().week(this); + return input == null ? week : this.add((input - week) * 7, 'd'); + }, + + isoWeek : function (input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add((input - week) * 7, 'd'); + }, + + weekday : function (input) { + var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; + return input == null ? weekday : this.add(input - weekday, 'd'); + }, + + isoWeekday : function (input) { + // behaves the same as moment#day except + // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) + // as a setter, sunday should belong to the previous week. + return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7); + }, + + isoWeeksInYear : function () { + return weeksInYear(this.year(), 1, 4); + }, + + weeksInYear : function () { + var weekInfo = this.localeData()._week; + return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); + }, + + get : function (units) { + units = normalizeUnits(units); + return this[units](); + }, + + set : function (units, value) { + var unit; + if (typeof units === 'object') { + for (unit in units) { + this.set(unit, units[unit]); + } + } + else { + units = normalizeUnits(units); + if (typeof this[units] === 'function') { + this[units](value); + } + } + return this; + }, + + // If passed a locale key, it will set the locale for this + // instance. Otherwise, it will return the locale configuration + // variables for this instance. + locale : function (key) { + var newLocaleData; + + if (key === undefined) { + return this._locale._abbr; + } else { + newLocaleData = moment.localeData(key); + if (newLocaleData != null) { + this._locale = newLocaleData; + } + return this; + } + }, + + lang : deprecate( + 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', + function (key) { + if (key === undefined) { + return this.localeData(); + } else { + return this.locale(key); + } + } + ), + + localeData : function () { + return this._locale; + }, + + _dateUtcOffset : function () { + // On Firefox.24 Date#getTimezoneOffset returns a floating point. + // https://github.com/moment/moment/pull/1871 + return -Math.round(this._d.getTimezoneOffset() / 15) * 15; + } + + }); + + function rawMonthSetter(mom, value) { + var dayOfMonth; + + // TODO: Move this out of here! + if (typeof value === 'string') { + value = mom.localeData().monthsParse(value); + // TODO: Another silent failure? + if (typeof value !== 'number') { + return mom; + } + } + + dayOfMonth = Math.min(mom.date(), + daysInMonth(mom.year(), value)); + mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); + return mom; + } + + function rawGetter(mom, unit) { + return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit](); + } + + function rawSetter(mom, unit, value) { + if (unit === 'Month') { + return rawMonthSetter(mom, value); + } else { + return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); + } + } + + function makeAccessor(unit, keepTime) { + return function (value) { + if (value != null) { + rawSetter(this, unit, value); + moment.updateOffset(this, keepTime); + return this; + } else { + return rawGetter(this, unit); + } + }; + } + + moment.fn.millisecond = moment.fn.milliseconds = makeAccessor('Milliseconds', false); + moment.fn.second = moment.fn.seconds = makeAccessor('Seconds', false); + moment.fn.minute = moment.fn.minutes = makeAccessor('Minutes', false); + // Setting the hour should keep the time, because the user explicitly + // specified which hour he wants. So trying to maintain the same hour (in + // a new timezone) makes sense. Adding/subtracting hours does not follow + // this rule. + moment.fn.hour = moment.fn.hours = makeAccessor('Hours', true); + // moment.fn.month is defined separately + moment.fn.date = makeAccessor('Date', true); + moment.fn.dates = deprecate('dates accessor is deprecated. Use date instead.', makeAccessor('Date', true)); + moment.fn.year = makeAccessor('FullYear', true); + moment.fn.years = deprecate('years accessor is deprecated. Use year instead.', makeAccessor('FullYear', true)); + + // add plural methods + moment.fn.days = moment.fn.day; + moment.fn.months = moment.fn.month; + moment.fn.weeks = moment.fn.week; + moment.fn.isoWeeks = moment.fn.isoWeek; + moment.fn.quarters = moment.fn.quarter; + + // add aliased format methods + moment.fn.toJSON = moment.fn.toISOString; + + // alias isUtc for dev-friendliness + moment.fn.isUTC = moment.fn.isUtc; + + /************************************ + Duration Prototype + ************************************/ + + + function daysToYears (days) { + // 400 years have 146097 days (taking into account leap year rules) + return days * 400 / 146097; + } + + function yearsToDays (years) { + // years * 365 + absRound(years / 4) - + // absRound(years / 100) + absRound(years / 400); + return years * 146097 / 400; + } + + extend(moment.duration.fn = Duration.prototype, { + + _bubble : function () { + var milliseconds = this._milliseconds, + days = this._days, + months = this._months, + data = this._data, + seconds, minutes, hours, years = 0; + + // The following code bubbles up values, see the tests for + // examples of what that means. + data.milliseconds = milliseconds % 1000; + + seconds = absRound(milliseconds / 1000); + data.seconds = seconds % 60; + + minutes = absRound(seconds / 60); + data.minutes = minutes % 60; + + hours = absRound(minutes / 60); + data.hours = hours % 24; + + days += absRound(hours / 24); + + // Accurately convert days to years, assume start from year 0. + years = absRound(daysToYears(days)); + days -= absRound(yearsToDays(years)); + + // 30 days to a month + // TODO (iskren): Use anchor date (like 1st Jan) to compute this. + months += absRound(days / 30); + days %= 30; + + // 12 months -> 1 year + years += absRound(months / 12); + months %= 12; + + data.days = days; + data.months = months; + data.years = years; + }, + + abs : function () { + this._milliseconds = Math.abs(this._milliseconds); + this._days = Math.abs(this._days); + this._months = Math.abs(this._months); + + this._data.milliseconds = Math.abs(this._data.milliseconds); + this._data.seconds = Math.abs(this._data.seconds); + this._data.minutes = Math.abs(this._data.minutes); + this._data.hours = Math.abs(this._data.hours); + this._data.months = Math.abs(this._data.months); + this._data.years = Math.abs(this._data.years); + + return this; + }, + + weeks : function () { + return absRound(this.days() / 7); + }, + + valueOf : function () { + return this._milliseconds + + this._days * 864e5 + + (this._months % 12) * 2592e6 + + toInt(this._months / 12) * 31536e6; + }, + + humanize : function (withSuffix) { + var output = relativeTime(this, !withSuffix, this.localeData()); + + if (withSuffix) { + output = this.localeData().pastFuture(+this, output); + } + + return this.localeData().postformat(output); + }, + + add : function (input, val) { + // supports only 2.0-style add(1, 's') or add(moment) + var dur = moment.duration(input, val); + + this._milliseconds += dur._milliseconds; + this._days += dur._days; + this._months += dur._months; + + this._bubble(); + + return this; + }, + + subtract : function (input, val) { + var dur = moment.duration(input, val); + + this._milliseconds -= dur._milliseconds; + this._days -= dur._days; + this._months -= dur._months; + + this._bubble(); + + return this; + }, + + get : function (units) { + units = normalizeUnits(units); + return this[units.toLowerCase() + 's'](); + }, + + as : function (units) { + var days, months; + units = normalizeUnits(units); + + if (units === 'month' || units === 'year') { + days = this._days + this._milliseconds / 864e5; + months = this._months + daysToYears(days) * 12; + return units === 'month' ? months : months / 12; + } else { + // handle milliseconds separately because of floating point math errors (issue #1867) + days = this._days + Math.round(yearsToDays(this._months / 12)); + switch (units) { + case 'week': return days / 7 + this._milliseconds / 6048e5; + case 'day': return days + this._milliseconds / 864e5; + case 'hour': return days * 24 + this._milliseconds / 36e5; + case 'minute': return days * 24 * 60 + this._milliseconds / 6e4; + case 'second': return days * 24 * 60 * 60 + this._milliseconds / 1000; + // Math.floor prevents floating point math errors here + case 'millisecond': return Math.floor(days * 24 * 60 * 60 * 1000) + this._milliseconds; + default: throw new Error('Unknown unit ' + units); + } + } + }, + + lang : moment.fn.lang, + locale : moment.fn.locale, + + toIsoString : deprecate( + 'toIsoString() is deprecated. Please use toISOString() instead ' + + '(notice the capitals)', + function () { + return this.toISOString(); + } + ), + + toISOString : function () { + // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js + var years = Math.abs(this.years()), + months = Math.abs(this.months()), + days = Math.abs(this.days()), + hours = Math.abs(this.hours()), + minutes = Math.abs(this.minutes()), + seconds = Math.abs(this.seconds() + this.milliseconds() / 1000); + + if (!this.asSeconds()) { + // this is the same as C#'s (Noda) and python (isodate)... + // but not other JS (goog.date) + return 'P0D'; + } + + return (this.asSeconds() < 0 ? '-' : '') + + 'P' + + (years ? years + 'Y' : '') + + (months ? months + 'M' : '') + + (days ? days + 'D' : '') + + ((hours || minutes || seconds) ? 'T' : '') + + (hours ? hours + 'H' : '') + + (minutes ? minutes + 'M' : '') + + (seconds ? seconds + 'S' : ''); + }, + + localeData : function () { + return this._locale; + }, + + toJSON : function () { + return this.toISOString(); + } + }); + + moment.duration.fn.toString = moment.duration.fn.toISOString; + + function makeDurationGetter(name) { + moment.duration.fn[name] = function () { + return this._data[name]; + }; + } + + for (i in unitMillisecondFactors) { + if (hasOwnProp(unitMillisecondFactors, i)) { + makeDurationGetter(i.toLowerCase()); + } + } + + moment.duration.fn.asMilliseconds = function () { + return this.as('ms'); + }; + moment.duration.fn.asSeconds = function () { + return this.as('s'); + }; + moment.duration.fn.asMinutes = function () { + return this.as('m'); + }; + moment.duration.fn.asHours = function () { + return this.as('h'); + }; + moment.duration.fn.asDays = function () { + return this.as('d'); + }; + moment.duration.fn.asWeeks = function () { + return this.as('weeks'); + }; + moment.duration.fn.asMonths = function () { + return this.as('M'); + }; + moment.duration.fn.asYears = function () { + return this.as('y'); + }; + + /************************************ + Default Locale + ************************************/ + + + // Set default locale, other locale will inherit from English. + moment.locale('en', { + ordinalParse: /\d{1,2}(th|st|nd|rd)/, + ordinal : function (number) { + var b = number % 10, + output = (toInt(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); + + // moment.js locale configuration +// locale : afrikaans (af) +// author : Werner Mollentze : https://github.com/wernerm + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('af', { + months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'), + weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'), + weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'), + meridiemParse: /vm|nm/i, + isPM : function (input) { + return /^nm$/i.test(input); + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower ? 'vm' : 'VM'; + } else { + return isLower ? 'nm' : 'NM'; + } + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Vandag om] LT', + nextDay : '[Môre om] LT', + nextWeek : 'dddd [om] LT', + lastDay : '[Gister om] LT', + lastWeek : '[Laas] dddd [om] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'oor %s', + past : '%s gelede', + s : '\'n paar sekondes', + m : '\'n minuut', + mm : '%d minute', + h : '\'n uur', + hh : '%d ure', + d : '\'n dag', + dd : '%d dae', + M : '\'n maand', + MM : '%d maande', + y : '\'n jaar', + yy : '%d jaar' + }, + ordinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter + }, + week : { + dow : 1, // Maandag is die eerste dag van die week. + doy : 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar. + } + }); +})); +// moment.js locale configuration +// locale : Moroccan Arabic (ar-ma) +// author : ElFadili Yassine : https://github.com/ElFadiliY +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('ar-ma', { + months : 'يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + monthsShort : 'يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'ÙÙŠ %s', + past : 'منذ %s', + s : 'ثوان', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Arabic Saudi Arabia (ar-sa) +// author : Suhail Alkowaileet : https://github.com/xsoh + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': 'Ù¡', + '2': 'Ù¢', + '3': 'Ù£', + '4': 'Ù¤', + '5': 'Ù¥', + '6': 'Ù¦', + '7': 'Ù§', + '8': 'Ù¨', + '9': 'Ù©', + '0': 'Ù ' + }, numberMap = { + 'Ù¡': '1', + 'Ù¢': '2', + 'Ù£': '3', + 'Ù¤': '4', + 'Ù¥': '5', + 'Ù¦': '6', + 'Ù§': '7', + 'Ù¨': '8', + 'Ù©': '9', + 'Ù ': '0' + }; + + return moment.defineLocale('ar-sa', { + months : 'يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + monthsShort : 'يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + meridiemParse: /ص|Ù…/, + isPM : function (input) { + return 'Ù…' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'Ù…'; + } + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'ÙÙŠ %s', + past : 'منذ %s', + s : 'ثوان', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + preparse: function (string) { + return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return numberMap[match]; + }).replace(/ØŒ/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, 'ØŒ'); + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Tunisian Arabic (ar-tn) + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('ar-tn', { + months: 'جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + monthsShort: 'جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), + weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin: 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS: 'LT:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd D MMMM YYYY LT' + }, + calendar: { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'ÙÙŠ %s', + past: 'منذ %s', + s: 'ثوان', + m: 'دقيقة', + mm: '%d دقائق', + h: 'ساعة', + hh: '%d ساعات', + d: 'يوم', + dd: '%d أيام', + M: 'شهر', + MM: '%d أشهر', + y: 'سنة', + yy: '%d سنوات' + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// Locale: Arabic (ar) +// Author: Abdel Said: https://github.com/abdelsaid +// Changes in months, weekdays: Ahmed Elkhatib +// Native plural forms: forabi https://github.com/forabi + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': 'Ù¡', + '2': 'Ù¢', + '3': 'Ù£', + '4': 'Ù¤', + '5': 'Ù¥', + '6': 'Ù¦', + '7': 'Ù§', + '8': 'Ù¨', + '9': 'Ù©', + '0': 'Ù ' + }, numberMap = { + 'Ù¡': '1', + 'Ù¢': '2', + 'Ù£': '3', + 'Ù¤': '4', + 'Ù¥': '5', + 'Ù¦': '6', + 'Ù§': '7', + 'Ù¨': '8', + 'Ù©': '9', + 'Ù ': '0' + }, pluralForm = function (n) { + return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5; + }, plurals = { + s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'], + m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'], + h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'], + d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'], + M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'], + y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام'] + }, pluralize = function (u) { + return function (number, withoutSuffix, string, isFuture) { + var f = pluralForm(number), + str = plurals[u][pluralForm(number)]; + if (f === 2) { + str = str[withoutSuffix ? 0 : 1]; + } + return str.replace(/%d/i, number); + }; + }, months = [ + 'كانون الثاني يناير', + 'شباط Ùبراير', + 'آذار مارس', + 'نيسان أبريل', + 'أيار مايو', + 'حزيران يونيو', + 'تموز يوليو', + 'آب أغسطس', + 'أيلول سبتمبر', + 'تشرين الأول أكتوبر', + 'تشرين الثاني نوÙمبر', + 'كانون الأول ديسمبر' + ]; + + return moment.defineLocale('ar', { + months : months, + monthsShort : months, + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + meridiemParse: /ص|Ù…/, + isPM : function (input) { + return 'Ù…' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'Ù…'; + } + }, + calendar : { + sameDay: '[اليوم عند الساعة] LT', + nextDay: '[غدًا عند الساعة] LT', + nextWeek: 'dddd [عند الساعة] LT', + lastDay: '[أمس عند الساعة] LT', + lastWeek: 'dddd [عند الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'بعد %s', + past : 'منذ %s', + s : pluralize('s'), + m : pluralize('m'), + mm : pluralize('m'), + h : pluralize('h'), + hh : pluralize('h'), + d : pluralize('d'), + dd : pluralize('d'), + M : pluralize('M'), + MM : pluralize('M'), + y : pluralize('y'), + yy : pluralize('y') + }, + preparse: function (string) { + return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return numberMap[match]; + }).replace(/ØŒ/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, 'ØŒ'); + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : azerbaijani (az) +// author : topchiyev : https://github.com/topchiyev + +(function (factory) { + factory(moment); +}(function (moment) { + var suffixes = { + 1: '-inci', + 5: '-inci', + 8: '-inci', + 70: '-inci', + 80: '-inci', + + 2: '-nci', + 7: '-nci', + 20: '-nci', + 50: '-nci', + + 3: '-üncü', + 4: '-üncü', + 100: '-üncü', + + 6: '-ncı', + + 9: '-uncu', + 10: '-uncu', + 30: '-uncu', + + 60: '-ıncı', + 90: '-ıncı' + }; + return moment.defineLocale('az', { + months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'), + monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'), + weekdays : 'Bazar_Bazar ertÉ™si_ÇərÅŸÉ™nbÉ™ axÅŸamı_ÇərÅŸÉ™nbÉ™_CümÉ™ axÅŸamı_CümÉ™_ŞənbÉ™'.split('_'), + weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'), + weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[bugün saat] LT', + nextDay : '[sabah saat] LT', + nextWeek : '[gÉ™lÉ™n hÉ™ftÉ™] dddd [saat] LT', + lastDay : '[dünÉ™n] LT', + lastWeek : '[keçən hÉ™ftÉ™] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s sonra', + past : '%s É™vvÉ™l', + s : 'birneçə saniyyÉ™', + m : 'bir dÉ™qiqÉ™', + mm : '%d dÉ™qiqÉ™', + h : 'bir saat', + hh : '%d saat', + d : 'bir gün', + dd : '%d gün', + M : 'bir ay', + MM : '%d ay', + y : 'bir il', + yy : '%d il' + }, + meridiemParse: /gecÉ™|sÉ™hÉ™r|gündüz|axÅŸam/, + isPM : function (input) { + return /^(gündüz|axÅŸam)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'gecÉ™'; + } else if (hour < 12) { + return 'sÉ™hÉ™r'; + } else if (hour < 17) { + return 'gündüz'; + } else { + return 'axÅŸam'; + } + }, + ordinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/, + ordinal : function (number) { + if (number === 0) { // special case for zero + return number + '-ıncı'; + } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + + return number + (suffixes[a] || suffixes[b] || suffixes[c]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : belarusian (be) +// author : Dmitry Demidov : https://github.com/demidov91 +// author: Praleska: http://praleska.pro/ +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + factory(moment); +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін', + 'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін', + 'dd': 'дзень_дні_дзён', + 'MM': 'меÑÑц_меÑÑцы_меÑÑцаў', + 'yy': 'год_гады_гадоў' + }; + if (key === 'm') { + return withoutSuffix ? 'хвіліна' : 'хвіліну'; + } + else if (key === 'h') { + return withoutSuffix ? 'гадзіна' : 'гадзіну'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñтудзень_люты_Ñакавік_краÑавік_травень_чÑрвень_ліпень_жнівень_вераÑень_каÑтрычнік_ліÑтапад_Ñнежань'.split('_'), + 'accusative': 'ÑтудзенÑ_лютага_Ñакавіка_краÑавіка_траўнÑ_чÑрвенÑ_ліпенÑ_жніўнÑ_вераÑнÑ_каÑтрычніка_ліÑтапада_ÑнежнÑ'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'нÑдзелÑ_панÑдзелак_аўторак_Ñерада_чацвер_пÑтніца_Ñубота'.split('_'), + 'accusative': 'нÑдзелю_панÑдзелак_аўторак_Ñераду_чацвер_пÑтніцу_Ñуботу'.split('_') + }, + + nounCase = (/\[ ?[Вв] ?(?:мінулую|наÑтупную)? ?\] ?dddd/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.defineLocale('be', { + months : monthsCaseReplace, + monthsShort : 'Ñтуд_лют_Ñак_краÑ_трав_чÑрв_ліп_жнів_вер_каÑÑ‚_ліÑÑ‚_Ñнеж'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'нд_пн_ат_ÑÑ€_чц_пт_Ñб'.split('_'), + weekdaysMin : 'нд_пн_ат_ÑÑ€_чц_пт_Ñб'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY г.', + LLL : 'D MMMM YYYY г., LT', + LLLL : 'dddd, D MMMM YYYY г., LT' + }, + calendar : { + sameDay: '[Ð¡Ñ‘Ð½Ð½Ñ Ñž] LT', + nextDay: '[Заўтра Ñž] LT', + lastDay: '[Учора Ñž] LT', + nextWeek: function () { + return '[У] dddd [Ñž] LT'; + }, + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return '[У мінулую] dddd [Ñž] LT'; + case 1: + case 2: + case 4: + return '[У мінулы] dddd [Ñž] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'праз %s', + past : '%s таму', + s : 'некалькі Ñекунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : relativeTimeWithPlural, + hh : relativeTimeWithPlural, + d : 'дзень', + dd : relativeTimeWithPlural, + M : 'меÑÑц', + MM : relativeTimeWithPlural, + y : 'год', + yy : relativeTimeWithPlural + }, + meridiemParse: /ночы|раніцы|днÑ|вечара/, + isPM : function (input) { + return /^(днÑ|вечара)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночы'; + } else if (hour < 12) { + return 'раніцы'; + } else if (hour < 17) { + return 'днÑ'; + } else { + return 'вечара'; + } + }, + + ordinalParse: /\d{1,2}-(Ñ–|Ñ‹|га)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-Ñ–' : number + '-Ñ‹'; + case 'D': + return number + '-га'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : bulgarian (bg) +// author : Krasen Borisov : https://github.com/kraz + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('bg', { + months : 'Ñнуари_февруари_март_април_май_юни_юли_авгуÑÑ‚_Ñептември_октомври_ноември_декември'.split('_'), + monthsShort : 'Ñнр_фев_мар_апр_май_юни_юли_авг_Ñеп_окт_ное_дек'.split('_'), + weekdays : 'неделÑ_понеделник_вторник_ÑÑ€Ñда_четвъртък_петък_Ñъбота'.split('_'), + weekdaysShort : 'нед_пон_вто_ÑÑ€Ñ_чет_пет_Ñъб'.split('_'), + weekdaysMin : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'D.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Ð”Ð½ÐµÑ Ð²] LT', + nextDay : '[Утре в] LT', + nextWeek : 'dddd [в] LT', + lastDay : '[Вчера в] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[Ð’ изминалата] dddd [в] LT'; + case 1: + case 2: + case 4: + case 5: + return '[Ð’ изминалиÑ] dddd [в] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'Ñлед %s', + past : 'преди %s', + s : 'нÑколко Ñекунди', + m : 'минута', + mm : '%d минути', + h : 'чаÑ', + hh : '%d чаÑа', + d : 'ден', + dd : '%d дни', + M : 'меÑец', + MM : '%d меÑеца', + y : 'година', + yy : '%d години' + }, + ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Bengali (bn) +// author : Kaushik Gandhi : https://github.com/kaushikgandhi + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': '১', + '2': '২', + '3': '৩', + '4': '৪', + '5': '৫', + '6': '৬', + '7': '৭', + '8': '৮', + '9': '৯', + '0': '০' + }, + numberMap = { + '১': '1', + '২': '2', + '৩': '3', + '৪': '4', + '৫': '5', + '৬': '6', + '৭': '7', + '৮': '8', + '৯': '9', + '০': '0' + }; + + return moment.defineLocale('bn', { + months : 'জানà§à§Ÿà¦¾à¦°à§€_ফেবà§à§Ÿà¦¾à¦°à§€_মারà§à¦š_à¦à¦ªà§à¦°à¦¿à¦²_মে_জà§à¦¨_জà§à¦²à¦¾à¦‡_অগাসà§à¦Ÿ_সেপà§à¦Ÿà§‡à¦®à§à¦¬à¦°_অকà§à¦Ÿà§‹à¦¬à¦°_নভেমà§à¦¬à¦°_ডিসেমà§à¦¬à¦°'.split('_'), + monthsShort : 'জানà§_ফেব_মারà§à¦š_à¦à¦ªà¦°_মে_জà§à¦¨_জà§à¦²_অগ_সেপà§à¦Ÿ_অকà§à¦Ÿà§‹_নভ_ডিসেমà§'.split('_'), + weekdays : 'রবিবার_সোমবার_মঙà§à¦—লবার_বà§à¦§à¦¬à¦¾à¦°_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿à¦¬à¦¾à¦°_শà§à¦•à§à¦°à§à¦¬à¦¾à¦°_শনিবার'.split('_'), + weekdaysShort : 'রবি_সোম_মঙà§à¦—ল_বà§à¦§_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿_শà§à¦•à§à¦°à§_শনি'.split('_'), + weekdaysMin : 'রব_সম_মঙà§à¦—_বà§_বà§à¦°à¦¿à¦¹_শà§_শনি'.split('_'), + longDateFormat : { + LT : 'A h:mm সময়', + LTS : 'A h:mm:ss সময়', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[আজ] LT', + nextDay : '[আগামীকাল] LT', + nextWeek : 'dddd, LT', + lastDay : '[গতকাল] LT', + lastWeek : '[গত] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s পরে', + past : '%s আগে', + s : 'কà¦à¦• সেকেনà§à¦¡', + m : 'à¦à¦• মিনিট', + mm : '%d মিনিট', + h : 'à¦à¦• ঘনà§à¦Ÿà¦¾', + hh : '%d ঘনà§à¦Ÿà¦¾', + d : 'à¦à¦• দিন', + dd : '%d দিন', + M : 'à¦à¦• মাস', + MM : '%d মাস', + y : 'à¦à¦• বছর', + yy : '%d বছর' + }, + preparse: function (string) { + return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /রাত|শকাল|দà§à¦ªà§à¦°|বিকেল|রাত/, + isPM: function (input) { + return /^(দà§à¦ªà§à¦°|বিকেল|রাত)$/.test(input); + }, + //Bengali is a vast language its spoken + //in different forms in various parts of the world. + //I have just generalized with most common one used + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'রাত'; + } else if (hour < 10) { + return 'শকাল'; + } else if (hour < 17) { + return 'দà§à¦ªà§à¦°'; + } else if (hour < 20) { + return 'বিকেল'; + } else { + return 'রাত'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : tibetan (bo) +// author : Thupten N. Chakrishar : https://github.com/vajradog + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': '༡', + '2': '༢', + '3': '༣', + '4': '༤', + '5': '༥', + '6': '༦', + '7': '༧', + '8': '༨', + '9': '༩', + '0': '༠' + }, + numberMap = { + '༡': '1', + '༢': '2', + '༣': '3', + '༤': '4', + '༥': '5', + '༦': '6', + '༧': '7', + '༨': '8', + '༩': '9', + '༠': '0' + }; + + return moment.defineLocale('bo', { + months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), + monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), + weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'), + weekdaysShort : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), + weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), + longDateFormat : { + LT : 'A h:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[དི་རིང] LT', + nextDay : '[སང་ཉིན] LT', + nextWeek : '[བདུན་ཕྲག་རྗེས་མ], LT', + lastDay : '[à½à¼‹à½¦à½„] LT', + lastWeek : '[བདུན་ཕྲག་མà½à½ à¼‹à½˜] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s ལ་', + past : '%s སྔན་ལ', + s : 'ལམ་སང', + m : 'སà¾à½¢à¼‹à½˜à¼‹à½‚ཅིག', + mm : '%d སà¾à½¢à¼‹à½˜', + h : 'ཆུ་ཚོད་གཅིག', + hh : '%d ཆུ་ཚོད', + d : 'ཉིན་གཅིག', + dd : '%d ཉིན་', + M : 'ཟླ་བ་གཅིག', + MM : '%d ཟླ་བ', + y : 'ལོ་གཅིག', + yy : '%d ལོ' + }, + preparse: function (string) { + return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/, + isPM: function (input) { + return /^(ཉིན་གུང|དགོང་དག|མཚན་མོ)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'མཚན་མོ'; + } else if (hour < 10) { + return 'ཞོགས་ཀས'; + } else if (hour < 17) { + return 'ཉིན་གུང'; + } else if (hour < 20) { + return 'དགོང་དག'; + } else { + return 'མཚན་མོ'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : breton (br) +// author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou + +(function (factory) { + factory(moment); +}(function (moment) { + function relativeTimeWithMutation(number, withoutSuffix, key) { + var format = { + 'mm': 'munutenn', + 'MM': 'miz', + 'dd': 'devezh' + }; + return number + ' ' + mutation(format[key], number); + } + + function specialMutationForYears(number) { + switch (lastNumber(number)) { + case 1: + case 3: + case 4: + case 5: + case 9: + return number + ' bloaz'; + default: + return number + ' vloaz'; + } + } + + function lastNumber(number) { + if (number > 9) { + return lastNumber(number % 10); + } + return number; + } + + function mutation(text, number) { + if (number === 2) { + return softMutation(text); + } + return text; + } + + function softMutation(text) { + var mutationTable = { + 'm': 'v', + 'b': 'v', + 'd': 'z' + }; + if (mutationTable[text.charAt(0)] === undefined) { + return text; + } + return mutationTable[text.charAt(0)] + text.substring(1); + } + + return moment.defineLocale('br', { + months : 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'), + monthsShort : 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'), + weekdays : 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'), + weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'), + weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'), + longDateFormat : { + LT : 'h[e]mm A', + LTS : 'h[e]mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D [a viz] MMMM YYYY', + LLL : 'D [a viz] MMMM YYYY LT', + LLLL : 'dddd, D [a viz] MMMM YYYY LT' + }, + calendar : { + sameDay : '[Hiziv da] LT', + nextDay : '[Warc\'hoazh da] LT', + nextWeek : 'dddd [da] LT', + lastDay : '[Dec\'h da] LT', + lastWeek : 'dddd [paset da] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'a-benn %s', + past : '%s \'zo', + s : 'un nebeud segondennoù', + m : 'ur vunutenn', + mm : relativeTimeWithMutation, + h : 'un eur', + hh : '%d eur', + d : 'un devezh', + dd : relativeTimeWithMutation, + M : 'ur miz', + MM : relativeTimeWithMutation, + y : 'ur bloaz', + yy : specialMutationForYears + }, + ordinalParse: /\d{1,2}(añ|vet)/, + ordinal : function (number) { + var output = (number === 1) ? 'añ' : 'vet'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : bosnian (bs) +// author : Nedim Cholich : https://github.com/frontyard +// based on (hr) translation by Bojan Marković + +(function (factory) { + factory(moment); +}(function (moment) { + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } + } + + return moment.defineLocale('bs', { + months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'), + monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'), + weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota'.split('_'), + weekdaysShort : 'ned._pon._uto._sri._Äet._pet._sub.'.split('_'), + weekdaysMin : 'ne_po_ut_sr_Äe_pe_su'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD. MM. YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[proÅ¡lu] dddd [u] LT'; + case 6: + return '[proÅ¡le] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[proÅ¡li] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'par sekundi', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'dan', + dd : translate, + M : 'mjesec', + MM : translate, + y : 'godinu', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : catalan (ca) +// author : Juan G. Hurtado : https://github.com/juanghurtado + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('ca', { + months : 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'), + monthsShort : 'gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.'.split('_'), + weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'), + weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'), + weekdaysMin : 'Dg_Dl_Dt_Dc_Dj_Dv_Ds'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay : function () { + return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextDay : function () { + return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastDay : function () { + return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'fa %s', + s : 'uns segons', + m : 'un minut', + mm : '%d minuts', + h : 'una hora', + hh : '%d hores', + d : 'un dia', + dd : '%d dies', + M : 'un mes', + MM : '%d mesos', + y : 'un any', + yy : '%d anys' + }, + ordinalParse: /\d{1,2}(r|n|t|è|a)/, + ordinal : function (number, period) { + var output = (number === 1) ? 'r' : + (number === 2) ? 'n' : + (number === 3) ? 'r' : + (number === 4) ? 't' : 'è'; + if (period === 'w' || period === 'W') { + output = 'a'; + } + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : czech (cs) +// author : petrbela : https://github.com/petrbela + +(function (factory) { + factory(moment); +}(function (moment) { + var months = 'leden_únor_bÅ™ezen_duben_kvÄ›ten_Äerven_Äervenec_srpen_září_říjen_listopad_prosinec'.split('_'), + monthsShort = 'led_úno_bÅ™e_dub_kvÄ›_Ävn_Ävc_srp_zář_říj_lis_pro'.split('_'); + + function plural(n) { + return (n > 1) && (n < 5) && (~~(n / 10) !== 1); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami'; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minuty' : 'minut'); + } else { + return result + 'minutami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodin'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'den' : 'dnem'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dny' : 'dní'); + } else { + return result + 'dny'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mÄ›síc' : 'mÄ›sícem'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'mÄ›síce' : 'mÄ›síců'); + } else { + return result + 'mÄ›síci'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokem'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'let'); + } else { + return result + 'lety'; + } + break; + } + } + + return moment.defineLocale('cs', { + months : months, + monthsShort : monthsShort, + monthsParse : (function (months, monthsShort) { + var i, _monthsParse = []; + for (i = 0; i < 12; i++) { + // use custom parser to solve problem with July (Äervenec) + _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); + } + return _monthsParse; + }(months, monthsShort)), + weekdays : 'nedÄ›le_pondÄ›lí_úterý_stÅ™eda_Ätvrtek_pátek_sobota'.split('_'), + weekdaysShort : 'ne_po_út_st_Ät_pá_so'.split('_'), + weekdaysMin : 'ne_po_út_st_Ät_pá_so'.split('_'), + longDateFormat : { + LT: 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[dnes v] LT', + nextDay: '[zítra v] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedÄ›li v] LT'; + case 1: + case 2: + return '[v] dddd [v] LT'; + case 3: + return '[ve stÅ™edu v] LT'; + case 4: + return '[ve Ätvrtek v] LT'; + case 5: + return '[v pátek v] LT'; + case 6: + return '[v sobotu v] LT'; + } + }, + lastDay: '[vÄera v] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulou nedÄ›li v] LT'; + case 1: + case 2: + return '[minulé] dddd [v] LT'; + case 3: + return '[minulou stÅ™edu v] LT'; + case 4: + case 5: + return '[minulý] dddd [v] LT'; + case 6: + return '[minulou sobotu v] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pÅ™ed %s', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse : /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : chuvash (cv) +// author : Anatoly Mironov : https://github.com/mirontoli + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('cv', { + months : 'кăрлач_нарăÑ_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав'.split('_'), + monthsShort : 'кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш'.split('_'), + weekdays : 'вырÑарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_Ñрнекун_шăматкун'.split('_'), + weekdaysShort : 'выр_тун_ытл_юн_кĕç_Ñрн_шăм'.split('_'), + weekdaysMin : 'вр_тн_Ñ‹Ñ‚_юн_кç_ÑÑ€_шм'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD-MM-YYYY', + LL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]', + LLL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT', + LLLL : 'dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT' + }, + calendar : { + sameDay: '[ПаÑн] LT [Ñехетре]', + nextDay: '[Ыран] LT [Ñехетре]', + lastDay: '[Ĕнер] LT [Ñехетре]', + nextWeek: '[ÇитеÑ] dddd LT [Ñехетре]', + lastWeek: '[Иртнĕ] dddd LT [Ñехетре]', + sameElse: 'L' + }, + relativeTime : { + future : function (output) { + var affix = /Ñехет$/i.exec(output) ? 'рен' : /çул$/i.exec(output) ? 'тан' : 'ран'; + return output + affix; + }, + past : '%s каÑлла', + s : 'пĕр-ик çеккунт', + m : 'пĕр минут', + mm : '%d минут', + h : 'пĕр Ñехет', + hh : '%d Ñехет', + d : 'пĕр кун', + dd : '%d кун', + M : 'пĕр уйăх', + MM : '%d уйăх', + y : 'пĕр çул', + yy : '%d çул' + }, + ordinalParse: /\d{1,2}-мĕш/, + ordinal : '%d-мĕш', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Welsh (cy) +// author : Robert Allen + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('cy', { + months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'), + monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'), + weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'), + weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'), + weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'), + // time formats are the same as en-gb + longDateFormat: { + LT: 'HH:mm', + LTS : 'LT:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd, D MMMM YYYY LT' + }, + calendar: { + sameDay: '[Heddiw am] LT', + nextDay: '[Yfory am] LT', + nextWeek: 'dddd [am] LT', + lastDay: '[Ddoe am] LT', + lastWeek: 'dddd [diwethaf am] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'mewn %s', + past: '%s yn ôl', + s: 'ychydig eiliadau', + m: 'munud', + mm: '%d munud', + h: 'awr', + hh: '%d awr', + d: 'diwrnod', + dd: '%d diwrnod', + M: 'mis', + MM: '%d mis', + y: 'blwyddyn', + yy: '%d flynedd' + }, + ordinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/, + // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh + ordinal: function (number) { + var b = number, + output = '', + lookup = [ + '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed + 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed + ]; + + if (b > 20) { + if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) { + output = 'fed'; // not 30ain, 70ain or 90ain + } else { + output = 'ain'; + } + } else if (b > 0) { + output = lookup[b]; + } + + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : danish (da) +// author : Ulrik Nielsen : https://github.com/mrbase + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('da', { + months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), + weekdaysShort : 'søn_man_tir_ons_tor_fre_lør'.split('_'), + weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd [d.] D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[I dag kl.] LT', + nextDay : '[I morgen kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[I gÃ¥r kl.] LT', + lastWeek : '[sidste] dddd [kl] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'om %s', + past : '%s siden', + s : 'fÃ¥ sekunder', + m : 'et minut', + mm : '%d minutter', + h : 'en time', + hh : '%d timer', + d : 'en dag', + dd : '%d dage', + M : 'en mÃ¥ned', + MM : '%d mÃ¥neder', + y : 'et Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : austrian german (de-at) +// author : lluchs : https://github.com/lluchs +// author: Menelion Elensúle: https://github.com/Oire +// author : Martin Groller : https://github.com/MadMG + +(function (factory) { + factory(moment); +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + return moment.defineLocale('de-at', { + months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[Heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[Morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[Gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : german (de) +// author : lluchs : https://github.com/lluchs +// author: Menelion Elensúle: https://github.com/Oire + +(function (factory) { + factory(moment); +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + return moment.defineLocale('de', { + months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[Heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[Morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[Gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : modern greek (el) +// author : Aggelos Karalias : https://github.com/mehiel + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('el', { + monthsNominativeEl : 'ΙανουάÏιος_ΦεβÏουάÏιος_ΜάÏτιος_ΑπÏίλιος_Μάιος_ΙοÏνιος_ΙοÏλιος_ΑÏγουστος_ΣεπτέμβÏιος_ΟκτώβÏιος_ÎοέμβÏιος_ΔεκέμβÏιος'.split('_'), + monthsGenitiveEl : 'ΙανουαÏίου_ΦεβÏουαÏίου_ΜαÏτίου_ΑπÏιλίου_ΜαÎου_Ιουνίου_Ιουλίου_ΑυγοÏστου_ΣεπτεμβÏίου_ΟκτωβÏίου_ÎοεμβÏίου_ΔεκεμβÏίου'.split('_'), + months : function (momentToFormat, format) { + if (/D/.test(format.substring(0, format.indexOf('MMMM')))) { // if there is a day number before 'MMMM' + return this._monthsGenitiveEl[momentToFormat.month()]; + } else { + return this._monthsNominativeEl[momentToFormat.month()]; + } + }, + monthsShort : 'Ιαν_Φεβ_ΜαÏ_ΑπÏ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Îοε_Δεκ'.split('_'), + weekdays : 'ΚυÏιακή_ΔευτέÏα_ΤÏίτη_ΤετάÏτη_Πέμπτη_ΠαÏασκευή_Σάββατο'.split('_'), + weekdaysShort : 'ΚυÏ_Δευ_ΤÏι_Τετ_Πεμ_ΠαÏ_Σαβ'.split('_'), + weekdaysMin : 'Κυ_Δε_ΤÏ_Τε_Πε_Πα_Σα'.split('_'), + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'μμ' : 'ΜΜ'; + } else { + return isLower ? 'πμ' : 'ΠΜ'; + } + }, + isPM : function (input) { + return ((input + '').toLowerCase()[0] === 'μ'); + }, + meridiemParse : /[ΠΜ]\.?Îœ?\.?/i, + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendarEl : { + sameDay : '[ΣήμεÏα {}] LT', + nextDay : '[ΑÏÏιο {}] LT', + nextWeek : 'dddd [{}] LT', + lastDay : '[Χθες {}] LT', + lastWeek : function () { + switch (this.day()) { + case 6: + return '[το Ï€ÏοηγοÏμενο] dddd [{}] LT'; + default: + return '[την Ï€ÏοηγοÏμενη] dddd [{}] LT'; + } + }, + sameElse : 'L' + }, + calendar : function (key, mom) { + var output = this._calendarEl[key], + hours = mom && mom.hours(); + + if (typeof output === 'function') { + output = output.apply(mom); + } + + return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις')); + }, + relativeTime : { + future : 'σε %s', + past : '%s Ï€Ïιν', + s : 'λίγα δευτεÏόλεπτα', + m : 'ένα λεπτό', + mm : '%d λεπτά', + h : 'μία ÏŽÏα', + hh : '%d ÏŽÏες', + d : 'μία μέÏα', + dd : '%d μέÏες', + M : 'ένας μήνας', + MM : '%d μήνες', + y : 'ένας χÏόνος', + yy : '%d χÏόνια' + }, + ordinalParse: /\d{1,2}η/, + ordinal: '%dη', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : australian english (en-au) + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('en-au', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + 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' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : canadian english (en-ca) +// author : Jonathan Abourbih : https://github.com/jonbca + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('en-ca', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'YYYY-MM-DD', + LL : 'D MMMM, YYYY', + LLL : 'D MMMM, YYYY LT', + LLLL : 'dddd, D MMMM, YYYY LT' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + 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' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); +})); +// moment.js locale configuration +// locale : great britain english (en-gb) +// author : Chris Gedrim : https://github.com/chrisgedrim + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('en-gb', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + 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' + }, + ordinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : esperanto (eo) +// author : Colin Dean : https://github.com/colindean +// komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko. +// Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni! + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('eo', { + months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aÅ­gusto_septembro_oktobro_novembro_decembro'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aÅ­g_sep_okt_nov_dec'.split('_'), + weekdays : 'Dimanĉo_Lundo_Mardo_Merkredo_Ä´aÅ­do_Vendredo_Sabato'.split('_'), + weekdaysShort : 'Dim_Lun_Mard_Merk_Ä´aÅ­_Ven_Sab'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Ä´a_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'D[-an de] MMMM, YYYY', + LLL : 'D[-an de] MMMM, YYYY LT', + LLLL : 'dddd, [la] D[-an de] MMMM, YYYY LT' + }, + meridiemParse: /[ap]\.t\.m/i, + isPM: function (input) { + return input.charAt(0).toLowerCase() === 'p'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'p.t.m.' : 'P.T.M.'; + } else { + return isLower ? 'a.t.m.' : 'A.T.M.'; + } + }, + calendar : { + sameDay : '[HodiaÅ­ je] LT', + nextDay : '[MorgaÅ­ je] LT', + nextWeek : 'dddd [je] LT', + lastDay : '[HieraÅ­ je] LT', + lastWeek : '[pasinta] dddd [je] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'je %s', + past : 'antaÅ­ %s', + s : 'sekundoj', + m : 'minuto', + mm : '%d minutoj', + h : 'horo', + hh : '%d horoj', + d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo + dd : '%d tagoj', + M : 'monato', + MM : '%d monatoj', + y : 'jaro', + yy : '%d jaroj' + }, + ordinalParse: /\d{1,2}a/, + ordinal : '%da', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : spanish (es) +// author : Julio Napurí : https://github.com/julionc + +(function (factory) { + factory(moment); +}(function (moment) { + var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), + monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); + + return moment.defineLocale('es', { + months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return monthsShort[m.month()]; + } else { + return monthsShortDot[m.month()]; + } + }, + weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), + weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), + weekdaysMin : 'Do_Lu_Ma_Mi_Ju_Vi_Sá'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY LT', + LLLL : 'dddd, D [de] MMMM [de] YYYY LT' + }, + calendar : { + sameDay : function () { + return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextDay : function () { + return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastDay : function () { + return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'hace %s', + s : 'unos segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'una hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un año', + yy : '%d años' + }, + ordinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : estonian (et) +// author : Henry Kehlmann : https://github.com/madhenry +// improvements : Illimar Tambek : https://github.com/ragulka + +(function (factory) { + factory(moment); +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'], + 'm' : ['ühe minuti', 'üks minut'], + 'mm': [number + ' minuti', number + ' minutit'], + 'h' : ['ühe tunni', 'tund aega', 'üks tund'], + 'hh': [number + ' tunni', number + ' tundi'], + 'd' : ['ühe päeva', 'üks päev'], + 'M' : ['kuu aja', 'kuu aega', 'üks kuu'], + 'MM': [number + ' kuu', number + ' kuud'], + 'y' : ['ühe aasta', 'aasta', 'üks aasta'], + 'yy': [number + ' aasta', number + ' aastat'] + }; + if (withoutSuffix) { + return format[key][2] ? format[key][2] : format[key][1]; + } + return isFuture ? format[key][0] : format[key][1]; + } + + return moment.defineLocale('et', { + months : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'), + monthsShort : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'), + weekdays : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'), + weekdaysShort : 'P_E_T_K_N_R_L'.split('_'), + weekdaysMin : 'P_E_T_K_N_R_L'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[Täna,] LT', + nextDay : '[Homme,] LT', + nextWeek : '[Järgmine] dddd LT', + lastDay : '[Eile,] LT', + lastWeek : '[Eelmine] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s pärast', + past : '%s tagasi', + s : processRelativeTime, + m : processRelativeTime, + mm : processRelativeTime, + h : processRelativeTime, + hh : processRelativeTime, + d : processRelativeTime, + dd : '%d päeva', + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : euskara (eu) +// author : Eneko Illarramendi : https://github.com/eillarra + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('eu', { + months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'), + monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'), + weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'), + weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'), + weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY[ko] MMMM[ren] D[a]', + LLL : 'YYYY[ko] MMMM[ren] D[a] LT', + LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] LT', + l : 'YYYY-M-D', + ll : 'YYYY[ko] MMM D[a]', + lll : 'YYYY[ko] MMM D[a] LT', + llll : 'ddd, YYYY[ko] MMM D[a] LT' + }, + calendar : { + sameDay : '[gaur] LT[etan]', + nextDay : '[bihar] LT[etan]', + nextWeek : 'dddd LT[etan]', + lastDay : '[atzo] LT[etan]', + lastWeek : '[aurreko] dddd LT[etan]', + sameElse : 'L' + }, + relativeTime : { + future : '%s barru', + past : 'duela %s', + s : 'segundo batzuk', + m : 'minutu bat', + mm : '%d minutu', + h : 'ordu bat', + hh : '%d ordu', + d : 'egun bat', + dd : '%d egun', + M : 'hilabete bat', + MM : '%d hilabete', + y : 'urte bat', + yy : '%d urte' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Persian (fa) +// author : Ebrahim Byagowi : https://github.com/ebraminio + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': 'Û±', + '2': 'Û²', + '3': 'Û³', + '4': 'Û´', + '5': 'Ûµ', + '6': 'Û¶', + '7': 'Û·', + '8': 'Û¸', + '9': 'Û¹', + '0': 'Û°' + }, numberMap = { + 'Û±': '1', + 'Û²': '2', + 'Û³': '3', + 'Û´': '4', + 'Ûµ': '5', + 'Û¶': '6', + 'Û·': '7', + 'Û¸': '8', + 'Û¹': '9', + 'Û°': '0' + }; + + return moment.defineLocale('fa', { + months : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + monthsShort : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysMin : 'ÛŒ_د_س_Ú†_Ù¾_ج_Ø´'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + meridiemParse: /قبل از ظهر|بعد از ظهر/, + isPM: function (input) { + return /بعد از ظهر/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'قبل از ظهر'; + } else { + return 'بعد از ظهر'; + } + }, + calendar : { + sameDay : '[امروز ساعت] LT', + nextDay : '[Ùردا ساعت] LT', + nextWeek : 'dddd [ساعت] LT', + lastDay : '[دیروز ساعت] LT', + lastWeek : 'dddd [پیش] [ساعت] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'در %s', + past : '%s پیش', + s : 'چندین ثانیه', + m : 'یک دقیقه', + mm : '%d دقیقه', + h : 'یک ساعت', + hh : '%d ساعت', + d : 'یک روز', + dd : '%d روز', + M : 'یک ماه', + MM : '%d ماه', + y : 'یک سال', + yy : '%d سال' + }, + preparse: function (string) { + return string.replace(/[Û°-Û¹]/g, function (match) { + return numberMap[match]; + }).replace(/ØŒ/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, 'ØŒ'); + }, + ordinalParse: /\d{1,2}Ù…/, + ordinal : '%dÙ…', + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : finnish (fi) +// author : Tarmo Aidantausta : https://github.com/bleadof + +(function (factory) { + factory(moment); +}(function (moment) { + var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '), + numbersFuture = [ + 'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden', + numbersPast[7], numbersPast[8], numbersPast[9] + ]; + + function translate(number, withoutSuffix, key, isFuture) { + var result = ''; + switch (key) { + case 's': + return isFuture ? 'muutaman sekunnin' : 'muutama sekunti'; + case 'm': + return isFuture ? 'minuutin' : 'minuutti'; + case 'mm': + result = isFuture ? 'minuutin' : 'minuuttia'; + break; + case 'h': + return isFuture ? 'tunnin' : 'tunti'; + case 'hh': + result = isFuture ? 'tunnin' : 'tuntia'; + break; + case 'd': + return isFuture ? 'päivän' : 'päivä'; + case 'dd': + result = isFuture ? 'päivän' : 'päivää'; + break; + case 'M': + return isFuture ? 'kuukauden' : 'kuukausi'; + case 'MM': + result = isFuture ? 'kuukauden' : 'kuukautta'; + break; + case 'y': + return isFuture ? 'vuoden' : 'vuosi'; + case 'yy': + result = isFuture ? 'vuoden' : 'vuotta'; + break; + } + result = verbalNumber(number, isFuture) + ' ' + result; + return result; + } + + function verbalNumber(number, isFuture) { + return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number; + } + + return moment.defineLocale('fi', { + months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'), + monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'), + weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'), + weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'), + weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD.MM.YYYY', + LL : 'Do MMMM[ta] YYYY', + LLL : 'Do MMMM[ta] YYYY, [klo] LT', + LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] LT', + l : 'D.M.YYYY', + ll : 'Do MMM YYYY', + lll : 'Do MMM YYYY, [klo] LT', + llll : 'ddd, Do MMM YYYY, [klo] LT' + }, + calendar : { + sameDay : '[tänään] [klo] LT', + nextDay : '[huomenna] [klo] LT', + nextWeek : 'dddd [klo] LT', + lastDay : '[eilen] [klo] LT', + lastWeek : '[viime] dddd[na] [klo] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s päästä', + past : '%s sitten', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : faroese (fo) +// author : Ragnar Johannesen : https://github.com/ragnar123 + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('fo', { + months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'), + weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'), + weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D. MMMM, YYYY LT' + }, + calendar : { + sameDay : '[à dag kl.] LT', + nextDay : '[à morgin kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[à gjár kl.] LT', + lastWeek : '[síðstu] dddd [kl] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'um %s', + past : '%s síðani', + s : 'fá sekund', + m : 'ein minutt', + mm : '%d minuttir', + h : 'ein tími', + hh : '%d tímar', + d : 'ein dagur', + dd : '%d dagar', + M : 'ein mánaði', + MM : '%d mánaðir', + y : 'eitt ár', + yy : '%d ár' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : canadian french (fr-ca) +// author : Jonathan Abourbih : https://github.com/jonbca + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('fr-ca', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Aujourd\'hui à] LT', + nextDay: '[Demain à] LT', + nextWeek: 'dddd [à] LT', + lastDay: '[Hier à] LT', + lastWeek: 'dddd [dernier à] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + ordinalParse: /\d{1,2}(er|)/, + ordinal : function (number) { + return number + (number === 1 ? 'er' : ''); + } + }); +})); +// moment.js locale configuration +// locale : french (fr) +// author : John Fischer : https://github.com/jfroffice + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('fr', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Aujourd\'hui à] LT', + nextDay: '[Demain à] LT', + nextWeek: 'dddd [à] LT', + lastDay: '[Hier à] LT', + lastWeek: 'dddd [dernier à] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + ordinalParse: /\d{1,2}(er|)/, + ordinal : function (number) { + return number + (number === 1 ? 'er' : ''); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : frisian (fy) +// author : Robin van der Vliet : https://github.com/robin0van0der0v + +(function (factory) { + factory(moment); +}(function (moment) { + var monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'); + + return moment.defineLocale('fy', { + months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'), + weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'), + weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[hjoed om] LT', + nextDay: '[moarn om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[juster om] LT', + lastWeek: '[ôfrûne] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'oer %s', + past : '%s lyn', + s : 'in pear sekonden', + m : 'ien minút', + mm : '%d minuten', + h : 'ien oere', + hh : '%d oeren', + d : 'ien dei', + dd : '%d dagen', + M : 'ien moanne', + MM : '%d moannen', + y : 'ien jier', + yy : '%d jierren' + }, + ordinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : galician (gl) +// author : Juan G. Hurtado : https://github.com/juanghurtado + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('gl', { + months : 'Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro'.split('_'), + monthsShort : 'Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.'.split('_'), + weekdays : 'Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado'.split('_'), + weekdaysShort : 'Dom._Lun._Mar._Mér._Xov._Ven._Sáb.'.split('_'), + weekdaysMin : 'Do_Lu_Ma_Mé_Xo_Ve_Sá'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay : function () { + return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextDay : function () { + return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextWeek : function () { + return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + lastDay : function () { + return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT'; + }, + lastWeek : function () { + return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : function (str) { + if (str === 'uns segundos') { + return 'nuns segundos'; + } + return 'en ' + str; + }, + past : 'hai %s', + s : 'uns segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'unha hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un ano', + yy : '%d anos' + }, + ordinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Hebrew (he) +// author : Tomer Cohen : https://github.com/tomer +// author : Moshe Simantov : https://github.com/DevelopmentIL +// author : Tal Ater : https://github.com/TalAter + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('he', { + months : 'ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר'.split('_'), + monthsShort : 'ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳'.split('_'), + weekdays : 'ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'), + weekdaysShort : '×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'), + weekdaysMin : '×_ב_×’_ד_×”_ו_ש'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [ב]MMMM YYYY', + LLL : 'D [ב]MMMM YYYY LT', + LLLL : 'dddd, D [ב]MMMM YYYY LT', + l : 'D/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY LT', + llll : 'ddd, D MMM YYYY LT' + }, + calendar : { + sameDay : '[×”×™×•× ×‘Ö¾]LT', + nextDay : '[מחר ב־]LT', + nextWeek : 'dddd [בשעה] LT', + lastDay : '[×תמול ב־]LT', + lastWeek : '[ביו×] dddd [×”×חרון בשעה] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'בעוד %s', + past : 'לפני %s', + s : 'מספר שניות', + m : 'דקה', + mm : '%d דקות', + h : 'שעה', + hh : function (number) { + if (number === 2) { + return 'שעתיי×'; + } + return number + ' שעות'; + }, + d : 'יו×', + dd : function (number) { + if (number === 2) { + return 'יומיי×'; + } + return number + ' ימי×'; + }, + M : 'חודש', + MM : function (number) { + if (number === 2) { + return 'חודשיי×'; + } + return number + ' חודשי×'; + }, + y : 'שנה', + yy : function (number) { + if (number === 2) { + return 'שנתיי×'; + } else if (number % 10 === 0 && number !== 10) { + return number + ' שנה'; + } + return number + ' שני×'; + } + } + }); +})); +// moment.js locale configuration +// locale : hindi (hi) +// author : Mayank Singhal : https://github.com/mayanksinghal + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.defineLocale('hi', { + months : 'जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°'.split('_'), + monthsShort : 'जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.'.split('_'), + weekdays : 'रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split('_'), + weekdaysShort : 'रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split('_'), + weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split('_'), + longDateFormat : { + LT : 'A h:mm बजे', + LTS : 'A h:mm:ss बजे', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[कल] LT', + nextWeek : 'dddd, LT', + lastDay : '[कल] LT', + lastWeek : '[पिछले] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s में', + past : '%s पहले', + s : 'कà¥à¤› ही कà¥à¤·à¤£', + m : 'à¤à¤• मिनट', + mm : '%d मिनट', + h : 'à¤à¤• घंटा', + hh : '%d घंटे', + d : 'à¤à¤• दिन', + dd : '%d दिन', + M : 'à¤à¤• महीने', + MM : '%d महीने', + y : 'à¤à¤• वरà¥à¤·', + yy : '%d वरà¥à¤·' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + // Hindi notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi. + meridiemParse: /रात|सà¥à¤¬à¤¹|दोपहर|शाम/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'रात') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'सà¥à¤¬à¤¹') { + return hour; + } else if (meridiem === 'दोपहर') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'शाम') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'रात'; + } else if (hour < 10) { + return 'सà¥à¤¬à¤¹'; + } else if (hour < 17) { + return 'दोपहर'; + } else if (hour < 20) { + return 'शाम'; + } else { + return 'रात'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : hrvatski (hr) +// author : Bojan Marković : https://github.com/bmarkovic + +// based on (sl) translation by Robert SedovÅ¡ek + +(function (factory) { + factory(moment); +}(function (moment) { + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } + } + + return moment.defineLocale('hr', { + months : 'sjeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_'), + monthsShort : 'sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'), + weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota'.split('_'), + weekdaysShort : 'ned._pon._uto._sri._Äet._pet._sub.'.split('_'), + weekdaysMin : 'ne_po_ut_sr_Äe_pe_su'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD. MM. YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[proÅ¡lu] dddd [u] LT'; + case 6: + return '[proÅ¡le] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[proÅ¡li] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'par sekundi', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'dan', + dd : translate, + M : 'mjesec', + MM : translate, + y : 'godinu', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : hungarian (hu) +// author : Adam Brunner : https://github.com/adambrunner + +(function (factory) { + factory(moment); +}(function (moment) { + var weekEndings = 'vasárnap hétfÅ‘n kedden szerdán csütörtökön pénteken szombaton'.split(' '); + + function translate(number, withoutSuffix, key, isFuture) { + var num = number, + suffix; + + switch (key) { + case 's': + return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce'; + case 'm': + return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'mm': + return num + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'h': + return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'hh': + return num + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'd': + return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'dd': + return num + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'M': + return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'MM': + return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'y': + return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve'); + case 'yy': + return num + (isFuture || withoutSuffix ? ' év' : ' éve'); + } + + return ''; + } + + function week(isFuture) { + return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]'; + } + + return moment.defineLocale('hu', { + months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'), + monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'), + weekdays : 'vasárnap_hétfÅ‘_kedd_szerda_csütörtök_péntek_szombat'.split('_'), + weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'), + weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'YYYY.MM.DD.', + LL : 'YYYY. MMMM D.', + LLL : 'YYYY. MMMM D., LT', + LLLL : 'YYYY. MMMM D., dddd LT' + }, + meridiemParse: /de|du/i, + isPM: function (input) { + return input.charAt(1).toLowerCase() === 'u'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower === true ? 'de' : 'DE'; + } else { + return isLower === true ? 'du' : 'DU'; + } + }, + calendar : { + sameDay : '[ma] LT[-kor]', + nextDay : '[holnap] LT[-kor]', + nextWeek : function () { + return week.call(this, true); + }, + lastDay : '[tegnap] LT[-kor]', + lastWeek : function () { + return week.call(this, false); + }, + sameElse : 'L' + }, + relativeTime : { + future : '%s múlva', + past : '%s', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Armenian (hy-am) +// author : Armendarabyan : https://github.com/armendarabyan + +(function (factory) { + factory(moment); +}(function (moment) { + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€_Õ´Õ¡Ö€Õ¿_Õ¡ÕºÖ€Õ«Õ¬_Õ´Õ¡ÕµÕ«Õ½_Õ°Õ¸Ö‚Õ¶Õ«Õ½_Õ°Õ¸Ö‚Õ¬Õ«Õ½_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€'.split('_'), + 'accusative': 'Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€Õ«_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€Õ«_Õ´Õ¡Ö€Õ¿Õ«_Õ¡ÕºÖ€Õ«Õ¬Õ«_Õ´Õ¡ÕµÕ«Õ½Õ«_Õ°Õ¸Ö‚Õ¶Õ«Õ½Õ«_Õ°Õ¸Ö‚Õ¬Õ«Õ½Õ«_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½Õ«_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function monthsShortCaseReplace(m, format) { + var monthsShort = 'Õ°Õ¶Õ¾_ÖƒÕ¿Ö€_Õ´Ö€Õ¿_Õ¡ÕºÖ€_Õ´ÕµÕ½_Õ°Õ¶Õ½_Õ°Õ¬Õ½_Ö…Õ£Õ½_Õ½ÕºÕ¿_Õ°Õ¯Õ¿_Õ¶Õ´Õ¢_Õ¤Õ¯Õ¿'.split('_'); + + return monthsShort[m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = 'Õ¯Õ«Ö€Õ¡Õ¯Õ«_Õ¥Ö€Õ¯Õ¸Ö‚Õ·Õ¡Õ¢Õ©Õ«_Õ¥Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ¹Õ¸Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ°Õ«Õ¶Õ£Õ·Õ¡Õ¢Õ©Õ«_Õ¸Ö‚Ö€Õ¢Õ¡Õ©_Õ·Õ¡Õ¢Õ¡Õ©'.split('_'); + + return weekdays[m.day()]; + } + + return moment.defineLocale('hy-am', { + months : monthsCaseReplace, + monthsShort : monthsShortCaseReplace, + weekdays : weekdaysCaseReplace, + weekdaysShort : 'Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©'.split('_'), + weekdaysMin : 'Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY Õ©.', + LLL : 'D MMMM YYYY Õ©., LT', + LLLL : 'dddd, D MMMM YYYY Õ©., LT' + }, + calendar : { + sameDay: '[Õ¡ÕµÕ½Ö…Ö€] LT', + nextDay: '[Õ¾Õ¡Õ²Õ¨] LT', + lastDay: '[Õ¥Ö€Õ¥Õ¯] LT', + nextWeek: function () { + return 'dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT'; + }, + lastWeek: function () { + return '[Õ¡Õ¶ÖÕ¡Õ®] dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT'; + }, + sameElse: 'L' + }, + relativeTime : { + future : '%s Õ°Õ¥Õ¿Õ¸', + past : '%s Õ¡Õ¼Õ¡Õ»', + s : 'Õ´Õ« Ö„Õ¡Õ¶Õ« Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶', + m : 'Ö€Õ¸ÕºÕ¥', + mm : '%d Ö€Õ¸ÕºÕ¥', + h : 'ÕªÕ¡Õ´', + hh : '%d ÕªÕ¡Õ´', + d : 'Ö…Ö€', + dd : '%d Ö…Ö€', + M : 'Õ¡Õ´Õ«Õ½', + MM : '%d Õ¡Õ´Õ«Õ½', + y : 'Õ¿Õ¡Ö€Õ«', + yy : '%d Õ¿Õ¡Ö€Õ«' + }, + + meridiemParse: /Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡|Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡|ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶/, + isPM: function (input) { + return /^(ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶)$/.test(input); + }, + meridiem : function (hour) { + if (hour < 4) { + return 'Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡'; + } else if (hour < 12) { + return 'Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡'; + } else if (hour < 17) { + return 'ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡'; + } else { + return 'Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶'; + } + }, + + ordinalParse: /\d{1,2}|\d{1,2}-(Õ«Õ¶|Ö€Õ¤)/, + ordinal: function (number, period) { + switch (period) { + case 'DDD': + case 'w': + case 'W': + case 'DDDo': + if (number === 1) { + return number + '-Õ«Õ¶'; + } + return number + '-Ö€Õ¤'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Bahasa Indonesia (id) +// author : Mohammad Satrio Utomo : https://github.com/tyok +// reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('id', { + months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'), + weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'), + weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'LT.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] LT', + LLLL : 'dddd, D MMMM YYYY [pukul] LT' + }, + meridiemParse: /pagi|siang|sore|malam/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'siang') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'sore' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'siang'; + } else if (hours < 19) { + return 'sore'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Besok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kemarin pukul] LT', + lastWeek : 'dddd [lalu pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lalu', + s : 'beberapa detik', + m : 'semenit', + mm : '%d menit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : icelandic (is) +// author : Hinrik Örn Sigurðsson : https://github.com/hinrik + +(function (factory) { + factory(moment); +}(function (moment) { + function plural(n) { + if (n % 100 === 11) { + return true; + } else if (n % 10 === 1) { + return false; + } + return true; + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': + return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum'; + case 'm': + return withoutSuffix ? 'mínúta' : 'mínútu'; + case 'mm': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum'); + } else if (withoutSuffix) { + return result + 'mínúta'; + } + return result + 'mínútu'; + case 'hh': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum'); + } + return result + 'klukkustund'; + case 'd': + if (withoutSuffix) { + return 'dagur'; + } + return isFuture ? 'dag' : 'degi'; + case 'dd': + if (plural(number)) { + if (withoutSuffix) { + return result + 'dagar'; + } + return result + (isFuture ? 'daga' : 'dögum'); + } else if (withoutSuffix) { + return result + 'dagur'; + } + return result + (isFuture ? 'dag' : 'degi'); + case 'M': + if (withoutSuffix) { + return 'mánuður'; + } + return isFuture ? 'mánuð' : 'mánuði'; + case 'MM': + if (plural(number)) { + if (withoutSuffix) { + return result + 'mánuðir'; + } + return result + (isFuture ? 'mánuði' : 'mánuðum'); + } else if (withoutSuffix) { + return result + 'mánuður'; + } + return result + (isFuture ? 'mánuð' : 'mánuði'); + case 'y': + return withoutSuffix || isFuture ? 'ár' : 'ári'; + case 'yy': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'ár' : 'árum'); + } + return result + (withoutSuffix || isFuture ? 'ár' : 'ári'); + } + } + + return moment.defineLocale('is', { + months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'), + weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'), + weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'), + weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] LT', + LLLL : 'dddd, D. MMMM YYYY [kl.] LT' + }, + calendar : { + sameDay : '[í dag kl.] LT', + nextDay : '[á morgun kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[í gær kl.] LT', + lastWeek : '[síðasta] dddd [kl.] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'eftir %s', + past : 'fyrir %s síðan', + s : translate, + m : translate, + mm : translate, + h : 'klukkustund', + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : italian (it) +// author : Lorenzo : https://github.com/aliem +// author: Mattia Larentis: https://github.com/nostalgiaz + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('it', { + months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'), + monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'), + weekdays : 'Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato'.split('_'), + weekdaysShort : 'Dom_Lun_Mar_Mer_Gio_Ven_Sab'.split('_'), + weekdaysMin : 'D_L_Ma_Me_G_V_S'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Oggi alle] LT', + nextDay: '[Domani alle] LT', + nextWeek: 'dddd [alle] LT', + lastDay: '[Ieri alle] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[la scorsa] dddd [alle] LT'; + default: + return '[lo scorso] dddd [alle] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : function (s) { + return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s; + }, + past : '%s fa', + s : 'alcuni secondi', + m : 'un minuto', + mm : '%d minuti', + h : 'un\'ora', + hh : '%d ore', + d : 'un giorno', + dd : '%d giorni', + M : 'un mese', + MM : '%d mesi', + y : 'un anno', + yy : '%d anni' + }, + ordinalParse : /\d{1,2}º/, + ordinal: '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : japanese (ja) +// author : LI Long : https://github.com/baryon + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('ja', { + months : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '日曜日_月曜日_ç«æ›œæ—¥_水曜日_木曜日_金曜日_土曜日'.split('_'), + weekdaysShort : 'æ—¥_月_ç«_æ°´_木_金_土'.split('_'), + weekdaysMin : 'æ—¥_月_ç«_æ°´_木_金_土'.split('_'), + longDateFormat : { + LT : 'Ah時m分', + LTS : 'LTs秒', + L : 'YYYY/MM/DD', + LL : 'YYYYå¹´M月Dæ—¥', + LLL : 'YYYYå¹´M月Dæ—¥LT', + LLLL : 'YYYYå¹´M月Dæ—¥LT dddd' + }, + meridiemParse: /åˆå‰|åˆå¾Œ/i, + isPM : function (input) { + return input === 'åˆå¾Œ'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'åˆå‰'; + } else { + return 'åˆå¾Œ'; + } + }, + calendar : { + sameDay : '[今日] LT', + nextDay : '[明日] LT', + nextWeek : '[æ¥é€±]dddd LT', + lastDay : '[昨日] LT', + lastWeek : '[å‰é€±]dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s後', + past : '%så‰', + s : '数秒', + m : '1分', + mm : '%d分', + h : '1時間', + hh : '%d時間', + d : '1æ—¥', + dd : '%dæ—¥', + M : '1ヶ月', + MM : '%dヶ月', + y : '1å¹´', + yy : '%då¹´' + } + }); +})); +// moment.js locale configuration +// locale : Georgian (ka) +// author : Irakli Janiashvili : https://github.com/irakli-janiashvili + +(function (factory) { + factory(moment); +}(function (moment) { + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'იáƒáƒœáƒ•áƒáƒ áƒ˜_თებერვáƒáƒšáƒ˜_მáƒáƒ áƒ¢áƒ˜_áƒáƒžáƒ áƒ˜áƒšáƒ˜_მáƒáƒ˜áƒ¡áƒ˜_ივნისი_ივლისი_áƒáƒ’ვისტáƒ_სექტემბერი_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი_ნáƒáƒ”მბერი_დეკემბერი'.split('_'), + 'accusative': 'იáƒáƒœáƒ•áƒáƒ áƒ¡_თებერვáƒáƒšáƒ¡_მáƒáƒ áƒ¢áƒ¡_áƒáƒžáƒ áƒ˜áƒšáƒ˜áƒ¡_მáƒáƒ˜áƒ¡áƒ¡_ივნისს_ივლისს_áƒáƒ’ვისტს_სექტემბერს_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერს_ნáƒáƒ”მბერს_დეკემბერს'.split('_') + }, + + nounCase = (/D[oD] *MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'კვირáƒ_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ი_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი_ხუთშáƒáƒ‘áƒáƒ—ი_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი_შáƒáƒ‘áƒáƒ—ი'.split('_'), + 'accusative': 'კვირáƒáƒ¡_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ს_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ს_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ს_ხუთშáƒáƒ‘áƒáƒ—ს_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვს_შáƒáƒ‘áƒáƒ—ს'.split('_') + }, + + nounCase = (/(წინáƒ|შემდეგ)/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.defineLocale('ka', { + months : monthsCaseReplace, + monthsShort : 'იáƒáƒœ_თებ_მáƒáƒ _áƒáƒžáƒ _მáƒáƒ˜_ივნ_ივლ_áƒáƒ’ვ_სექ_áƒáƒ¥áƒ¢_ნáƒáƒ”_დეკ'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'კვი_áƒáƒ áƒ¨_სáƒáƒ›_áƒáƒ—ხ_ხუთ_პáƒáƒ _შáƒáƒ‘'.split('_'), + weekdaysMin : 'კვ_áƒáƒ _სáƒ_áƒáƒ—_ხუ_პáƒ_შáƒ'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[დღეს] LT[-ზე]', + nextDay : '[ხვáƒáƒš] LT[-ზე]', + lastDay : '[გუშინ] LT[-ზე]', + nextWeek : '[შემდეგ] dddd LT[-ზე]', + lastWeek : '[წინáƒ] dddd LT-ზე', + sameElse : 'L' + }, + relativeTime : { + future : function (s) { + return (/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|წელი)/).test(s) ? + s.replace(/ი$/, 'ში') : + s + 'ში'; + }, + past : function (s) { + if ((/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|დღე|თვე)/).test(s)) { + return s.replace(/(ი|ე)$/, 'ის წინ'); + } + if ((/წელი/).test(s)) { + return s.replace(/წელი$/, 'წლის წინ'); + } + }, + s : 'რáƒáƒ›áƒ“ენიმე წáƒáƒ›áƒ˜', + m : 'წუთი', + mm : '%d წუთი', + h : 'სáƒáƒáƒ—ი', + hh : '%d სáƒáƒáƒ—ი', + d : 'დღე', + dd : '%d დღე', + M : 'თვე', + MM : '%d თვე', + y : 'წელი', + yy : '%d წელი' + }, + ordinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/, + ordinal : function (number) { + if (number === 0) { + return number; + } + + if (number === 1) { + return number + '-ლი'; + } + + if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) { + return 'მე-' + number; + } + + return number + '-ე'; + }, + week : { + dow : 1, + doy : 7 + } + }); +})); +// moment.js locale configuration +// locale : khmer (km) +// author : Kruy Vanna : https://github.com/kruyvanna + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('km', { + months: 'មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ'.split('_'), + monthsShort: 'មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ'.split('_'), + weekdays: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), + weekdaysShort: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), + weekdaysMin: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS : 'LT:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd, D MMMM YYYY LT' + }, + calendar: { + sameDay: '[ážáŸ’ងៃនៈ ម៉ោង] LT', + nextDay: '[ស្អែក ម៉ោង] LT', + nextWeek: 'dddd [ម៉ោង] LT', + lastDay: '[ម្សិលមិញ ម៉ោង] LT', + lastWeek: 'dddd [សប្ážáž¶áž áŸáž˜áž»áž“] [ម៉ោង] LT', + sameElse: 'L' + }, + relativeTime: { + future: '%sទៀáž', + past: '%sមុន', + s: 'ប៉ុន្មានវិនាទី', + m: 'មួយនាទី', + mm: '%d នាទី', + h: 'មួយម៉ោង', + hh: '%d ម៉ោង', + d: 'មួយážáŸ’ងៃ', + dd: '%d ážáŸ’ងៃ', + M: 'មួយážáŸ‚', + MM: '%d ážáŸ‚', + y: 'មួយឆ្នាំ', + yy: '%d ឆ្នាំ' + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : korean (ko) +// +// authors +// +// - Kyungwook, Park : https://github.com/kyungw00k +// - Jeeeyul Lee +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('ko', { + months : '1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”'.split('_'), + monthsShort : '1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”'.split('_'), + weekdays : 'ì¼ìš”ì¼_월요ì¼_화요ì¼_수요ì¼_목요ì¼_금요ì¼_토요ì¼'.split('_'), + weekdaysShort : 'ì¼_ì›”_í™”_수_목_금_토'.split('_'), + weekdaysMin : 'ì¼_ì›”_í™”_수_목_금_토'.split('_'), + longDateFormat : { + LT : 'A hì‹œ m분', + LTS : 'A hì‹œ m분 sì´ˆ', + L : 'YYYY.MM.DD', + LL : 'YYYYë…„ MMMM Dì¼', + LLL : 'YYYYë…„ MMMM Dì¼ LT', + LLLL : 'YYYYë…„ MMMM Dì¼ dddd LT' + }, + calendar : { + sameDay : '오늘 LT', + nextDay : 'ë‚´ì¼ LT', + nextWeek : 'dddd LT', + lastDay : 'ì–´ì œ LT', + lastWeek : '지난주 dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s 후', + past : '%s ì „', + s : '몇초', + ss : '%dì´ˆ', + m : 'ì¼ë¶„', + mm : '%d분', + h : '한시간', + hh : '%d시간', + d : '하루', + dd : '%dì¼', + M : '한달', + MM : '%d달', + y : 'ì¼ë…„', + yy : '%dë…„' + }, + ordinalParse : /\d{1,2}ì¼/, + ordinal : '%dì¼', + meridiemParse : /오전|오후/, + isPM : function (token) { + return token === '오후'; + }, + meridiem : function (hour, minute, isUpper) { + return hour < 12 ? '오전' : '오후'; + } + }); +})); +// moment.js locale configuration +// locale : Luxembourgish (lb) +// author : mweimerskirch : https://github.com/mweimerskirch, David Raison : https://github.com/kwisatz + +// Note: Luxembourgish has a very particular phonological rule ('Eifeler Regel') that causes the +// deletion of the final 'n' in certain contexts. That's what the 'eifelerRegelAppliesToWeekday' +// and 'eifelerRegelAppliesToNumber' methods are meant for + +(function (factory) { + factory(moment); +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eng Minutt', 'enger Minutt'], + 'h': ['eng Stonn', 'enger Stonn'], + 'd': ['een Dag', 'engem Dag'], + 'M': ['ee Mount', 'engem Mount'], + 'y': ['ee Joer', 'engem Joer'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + function processFutureTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'a ' + string; + } + return 'an ' + string; + } + + function processPastTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'viru ' + string; + } + return 'virun ' + string; + } + + /** + * Returns true if the word before the given number loses the '-n' ending. + * e.g. 'an 10 Deeg' but 'a 5 Deeg' + * + * @param number {integer} + * @returns {boolean} + */ + function eifelerRegelAppliesToNumber(number) { + number = parseInt(number, 10); + if (isNaN(number)) { + return false; + } + if (number < 0) { + // Negative Number --> always true + return true; + } else if (number < 10) { + // Only 1 digit + if (4 <= number && number <= 7) { + return true; + } + return false; + } else if (number < 100) { + // 2 digits + var lastDigit = number % 10, firstDigit = number / 10; + if (lastDigit === 0) { + return eifelerRegelAppliesToNumber(firstDigit); + } + return eifelerRegelAppliesToNumber(lastDigit); + } else if (number < 10000) { + // 3 or 4 digits --> recursively check first digit + while (number >= 10) { + number = number / 10; + } + return eifelerRegelAppliesToNumber(number); + } else { + // Anything larger than 4 digits: recursively check first n-3 digits + number = number / 1000; + return eifelerRegelAppliesToNumber(number); + } + } + + return moment.defineLocale('lb', { + months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'), + weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'), + weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'), + longDateFormat: { + LT: 'H:mm [Auer]', + LTS: 'H:mm:ss [Auer]', + L: 'DD.MM.YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY LT', + LLLL: 'dddd, D. MMMM YYYY LT' + }, + calendar: { + sameDay: '[Haut um] LT', + sameElse: 'L', + nextDay: '[Muer um] LT', + nextWeek: 'dddd [um] LT', + lastDay: '[Gëschter um] LT', + lastWeek: function () { + // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule + switch (this.day()) { + case 2: + case 4: + return '[Leschten] dddd [um] LT'; + default: + return '[Leschte] dddd [um] LT'; + } + } + }, + relativeTime : { + future : processFutureTime, + past : processPastTime, + s : 'e puer Sekonnen', + m : processRelativeTime, + mm : '%d Minutten', + h : processRelativeTime, + hh : '%d Stonnen', + d : processRelativeTime, + dd : '%d Deeg', + M : processRelativeTime, + MM : '%d Méint', + y : processRelativeTime, + yy : '%d Joer' + }, + ordinalParse: /\d{1,2}\./, + ordinal: '%d.', + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Lithuanian (lt) +// author : Mindaugas MozÅ«ras : https://github.com/mmozuras + +(function (factory) { + factory(moment); +}(function (moment) { + var units = { + 'm' : 'minutÄ—_minutÄ—s_minutÄ™', + 'mm': 'minutÄ—s_minuÄių_minutes', + 'h' : 'valanda_valandos_valandÄ…', + 'hh': 'valandos_valandų_valandas', + 'd' : 'diena_dienos_dienÄ…', + 'dd': 'dienos_dienų_dienas', + 'M' : 'mÄ—nuo_mÄ—nesio_mÄ—nesį', + 'MM': 'mÄ—nesiai_mÄ—nesių_mÄ—nesius', + 'y' : 'metai_metų_metus', + 'yy': 'metai_metų_metus' + }, + weekDays = 'sekmadienis_pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis'.split('_'); + + function translateSeconds(number, withoutSuffix, key, isFuture) { + if (withoutSuffix) { + return 'kelios sekundÄ—s'; + } else { + return isFuture ? 'kelių sekundžių' : 'kelias sekundes'; + } + } + + function translateSingular(number, withoutSuffix, key, isFuture) { + return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]); + } + + function special(number) { + return number % 10 === 0 || (number > 10 && number < 20); + } + + function forms(key) { + return units[key].split('_'); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + if (number === 1) { + return result + translateSingular(number, withoutSuffix, key[0], isFuture); + } else if (withoutSuffix) { + return result + (special(number) ? forms(key)[1] : forms(key)[0]); + } else { + if (isFuture) { + return result + forms(key)[1]; + } else { + return result + (special(number) ? forms(key)[1] : forms(key)[2]); + } + } + } + + function relativeWeekDay(moment, format) { + var nominative = format.indexOf('dddd HH:mm') === -1, + weekDay = weekDays[moment.day()]; + + return nominative ? weekDay : weekDay.substring(0, weekDay.length - 2) + 'į'; + } + + return moment.defineLocale('lt', { + months : 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio'.split('_'), + monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'), + weekdays : relativeWeekDay, + weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Å eÅ¡'.split('_'), + weekdaysMin : 'S_P_A_T_K_Pn_Å '.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY [m.] MMMM D [d.]', + LLL : 'YYYY [m.] MMMM D [d.], LT [val.]', + LLLL : 'YYYY [m.] MMMM D [d.], dddd, LT [val.]', + l : 'YYYY-MM-DD', + ll : 'YYYY [m.] MMMM D [d.]', + lll : 'YYYY [m.] MMMM D [d.], LT [val.]', + llll : 'YYYY [m.] MMMM D [d.], ddd, LT [val.]' + }, + calendar : { + sameDay : '[Å iandien] LT', + nextDay : '[Rytoj] LT', + nextWeek : 'dddd LT', + lastDay : '[Vakar] LT', + lastWeek : '[PraÄ—jusį] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : 'po %s', + past : 'prieÅ¡ %s', + s : translateSeconds, + m : translateSingular, + mm : translate, + h : translateSingular, + hh : translate, + d : translateSingular, + dd : translate, + M : translateSingular, + MM : translate, + y : translateSingular, + yy : translate + }, + ordinalParse: /\d{1,2}-oji/, + ordinal : function (number) { + return number + '-oji'; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : latvian (lv) +// author : Kristaps Karlsons : https://github.com/skakri + +(function (factory) { + factory(moment); +}(function (moment) { + var units = { + 'mm': 'minÅ«ti_minÅ«tes_minÅ«te_minÅ«tes', + 'hh': 'stundu_stundas_stunda_stundas', + 'dd': 'dienu_dienas_diena_dienas', + 'MM': 'mÄ“nesi_mÄ“neÅ¡us_mÄ“nesis_mÄ“neÅ¡i', + 'yy': 'gadu_gadus_gads_gadi' + }; + + function format(word, number, withoutSuffix) { + var forms = word.split('_'); + if (withoutSuffix) { + return number % 10 === 1 && number !== 11 ? forms[2] : forms[3]; + } else { + return number % 10 === 1 && number !== 11 ? forms[0] : forms[1]; + } + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + return number + ' ' + format(units[key], number, withoutSuffix); + } + + return moment.defineLocale('lv', { + months : 'janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jÅ«n_jÅ«l_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'svÄ“tdiena_pirmdiena_otrdiena_treÅ¡diena_ceturtdiena_piektdiena_sestdiena'.split('_'), + weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'), + weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'YYYY. [gada] D. MMMM', + LLL : 'YYYY. [gada] D. MMMM, LT', + LLLL : 'YYYY. [gada] D. MMMM, dddd, LT' + }, + calendar : { + sameDay : '[Å odien pulksten] LT', + nextDay : '[RÄ«t pulksten] LT', + nextWeek : 'dddd [pulksten] LT', + lastDay : '[Vakar pulksten] LT', + lastWeek : '[PagÄjuÅ¡Ä] dddd [pulksten] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s vÄ“lÄk', + past : '%s agrÄk', + s : 'dažas sekundes', + m : 'minÅ«ti', + mm : relativeTimeWithPlural, + h : 'stundu', + hh : relativeTimeWithPlural, + d : 'dienu', + dd : relativeTimeWithPlural, + M : 'mÄ“nesi', + MM : relativeTimeWithPlural, + y : 'gadu', + yy : relativeTimeWithPlural + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : macedonian (mk) +// author : Borislav Mickov : https://github.com/B0k0 + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('mk', { + months : 'јануари_февруари_март_април_мај_јуни_јули_авгуÑÑ‚_Ñептември_октомври_ноември_декември'.split('_'), + monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_Ñеп_окт_ное_дек'.split('_'), + weekdays : 'недела_понеделник_вторник_Ñреда_четврток_петок_Ñабота'.split('_'), + weekdaysShort : 'нед_пон_вто_Ñре_чет_пет_Ñаб'.split('_'), + weekdaysMin : 'нe_пo_вт_ÑÑ€_че_пе_Ña'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'D.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Ð”ÐµÐ½ÐµÑ Ð²Ð¾] LT', + nextDay : '[Утре во] LT', + nextWeek : 'dddd [во] LT', + lastDay : '[Вчера во] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[Во изминатата] dddd [во] LT'; + case 1: + case 2: + case 4: + case 5: + return '[Во изминатиот] dddd [во] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'поÑле %s', + past : 'пред %s', + s : 'неколку Ñекунди', + m : 'минута', + mm : '%d минути', + h : 'чаÑ', + hh : '%d чаÑа', + d : 'ден', + dd : '%d дена', + M : 'меÑец', + MM : '%d меÑеци', + y : 'година', + yy : '%d години' + }, + ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : malayalam (ml) +// author : Floyd Pink : https://github.com/floydpink + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('ml', { + months : 'ജനàµà´µà´°à´¿_ഫെബàµà´°àµà´µà´°à´¿_മാർചàµà´šàµ_à´à´ªàµà´°à´¿àµ½_മേയàµ_ജൂൺ_ജൂലൈ_à´“à´—à´¸àµà´±àµà´±àµ_സെപàµà´±àµà´±à´‚ബർ_à´’à´•àµà´Ÿàµ‹à´¬àµ¼_നവംബർ_ഡിസംബർ'.split('_'), + monthsShort : 'ജനàµ._ഫെബàµà´°àµ._മാർ._à´à´ªàµà´°à´¿._മേയàµ_ജൂൺ_ജൂലൈ._à´“à´—._സെപàµà´±àµà´±._à´’à´•àµà´Ÿàµ‹._നവം._ഡിസം.'.split('_'), + weekdays : 'ഞായറാഴàµà´š_തിങàµà´•à´³à´¾à´´àµà´š_ചൊവàµà´µà´¾à´´àµà´š_à´¬àµà´§à´¨à´¾à´´àµà´š_à´µàµà´¯à´¾à´´à´¾à´´àµà´š_വെളàµà´³à´¿à´¯à´¾à´´àµà´š_ശനിയാഴàµà´š'.split('_'), + weekdaysShort : 'ഞായർ_തിങàµà´•àµ¾_ചൊവàµà´µ_à´¬àµà´§àµ»_à´µàµà´¯à´¾à´´à´‚_വെളàµà´³à´¿_ശനി'.split('_'), + weekdaysMin : 'à´žà´¾_തി_ചൊ_à´¬àµ_à´µàµà´¯à´¾_വെ_à´¶'.split('_'), + longDateFormat : { + LT : 'A h:mm -à´¨àµ', + LTS : 'A h:mm:ss -à´¨àµ', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[ഇനàµà´¨àµ] LT', + nextDay : '[നാളെ] LT', + nextWeek : 'dddd, LT', + lastDay : '[ഇനàµà´¨à´²àµ†] LT', + lastWeek : '[à´•à´´à´¿à´žàµà´ž] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s à´•à´´à´¿à´žàµà´žàµ', + past : '%s à´®àµàµ»à´ªàµ', + s : 'അൽപ നിമിഷങàµà´™àµ¾', + m : 'ഒരൠമിനിറàµà´±àµ', + mm : '%d മിനിറàµà´±àµ', + h : 'ഒരൠമണികàµà´•àµ‚ർ', + hh : '%d മണികàµà´•àµ‚ർ', + d : 'ഒരൠദിവസം', + dd : '%d ദിവസം', + M : 'ഒരൠമാസം', + MM : '%d മാസം', + y : 'ഒരൠവർഷം', + yy : '%d വർഷം' + }, + meridiemParse: /രാതàµà´°à´¿|രാവിലെ|ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿/i, + isPM : function (input) { + return /^(ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'രാതàµà´°à´¿'; + } else if (hour < 12) { + return 'രാവിലെ'; + } else if (hour < 17) { + return 'ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ'; + } else if (hour < 20) { + return 'വൈകàµà´¨àµà´¨àµ‡à´°à´‚'; + } else { + return 'രാതàµà´°à´¿'; + } + } + }); +})); +// moment.js locale configuration +// locale : Marathi (mr) +// author : Harshad Kale : https://github.com/kalehv + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.defineLocale('mr', { + months : 'जानेवारी_फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€_मारà¥à¤š_à¤à¤ªà¥à¤°à¤¿à¤²_मे_जून_जà¥à¤²à¥ˆ_ऑगसà¥à¤Ÿ_सपà¥à¤Ÿà¥‡à¤‚बर_ऑकà¥à¤Ÿà¥‹à¤¬à¤°_नोवà¥à¤¹à¥‡à¤‚बर_डिसेंबर'.split('_'), + monthsShort: 'जाने._फेबà¥à¤°à¥._मारà¥à¤š._à¤à¤ªà¥à¤°à¤¿._मे._जून._जà¥à¤²à¥ˆ._ऑग._सपà¥à¤Ÿà¥‡à¤‚._ऑकà¥à¤Ÿà¥‹._नोवà¥à¤¹à¥‡à¤‚._डिसें.'.split('_'), + weekdays : 'रविवार_सोमवार_मंगळवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split('_'), + weekdaysShort : 'रवि_सोम_मंगळ_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split('_'), + weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split('_'), + longDateFormat : { + LT : 'A h:mm वाजता', + LTS : 'A h:mm:ss वाजता', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[उदà¥à¤¯à¤¾] LT', + nextWeek : 'dddd, LT', + lastDay : '[काल] LT', + lastWeek: '[मागील] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s नंतर', + past : '%s पूरà¥à¤µà¥€', + s : 'सेकंद', + m: 'à¤à¤• मिनिट', + mm: '%d मिनिटे', + h : 'à¤à¤• तास', + hh : '%d तास', + d : 'à¤à¤• दिवस', + dd : '%d दिवस', + M : 'à¤à¤• महिना', + MM : '%d महिने', + y : 'à¤à¤• वरà¥à¤·', + yy : '%d वरà¥à¤·à¥‡' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /रातà¥à¤°à¥€|सकाळी|दà¥à¤ªà¤¾à¤°à¥€|सायंकाळी/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'रातà¥à¤°à¥€') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'सकाळी') { + return hour; + } else if (meridiem === 'दà¥à¤ªà¤¾à¤°à¥€') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'सायंकाळी') { + return hour + 12; + } + }, + meridiem: function (hour, minute, isLower) + { + if (hour < 4) { + return 'रातà¥à¤°à¥€'; + } else if (hour < 10) { + return 'सकाळी'; + } else if (hour < 17) { + return 'दà¥à¤ªà¤¾à¤°à¥€'; + } else if (hour < 20) { + return 'सायंकाळी'; + } else { + return 'रातà¥à¤°à¥€'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Bahasa Malaysia (ms-MY) +// author : Weldan Jamili : https://github.com/weldan + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('ms-my', { + months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), + monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), + weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), + weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), + weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'LT.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] LT', + LLLL : 'dddd, D MMMM YYYY [pukul] LT' + }, + meridiemParse: /pagi|tengahari|petang|malam/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'tengahari') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'petang' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'tengahari'; + } else if (hours < 19) { + return 'petang'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Esok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kelmarin pukul] LT', + lastWeek : 'dddd [lepas pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dalam %s', + past : '%s yang lepas', + s : 'beberapa saat', + m : 'seminit', + mm : '%d minit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Burmese (my) +// author : Squar team, mysquar.com + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': 'á', + '2': 'á‚', + '3': 'áƒ', + '4': 'á„', + '5': 'á…', + '6': 'á†', + '7': 'á‡', + '8': 'áˆ', + '9': 'á‰', + '0': 'á€' + }, numberMap = { + 'á': '1', + 'á‚': '2', + 'áƒ': '3', + 'á„': '4', + 'á…': '5', + 'á†': '6', + 'á‡': '7', + 'áˆ': '8', + 'á‰': '9', + 'á€': '0' + }; + return moment.defineLocale('my', { + months: 'ဇန်နá€á€«á€›á€®_ဖေဖော်á€á€«á€›á€®_မá€á€º_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုá€á€º_စက်á€á€„်ဘာ_အောက်á€á€­á€¯á€˜á€¬_နိုá€á€„်ဘာ_ဒီဇင်ဘာ'.split('_'), + monthsShort: 'ဇန်_ဖေ_မá€á€º_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'), + weekdays: 'á€á€”င်္ဂနွေ_á€á€”င်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပá€á€±á€¸_သောကြာ_စနေ'.split('_'), + weekdaysShort: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), + weekdaysMin: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY LT', + LLLL: 'dddd D MMMM YYYY LT' + }, + calendar: { + sameDay: '[ယနေ.] LT [မှာ]', + nextDay: '[မနက်ဖြန်] LT [မှာ]', + nextWeek: 'dddd LT [မှာ]', + lastDay: '[မနေ.က] LT [မှာ]', + lastWeek: '[ပြီးá€á€²á€·á€žá€±á€¬] dddd LT [မှာ]', + sameElse: 'L' + }, + relativeTime: { + future: 'လာမည့် %s မှာ', + past: 'လွန်á€á€²á€·á€žá€±á€¬ %s က', + s: 'စက္ကန်.အနည်းငယ်', + m: 'á€á€…်မိနစ်', + mm: '%d မိနစ်', + h: 'á€á€…်နာရီ', + hh: '%d နာရီ', + d: 'á€á€…်ရက်', + dd: '%d ရက်', + M: 'á€á€…်လ', + MM: '%d လ', + y: 'á€á€…်နှစ်', + yy: '%d နှစ်' + }, + preparse: function (string) { + return string.replace(/[áá‚áƒá„á…á†á‡áˆá‰á€]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : norwegian bokmÃ¥l (nb) +// authors : Espen Hovlandsdal : https://github.com/rexxars +// Sigurd Gartmann : https://github.com/sigurdga + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('nb', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), + weekdaysShort : 'søn_man_tirs_ons_tors_fre_lør'.split('_'), + weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'H.mm', + LTS : 'LT.ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] LT', + LLLL : 'dddd D. MMMM YYYY [kl.] LT' + }, + calendar : { + sameDay: '[i dag kl.] LT', + nextDay: '[i morgen kl.] LT', + nextWeek: 'dddd [kl.] LT', + lastDay: '[i gÃ¥r kl.] LT', + lastWeek: '[forrige] dddd [kl.] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'for %s siden', + s : 'noen sekunder', + m : 'ett minutt', + mm : '%d minutter', + h : 'en time', + hh : '%d timer', + d : 'en dag', + dd : '%d dager', + M : 'en mÃ¥ned', + MM : '%d mÃ¥neder', + y : 'ett Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : nepali/nepalese +// author : suvash : https://github.com/suvash + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.defineLocale('ne', { + months : 'जनवरी_फेबà¥à¤°à¥à¤µà¤°à¥€_मारà¥à¤š_अपà¥à¤°à¤¿à¤²_मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ_अगषà¥à¤Ÿ_सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°_अकà¥à¤Ÿà¥‹à¤¬à¤°_नोभेमà¥à¤¬à¤°_डिसेमà¥à¤¬à¤°'.split('_'), + monthsShort : 'जन._फेबà¥à¤°à¥._मारà¥à¤š_अपà¥à¤°à¤¿._मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ._अग._सेपà¥à¤Ÿ._अकà¥à¤Ÿà¥‹._नोभे._डिसे.'.split('_'), + weekdays : 'आइतबार_सोमबार_मङà¥à¤—लबार_बà¥à¤§à¤¬à¤¾à¤°_बिहिबार_शà¥à¤•à¥à¤°à¤¬à¤¾à¤°_शनिबार'.split('_'), + weekdaysShort : 'आइत._सोम._मङà¥à¤—ल._बà¥à¤§._बिहि._शà¥à¤•à¥à¤°._शनि.'.split('_'), + weekdaysMin : 'आइ._सो._मङà¥_बà¥._बि._शà¥._श.'.split('_'), + longDateFormat : { + LT : 'Aको h:mm बजे', + LTS : 'Aको h:mm:ss बजे', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /राती|बिहान|दिउà¤à¤¸à¥‹|बेलà¥à¤•à¤¾|साà¤à¤|राती/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'राती') { + return hour < 3 ? hour : hour + 12; + } else if (meridiem === 'बिहान') { + return hour; + } else if (meridiem === 'दिउà¤à¤¸à¥‹') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'बेलà¥à¤•à¤¾' || meridiem === 'साà¤à¤') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 3) { + return 'राती'; + } else if (hour < 10) { + return 'बिहान'; + } else if (hour < 15) { + return 'दिउà¤à¤¸à¥‹'; + } else if (hour < 18) { + return 'बेलà¥à¤•à¤¾'; + } else if (hour < 20) { + return 'साà¤à¤'; + } else { + return 'राती'; + } + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[भोली] LT', + nextWeek : '[आउà¤à¤¦à¥‹] dddd[,] LT', + lastDay : '[हिजो] LT', + lastWeek : '[गà¤à¤•à¥‹] dddd[,] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%sमा', + past : '%s अगाडी', + s : 'केही समय', + m : 'à¤à¤• मिनेट', + mm : '%d मिनेट', + h : 'à¤à¤• घणà¥à¤Ÿà¤¾', + hh : '%d घणà¥à¤Ÿà¤¾', + d : 'à¤à¤• दिन', + dd : '%d दिन', + M : 'à¤à¤• महिना', + MM : '%d महिना', + y : 'à¤à¤• बरà¥à¤·', + yy : '%d बरà¥à¤·' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : dutch (nl) +// author : Joris Röling : https://github.com/jjupiter + +(function (factory) { + factory(moment); +}(function (moment) { + var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); + + return moment.defineLocale('nl', { + months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), + weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), + weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[vandaag om] LT', + nextDay: '[morgen om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[gisteren om] LT', + lastWeek: '[afgelopen] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'over %s', + past : '%s geleden', + s : 'een paar seconden', + m : 'één minuut', + mm : '%d minuten', + h : 'één uur', + hh : '%d uur', + d : 'één dag', + dd : '%d dagen', + M : 'één maand', + MM : '%d maanden', + y : 'één jaar', + yy : '%d jaar' + }, + ordinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : norwegian nynorsk (nn) +// author : https://github.com/mechuwind + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('nn', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sundag_mÃ¥ndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'), + weekdaysShort : 'sun_mÃ¥n_tys_ons_tor_fre_lau'.split('_'), + weekdaysMin : 'su_mÃ¥_ty_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[I dag klokka] LT', + nextDay: '[I morgon klokka] LT', + nextWeek: 'dddd [klokka] LT', + lastDay: '[I gÃ¥r klokka] LT', + lastWeek: '[FøregÃ¥ande] dddd [klokka] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'for %s sidan', + s : 'nokre sekund', + m : 'eit minutt', + mm : '%d minutt', + h : 'ein time', + hh : '%d timar', + d : 'ein dag', + dd : '%d dagar', + M : 'ein mÃ¥nad', + MM : '%d mÃ¥nader', + y : 'eit Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : polish (pl) +// author : Rafal Hirsz : https://github.com/evoL + +(function (factory) { + factory(moment); +}(function (moment) { + var monthsNominative = 'styczeÅ„_luty_marzec_kwiecieÅ„_maj_czerwiec_lipiec_sierpieÅ„_wrzesieÅ„_październik_listopad_grudzieÅ„'.split('_'), + monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrzeÅ›nia_października_listopada_grudnia'.split('_'); + + function plural(n) { + return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1); + } + + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'minuta' : 'minutÄ™'; + case 'mm': + return result + (plural(number) ? 'minuty' : 'minut'); + case 'h': + return withoutSuffix ? 'godzina' : 'godzinÄ™'; + case 'hh': + return result + (plural(number) ? 'godziny' : 'godzin'); + case 'MM': + return result + (plural(number) ? 'miesiÄ…ce' : 'miesiÄ™cy'); + case 'yy': + return result + (plural(number) ? 'lata' : 'lat'); + } + } + + return moment.defineLocale('pl', { + months : function (momentToFormat, format) { + if (/D MMMM/.test(format)) { + return monthsSubjective[momentToFormat.month()]; + } else { + return monthsNominative[momentToFormat.month()]; + } + }, + monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'), + weekdays : 'niedziela_poniedziaÅ‚ek_wtorek_Å›roda_czwartek_piÄ…tek_sobota'.split('_'), + weekdaysShort : 'nie_pon_wt_Å›r_czw_pt_sb'.split('_'), + weekdaysMin : 'N_Pn_Wt_Åšr_Cz_Pt_So'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay: '[DziÅ› o] LT', + nextDay: '[Jutro o] LT', + nextWeek: '[W] dddd [o] LT', + lastDay: '[Wczoraj o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[W zeszÅ‚Ä… niedzielÄ™ o] LT'; + case 3: + return '[W zeszÅ‚Ä… Å›rodÄ™ o] LT'; + case 6: + return '[W zeszÅ‚Ä… sobotÄ™ o] LT'; + default: + return '[W zeszÅ‚y] dddd [o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : '%s temu', + s : 'kilka sekund', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : '1 dzieÅ„', + dd : '%d dni', + M : 'miesiÄ…c', + MM : translate, + y : 'rok', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : brazilian portuguese (pt-br) +// author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('pt-br', { + months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), + monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), + weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'), + weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'), + weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY [às] LT', + LLLL : 'dddd, D [de] MMMM [de] YYYY [às] LT' + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : 'em %s', + past : '%s atrás', + s : 'segundos', + m : 'um minuto', + mm : '%d minutos', + h : 'uma hora', + hh : '%d horas', + d : 'um dia', + dd : '%d dias', + M : 'um mês', + MM : '%d meses', + y : 'um ano', + yy : '%d anos' + }, + ordinalParse: /\d{1,2}º/, + ordinal : '%dº' + }); +})); +// moment.js locale configuration +// locale : portuguese (pt) +// author : Jefferson : https://github.com/jalex79 + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('pt', { + months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), + monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), + weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'), + weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'), + weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY LT', + LLLL : 'dddd, D [de] MMMM [de] YYYY LT' + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : 'em %s', + past : 'há %s', + s : 'segundos', + m : 'um minuto', + mm : '%d minutos', + h : 'uma hora', + hh : '%d horas', + d : 'um dia', + dd : '%d dias', + M : 'um mês', + MM : '%d meses', + y : 'um ano', + yy : '%d anos' + }, + ordinalParse: /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : romanian (ro) +// author : Vlad Gurdiga : https://github.com/gurdiga +// author : Valentin Agachi : https://github.com/avaly + +(function (factory) { + factory(moment); +}(function (moment) { + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': 'minute', + 'hh': 'ore', + 'dd': 'zile', + 'MM': 'luni', + 'yy': 'ani' + }, + separator = ' '; + if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) { + separator = ' de '; + } + + return number + separator + format[key]; + } + + return moment.defineLocale('ro', { + months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'), + monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'), + weekdays : 'duminică_luni_marÈ›i_miercuri_joi_vineri_sâmbătă'.split('_'), + weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'), + weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY H:mm', + LLLL : 'dddd, D MMMM YYYY H:mm' + }, + calendar : { + sameDay: '[azi la] LT', + nextDay: '[mâine la] LT', + nextWeek: 'dddd [la] LT', + lastDay: '[ieri la] LT', + lastWeek: '[fosta] dddd [la] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'peste %s', + past : '%s în urmă', + s : 'câteva secunde', + m : 'un minut', + mm : relativeTimeWithPlural, + h : 'o oră', + hh : relativeTimeWithPlural, + d : 'o zi', + dd : relativeTimeWithPlural, + M : 'o lună', + MM : relativeTimeWithPlural, + y : 'un an', + yy : relativeTimeWithPlural + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : russian (ru) +// author : Viktorminator : https://github.com/Viktorminator +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + factory(moment); +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут', + 'hh': 'чаÑ_чаÑа_чаÑов', + 'dd': 'день_днÑ_дней', + 'MM': 'меÑÑц_меÑÑца_меÑÑцев', + 'yy': 'год_года_лет' + }; + if (key === 'm') { + return withoutSuffix ? 'минута' : 'минуту'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь'.split('_'), + 'accusative': 'ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function monthsShortCaseReplace(m, format) { + var monthsShort = { + 'nominative': 'Ñнв_фев_март_апр_май_июнь_июль_авг_Ñен_окт_ноÑ_дек'.split('_'), + 'accusative': 'Ñнв_фев_мар_апр_маÑ_июнÑ_июлÑ_авг_Ñен_окт_ноÑ_дек'.split('_') + }, + + nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return monthsShort[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота'.split('_'), + 'accusative': 'воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу'.split('_') + }, + + nounCase = (/\[ ?[Вв] ?(?:прошлую|Ñледующую|Ñту)? ?\] ?dddd/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.defineLocale('ru', { + months : monthsCaseReplace, + monthsShort : monthsShortCaseReplace, + weekdays : weekdaysCaseReplace, + weekdaysShort : 'вÑ_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + weekdaysMin : 'вÑ_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + monthsParse : [/^Ñнв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[й|Ñ]/i, /^июн/i, /^июл/i, /^авг/i, /^Ñен/i, /^окт/i, /^ноÑ/i, /^дек/i], + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY г.', + LLL : 'D MMMM YYYY г., LT', + LLLL : 'dddd, D MMMM YYYY г., LT' + }, + calendar : { + sameDay: '[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT', + nextDay: '[Завтра в] LT', + lastDay: '[Вчера в] LT', + nextWeek: function () { + return this.day() === 2 ? '[Во] dddd [в] LT' : '[Ð’] dddd [в] LT'; + }, + lastWeek: function (now) { + if (now.week() !== this.week()) { + switch (this.day()) { + case 0: + return '[Ð’ прошлое] dddd [в] LT'; + case 1: + case 2: + case 4: + return '[Ð’ прошлый] dddd [в] LT'; + case 3: + case 5: + case 6: + return '[Ð’ прошлую] dddd [в] LT'; + } + } else { + if (this.day() === 2) { + return '[Во] dddd [в] LT'; + } else { + return '[Ð’] dddd [в] LT'; + } + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'через %s', + past : '%s назад', + s : 'неÑколько Ñекунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : 'чаÑ', + hh : relativeTimeWithPlural, + d : 'день', + dd : relativeTimeWithPlural, + M : 'меÑÑц', + MM : relativeTimeWithPlural, + y : 'год', + yy : relativeTimeWithPlural + }, + + meridiemParse: /ночи|утра|днÑ|вечера/i, + isPM : function (input) { + return /^(днÑ|вечера)$/.test(input); + }, + + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночи'; + } else if (hour < 12) { + return 'утра'; + } else if (hour < 17) { + return 'днÑ'; + } else { + return 'вечера'; + } + }, + + ordinalParse: /\d{1,2}-(й|го|Ñ)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + return number + '-й'; + case 'D': + return number + '-го'; + case 'w': + case 'W': + return number + '-Ñ'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : slovak (sk) +// author : Martin Minka : https://github.com/k2s +// based on work of petrbela : https://github.com/petrbela + +(function (factory) { + factory(moment); +}(function (moment) { + var months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'), + monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_'); + + function plural(n) { + return (n > 1) && (n < 5); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami'; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minúty' : 'minút'); + } else { + return result + 'minútami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodín'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'deň' : 'dňom'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dni' : 'dní'); + } else { + return result + 'dňami'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'mesiace' : 'mesiacov'); + } else { + return result + 'mesiacmi'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokom'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'rokov'); + } else { + return result + 'rokmi'; + } + break; + } + } + + return moment.defineLocale('sk', { + months : months, + monthsShort : monthsShort, + monthsParse : (function (months, monthsShort) { + var i, _monthsParse = []; + for (i = 0; i < 12; i++) { + // use custom parser to solve problem with July (Äervenec) + _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); + } + return _monthsParse; + }(months, monthsShort)), + weekdays : 'nedeľa_pondelok_utorok_streda_Å¡tvrtok_piatok_sobota'.split('_'), + weekdaysShort : 'ne_po_ut_st_Å¡t_pi_so'.split('_'), + weekdaysMin : 'ne_po_ut_st_Å¡t_pi_so'.split('_'), + longDateFormat : { + LT: 'H:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd D. MMMM YYYY LT' + }, + calendar : { + sameDay: '[dnes o] LT', + nextDay: '[zajtra o] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedeľu o] LT'; + case 1: + case 2: + return '[v] dddd [o] LT'; + case 3: + return '[v stredu o] LT'; + case 4: + return '[vo Å¡tvrtok o] LT'; + case 5: + return '[v piatok o] LT'; + case 6: + return '[v sobotu o] LT'; + } + }, + lastDay: '[vÄera o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulú nedeľu o] LT'; + case 1: + case 2: + return '[minulý] dddd [o] LT'; + case 3: + return '[minulú stredu o] LT'; + case 4: + case 5: + return '[minulý] dddd [o] LT'; + case 6: + return '[minulú sobotu o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pred %s', + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : slovenian (sl) +// author : Robert SedovÅ¡ek : https://github.com/sedovsek + +(function (factory) { + factory(moment); +}(function (moment) { + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'm': + return withoutSuffix ? 'ena minuta' : 'eno minuto'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2) { + result += 'minuti'; + } else if (number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minut'; + } + return result; + case 'h': + return withoutSuffix ? 'ena ura' : 'eno uro'; + case 'hh': + if (number === 1) { + result += 'ura'; + } else if (number === 2) { + result += 'uri'; + } else if (number === 3 || number === 4) { + result += 'ure'; + } else { + result += 'ur'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dni'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mesec'; + } else if (number === 2) { + result += 'meseca'; + } else if (number === 3 || number === 4) { + result += 'mesece'; + } else { + result += 'mesecev'; + } + return result; + case 'yy': + if (number === 1) { + result += 'leto'; + } else if (number === 2) { + result += 'leti'; + } else if (number === 3 || number === 4) { + result += 'leta'; + } else { + result += 'let'; + } + return result; + } + } + + return moment.defineLocale('sl', { + months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'), + monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'), + weekdays : 'nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota'.split('_'), + weekdaysShort : 'ned._pon._tor._sre._Äet._pet._sob.'.split('_'), + weekdaysMin : 'ne_po_to_sr_Äe_pe_so'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'LT:ss', + L : 'DD. MM. YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY LT', + LLLL : 'dddd, D. MMMM YYYY LT' + }, + calendar : { + sameDay : '[danes ob] LT', + nextDay : '[jutri ob] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[v] [nedeljo] [ob] LT'; + case 3: + return '[v] [sredo] [ob] LT'; + case 6: + return '[v] [soboto] [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[v] dddd [ob] LT'; + } + }, + lastDay : '[vÄeraj ob] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[prejÅ¡nja] dddd [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[prejÅ¡nji] dddd [ob] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'Äez %s', + past : '%s nazaj', + s : 'nekaj sekund', + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'en dan', + dd : translate, + M : 'en mesec', + MM : translate, + y : 'eno leto', + yy : translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Albanian (sq) +// author : Flakërim Ismani : https://github.com/flakerimi +// author: Menelion Elensúle: https://github.com/Oire (tests) +// author : Oerd Cukalla : https://github.com/oerd (fixes) + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('sq', { + months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'), + monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'), + weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'), + weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'), + weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'), + meridiemParse: /PD|MD/, + isPM: function (input) { + return input.charAt(0) === 'M'; + }, + meridiem : function (hours, minutes, isLower) { + return hours < 12 ? 'PD' : 'MD'; + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[Sot në] LT', + nextDay : '[Nesër në] LT', + nextWeek : 'dddd [në] LT', + lastDay : '[Dje në] LT', + lastWeek : 'dddd [e kaluar në] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'në %s', + past : '%s më parë', + s : 'disa sekonda', + m : 'një minutë', + mm : '%d minuta', + h : 'një orë', + hh : '%d orë', + d : 'një ditë', + dd : '%d ditë', + M : 'një muaj', + MM : '%d muaj', + y : 'një vit', + yy : '%d vite' + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Serbian-cyrillic (sr-cyrl) +// author : Milan JanaÄković : https://github.com/milan-j + +(function (factory) { + factory(moment); +}(function (moment) { + var translator = { + words: { //Different grammatical cases + m: ['један минут', 'једне минуте'], + mm: ['минут', 'минуте', 'минута'], + h: ['један Ñат', 'једног Ñата'], + hh: ['Ñат', 'Ñата', 'Ñати'], + dd: ['дан', 'дана', 'дана'], + MM: ['меÑец', 'меÑеца', 'меÑеци'], + yy: ['година', 'године', 'година'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } + }; + + return moment.defineLocale('sr-cyrl', { + months: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'авгуÑÑ‚', 'Ñептембар', 'октобар', 'новембар', 'децембар'], + monthsShort: ['јан.', 'феб.', 'мар.', 'апр.', 'мај', 'јун', 'јул', 'авг.', 'Ñеп.', 'окт.', 'нов.', 'дец.'], + weekdays: ['недеља', 'понедељак', 'уторак', 'Ñреда', 'четвртак', 'петак', 'Ñубота'], + weekdaysShort: ['нед.', 'пон.', 'уто.', 'Ñре.', 'чет.', 'пет.', 'Ñуб.'], + weekdaysMin: ['не', 'по', 'ут', 'ÑÑ€', 'че', 'пе', 'Ñу'], + longDateFormat: { + LT: 'H:mm', + LTS : 'LT:ss', + L: 'DD. MM. YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY LT', + LLLL: 'dddd, D. MMMM YYYY LT' + }, + calendar: { + sameDay: '[Ð´Ð°Ð½Ð°Ñ Ñƒ] LT', + nextDay: '[Ñутра у] LT', + + nextWeek: function () { + switch (this.day()) { + case 0: + return '[у] [недељу] [у] LT'; + case 3: + return '[у] [Ñреду] [у] LT'; + case 6: + return '[у] [Ñуботу] [у] LT'; + case 1: + case 2: + case 4: + case 5: + return '[у] dddd [у] LT'; + } + }, + lastDay : '[јуче у] LT', + lastWeek : function () { + var lastWeekDays = [ + '[прошле] [недеље] [у] LT', + '[прошлог] [понедељка] [у] LT', + '[прошлог] [уторка] [у] LT', + '[прошле] [Ñреде] [у] LT', + '[прошлог] [четвртка] [у] LT', + '[прошлог] [петка] [у] LT', + '[прошле] [Ñуботе] [у] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'за %s', + past : 'пре %s', + s : 'неколико Ñекунди', + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'дан', + dd : translator.translate, + M : 'меÑец', + MM : translator.translate, + y : 'годину', + yy : translator.translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Serbian-latin (sr) +// author : Milan JanaÄković : https://github.com/milan-j + +(function (factory) { + factory(moment); +}(function (moment) { + var translator = { + words: { //Different grammatical cases + m: ['jedan minut', 'jedne minute'], + mm: ['minut', 'minute', 'minuta'], + h: ['jedan sat', 'jednog sata'], + hh: ['sat', 'sata', 'sati'], + dd: ['dan', 'dana', 'dana'], + MM: ['mesec', 'meseca', 'meseci'], + yy: ['godina', 'godine', 'godina'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } + }; + + return moment.defineLocale('sr', { + months: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'], + monthsShort: ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun', 'jul', 'avg.', 'sep.', 'okt.', 'nov.', 'dec.'], + weekdays: ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'Äetvrtak', 'petak', 'subota'], + weekdaysShort: ['ned.', 'pon.', 'uto.', 'sre.', 'Äet.', 'pet.', 'sub.'], + weekdaysMin: ['ne', 'po', 'ut', 'sr', 'Äe', 'pe', 'su'], + longDateFormat: { + LT: 'H:mm', + LTS : 'LT:ss', + L: 'DD. MM. YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY LT', + LLLL: 'dddd, D. MMMM YYYY LT' + }, + calendar: { + sameDay: '[danas u] LT', + nextDay: '[sutra u] LT', + + nextWeek: function () { + switch (this.day()) { + case 0: + return '[u] [nedelju] [u] LT'; + case 3: + return '[u] [sredu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄe u] LT', + lastWeek : function () { + var lastWeekDays = [ + '[proÅ¡le] [nedelje] [u] LT', + '[proÅ¡log] [ponedeljka] [u] LT', + '[proÅ¡log] [utorka] [u] LT', + '[proÅ¡le] [srede] [u] LT', + '[proÅ¡log] [Äetvrtka] [u] LT', + '[proÅ¡log] [petka] [u] LT', + '[proÅ¡le] [subote] [u] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'pre %s', + s : 'nekoliko sekundi', + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'dan', + dd : translator.translate, + M : 'mesec', + MM : translator.translate, + y : 'godinu', + yy : translator.translate + }, + ordinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : swedish (sv) +// author : Jens Alm : https://github.com/ulmus + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('sv', { + months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'söndag_mÃ¥ndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'), + weekdaysShort : 'sön_mÃ¥n_tis_ons_tor_fre_lör'.split('_'), + weekdaysMin : 'sö_mÃ¥_ti_on_to_fr_lö'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'YYYY-MM-DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[Idag] LT', + nextDay: '[Imorgon] LT', + lastDay: '[IgÃ¥r] LT', + nextWeek: 'dddd LT', + lastWeek: '[Förra] dddd[en] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'om %s', + past : 'för %s sedan', + s : 'nÃ¥gra sekunder', + m : 'en minut', + mm : '%d minuter', + h : 'en timme', + hh : '%d timmar', + d : 'en dag', + dd : '%d dagar', + M : 'en mÃ¥nad', + MM : '%d mÃ¥nader', + y : 'ett Ã¥r', + yy : '%d Ã¥r' + }, + ordinalParse: /\d{1,2}(e|a)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'e' : + (b === 1) ? 'a' : + (b === 2) ? 'a' : + (b === 3) ? 'e' : 'e'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : tamil (ta) +// author : Arjunkumar Krishnamoorthy : https://github.com/tk120404 + +(function (factory) { + factory(moment); +}(function (moment) { + /*var symbolMap = { + '1': '௧', + '2': '௨', + '3': '௩', + '4': '௪', + '5': '௫', + '6': '௬', + '7': '௭', + '8': '௮', + '9': '௯', + '0': '௦' + }, + numberMap = { + '௧': '1', + '௨': '2', + '௩': '3', + '௪': '4', + '௫': '5', + '௬': '6', + '௭': '7', + '௮': '8', + '௯': '9', + '௦': '0' + }; */ + + return moment.defineLocale('ta', { + months : 'ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯'.split('_'), + monthsShort : 'ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯'.split('_'), + weekdays : 'ஞாயிறà¯à®±à¯à®•à¯à®•à®¿à®´à®®à¯ˆ_திஙà¯à®•à®Ÿà¯à®•à®¿à®´à®®à¯ˆ_செவà¯à®µà®¾à®¯à¯à®•à®¿à®´à®®à¯ˆ_பà¯à®¤à®©à¯à®•à®¿à®´à®®à¯ˆ_வியாழகà¯à®•à®¿à®´à®®à¯ˆ_வெளà¯à®³à®¿à®•à¯à®•à®¿à®´à®®à¯ˆ_சனிகà¯à®•à®¿à®´à®®à¯ˆ'.split('_'), + weekdaysShort : 'ஞாயிறà¯_திஙà¯à®•à®³à¯_செவà¯à®µà®¾à®¯à¯_பà¯à®¤à®©à¯_வியாழனà¯_வெளà¯à®³à®¿_சனி'.split('_'), + weekdaysMin : 'ஞா_தி_செ_பà¯_வி_வெ_ச'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, LT', + LLLL : 'dddd, D MMMM YYYY, LT' + }, + calendar : { + sameDay : '[இனà¯à®±à¯] LT', + nextDay : '[நாளை] LT', + nextWeek : 'dddd, LT', + lastDay : '[நேறà¯à®±à¯] LT', + lastWeek : '[கடநà¯à®¤ வாரமà¯] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s இலà¯', + past : '%s à®®à¯à®©à¯', + s : 'ஒர௠சில விநாடிகளà¯', + m : 'ஒர௠நிமிடமà¯', + mm : '%d நிமிடஙà¯à®•à®³à¯', + h : 'ஒர௠மணி நேரமà¯', + hh : '%d மணி நேரமà¯', + d : 'ஒர௠நாளà¯', + dd : '%d நாடà¯à®•à®³à¯', + M : 'ஒர௠மாதமà¯', + MM : '%d மாதஙà¯à®•à®³à¯', + y : 'ஒர௠வரà¯à®Ÿà®®à¯', + yy : '%d ஆணà¯à®Ÿà¯à®•à®³à¯' + }, +/* preparse: function (string) { + return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + },*/ + ordinalParse: /\d{1,2}வதà¯/, + ordinal : function (number) { + return number + 'வதà¯'; + }, + + + // refer http://ta.wikipedia.org/s/1er1 + meridiemParse: /யாமமà¯|வைகறை|காலை|நணà¯à®ªà®•à®²à¯|எறà¯à®ªà®¾à®Ÿà¯|மாலை/, + meridiem : function (hour, minute, isLower) { + if (hour < 2) { + return ' யாமமà¯'; + } else if (hour < 6) { + return ' வைகறை'; // வைகறை + } else if (hour < 10) { + return ' காலை'; // காலை + } else if (hour < 14) { + return ' நணà¯à®ªà®•à®²à¯'; // நணà¯à®ªà®•à®²à¯ + } else if (hour < 18) { + return ' எறà¯à®ªà®¾à®Ÿà¯'; // எறà¯à®ªà®¾à®Ÿà¯ + } else if (hour < 22) { + return ' மாலை'; // மாலை + } else { + return ' யாமமà¯'; + } + }, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'யாமமà¯') { + return hour < 2 ? hour : hour + 12; + } else if (meridiem === 'வைகறை' || meridiem === 'காலை') { + return hour; + } else if (meridiem === 'நணà¯à®ªà®•à®²à¯') { + return hour >= 10 ? hour : hour + 12; + } else { + return hour + 12; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : thai (th) +// author : Kridsada Thanabulpong : https://github.com/sirn + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('th', { + months : 'มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม'.split('_'), + monthsShort : 'มà¸à¸£à¸²_à¸à¸¸à¸¡à¸ à¸²_มีนา_เมษา_พฤษภา_มิถุนา_à¸à¸£à¸à¸Žà¸²_สิงหา_à¸à¸±à¸™à¸¢à¸²_ตุลา_พฤศจิà¸à¸²_ธันวา'.split('_'), + weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์'.split('_'), + weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์'.split('_'), // yes, three characters difference + weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'), + longDateFormat : { + LT : 'H นาฬิà¸à¸² m นาที', + LTS : 'LT s วินาที', + L : 'YYYY/MM/DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY เวลา LT', + LLLL : 'วันddddที่ D MMMM YYYY เวลา LT' + }, + meridiemParse: /à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง|หลังเที่ยง/, + isPM: function (input) { + return input === 'หลังเที่ยง'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง'; + } else { + return 'หลังเที่ยง'; + } + }, + calendar : { + sameDay : '[วันนี้ เวลา] LT', + nextDay : '[พรุ่งนี้ เวลา] LT', + nextWeek : 'dddd[หน้า เวลา] LT', + lastDay : '[เมื่อวานนี้ เวลา] LT', + lastWeek : '[วัน]dddd[ที่à¹à¸¥à¹‰à¸§ เวลา] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'อีภ%s', + past : '%sที่à¹à¸¥à¹‰à¸§', + s : 'ไม่à¸à¸µà¹ˆà¸§à¸´à¸™à¸²à¸—ี', + m : '1 นาที', + mm : '%d นาที', + h : '1 ชั่วโมง', + hh : '%d ชั่วโมง', + d : '1 วัน', + dd : '%d วัน', + M : '1 เดือน', + MM : '%d เดือน', + y : '1 ปี', + yy : '%d ปี' + } + }); +})); +// moment.js locale configuration +// locale : Tagalog/Filipino (tl-ph) +// author : Dan Hagman + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('tl-ph', { + months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'), + monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'), + weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'), + weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'), + weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'MM/D/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY LT', + LLLL : 'dddd, MMMM DD, YYYY LT' + }, + calendar : { + sameDay: '[Ngayon sa] LT', + nextDay: '[Bukas sa] LT', + nextWeek: 'dddd [sa] LT', + lastDay: '[Kahapon sa] LT', + lastWeek: 'dddd [huling linggo] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'sa loob ng %s', + past : '%s ang nakalipas', + s : 'ilang segundo', + m : 'isang minuto', + mm : '%d minuto', + h : 'isang oras', + hh : '%d oras', + d : 'isang araw', + dd : '%d araw', + M : 'isang buwan', + MM : '%d buwan', + y : 'isang taon', + yy : '%d taon' + }, + ordinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : turkish (tr) +// authors : Erhan Gundogan : https://github.com/erhangundogan, +// Burak YiÄŸit Kaya: https://github.com/BYK + +(function (factory) { + factory(moment); +}(function (moment) { + var suffixes = { + 1: '\'inci', + 5: '\'inci', + 8: '\'inci', + 70: '\'inci', + 80: '\'inci', + + 2: '\'nci', + 7: '\'nci', + 20: '\'nci', + 50: '\'nci', + + 3: '\'üncü', + 4: '\'üncü', + 100: '\'üncü', + + 6: '\'ncı', + + 9: '\'uncu', + 10: '\'uncu', + 30: '\'uncu', + + 60: '\'ıncı', + 90: '\'ıncı' + }; + + return moment.defineLocale('tr', { + months : 'Ocak_Åžubat_Mart_Nisan_Mayıs_Haziran_Temmuz_AÄŸustos_Eylül_Ekim_Kasım_Aralık'.split('_'), + monthsShort : 'Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara'.split('_'), + weekdays : 'Pazar_Pazartesi_Salı_ÇarÅŸamba_PerÅŸembe_Cuma_Cumartesi'.split('_'), + weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'), + weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + calendar : { + sameDay : '[bugün saat] LT', + nextDay : '[yarın saat] LT', + nextWeek : '[haftaya] dddd [saat] LT', + lastDay : '[dün] LT', + lastWeek : '[geçen hafta] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s sonra', + past : '%s önce', + s : 'birkaç saniye', + m : 'bir dakika', + mm : '%d dakika', + h : 'bir saat', + hh : '%d saat', + d : 'bir gün', + dd : '%d gün', + M : 'bir ay', + MM : '%d ay', + y : 'bir yıl', + yy : '%d yıl' + }, + ordinalParse: /\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/, + ordinal : function (number) { + if (number === 0) { // special case for zero + return number + '\'ıncı'; + } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + + return number + (suffixes[a] || suffixes[b] || suffixes[c]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Morocco Central Atlas TamaziÉ£t in Latin (tzm-latn) +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('tzm-latn', { + months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), + weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), + weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[asdkh g] LT', + nextDay: '[aska g] LT', + nextWeek: 'dddd [g] LT', + lastDay: '[assant g] LT', + lastWeek: 'dddd [g] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'dadkh s yan %s', + past : 'yan %s', + s : 'imik', + m : 'minuá¸', + mm : '%d minuá¸', + h : 'saÉ›a', + hh : '%d tassaÉ›in', + d : 'ass', + dd : '%d ossan', + M : 'ayowr', + MM : '%d iyyirn', + y : 'asgas', + yy : '%d isgasn' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : Morocco Central Atlas TamaziÉ£t (tzm) +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('tzm', { + months : 'ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”'.split('_'), + monthsShort : 'ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”'.split('_'), + weekdays : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + weekdaysShort : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS: 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd D MMMM YYYY LT' + }, + calendar : { + sameDay: '[ⴰⵙⴷⵅ â´´] LT', + nextDay: '[ⴰⵙⴽⴰ â´´] LT', + nextWeek: 'dddd [â´´] LT', + lastDay: '[ⴰⵚⴰâµâµœ â´´] LT', + lastWeek: 'dddd [â´´] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'â´·â´°â´·âµ… âµ™ ⵢⴰⵠ%s', + past : 'ⵢⴰⵠ%s', + s : 'ⵉⵎⵉⴽ', + m : 'ⵎⵉâµâµ“â´º', + mm : '%d ⵎⵉâµâµ“â´º', + h : 'ⵙⴰⵄⴰ', + hh : '%d ⵜⴰⵙⵙⴰⵄⵉâµ', + d : 'ⴰⵙⵙ', + dd : '%d oⵙⵙⴰâµ', + M : 'â´°âµ¢oⵓⵔ', + MM : '%d ⵉⵢⵢⵉⵔâµ', + y : 'ⴰⵙⴳⴰⵙ', + yy : '%d ⵉⵙⴳⴰⵙâµ' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : ukrainian (uk) +// author : zemlanin : https://github.com/zemlanin +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + factory(moment); +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': 'хвилина_хвилини_хвилин', + 'hh': 'година_години_годин', + 'dd': 'день_дні_днів', + 'MM': 'міÑÑць_міÑÑці_міÑÑців', + 'yy': 'рік_роки_років' + }; + if (key === 'm') { + return withoutSuffix ? 'хвилина' : 'хвилину'; + } + else if (key === 'h') { + return withoutSuffix ? 'година' : 'годину'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень'.split('_'), + 'accusative': 'ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ'.split('_') + }, + + nounCase = (/D[oD]? *MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота'.split('_'), + 'accusative': 'неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу'.split('_'), + 'genitive': 'неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи'.split('_') + }, + + nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ? + 'accusative' : + ((/\[?(?:минулої|наÑтупної)? ?\] ?dddd/).test(format) ? + 'genitive' : + 'nominative'); + + return weekdays[nounCase][m.day()]; + } + + function processHoursFunction(str) { + return function () { + return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT'; + }; + } + + return moment.defineLocale('uk', { + months : monthsCaseReplace, + monthsShort : 'Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + weekdaysMin : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY Ñ€.', + LLL : 'D MMMM YYYY Ñ€., LT', + LLLL : 'dddd, D MMMM YYYY Ñ€., LT' + }, + calendar : { + sameDay: processHoursFunction('[Сьогодні '), + nextDay: processHoursFunction('[Завтра '), + lastDay: processHoursFunction('[Вчора '), + nextWeek: processHoursFunction('[У] dddd ['), + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return processHoursFunction('[Минулої] dddd [').call(this); + case 1: + case 2: + case 4: + return processHoursFunction('[Минулого] dddd [').call(this); + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'за %s', + past : '%s тому', + s : 'декілька Ñекунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : 'годину', + hh : relativeTimeWithPlural, + d : 'день', + dd : relativeTimeWithPlural, + M : 'міÑÑць', + MM : relativeTimeWithPlural, + y : 'рік', + yy : relativeTimeWithPlural + }, + + // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason + + meridiemParse: /ночі|ранку|днÑ|вечора/, + isPM: function (input) { + return /^(днÑ|вечора)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночі'; + } else if (hour < 12) { + return 'ранку'; + } else if (hour < 17) { + return 'днÑ'; + } else { + return 'вечора'; + } + }, + + ordinalParse: /\d{1,2}-(й|го)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return number + '-й'; + case 'D': + return number + '-го'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : uzbek (uz) +// author : Sardor Muminov : https://github.com/muminoff + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('uz', { + months : 'Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь'.split('_'), + monthsShort : 'Ñнв_фев_мар_апр_май_июн_июл_авг_Ñен_окт_ноÑ_дек'.split('_'), + weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'), + weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'), + weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'D MMMM YYYY, dddd LT' + }, + calendar : { + sameDay : '[Бугун Ñоат] LT [да]', + nextDay : '[Эртага] LT [да]', + nextWeek : 'dddd [куни Ñоат] LT [да]', + lastDay : '[Кеча Ñоат] LT [да]', + lastWeek : '[Утган] dddd [куни Ñоат] LT [да]', + sameElse : 'L' + }, + relativeTime : { + future : 'Якин %s ичида', + past : 'Бир неча %s олдин', + s : 'фурÑат', + m : 'бир дакика', + mm : '%d дакика', + h : 'бир Ñоат', + hh : '%d Ñоат', + d : 'бир кун', + dd : '%d кун', + M : 'бир ой', + MM : '%d ой', + y : 'бир йил', + yy : '%d йил' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : vietnamese (vi) +// author : Bang Nguyen : https://github.com/bangnk + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('vi', { + months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'), + monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'), + weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tÆ°_thứ năm_thứ sáu_thứ bảy'.split('_'), + weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'LT:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM [năm] YYYY', + LLL : 'D MMMM [năm] YYYY LT', + LLLL : 'dddd, D MMMM [năm] YYYY LT', + l : 'DD/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY LT', + llll : 'ddd, D MMM YYYY LT' + }, + calendar : { + sameDay: '[Hôm nay lúc] LT', + nextDay: '[Ngày mai lúc] LT', + nextWeek: 'dddd [tuần tá»›i lúc] LT', + lastDay: '[Hôm qua lúc] LT', + lastWeek: 'dddd [tuần rồi lúc] LT', + sameElse: 'L' + }, + relativeTime : { + future : '%s tá»›i', + past : '%s trÆ°á»›c', + s : 'vài giây', + m : 'má»™t phút', + mm : '%d phút', + h : 'má»™t giá»', + hh : '%d giá»', + d : 'má»™t ngày', + dd : '%d ngày', + M : 'má»™t tháng', + MM : '%d tháng', + y : 'má»™t năm', + yy : '%d năm' + }, + ordinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : chinese (zh-cn) +// author : suupic : https://github.com/suupic +// author : Zeno Zeng : https://github.com/zenozeng + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('zh-cn', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'), + weekdaysMin : 'æ—¥_一_二_三_å››_五_å…­'.split('_'), + longDateFormat : { + LT : 'Ah点mm', + LTS : 'Ah点m分s秒', + L : 'YYYY-MM-DD', + LL : 'YYYYå¹´MMMDæ—¥', + LLL : 'YYYYå¹´MMMDæ—¥LT', + LLLL : 'YYYYå¹´MMMDæ—¥ddddLT', + l : 'YYYY-MM-DD', + ll : 'YYYYå¹´MMMDæ—¥', + lll : 'YYYYå¹´MMMDæ—¥LT', + llll : 'YYYYå¹´MMMDæ—¥ddddLT' + }, + meridiemParse: /凌晨|早上|上åˆ|中åˆ|下åˆ|晚上/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '凌晨' || meridiem === '早上' || + meridiem === '上åˆ') { + return hour; + } else if (meridiem === '下åˆ' || meridiem === '晚上') { + return hour + 12; + } else { + // '中åˆ' + return hour >= 11 ? hour : hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return '凌晨'; + } else if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上åˆ'; + } else if (hm < 1230) { + return '中åˆ'; + } else if (hm < 1800) { + return '下åˆ'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : function () { + return this.minutes() === 0 ? '[今天]Ah[点整]' : '[今天]LT'; + }, + nextDay : function () { + return this.minutes() === 0 ? '[明天]Ah[点整]' : '[明天]LT'; + }, + lastDay : function () { + return this.minutes() === 0 ? '[昨天]Ah[点整]' : '[昨天]LT'; + }, + nextWeek : function () { + var startOfWeek, prefix; + startOfWeek = moment().startOf('week'); + prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]'; + return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; + }, + lastWeek : function () { + var startOfWeek, prefix; + startOfWeek = moment().startOf('week'); + prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]'; + return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; + }, + sameElse : 'LL' + }, + ordinalParse: /\d{1,2}(æ—¥|月|周)/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + 'æ—¥'; + case 'M': + return number + '月'; + case 'w': + case 'W': + return number + '周'; + default: + return number; + } + }, + relativeTime : { + future : '%s内', + past : '%så‰', + s : '几秒', + m : '1分钟', + mm : '%d分钟', + h : '1å°æ—¶', + hh : '%då°æ—¶', + d : '1天', + dd : '%d天', + M : '1个月', + MM : '%d个月', + y : '1å¹´', + yy : '%då¹´' + }, + week : { + // GB/T 7408-1994《数æ®å…ƒå’Œäº¤æ¢æ ¼å¼Â·ä¿¡æ¯äº¤æ¢Â·æ—¥æœŸå’Œæ—¶é—´è¡¨ç¤ºæ³•ã€‹ä¸ŽISO 8601:1988等效 + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js locale configuration +// locale : traditional chinese (zh-tw) +// author : Ben : https://github.com/ben-lin + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.defineLocale('zh-tw', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), + weekdaysMin : 'æ—¥_一_二_三_å››_五_å…­'.split('_'), + longDateFormat : { + LT : 'Ah點mm', + LTS : 'Ah點m分s秒', + L : 'YYYYå¹´MMMDæ—¥', + LL : 'YYYYå¹´MMMDæ—¥', + LLL : 'YYYYå¹´MMMDæ—¥LT', + LLLL : 'YYYYå¹´MMMDæ—¥ddddLT', + l : 'YYYYå¹´MMMDæ—¥', + ll : 'YYYYå¹´MMMDæ—¥', + lll : 'YYYYå¹´MMMDæ—¥LT', + llll : 'YYYYå¹´MMMDæ—¥ddddLT' + }, + meridiemParse: /早上|上åˆ|中åˆ|下åˆ|晚上/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '早上' || meridiem === '上åˆ') { + return hour; + } else if (meridiem === '中åˆ') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === '下åˆ' || meridiem === '晚上') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上åˆ'; + } else if (hm < 1230) { + return '中åˆ'; + } else if (hm < 1800) { + return '下åˆ'; + } else { + return '晚上'; + } + }, + calendar : { + sameDay : '[今天]LT', + nextDay : '[明天]LT', + nextWeek : '[下]ddddLT', + lastDay : '[昨天]LT', + lastWeek : '[上]ddddLT', + sameElse : 'L' + }, + ordinalParse: /\d{1,2}(æ—¥|月|週)/, + ordinal : function (number, period) { + switch (period) { + case 'd' : + case 'D' : + case 'DDD' : + return number + 'æ—¥'; + case 'M' : + return number + '月'; + case 'w' : + case 'W' : + return number + '週'; + default : + return number; + } + }, + relativeTime : { + future : '%så…§', + past : '%så‰', + s : '幾秒', + m : '一分é˜', + mm : '%d分é˜', + h : '一å°æ™‚', + hh : '%då°æ™‚', + d : '一天', + dd : '%d天', + M : '一個月', + MM : '%d個月', + y : '一年', + yy : '%då¹´' + } + }); +})); + + moment.locale('en'); + + + /************************************ + Exposing Moment + ************************************/ + + function makeGlobal(shouldDeprecate) { + /*global ender:false */ + if (typeof ender !== 'undefined') { + return; + } + oldGlobalMoment = globalScope.moment; + if (shouldDeprecate) { + globalScope.moment = deprecate( + 'Accessing Moment through the global scope is ' + + 'deprecated, and will be removed in an upcoming ' + + 'release.', + moment); + } else { + globalScope.moment = moment; + } + } + + // CommonJS module is defined + if (hasModule) { + module.exports = moment; + } else if (typeof define === 'function' && define.amd) { + define(function (require, exports, module) { + if (module.config && module.config() && module.config().noGlobal === true) { + // release the global variable + globalScope.moment = oldGlobalMoment; + } + + return moment; + }); + makeGlobal(true); + } else { + makeGlobal(); + } +}).call(this); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/moment-with-locales.min.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/moment-with-locales.min.js new file mode 100644 index 0000000..f604348 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/moment-with-locales.min.js @@ -0,0 +1,10 @@ +//! moment.js +//! version : 2.9.0 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com +(function(a){function b(a,b,c){switch(arguments.length){case 2:return null!=a?a:b;case 3:return null!=a?a:null!=b?b:c;default:throw new Error("Implement me")}}function c(a,b){return Bb.call(a,b)}function d(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function e(a){vb.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+a)}function f(a,b){var c=!0;return o(function(){return c&&(e(a),c=!1),b.apply(this,arguments)},b)}function g(a,b){sc[a]||(e(b),sc[a]=!0)}function h(a,b){return function(c){return r(a.call(this,c),b)}}function i(a,b){return function(c){return this.localeData().ordinal(a.call(this,c),b)}}function j(a,b){var c,d,e=12*(b.year()-a.year())+(b.month()-a.month()),f=a.clone().add(e,"months");return 0>b-f?(c=a.clone().add(e-1,"months"),d=(b-f)/(f-c)):(c=a.clone().add(e+1,"months"),d=(b-f)/(c-f)),-(e+d)}function k(a,b,c){var d;return null==c?b:null!=a.meridiemHour?a.meridiemHour(b,c):null!=a.isPM?(d=a.isPM(c),d&&12>b&&(b+=12),d||12!==b||(b=0),b):b}function l(){}function m(a,b){b!==!1&&H(a),p(this,a),this._d=new Date(+a._d),uc===!1&&(uc=!0,vb.updateOffset(this),uc=!1)}function n(a){var b=A(a),c=b.year||0,d=b.quarter||0,e=b.month||0,f=b.week||0,g=b.day||0,h=b.hour||0,i=b.minute||0,j=b.second||0,k=b.millisecond||0;this._milliseconds=+k+1e3*j+6e4*i+36e5*h,this._days=+g+7*f,this._months=+e+3*d+12*c,this._data={},this._locale=vb.localeData(),this._bubble()}function o(a,b){for(var d in b)c(b,d)&&(a[d]=b[d]);return c(b,"toString")&&(a.toString=b.toString),c(b,"valueOf")&&(a.valueOf=b.valueOf),a}function p(a,b){var c,d,e;if("undefined"!=typeof b._isAMomentObject&&(a._isAMomentObject=b._isAMomentObject),"undefined"!=typeof b._i&&(a._i=b._i),"undefined"!=typeof b._f&&(a._f=b._f),"undefined"!=typeof b._l&&(a._l=b._l),"undefined"!=typeof b._strict&&(a._strict=b._strict),"undefined"!=typeof b._tzm&&(a._tzm=b._tzm),"undefined"!=typeof b._isUTC&&(a._isUTC=b._isUTC),"undefined"!=typeof b._offset&&(a._offset=b._offset),"undefined"!=typeof b._pf&&(a._pf=b._pf),"undefined"!=typeof b._locale&&(a._locale=b._locale),Kb.length>0)for(c in Kb)d=Kb[c],e=b[d],"undefined"!=typeof e&&(a[d]=e);return a}function q(a){return 0>a?Math.ceil(a):Math.floor(a)}function r(a,b,c){for(var d=""+Math.abs(a),e=a>=0;d.lengthd;d++)(c&&a[d]!==b[d]||!c&&C(a[d])!==C(b[d]))&&g++;return g+f}function z(a){if(a){var b=a.toLowerCase().replace(/(.)s$/,"$1");a=lc[a]||mc[b]||b}return a}function A(a){var b,d,e={};for(d in a)c(a,d)&&(b=z(d),b&&(e[b]=a[d]));return e}function B(b){var c,d;if(0===b.indexOf("week"))c=7,d="day";else{if(0!==b.indexOf("month"))return;c=12,d="month"}vb[b]=function(e,f){var g,h,i=vb._locale[b],j=[];if("number"==typeof e&&(f=e,e=a),h=function(a){var b=vb().utc().set(d,a);return i.call(vb._locale,b,e||"")},null!=f)return h(f);for(g=0;c>g;g++)j.push(h(g));return j}}function C(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=b>=0?Math.floor(b):Math.ceil(b)),c}function D(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function E(a,b,c){return jb(vb([a,11,31+b-c]),b,c).week}function F(a){return G(a)?366:365}function G(a){return a%4===0&&a%100!==0||a%400===0}function H(a){var b;a._a&&-2===a._pf.overflow&&(b=a._a[Db]<0||a._a[Db]>11?Db:a._a[Eb]<1||a._a[Eb]>D(a._a[Cb],a._a[Db])?Eb:a._a[Fb]<0||a._a[Fb]>24||24===a._a[Fb]&&(0!==a._a[Gb]||0!==a._a[Hb]||0!==a._a[Ib])?Fb:a._a[Gb]<0||a._a[Gb]>59?Gb:a._a[Hb]<0||a._a[Hb]>59?Hb:a._a[Ib]<0||a._a[Ib]>999?Ib:-1,a._pf._overflowDayOfYear&&(Cb>b||b>Eb)&&(b=Eb),a._pf.overflow=b)}function I(b){return null==b._isValid&&(b._isValid=!isNaN(b._d.getTime())&&b._pf.overflow<0&&!b._pf.empty&&!b._pf.invalidMonth&&!b._pf.nullInput&&!b._pf.invalidFormat&&!b._pf.userInvalidated,b._strict&&(b._isValid=b._isValid&&0===b._pf.charsLeftOver&&0===b._pf.unusedTokens.length&&b._pf.bigHour===a)),b._isValid}function J(a){return a?a.toLowerCase().replace("_","-"):a}function K(a){for(var b,c,d,e,f=0;f0;){if(d=L(e.slice(0,b).join("-")))return d;if(c&&c.length>=b&&y(e,c,!0)>=b-1)break;b--}f++}return null}function L(a){var b=null;if(!Jb[a]&&Lb)try{b=vb.locale(),require("./locale/"+a),vb.locale(b)}catch(c){}return Jb[a]}function M(a,b){var c,d;return b._isUTC?(c=b.clone(),d=(vb.isMoment(a)||x(a)?+a:+vb(a))-+c,c._d.setTime(+c._d+d),vb.updateOffset(c,!1),c):vb(a).local()}function N(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function O(a){var b,c,d=a.match(Pb);for(b=0,c=d.length;c>b;b++)d[b]=rc[d[b]]?rc[d[b]]:N(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 P(a,b){return a.isValid()?(b=Q(b,a.localeData()),nc[b]||(nc[b]=O(b)),nc[b](a)):a.localeData().invalidDate()}function Q(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(Qb.lastIndex=0;d>=0&&Qb.test(a);)a=a.replace(Qb,c),Qb.lastIndex=0,d-=1;return a}function R(a,b){var c,d=b._strict;switch(a){case"Q":return _b;case"DDDD":return bc;case"YYYY":case"GGGG":case"gggg":return d?cc:Tb;case"Y":case"G":case"g":return ec;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return d?dc:Ub;case"S":if(d)return _b;case"SS":if(d)return ac;case"SSS":if(d)return bc;case"DDD":return Sb;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Wb;case"a":case"A":return b._locale._meridiemParse;case"x":return Zb;case"X":return $b;case"Z":case"ZZ":return Xb;case"T":return Yb;case"SSSS":return Vb;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return d?ac:Rb;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return Rb;case"Do":return d?b._locale._ordinalParse:b._locale._ordinalParseLenient;default:return c=new RegExp($(Z(a.replace("\\","")),"i"))}}function S(a){a=a||"";var b=a.match(Xb)||[],c=b[b.length-1]||[],d=(c+"").match(jc)||["-",0,0],e=+(60*d[1])+C(d[2]);return"+"===d[0]?e:-e}function T(a,b,c){var d,e=c._a;switch(a){case"Q":null!=b&&(e[Db]=3*(C(b)-1));break;case"M":case"MM":null!=b&&(e[Db]=C(b)-1);break;case"MMM":case"MMMM":d=c._locale.monthsParse(b,a,c._strict),null!=d?e[Db]=d:c._pf.invalidMonth=b;break;case"D":case"DD":null!=b&&(e[Eb]=C(b));break;case"Do":null!=b&&(e[Eb]=C(parseInt(b.match(/\d{1,2}/)[0],10)));break;case"DDD":case"DDDD":null!=b&&(c._dayOfYear=C(b));break;case"YY":e[Cb]=vb.parseTwoDigitYear(b);break;case"YYYY":case"YYYYY":case"YYYYYY":e[Cb]=C(b);break;case"a":case"A":c._meridiem=b;break;case"h":case"hh":c._pf.bigHour=!0;case"H":case"HH":e[Fb]=C(b);break;case"m":case"mm":e[Gb]=C(b);break;case"s":case"ss":e[Hb]=C(b);break;case"S":case"SS":case"SSS":case"SSSS":e[Ib]=C(1e3*("0."+b));break;case"x":c._d=new Date(C(b));break;case"X":c._d=new Date(1e3*parseFloat(b));break;case"Z":case"ZZ":c._useUTC=!0,c._tzm=S(b);break;case"dd":case"ddd":case"dddd":d=c._locale.weekdaysParse(b),null!=d?(c._w=c._w||{},c._w.d=d):c._pf.invalidWeekday=b;break;case"w":case"ww":case"W":case"WW":case"d":case"e":case"E":a=a.substr(0,1);case"gggg":case"GGGG":case"GGGGG":a=a.substr(0,2),b&&(c._w=c._w||{},c._w[a]=C(b));break;case"gg":case"GG":c._w=c._w||{},c._w[a]=vb.parseTwoDigitYear(b)}}function U(a){var c,d,e,f,g,h,i;c=a._w,null!=c.GG||null!=c.W||null!=c.E?(g=1,h=4,d=b(c.GG,a._a[Cb],jb(vb(),1,4).year),e=b(c.W,1),f=b(c.E,1)):(g=a._locale._week.dow,h=a._locale._week.doy,d=b(c.gg,a._a[Cb],jb(vb(),g,h).year),e=b(c.w,1),null!=c.d?(f=c.d,g>f&&++e):f=null!=c.e?c.e+g:g),i=kb(d,e,f,h,g),a._a[Cb]=i.year,a._dayOfYear=i.dayOfYear}function V(a){var c,d,e,f,g=[];if(!a._d){for(e=X(a),a._w&&null==a._a[Eb]&&null==a._a[Db]&&U(a),a._dayOfYear&&(f=b(a._a[Cb],e[Cb]),a._dayOfYear>F(f)&&(a._pf._overflowDayOfYear=!0),d=fb(f,0,a._dayOfYear),a._a[Db]=d.getUTCMonth(),a._a[Eb]=d.getUTCDate()),c=0;3>c&&null==a._a[c];++c)a._a[c]=g[c]=e[c];for(;7>c;c++)a._a[c]=g[c]=null==a._a[c]?2===c?1:0:a._a[c];24===a._a[Fb]&&0===a._a[Gb]&&0===a._a[Hb]&&0===a._a[Ib]&&(a._nextDay=!0,a._a[Fb]=0),a._d=(a._useUTC?fb:eb).apply(null,g),null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()-a._tzm),a._nextDay&&(a._a[Fb]=24)}}function W(a){var b;a._d||(b=A(a._i),a._a=[b.year,b.month,b.day||b.date,b.hour,b.minute,b.second,b.millisecond],V(a))}function X(a){var b=new Date;return a._useUTC?[b.getUTCFullYear(),b.getUTCMonth(),b.getUTCDate()]:[b.getFullYear(),b.getMonth(),b.getDate()]}function Y(b){if(b._f===vb.ISO_8601)return void ab(b);b._a=[],b._pf.empty=!0;var c,d,e,f,g,h=""+b._i,i=h.length,j=0;for(e=Q(b._f,b._locale).match(Pb)||[],c=0;c0&&b._pf.unusedInput.push(g),h=h.slice(h.indexOf(d)+d.length),j+=d.length),rc[f]?(d?b._pf.empty=!1:b._pf.unusedTokens.push(f),T(f,d,b)):b._strict&&!d&&b._pf.unusedTokens.push(f);b._pf.charsLeftOver=i-j,h.length>0&&b._pf.unusedInput.push(h),b._pf.bigHour===!0&&b._a[Fb]<=12&&(b._pf.bigHour=a),b._a[Fb]=k(b._locale,b._a[Fb],b._meridiem),V(b),H(b)}function Z(a){return a.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e})}function $(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function _(a){var b,c,e,f,g;if(0===a._f.length)return a._pf.invalidFormat=!0,void(a._d=new Date(0/0));for(f=0;fg)&&(e=g,c=b));o(a,c||b)}function ab(a){var b,c,d=a._i,e=fc.exec(d);if(e){for(a._pf.iso=!0,b=0,c=hc.length;c>b;b++)if(hc[b][1].exec(d)){a._f=hc[b][0]+(e[6]||" ");break}for(b=0,c=ic.length;c>b;b++)if(ic[b][1].exec(d)){a._f+=ic[b][0];break}d.match(Xb)&&(a._f+="Z"),Y(a)}else a._isValid=!1}function bb(a){ab(a),a._isValid===!1&&(delete a._isValid,vb.createFromInputFallback(a))}function cb(a,b){var c,d=[];for(c=0;ca&&h.setFullYear(a),h}function fb(a){var b=new Date(Date.UTC.apply(null,arguments));return 1970>a&&b.setUTCFullYear(a),b}function gb(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 hb(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function ib(a,b,c){var d=vb.duration(a).abs(),e=Ab(d.as("s")),f=Ab(d.as("m")),g=Ab(d.as("h")),h=Ab(d.as("d")),i=Ab(d.as("M")),j=Ab(d.as("y")),k=e0,k[4]=c,hb.apply({},k)}function jb(a,b,c){var d,e=c-b,f=c-a.day();return f>e&&(f-=7),e-7>f&&(f+=7),d=vb(a).add(f,"d"),{week:Math.ceil(d.dayOfYear()/7),year:d.year()}}function kb(a,b,c,d,e){var f,g,h=fb(a,0,1).getUTCDay();return h=0===h?7:h,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:F(a-1)+g}}function lb(b){var c,d=b._i,e=b._f;return b._locale=b._locale||vb.localeData(b._l),null===d||e===a&&""===d?vb.invalid({nullInput:!0}):("string"==typeof d&&(b._i=d=b._locale.preparse(d)),vb.isMoment(d)?new m(d,!0):(e?w(e)?_(b):Y(b):db(b),c=new m(b),c._nextDay&&(c.add(1,"d"),c._nextDay=a),c))}function mb(a,b){var c,d;if(1===b.length&&w(b[0])&&(b=b[0]),!b.length)return vb();for(c=b[0],d=1;d=0?"+":"-";return b+r(Math.abs(a),6)},gg:function(){return r(this.weekYear()%100,2)},gggg:function(){return r(this.weekYear(),4)},ggggg:function(){return r(this.weekYear(),5)},GG:function(){return r(this.isoWeekYear()%100,2)},GGGG:function(){return r(this.isoWeekYear(),4)},GGGGG:function(){return r(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.localeData().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.localeData().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 C(this.milliseconds()/100)},SS:function(){return r(C(this.milliseconds()/10),2)},SSS:function(){return r(this.milliseconds(),3)},SSSS:function(){return r(this.milliseconds(),3)},Z:function(){var a=this.utcOffset(),b="+";return 0>a&&(a=-a,b="-"),b+r(C(a/60),2)+":"+r(C(a)%60,2)},ZZ:function(){var a=this.utcOffset(),b="+";return 0>a&&(a=-a,b="-"),b+r(C(a/60),2)+r(C(a)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},x:function(){return this.valueOf()},X:function(){return this.unix()},Q:function(){return this.quarter()}},sc={},tc=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"],uc=!1;pc.length;)xb=pc.pop(),rc[xb+"o"]=i(rc[xb],xb);for(;qc.length;)xb=qc.pop(),rc[xb+xb]=h(rc[xb],2);rc.DDDD=h(rc.DDD,3),o(l.prototype,{set:function(a){var b,c;for(c in a)b=a[c],"function"==typeof b?this[c]=b:this["_"+c]=b;this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)},_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,b,c){var d,e,f;for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),d=0;12>d;d++){if(e=vb.utc([2e3,d]),c&&!this._longMonthsParse[d]&&(this._longMonthsParse[d]=new RegExp("^"+this.months(e,"").replace(".","")+"$","i"),this._shortMonthsParse[d]=new RegExp("^"+this.monthsShort(e,"").replace(".","")+"$","i")),c||this._monthsParse[d]||(f="^"+this.months(e,"")+"|^"+this.monthsShort(e,""),this._monthsParse[d]=new RegExp(f.replace(".",""),"i")),c&&"MMMM"===b&&this._longMonthsParse[d].test(a))return d;if(c&&"MMM"===b&&this._shortMonthsParse[d].test(a))return d;if(!c&&this._monthsParse[d].test(a))return d}},_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=vb([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:{LTS:"h:mm:ss A",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,c){var d=this._calendar[a];return"function"==typeof d?d.apply(b,[c]):d},_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",_ordinalParse:/\d{1,2}/,preparse:function(a){return a},postformat:function(a){return a},week:function(a){return jb(a,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},firstDayOfWeek:function(){return this._week.dow},firstDayOfYear:function(){return this._week.doy},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),vb=function(b,c,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._i=b,g._f=c,g._l=e,g._strict=f,g._isUTC=!1,g._pf=d(),lb(g)},vb.suppressDeprecationWarnings=!1,vb.createFromInputFallback=f("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(a){a._d=new Date(a._i+(a._useUTC?" UTC":""))}),vb.min=function(){var a=[].slice.call(arguments,0);return mb("isBefore",a)},vb.max=function(){var a=[].slice.call(arguments,0);return mb("isAfter",a)},vb.utc=function(b,c,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=b,g._f=c,g._strict=f,g._pf=d(),lb(g).utc()},vb.unix=function(a){return vb(1e3*a)},vb.duration=function(a,b){var d,e,f,g,h=a,i=null;return vb.isDuration(a)?h={ms:a._milliseconds,d:a._days,M:a._months}:"number"==typeof a?(h={},b?h[b]=a:h.milliseconds=a):(i=Nb.exec(a))?(d="-"===i[1]?-1:1,h={y:0,d:C(i[Eb])*d,h:C(i[Fb])*d,m:C(i[Gb])*d,s:C(i[Hb])*d,ms:C(i[Ib])*d}):(i=Ob.exec(a))?(d="-"===i[1]?-1:1,f=function(a){var b=a&&parseFloat(a.replace(",","."));return(isNaN(b)?0:b)*d},h={y:f(i[2]),M:f(i[3]),d:f(i[4]),h:f(i[5]),m:f(i[6]),s:f(i[7]),w:f(i[8])}):null==h?h={}:"object"==typeof h&&("from"in h||"to"in h)&&(g=t(vb(h.from),vb(h.to)),h={},h.ms=g.milliseconds,h.M=g.months),e=new n(h),vb.isDuration(a)&&c(a,"_locale")&&(e._locale=a._locale),e},vb.version=yb,vb.defaultFormat=gc,vb.ISO_8601=function(){},vb.momentProperties=Kb,vb.updateOffset=function(){},vb.relativeTimeThreshold=function(b,c){return oc[b]===a?!1:c===a?oc[b]:(oc[b]=c,!0)},vb.lang=f("moment.lang is deprecated. Use moment.locale instead.",function(a,b){return vb.locale(a,b)}),vb.locale=function(a,b){var c;return a&&(c="undefined"!=typeof b?vb.defineLocale(a,b):vb.localeData(a),c&&(vb.duration._locale=vb._locale=c)),vb._locale._abbr},vb.defineLocale=function(a,b){return null!==b?(b.abbr=a,Jb[a]||(Jb[a]=new l),Jb[a].set(b),vb.locale(a),Jb[a]):(delete Jb[a],null)},vb.langData=f("moment.langData is deprecated. Use moment.localeData instead.",function(a){return vb.localeData(a)}),vb.localeData=function(a){var b;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return vb._locale;if(!w(a)){if(b=L(a))return b;a=[a]}return K(a)},vb.isMoment=function(a){return a instanceof m||null!=a&&c(a,"_isAMomentObject")},vb.isDuration=function(a){return a instanceof n};for(xb=tc.length-1;xb>=0;--xb)B(tc[xb]);vb.normalizeUnits=function(a){return z(a)},vb.invalid=function(a){var b=vb.utc(0/0);return null!=a?o(b._pf,a):b._pf.userInvalidated=!0,b},vb.parseZone=function(){return vb.apply(null,arguments).parseZone()},vb.parseTwoDigitYear=function(a){return C(a)+(C(a)>68?1900:2e3)},vb.isDate=x,o(vb.fn=m.prototype,{clone:function(){return vb(this)},valueOf:function(){return+this._d-6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().locale("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=vb(this).utc();return 00:!1},parsingFlags:function(){return o({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(a){return this.utcOffset(0,a)},local:function(a){return this._isUTC&&(this.utcOffset(0,a),this._isUTC=!1,a&&this.subtract(this._dateUtcOffset(),"m")),this},format:function(a){var b=P(this,a||vb.defaultFormat);return this.localeData().postformat(b)},add:u(1,"add"),subtract:u(-1,"subtract"),diff:function(a,b,c){var d,e,f=M(a,this),g=6e4*(f.utcOffset()-this.utcOffset());return b=z(b),"year"===b||"month"===b||"quarter"===b?(e=j(this,f),"quarter"===b?e/=3:"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:q(e)},from:function(a,b){return vb.duration({to:this,from:a}).locale(this.locale()).humanize(!b)},fromNow:function(a){return this.from(vb(),a)},calendar:function(a){var b=a||vb(),c=M(b,this).startOf("day"),d=this.diff(c,"days",!0),e=-6>d?"sameElse":-1>d?"lastWeek":0>d?"lastDay":1>d?"sameDay":2>d?"nextDay":7>d?"nextWeek":"sameElse";return this.format(this.localeData().calendar(e,this,vb(b)))},isLeapYear:function(){return G(this.year())},isDST:function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},day:function(a){var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=gb(a,this.localeData()),this.add(a-b,"d")):b},month:qb("Month",!0),startOf:function(a){switch(a=z(a)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===a?this.weekday(0):"isoWeek"===a&&this.isoWeekday(1),"quarter"===a&&this.month(3*Math.floor(this.month()/3)),this},endOf:function(b){return b=z(b),b===a||"millisecond"===b?this:this.startOf(b).add(1,"isoWeek"===b?"week":b).subtract(1,"ms")},isAfter:function(a,b){var c;return b=z("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=vb.isMoment(a)?a:vb(a),+this>+a):(c=vb.isMoment(a)?+a:+vb(a),c<+this.clone().startOf(b))},isBefore:function(a,b){var c;return b=z("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=vb.isMoment(a)?a:vb(a),+a>+this):(c=vb.isMoment(a)?+a:+vb(a),+this.clone().endOf(b)a?this:a}),max:f("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(a){return a=vb.apply(null,arguments),a>this?this:a}),zone:f("moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779",function(a,b){return null!=a?("string"!=typeof a&&(a=-a),this.utcOffset(a,b),this):-this.utcOffset()}),utcOffset:function(a,b){var c,d=this._offset||0;return null!=a?("string"==typeof a&&(a=S(a)),Math.abs(a)<16&&(a=60*a),!this._isUTC&&b&&(c=this._dateUtcOffset()),this._offset=a,this._isUTC=!0,null!=c&&this.add(c,"m"),d!==a&&(!b||this._changeInProgress?v(this,vb.duration(a-d,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,vb.updateOffset(this,!0),this._changeInProgress=null)),this):this._isUTC?d:this._dateUtcOffset()},isLocal:function(){return!this._isUTC},isUtcOffset:function(){return this._isUTC},isUtc:function(){return this._isUTC&&0===this._offset},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.utcOffset(this._tzm):"string"==typeof this._i&&this.utcOffset(S(this._i)),this},hasAlignedHourOffset:function(a){return a=a?vb(a).utcOffset():0,(this.utcOffset()-a)%60===0},daysInMonth:function(){return D(this.year(),this.month())},dayOfYear:function(a){var b=Ab((vb(this).startOf("day")-vb(this).startOf("year"))/864e5)+1;return null==a?b:this.add(a-b,"d")},quarter:function(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)},weekYear:function(a){var b=jb(this,this.localeData()._week.dow,this.localeData()._week.doy).year;return null==a?b:this.add(a-b,"y")},isoWeekYear:function(a){var b=jb(this,1,4).year;return null==a?b:this.add(a-b,"y")},week:function(a){var b=this.localeData().week(this);return null==a?b:this.add(7*(a-b),"d")},isoWeek:function(a){var b=jb(this,1,4).week;return null==a?b:this.add(7*(a-b),"d")},weekday:function(a){var b=(this.day()+7-this.localeData()._week.dow)%7;return null==a?b:this.add(a-b,"d")},isoWeekday:function(a){return null==a?this.day()||7:this.day(this.day()%7?a:a-7)},isoWeeksInYear:function(){return E(this.year(),1,4)},weeksInYear:function(){var a=this.localeData()._week;return E(this.year(),a.dow,a.doy)},get:function(a){return a=z(a),this[a]()},set:function(a,b){var c;if("object"==typeof a)for(c in a)this.set(c,a[c]);else a=z(a),"function"==typeof this[a]&&this[a](b);return this},locale:function(b){var c;return b===a?this._locale._abbr:(c=vb.localeData(b),null!=c&&(this._locale=c),this)},lang:f("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(b){return b===a?this.localeData():this.locale(b)}),localeData:function(){return this._locale},_dateUtcOffset:function(){return 15*-Math.round(this._d.getTimezoneOffset()/15)}}),vb.fn.millisecond=vb.fn.milliseconds=qb("Milliseconds",!1),vb.fn.second=vb.fn.seconds=qb("Seconds",!1),vb.fn.minute=vb.fn.minutes=qb("Minutes",!1),vb.fn.hour=vb.fn.hours=qb("Hours",!0),vb.fn.date=qb("Date",!0),vb.fn.dates=f("dates accessor is deprecated. Use date instead.",qb("Date",!0)),vb.fn.year=qb("FullYear",!0),vb.fn.years=f("years accessor is deprecated. Use year instead.",qb("FullYear",!0)),vb.fn.days=vb.fn.day,vb.fn.months=vb.fn.month,vb.fn.weeks=vb.fn.week,vb.fn.isoWeeks=vb.fn.isoWeek,vb.fn.quarters=vb.fn.quarter,vb.fn.toJSON=vb.fn.toISOString,vb.fn.isUTC=vb.fn.isUtc,o(vb.duration.fn=n.prototype,{_bubble:function(){var a,b,c,d=this._milliseconds,e=this._days,f=this._months,g=this._data,h=0;g.milliseconds=d%1e3,a=q(d/1e3),g.seconds=a%60,b=q(a/60),g.minutes=b%60,c=q(b/60),g.hours=c%24,e+=q(c/24),h=q(rb(e)),e-=q(sb(h)),f+=q(e/30),e%=30,h+=q(f/12),f%=12,g.days=e,g.months=f,g.years=h},abs:function(){return this._milliseconds=Math.abs(this._milliseconds),this._days=Math.abs(this._days),this._months=Math.abs(this._months),this._data.milliseconds=Math.abs(this._data.milliseconds),this._data.seconds=Math.abs(this._data.seconds),this._data.minutes=Math.abs(this._data.minutes),this._data.hours=Math.abs(this._data.hours),this._data.months=Math.abs(this._data.months),this._data.years=Math.abs(this._data.years),this},weeks:function(){return q(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*C(this._months/12) +},humanize:function(a){var b=ib(this,!a,this.localeData());return a&&(b=this.localeData().pastFuture(+this,b)),this.localeData().postformat(b)},add:function(a,b){var c=vb.duration(a,b);return this._milliseconds+=c._milliseconds,this._days+=c._days,this._months+=c._months,this._bubble(),this},subtract:function(a,b){var c=vb.duration(a,b);return this._milliseconds-=c._milliseconds,this._days-=c._days,this._months-=c._months,this._bubble(),this},get:function(a){return a=z(a),this[a.toLowerCase()+"s"]()},as:function(a){var b,c;if(a=z(a),"month"===a||"year"===a)return b=this._days+this._milliseconds/864e5,c=this._months+12*rb(b),"month"===a?c:c/12;switch(b=this._days+Math.round(sb(this._months/12)),a){case"week":return b/7+this._milliseconds/6048e5;case"day":return b+this._milliseconds/864e5;case"hour":return 24*b+this._milliseconds/36e5;case"minute":return 24*b*60+this._milliseconds/6e4;case"second":return 24*b*60*60+this._milliseconds/1e3;case"millisecond":return Math.floor(24*b*60*60*1e3)+this._milliseconds;default:throw new Error("Unknown unit "+a)}},lang:vb.fn.lang,locale:vb.fn.locale,toIsoString:f("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",function(){return this.toISOString()}),toISOString:function(){var a=Math.abs(this.years()),b=Math.abs(this.months()),c=Math.abs(this.days()),d=Math.abs(this.hours()),e=Math.abs(this.minutes()),f=Math.abs(this.seconds()+this.milliseconds()/1e3);return this.asSeconds()?(this.asSeconds()<0?"-":"")+"P"+(a?a+"Y":"")+(b?b+"M":"")+(c?c+"D":"")+(d||e||f?"T":"")+(d?d+"H":"")+(e?e+"M":"")+(f?f+"S":""):"P0D"},localeData:function(){return this._locale},toJSON:function(){return this.toISOString()}}),vb.duration.fn.toString=vb.duration.fn.toISOString;for(xb in kc)c(kc,xb)&&tb(xb.toLowerCase());vb.duration.fn.asMilliseconds=function(){return this.as("ms")},vb.duration.fn.asSeconds=function(){return this.as("s")},vb.duration.fn.asMinutes=function(){return this.as("m")},vb.duration.fn.asHours=function(){return this.as("h")},vb.duration.fn.asDays=function(){return this.as("d")},vb.duration.fn.asWeeks=function(){return this.as("weeks")},vb.duration.fn.asMonths=function(){return this.as("M")},vb.duration.fn.asYears=function(){return this.as("y")},vb.locale("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var b=a%10,c=1===C(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}),function(a){a(vb)}(function(a){return a.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(a){return/^nm$/i.test(a)},meridiem:function(a,b,c){return 12>a?c?"vm":"VM":c?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[Môre om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("ar-ma",{months:"يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:6,doy:12}})}),function(a){a(vb)}(function(a){var b={1:"Ù¡",2:"Ù¢",3:"Ù£",4:"Ù¤",5:"Ù¥",6:"Ù¦",7:"Ù§",8:"Ù¨",9:"Ù©",0:"Ù "},c={"Ù¡":"1","Ù¢":"2","Ù£":"3","Ù¤":"4","Ù¥":"5","Ù¦":"6","Ù§":"7","Ù¨":"8","Ù©":"9","Ù ":"0"};return a.defineLocale("ar-sa",{months:"يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),monthsShort:"يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiemParse:/ص|Ù…/,isPM:function(a){return"Ù…"===a},meridiem:function(a){return 12>a?"ص":"Ù…"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(a){return a.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(a){return c[a]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]}).replace(/,/g,"ØŒ")},week:{dow:6,doy:12}})}),function(a){a(vb)}(function(a){return a.defineLocale("ar-tn",{months:"جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),monthsShort:"جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){var b={1:"Ù¡",2:"Ù¢",3:"Ù£",4:"Ù¤",5:"Ù¥",6:"Ù¦",7:"Ù§",8:"Ù¨",9:"Ù©",0:"Ù "},c={"Ù¡":"1","Ù¢":"2","Ù£":"3","Ù¤":"4","Ù¥":"5","Ù¦":"6","Ù§":"7","Ù¨":"8","Ù©":"9","Ù ":"0"},d=function(a){return 0===a?0:1===a?1:2===a?2:a%100>=3&&10>=a%100?3:a%100>=11?4:5},e={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},f=function(a){return function(b,c){var f=d(b),g=e[a][d(b)];return 2===f&&(g=g[c?0:1]),g.replace(/%d/i,b)}},g=["كانون الثاني يناير","شباط Ùبراير","آذار مارس","نيسان أبريل","أيار مايو","حزيران يونيو","تموز يوليو","آب أغسطس","أيلول سبتمبر","تشرين الأول أكتوبر","تشرين الثاني نوÙمبر","كانون الأول ديسمبر"];return a.defineLocale("ar",{months:g,monthsShort:g,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiemParse:/ص|Ù…/,isPM:function(a){return"Ù…"===a},meridiem:function(a){return 12>a?"ص":"Ù…"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:f("s"),m:f("m"),mm:f("m"),h:f("h"),hh:f("h"),d:f("d"),dd:f("d"),M:f("M"),MM:f("M"),y:f("y"),yy:f("y")},preparse:function(a){return a.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(a){return c[a]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]}).replace(/,/g,"ØŒ")},week:{dow:6,doy:12}})}),function(a){a(vb)}(function(a){var b={1:"-inci",5:"-inci",8:"-inci",70:"-inci",80:"-inci",2:"-nci",7:"-nci",20:"-nci",50:"-nci",3:"-üncü",4:"-üncü",100:"-üncü",6:"-ncı",9:"-uncu",10:"-uncu",30:"-uncu",60:"-ıncı",90:"-ıncı"};return a.defineLocale("az",{months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekdays:"Bazar_Bazar ertÉ™si_ÇərÅŸÉ™nbÉ™ axÅŸamı_ÇərÅŸÉ™nbÉ™_CümÉ™ axÅŸamı_CümÉ™_ŞənbÉ™".split("_"),weekdaysShort:"Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən".split("_"),weekdaysMin:"Bz_BE_ÇA_Çə_CA_Cü_Şə".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[sabah saat] LT",nextWeek:"[gÉ™lÉ™n hÉ™ftÉ™] dddd [saat] LT",lastDay:"[dünÉ™n] LT",lastWeek:"[keçən hÉ™ftÉ™] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s É™vvÉ™l",s:"birneçə saniyyÉ™",m:"bir dÉ™qiqÉ™",mm:"%d dÉ™qiqÉ™",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},meridiemParse:/gecÉ™|sÉ™hÉ™r|gündüz|axÅŸam/,isPM:function(a){return/^(gündüz|axÅŸam)$/.test(a)},meridiem:function(a){return 4>a?"gecÉ™":12>a?"sÉ™hÉ™r":17>a?"gündüz":"axÅŸam"},ordinalParse:/\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,ordinal:function(a){if(0===a)return a+"-ıncı";var c=a%10,d=a%100-c,e=a>=100?100:null;return a+(b[c]||b[d]||b[e])},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){function b(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:c?"хвіліна_хвіліны_хвілін":"хвіліну_хвіліны_хвілін",hh:c?"гадзіна_гадзіны_гадзін":"гадзіну_гадзіны_гадзін",dd:"дзень_дні_дзён",MM:"меÑÑц_меÑÑцы_меÑÑцаў",yy:"год_гады_гадоў"};return"m"===d?c?"хвіліна":"хвіліну":"h"===d?c?"гадзіна":"гадзіну":a+" "+b(e[d],+a)}function d(a,b){var c={nominative:"Ñтудзень_люты_Ñакавік_краÑавік_травень_чÑрвень_ліпень_жнівень_вераÑень_каÑтрычнік_ліÑтапад_Ñнежань".split("_"),accusative:"ÑтудзенÑ_лютага_Ñакавіка_краÑавіка_траўнÑ_чÑрвенÑ_ліпенÑ_жніўнÑ_вераÑнÑ_каÑтрычніка_ліÑтапада_ÑнежнÑ".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function e(a,b){var c={nominative:"нÑдзелÑ_панÑдзелак_аўторак_Ñерада_чацвер_пÑтніца_Ñубота".split("_"),accusative:"нÑдзелю_панÑдзелак_аўторак_Ñераду_чацвер_пÑтніцу_Ñуботу".split("_")},d=/\[ ?[Вв] ?(?:мінулую|наÑтупную)? ?\] ?dddd/.test(b)?"accusative":"nominative";return c[d][a.day()]}return a.defineLocale("be",{months:d,monthsShort:"Ñтуд_лют_Ñак_краÑ_трав_чÑрв_ліп_жнів_вер_каÑÑ‚_ліÑÑ‚_Ñнеж".split("_"),weekdays:e,weekdaysShort:"нд_пн_ат_ÑÑ€_чц_пт_Ñб".split("_"),weekdaysMin:"нд_пн_ат_ÑÑ€_чц_пт_Ñб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., LT",LLLL:"dddd, D MMMM YYYY г., LT"},calendar:{sameDay:"[Ð¡Ñ‘Ð½Ð½Ñ Ñž] LT",nextDay:"[Заўтра Ñž] LT",lastDay:"[Учора Ñž] LT",nextWeek:function(){return"[У] dddd [Ñž] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[У мінулую] dddd [Ñž] LT";case 1:case 2:case 4:return"[У мінулы] dddd [Ñž] LT"}},sameElse:"L"},relativeTime:{future:"праз %s",past:"%s таму",s:"некалькі Ñекунд",m:c,mm:c,h:c,hh:c,d:"дзень",dd:c,M:"меÑÑц",MM:c,y:"год",yy:c},meridiemParse:/ночы|раніцы|днÑ|вечара/,isPM:function(a){return/^(днÑ|вечара)$/.test(a)},meridiem:function(a){return 4>a?"ночы":12>a?"раніцы":17>a?"днÑ":"вечара"},ordinalParse:/\d{1,2}-(Ñ–|Ñ‹|га)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":case"w":case"W":return a%10!==2&&a%10!==3||a%100===12||a%100===13?a+"-Ñ‹":a+"-Ñ–";case"D":return a+"-га";default:return a}},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("bg",{months:"Ñнуари_февруари_март_април_май_юни_юли_авгуÑÑ‚_Ñептември_октомври_ноември_декември".split("_"),monthsShort:"Ñнр_фев_мар_апр_май_юни_юли_авг_Ñеп_окт_ное_дек".split("_"),weekdays:"неделÑ_понеделник_вторник_ÑÑ€Ñда_четвъртък_петък_Ñъбота".split("_"),weekdaysShort:"нед_пон_вто_ÑÑ€Ñ_чет_пет_Ñъб".split("_"),weekdaysMin:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Ð”Ð½ÐµÑ Ð²] LT",nextDay:"[Утре в] LT",nextWeek:"dddd [в] LT",lastDay:"[Вчера в] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Ð’ изминалата] dddd [в] LT";case 1:case 2:case 4:case 5:return"[Ð’ изминалиÑ] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"Ñлед %s",past:"преди %s",s:"нÑколко Ñекунди",m:"минута",mm:"%d минути",h:"чаÑ",hh:"%d чаÑа",d:"ден",dd:"%d дни",M:"меÑец",MM:"%d меÑеца",y:"година",yy:"%d години"},ordinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(a){var b=a%10,c=a%100;return 0===a?a+"-ев":0===c?a+"-ен":c>10&&20>c?a+"-ти":1===b?a+"-ви":2===b?a+"-ри":7===b||8===b?a+"-ми":a+"-ти"},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){var b={1:"১",2:"২",3:"৩",4:"৪",5:"৫",6:"৬",7:"৭",8:"৮",9:"৯",0:"০"},c={"১":"1","২":"2","৩":"3","৪":"4","৫":"5","৬":"6","৭":"7","৮":"8","৯":"9","০":"0"};return a.defineLocale("bn",{months:"জানà§à§Ÿà¦¾à¦°à§€_ফেবà§à§Ÿà¦¾à¦°à§€_মারà§à¦š_à¦à¦ªà§à¦°à¦¿à¦²_মে_জà§à¦¨_জà§à¦²à¦¾à¦‡_অগাসà§à¦Ÿ_সেপà§à¦Ÿà§‡à¦®à§à¦¬à¦°_অকà§à¦Ÿà§‹à¦¬à¦°_নভেমà§à¦¬à¦°_ডিসেমà§à¦¬à¦°".split("_"),monthsShort:"জানà§_ফেব_মারà§à¦š_à¦à¦ªà¦°_মে_জà§à¦¨_জà§à¦²_অগ_সেপà§à¦Ÿ_অকà§à¦Ÿà§‹_নভ_ডিসেমà§".split("_"),weekdays:"রবিবার_সোমবার_মঙà§à¦—লবার_বà§à¦§à¦¬à¦¾à¦°_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿à¦¬à¦¾à¦°_শà§à¦•à§à¦°à§à¦¬à¦¾à¦°_শনিবার".split("_"),weekdaysShort:"রবি_সোম_মঙà§à¦—ল_বà§à¦§_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿_শà§à¦•à§à¦°à§_শনি".split("_"),weekdaysMin:"রব_সম_মঙà§à¦—_বà§_বà§à¦°à¦¿à¦¹_শà§_শনি".split("_"),longDateFormat:{LT:"A h:mm সময়",LTS:"A h:mm:ss সময়",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[আজ] LT",nextDay:"[আগামীকাল] LT",nextWeek:"dddd, LT",lastDay:"[গতকাল] LT",lastWeek:"[গত] dddd, LT",sameElse:"L"},relativeTime:{future:"%s পরে",past:"%s আগে",s:"কà¦à¦• সেকেনà§à¦¡",m:"à¦à¦• মিনিট",mm:"%d মিনিট",h:"à¦à¦• ঘনà§à¦Ÿà¦¾",hh:"%d ঘনà§à¦Ÿà¦¾",d:"à¦à¦• দিন",dd:"%d দিন",M:"à¦à¦• মাস",MM:"%d মাস",y:"à¦à¦• বছর",yy:"%d বছর"},preparse:function(a){return a.replace(/[১২৩৪৫৬৭৮৯০]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/রাত|শকাল|দà§à¦ªà§à¦°|বিকেল|রাত/,isPM:function(a){return/^(দà§à¦ªà§à¦°|বিকেল|রাত)$/.test(a)},meridiem:function(a){return 4>a?"রাত":10>a?"শকাল":17>a?"দà§à¦ªà§à¦°":20>a?"বিকেল":"রাত"},week:{dow:0,doy:6}})}),function(a){a(vb)}(function(a){var b={1:"༡",2:"༢",3:"༣",4:"༤",5:"༥",6:"༦",7:"༧",8:"༨",9:"༩",0:"༠"},c={"༡":"1","༢":"2","༣":"3","༤":"4","༥":"5","༦":"6","༧":"7","༨":"8","༩":"9","༠":"0"};return a.defineLocale("bo",{months:"ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ".split("_"),monthsShort:"ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ".split("_"),weekdays:"གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་".split("_"),weekdaysShort:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),weekdaysMin:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),longDateFormat:{LT:"A h:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[དི་རིང] LT",nextDay:"[སང་ཉིན] LT",nextWeek:"[བདུན་ཕྲག་རྗེས་མ], LT",lastDay:"[à½à¼‹à½¦à½„] LT",lastWeek:"[བདུན་ཕྲག་མà½à½ à¼‹à½˜] dddd, LT",sameElse:"L"},relativeTime:{future:"%s ལ་",past:"%s སྔན་ལ",s:"ལམ་སང",m:"སà¾à½¢à¼‹à½˜à¼‹à½‚ཅིག",mm:"%d སà¾à½¢à¼‹à½˜",h:"ཆུ་ཚོད་གཅིག",hh:"%d ཆུ་ཚོད",d:"ཉིན་གཅིག",dd:"%d ཉིན་",M:"ཟླ་བ་གཅིག",MM:"%d ཟླ་བ",y:"ལོ་གཅིག",yy:"%d ལོ"},preparse:function(a){return a.replace(/[༡༢༣༤༥༦༧༨༩༠]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,isPM:function(a){return/^(ཉིན་གུང|དགོང་དག|མཚན་མོ)$/.test(a)},meridiem:function(a){return 4>a?"མཚན་མོ":10>a?"ཞོགས་ཀས":17>a?"ཉིན་གུང":20>a?"དགོང་དག":"མཚན་མོ"},week:{dow:0,doy:6}})}),function(a){a(vb)}(function(b){function c(a,b,c){var d={mm:"munutenn",MM:"miz",dd:"devezh"};return a+" "+f(d[c],a)}function d(a){switch(e(a)){case 1:case 3:case 4:case 5:case 9:return a+" bloaz";default:return a+" vloaz"}}function e(a){return a>9?e(a%10):a}function f(a,b){return 2===b?g(a):a}function g(b){var c={m:"v",b:"v",d:"z"};return c[b.charAt(0)]===a?b:c[b.charAt(0)]+b.substring(1)}return b.defineLocale("br",{months:"Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),longDateFormat:{LT:"h[e]mm A",LTS:"h[e]mm:ss A",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY LT",LLLL:"dddd, D [a viz] MMMM YYYY LT"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc'hoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec'h da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s 'zo",s:"un nebeud segondennoù",m:"ur vunutenn",mm:c,h:"un eur",hh:"%d eur",d:"un devezh",dd:c,M:"ur miz",MM:c,y:"ur bloaz",yy:d},ordinalParse:/\d{1,2}(añ|vet)/,ordinal:function(a){var b=1===a?"añ":"vet";return a+b},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d=a+" ";switch(c){case"m":return b?"jedna minuta":"jedne minute";case"mm":return d+=1===a?"minuta":2===a||3===a||4===a?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return d+=1===a?"sat":2===a||3===a||4===a?"sata":"sati";case"dd":return d+=1===a?"dan":"dana";case"MM":return d+=1===a?"mjesec":2===a||3===a||4===a?"mjeseca":"mjeseci";case"yy":return d+=1===a?"godina":2===a||3===a||4===a?"godine":"godina"}}return a.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),weekdays:"nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._Äet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_Äe_pe_su".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[proÅ¡lu] dddd [u] LT";case 6:return"[proÅ¡le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[proÅ¡li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:b,mm:b,h:b,hh:b,d:"dan",dd:b,M:"mjesec",MM:b,y:"godinu",yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("ca",{months:"gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),monthsShort:"gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.".split("_"),weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[demà a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"fa %s",s:"uns segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},ordinalParse:/\d{1,2}(r|n|t|è|a)/,ordinal:function(a,b){var c=1===a?"r":2===a?"n":3===a?"r":4===a?"t":"è";return("w"===b||"W"===b)&&(c="a"),a+c},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a){return a>1&&5>a&&1!==~~(a/10)}function c(a,c,d,e){var f=a+" ";switch(d){case"s":return c||e?"pár sekund":"pár sekundami";case"m":return c?"minuta":e?"minutu":"minutou";case"mm":return c||e?f+(b(a)?"minuty":"minut"):f+"minutami";break;case"h":return c?"hodina":e?"hodinu":"hodinou";case"hh":return c||e?f+(b(a)?"hodiny":"hodin"):f+"hodinami";break;case"d":return c||e?"den":"dnem";case"dd":return c||e?f+(b(a)?"dny":"dní"):f+"dny";break;case"M":return c||e?"mÄ›síc":"mÄ›sícem";case"MM":return c||e?f+(b(a)?"mÄ›síce":"mÄ›síců"):f+"mÄ›síci";break;case"y":return c||e?"rok":"rokem";case"yy":return c||e?f+(b(a)?"roky":"let"):f+"lety"}}var d="leden_únor_bÅ™ezen_duben_kvÄ›ten_Äerven_Äervenec_srpen_září_říjen_listopad_prosinec".split("_"),e="led_úno_bÅ™e_dub_kvÄ›_Ävn_Ävc_srp_zář_říj_lis_pro".split("_");return a.defineLocale("cs",{months:d,monthsShort:e,monthsParse:function(a,b){var c,d=[];for(c=0;12>c;c++)d[c]=new RegExp("^"+a[c]+"$|^"+b[c]+"$","i");return d}(d,e),weekdays:"nedÄ›le_pondÄ›lí_úterý_stÅ™eda_Ätvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_Ät_pá_so".split("_"),weekdaysMin:"ne_po_út_st_Ät_pá_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedÄ›li v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve stÅ™edu v] LT";case 4:return"[ve Ätvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[vÄera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou nedÄ›li v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou stÅ™edu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pÅ™ed %s",s:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("cv",{months:"кăрлач_нарăÑ_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав".split("_"),monthsShort:"кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш".split("_"),weekdays:"вырÑарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_Ñрнекун_шăматкун".split("_"),weekdaysShort:"выр_тун_ытл_юн_кĕç_Ñрн_шăм".split("_"),weekdaysMin:"вр_тн_Ñ‹Ñ‚_юн_кç_ÑÑ€_шм".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD-MM-YYYY",LL:"YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]",LLL:"YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT",LLLL:"dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT"},calendar:{sameDay:"[ПаÑн] LT [Ñехетре]",nextDay:"[Ыран] LT [Ñехетре]",lastDay:"[Ĕнер] LT [Ñехетре]",nextWeek:"[ÇитеÑ] dddd LT [Ñехетре]",lastWeek:"[Иртнĕ] dddd LT [Ñехетре]",sameElse:"L"},relativeTime:{future:function(a){var b=/Ñехет$/i.exec(a)?"рен":/çул$/i.exec(a)?"тан":"ран";return a+b},past:"%s каÑлла",s:"пĕр-ик çеккунт",m:"пĕр минут",mm:"%d минут",h:"пĕр Ñехет",hh:"%d Ñехет",d:"пĕр кун",dd:"%d кун",M:"пĕр уйăх",MM:"%d уйăх",y:"пĕр çул",yy:"%d çул"},ordinalParse:/\d{1,2}-мĕш/,ordinal:"%d-мĕш",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("cy",{months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Heddiw am] LT",nextDay:"[Yfory am] LT",nextWeek:"dddd [am] LT",lastDay:"[Ddoe am] LT",lastWeek:"dddd [diwethaf am] LT",sameElse:"L"},relativeTime:{future:"mewn %s",past:"%s yn ôl",s:"ychydig eiliadau",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"},ordinalParse:/\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,ordinal:function(a){var b=a,c="",d=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"];return b>20?c=40===b||50===b||60===b||80===b||100===b?"fed":"ain":b>0&&(c=d[b]),a+c},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd [d.] D. MMMM YYYY LT"},calendar:{sameDay:"[I dag kl.] LT",nextDay:"[I morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[I gÃ¥r kl.] LT",lastWeek:"[sidste] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"fÃ¥ sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en mÃ¥ned",MM:"%d mÃ¥neder",y:"et Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[a+" Tage",a+" Tagen"],M:["ein Monat","einem Monat"],MM:[a+" Monate",a+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[a+" Jahre",a+" Jahren"]};return b?d[c][0]:d[c][1]}return a.defineLocale("de-at",{months:"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT [Uhr]",sameElse:"L",nextDay:"[Morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[Gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:b,mm:"%d Minuten",h:b,hh:"%d Stunden",d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[a+" Tage",a+" Tagen"],M:["ein Monat","einem Monat"],MM:[a+" Monate",a+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[a+" Jahre",a+" Jahren"]};return b?d[c][0]:d[c][1]}return a.defineLocale("de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT [Uhr]",sameElse:"L",nextDay:"[Morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[Gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:b,mm:"%d Minuten",h:b,hh:"%d Stunden",d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("el",{monthsNominativeEl:"ΙανουάÏιος_ΦεβÏουάÏιος_ΜάÏτιος_ΑπÏίλιος_Μάιος_ΙοÏνιος_ΙοÏλιος_ΑÏγουστος_ΣεπτέμβÏιος_ΟκτώβÏιος_ÎοέμβÏιος_ΔεκέμβÏιος".split("_"),monthsGenitiveEl:"ΙανουαÏίου_ΦεβÏουαÏίου_ΜαÏτίου_ΑπÏιλίου_ΜαÎου_Ιουνίου_Ιουλίου_ΑυγοÏστου_ΣεπτεμβÏίου_ΟκτωβÏίου_ÎοεμβÏίου_ΔεκεμβÏίου".split("_"),months:function(a,b){return/D/.test(b.substring(0,b.indexOf("MMMM")))?this._monthsGenitiveEl[a.month()]:this._monthsNominativeEl[a.month()]},monthsShort:"Ιαν_Φεβ_ΜαÏ_ΑπÏ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Îοε_Δεκ".split("_"),weekdays:"ΚυÏιακή_ΔευτέÏα_ΤÏίτη_ΤετάÏτη_Πέμπτη_ΠαÏασκευή_Σάββατο".split("_"),weekdaysShort:"ΚυÏ_Δευ_ΤÏι_Τετ_Πεμ_ΠαÏ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_ΤÏ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(a,b,c){return a>11?c?"μμ":"ΜΜ":c?"πμ":"ΠΜ"},isPM:function(a){return"μ"===(a+"").toLowerCase()[0]},meridiemParse:/[ΠΜ]\.?Îœ?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendarEl:{sameDay:"[ΣήμεÏα {}] LT",nextDay:"[ΑÏÏιο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[το Ï€ÏοηγοÏμενο] dddd [{}] LT";default:return"[την Ï€ÏοηγοÏμενη] dddd [{}] LT"}},sameElse:"L"},calendar:function(a,b){var c=this._calendarEl[a],d=b&&b.hours();return"function"==typeof c&&(c=c.apply(b)),c.replace("{}",d%12===1?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s Ï€Ïιν",s:"λίγα δευτεÏόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ÏŽÏα",hh:"%d ÏŽÏες",d:"μία μέÏα",dd:"%d μέÏες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χÏόνος",yy:"%d χÏόνια"},ordinalParse:/\d{1,2}η/,ordinal:"%dη",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},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"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"D MMMM, YYYY",LLL:"D MMMM, YYYY LT",LLLL:"dddd, D MMMM, YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},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"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th"; +return a+c}})}),function(a){a(vb)}(function(a){return a.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},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"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_aÅ­gusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aÅ­g_sep_okt_nov_dec".split("_"),weekdays:"Dimanĉo_Lundo_Mardo_Merkredo_Ä´aÅ­do_Vendredo_Sabato".split("_"),weekdaysShort:"Dim_Lun_Mard_Merk_Ä´aÅ­_Ven_Sab".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Ä´a_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"D[-an de] MMMM, YYYY",LLL:"D[-an de] MMMM, YYYY LT",LLLL:"dddd, [la] D[-an de] MMMM, YYYY LT"},meridiemParse:/[ap]\.t\.m/i,isPM:function(a){return"p"===a.charAt(0).toLowerCase()},meridiem:function(a,b,c){return a>11?c?"p.t.m.":"P.T.M.":c?"a.t.m.":"A.T.M."},calendar:{sameDay:"[HodiaÅ­ je] LT",nextDay:"[MorgaÅ­ je] LT",nextWeek:"dddd [je] LT",lastDay:"[HieraÅ­ je] LT",lastWeek:"[pasinta] dddd [je] LT",sameElse:"L"},relativeTime:{future:"je %s",past:"antaÅ­ %s",s:"sekundoj",m:"minuto",mm:"%d minutoj",h:"horo",hh:"%d horoj",d:"tago",dd:"%d tagoj",M:"monato",MM:"%d monatoj",y:"jaro",yy:"%d jaroj"},ordinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){var b="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),c="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");return a.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(a,d){return/-MMM-/.test(d)?c[a.month()]:b[a.month()]},weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c,d){var e={s:["mõne sekundi","mõni sekund","paar sekundit"],m:["ühe minuti","üks minut"],mm:[a+" minuti",a+" minutit"],h:["ühe tunni","tund aega","üks tund"],hh:[a+" tunni",a+" tundi"],d:["ühe päeva","üks päev"],M:["kuu aja","kuu aega","üks kuu"],MM:[a+" kuu",a+" kuud"],y:["ühe aasta","aasta","üks aasta"],yy:[a+" aasta",a+" aastat"]};return b?e[c][2]?e[c][2]:e[c][1]:d?e[c][0]:e[c][1]}return a.defineLocale("et",{months:"jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Täna,] LT",nextDay:"[Homme,] LT",nextWeek:"[Järgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s pärast",past:"%s tagasi",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:"%d päeva",M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] LT",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] LT",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] LT",llll:"ddd, YYYY[ko] MMM D[a] LT"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){var b={1:"Û±",2:"Û²",3:"Û³",4:"Û´",5:"Ûµ",6:"Û¶",7:"Û·",8:"Û¸",9:"Û¹",0:"Û°"},c={"Û±":"1","Û²":"2","Û³":"3","Û´":"4","Ûµ":"5","Û¶":"6","Û·":"7","Û¸":"8","Û¹":"9","Û°":"0"};return a.defineLocale("fa",{months:"ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ÛŒ_د_س_Ú†_Ù¾_ج_Ø´".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},meridiemParse:/قبل از ظهر|بعد از ظهر/,isPM:function(a){return/بعد از ظهر/.test(a)},meridiem:function(a){return 12>a?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[Ùردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چندین ثانیه",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(a){return a.replace(/[Û°-Û¹]/g,function(a){return c[a]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]}).replace(/,/g,"ØŒ")},ordinalParse:/\d{1,2}Ù…/,ordinal:"%dÙ…",week:{dow:6,doy:12}})}),function(a){a(vb)}(function(a){function b(a,b,d,e){var f="";switch(d){case"s":return e?"muutaman sekunnin":"muutama sekunti";case"m":return e?"minuutin":"minuutti";case"mm":f=e?"minuutin":"minuuttia";break;case"h":return e?"tunnin":"tunti";case"hh":f=e?"tunnin":"tuntia";break;case"d":return e?"päivän":"päivä";case"dd":f=e?"päivän":"päivää";break;case"M":return e?"kuukauden":"kuukausi";case"MM":f=e?"kuukauden":"kuukautta";break;case"y":return e?"vuoden":"vuosi";case"yy":f=e?"vuoden":"vuotta"}return f=c(a,e)+" "+f}function c(a,b){return 10>a?b?e[a]:d[a]:a}var d="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),e=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",d[7],d[8],d[9]];return a.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] LT",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] LT",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] LT",llll:"ddd, Do MMM YYYY, [klo] LT"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("fo",{months:"januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur".split("_"),weekdaysShort:"sun_mán_týs_mik_hós_frí_ley".split("_"),weekdaysMin:"su_má_tý_mi_hó_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D. MMMM, YYYY LT"},calendar:{sameDay:"[à dag kl.] LT",nextDay:"[à morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[à gjár kl.] LT",lastWeek:"[síðstu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s síðani",s:"fá sekund",m:"ein minutt",mm:"%d minuttir",h:"ein tími",hh:"%d tímar",d:"ein dagur",dd:"%d dagar",M:"ein mánaði",MM:"%d mánaðir",y:"eitt ár",yy:"%d ár"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|)/,ordinal:function(a){return a+(1===a?"er":"")}})}),function(a){a(vb)}(function(a){return a.defineLocale("fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|)/,ordinal:function(a){return a+(1===a?"er":"")},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){var b="jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.".split("_"),c="jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_");return a.defineLocale("fy",{months:"jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber".split("_"),monthsShort:function(a,d){return/-MMM-/.test(d)?c[a.month()]:b[a.month()]},weekdays:"snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon".split("_"),weekdaysShort:"si._mo._ti._wo._to._fr._so.".split("_"),weekdaysMin:"Si_Mo_Ti_Wo_To_Fr_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[hjoed om] LT",nextDay:"[moarn om] LT",nextWeek:"dddd [om] LT",lastDay:"[juster om] LT",lastWeek:"[ôfrûne] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oer %s",past:"%s lyn",s:"in pear sekonden",m:"ien minút",mm:"%d minuten",h:"ien oere",hh:"%d oeren",d:"ien dei",dd:"%d dagen",M:"ien moanne",MM:"%d moannen",y:"ien jier",yy:"%d jierren"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("gl",{months:"Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro".split("_"),monthsShort:"Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.".split("_"),weekdays:"Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado".split("_"),weekdaysShort:"Dom._Lun._Mar._Mér._Xov._Ven._Sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mé_Xo_Ve_Sá".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"ás":"á")+"] LT"},nextDay:function(){return"[mañá "+(1!==this.hours()?"ás":"á")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"ás":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"á":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"ás":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(a){return"uns segundos"===a?"nuns segundos":"en "+a},past:"hai %s",s:"uns segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("he",{months:"ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר".split("_"),monthsShort:"ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳".split("_"),weekdays:"ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),weekdaysShort:"×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),weekdaysMin:"×_ב_×’_ד_×”_ו_ש".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY LT",LLLL:"dddd, D [ב]MMMM YYYY LT",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY LT",llll:"ddd, D MMM YYYY LT"},calendar:{sameDay:"[×”×™×•× ×‘Ö¾]LT",nextDay:"[מחר ב־]LT",nextWeek:"dddd [בשעה] LT",lastDay:"[×תמול ב־]LT",lastWeek:"[ביו×] dddd [×”×חרון בשעה] LT",sameElse:"L"},relativeTime:{future:"בעוד %s",past:"לפני %s",s:"מספר שניות",m:"דקה",mm:"%d דקות",h:"שעה",hh:function(a){return 2===a?"שעתיי×":a+" שעות"},d:"יו×",dd:function(a){return 2===a?"יומיי×":a+" ימי×"},M:"חודש",MM:function(a){return 2===a?"חודשיי×":a+" חודשי×"},y:"שנה",yy:function(a){return 2===a?"שנתיי×":a%10===0&&10!==a?a+" שנה":a+" שני×"}}})}),function(a){a(vb)}(function(a){var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return a.defineLocale("hi",{months:"जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°".split("_"),monthsShort:"जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.".split("_"),weekdays:"रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि".split("_"),weekdaysMin:"र_सो_मं_बà¥_गà¥_शà¥_श".split("_"),longDateFormat:{LT:"A h:mm बजे",LTS:"A h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कà¥à¤› ही कà¥à¤·à¤£",m:"à¤à¤• मिनट",mm:"%d मिनट",h:"à¤à¤• घंटा",hh:"%d घंटे",d:"à¤à¤• दिन",dd:"%d दिन",M:"à¤à¤• महीने",MM:"%d महीने",y:"à¤à¤• वरà¥à¤·",yy:"%d वरà¥à¤·"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/रात|सà¥à¤¬à¤¹|दोपहर|शाम/,meridiemHour:function(a,b){return 12===a&&(a=0),"रात"===b?4>a?a:a+12:"सà¥à¤¬à¤¹"===b?a:"दोपहर"===b?a>=10?a:a+12:"शाम"===b?a+12:void 0},meridiem:function(a){return 4>a?"रात":10>a?"सà¥à¤¬à¤¹":17>a?"दोपहर":20>a?"शाम":"रात"},week:{dow:0,doy:6}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d=a+" ";switch(c){case"m":return b?"jedna minuta":"jedne minute";case"mm":return d+=1===a?"minuta":2===a||3===a||4===a?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return d+=1===a?"sat":2===a||3===a||4===a?"sata":"sati";case"dd":return d+=1===a?"dan":"dana";case"MM":return d+=1===a?"mjesec":2===a||3===a||4===a?"mjeseca":"mjeseci";case"yy":return d+=1===a?"godina":2===a||3===a||4===a?"godine":"godina"}}return a.defineLocale("hr",{months:"sjeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_"),monthsShort:"sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),weekdays:"nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._Äet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_Äe_pe_su".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[proÅ¡lu] dddd [u] LT";case 6:return"[proÅ¡le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[proÅ¡li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:b,mm:b,h:b,hh:b,d:"dan",dd:b,M:"mjesec",MM:b,y:"godinu",yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){function b(a,b,c,d){var e=a;switch(c){case"s":return d||b?"néhány másodperc":"néhány másodperce";case"m":return"egy"+(d||b?" perc":" perce");case"mm":return e+(d||b?" perc":" perce");case"h":return"egy"+(d||b?" óra":" órája");case"hh":return e+(d||b?" óra":" órája");case"d":return"egy"+(d||b?" nap":" napja");case"dd":return e+(d||b?" nap":" napja");case"M":return"egy"+(d||b?" hónap":" hónapja");case"MM":return e+(d||b?" hónap":" hónapja");case"y":return"egy"+(d||b?" év":" éve");case"yy":return e+(d||b?" év":" éve")}return""}function c(a){return(a?"":"[múlt] ")+"["+d[this.day()]+"] LT[-kor]"}var d="vasárnap hétfÅ‘n kedden szerdán csütörtökön pénteken szombaton".split(" ");return a.defineLocale("hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfÅ‘_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D., LT",LLLL:"YYYY. MMMM D., dddd LT"},meridiemParse:/de|du/i,isPM:function(a){return"u"===a.charAt(1).toLowerCase()},meridiem:function(a,b,c){return 12>a?c===!0?"de":"DE":c===!0?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return c.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return c.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){function b(a,b){var c={nominative:"Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€_Õ´Õ¡Ö€Õ¿_Õ¡ÕºÖ€Õ«Õ¬_Õ´Õ¡ÕµÕ«Õ½_Õ°Õ¸Ö‚Õ¶Õ«Õ½_Õ°Õ¸Ö‚Õ¬Õ«Õ½_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€".split("_"),accusative:"Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€Õ«_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€Õ«_Õ´Õ¡Ö€Õ¿Õ«_Õ¡ÕºÖ€Õ«Õ¬Õ«_Õ´Õ¡ÕµÕ«Õ½Õ«_Õ°Õ¸Ö‚Õ¶Õ«Õ½Õ«_Õ°Õ¸Ö‚Õ¬Õ«Õ½Õ«_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½Õ«_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function c(a){var b="Õ°Õ¶Õ¾_ÖƒÕ¿Ö€_Õ´Ö€Õ¿_Õ¡ÕºÖ€_Õ´ÕµÕ½_Õ°Õ¶Õ½_Õ°Õ¬Õ½_Ö…Õ£Õ½_Õ½ÕºÕ¿_Õ°Õ¯Õ¿_Õ¶Õ´Õ¢_Õ¤Õ¯Õ¿".split("_");return b[a.month()]}function d(a){var b="Õ¯Õ«Ö€Õ¡Õ¯Õ«_Õ¥Ö€Õ¯Õ¸Ö‚Õ·Õ¡Õ¢Õ©Õ«_Õ¥Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ¹Õ¸Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ°Õ«Õ¶Õ£Õ·Õ¡Õ¢Õ©Õ«_Õ¸Ö‚Ö€Õ¢Õ¡Õ©_Õ·Õ¡Õ¢Õ¡Õ©".split("_");return b[a.day()]}return a.defineLocale("hy-am",{months:b,monthsShort:c,weekdays:d,weekdaysShort:"Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©".split("_"),weekdaysMin:"Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY Õ©.",LLL:"D MMMM YYYY Õ©., LT",LLLL:"dddd, D MMMM YYYY Õ©., LT"},calendar:{sameDay:"[Õ¡ÕµÕ½Ö…Ö€] LT",nextDay:"[Õ¾Õ¡Õ²Õ¨] LT",lastDay:"[Õ¥Ö€Õ¥Õ¯] LT",nextWeek:function(){return"dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT"},lastWeek:function(){return"[Õ¡Õ¶ÖÕ¡Õ®] dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT"},sameElse:"L"},relativeTime:{future:"%s Õ°Õ¥Õ¿Õ¸",past:"%s Õ¡Õ¼Õ¡Õ»",s:"Õ´Õ« Ö„Õ¡Õ¶Õ« Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶",m:"Ö€Õ¸ÕºÕ¥",mm:"%d Ö€Õ¸ÕºÕ¥",h:"ÕªÕ¡Õ´",hh:"%d ÕªÕ¡Õ´",d:"Ö…Ö€",dd:"%d Ö…Ö€",M:"Õ¡Õ´Õ«Õ½",MM:"%d Õ¡Õ´Õ«Õ½",y:"Õ¿Õ¡Ö€Õ«",yy:"%d Õ¿Õ¡Ö€Õ«"},meridiemParse:/Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡|Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡|ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶/,isPM:function(a){return/^(ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶)$/.test(a)},meridiem:function(a){return 4>a?"Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡":12>a?"Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡":17>a?"ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡":"Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶"},ordinalParse:/\d{1,2}|\d{1,2}-(Õ«Õ¶|Ö€Õ¤)/,ordinal:function(a,b){switch(b){case"DDD":case"w":case"W":case"DDDo":return 1===a?a+"-Õ«Õ¶":a+"-Ö€Õ¤";default:return a}},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"LT.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] LT",LLLL:"dddd, D MMMM YYYY [pukul] LT"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(a,b){return 12===a&&(a=0),"pagi"===b?a:"siang"===b?a>=11?a:a+12:"sore"===b||"malam"===b?a+12:void 0},meridiem:function(a){return 11>a?"pagi":15>a?"siang":19>a?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){function b(a){return a%100===11?!0:a%10===1?!1:!0}function c(a,c,d,e){var f=a+" ";switch(d){case"s":return c||e?"nokkrar sekúndur":"nokkrum sekúndum";case"m":return c?"mínúta":"mínútu";case"mm":return b(a)?f+(c||e?"mínútur":"mínútum"):c?f+"mínúta":f+"mínútu";case"hh":return b(a)?f+(c||e?"klukkustundir":"klukkustundum"):f+"klukkustund";case"d":return c?"dagur":e?"dag":"degi";case"dd":return b(a)?c?f+"dagar":f+(e?"daga":"dögum"):c?f+"dagur":f+(e?"dag":"degi");case"M":return c?"mánuður":e?"mánuð":"mánuði";case"MM":return b(a)?c?f+"mánuðir":f+(e?"mánuði":"mánuðum"):c?f+"mánuður":f+(e?"mánuð":"mánuði");case"y":return c||e?"ár":"ári";case"yy":return b(a)?f+(c||e?"ár":"árum"):f+(c||e?"ár":"ári")}}return a.defineLocale("is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd, D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:c,m:c,mm:c,h:"klukkustund",hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),weekdaysShort:"Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),weekdaysMin:"D_L_Ma_Me_G_V_S".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(a){return(/^[0-9].+$/.test(a)?"tra":"in")+" "+a},past:"%s fa",s:"alcuni secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_ç«æ›œæ—¥_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"æ—¥_月_ç«_æ°´_木_金_土".split("_"),weekdaysMin:"æ—¥_月_ç«_æ°´_木_金_土".split("_"),longDateFormat:{LT:"Ah時m分",LTS:"LTs秒",L:"YYYY/MM/DD",LL:"YYYYå¹´M月Dæ—¥",LLL:"YYYYå¹´M月Dæ—¥LT",LLLL:"YYYYå¹´M月Dæ—¥LT dddd"},meridiemParse:/åˆå‰|åˆå¾Œ/i,isPM:function(a){return"åˆå¾Œ"===a},meridiem:function(a){return 12>a?"åˆå‰":"åˆå¾Œ"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:"[æ¥é€±]dddd LT",lastDay:"[昨日] LT",lastWeek:"[å‰é€±]dddd LT",sameElse:"L"},relativeTime:{future:"%s後",past:"%så‰",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1æ—¥",dd:"%dæ—¥",M:"1ヶ月",MM:"%dヶ月",y:"1å¹´",yy:"%då¹´"}})}),function(a){a(vb)}(function(a){function b(a,b){var c={nominative:"იáƒáƒœáƒ•áƒáƒ áƒ˜_თებერვáƒáƒšáƒ˜_მáƒáƒ áƒ¢áƒ˜_áƒáƒžáƒ áƒ˜áƒšáƒ˜_მáƒáƒ˜áƒ¡áƒ˜_ივნისი_ივლისი_áƒáƒ’ვისტáƒ_სექტემბერი_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი_ნáƒáƒ”მბერი_დეკემბერი".split("_"),accusative:"იáƒáƒœáƒ•áƒáƒ áƒ¡_თებერვáƒáƒšáƒ¡_მáƒáƒ áƒ¢áƒ¡_áƒáƒžáƒ áƒ˜áƒšáƒ˜áƒ¡_მáƒáƒ˜áƒ¡áƒ¡_ივნისს_ივლისს_áƒáƒ’ვისტს_სექტემბერს_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერს_ნáƒáƒ”მბერს_დეკემბერს".split("_")},d=/D[oD] *MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function c(a,b){var c={nominative:"კვირáƒ_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ი_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი_ხუთშáƒáƒ‘áƒáƒ—ი_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი_შáƒáƒ‘áƒáƒ—ი".split("_"),accusative:"კვირáƒáƒ¡_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ს_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ს_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ს_ხუთშáƒáƒ‘áƒáƒ—ს_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვს_შáƒáƒ‘áƒáƒ—ს".split("_")},d=/(წინáƒ|შემდეგ)/.test(b)?"accusative":"nominative";return c[d][a.day()]}return a.defineLocale("ka",{months:b,monthsShort:"იáƒáƒœ_თებ_მáƒáƒ _áƒáƒžáƒ _მáƒáƒ˜_ივნ_ივლ_áƒáƒ’ვ_სექ_áƒáƒ¥áƒ¢_ნáƒáƒ”_დეკ".split("_"),weekdays:c,weekdaysShort:"კვი_áƒáƒ áƒ¨_სáƒáƒ›_áƒáƒ—ხ_ხუთ_პáƒáƒ _შáƒáƒ‘".split("_"),weekdaysMin:"კვ_áƒáƒ _სáƒ_áƒáƒ—_ხუ_პáƒ_შáƒ".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[დღეს] LT[-ზე]",nextDay:"[ხვáƒáƒš] LT[-ზე]",lastDay:"[გუშინ] LT[-ზე]",nextWeek:"[შემდეგ] dddd LT[-ზე]",lastWeek:"[წინáƒ] dddd LT-ზე",sameElse:"L"},relativeTime:{future:function(a){return/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|წელი)/.test(a)?a.replace(/ი$/,"ში"):a+"ში"},past:function(a){return/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|დღე|თვე)/.test(a)?a.replace(/(ი|ე)$/,"ის წინ"):/წელი/.test(a)?a.replace(/წელი$/,"წლის წინ"):void 0},s:"რáƒáƒ›áƒ“ენიმე წáƒáƒ›áƒ˜",m:"წუთი",mm:"%d წუთი",h:"სáƒáƒáƒ—ი",hh:"%d სáƒáƒáƒ—ი",d:"დღე",dd:"%d დღე",M:"თვე",MM:"%d თვე",y:"წელი",yy:"%d წელი"},ordinalParse:/0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/,ordinal:function(a){return 0===a?a:1===a?a+"-ლი":20>a||100>=a&&a%20===0||a%100===0?"მე-"+a:a+"-ე"},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("km",{months:"មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ".split("_"),monthsShort:"មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ".split("_"),weekdays:"អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ".split("_"),weekdaysShort:"អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ".split("_"),weekdaysMin:"អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[ážáŸ’ងៃនៈ ម៉ោង] LT",nextDay:"[ស្អែក ម៉ោង] LT",nextWeek:"dddd [ម៉ោង] LT",lastDay:"[ម្សិលមិញ ម៉ោង] LT",lastWeek:"dddd [សប្ážáž¶áž áŸáž˜áž»áž“] [ម៉ោង] LT",sameElse:"L"},relativeTime:{future:"%sទៀáž",past:"%sមុន",s:"ប៉ុន្មានវិនាទី",m:"មួយនាទី",mm:"%d នាទី",h:"មួយម៉ោង",hh:"%d ម៉ោង",d:"មួយážáŸ’ងៃ",dd:"%d ážáŸ’ងៃ",M:"មួយážáŸ‚",MM:"%d ážáŸ‚",y:"មួយឆ្នាំ",yy:"%d ឆ្នាំ"},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("ko",{months:"1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"),monthsShort:"1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"),weekdays:"ì¼ìš”ì¼_월요ì¼_화요ì¼_수요ì¼_목요ì¼_금요ì¼_토요ì¼".split("_"),weekdaysShort:"ì¼_ì›”_í™”_수_목_금_토".split("_"),weekdaysMin:"ì¼_ì›”_í™”_수_목_금_토".split("_"),longDateFormat:{LT:"A hì‹œ m분",LTS:"A hì‹œ m분 sì´ˆ",L:"YYYY.MM.DD",LL:"YYYYë…„ MMMM Dì¼",LLL:"YYYYë…„ MMMM Dì¼ LT",LLLL:"YYYYë…„ MMMM Dì¼ dddd LT"},calendar:{sameDay:"오늘 LT",nextDay:"ë‚´ì¼ LT",nextWeek:"dddd LT",lastDay:"ì–´ì œ LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s ì „",s:"몇초",ss:"%dì´ˆ",m:"ì¼ë¶„",mm:"%d분",h:"한시간",hh:"%d시간",d:"하루",dd:"%dì¼",M:"한달",MM:"%d달",y:"ì¼ë…„",yy:"%dë…„"},ordinalParse:/\d{1,2}ì¼/,ordinal:"%dì¼",meridiemParse:/오전|오후/,isPM:function(a){return"오후"===a},meridiem:function(a){return 12>a?"오전":"오후"}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return b?d[c][0]:d[c][1]}function c(a){var b=a.substr(0,a.indexOf(" "));return e(b)?"a "+a:"an "+a}function d(a){var b=a.substr(0,a.indexOf(" "));return e(b)?"viru "+a:"virun "+a}function e(a){if(a=parseInt(a,10),isNaN(a))return!1;if(0>a)return!0;if(10>a)return a>=4&&7>=a?!0:!1;if(100>a){var b=a%10,c=a/10;return e(0===b?c:b)}if(1e4>a){for(;a>=10;)a/=10;return e(a)}return a/=1e3,e(a)}return a.defineLocale("lb",{months:"Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._Mé._Dë._Më._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mé_Dë_Më_Do_Fr_Sa".split("_"),longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gëschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:c,past:d,s:"e puer Sekonnen",m:b,mm:"%d Minutten",h:b,hh:"%d Stonnen",d:b,dd:"%d Deeg",M:b,MM:"%d Méint",y:b,yy:"%d Joer"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c,d){return b?"kelios sekundÄ—s":d?"kelių sekundžių":"kelias sekundes"}function c(a,b,c,d){return b?e(c)[0]:d?e(c)[1]:e(c)[2] +}function d(a){return a%10===0||a>10&&20>a}function e(a){return h[a].split("_")}function f(a,b,f,g){var h=a+" ";return 1===a?h+c(a,b,f[0],g):b?h+(d(a)?e(f)[1]:e(f)[0]):g?h+e(f)[1]:h+(d(a)?e(f)[1]:e(f)[2])}function g(a,b){var c=-1===b.indexOf("dddd HH:mm"),d=i[a.day()];return c?d:d.substring(0,d.length-2)+"į"}var h={m:"minutÄ—_minutÄ—s_minutÄ™",mm:"minutÄ—s_minuÄių_minutes",h:"valanda_valandos_valandÄ…",hh:"valandos_valandų_valandas",d:"diena_dienos_dienÄ…",dd:"dienos_dienų_dienas",M:"mÄ—nuo_mÄ—nesio_mÄ—nesį",MM:"mÄ—nesiai_mÄ—nesių_mÄ—nesius",y:"metai_metų_metus",yy:"metai_metų_metus"},i="sekmadienis_pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis".split("_");return a.defineLocale("lt",{months:"sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio".split("_"),monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:g,weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Å eÅ¡".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Å ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], LT [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, LT [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], LT [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, LT [val.]"},calendar:{sameDay:"[Å iandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[PraÄ—jusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieÅ¡ %s",s:b,m:c,mm:f,h:c,hh:f,d:c,dd:f,M:c,MM:f,y:c,yy:f},ordinalParse:/\d{1,2}-oji/,ordinal:function(a){return a+"-oji"},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d=a.split("_");return c?b%10===1&&11!==b?d[2]:d[3]:b%10===1&&11!==b?d[0]:d[1]}function c(a,c,e){return a+" "+b(d[e],a,c)}var d={mm:"minÅ«ti_minÅ«tes_minÅ«te_minÅ«tes",hh:"stundu_stundas_stunda_stundas",dd:"dienu_dienas_diena_dienas",MM:"mÄ“nesi_mÄ“neÅ¡us_mÄ“nesis_mÄ“neÅ¡i",yy:"gadu_gadus_gads_gadi"};return a.defineLocale("lv",{months:"janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jÅ«n_jÅ«l_aug_sep_okt_nov_dec".split("_"),weekdays:"svÄ“tdiena_pirmdiena_otrdiena_treÅ¡diena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, LT",LLLL:"YYYY. [gada] D. MMMM, dddd, LT"},calendar:{sameDay:"[Å odien pulksten] LT",nextDay:"[RÄ«t pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[PagÄjuÅ¡Ä] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"%s vÄ“lÄk",past:"%s agrÄk",s:"dažas sekundes",m:"minÅ«ti",mm:c,h:"stundu",hh:c,d:"dienu",dd:c,M:"mÄ“nesi",MM:c,y:"gadu",yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("mk",{months:"јануари_февруари_март_април_мај_јуни_јули_авгуÑÑ‚_Ñептември_октомври_ноември_декември".split("_"),monthsShort:"јан_фев_мар_апр_мај_јун_јул_авг_Ñеп_окт_ное_дек".split("_"),weekdays:"недела_понеделник_вторник_Ñреда_четврток_петок_Ñабота".split("_"),weekdaysShort:"нед_пон_вто_Ñре_чет_пет_Ñаб".split("_"),weekdaysMin:"нe_пo_вт_ÑÑ€_че_пе_Ña".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Ð”ÐµÐ½ÐµÑ Ð²Ð¾] LT",nextDay:"[Утре во] LT",nextWeek:"dddd [во] LT",lastDay:"[Вчера во] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Во изминатата] dddd [во] LT";case 1:case 2:case 4:case 5:return"[Во изминатиот] dddd [во] LT"}},sameElse:"L"},relativeTime:{future:"поÑле %s",past:"пред %s",s:"неколку Ñекунди",m:"минута",mm:"%d минути",h:"чаÑ",hh:"%d чаÑа",d:"ден",dd:"%d дена",M:"меÑец",MM:"%d меÑеци",y:"година",yy:"%d години"},ordinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(a){var b=a%10,c=a%100;return 0===a?a+"-ев":0===c?a+"-ен":c>10&&20>c?a+"-ти":1===b?a+"-ви":2===b?a+"-ри":7===b||8===b?a+"-ми":a+"-ти"},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("ml",{months:"ജനàµà´µà´°à´¿_ഫെബàµà´°àµà´µà´°à´¿_മാർചàµà´šàµ_à´à´ªàµà´°à´¿àµ½_മേയàµ_ജൂൺ_ജൂലൈ_à´“à´—à´¸àµà´±àµà´±àµ_സെപàµà´±àµà´±à´‚ബർ_à´’à´•àµà´Ÿàµ‹à´¬àµ¼_നവംബർ_ഡിസംബർ".split("_"),monthsShort:"ജനàµ._ഫെബàµà´°àµ._മാർ._à´à´ªàµà´°à´¿._മേയàµ_ജൂൺ_ജൂലൈ._à´“à´—._സെപàµà´±àµà´±._à´’à´•àµà´Ÿàµ‹._നവം._ഡിസം.".split("_"),weekdays:"ഞായറാഴàµà´š_തിങàµà´•à´³à´¾à´´àµà´š_ചൊവàµà´µà´¾à´´àµà´š_à´¬àµà´§à´¨à´¾à´´àµà´š_à´µàµà´¯à´¾à´´à´¾à´´àµà´š_വെളàµà´³à´¿à´¯à´¾à´´àµà´š_ശനിയാഴàµà´š".split("_"),weekdaysShort:"ഞായർ_തിങàµà´•àµ¾_ചൊവàµà´µ_à´¬àµà´§àµ»_à´µàµà´¯à´¾à´´à´‚_വെളàµà´³à´¿_ശനി".split("_"),weekdaysMin:"à´žà´¾_തി_ചൊ_à´¬àµ_à´µàµà´¯à´¾_വെ_à´¶".split("_"),longDateFormat:{LT:"A h:mm -à´¨àµ",LTS:"A h:mm:ss -à´¨àµ",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[ഇനàµà´¨àµ] LT",nextDay:"[നാളെ] LT",nextWeek:"dddd, LT",lastDay:"[ഇനàµà´¨à´²àµ†] LT",lastWeek:"[à´•à´´à´¿à´žàµà´ž] dddd, LT",sameElse:"L"},relativeTime:{future:"%s à´•à´´à´¿à´žàµà´žàµ",past:"%s à´®àµàµ»à´ªàµ",s:"അൽപ നിമിഷങàµà´™àµ¾",m:"ഒരൠമിനിറàµà´±àµ",mm:"%d മിനിറàµà´±àµ",h:"ഒരൠമണികàµà´•àµ‚ർ",hh:"%d മണികàµà´•àµ‚ർ",d:"ഒരൠദിവസം",dd:"%d ദിവസം",M:"ഒരൠമാസം",MM:"%d മാസം",y:"ഒരൠവർഷം",yy:"%d വർഷം"},meridiemParse:/രാതàµà´°à´¿|രാവിലെ|ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿/i,isPM:function(a){return/^(ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿)$/.test(a)},meridiem:function(a){return 4>a?"രാതàµà´°à´¿":12>a?"രാവിലെ":17>a?"ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ":20>a?"വൈകàµà´¨àµà´¨àµ‡à´°à´‚":"രാതàµà´°à´¿"}})}),function(a){a(vb)}(function(a){var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return a.defineLocale("mr",{months:"जानेवारी_फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€_मारà¥à¤š_à¤à¤ªà¥à¤°à¤¿à¤²_मे_जून_जà¥à¤²à¥ˆ_ऑगसà¥à¤Ÿ_सपà¥à¤Ÿà¥‡à¤‚बर_ऑकà¥à¤Ÿà¥‹à¤¬à¤°_नोवà¥à¤¹à¥‡à¤‚बर_डिसेंबर".split("_"),monthsShort:"जाने._फेबà¥à¤°à¥._मारà¥à¤š._à¤à¤ªà¥à¤°à¤¿._मे._जून._जà¥à¤²à¥ˆ._ऑग._सपà¥à¤Ÿà¥‡à¤‚._ऑकà¥à¤Ÿà¥‹._नोवà¥à¤¹à¥‡à¤‚._डिसें.".split("_"),weekdays:"रविवार_सोमवार_मंगळवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगळ_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि".split("_"),weekdaysMin:"र_सो_मं_बà¥_गà¥_शà¥_श".split("_"),longDateFormat:{LT:"A h:mm वाजता",LTS:"A h:mm:ss वाजता",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[आज] LT",nextDay:"[उदà¥à¤¯à¤¾] LT",nextWeek:"dddd, LT",lastDay:"[काल] LT",lastWeek:"[मागील] dddd, LT",sameElse:"L"},relativeTime:{future:"%s नंतर",past:"%s पूरà¥à¤µà¥€",s:"सेकंद",m:"à¤à¤• मिनिट",mm:"%d मिनिटे",h:"à¤à¤• तास",hh:"%d तास",d:"à¤à¤• दिवस",dd:"%d दिवस",M:"à¤à¤• महिना",MM:"%d महिने",y:"à¤à¤• वरà¥à¤·",yy:"%d वरà¥à¤·à¥‡"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/रातà¥à¤°à¥€|सकाळी|दà¥à¤ªà¤¾à¤°à¥€|सायंकाळी/,meridiemHour:function(a,b){return 12===a&&(a=0),"रातà¥à¤°à¥€"===b?4>a?a:a+12:"सकाळी"===b?a:"दà¥à¤ªà¤¾à¤°à¥€"===b?a>=10?a:a+12:"सायंकाळी"===b?a+12:void 0},meridiem:function(a){return 4>a?"रातà¥à¤°à¥€":10>a?"सकाळी":17>a?"दà¥à¤ªà¤¾à¤°à¥€":20>a?"सायंकाळी":"रातà¥à¤°à¥€"},week:{dow:0,doy:6}})}),function(a){a(vb)}(function(a){return a.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"LT.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] LT",LLLL:"dddd, D MMMM YYYY [pukul] LT"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(a,b){return 12===a&&(a=0),"pagi"===b?a:"tengahari"===b?a>=11?a:a+12:"petang"===b||"malam"===b?a+12:void 0},meridiem:function(a){return 11>a?"pagi":15>a?"tengahari":19>a?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){var b={1:"á",2:"á‚",3:"áƒ",4:"á„",5:"á…",6:"á†",7:"á‡",8:"áˆ",9:"á‰",0:"á€"},c={"á":"1","á‚":"2","áƒ":"3","á„":"4","á…":"5","á†":"6","á‡":"7","áˆ":"8","á‰":"9","á€":"0"};return a.defineLocale("my",{months:"ဇန်နá€á€«á€›á€®_ဖေဖော်á€á€«á€›á€®_မá€á€º_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုá€á€º_စက်á€á€„်ဘာ_အောက်á€á€­á€¯á€˜á€¬_နိုá€á€„်ဘာ_ဒီဇင်ဘာ".split("_"),monthsShort:"ဇန်_ဖေ_မá€á€º_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ".split("_"),weekdays:"á€á€”င်္ဂနွေ_á€á€”င်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပá€á€±á€¸_သောကြာ_စနေ".split("_"),weekdaysShort:"နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),weekdaysMin:"နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[ယနေ.] LT [မှာ]",nextDay:"[မနက်ဖြန်] LT [မှာ]",nextWeek:"dddd LT [မှာ]",lastDay:"[မနေ.က] LT [မှာ]",lastWeek:"[ပြီးá€á€²á€·á€žá€±á€¬] dddd LT [မှာ]",sameElse:"L"},relativeTime:{future:"လာမည့် %s မှာ",past:"လွန်á€á€²á€·á€žá€±á€¬ %s က",s:"စက္ကန်.အနည်းငယ်",m:"á€á€…်မိနစ်",mm:"%d မိနစ်",h:"á€á€…်နာရီ",hh:"%d နာရီ",d:"á€á€…်ရက်",dd:"%d ရက်",M:"á€á€…်လ",MM:"%d လ",y:"á€á€…်နှစ်",yy:"%d နှစ်"},preparse:function(a){return a.replace(/[áá‚áƒá„á…á†á‡áˆá‰á€]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tirs_ons_tors_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"H.mm",LTS:"LT.ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i gÃ¥r kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"for %s siden",s:"noen sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en mÃ¥ned",MM:"%d mÃ¥neder",y:"ett Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return a.defineLocale("ne",{months:"जनवरी_फेबà¥à¤°à¥à¤µà¤°à¥€_मारà¥à¤š_अपà¥à¤°à¤¿à¤²_मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ_अगषà¥à¤Ÿ_सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°_अकà¥à¤Ÿà¥‹à¤¬à¤°_नोभेमà¥à¤¬à¤°_डिसेमà¥à¤¬à¤°".split("_"),monthsShort:"जन._फेबà¥à¤°à¥._मारà¥à¤š_अपà¥à¤°à¤¿._मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ._अग._सेपà¥à¤Ÿ._अकà¥à¤Ÿà¥‹._नोभे._डिसे.".split("_"),weekdays:"आइतबार_सोमबार_मङà¥à¤—लबार_बà¥à¤§à¤¬à¤¾à¤°_बिहिबार_शà¥à¤•à¥à¤°à¤¬à¤¾à¤°_शनिबार".split("_"),weekdaysShort:"आइत._सोम._मङà¥à¤—ल._बà¥à¤§._बिहि._शà¥à¤•à¥à¤°._शनि.".split("_"),weekdaysMin:"आइ._सो._मङà¥_बà¥._बि._शà¥._श.".split("_"),longDateFormat:{LT:"Aको h:mm बजे",LTS:"Aको h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/राती|बिहान|दिउà¤à¤¸à¥‹|बेलà¥à¤•à¤¾|साà¤à¤|राती/,meridiemHour:function(a,b){return 12===a&&(a=0),"राती"===b?3>a?a:a+12:"बिहान"===b?a:"दिउà¤à¤¸à¥‹"===b?a>=10?a:a+12:"बेलà¥à¤•à¤¾"===b||"साà¤à¤"===b?a+12:void 0},meridiem:function(a){return 3>a?"राती":10>a?"बिहान":15>a?"दिउà¤à¤¸à¥‹":18>a?"बेलà¥à¤•à¤¾":20>a?"साà¤à¤":"राती"},calendar:{sameDay:"[आज] LT",nextDay:"[भोली] LT",nextWeek:"[आउà¤à¤¦à¥‹] dddd[,] LT",lastDay:"[हिजो] LT",lastWeek:"[गà¤à¤•à¥‹] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%sमा",past:"%s अगाडी",s:"केही समय",m:"à¤à¤• मिनेट",mm:"%d मिनेट",h:"à¤à¤• घणà¥à¤Ÿà¤¾",hh:"%d घणà¥à¤Ÿà¤¾",d:"à¤à¤• दिन",dd:"%d दिन",M:"à¤à¤• महिना",MM:"%d महिना",y:"à¤à¤• बरà¥à¤·",yy:"%d बरà¥à¤·"},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){var b="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),c="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_");return a.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(a,d){return/-MMM-/.test(d)?c[a.month()]:b[a.month()]},weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_mÃ¥ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_mÃ¥n_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_mÃ¥_ty_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I gÃ¥r klokka] LT",lastWeek:"[FøregÃ¥ande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"for %s sidan",s:"nokre sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",M:"ein mÃ¥nad",MM:"%d mÃ¥nader",y:"eit Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a){return 5>a%10&&a%10>1&&~~(a/10)%10!==1}function c(a,c,d){var e=a+" ";switch(d){case"m":return c?"minuta":"minutÄ™";case"mm":return e+(b(a)?"minuty":"minut");case"h":return c?"godzina":"godzinÄ™";case"hh":return e+(b(a)?"godziny":"godzin");case"MM":return e+(b(a)?"miesiÄ…ce":"miesiÄ™cy");case"yy":return e+(b(a)?"lata":"lat")}}var d="styczeÅ„_luty_marzec_kwiecieÅ„_maj_czerwiec_lipiec_sierpieÅ„_wrzesieÅ„_październik_listopad_grudzieÅ„".split("_"),e="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrzeÅ›nia_października_listopada_grudnia".split("_");return a.defineLocale("pl",{months:function(a,b){return/D MMMM/.test(b)?e[a.month()]:d[a.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziaÅ‚ek_wtorek_Å›roda_czwartek_piÄ…tek_sobota".split("_"),weekdaysShort:"nie_pon_wt_Å›r_czw_pt_sb".split("_"),weekdaysMin:"N_Pn_Wt_Åšr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[DziÅ› o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszÅ‚Ä… niedzielÄ™ o] LT";case 3:return"[W zeszÅ‚Ä… Å›rodÄ™ o] LT";case 6:return"[W zeszÅ‚Ä… sobotÄ™ o] LT";default:return"[W zeszÅ‚y] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:c,mm:c,h:c,hh:c,d:"1 dzieÅ„",dd:"%d dni",M:"miesiÄ…c",MM:c,y:"rok",yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("pt-br",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] LT",LLLL:"dddd, D [de] MMMM [de] YYYY [às] LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº"})}),function(a){a(vb)}(function(a){return a.defineLocale("pt",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d={mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"},e=" ";return(a%100>=20||a>=100&&a%100===0)&&(e=" de "),a+e+d[c]}return a.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),weekdays:"duminică_luni_marÈ›i_miercuri_joi_vineri_sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",m:"un minut",mm:b,h:"o oră",hh:b,d:"o zi",dd:b,M:"o lună",MM:b,y:"un an",yy:b},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){function b(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:c?"минута_минуты_минут":"минуту_минуты_минут",hh:"чаÑ_чаÑа_чаÑов",dd:"день_днÑ_дней",MM:"меÑÑц_меÑÑца_меÑÑцев",yy:"год_года_лет"};return"m"===d?c?"минута":"минуту":a+" "+b(e[d],+a)}function d(a,b){var c={nominative:"Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь".split("_"),accusative:"ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function e(a,b){var c={nominative:"Ñнв_фев_март_апр_май_июнь_июль_авг_Ñен_окт_ноÑ_дек".split("_"),accusative:"Ñнв_фев_мар_апр_маÑ_июнÑ_июлÑ_авг_Ñен_окт_ноÑ_дек".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function f(a,b){var c={nominative:"воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота".split("_"),accusative:"воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу".split("_")},d=/\[ ?[Вв] ?(?:прошлую|Ñледующую|Ñту)? ?\] ?dddd/.test(b)?"accusative":"nominative";return c[d][a.day()]}return a.defineLocale("ru",{months:d,monthsShort:e,weekdays:f,weekdaysShort:"вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),weekdaysMin:"вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),monthsParse:[/^Ñнв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[й|Ñ]/i,/^июн/i,/^июл/i,/^авг/i,/^Ñен/i,/^окт/i,/^ноÑ/i,/^дек/i],longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., LT",LLLL:"dddd, D MMMM YYYY г., LT"},calendar:{sameDay:"[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT",nextDay:"[Завтра в] LT",lastDay:"[Вчера в] LT",nextWeek:function(){return 2===this.day()?"[Во] dddd [в] LT":"[Ð’] dddd [в] LT"},lastWeek:function(a){if(a.week()===this.week())return 2===this.day()?"[Во] dddd [в] LT":"[Ð’] dddd [в] LT";switch(this.day()){case 0:return"[Ð’ прошлое] dddd [в] LT";case 1:case 2:case 4:return"[Ð’ прошлый] dddd [в] LT";case 3:case 5:case 6:return"[Ð’ прошлую] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"неÑколько Ñекунд",m:c,mm:c,h:"чаÑ",hh:c,d:"день",dd:c,M:"меÑÑц",MM:c,y:"год",yy:c},meridiemParse:/ночи|утра|днÑ|вечера/i,isPM:function(a){return/^(днÑ|вечера)$/.test(a)},meridiem:function(a){return 4>a?"ночи":12>a?"утра":17>a?"днÑ":"вечера"},ordinalParse:/\d{1,2}-(й|го|Ñ)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":return a+"-й";case"D":return a+"-го";case"w":case"W":return a+"-Ñ";default:return a}},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){function b(a){return a>1&&5>a}function c(a,c,d,e){var f=a+" ";switch(d){case"s":return c||e?"pár sekúnd":"pár sekundami";case"m":return c?"minúta":e?"minútu":"minútou";case"mm":return c||e?f+(b(a)?"minúty":"minút"):f+"minútami";break;case"h":return c?"hodina":e?"hodinu":"hodinou";case"hh":return c||e?f+(b(a)?"hodiny":"hodín"):f+"hodinami";break;case"d":return c||e?"deň":"dňom";case"dd":return c||e?f+(b(a)?"dni":"dní"):f+"dňami";break;case"M":return c||e?"mesiac":"mesiacom";case"MM":return c||e?f+(b(a)?"mesiace":"mesiacov"):f+"mesiacmi";break;case"y":return c||e?"rok":"rokom";case"yy":return c||e?f+(b(a)?"roky":"rokov"):f+"rokmi"}}var d="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),e="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");return a.defineLocale("sk",{months:d,monthsShort:e,monthsParse:function(a,b){var c,d=[];for(c=0;12>c;c++)d[c]=new RegExp("^"+a[c]+"$|^"+b[c]+"$","i");return d}(d,e),weekdays:"nedeľa_pondelok_utorok_streda_Å¡tvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_Å¡t_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_Å¡t_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo Å¡tvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[vÄera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT";case 1:case 2:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 4:case 5:return"[minulý] dddd [o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d=a+" ";switch(c){case"m":return b?"ena minuta":"eno minuto";case"mm":return d+=1===a?"minuta":2===a?"minuti":3===a||4===a?"minute":"minut";case"h":return b?"ena ura":"eno uro";case"hh":return d+=1===a?"ura":2===a?"uri":3===a||4===a?"ure":"ur";case"dd":return d+=1===a?"dan":"dni";case"MM":return d+=1===a?"mesec":2===a?"meseca":3===a||4===a?"mesece":"mesecev";case"yy":return d+=1===a?"leto":2===a?"leti":3===a||4===a?"leta":"let"}}return a.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),weekdays:"nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._Äet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_Äe_pe_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[vÄeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[prejÅ¡nja] dddd [ob] LT";case 1:case 2:case 4:case 5:return"[prejÅ¡nji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"Äez %s",past:"%s nazaj",s:"nekaj sekund",m:b,mm:b,h:b,hh:b,d:"en dan",dd:b,M:"en mesec",MM:b,y:"eno leto",yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"),weekdays:"E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë".split("_"),weekdaysShort:"Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_Më_E_P_Sh".split("_"),meridiemParse:/PD|MD/,isPM:function(a){return"M"===a.charAt(0)},meridiem:function(a){return 12>a?"PD":"MD"},longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Sot në] LT",nextDay:"[Nesër në] LT",nextWeek:"dddd [në] LT",lastDay:"[Dje në] LT",lastWeek:"dddd [e kaluar në] LT",sameElse:"L"},relativeTime:{future:"në %s",past:"%s më parë",s:"disa sekonda",m:"një minutë",mm:"%d minuta",h:"një orë",hh:"%d orë",d:"një ditë",dd:"%d ditë",M:"një muaj",MM:"%d muaj",y:"një vit",yy:"%d vite"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){var b={words:{m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један Ñат","једног Ñата"],hh:["Ñат","Ñата","Ñати"],dd:["дан","дана","дана"],MM:["меÑец","меÑеца","меÑеци"],yy:["година","године","година"]},correctGrammaticalCase:function(a,b){return 1===a?b[0]:a>=2&&4>=a?b[1]:b[2]},translate:function(a,c,d){var e=b.words[d];return 1===d.length?c?e[0]:e[1]:a+" "+b.correctGrammaticalCase(a,e)}};return a.defineLocale("sr-cyrl",{months:["јануар","фебруар","март","април","мај","јун","јул","авгуÑÑ‚","Ñептембар","октобар","новембар","децембар"],monthsShort:["јан.","феб.","мар.","апр.","мај","јун","јул","авг.","Ñеп.","окт.","нов.","дец."],weekdays:["недеља","понедељак","уторак","Ñреда","четвртак","петак","Ñубота"],weekdaysShort:["нед.","пон.","уто.","Ñре.","чет.","пет.","Ñуб."],weekdaysMin:["не","по","ут","ÑÑ€","че","пе","Ñу"],longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Ð´Ð°Ð½Ð°Ñ Ñƒ] LT",nextDay:"[Ñутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [Ñреду] [у] LT";case 6:return"[у] [Ñуботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){var a=["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [Ñреде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [Ñуботе] [у] LT"];return a[this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико Ñекунди",m:b.translate,mm:b.translate,h:b.translate,hh:b.translate,d:"дан",dd:b.translate,M:"меÑец",MM:b.translate,y:"годину",yy:b.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){var b={words:{m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(a,b){return 1===a?b[0]:a>=2&&4>=a?b[1]:b[2]},translate:function(a,c,d){var e=b.words[d];return 1===d.length?c?e[0]:e[1]:a+" "+b.correctGrammaticalCase(a,e)}};return a.defineLocale("sr",{months:["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar"],monthsShort:["jan.","feb.","mar.","apr.","maj","jun","jul","avg.","sep.","okt.","nov.","dec."],weekdays:["nedelja","ponedeljak","utorak","sreda","Äetvrtak","petak","subota"],weekdaysShort:["ned.","pon.","uto.","sre.","Äet.","pet.","sub."],weekdaysMin:["ne","po","ut","sr","Äe","pe","su"],longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄe u] LT",lastWeek:function(){var a=["[proÅ¡le] [nedelje] [u] LT","[proÅ¡log] [ponedeljka] [u] LT","[proÅ¡log] [utorka] [u] LT","[proÅ¡le] [srede] [u] LT","[proÅ¡log] [Äetvrtka] [u] LT","[proÅ¡log] [petka] [u] LT","[proÅ¡le] [subote] [u] LT"];return a[this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",m:b.translate,mm:b.translate,h:b.translate,hh:b.translate,d:"dan",dd:b.translate,M:"mesec",MM:b.translate,y:"godinu",yy:b.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_mÃ¥ndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mÃ¥n_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_mÃ¥_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[IgÃ¥r] LT",nextWeek:"dddd LT",lastWeek:"[Förra] dddd[en] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"nÃ¥gra sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en mÃ¥nad",MM:"%d mÃ¥nader",y:"ett Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}(e|a)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"e":1===b?"a":2===b?"a":"e";return a+c},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("ta",{months:"ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯".split("_"),monthsShort:"ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯".split("_"),weekdays:"ஞாயிறà¯à®±à¯à®•à¯à®•à®¿à®´à®®à¯ˆ_திஙà¯à®•à®Ÿà¯à®•à®¿à®´à®®à¯ˆ_செவà¯à®µà®¾à®¯à¯à®•à®¿à®´à®®à¯ˆ_பà¯à®¤à®©à¯à®•à®¿à®´à®®à¯ˆ_வியாழகà¯à®•à®¿à®´à®®à¯ˆ_வெளà¯à®³à®¿à®•à¯à®•à®¿à®´à®®à¯ˆ_சனிகà¯à®•à®¿à®´à®®à¯ˆ".split("_"),weekdaysShort:"ஞாயிறà¯_திஙà¯à®•à®³à¯_செவà¯à®µà®¾à®¯à¯_பà¯à®¤à®©à¯_வியாழனà¯_வெளà¯à®³à®¿_சனி".split("_"),weekdaysMin:"ஞா_தி_செ_பà¯_வி_வெ_ச".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[இனà¯à®±à¯] LT",nextDay:"[நாளை] LT",nextWeek:"dddd, LT",lastDay:"[நேறà¯à®±à¯] LT",lastWeek:"[கடநà¯à®¤ வாரமà¯] dddd, LT",sameElse:"L"},relativeTime:{future:"%s இலà¯",past:"%s à®®à¯à®©à¯",s:"ஒர௠சில விநாடிகளà¯",m:"ஒர௠நிமிடமà¯",mm:"%d நிமிடஙà¯à®•à®³à¯",h:"ஒர௠மணி நேரமà¯",hh:"%d மணி நேரமà¯",d:"ஒர௠நாளà¯",dd:"%d நாடà¯à®•à®³à¯",M:"ஒர௠மாதமà¯",MM:"%d மாதஙà¯à®•à®³à¯",y:"ஒர௠வரà¯à®Ÿà®®à¯",yy:"%d ஆணà¯à®Ÿà¯à®•à®³à¯"},ordinalParse:/\d{1,2}வதà¯/,ordinal:function(a){return a+"வதà¯"},meridiemParse:/யாமமà¯|வைகறை|காலை|நணà¯à®ªà®•à®²à¯|எறà¯à®ªà®¾à®Ÿà¯|மாலை/,meridiem:function(a){return 2>a?" யாமமà¯":6>a?" வைகறை":10>a?" காலை":14>a?" நணà¯à®ªà®•à®²à¯":18>a?" எறà¯à®ªà®¾à®Ÿà¯":22>a?" மாலை":" யாமமà¯"},meridiemHour:function(a,b){return 12===a&&(a=0),"யாமமà¯"===b?2>a?a:a+12:"வைகறை"===b||"காலை"===b?a:"நணà¯à®ªà®•à®²à¯"===b&&a>=10?a:a+12},week:{dow:0,doy:6}})}),function(a){a(vb)}(function(a){return a.defineLocale("th",{months:"มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม".split("_"),monthsShort:"มà¸à¸£à¸²_à¸à¸¸à¸¡à¸ à¸²_มีนา_เมษา_พฤษภา_มิถุนา_à¸à¸£à¸à¸Žà¸²_สิงหา_à¸à¸±à¸™à¸¢à¸²_ตุลา_พฤศจิà¸à¸²_ธันวา".split("_"),weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),longDateFormat:{LT:"H นาฬิà¸à¸² m นาที",LTS:"LT s วินาที",L:"YYYY/MM/DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา LT",LLLL:"วันddddที่ D MMMM YYYY เวลา LT"},meridiemParse:/à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง|หลังเที่ยง/,isPM:function(a){return"หลังเที่ยง"===a +},meridiem:function(a){return 12>a?"à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่à¹à¸¥à¹‰à¸§ เวลา] LT",sameElse:"L"},relativeTime:{future:"อีภ%s",past:"%sที่à¹à¸¥à¹‰à¸§",s:"ไม่à¸à¸µà¹ˆà¸§à¸´à¸™à¸²à¸—ี",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"}})}),function(a){a(vb)}(function(a){return a.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY LT",LLLL:"dddd, MMMM DD, YYYY LT"},calendar:{sameDay:"[Ngayon sa] LT",nextDay:"[Bukas sa] LT",nextWeek:"dddd [sa] LT",lastDay:"[Kahapon sa] LT",lastWeek:"dddd [huling linggo] LT",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},ordinalParse:/\d{1,2}/,ordinal:function(a){return a},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){var b={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"};return a.defineLocale("tr",{months:"Ocak_Åžubat_Mart_Nisan_Mayıs_Haziran_Temmuz_AÄŸustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_ÇarÅŸamba_PerÅŸembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[haftaya] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen hafta] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinalParse:/\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/,ordinal:function(a){if(0===a)return a+"'ıncı";var c=a%10,d=a%100-c,e=a>=100?100:null;return a+(b[c]||b[d]||b[e])},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("tzm-latn",{months:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",m:"minuá¸",mm:"%d minuá¸",h:"saÉ›a",hh:"%d tassaÉ›in",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})}),function(a){a(vb)}(function(a){return a.defineLocale("tzm",{months:"ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”".split("_"),monthsShort:"ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”".split("_"),weekdays:"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysShort:"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysMin:"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[ⴰⵙⴷⵅ â´´] LT",nextDay:"[ⴰⵙⴽⴰ â´´] LT",nextWeek:"dddd [â´´] LT",lastDay:"[ⴰⵚⴰâµâµœ â´´] LT",lastWeek:"dddd [â´´] LT",sameElse:"L"},relativeTime:{future:"â´·â´°â´·âµ… âµ™ ⵢⴰⵠ%s",past:"ⵢⴰⵠ%s",s:"ⵉⵎⵉⴽ",m:"ⵎⵉâµâµ“â´º",mm:"%d ⵎⵉâµâµ“â´º",h:"ⵙⴰⵄⴰ",hh:"%d ⵜⴰⵙⵙⴰⵄⵉâµ",d:"ⴰⵙⵙ",dd:"%d oⵙⵙⴰâµ",M:"â´°âµ¢oⵓⵔ",MM:"%d ⵉⵢⵢⵉⵔâµ",y:"ⴰⵙⴳⴰⵙ",yy:"%d ⵉⵙⴳⴰⵙâµ"},week:{dow:6,doy:12}})}),function(a){a(vb)}(function(a){function b(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:"хвилина_хвилини_хвилин",hh:"година_години_годин",dd:"день_дні_днів",MM:"міÑÑць_міÑÑці_міÑÑців",yy:"рік_роки_років"};return"m"===d?c?"хвилина":"хвилину":"h"===d?c?"година":"годину":a+" "+b(e[d],+a)}function d(a,b){var c={nominative:"Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень".split("_"),accusative:"ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ".split("_")},d=/D[oD]? *MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function e(a,b){var c={nominative:"неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота".split("_"),accusative:"неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу".split("_"),genitive:"неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи".split("_")},d=/(\[[ВвУу]\]) ?dddd/.test(b)?"accusative":/\[?(?:минулої|наÑтупної)? ?\] ?dddd/.test(b)?"genitive":"nominative";return c[d][a.day()]}function f(a){return function(){return a+"о"+(11===this.hours()?"б":"")+"] LT"}}return a.defineLocale("uk",{months:d,monthsShort:"Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд".split("_"),weekdays:e,weekdaysShort:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),weekdaysMin:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY Ñ€.",LLL:"D MMMM YYYY Ñ€., LT",LLLL:"dddd, D MMMM YYYY Ñ€., LT"},calendar:{sameDay:f("[Сьогодні "),nextDay:f("[Завтра "),lastDay:f("[Вчора "),nextWeek:f("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return f("[Минулої] dddd [").call(this);case 1:case 2:case 4:return f("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька Ñекунд",m:c,mm:c,h:"годину",hh:c,d:"день",dd:c,M:"міÑÑць",MM:c,y:"рік",yy:c},meridiemParse:/ночі|ранку|днÑ|вечора/,isPM:function(a){return/^(днÑ|вечора)$/.test(a)},meridiem:function(a){return 4>a?"ночі":12>a?"ранку":17>a?"днÑ":"вечора"},ordinalParse:/\d{1,2}-(й|го)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":case"w":case"W":return a+"-й";case"D":return a+"-го";default:return a}},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("uz",{months:"Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь".split("_"),monthsShort:"Ñнв_фев_мар_апр_май_июн_июл_авг_Ñен_окт_ноÑ_дек".split("_"),weekdays:"Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"),weekdaysShort:"Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"),weekdaysMin:"Як_Ду_Се_Чо_Па_Жу_Ша".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"D MMMM YYYY, dddd LT"},calendar:{sameDay:"[Бугун Ñоат] LT [да]",nextDay:"[Эртага] LT [да]",nextWeek:"dddd [куни Ñоат] LT [да]",lastDay:"[Кеча Ñоат] LT [да]",lastWeek:"[Утган] dddd [куни Ñоат] LT [да]",sameElse:"L"},relativeTime:{future:"Якин %s ичида",past:"Бир неча %s олдин",s:"фурÑат",m:"бир дакика",mm:"%d дакика",h:"бир Ñоат",hh:"%d Ñоат",d:"бир кун",dd:"%d кун",M:"бир ой",MM:"%d ой",y:"бир йил",yy:"%d йил"},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("vi",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),weekdays:"chủ nhật_thứ hai_thứ ba_thứ tÆ°_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY LT",LLLL:"dddd, D MMMM [năm] YYYY LT",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY LT",llll:"ddd, D MMM YYYY LT"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tá»›i lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần rồi lúc] LT",sameElse:"L"},relativeTime:{future:"%s tá»›i",past:"%s trÆ°á»›c",s:"vài giây",m:"má»™t phút",mm:"%d phút",h:"má»™t giá»",hh:"%d giá»",d:"má»™t ngày",dd:"%d ngày",M:"má»™t tháng",MM:"%d tháng",y:"má»™t năm",yy:"%d năm"},ordinalParse:/\d{1,2}/,ordinal:function(a){return a},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"æ—¥_一_二_三_å››_五_å…­".split("_"),longDateFormat:{LT:"Ah点mm",LTS:"Ah点m分s秒",L:"YYYY-MM-DD",LL:"YYYYå¹´MMMDæ—¥",LLL:"YYYYå¹´MMMDæ—¥LT",LLLL:"YYYYå¹´MMMDæ—¥ddddLT",l:"YYYY-MM-DD",ll:"YYYYå¹´MMMDæ—¥",lll:"YYYYå¹´MMMDæ—¥LT",llll:"YYYYå¹´MMMDæ—¥ddddLT"},meridiemParse:/凌晨|早上|上åˆ|中åˆ|下åˆ|晚上/,meridiemHour:function(a,b){return 12===a&&(a=0),"凌晨"===b||"早上"===b||"上åˆ"===b?a:"下åˆ"===b||"晚上"===b?a+12:a>=11?a:a+12},meridiem:function(a,b){var c=100*a+b;return 600>c?"凌晨":900>c?"早上":1130>c?"上åˆ":1230>c?"中åˆ":1800>c?"下åˆ":"晚上"},calendar:{sameDay:function(){return 0===this.minutes()?"[今天]Ah[点整]":"[今天]LT"},nextDay:function(){return 0===this.minutes()?"[明天]Ah[点整]":"[明天]LT"},lastDay:function(){return 0===this.minutes()?"[昨天]Ah[点整]":"[昨天]LT"},nextWeek:function(){var b,c;return b=a().startOf("week"),c=this.unix()-b.unix()>=604800?"[下]":"[本]",0===this.minutes()?c+"dddAh点整":c+"dddAh点mm"},lastWeek:function(){var b,c;return b=a().startOf("week"),c=this.unix()=11?a:a+12:"下åˆ"===b||"晚上"===b?a+12:void 0},meridiem:function(a,b){var c=100*a+b;return 900>c?"早上":1130>c?"上åˆ":1230>c?"中åˆ":1800>c?"下åˆ":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},ordinalParse:/\d{1,2}(æ—¥|月|週)/,ordinal:function(a,b){switch(b){case"d":case"D":case"DDD":return a+"æ—¥";case"M":return a+"月";case"w":case"W":return a+"週";default:return a}},relativeTime:{future:"%så…§",past:"%så‰",s:"幾秒",m:"一分é˜",mm:"%d分é˜",h:"一å°æ™‚",hh:"%då°æ™‚",d:"一天",dd:"%d天",M:"一個月",MM:"%d個月",y:"一年",yy:"%då¹´"}})}),vb.locale("en"),Lb?module.exports=vb:"function"==typeof define&&define.amd?(define(function(a,b,c){return c.config&&c.config()&&c.config().noGlobal===!0&&(zb.moment=wb),vb}),ub(!0)):ub()}).call(this); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/moment.min.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/moment.min.js new file mode 100644 index 0000000..024d488 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/moment.min.js @@ -0,0 +1,7 @@ +//! moment.js +//! version : 2.9.0 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com +(function(a){function b(a,b,c){switch(arguments.length){case 2:return null!=a?a:b;case 3:return null!=a?a:null!=b?b:c;default:throw new Error("Implement me")}}function c(a,b){return Bb.call(a,b)}function d(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function e(a){vb.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+a)}function f(a,b){var c=!0;return o(function(){return c&&(e(a),c=!1),b.apply(this,arguments)},b)}function g(a,b){sc[a]||(e(b),sc[a]=!0)}function h(a,b){return function(c){return r(a.call(this,c),b)}}function i(a,b){return function(c){return this.localeData().ordinal(a.call(this,c),b)}}function j(a,b){var c,d,e=12*(b.year()-a.year())+(b.month()-a.month()),f=a.clone().add(e,"months");return 0>b-f?(c=a.clone().add(e-1,"months"),d=(b-f)/(f-c)):(c=a.clone().add(e+1,"months"),d=(b-f)/(c-f)),-(e+d)}function k(a,b,c){var d;return null==c?b:null!=a.meridiemHour?a.meridiemHour(b,c):null!=a.isPM?(d=a.isPM(c),d&&12>b&&(b+=12),d||12!==b||(b=0),b):b}function l(){}function m(a,b){b!==!1&&H(a),p(this,a),this._d=new Date(+a._d),uc===!1&&(uc=!0,vb.updateOffset(this),uc=!1)}function n(a){var b=A(a),c=b.year||0,d=b.quarter||0,e=b.month||0,f=b.week||0,g=b.day||0,h=b.hour||0,i=b.minute||0,j=b.second||0,k=b.millisecond||0;this._milliseconds=+k+1e3*j+6e4*i+36e5*h,this._days=+g+7*f,this._months=+e+3*d+12*c,this._data={},this._locale=vb.localeData(),this._bubble()}function o(a,b){for(var d in b)c(b,d)&&(a[d]=b[d]);return c(b,"toString")&&(a.toString=b.toString),c(b,"valueOf")&&(a.valueOf=b.valueOf),a}function p(a,b){var c,d,e;if("undefined"!=typeof b._isAMomentObject&&(a._isAMomentObject=b._isAMomentObject),"undefined"!=typeof b._i&&(a._i=b._i),"undefined"!=typeof b._f&&(a._f=b._f),"undefined"!=typeof b._l&&(a._l=b._l),"undefined"!=typeof b._strict&&(a._strict=b._strict),"undefined"!=typeof b._tzm&&(a._tzm=b._tzm),"undefined"!=typeof b._isUTC&&(a._isUTC=b._isUTC),"undefined"!=typeof b._offset&&(a._offset=b._offset),"undefined"!=typeof b._pf&&(a._pf=b._pf),"undefined"!=typeof b._locale&&(a._locale=b._locale),Kb.length>0)for(c in Kb)d=Kb[c],e=b[d],"undefined"!=typeof e&&(a[d]=e);return a}function q(a){return 0>a?Math.ceil(a):Math.floor(a)}function r(a,b,c){for(var d=""+Math.abs(a),e=a>=0;d.lengthd;d++)(c&&a[d]!==b[d]||!c&&C(a[d])!==C(b[d]))&&g++;return g+f}function z(a){if(a){var b=a.toLowerCase().replace(/(.)s$/,"$1");a=lc[a]||mc[b]||b}return a}function A(a){var b,d,e={};for(d in a)c(a,d)&&(b=z(d),b&&(e[b]=a[d]));return e}function B(b){var c,d;if(0===b.indexOf("week"))c=7,d="day";else{if(0!==b.indexOf("month"))return;c=12,d="month"}vb[b]=function(e,f){var g,h,i=vb._locale[b],j=[];if("number"==typeof e&&(f=e,e=a),h=function(a){var b=vb().utc().set(d,a);return i.call(vb._locale,b,e||"")},null!=f)return h(f);for(g=0;c>g;g++)j.push(h(g));return j}}function C(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=b>=0?Math.floor(b):Math.ceil(b)),c}function D(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function E(a,b,c){return jb(vb([a,11,31+b-c]),b,c).week}function F(a){return G(a)?366:365}function G(a){return a%4===0&&a%100!==0||a%400===0}function H(a){var b;a._a&&-2===a._pf.overflow&&(b=a._a[Db]<0||a._a[Db]>11?Db:a._a[Eb]<1||a._a[Eb]>D(a._a[Cb],a._a[Db])?Eb:a._a[Fb]<0||a._a[Fb]>24||24===a._a[Fb]&&(0!==a._a[Gb]||0!==a._a[Hb]||0!==a._a[Ib])?Fb:a._a[Gb]<0||a._a[Gb]>59?Gb:a._a[Hb]<0||a._a[Hb]>59?Hb:a._a[Ib]<0||a._a[Ib]>999?Ib:-1,a._pf._overflowDayOfYear&&(Cb>b||b>Eb)&&(b=Eb),a._pf.overflow=b)}function I(b){return null==b._isValid&&(b._isValid=!isNaN(b._d.getTime())&&b._pf.overflow<0&&!b._pf.empty&&!b._pf.invalidMonth&&!b._pf.nullInput&&!b._pf.invalidFormat&&!b._pf.userInvalidated,b._strict&&(b._isValid=b._isValid&&0===b._pf.charsLeftOver&&0===b._pf.unusedTokens.length&&b._pf.bigHour===a)),b._isValid}function J(a){return a?a.toLowerCase().replace("_","-"):a}function K(a){for(var b,c,d,e,f=0;f0;){if(d=L(e.slice(0,b).join("-")))return d;if(c&&c.length>=b&&y(e,c,!0)>=b-1)break;b--}f++}return null}function L(a){var b=null;if(!Jb[a]&&Lb)try{b=vb.locale(),require("./locale/"+a),vb.locale(b)}catch(c){}return Jb[a]}function M(a,b){var c,d;return b._isUTC?(c=b.clone(),d=(vb.isMoment(a)||x(a)?+a:+vb(a))-+c,c._d.setTime(+c._d+d),vb.updateOffset(c,!1),c):vb(a).local()}function N(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function O(a){var b,c,d=a.match(Pb);for(b=0,c=d.length;c>b;b++)d[b]=rc[d[b]]?rc[d[b]]:N(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 P(a,b){return a.isValid()?(b=Q(b,a.localeData()),nc[b]||(nc[b]=O(b)),nc[b](a)):a.localeData().invalidDate()}function Q(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(Qb.lastIndex=0;d>=0&&Qb.test(a);)a=a.replace(Qb,c),Qb.lastIndex=0,d-=1;return a}function R(a,b){var c,d=b._strict;switch(a){case"Q":return _b;case"DDDD":return bc;case"YYYY":case"GGGG":case"gggg":return d?cc:Tb;case"Y":case"G":case"g":return ec;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return d?dc:Ub;case"S":if(d)return _b;case"SS":if(d)return ac;case"SSS":if(d)return bc;case"DDD":return Sb;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Wb;case"a":case"A":return b._locale._meridiemParse;case"x":return Zb;case"X":return $b;case"Z":case"ZZ":return Xb;case"T":return Yb;case"SSSS":return Vb;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return d?ac:Rb;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return Rb;case"Do":return d?b._locale._ordinalParse:b._locale._ordinalParseLenient;default:return c=new RegExp($(Z(a.replace("\\","")),"i"))}}function S(a){a=a||"";var b=a.match(Xb)||[],c=b[b.length-1]||[],d=(c+"").match(jc)||["-",0,0],e=+(60*d[1])+C(d[2]);return"+"===d[0]?e:-e}function T(a,b,c){var d,e=c._a;switch(a){case"Q":null!=b&&(e[Db]=3*(C(b)-1));break;case"M":case"MM":null!=b&&(e[Db]=C(b)-1);break;case"MMM":case"MMMM":d=c._locale.monthsParse(b,a,c._strict),null!=d?e[Db]=d:c._pf.invalidMonth=b;break;case"D":case"DD":null!=b&&(e[Eb]=C(b));break;case"Do":null!=b&&(e[Eb]=C(parseInt(b.match(/\d{1,2}/)[0],10)));break;case"DDD":case"DDDD":null!=b&&(c._dayOfYear=C(b));break;case"YY":e[Cb]=vb.parseTwoDigitYear(b);break;case"YYYY":case"YYYYY":case"YYYYYY":e[Cb]=C(b);break;case"a":case"A":c._meridiem=b;break;case"h":case"hh":c._pf.bigHour=!0;case"H":case"HH":e[Fb]=C(b);break;case"m":case"mm":e[Gb]=C(b);break;case"s":case"ss":e[Hb]=C(b);break;case"S":case"SS":case"SSS":case"SSSS":e[Ib]=C(1e3*("0."+b));break;case"x":c._d=new Date(C(b));break;case"X":c._d=new Date(1e3*parseFloat(b));break;case"Z":case"ZZ":c._useUTC=!0,c._tzm=S(b);break;case"dd":case"ddd":case"dddd":d=c._locale.weekdaysParse(b),null!=d?(c._w=c._w||{},c._w.d=d):c._pf.invalidWeekday=b;break;case"w":case"ww":case"W":case"WW":case"d":case"e":case"E":a=a.substr(0,1);case"gggg":case"GGGG":case"GGGGG":a=a.substr(0,2),b&&(c._w=c._w||{},c._w[a]=C(b));break;case"gg":case"GG":c._w=c._w||{},c._w[a]=vb.parseTwoDigitYear(b)}}function U(a){var c,d,e,f,g,h,i;c=a._w,null!=c.GG||null!=c.W||null!=c.E?(g=1,h=4,d=b(c.GG,a._a[Cb],jb(vb(),1,4).year),e=b(c.W,1),f=b(c.E,1)):(g=a._locale._week.dow,h=a._locale._week.doy,d=b(c.gg,a._a[Cb],jb(vb(),g,h).year),e=b(c.w,1),null!=c.d?(f=c.d,g>f&&++e):f=null!=c.e?c.e+g:g),i=kb(d,e,f,h,g),a._a[Cb]=i.year,a._dayOfYear=i.dayOfYear}function V(a){var c,d,e,f,g=[];if(!a._d){for(e=X(a),a._w&&null==a._a[Eb]&&null==a._a[Db]&&U(a),a._dayOfYear&&(f=b(a._a[Cb],e[Cb]),a._dayOfYear>F(f)&&(a._pf._overflowDayOfYear=!0),d=fb(f,0,a._dayOfYear),a._a[Db]=d.getUTCMonth(),a._a[Eb]=d.getUTCDate()),c=0;3>c&&null==a._a[c];++c)a._a[c]=g[c]=e[c];for(;7>c;c++)a._a[c]=g[c]=null==a._a[c]?2===c?1:0:a._a[c];24===a._a[Fb]&&0===a._a[Gb]&&0===a._a[Hb]&&0===a._a[Ib]&&(a._nextDay=!0,a._a[Fb]=0),a._d=(a._useUTC?fb:eb).apply(null,g),null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()-a._tzm),a._nextDay&&(a._a[Fb]=24)}}function W(a){var b;a._d||(b=A(a._i),a._a=[b.year,b.month,b.day||b.date,b.hour,b.minute,b.second,b.millisecond],V(a))}function X(a){var b=new Date;return a._useUTC?[b.getUTCFullYear(),b.getUTCMonth(),b.getUTCDate()]:[b.getFullYear(),b.getMonth(),b.getDate()]}function Y(b){if(b._f===vb.ISO_8601)return void ab(b);b._a=[],b._pf.empty=!0;var c,d,e,f,g,h=""+b._i,i=h.length,j=0;for(e=Q(b._f,b._locale).match(Pb)||[],c=0;c0&&b._pf.unusedInput.push(g),h=h.slice(h.indexOf(d)+d.length),j+=d.length),rc[f]?(d?b._pf.empty=!1:b._pf.unusedTokens.push(f),T(f,d,b)):b._strict&&!d&&b._pf.unusedTokens.push(f);b._pf.charsLeftOver=i-j,h.length>0&&b._pf.unusedInput.push(h),b._pf.bigHour===!0&&b._a[Fb]<=12&&(b._pf.bigHour=a),b._a[Fb]=k(b._locale,b._a[Fb],b._meridiem),V(b),H(b)}function Z(a){return a.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e})}function $(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function _(a){var b,c,e,f,g;if(0===a._f.length)return a._pf.invalidFormat=!0,void(a._d=new Date(0/0));for(f=0;fg)&&(e=g,c=b));o(a,c||b)}function ab(a){var b,c,d=a._i,e=fc.exec(d);if(e){for(a._pf.iso=!0,b=0,c=hc.length;c>b;b++)if(hc[b][1].exec(d)){a._f=hc[b][0]+(e[6]||" ");break}for(b=0,c=ic.length;c>b;b++)if(ic[b][1].exec(d)){a._f+=ic[b][0];break}d.match(Xb)&&(a._f+="Z"),Y(a)}else a._isValid=!1}function bb(a){ab(a),a._isValid===!1&&(delete a._isValid,vb.createFromInputFallback(a))}function cb(a,b){var c,d=[];for(c=0;ca&&h.setFullYear(a),h}function fb(a){var b=new Date(Date.UTC.apply(null,arguments));return 1970>a&&b.setUTCFullYear(a),b}function gb(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 hb(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function ib(a,b,c){var d=vb.duration(a).abs(),e=Ab(d.as("s")),f=Ab(d.as("m")),g=Ab(d.as("h")),h=Ab(d.as("d")),i=Ab(d.as("M")),j=Ab(d.as("y")),k=e0,k[4]=c,hb.apply({},k)}function jb(a,b,c){var d,e=c-b,f=c-a.day();return f>e&&(f-=7),e-7>f&&(f+=7),d=vb(a).add(f,"d"),{week:Math.ceil(d.dayOfYear()/7),year:d.year()}}function kb(a,b,c,d,e){var f,g,h=fb(a,0,1).getUTCDay();return h=0===h?7:h,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:F(a-1)+g}}function lb(b){var c,d=b._i,e=b._f;return b._locale=b._locale||vb.localeData(b._l),null===d||e===a&&""===d?vb.invalid({nullInput:!0}):("string"==typeof d&&(b._i=d=b._locale.preparse(d)),vb.isMoment(d)?new m(d,!0):(e?w(e)?_(b):Y(b):db(b),c=new m(b),c._nextDay&&(c.add(1,"d"),c._nextDay=a),c))}function mb(a,b){var c,d;if(1===b.length&&w(b[0])&&(b=b[0]),!b.length)return vb();for(c=b[0],d=1;d=0?"+":"-";return b+r(Math.abs(a),6)},gg:function(){return r(this.weekYear()%100,2)},gggg:function(){return r(this.weekYear(),4)},ggggg:function(){return r(this.weekYear(),5)},GG:function(){return r(this.isoWeekYear()%100,2)},GGGG:function(){return r(this.isoWeekYear(),4)},GGGGG:function(){return r(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.localeData().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.localeData().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 C(this.milliseconds()/100)},SS:function(){return r(C(this.milliseconds()/10),2)},SSS:function(){return r(this.milliseconds(),3)},SSSS:function(){return r(this.milliseconds(),3)},Z:function(){var a=this.utcOffset(),b="+";return 0>a&&(a=-a,b="-"),b+r(C(a/60),2)+":"+r(C(a)%60,2)},ZZ:function(){var a=this.utcOffset(),b="+";return 0>a&&(a=-a,b="-"),b+r(C(a/60),2)+r(C(a)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},x:function(){return this.valueOf()},X:function(){return this.unix()},Q:function(){return this.quarter()}},sc={},tc=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"],uc=!1;pc.length;)xb=pc.pop(),rc[xb+"o"]=i(rc[xb],xb);for(;qc.length;)xb=qc.pop(),rc[xb+xb]=h(rc[xb],2);rc.DDDD=h(rc.DDD,3),o(l.prototype,{set:function(a){var b,c;for(c in a)b=a[c],"function"==typeof b?this[c]=b:this["_"+c]=b;this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)},_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,b,c){var d,e,f;for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),d=0;12>d;d++){if(e=vb.utc([2e3,d]),c&&!this._longMonthsParse[d]&&(this._longMonthsParse[d]=new RegExp("^"+this.months(e,"").replace(".","")+"$","i"),this._shortMonthsParse[d]=new RegExp("^"+this.monthsShort(e,"").replace(".","")+"$","i")),c||this._monthsParse[d]||(f="^"+this.months(e,"")+"|^"+this.monthsShort(e,""),this._monthsParse[d]=new RegExp(f.replace(".",""),"i")),c&&"MMMM"===b&&this._longMonthsParse[d].test(a))return d;if(c&&"MMM"===b&&this._shortMonthsParse[d].test(a))return d;if(!c&&this._monthsParse[d].test(a))return d}},_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=vb([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:{LTS:"h:mm:ss A",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,c){var d=this._calendar[a];return"function"==typeof d?d.apply(b,[c]):d},_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",_ordinalParse:/\d{1,2}/,preparse:function(a){return a},postformat:function(a){return a},week:function(a){return jb(a,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},firstDayOfWeek:function(){return this._week.dow},firstDayOfYear:function(){return this._week.doy},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),vb=function(b,c,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._i=b,g._f=c,g._l=e,g._strict=f,g._isUTC=!1,g._pf=d(),lb(g)},vb.suppressDeprecationWarnings=!1,vb.createFromInputFallback=f("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(a){a._d=new Date(a._i+(a._useUTC?" UTC":""))}),vb.min=function(){var a=[].slice.call(arguments,0);return mb("isBefore",a)},vb.max=function(){var a=[].slice.call(arguments,0);return mb("isAfter",a)},vb.utc=function(b,c,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=b,g._f=c,g._strict=f,g._pf=d(),lb(g).utc()},vb.unix=function(a){return vb(1e3*a)},vb.duration=function(a,b){var d,e,f,g,h=a,i=null;return vb.isDuration(a)?h={ms:a._milliseconds,d:a._days,M:a._months}:"number"==typeof a?(h={},b?h[b]=a:h.milliseconds=a):(i=Nb.exec(a))?(d="-"===i[1]?-1:1,h={y:0,d:C(i[Eb])*d,h:C(i[Fb])*d,m:C(i[Gb])*d,s:C(i[Hb])*d,ms:C(i[Ib])*d}):(i=Ob.exec(a))?(d="-"===i[1]?-1:1,f=function(a){var b=a&&parseFloat(a.replace(",","."));return(isNaN(b)?0:b)*d},h={y:f(i[2]),M:f(i[3]),d:f(i[4]),h:f(i[5]),m:f(i[6]),s:f(i[7]),w:f(i[8])}):null==h?h={}:"object"==typeof h&&("from"in h||"to"in h)&&(g=t(vb(h.from),vb(h.to)),h={},h.ms=g.milliseconds,h.M=g.months),e=new n(h),vb.isDuration(a)&&c(a,"_locale")&&(e._locale=a._locale),e},vb.version=yb,vb.defaultFormat=gc,vb.ISO_8601=function(){},vb.momentProperties=Kb,vb.updateOffset=function(){},vb.relativeTimeThreshold=function(b,c){return oc[b]===a?!1:c===a?oc[b]:(oc[b]=c,!0)},vb.lang=f("moment.lang is deprecated. Use moment.locale instead.",function(a,b){return vb.locale(a,b)}),vb.locale=function(a,b){var c;return a&&(c="undefined"!=typeof b?vb.defineLocale(a,b):vb.localeData(a),c&&(vb.duration._locale=vb._locale=c)),vb._locale._abbr},vb.defineLocale=function(a,b){return null!==b?(b.abbr=a,Jb[a]||(Jb[a]=new l),Jb[a].set(b),vb.locale(a),Jb[a]):(delete Jb[a],null)},vb.langData=f("moment.langData is deprecated. Use moment.localeData instead.",function(a){return vb.localeData(a)}),vb.localeData=function(a){var b;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return vb._locale;if(!w(a)){if(b=L(a))return b;a=[a]}return K(a)},vb.isMoment=function(a){return a instanceof m||null!=a&&c(a,"_isAMomentObject")},vb.isDuration=function(a){return a instanceof n};for(xb=tc.length-1;xb>=0;--xb)B(tc[xb]);vb.normalizeUnits=function(a){return z(a)},vb.invalid=function(a){var b=vb.utc(0/0);return null!=a?o(b._pf,a):b._pf.userInvalidated=!0,b},vb.parseZone=function(){return vb.apply(null,arguments).parseZone()},vb.parseTwoDigitYear=function(a){return C(a)+(C(a)>68?1900:2e3)},vb.isDate=x,o(vb.fn=m.prototype,{clone:function(){return vb(this)},valueOf:function(){return+this._d-6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().locale("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=vb(this).utc();return 00:!1},parsingFlags:function(){return o({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(a){return this.utcOffset(0,a)},local:function(a){return this._isUTC&&(this.utcOffset(0,a),this._isUTC=!1,a&&this.subtract(this._dateUtcOffset(),"m")),this},format:function(a){var b=P(this,a||vb.defaultFormat);return this.localeData().postformat(b)},add:u(1,"add"),subtract:u(-1,"subtract"),diff:function(a,b,c){var d,e,f=M(a,this),g=6e4*(f.utcOffset()-this.utcOffset());return b=z(b),"year"===b||"month"===b||"quarter"===b?(e=j(this,f),"quarter"===b?e/=3:"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:q(e)},from:function(a,b){return vb.duration({to:this,from:a}).locale(this.locale()).humanize(!b)},fromNow:function(a){return this.from(vb(),a)},calendar:function(a){var b=a||vb(),c=M(b,this).startOf("day"),d=this.diff(c,"days",!0),e=-6>d?"sameElse":-1>d?"lastWeek":0>d?"lastDay":1>d?"sameDay":2>d?"nextDay":7>d?"nextWeek":"sameElse";return this.format(this.localeData().calendar(e,this,vb(b)))},isLeapYear:function(){return G(this.year())},isDST:function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},day:function(a){var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=gb(a,this.localeData()),this.add(a-b,"d")):b},month:qb("Month",!0),startOf:function(a){switch(a=z(a)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===a?this.weekday(0):"isoWeek"===a&&this.isoWeekday(1),"quarter"===a&&this.month(3*Math.floor(this.month()/3)),this},endOf:function(b){return b=z(b),b===a||"millisecond"===b?this:this.startOf(b).add(1,"isoWeek"===b?"week":b).subtract(1,"ms")},isAfter:function(a,b){var c;return b=z("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=vb.isMoment(a)?a:vb(a),+this>+a):(c=vb.isMoment(a)?+a:+vb(a),c<+this.clone().startOf(b))},isBefore:function(a,b){var c;return b=z("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=vb.isMoment(a)?a:vb(a),+a>+this):(c=vb.isMoment(a)?+a:+vb(a),+this.clone().endOf(b)a?this:a}),max:f("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(a){return a=vb.apply(null,arguments),a>this?this:a}),zone:f("moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779",function(a,b){return null!=a?("string"!=typeof a&&(a=-a),this.utcOffset(a,b),this):-this.utcOffset()}),utcOffset:function(a,b){var c,d=this._offset||0;return null!=a?("string"==typeof a&&(a=S(a)),Math.abs(a)<16&&(a=60*a),!this._isUTC&&b&&(c=this._dateUtcOffset()),this._offset=a,this._isUTC=!0,null!=c&&this.add(c,"m"),d!==a&&(!b||this._changeInProgress?v(this,vb.duration(a-d,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,vb.updateOffset(this,!0),this._changeInProgress=null)),this):this._isUTC?d:this._dateUtcOffset()},isLocal:function(){return!this._isUTC},isUtcOffset:function(){return this._isUTC},isUtc:function(){return this._isUTC&&0===this._offset},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.utcOffset(this._tzm):"string"==typeof this._i&&this.utcOffset(S(this._i)),this},hasAlignedHourOffset:function(a){return a=a?vb(a).utcOffset():0,(this.utcOffset()-a)%60===0},daysInMonth:function(){return D(this.year(),this.month())},dayOfYear:function(a){var b=Ab((vb(this).startOf("day")-vb(this).startOf("year"))/864e5)+1;return null==a?b:this.add(a-b,"d")},quarter:function(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)},weekYear:function(a){var b=jb(this,this.localeData()._week.dow,this.localeData()._week.doy).year;return null==a?b:this.add(a-b,"y")},isoWeekYear:function(a){var b=jb(this,1,4).year;return null==a?b:this.add(a-b,"y")},week:function(a){var b=this.localeData().week(this);return null==a?b:this.add(7*(a-b),"d")},isoWeek:function(a){var b=jb(this,1,4).week;return null==a?b:this.add(7*(a-b),"d")},weekday:function(a){var b=(this.day()+7-this.localeData()._week.dow)%7;return null==a?b:this.add(a-b,"d")},isoWeekday:function(a){return null==a?this.day()||7:this.day(this.day()%7?a:a-7)},isoWeeksInYear:function(){return E(this.year(),1,4)},weeksInYear:function(){var a=this.localeData()._week;return E(this.year(),a.dow,a.doy)},get:function(a){return a=z(a),this[a]()},set:function(a,b){var c;if("object"==typeof a)for(c in a)this.set(c,a[c]);else a=z(a),"function"==typeof this[a]&&this[a](b);return this},locale:function(b){var c;return b===a?this._locale._abbr:(c=vb.localeData(b),null!=c&&(this._locale=c),this)},lang:f("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(b){return b===a?this.localeData():this.locale(b)}),localeData:function(){return this._locale},_dateUtcOffset:function(){return 15*-Math.round(this._d.getTimezoneOffset()/15)}}),vb.fn.millisecond=vb.fn.milliseconds=qb("Milliseconds",!1),vb.fn.second=vb.fn.seconds=qb("Seconds",!1),vb.fn.minute=vb.fn.minutes=qb("Minutes",!1),vb.fn.hour=vb.fn.hours=qb("Hours",!0),vb.fn.date=qb("Date",!0),vb.fn.dates=f("dates accessor is deprecated. Use date instead.",qb("Date",!0)),vb.fn.year=qb("FullYear",!0),vb.fn.years=f("years accessor is deprecated. Use year instead.",qb("FullYear",!0)),vb.fn.days=vb.fn.day,vb.fn.months=vb.fn.month,vb.fn.weeks=vb.fn.week,vb.fn.isoWeeks=vb.fn.isoWeek,vb.fn.quarters=vb.fn.quarter,vb.fn.toJSON=vb.fn.toISOString,vb.fn.isUTC=vb.fn.isUtc,o(vb.duration.fn=n.prototype,{_bubble:function(){var a,b,c,d=this._milliseconds,e=this._days,f=this._months,g=this._data,h=0;g.milliseconds=d%1e3,a=q(d/1e3),g.seconds=a%60,b=q(a/60),g.minutes=b%60,c=q(b/60),g.hours=c%24,e+=q(c/24),h=q(rb(e)),e-=q(sb(h)),f+=q(e/30),e%=30,h+=q(f/12),f%=12,g.days=e,g.months=f,g.years=h},abs:function(){return this._milliseconds=Math.abs(this._milliseconds),this._days=Math.abs(this._days),this._months=Math.abs(this._months),this._data.milliseconds=Math.abs(this._data.milliseconds),this._data.seconds=Math.abs(this._data.seconds),this._data.minutes=Math.abs(this._data.minutes),this._data.hours=Math.abs(this._data.hours),this._data.months=Math.abs(this._data.months),this._data.years=Math.abs(this._data.years),this},weeks:function(){return q(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*C(this._months/12) +},humanize:function(a){var b=ib(this,!a,this.localeData());return a&&(b=this.localeData().pastFuture(+this,b)),this.localeData().postformat(b)},add:function(a,b){var c=vb.duration(a,b);return this._milliseconds+=c._milliseconds,this._days+=c._days,this._months+=c._months,this._bubble(),this},subtract:function(a,b){var c=vb.duration(a,b);return this._milliseconds-=c._milliseconds,this._days-=c._days,this._months-=c._months,this._bubble(),this},get:function(a){return a=z(a),this[a.toLowerCase()+"s"]()},as:function(a){var b,c;if(a=z(a),"month"===a||"year"===a)return b=this._days+this._milliseconds/864e5,c=this._months+12*rb(b),"month"===a?c:c/12;switch(b=this._days+Math.round(sb(this._months/12)),a){case"week":return b/7+this._milliseconds/6048e5;case"day":return b+this._milliseconds/864e5;case"hour":return 24*b+this._milliseconds/36e5;case"minute":return 24*b*60+this._milliseconds/6e4;case"second":return 24*b*60*60+this._milliseconds/1e3;case"millisecond":return Math.floor(24*b*60*60*1e3)+this._milliseconds;default:throw new Error("Unknown unit "+a)}},lang:vb.fn.lang,locale:vb.fn.locale,toIsoString:f("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",function(){return this.toISOString()}),toISOString:function(){var a=Math.abs(this.years()),b=Math.abs(this.months()),c=Math.abs(this.days()),d=Math.abs(this.hours()),e=Math.abs(this.minutes()),f=Math.abs(this.seconds()+this.milliseconds()/1e3);return this.asSeconds()?(this.asSeconds()<0?"-":"")+"P"+(a?a+"Y":"")+(b?b+"M":"")+(c?c+"D":"")+(d||e||f?"T":"")+(d?d+"H":"")+(e?e+"M":"")+(f?f+"S":""):"P0D"},localeData:function(){return this._locale},toJSON:function(){return this.toISOString()}}),vb.duration.fn.toString=vb.duration.fn.toISOString;for(xb in kc)c(kc,xb)&&tb(xb.toLowerCase());vb.duration.fn.asMilliseconds=function(){return this.as("ms")},vb.duration.fn.asSeconds=function(){return this.as("s")},vb.duration.fn.asMinutes=function(){return this.as("m")},vb.duration.fn.asHours=function(){return this.as("h")},vb.duration.fn.asDays=function(){return this.as("d")},vb.duration.fn.asWeeks=function(){return this.as("weeks")},vb.duration.fn.asMonths=function(){return this.as("M")},vb.duration.fn.asYears=function(){return this.as("y")},vb.locale("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var b=a%10,c=1===C(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}),Lb?module.exports=vb:"function"==typeof define&&define.amd?(define(function(a,b,c){return c.config&&c.config()&&c.config().noGlobal===!0&&(zb.moment=wb),vb}),ub(!0)):ub()}).call(this); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/moment.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/moment.js new file mode 100644 index 0000000..c635ec0 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/moment.js @@ -0,0 +1,3043 @@ +//! moment.js +//! version : 2.9.0 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com + +(function (undefined) { + /************************************ + Constants + ************************************/ + + var moment, + VERSION = '2.9.0', + // the global-scope this is NOT the global object in Node.js + globalScope = (typeof global !== 'undefined' && (typeof window === 'undefined' || window === global.window)) ? global : this, + oldGlobalMoment, + round = Math.round, + hasOwnProperty = Object.prototype.hasOwnProperty, + i, + + YEAR = 0, + MONTH = 1, + DATE = 2, + HOUR = 3, + MINUTE = 4, + SECOND = 5, + MILLISECOND = 6, + + // internal storage for locale config files + locales = {}, + + // extra moment internal properties (plugins register props here) + momentProperties = [], + + // check for nodeJS + hasModule = (typeof module !== 'undefined' && module && module.exports), + + // ASP.NET json date format regex + aspNetJsonRegex = /^\/?Date\((\-?\d+)/i, + aspNetTimeSpanJsonRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/, + + // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html + // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere + isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/, + + // format tokens + formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|x|X|zz?|ZZ?|.)/g, + localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, + + // parsing token regexes + parseTokenOneOrTwoDigits = /\d\d?/, // 0 - 99 + parseTokenOneToThreeDigits = /\d{1,3}/, // 0 - 999 + parseTokenOneToFourDigits = /\d{1,4}/, // 0 - 9999 + parseTokenOneToSixDigits = /[+\-]?\d{1,6}/, // -999,999 - 999,999 + parseTokenDigits = /\d+/, // nonzero number of digits + parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i, // any word (or two) characters or numbers including two/three word month in arabic. + parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z + parseTokenT = /T/i, // T (ISO separator) + parseTokenOffsetMs = /[\+\-]?\d+/, // 1234567890123 + parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123 + + //strict parsing regexes + parseTokenOneDigit = /\d/, // 0 - 9 + parseTokenTwoDigits = /\d\d/, // 00 - 99 + parseTokenThreeDigits = /\d{3}/, // 000 - 999 + parseTokenFourDigits = /\d{4}/, // 0000 - 9999 + parseTokenSixDigits = /[+-]?\d{6}/, // -999,999 - 999,999 + parseTokenSignedNumber = /[+-]?\d+/, // -inf - inf + + // iso 8601 regex + // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) + isoRegex = /^\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)?)?$/, + + isoFormat = 'YYYY-MM-DDTHH:mm:ssZ', + + isoDates = [ + ['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}/] + ], + + // iso time formats and regexes + isoTimes = [ + ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d+/], + ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/], + ['HH:mm', /(T| )\d\d:\d\d/], + ['HH', /(T| )\d\d/] + ], + + // timezone chunker '+10:00' > ['10', '00'] or '-1530' > ['-', '15', '30'] + parseTimezoneChunker = /([\+\-]|\d\d)/gi, + + // getter and setter names + proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'), + unitMillisecondFactors = { + 'Milliseconds' : 1, + 'Seconds' : 1e3, + 'Minutes' : 6e4, + 'Hours' : 36e5, + 'Days' : 864e5, + 'Months' : 2592e6, + 'Years' : 31536e6 + }, + + unitAliases = { + ms : 'millisecond', + s : 'second', + m : 'minute', + h : 'hour', + d : 'day', + D : 'date', + w : 'week', + W : 'isoWeek', + M : 'month', + Q : 'quarter', + y : 'year', + DDD : 'dayOfYear', + e : 'weekday', + E : 'isoWeekday', + gg: 'weekYear', + GG: 'isoWeekYear' + }, + + camelFunctions = { + dayofyear : 'dayOfYear', + isoweekday : 'isoWeekday', + isoweek : 'isoWeek', + weekyear : 'weekYear', + isoweekyear : 'isoWeekYear' + }, + + // format function strings + formatFunctions = {}, + + // default relative time thresholds + relativeTimeThresholds = { + s: 45, // seconds to minute + m: 45, // minutes to hour + h: 22, // hours to day + d: 26, // days to month + M: 11 // months to year + }, + + // tokens to ordinalize and pad + ordinalizeTokens = 'DDD w W M D d'.split(' '), + paddedTokens = 'M D H h m s w W'.split(' '), + + formatTokenFunctions = { + M : function () { + return this.month() + 1; + }, + MMM : function (format) { + return this.localeData().monthsShort(this, format); + }, + MMMM : function (format) { + return this.localeData().months(this, format); + }, + D : function () { + return this.date(); + }, + DDD : function () { + return this.dayOfYear(); + }, + d : function () { + return this.day(); + }, + dd : function (format) { + return this.localeData().weekdaysMin(this, format); + }, + ddd : function (format) { + return this.localeData().weekdaysShort(this, format); + }, + dddd : function (format) { + return this.localeData().weekdays(this, format); + }, + w : function () { + return this.week(); + }, + W : function () { + return this.isoWeek(); + }, + YY : function () { + return leftZeroFill(this.year() % 100, 2); + }, + YYYY : function () { + return leftZeroFill(this.year(), 4); + }, + YYYYY : function () { + return leftZeroFill(this.year(), 5); + }, + YYYYYY : function () { + var y = this.year(), sign = y >= 0 ? '+' : '-'; + return sign + leftZeroFill(Math.abs(y), 6); + }, + gg : function () { + return leftZeroFill(this.weekYear() % 100, 2); + }, + gggg : function () { + return leftZeroFill(this.weekYear(), 4); + }, + ggggg : function () { + return leftZeroFill(this.weekYear(), 5); + }, + GG : function () { + return leftZeroFill(this.isoWeekYear() % 100, 2); + }, + GGGG : function () { + return leftZeroFill(this.isoWeekYear(), 4); + }, + GGGGG : function () { + return leftZeroFill(this.isoWeekYear(), 5); + }, + e : function () { + return this.weekday(); + }, + E : function () { + return this.isoWeekday(); + }, + a : function () { + return this.localeData().meridiem(this.hours(), this.minutes(), true); + }, + A : function () { + return this.localeData().meridiem(this.hours(), this.minutes(), false); + }, + 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 toInt(this.milliseconds() / 100); + }, + SS : function () { + return leftZeroFill(toInt(this.milliseconds() / 10), 2); + }, + SSS : function () { + return leftZeroFill(this.milliseconds(), 3); + }, + SSSS : function () { + return leftZeroFill(this.milliseconds(), 3); + }, + Z : function () { + var a = this.utcOffset(), + b = '+'; + if (a < 0) { + a = -a; + b = '-'; + } + return b + leftZeroFill(toInt(a / 60), 2) + ':' + leftZeroFill(toInt(a) % 60, 2); + }, + ZZ : function () { + var a = this.utcOffset(), + b = '+'; + if (a < 0) { + a = -a; + b = '-'; + } + return b + leftZeroFill(toInt(a / 60), 2) + leftZeroFill(toInt(a) % 60, 2); + }, + z : function () { + return this.zoneAbbr(); + }, + zz : function () { + return this.zoneName(); + }, + x : function () { + return this.valueOf(); + }, + X : function () { + return this.unix(); + }, + Q : function () { + return this.quarter(); + } + }, + + deprecations = {}, + + lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin'], + + updateInProgress = false; + + // Pick the first defined of two or three arguments. dfl comes from + // default. + function dfl(a, b, c) { + switch (arguments.length) { + case 2: return a != null ? a : b; + case 3: return a != null ? a : b != null ? b : c; + default: throw new Error('Implement me'); + } + } + + function hasOwnProp(a, b) { + return hasOwnProperty.call(a, b); + } + + function defaultParsingFlags() { + // We need to deep clone this object, and es5 standard is not very + // helpful. + return { + empty : false, + unusedTokens : [], + unusedInput : [], + overflow : -2, + charsLeftOver : 0, + nullInput : false, + invalidMonth : null, + invalidFormat : false, + userInvalidated : false, + iso: false + }; + } + + function printMsg(msg) { + if (moment.suppressDeprecationWarnings === false && + typeof console !== 'undefined' && console.warn) { + console.warn('Deprecation warning: ' + msg); + } + } + + function deprecate(msg, fn) { + var firstTime = true; + return extend(function () { + if (firstTime) { + printMsg(msg); + firstTime = false; + } + return fn.apply(this, arguments); + }, fn); + } + + function deprecateSimple(name, msg) { + if (!deprecations[name]) { + printMsg(msg); + deprecations[name] = true; + } + } + + function padToken(func, count) { + return function (a) { + return leftZeroFill(func.call(this, a), count); + }; + } + function ordinalizeToken(func, period) { + return function (a) { + return this.localeData().ordinal(func.call(this, a), period); + }; + } + + function monthDiff(a, b) { + // difference in months + var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), + // b is in (anchor - 1 month, anchor + 1 month) + anchor = a.clone().add(wholeMonthDiff, 'months'), + anchor2, adjust; + + if (b - anchor < 0) { + anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor - anchor2); + } else { + anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor2 - anchor); + } + + return -(wholeMonthDiff + adjust); + } + + while (ordinalizeTokens.length) { + i = ordinalizeTokens.pop(); + formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i); + } + while (paddedTokens.length) { + i = paddedTokens.pop(); + formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2); + } + formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3); + + + function meridiemFixWrap(locale, hour, meridiem) { + var isPm; + + if (meridiem == null) { + // nothing to do + return hour; + } + if (locale.meridiemHour != null) { + return locale.meridiemHour(hour, meridiem); + } else if (locale.isPM != null) { + // Fallback + isPm = locale.isPM(meridiem); + if (isPm && hour < 12) { + hour += 12; + } + if (!isPm && hour === 12) { + hour = 0; + } + return hour; + } else { + // thie is not supposed to happen + return hour; + } + } + + /************************************ + Constructors + ************************************/ + + function Locale() { + } + + // Moment prototype object + function Moment(config, skipOverflow) { + if (skipOverflow !== false) { + checkOverflow(config); + } + copyConfig(this, config); + this._d = new Date(+config._d); + // Prevent infinite loop in case updateOffset creates new moment + // objects. + if (updateInProgress === false) { + updateInProgress = true; + moment.updateOffset(this); + updateInProgress = false; + } + } + + // Duration Constructor + function Duration(duration) { + var normalizedInput = normalizeObjectUnits(duration), + years = normalizedInput.year || 0, + quarters = normalizedInput.quarter || 0, + months = normalizedInput.month || 0, + weeks = normalizedInput.week || 0, + days = normalizedInput.day || 0, + hours = normalizedInput.hour || 0, + minutes = normalizedInput.minute || 0, + seconds = normalizedInput.second || 0, + milliseconds = normalizedInput.millisecond || 0; + + // representation for dateAddRemove + this._milliseconds = +milliseconds + + seconds * 1e3 + // 1000 + minutes * 6e4 + // 1000 * 60 + hours * 36e5; // 1000 * 60 * 60 + // Because of dateAddRemove treats 24 hours as different from a + // day when working around DST, we need to store them separately + this._days = +days + + weeks * 7; + // It is impossible translate months into days without knowing + // which months you are are talking about, so we have to store + // it separately. + this._months = +months + + quarters * 3 + + years * 12; + + this._data = {}; + + this._locale = moment.localeData(); + + this._bubble(); + } + + /************************************ + Helpers + ************************************/ + + + function extend(a, b) { + for (var i in b) { + if (hasOwnProp(b, i)) { + a[i] = b[i]; + } + } + + if (hasOwnProp(b, 'toString')) { + a.toString = b.toString; + } + + if (hasOwnProp(b, 'valueOf')) { + a.valueOf = b.valueOf; + } + + return a; + } + + function copyConfig(to, from) { + var i, prop, val; + + if (typeof from._isAMomentObject !== 'undefined') { + to._isAMomentObject = from._isAMomentObject; + } + if (typeof from._i !== 'undefined') { + to._i = from._i; + } + if (typeof from._f !== 'undefined') { + to._f = from._f; + } + if (typeof from._l !== 'undefined') { + to._l = from._l; + } + if (typeof from._strict !== 'undefined') { + to._strict = from._strict; + } + if (typeof from._tzm !== 'undefined') { + to._tzm = from._tzm; + } + if (typeof from._isUTC !== 'undefined') { + to._isUTC = from._isUTC; + } + if (typeof from._offset !== 'undefined') { + to._offset = from._offset; + } + if (typeof from._pf !== 'undefined') { + to._pf = from._pf; + } + if (typeof from._locale !== 'undefined') { + to._locale = from._locale; + } + + if (momentProperties.length > 0) { + for (i in momentProperties) { + prop = momentProperties[i]; + val = from[prop]; + if (typeof val !== 'undefined') { + to[prop] = val; + } + } + } + + return to; + } + + function absRound(number) { + if (number < 0) { + return Math.ceil(number); + } else { + return Math.floor(number); + } + } + + // left zero fill a number + // see http://jsperf.com/left-zero-filling for performance comparison + function leftZeroFill(number, targetLength, forceSign) { + var output = '' + Math.abs(number), + sign = number >= 0; + + while (output.length < targetLength) { + output = '0' + output; + } + return (sign ? (forceSign ? '+' : '') : '-') + output; + } + + function positiveMomentsDifference(base, other) { + var res = {milliseconds: 0, months: 0}; + + res.months = other.month() - base.month() + + (other.year() - base.year()) * 12; + if (base.clone().add(res.months, 'M').isAfter(other)) { + --res.months; + } + + res.milliseconds = +other - +(base.clone().add(res.months, 'M')); + + return res; + } + + function momentsDifference(base, other) { + var res; + other = makeAs(other, base); + if (base.isBefore(other)) { + res = positiveMomentsDifference(base, other); + } else { + res = positiveMomentsDifference(other, base); + res.milliseconds = -res.milliseconds; + res.months = -res.months; + } + + return res; + } + + // TODO: remove 'name' arg after deprecation is removed + function createAdder(direction, name) { + return function (val, period) { + var dur, tmp; + //invert the arguments, but complain about it + if (period !== null && !isNaN(+period)) { + deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period).'); + tmp = val; val = period; period = tmp; + } + + val = typeof val === 'string' ? +val : val; + dur = moment.duration(val, period); + addOrSubtractDurationFromMoment(this, dur, direction); + return this; + }; + } + + function addOrSubtractDurationFromMoment(mom, duration, isAdding, updateOffset) { + var milliseconds = duration._milliseconds, + days = duration._days, + months = duration._months; + updateOffset = updateOffset == null ? true : updateOffset; + + if (milliseconds) { + mom._d.setTime(+mom._d + milliseconds * isAdding); + } + if (days) { + rawSetter(mom, 'Date', rawGetter(mom, 'Date') + days * isAdding); + } + if (months) { + rawMonthSetter(mom, rawGetter(mom, 'Month') + months * isAdding); + } + if (updateOffset) { + moment.updateOffset(mom, days || months); + } + } + + // check if is an array + function isArray(input) { + return Object.prototype.toString.call(input) === '[object Array]'; + } + + function isDate(input) { + return Object.prototype.toString.call(input) === '[object Date]' || + input instanceof Date; + } + + // compare two arrays, return the number of differences + function compareArrays(array1, array2, dontConvert) { + var len = Math.min(array1.length, array2.length), + lengthDiff = Math.abs(array1.length - array2.length), + diffs = 0, + i; + for (i = 0; i < len; i++) { + if ((dontConvert && array1[i] !== array2[i]) || + (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { + diffs++; + } + } + return diffs + lengthDiff; + } + + function normalizeUnits(units) { + if (units) { + var lowered = units.toLowerCase().replace(/(.)s$/, '$1'); + units = unitAliases[units] || camelFunctions[lowered] || lowered; + } + return units; + } + + function normalizeObjectUnits(inputObject) { + var normalizedInput = {}, + normalizedProp, + prop; + + for (prop in inputObject) { + if (hasOwnProp(inputObject, prop)) { + normalizedProp = normalizeUnits(prop); + if (normalizedProp) { + normalizedInput[normalizedProp] = inputObject[prop]; + } + } + } + + return normalizedInput; + } + + function makeList(field) { + var count, setter; + + if (field.indexOf('week') === 0) { + count = 7; + setter = 'day'; + } + else if (field.indexOf('month') === 0) { + count = 12; + setter = 'month'; + } + else { + return; + } + + moment[field] = function (format, index) { + var i, getter, + method = moment._locale[field], + results = []; + + if (typeof format === 'number') { + index = format; + format = undefined; + } + + getter = function (i) { + var m = moment().utc().set(setter, i); + return method.call(moment._locale, m, format || ''); + }; + + if (index != null) { + return getter(index); + } + else { + for (i = 0; i < count; i++) { + results.push(getter(i)); + } + return results; + } + }; + } + + function toInt(argumentForCoercion) { + var coercedNumber = +argumentForCoercion, + value = 0; + + if (coercedNumber !== 0 && isFinite(coercedNumber)) { + if (coercedNumber >= 0) { + value = Math.floor(coercedNumber); + } else { + value = Math.ceil(coercedNumber); + } + } + + return value; + } + + function daysInMonth(year, month) { + return new Date(Date.UTC(year, month + 1, 0)).getUTCDate(); + } + + function weeksInYear(year, dow, doy) { + return weekOfYear(moment([year, 11, 31 + dow - doy]), dow, doy).week; + } + + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; + } + + function isLeapYear(year) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; + } + + function checkOverflow(m) { + var overflow; + if (m._a && m._pf.overflow === -2) { + overflow = + m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH : + m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE : + m._a[HOUR] < 0 || m._a[HOUR] > 24 || + (m._a[HOUR] === 24 && (m._a[MINUTE] !== 0 || + m._a[SECOND] !== 0 || + m._a[MILLISECOND] !== 0)) ? HOUR : + m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE : + m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND : + m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND : + -1; + + if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { + overflow = DATE; + } + + m._pf.overflow = overflow; + } + } + + function isValid(m) { + if (m._isValid == null) { + m._isValid = !isNaN(m._d.getTime()) && + m._pf.overflow < 0 && + !m._pf.empty && + !m._pf.invalidMonth && + !m._pf.nullInput && + !m._pf.invalidFormat && + !m._pf.userInvalidated; + + if (m._strict) { + m._isValid = m._isValid && + m._pf.charsLeftOver === 0 && + m._pf.unusedTokens.length === 0 && + m._pf.bigHour === undefined; + } + } + return m._isValid; + } + + function normalizeLocale(key) { + return key ? key.toLowerCase().replace('_', '-') : key; + } + + // pick the locale from the array + // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each + // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root + function chooseLocale(names) { + var i = 0, j, next, locale, split; + + while (i < names.length) { + split = normalizeLocale(names[i]).split('-'); + j = split.length; + next = normalizeLocale(names[i + 1]); + next = next ? next.split('-') : null; + while (j > 0) { + locale = loadLocale(split.slice(0, j).join('-')); + if (locale) { + return locale; + } + if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { + //the next array item is better than a shallower substring of this one + break; + } + j--; + } + i++; + } + return null; + } + + function loadLocale(name) { + var oldLocale = null; + if (!locales[name] && hasModule) { + try { + oldLocale = moment.locale(); + require('./locale/' + name); + // because defineLocale currently also sets the global locale, we want to undo that for lazy loaded locales + moment.locale(oldLocale); + } catch (e) { } + } + return locales[name]; + } + + // Return a moment from input, that is local/utc/utcOffset equivalent to + // model. + function makeAs(input, model) { + var res, diff; + if (model._isUTC) { + res = model.clone(); + diff = (moment.isMoment(input) || isDate(input) ? + +input : +moment(input)) - (+res); + // Use low-level api, because this fn is low-level api. + res._d.setTime(+res._d + diff); + moment.updateOffset(res, false); + return res; + } else { + return moment(input).local(); + } + } + + /************************************ + Locale + ************************************/ + + + extend(Locale.prototype, { + + set : function (config) { + var prop, i; + for (i in config) { + prop = config[i]; + if (typeof prop === 'function') { + this[i] = prop; + } else { + this['_' + i] = prop; + } + } + // Lenient ordinal parsing accepts just a number in addition to + // number + (possibly) stuff coming from _ordinalParseLenient. + this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + /\d{1,2}/.source); + }, + + _months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + months : function (m) { + return this._months[m.month()]; + }, + + _monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + monthsShort : function (m) { + return this._monthsShort[m.month()]; + }, + + monthsParse : function (monthName, format, strict) { + var i, mom, regex; + + if (!this._monthsParse) { + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + } + + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = moment.utc([2000, i]); + if (strict && !this._longMonthsParse[i]) { + this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); + this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); + } + if (!strict && !this._monthsParse[i]) { + regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); + this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { + return i; + } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { + return i; + } else if (!strict && this._monthsParse[i].test(monthName)) { + return i; + } + } + }, + + _weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdays : function (m) { + return this._weekdays[m.day()]; + }, + + _weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysShort : function (m) { + return this._weekdaysShort[m.day()]; + }, + + _weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + weekdaysMin : function (m) { + return this._weekdaysMin[m.day()]; + }, + + weekdaysParse : function (weekdayName) { + var i, mom, regex; + + if (!this._weekdaysParse) { + this._weekdaysParse = []; + } + + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + if (!this._weekdaysParse[i]) { + mom = moment([2000, 1]).day(i); + regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); + this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (this._weekdaysParse[i].test(weekdayName)) { + return i; + } + } + }, + + _longDateFormat : { + LTS : 'h:mm:ss A', + 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 (key) { + var output = this._longDateFormat[key]; + if (!output && this._longDateFormat[key.toUpperCase()]) { + output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) { + return val.slice(1); + }); + this._longDateFormat[key] = output; + } + return output; + }, + + isPM : function (input) { + // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays + // Using charAt should be more compatible. + return ((input + '').toLowerCase().charAt(0) === 'p'); + }, + + _meridiemParse : /[ap]\.?m?\.?/i, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'pm' : 'PM'; + } else { + return isLower ? '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 (key, mom, now) { + var output = this._calendar[key]; + return typeof output === 'function' ? output.apply(mom, [now]) : output; + }, + + _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 (number, withoutSuffix, string, isFuture) { + var output = this._relativeTime[string]; + return (typeof output === 'function') ? + output(number, withoutSuffix, string, isFuture) : + output.replace(/%d/i, number); + }, + + pastFuture : function (diff, output) { + var format = this._relativeTime[diff > 0 ? 'future' : 'past']; + return typeof format === 'function' ? format(output) : format.replace(/%s/i, output); + }, + + ordinal : function (number) { + return this._ordinal.replace('%d', number); + }, + _ordinal : '%d', + _ordinalParse : /\d{1,2}/, + + preparse : function (string) { + return string; + }, + + postformat : function (string) { + return string; + }, + + week : function (mom) { + return weekOfYear(mom, this._week.dow, this._week.doy).week; + }, + + _week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + }, + + firstDayOfWeek : function () { + return this._week.dow; + }, + + firstDayOfYear : function () { + return this._week.doy; + }, + + _invalidDate: 'Invalid date', + invalidDate: function () { + return this._invalidDate; + } + }); + + /************************************ + Formatting + ************************************/ + + + function removeFormattingTokens(input) { + if (input.match(/\[[\s\S]/)) { + return input.replace(/^\[|\]$/g, ''); + } + return input.replace(/\\/g, ''); + } + + function makeFormatFunction(format) { + var array = format.match(formattingTokens), i, length; + + for (i = 0, length = array.length; i < length; i++) { + if (formatTokenFunctions[array[i]]) { + array[i] = formatTokenFunctions[array[i]]; + } else { + array[i] = removeFormattingTokens(array[i]); + } + } + + return function (mom) { + var output = ''; + for (i = 0; i < length; i++) { + output += array[i] instanceof Function ? array[i].call(mom, format) : array[i]; + } + return output; + }; + } + + // format date using native date object + function formatMoment(m, format) { + if (!m.isValid()) { + return m.localeData().invalidDate(); + } + + format = expandFormat(format, m.localeData()); + + if (!formatFunctions[format]) { + formatFunctions[format] = makeFormatFunction(format); + } + + return formatFunctions[format](m); + } + + function expandFormat(format, locale) { + var i = 5; + + function replaceLongDateFormatTokens(input) { + return locale.longDateFormat(input) || input; + } + + localFormattingTokens.lastIndex = 0; + while (i >= 0 && localFormattingTokens.test(format)) { + format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); + localFormattingTokens.lastIndex = 0; + i -= 1; + } + + return format; + } + + + /************************************ + Parsing + ************************************/ + + + // get the regex to find the next token + function getParseRegexForToken(token, config) { + var a, strict = config._strict; + switch (token) { + case 'Q': + return parseTokenOneDigit; + case 'DDDD': + return parseTokenThreeDigits; + case 'YYYY': + case 'GGGG': + case 'gggg': + return strict ? parseTokenFourDigits : parseTokenOneToFourDigits; + case 'Y': + case 'G': + case 'g': + return parseTokenSignedNumber; + case 'YYYYYY': + case 'YYYYY': + case 'GGGGG': + case 'ggggg': + return strict ? parseTokenSixDigits : parseTokenOneToSixDigits; + case 'S': + if (strict) { + return parseTokenOneDigit; + } + /* falls through */ + case 'SS': + if (strict) { + return parseTokenTwoDigits; + } + /* falls through */ + case 'SSS': + if (strict) { + return parseTokenThreeDigits; + } + /* falls through */ + case 'DDD': + return parseTokenOneToThreeDigits; + case 'MMM': + case 'MMMM': + case 'dd': + case 'ddd': + case 'dddd': + return parseTokenWord; + case 'a': + case 'A': + return config._locale._meridiemParse; + case 'x': + return parseTokenOffsetMs; + case 'X': + return parseTokenTimestampMs; + case 'Z': + case 'ZZ': + return parseTokenTimezone; + case 'T': + return parseTokenT; + case 'SSSS': + return parseTokenDigits; + case 'MM': + case 'DD': + case 'YY': + case 'GG': + case 'gg': + case 'HH': + case 'hh': + case 'mm': + case 'ss': + case 'ww': + case 'WW': + return strict ? parseTokenTwoDigits : parseTokenOneOrTwoDigits; + case 'M': + case 'D': + case 'd': + case 'H': + case 'h': + case 'm': + case 's': + case 'w': + case 'W': + case 'e': + case 'E': + return parseTokenOneOrTwoDigits; + case 'Do': + return strict ? config._locale._ordinalParse : config._locale._ordinalParseLenient; + default : + a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), 'i')); + return a; + } + } + + function utcOffsetFromString(string) { + string = string || ''; + var possibleTzMatches = (string.match(parseTokenTimezone) || []), + tzChunk = possibleTzMatches[possibleTzMatches.length - 1] || [], + parts = (tzChunk + '').match(parseTimezoneChunker) || ['-', 0, 0], + minutes = +(parts[1] * 60) + toInt(parts[2]); + + return parts[0] === '+' ? minutes : -minutes; + } + + // function to convert string input to date + function addTimeToArrayFromToken(token, input, config) { + var a, datePartArray = config._a; + + switch (token) { + // QUARTER + case 'Q': + if (input != null) { + datePartArray[MONTH] = (toInt(input) - 1) * 3; + } + break; + // MONTH + case 'M' : // fall through to MM + case 'MM' : + if (input != null) { + datePartArray[MONTH] = toInt(input) - 1; + } + break; + case 'MMM' : // fall through to MMMM + case 'MMMM' : + a = config._locale.monthsParse(input, token, config._strict); + // if we didn't find a month name, mark the date as invalid. + if (a != null) { + datePartArray[MONTH] = a; + } else { + config._pf.invalidMonth = input; + } + break; + // DAY OF MONTH + case 'D' : // fall through to DD + case 'DD' : + if (input != null) { + datePartArray[DATE] = toInt(input); + } + break; + case 'Do' : + if (input != null) { + datePartArray[DATE] = toInt(parseInt( + input.match(/\d{1,2}/)[0], 10)); + } + break; + // DAY OF YEAR + case 'DDD' : // fall through to DDDD + case 'DDDD' : + if (input != null) { + config._dayOfYear = toInt(input); + } + + break; + // YEAR + case 'YY' : + datePartArray[YEAR] = moment.parseTwoDigitYear(input); + break; + case 'YYYY' : + case 'YYYYY' : + case 'YYYYYY' : + datePartArray[YEAR] = toInt(input); + break; + // AM / PM + case 'a' : // fall through to A + case 'A' : + config._meridiem = input; + // config._isPm = config._locale.isPM(input); + break; + // HOUR + case 'h' : // fall through to hh + case 'hh' : + config._pf.bigHour = true; + /* falls through */ + case 'H' : // fall through to HH + case 'HH' : + datePartArray[HOUR] = toInt(input); + break; + // MINUTE + case 'm' : // fall through to mm + case 'mm' : + datePartArray[MINUTE] = toInt(input); + break; + // SECOND + case 's' : // fall through to ss + case 'ss' : + datePartArray[SECOND] = toInt(input); + break; + // MILLISECOND + case 'S' : + case 'SS' : + case 'SSS' : + case 'SSSS' : + datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000); + break; + // UNIX OFFSET (MILLISECONDS) + case 'x': + config._d = new Date(toInt(input)); + break; + // UNIX TIMESTAMP WITH MS + case 'X': + config._d = new Date(parseFloat(input) * 1000); + break; + // TIMEZONE + case 'Z' : // fall through to ZZ + case 'ZZ' : + config._useUTC = true; + config._tzm = utcOffsetFromString(input); + break; + // WEEKDAY - human + case 'dd': + case 'ddd': + case 'dddd': + a = config._locale.weekdaysParse(input); + // if we didn't get a weekday name, mark the date as invalid + if (a != null) { + config._w = config._w || {}; + config._w['d'] = a; + } else { + config._pf.invalidWeekday = input; + } + break; + // WEEK, WEEK DAY - numeric + case 'w': + case 'ww': + case 'W': + case 'WW': + case 'd': + case 'e': + case 'E': + token = token.substr(0, 1); + /* falls through */ + case 'gggg': + case 'GGGG': + case 'GGGGG': + token = token.substr(0, 2); + if (input) { + config._w = config._w || {}; + config._w[token] = toInt(input); + } + break; + case 'gg': + case 'GG': + config._w = config._w || {}; + config._w[token] = moment.parseTwoDigitYear(input); + } + } + + function dayOfYearFromWeekInfo(config) { + var w, weekYear, week, weekday, dow, doy, temp; + + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + dow = 1; + doy = 4; + + // TODO: We need to take the current isoWeekYear, but that depends on + // how we interpret now (local, utc, fixed offset). So create + // a now version of current config (take local/utc/offset flags, and + // create now). + weekYear = dfl(w.GG, config._a[YEAR], weekOfYear(moment(), 1, 4).year); + week = dfl(w.W, 1); + weekday = dfl(w.E, 1); + } else { + dow = config._locale._week.dow; + doy = config._locale._week.doy; + + weekYear = dfl(w.gg, config._a[YEAR], weekOfYear(moment(), dow, doy).year); + week = dfl(w.w, 1); + + if (w.d != null) { + // weekday -- low day numbers are considered next week + weekday = w.d; + if (weekday < dow) { + ++week; + } + } else if (w.e != null) { + // local weekday -- counting starts from begining of week + weekday = w.e + dow; + } else { + // default to begining of week + weekday = dow; + } + } + temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow); + + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } + + // convert an array to a date. + // the array should mirror the parameters below + // note: all values past the year are optional and will default to the lowest possible value. + // [year, month, day , hour, minute, second, millisecond] + function dateFromConfig(config) { + var i, date, input = [], currentDate, yearToUse; + + if (config._d) { + return; + } + + currentDate = currentDateArray(config); + + //compute day of the year from weeks and weekdays + if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { + dayOfYearFromWeekInfo(config); + } + + //if the day of the year is set, figure out what it is + if (config._dayOfYear) { + yearToUse = dfl(config._a[YEAR], currentDate[YEAR]); + + if (config._dayOfYear > daysInYear(yearToUse)) { + config._pf._overflowDayOfYear = true; + } + + date = makeUTCDate(yearToUse, 0, config._dayOfYear); + config._a[MONTH] = date.getUTCMonth(); + config._a[DATE] = date.getUTCDate(); + } + + // Default to current date. + // * if no year, month, day of month are given, default to today + // * if day of month is given, default month and year + // * if month is given, default only year + // * if year is given, don't default anything + for (i = 0; i < 3 && config._a[i] == null; ++i) { + config._a[i] = input[i] = currentDate[i]; + } + + // Zero out whatever was not defaulted, including time + for (; i < 7; i++) { + config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; + } + + // Check for 24:00:00.000 + if (config._a[HOUR] === 24 && + config._a[MINUTE] === 0 && + config._a[SECOND] === 0 && + config._a[MILLISECOND] === 0) { + config._nextDay = true; + config._a[HOUR] = 0; + } + + config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input); + // Apply timezone offset from input. The actual utcOffset can be changed + // with parseZone. + if (config._tzm != null) { + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); + } + + if (config._nextDay) { + config._a[HOUR] = 24; + } + } + + function dateFromObject(config) { + var normalizedInput; + + if (config._d) { + return; + } + + normalizedInput = normalizeObjectUnits(config._i); + config._a = [ + normalizedInput.year, + normalizedInput.month, + normalizedInput.day || normalizedInput.date, + normalizedInput.hour, + normalizedInput.minute, + normalizedInput.second, + normalizedInput.millisecond + ]; + + dateFromConfig(config); + } + + function currentDateArray(config) { + var now = new Date(); + if (config._useUTC) { + return [ + now.getUTCFullYear(), + now.getUTCMonth(), + now.getUTCDate() + ]; + } else { + return [now.getFullYear(), now.getMonth(), now.getDate()]; + } + } + + // date from string and format string + function makeDateFromStringAndFormat(config) { + if (config._f === moment.ISO_8601) { + parseISO(config); + return; + } + + config._a = []; + config._pf.empty = true; + + // This array is used to make a Date, either with `new Date` or `Date.UTC` + var string = '' + config._i, + i, parsedInput, tokens, token, skipped, + stringLength = string.length, + totalParsedInputLength = 0; + + tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; + + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; + if (parsedInput) { + skipped = string.substr(0, string.indexOf(parsedInput)); + if (skipped.length > 0) { + config._pf.unusedInput.push(skipped); + } + string = string.slice(string.indexOf(parsedInput) + parsedInput.length); + totalParsedInputLength += parsedInput.length; + } + // don't parse if it's not a known token + if (formatTokenFunctions[token]) { + if (parsedInput) { + config._pf.empty = false; + } + else { + config._pf.unusedTokens.push(token); + } + addTimeToArrayFromToken(token, parsedInput, config); + } + else if (config._strict && !parsedInput) { + config._pf.unusedTokens.push(token); + } + } + + // add remaining unparsed input length to the string + config._pf.charsLeftOver = stringLength - totalParsedInputLength; + if (string.length > 0) { + config._pf.unusedInput.push(string); + } + + // clear _12h flag if hour is <= 12 + if (config._pf.bigHour === true && config._a[HOUR] <= 12) { + config._pf.bigHour = undefined; + } + // handle meridiem + config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], + config._meridiem); + dateFromConfig(config); + checkOverflow(config); + } + + function unescapeFormat(s) { + return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { + return p1 || p2 || p3 || p4; + }); + } + + // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript + function regexpEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + } + + // date from string and array of format strings + function makeDateFromStringAndArray(config) { + var tempConfig, + bestMoment, + + scoreToBeat, + i, + currentScore; + + if (config._f.length === 0) { + config._pf.invalidFormat = true; + config._d = new Date(NaN); + return; + } + + for (i = 0; i < config._f.length; i++) { + currentScore = 0; + tempConfig = copyConfig({}, config); + if (config._useUTC != null) { + tempConfig._useUTC = config._useUTC; + } + tempConfig._pf = defaultParsingFlags(); + tempConfig._f = config._f[i]; + makeDateFromStringAndFormat(tempConfig); + + if (!isValid(tempConfig)) { + continue; + } + + // if there is any input that was not parsed add a penalty for that format + currentScore += tempConfig._pf.charsLeftOver; + + //or tokens + currentScore += tempConfig._pf.unusedTokens.length * 10; + + tempConfig._pf.score = currentScore; + + if (scoreToBeat == null || currentScore < scoreToBeat) { + scoreToBeat = currentScore; + bestMoment = tempConfig; + } + } + + extend(config, bestMoment || tempConfig); + } + + // date from iso format + function parseISO(config) { + var i, l, + string = config._i, + match = isoRegex.exec(string); + + if (match) { + config._pf.iso = true; + for (i = 0, l = isoDates.length; i < l; i++) { + if (isoDates[i][1].exec(string)) { + // match[5] should be 'T' or undefined + config._f = isoDates[i][0] + (match[6] || ' '); + break; + } + } + for (i = 0, l = isoTimes.length; i < l; i++) { + if (isoTimes[i][1].exec(string)) { + config._f += isoTimes[i][0]; + break; + } + } + if (string.match(parseTokenTimezone)) { + config._f += 'Z'; + } + makeDateFromStringAndFormat(config); + } else { + config._isValid = false; + } + } + + // date from iso format or fallback + function makeDateFromString(config) { + parseISO(config); + if (config._isValid === false) { + delete config._isValid; + moment.createFromInputFallback(config); + } + } + + function map(arr, fn) { + var res = [], i; + for (i = 0; i < arr.length; ++i) { + res.push(fn(arr[i], i)); + } + return res; + } + + function makeDateFromInput(config) { + var input = config._i, matched; + if (input === undefined) { + config._d = new Date(); + } else if (isDate(input)) { + config._d = new Date(+input); + } else if ((matched = aspNetJsonRegex.exec(input)) !== null) { + config._d = new Date(+matched[1]); + } else if (typeof input === 'string') { + makeDateFromString(config); + } else if (isArray(input)) { + config._a = map(input.slice(0), function (obj) { + return parseInt(obj, 10); + }); + dateFromConfig(config); + } else if (typeof(input) === 'object') { + dateFromObject(config); + } else if (typeof(input) === 'number') { + // from milliseconds + config._d = new Date(input); + } else { + moment.createFromInputFallback(config); + } + } + + function makeDate(y, m, d, h, M, s, ms) { + //can't just apply() to create a date: + //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply + var date = new Date(y, m, d, h, M, s, ms); + + //the date constructor doesn't accept years < 1970 + if (y < 1970) { + date.setFullYear(y); + } + return date; + } + + function makeUTCDate(y) { + var date = new Date(Date.UTC.apply(null, arguments)); + if (y < 1970) { + date.setUTCFullYear(y); + } + return date; + } + + function parseWeekday(input, locale) { + if (typeof input === 'string') { + if (!isNaN(input)) { + input = parseInt(input, 10); + } + else { + input = locale.weekdaysParse(input); + if (typeof input !== 'number') { + return null; + } + } + } + return input; + } + + /************************************ + Relative Time + ************************************/ + + + // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize + function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { + return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); + } + + function relativeTime(posNegDuration, withoutSuffix, locale) { + var duration = moment.duration(posNegDuration).abs(), + seconds = round(duration.as('s')), + minutes = round(duration.as('m')), + hours = round(duration.as('h')), + days = round(duration.as('d')), + months = round(duration.as('M')), + years = round(duration.as('y')), + + args = seconds < relativeTimeThresholds.s && ['s', seconds] || + minutes === 1 && ['m'] || + minutes < relativeTimeThresholds.m && ['mm', minutes] || + hours === 1 && ['h'] || + hours < relativeTimeThresholds.h && ['hh', hours] || + days === 1 && ['d'] || + days < relativeTimeThresholds.d && ['dd', days] || + months === 1 && ['M'] || + months < relativeTimeThresholds.M && ['MM', months] || + years === 1 && ['y'] || ['yy', years]; + + args[2] = withoutSuffix; + args[3] = +posNegDuration > 0; + args[4] = locale; + return substituteTimeAgo.apply({}, args); + } + + + /************************************ + Week of Year + ************************************/ + + + // firstDayOfWeek 0 = sun, 6 = sat + // the day of the week that starts the week + // (usually sunday or monday) + // firstDayOfWeekOfYear 0 = sun, 6 = sat + // the first week is the week that contains the first + // of this day of the week + // (eg. ISO weeks use thursday (4)) + function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) { + var end = firstDayOfWeekOfYear - firstDayOfWeek, + daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(), + adjustedMoment; + + + if (daysToDayOfWeek > end) { + daysToDayOfWeek -= 7; + } + + if (daysToDayOfWeek < end - 7) { + daysToDayOfWeek += 7; + } + + adjustedMoment = moment(mom).add(daysToDayOfWeek, 'd'); + return { + week: Math.ceil(adjustedMoment.dayOfYear() / 7), + year: adjustedMoment.year() + }; + } + + //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday + function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) { + var d = makeUTCDate(year, 0, 1).getUTCDay(), daysToAdd, dayOfYear; + + d = d === 0 ? 7 : d; + weekday = weekday != null ? weekday : firstDayOfWeek; + daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0); + dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1; + + return { + year: dayOfYear > 0 ? year : year - 1, + dayOfYear: dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear + }; + } + + /************************************ + Top Level Functions + ************************************/ + + function makeMoment(config) { + var input = config._i, + format = config._f, + res; + + config._locale = config._locale || moment.localeData(config._l); + + if (input === null || (format === undefined && input === '')) { + return moment.invalid({nullInput: true}); + } + + if (typeof input === 'string') { + config._i = input = config._locale.preparse(input); + } + + if (moment.isMoment(input)) { + return new Moment(input, true); + } else if (format) { + if (isArray(format)) { + makeDateFromStringAndArray(config); + } else { + makeDateFromStringAndFormat(config); + } + } else { + makeDateFromInput(config); + } + + res = new Moment(config); + if (res._nextDay) { + // Adding is smart enough around DST + res.add(1, 'd'); + res._nextDay = undefined; + } + + return res; + } + + moment = function (input, format, locale, strict) { + var c; + + if (typeof(locale) === 'boolean') { + strict = locale; + locale = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c = {}; + c._isAMomentObject = true; + c._i = input; + c._f = format; + c._l = locale; + c._strict = strict; + c._isUTC = false; + c._pf = defaultParsingFlags(); + + return makeMoment(c); + }; + + moment.suppressDeprecationWarnings = false; + + moment.createFromInputFallback = deprecate( + 'moment construction falls back to js Date. This is ' + + 'discouraged and will be removed in upcoming major ' + + 'release. Please refer to ' + + 'https://github.com/moment/moment/issues/1407 for more info.', + function (config) { + config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); + } + ); + + // Pick a moment m from moments so that m[fn](other) is true for all + // other. This relies on the function fn to be transitive. + // + // moments should either be an array of moment objects or an array, whose + // first element is an array of moment objects. + function pickBy(fn, moments) { + var res, i; + if (moments.length === 1 && isArray(moments[0])) { + moments = moments[0]; + } + if (!moments.length) { + return moment(); + } + res = moments[0]; + for (i = 1; i < moments.length; ++i) { + if (moments[i][fn](res)) { + res = moments[i]; + } + } + return res; + } + + moment.min = function () { + var args = [].slice.call(arguments, 0); + + return pickBy('isBefore', args); + }; + + moment.max = function () { + var args = [].slice.call(arguments, 0); + + return pickBy('isAfter', args); + }; + + // creating with utc + moment.utc = function (input, format, locale, strict) { + var c; + + if (typeof(locale) === 'boolean') { + strict = locale; + locale = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c = {}; + c._isAMomentObject = true; + c._useUTC = true; + c._isUTC = true; + c._l = locale; + c._i = input; + c._f = format; + c._strict = strict; + c._pf = defaultParsingFlags(); + + return makeMoment(c).utc(); + }; + + // creating with unix timestamp (in seconds) + moment.unix = function (input) { + return moment(input * 1000); + }; + + // duration + moment.duration = function (input, key) { + var duration = input, + // matching against regexp is expensive, do it on demand + match = null, + sign, + ret, + parseIso, + diffRes; + + if (moment.isDuration(input)) { + duration = { + ms: input._milliseconds, + d: input._days, + M: input._months + }; + } else if (typeof input === 'number') { + duration = {}; + if (key) { + duration[key] = input; + } else { + duration.milliseconds = input; + } + } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + duration = { + y: 0, + d: toInt(match[DATE]) * sign, + h: toInt(match[HOUR]) * sign, + m: toInt(match[MINUTE]) * sign, + s: toInt(match[SECOND]) * sign, + ms: toInt(match[MILLISECOND]) * sign + }; + } else if (!!(match = isoDurationRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + parseIso = function (inp) { + // We'd normally use ~~inp for this, but unfortunately it also + // converts floats to ints. + // inp may be undefined, so careful calling replace on it. + var res = inp && parseFloat(inp.replace(',', '.')); + // apply sign while we're at it + return (isNaN(res) ? 0 : res) * sign; + }; + duration = { + y: parseIso(match[2]), + M: parseIso(match[3]), + d: parseIso(match[4]), + h: parseIso(match[5]), + m: parseIso(match[6]), + s: parseIso(match[7]), + w: parseIso(match[8]) + }; + } else if (duration == null) {// checks for null or undefined + duration = {}; + } else if (typeof duration === 'object' && + ('from' in duration || 'to' in duration)) { + diffRes = momentsDifference(moment(duration.from), moment(duration.to)); + + duration = {}; + duration.ms = diffRes.milliseconds; + duration.M = diffRes.months; + } + + ret = new Duration(duration); + + if (moment.isDuration(input) && hasOwnProp(input, '_locale')) { + ret._locale = input._locale; + } + + return ret; + }; + + // version number + moment.version = VERSION; + + // default format + moment.defaultFormat = isoFormat; + + // constant that refers to the ISO standard + moment.ISO_8601 = function () {}; + + // Plugins that add properties should also add the key here (null value), + // so we can properly clone ourselves. + moment.momentProperties = momentProperties; + + // This function will be called whenever a moment is mutated. + // It is intended to keep the offset in sync with the timezone. + moment.updateOffset = function () {}; + + // This function allows you to set a threshold for relative time strings + moment.relativeTimeThreshold = function (threshold, limit) { + if (relativeTimeThresholds[threshold] === undefined) { + return false; + } + if (limit === undefined) { + return relativeTimeThresholds[threshold]; + } + relativeTimeThresholds[threshold] = limit; + return true; + }; + + moment.lang = deprecate( + 'moment.lang is deprecated. Use moment.locale instead.', + function (key, value) { + return moment.locale(key, value); + } + ); + + // This function will load locale and then set the global locale. If + // no arguments are passed in, it will simply return the current global + // locale key. + moment.locale = function (key, values) { + var data; + if (key) { + if (typeof(values) !== 'undefined') { + data = moment.defineLocale(key, values); + } + else { + data = moment.localeData(key); + } + + if (data) { + moment.duration._locale = moment._locale = data; + } + } + + return moment._locale._abbr; + }; + + moment.defineLocale = function (name, values) { + if (values !== null) { + values.abbr = name; + if (!locales[name]) { + locales[name] = new Locale(); + } + locales[name].set(values); + + // backwards compat for now: also set the locale + moment.locale(name); + + return locales[name]; + } else { + // useful for testing + delete locales[name]; + return null; + } + }; + + moment.langData = deprecate( + 'moment.langData is deprecated. Use moment.localeData instead.', + function (key) { + return moment.localeData(key); + } + ); + + // returns locale data + moment.localeData = function (key) { + var locale; + + if (key && key._locale && key._locale._abbr) { + key = key._locale._abbr; + } + + if (!key) { + return moment._locale; + } + + if (!isArray(key)) { + //short-circuit everything else + locale = loadLocale(key); + if (locale) { + return locale; + } + key = [key]; + } + + return chooseLocale(key); + }; + + // compare moment object + moment.isMoment = function (obj) { + return obj instanceof Moment || + (obj != null && hasOwnProp(obj, '_isAMomentObject')); + }; + + // for typechecking Duration objects + moment.isDuration = function (obj) { + return obj instanceof Duration; + }; + + for (i = lists.length - 1; i >= 0; --i) { + makeList(lists[i]); + } + + moment.normalizeUnits = function (units) { + return normalizeUnits(units); + }; + + moment.invalid = function (flags) { + var m = moment.utc(NaN); + if (flags != null) { + extend(m._pf, flags); + } + else { + m._pf.userInvalidated = true; + } + + return m; + }; + + moment.parseZone = function () { + return moment.apply(null, arguments).parseZone(); + }; + + moment.parseTwoDigitYear = function (input) { + return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); + }; + + moment.isDate = isDate; + + /************************************ + Moment Prototype + ************************************/ + + + extend(moment.fn = Moment.prototype, { + + clone : function () { + return moment(this); + }, + + valueOf : function () { + return +this._d - ((this._offset || 0) * 60000); + }, + + unix : function () { + return Math.floor(+this / 1000); + }, + + toString : function () { + return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); + }, + + toDate : function () { + return this._offset ? new Date(+this) : this._d; + }, + + toISOString : function () { + var m = moment(this).utc(); + if (0 < m.year() && m.year() <= 9999) { + if ('function' === typeof Date.prototype.toISOString) { + // native implementation is ~50x faster, use it when we can + return this.toDate().toISOString(); + } else { + return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } + } else { + return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } + }, + + toArray : function () { + var m = this; + return [ + m.year(), + m.month(), + m.date(), + m.hours(), + m.minutes(), + m.seconds(), + m.milliseconds() + ]; + }, + + isValid : function () { + return isValid(this); + }, + + isDSTShifted : function () { + if (this._a) { + return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0; + } + + return false; + }, + + parsingFlags : function () { + return extend({}, this._pf); + }, + + invalidAt: function () { + return this._pf.overflow; + }, + + utc : function (keepLocalTime) { + return this.utcOffset(0, keepLocalTime); + }, + + local : function (keepLocalTime) { + if (this._isUTC) { + this.utcOffset(0, keepLocalTime); + this._isUTC = false; + + if (keepLocalTime) { + this.subtract(this._dateUtcOffset(), 'm'); + } + } + return this; + }, + + format : function (inputString) { + var output = formatMoment(this, inputString || moment.defaultFormat); + return this.localeData().postformat(output); + }, + + add : createAdder(1, 'add'), + + subtract : createAdder(-1, 'subtract'), + + diff : function (input, units, asFloat) { + var that = makeAs(input, this), + zoneDiff = (that.utcOffset() - this.utcOffset()) * 6e4, + anchor, diff, output, daysAdjust; + + units = normalizeUnits(units); + + if (units === 'year' || units === 'month' || units === 'quarter') { + output = monthDiff(this, that); + if (units === 'quarter') { + output = output / 3; + } else if (units === 'year') { + output = output / 12; + } + } else { + diff = this - that; + output = units === 'second' ? diff / 1e3 : // 1000 + units === 'minute' ? diff / 6e4 : // 1000 * 60 + units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60 + units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst + units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst + diff; + } + return asFloat ? output : absRound(output); + }, + + from : function (time, withoutSuffix) { + return moment.duration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); + }, + + fromNow : function (withoutSuffix) { + return this.from(moment(), withoutSuffix); + }, + + calendar : function (time) { + // We want to compare the start of today, vs this. + // Getting start-of-today depends on whether we're locat/utc/offset + // or not. + var now = time || moment(), + sod = makeAs(now, this).startOf('day'), + diff = this.diff(sod, 'days', true), + format = diff < -6 ? 'sameElse' : + diff < -1 ? 'lastWeek' : + diff < 0 ? 'lastDay' : + diff < 1 ? 'sameDay' : + diff < 2 ? 'nextDay' : + diff < 7 ? 'nextWeek' : 'sameElse'; + return this.format(this.localeData().calendar(format, this, moment(now))); + }, + + isLeapYear : function () { + return isLeapYear(this.year()); + }, + + isDST : function () { + return (this.utcOffset() > this.clone().month(0).utcOffset() || + this.utcOffset() > this.clone().month(5).utcOffset()); + }, + + day : function (input) { + var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); + if (input != null) { + input = parseWeekday(input, this.localeData()); + return this.add(input - day, 'd'); + } else { + return day; + } + }, + + month : makeAccessor('Month', true), + + startOf : function (units) { + units = normalizeUnits(units); + // the following switch intentionally omits break keywords + // to utilize falling through the cases. + switch (units) { + case 'year': + this.month(0); + /* falls through */ + case 'quarter': + case 'month': + this.date(1); + /* falls through */ + case 'week': + case 'isoWeek': + case 'day': + this.hours(0); + /* falls through */ + case 'hour': + this.minutes(0); + /* falls through */ + case 'minute': + this.seconds(0); + /* falls through */ + case 'second': + this.milliseconds(0); + /* falls through */ + } + + // weeks are a special case + if (units === 'week') { + this.weekday(0); + } else if (units === 'isoWeek') { + this.isoWeekday(1); + } + + // quarters are also special + if (units === 'quarter') { + this.month(Math.floor(this.month() / 3) * 3); + } + + return this; + }, + + endOf: function (units) { + units = normalizeUnits(units); + if (units === undefined || units === 'millisecond') { + return this; + } + return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); + }, + + isAfter: function (input, units) { + var inputMs; + units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); + if (units === 'millisecond') { + input = moment.isMoment(input) ? input : moment(input); + return +this > +input; + } else { + inputMs = moment.isMoment(input) ? +input : +moment(input); + return inputMs < +this.clone().startOf(units); + } + }, + + isBefore: function (input, units) { + var inputMs; + units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); + if (units === 'millisecond') { + input = moment.isMoment(input) ? input : moment(input); + return +this < +input; + } else { + inputMs = moment.isMoment(input) ? +input : +moment(input); + return +this.clone().endOf(units) < inputMs; + } + }, + + isBetween: function (from, to, units) { + return this.isAfter(from, units) && this.isBefore(to, units); + }, + + isSame: function (input, units) { + var inputMs; + units = normalizeUnits(units || 'millisecond'); + if (units === 'millisecond') { + input = moment.isMoment(input) ? input : moment(input); + return +this === +input; + } else { + inputMs = +moment(input); + return +(this.clone().startOf(units)) <= inputMs && inputMs <= +(this.clone().endOf(units)); + } + }, + + min: deprecate( + 'moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548', + function (other) { + other = moment.apply(null, arguments); + return other < this ? this : other; + } + ), + + max: deprecate( + 'moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548', + function (other) { + other = moment.apply(null, arguments); + return other > this ? this : other; + } + ), + + zone : deprecate( + 'moment().zone is deprecated, use moment().utcOffset instead. ' + + 'https://github.com/moment/moment/issues/1779', + function (input, keepLocalTime) { + if (input != null) { + if (typeof input !== 'string') { + input = -input; + } + + this.utcOffset(input, keepLocalTime); + + return this; + } else { + return -this.utcOffset(); + } + } + ), + + // keepLocalTime = true means only change the timezone, without + // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> + // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset + // +0200, so we adjust the time as needed, to be valid. + // + // Keeping the time actually adds/subtracts (one hour) + // from the actual represented time. That is why we call updateOffset + // a second time. In case it wants us to change the offset again + // _changeInProgress == true case, then we have to adjust, because + // there is no such time in the given timezone. + utcOffset : function (input, keepLocalTime) { + var offset = this._offset || 0, + localAdjust; + if (input != null) { + if (typeof input === 'string') { + input = utcOffsetFromString(input); + } + if (Math.abs(input) < 16) { + input = input * 60; + } + if (!this._isUTC && keepLocalTime) { + localAdjust = this._dateUtcOffset(); + } + this._offset = input; + this._isUTC = true; + if (localAdjust != null) { + this.add(localAdjust, 'm'); + } + if (offset !== input) { + if (!keepLocalTime || this._changeInProgress) { + addOrSubtractDurationFromMoment(this, + moment.duration(input - offset, 'm'), 1, false); + } else if (!this._changeInProgress) { + this._changeInProgress = true; + moment.updateOffset(this, true); + this._changeInProgress = null; + } + } + + return this; + } else { + return this._isUTC ? offset : this._dateUtcOffset(); + } + }, + + isLocal : function () { + return !this._isUTC; + }, + + isUtcOffset : function () { + return this._isUTC; + }, + + isUtc : function () { + return this._isUTC && this._offset === 0; + }, + + zoneAbbr : function () { + return this._isUTC ? 'UTC' : ''; + }, + + zoneName : function () { + return this._isUTC ? 'Coordinated Universal Time' : ''; + }, + + parseZone : function () { + if (this._tzm) { + this.utcOffset(this._tzm); + } else if (typeof this._i === 'string') { + this.utcOffset(utcOffsetFromString(this._i)); + } + return this; + }, + + hasAlignedHourOffset : function (input) { + if (!input) { + input = 0; + } + else { + input = moment(input).utcOffset(); + } + + return (this.utcOffset() - input) % 60 === 0; + }, + + daysInMonth : function () { + return daysInMonth(this.year(), this.month()); + }, + + dayOfYear : function (input) { + var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1; + return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); + }, + + quarter : function (input) { + return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); + }, + + weekYear : function (input) { + var year = weekOfYear(this, this.localeData()._week.dow, this.localeData()._week.doy).year; + return input == null ? year : this.add((input - year), 'y'); + }, + + isoWeekYear : function (input) { + var year = weekOfYear(this, 1, 4).year; + return input == null ? year : this.add((input - year), 'y'); + }, + + week : function (input) { + var week = this.localeData().week(this); + return input == null ? week : this.add((input - week) * 7, 'd'); + }, + + isoWeek : function (input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add((input - week) * 7, 'd'); + }, + + weekday : function (input) { + var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; + return input == null ? weekday : this.add(input - weekday, 'd'); + }, + + isoWeekday : function (input) { + // behaves the same as moment#day except + // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) + // as a setter, sunday should belong to the previous week. + return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7); + }, + + isoWeeksInYear : function () { + return weeksInYear(this.year(), 1, 4); + }, + + weeksInYear : function () { + var weekInfo = this.localeData()._week; + return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); + }, + + get : function (units) { + units = normalizeUnits(units); + return this[units](); + }, + + set : function (units, value) { + var unit; + if (typeof units === 'object') { + for (unit in units) { + this.set(unit, units[unit]); + } + } + else { + units = normalizeUnits(units); + if (typeof this[units] === 'function') { + this[units](value); + } + } + return this; + }, + + // If passed a locale key, it will set the locale for this + // instance. Otherwise, it will return the locale configuration + // variables for this instance. + locale : function (key) { + var newLocaleData; + + if (key === undefined) { + return this._locale._abbr; + } else { + newLocaleData = moment.localeData(key); + if (newLocaleData != null) { + this._locale = newLocaleData; + } + return this; + } + }, + + lang : deprecate( + 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', + function (key) { + if (key === undefined) { + return this.localeData(); + } else { + return this.locale(key); + } + } + ), + + localeData : function () { + return this._locale; + }, + + _dateUtcOffset : function () { + // On Firefox.24 Date#getTimezoneOffset returns a floating point. + // https://github.com/moment/moment/pull/1871 + return -Math.round(this._d.getTimezoneOffset() / 15) * 15; + } + + }); + + function rawMonthSetter(mom, value) { + var dayOfMonth; + + // TODO: Move this out of here! + if (typeof value === 'string') { + value = mom.localeData().monthsParse(value); + // TODO: Another silent failure? + if (typeof value !== 'number') { + return mom; + } + } + + dayOfMonth = Math.min(mom.date(), + daysInMonth(mom.year(), value)); + mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); + return mom; + } + + function rawGetter(mom, unit) { + return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit](); + } + + function rawSetter(mom, unit, value) { + if (unit === 'Month') { + return rawMonthSetter(mom, value); + } else { + return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); + } + } + + function makeAccessor(unit, keepTime) { + return function (value) { + if (value != null) { + rawSetter(this, unit, value); + moment.updateOffset(this, keepTime); + return this; + } else { + return rawGetter(this, unit); + } + }; + } + + moment.fn.millisecond = moment.fn.milliseconds = makeAccessor('Milliseconds', false); + moment.fn.second = moment.fn.seconds = makeAccessor('Seconds', false); + moment.fn.minute = moment.fn.minutes = makeAccessor('Minutes', false); + // Setting the hour should keep the time, because the user explicitly + // specified which hour he wants. So trying to maintain the same hour (in + // a new timezone) makes sense. Adding/subtracting hours does not follow + // this rule. + moment.fn.hour = moment.fn.hours = makeAccessor('Hours', true); + // moment.fn.month is defined separately + moment.fn.date = makeAccessor('Date', true); + moment.fn.dates = deprecate('dates accessor is deprecated. Use date instead.', makeAccessor('Date', true)); + moment.fn.year = makeAccessor('FullYear', true); + moment.fn.years = deprecate('years accessor is deprecated. Use year instead.', makeAccessor('FullYear', true)); + + // add plural methods + moment.fn.days = moment.fn.day; + moment.fn.months = moment.fn.month; + moment.fn.weeks = moment.fn.week; + moment.fn.isoWeeks = moment.fn.isoWeek; + moment.fn.quarters = moment.fn.quarter; + + // add aliased format methods + moment.fn.toJSON = moment.fn.toISOString; + + // alias isUtc for dev-friendliness + moment.fn.isUTC = moment.fn.isUtc; + + /************************************ + Duration Prototype + ************************************/ + + + function daysToYears (days) { + // 400 years have 146097 days (taking into account leap year rules) + return days * 400 / 146097; + } + + function yearsToDays (years) { + // years * 365 + absRound(years / 4) - + // absRound(years / 100) + absRound(years / 400); + return years * 146097 / 400; + } + + extend(moment.duration.fn = Duration.prototype, { + + _bubble : function () { + var milliseconds = this._milliseconds, + days = this._days, + months = this._months, + data = this._data, + seconds, minutes, hours, years = 0; + + // The following code bubbles up values, see the tests for + // examples of what that means. + data.milliseconds = milliseconds % 1000; + + seconds = absRound(milliseconds / 1000); + data.seconds = seconds % 60; + + minutes = absRound(seconds / 60); + data.minutes = minutes % 60; + + hours = absRound(minutes / 60); + data.hours = hours % 24; + + days += absRound(hours / 24); + + // Accurately convert days to years, assume start from year 0. + years = absRound(daysToYears(days)); + days -= absRound(yearsToDays(years)); + + // 30 days to a month + // TODO (iskren): Use anchor date (like 1st Jan) to compute this. + months += absRound(days / 30); + days %= 30; + + // 12 months -> 1 year + years += absRound(months / 12); + months %= 12; + + data.days = days; + data.months = months; + data.years = years; + }, + + abs : function () { + this._milliseconds = Math.abs(this._milliseconds); + this._days = Math.abs(this._days); + this._months = Math.abs(this._months); + + this._data.milliseconds = Math.abs(this._data.milliseconds); + this._data.seconds = Math.abs(this._data.seconds); + this._data.minutes = Math.abs(this._data.minutes); + this._data.hours = Math.abs(this._data.hours); + this._data.months = Math.abs(this._data.months); + this._data.years = Math.abs(this._data.years); + + return this; + }, + + weeks : function () { + return absRound(this.days() / 7); + }, + + valueOf : function () { + return this._milliseconds + + this._days * 864e5 + + (this._months % 12) * 2592e6 + + toInt(this._months / 12) * 31536e6; + }, + + humanize : function (withSuffix) { + var output = relativeTime(this, !withSuffix, this.localeData()); + + if (withSuffix) { + output = this.localeData().pastFuture(+this, output); + } + + return this.localeData().postformat(output); + }, + + add : function (input, val) { + // supports only 2.0-style add(1, 's') or add(moment) + var dur = moment.duration(input, val); + + this._milliseconds += dur._milliseconds; + this._days += dur._days; + this._months += dur._months; + + this._bubble(); + + return this; + }, + + subtract : function (input, val) { + var dur = moment.duration(input, val); + + this._milliseconds -= dur._milliseconds; + this._days -= dur._days; + this._months -= dur._months; + + this._bubble(); + + return this; + }, + + get : function (units) { + units = normalizeUnits(units); + return this[units.toLowerCase() + 's'](); + }, + + as : function (units) { + var days, months; + units = normalizeUnits(units); + + if (units === 'month' || units === 'year') { + days = this._days + this._milliseconds / 864e5; + months = this._months + daysToYears(days) * 12; + return units === 'month' ? months : months / 12; + } else { + // handle milliseconds separately because of floating point math errors (issue #1867) + days = this._days + Math.round(yearsToDays(this._months / 12)); + switch (units) { + case 'week': return days / 7 + this._milliseconds / 6048e5; + case 'day': return days + this._milliseconds / 864e5; + case 'hour': return days * 24 + this._milliseconds / 36e5; + case 'minute': return days * 24 * 60 + this._milliseconds / 6e4; + case 'second': return days * 24 * 60 * 60 + this._milliseconds / 1000; + // Math.floor prevents floating point math errors here + case 'millisecond': return Math.floor(days * 24 * 60 * 60 * 1000) + this._milliseconds; + default: throw new Error('Unknown unit ' + units); + } + } + }, + + lang : moment.fn.lang, + locale : moment.fn.locale, + + toIsoString : deprecate( + 'toIsoString() is deprecated. Please use toISOString() instead ' + + '(notice the capitals)', + function () { + return this.toISOString(); + } + ), + + toISOString : function () { + // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js + var years = Math.abs(this.years()), + months = Math.abs(this.months()), + days = Math.abs(this.days()), + hours = Math.abs(this.hours()), + minutes = Math.abs(this.minutes()), + seconds = Math.abs(this.seconds() + this.milliseconds() / 1000); + + if (!this.asSeconds()) { + // this is the same as C#'s (Noda) and python (isodate)... + // but not other JS (goog.date) + return 'P0D'; + } + + return (this.asSeconds() < 0 ? '-' : '') + + 'P' + + (years ? years + 'Y' : '') + + (months ? months + 'M' : '') + + (days ? days + 'D' : '') + + ((hours || minutes || seconds) ? 'T' : '') + + (hours ? hours + 'H' : '') + + (minutes ? minutes + 'M' : '') + + (seconds ? seconds + 'S' : ''); + }, + + localeData : function () { + return this._locale; + }, + + toJSON : function () { + return this.toISOString(); + } + }); + + moment.duration.fn.toString = moment.duration.fn.toISOString; + + function makeDurationGetter(name) { + moment.duration.fn[name] = function () { + return this._data[name]; + }; + } + + for (i in unitMillisecondFactors) { + if (hasOwnProp(unitMillisecondFactors, i)) { + makeDurationGetter(i.toLowerCase()); + } + } + + moment.duration.fn.asMilliseconds = function () { + return this.as('ms'); + }; + moment.duration.fn.asSeconds = function () { + return this.as('s'); + }; + moment.duration.fn.asMinutes = function () { + return this.as('m'); + }; + moment.duration.fn.asHours = function () { + return this.as('h'); + }; + moment.duration.fn.asDays = function () { + return this.as('d'); + }; + moment.duration.fn.asWeeks = function () { + return this.as('weeks'); + }; + moment.duration.fn.asMonths = function () { + return this.as('M'); + }; + moment.duration.fn.asYears = function () { + return this.as('y'); + }; + + /************************************ + Default Locale + ************************************/ + + + // Set default locale, other locale will inherit from English. + moment.locale('en', { + ordinalParse: /\d{1,2}(th|st|nd|rd)/, + ordinal : function (number) { + var b = number % 10, + output = (toInt(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); + + /* EMBED_LOCALES */ + + /************************************ + Exposing Moment + ************************************/ + + function makeGlobal(shouldDeprecate) { + /*global ender:false */ + if (typeof ender !== 'undefined') { + return; + } + oldGlobalMoment = globalScope.moment; + if (shouldDeprecate) { + globalScope.moment = deprecate( + 'Accessing Moment through the global scope is ' + + 'deprecated, and will be removed in an upcoming ' + + 'release.', + moment); + } else { + globalScope.moment = moment; + } + } + + // CommonJS module is defined + if (hasModule) { + module.exports = moment; + } else if (typeof define === 'function' && define.amd) { + define(function (require, exports, module) { + if (module.config && module.config() && module.config().noGlobal === true) { + // release the global variable + globalScope.moment = oldGlobalMoment; + } + + return moment; + }); + makeGlobal(true); + } else { + makeGlobal(); + } +}).call(this); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/package.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/package.js new file mode 100644 index 0000000..aba8d50 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/package.js @@ -0,0 +1,11 @@ +var profile = { + resourceTags: { + ignore: function(filename, mid){ + // only include moment/moment + return mid != "moment/moment"; + }, + amd: function(filename, mid){ + return /\.js$/.test(filename); + } + } +}; diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/package.json b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/package.json new file mode 100644 index 0000000..8b47326 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/package.json @@ -0,0 +1,121 @@ +{ + "name": "moment", + "version": "2.9.0", + "description": "Parse, validate, manipulate, and display dates", + "homepage": "http://momentjs.com", + "author": { + "name": "Iskren Ivov Chernev", + "email": "iskren.chernev@gmail.com", + "url": "https://github.com/ichernev" + }, + "contributors": [ + { + "name": "Tim Wood", + "email": "washwithcare@gmail.com", + "url": "http://timwoodcreates.com/" + }, + { + "name": "Rocky Meza", + "url": "http://rockymeza.com" + }, + { + "name": "Matt Johnson", + "email": "mj1856@hotmail.com", + "url": "http://codeofmatt.com" + }, + { + "name": "Isaac Cambron", + "email": "isaac@isaaccambron.com", + "url": "http://isaaccambron.com" + }, + { + "name": "Andre Polykanine", + "email": "andre@oire.org", + "url": "https://github.com/oire" + } + ], + "keywords": [ + "moment", + "date", + "time", + "parse", + "format", + "validate", + "i18n", + "l10n", + "ender" + ], + "main": "./moment.js", + "engines": { + "node": "*" + }, + "repository": { + "type": "git", + "url": "https://github.com/moment/moment.git" + }, + "bugs": { + "url": "https://github.com/moment/moment/issues" + }, + "licenses": [ + { + "type": "MIT" + } + ], + "devDependencies": { + "uglify-js": "latest", + "grunt": "latest", + "nodeunit": "latest", + "benchmark": "latest", + "grunt-contrib-clean": "latest", + "grunt-contrib-jshint": "latest", + "grunt-contrib-nodeunit": "latest", + "grunt-contrib-concat": "latest", + "grunt-contrib-uglify": "latest", + "grunt-contrib-watch": "latest", + "grunt-env": "latest", + "grunt-jscs": "latest", + "grunt-karma": "latest", + "grunt-nuget": "latest", + "grunt-benchmark": "latest", + "grunt-string-replace": "latest", + "grunt-exec": "latest", + "load-grunt-tasks": "latest", + "karma": "latest", + "karma-chrome-launcher": "latest", + "karma-firefox-launcher": "latest", + "karma-nodeunit": "latest", + "karma-sauce-launcher": "latest", + "spacejam": "latest" + }, + "scripts": { + "test": "grunt test:node" + }, + "ender": "./ender.js", + "dojoBuild": "package.js", + "jspm": { + "files": [ + "moment.js", + "locale" + ], + "map": { + "moment": "./moment" + }, + "buildConfig": { + "uglify": true + } + }, + "spm": { + "main": "moment.js", + "output": [ + "locale/*.js" + ] + }, + "readme": "[![NPM version][npm-version-image]][npm-url] [![NPM downloads][npm-downloads-image]][npm-url] [![MIT License][license-image]][license-url] [![Build Status][travis-image]][travis-url]\n\nA lightweight JavaScript date library for parsing, validating, manipulating, and formatting dates.\n\n## [Documentation](http://momentjs.com/docs/)\n\n## Upgrading to 2.0.0\n\nThere are a number of small backwards incompatible changes with version 2.0.0. [See the full descriptions here](https://gist.github.com/timrwood/e72f2eef320ed9e37c51#backwards-incompatible-changes)\n\n * Changed language ordinal method to return the number + ordinal instead of just the ordinal.\n\n * Changed two digit year parsing cutoff to match strptime.\n\n * Removed `moment#sod` and `moment#eod` in favor of `moment#startOf` and `moment#endOf`.\n\n * Removed `moment.humanizeDuration()` in favor of `moment.duration().humanize()`.\n\n * Removed the lang data objects from the top level namespace.\n\n * Duplicate `Date` passed to `moment()` instead of referencing it.\n\n## [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md)\n\n## [Contributing](https://github.com/moment/moment/blob/develop/CONTRIBUTING.md)\n\n## License\n\nMoment.js is freely distributable under the terms of the [MIT license](https://github.com/moment/moment/blob/develop/LICENSE).\n\n[license-image]: http://img.shields.io/badge/license-MIT-blue.svg?style=flat\n[license-url]: LICENSE\n\n[npm-url]: https://npmjs.org/package/moment\n[npm-version-image]: http://img.shields.io/npm/v/moment.svg?style=flat\n[npm-downloads-image]: http://img.shields.io/npm/dm/moment.svg?style=flat\n\n[travis-url]: http://travis-ci.org/moment/moment\n[travis-image]: http://img.shields.io/travis/moment/moment/develop.svg?style=flat\n", + "readmeFilename": "README.md", + "_id": "moment@2.9.0", + "dist": { + "shasum": "77ec1175fa294f42627f10c8e6de6302c036f6d5" + }, + "_from": "moment@2.x.x", + "_resolved": "https://registry.npmjs.org/moment/-/moment-2.9.0.tgz" +} diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/package.json b/node_modules/hapi/node_modules/vision/node_modules/joi/package.json new file mode 100644 index 0000000..1bbd4b4 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/package.json @@ -0,0 +1,44 @@ +{ + "name": "joi", + "description": "Object schema validation", + "version": "5.1.0", + "repository": { + "type": "git", + "url": "git://github.com/hapijs/joi" + }, + "main": "index", + "keywords": [ + "schema", + "validation" + ], + "engines": { + "node": ">=0.10.30" + }, + "dependencies": { + "hoek": "^2.2.x", + "topo": "1.x.x", + "isemail": "1.x.x", + "moment": "2.x.x" + }, + "devDependencies": { + "code": "1.x.x", + "lab": "5.x.x" + }, + "scripts": { + "test": "lab -t 100 -a code", + "test-cov-html": "lab -r html -o coverage.html -a code" + }, + "licenses": [ + { + "type": "BSD", + "url": "http://github.com/hapijs/joi/raw/master/LICENSE" + } + ], + "readme": "![joi Logo](https://raw.github.com/hapijs/joi/master/images/joi.png)\n\nObject schema description language and validator for JavaScript objects.\n\n[![npm version](https://badge.fury.io/js/joi.svg)](http://badge.fury.io/js/joi)\n[![Build Status](https://secure.travis-ci.org/hapijs/joi.svg)](http://travis-ci.org/hapijs/joi)\n[![Dependencies Status](https://david-dm.org/hapijs/joi.svg)](https://david-dm.org/hapijs/joi)\n[![DevDependencies Status](https://david-dm.org/hapijs/joi/dev-status.svg)](https://david-dm.org/hapijs/joi#info=devDependencies)\n\nLead Maintainer: [Nicolas Morel](https://github.com/marsup)\n\n## Table of Contents\n\n\n- [Example](#example)\n- [Usage](#usage)\n - [`validate(value, schema, [options], [callback])`](#validatevalue-schema-options-callback)\n - [`compile(schema)`](#compileschema)\n - [`assert(value, schema, [message])`](#assertvalue-schema-message)\n - [`any`](#any)\n - [`any.allow(value)`](#anyallowvalue)\n - [`any.valid(value)`](#anyvalidvalue)\n - [`any.invalid(value)`](#anyinvalidvalue)\n - [`any.required()`](#anyrequired)\n - [`any.optional()`](#anyoptional)\n - [`any.forbidden()`](#anyforbidden)\n - [`any.description(desc)`](#anydescriptiondesc)\n - [`any.notes(notes)`](#anynotesnotes)\n - [`any.tags(tags)`](#anytagstags)\n - [`any.meta(meta)`](#anymetameta)\n - [`any.example(value)`](#anyexamplevalue)\n - [`any.unit(name)`](#anyunitname)\n - [`any.options(options)`](#anyoptionsoptions)\n - [`any.strict()`](#anystrict)\n - [`any.default(value)`](#anydefaultvalue)\n - [`any.concat(schema)`](#anyconcatschema)\n - [`any.when(ref, options)`](#anywhenref-options)\n - [`any.label(name)`](#anylabelname)\n - [`any.raw(isRaw)`](#anyrawisraw)\n - [`array`](#array)\n - [`array.sparse(enabled)`](#arraysparseenabled)\n - [`array.includes(type)`](#arrayincludestype)\n - [`array.excludes(type)`](#arrayexcludestype)\n - [`array.min(limit)`](#arrayminlimit)\n - [`array.max(limit)`](#arraymaxlimit)\n - [`array.length(limit)`](#arraylengthlimit)\n - [`array.unique()`](#arrayunique)\n - [`binary`](#binary)\n - [`binary.encoding(encoding)`](#binaryencodingencoding)\n - [`binary.min(limit)`](#binaryminlimit)\n - [`binary.max(limit)`](#binarymaxlimit)\n - [`binary.length(limit)`](#binarylengthlimit)\n - [`boolean()`](#boolean)\n - [`date`](#date)\n - [`date.min(date)`](#datemindate)\n - [`date.max(date)`](#datemaxdate)\n - [`date.format(format)`](#dateformatformat)\n - [`date.iso()`](#dateiso)\n - [`func`](#func)\n - [`number`](#number)\n - [`number.min(limit)`](#numberminlimit)\n - [`number.max(limit)`](#numbermaxlimit)\n - [`number.greater(limit)`](#numbergreaterlimit)\n - [`number.less(limit)`](#numberlesslimit)\n - [`number.integer()`](#numberinteger)\n - [`number.precision(limit)`](#numberprecisionlimit)\n - [`object`](#object)\n - [`object.keys([schema])`](#objectkeysschema)\n - [`object.min(limit)`](#objectminlimit)\n - [`object.max(limit)`](#objectmaxlimit)\n - [`object.length(limit)`](#objectlengthlimit)\n - [`object.pattern(regex, schema)`](#objectpatternregex-schema)\n - [`object.and(peers)`](#objectandpeers)\n - [`object.nand(peers)`](#objectnandpeers)\n - [`object.or(peers)`](#objectorpeers)\n - [`object.xor(peers)`](#objectxorpeers)\n - [`object.with(key, peers)`](#objectwithkey-peers)\n - [`object.without(key, peers)`](#objectwithoutkey-peers)\n - [`object.rename(from, to, [options])`](#objectrenamefrom-to-options)\n - [`object.assert(ref, schema, [message])`](#objectassertref-schema-message)\n - [`object.unknown([allow])`](#objectunknownallow)\n - [`object.type(constructor, [name])`](#objecttypeconstructorname)\n - [`object.requiredKeys(children)`](#objectrequiredkeyschildren)\n - [`object.optionalKeys(children)`](#objectoptionalkeyschildren)\n - [`string`](#string)\n - [`string.insensitive()`](#stringinsensitive)\n - [`string.min(limit, [encoding])`](#stringminlimit-encoding)\n - [`string.max(limit, [encoding])`](#stringmaxlimit-encoding)\n - [`string.creditCard()`](#stringcreditCard)\n - [`string.length(limit, [encoding])`](#stringlengthlimit-encoding)\n - [`string.regex(pattern, [name])`](#stringregexpattern-name)\n - [`string.alphanum()`](#stringalphanum)\n - [`string.token()`](#stringtoken)\n - [`string.email()`](#stringemail)\n - [`string.guid()`](#stringguid)\n - [`string.hostname()`](#stringhostname)\n - [`string.lowercase()`](#stringlowercase)\n - [`string.uppercase()`](#stringuppercase)\n - [`string.trim()`](#stringtrim)\n - [`alternatives`](#alternatives)\n - [`alternatives.try(schemas)`](#alternativestryschemas)\n - [`alternatives.when(ref, options)`](#alternativeswhenref-options)\n - [`ref(key, [options])`](#refkey-options)\n\n# Example\n\n```javascript\nvar Joi = require('joi');\n\nvar schema = Joi.object().keys({\n username: Joi.string().alphanum().min(3).max(30).required(),\n password: Joi.string().regex(/[a-zA-Z0-9]{3,30}/),\n access_token: [Joi.string(), Joi.number()],\n birthyear: Joi.number().integer().min(1900).max(2013),\n email: Joi.string().email()\n}).with('username', 'birthyear').without('password', 'access_token');\n\nJoi.validate({ username: 'abc', birthyear: 1994 }, schema, function (err, value) { }); // err === null -> valid\n```\n\nThe above schema defines the following constraints:\n* `username`\n * a required string\n * must contain only alphanumeric characters\n * at least 3 characters long but no more than 30\n * must be accompanied by `birthyear`\n* `password`\n * an optional string\n * must satisfy the custom regex\n * cannot appear together with `access_token`\n* `access_token`\n * an optional, unconstrained string or number\n* `birthyear`\n * an integer between 1900 and 2013\n* `email`\n * a valid email address string\n\n# Usage\n\nUsage is a two steps process. First, a schema is constructed using the provided types and constraints:\n\n```javascript\nvar schema = {\n a: Joi.string()\n};\n```\n\nNote that **joi** schema objects are immutable which means every additional rule added (e.g. `.min(5)`) will return a\nnew schema object.\n\nThen the value is validated against the schema:\n\n```javascript\nJoi.validate({ a: 'a string' }, schema, function (err, value) { });\n```\n\nIf the value is valid, `null` is returned, otherwise an `Error` object.\n\nThe schema can be a plain JavaScript object where every key is assigned a **joi** type, or it can be a **joi** type directly:\n\n```javascript\nvar schema = Joi.string().min(10);\n```\n\nIf the schema is a **joi** type, the `schema.validate(value, callback)` can be called directly on the type. When passing a non-type schema object,\nthe module converts it internally to an object() type equivalent to:\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.string()\n});\n```\n\nWhen validating a schema:\n* Keys are optional by default.\n* Strings are utf-8 encoded by default.\n* Rules are defined in an additive fashion and evaluated in order after whitelist and blacklist checks.\n\n### `validate(value, schema, [options], [callback])`\n\nValidates a value using the given schema and options where:\n- `value` - the value being validated.\n- `schema` - the validation schema. Can be a **joi** type object or a plain object where every key is assigned a **joi** type object.\n- `options` - an optional object with the following optional keys:\n - `abortEarly` - when `true`, stops validation on the first error, otherwise returns all the errors found. Defaults to `true`.\n - `convert` - when `true`, attempts to cast values to the required types (e.g. a string to a number). Defaults to `true`.\n - `allowUnknown` - when `true`, allows object to contain unknown keys which are ignored. Defaults to `false`.\n - `skipFunctions` - when `true`, ignores unknown keys with a function value. Defaults to `false`.\n - `stripUnknown` - when `true`, unknown keys are deleted (only when value is an object). Defaults to `false`.\n - `language` - overrides individual error messages, when `'label'` is set, it overrides the key name in the error message. Defaults to no override (`{}`).\n - `presence` - sets the default presence requirements. Supported modes: `'optional'`, `'required'`, and `'forbidden'`.\n Defaults to `'optional'`.\n - `context` - provides an external data set to be used in [references](#refkey-options). Can only be set as an external option to\n `validate()` and not using `any.options()`.\n- `callback` - the optional synchronous callback method using the signature `function(err, value)` where:\n - `err` - if validation failed, the error reason, otherwise `null`.\n - `value` - the validated value with any type conversions and other modifiers applied (the input is left unchanged). `value` can be\n incomplete if validation failed and `abortEarly` is `true`. If callback is not provided, then returns an object with error\n and value properties.\n\n```javascript\nvar schema = {\n a: Joi.number()\n};\n\nvar value = {\n a: '123'\n};\n\nJoi.validate(value, schema, function (err, value) { });\n// err -> null\n// value.a -> 123 (number, not string)\n\n// or\nvar result = Joi.validate(value, schema);\n// result.error -> null\n// result.value -> { \"a\" : 123 }\n```\n\n### `compile(schema)`\n\nConverts literal schema definition to **joi** schema object (or returns the same back if already a **joi** schema object) where:\n- `schema` - the schema definition to compile.\n\n```javascript\nvar definition = ['key', 5, { a: true, b: [/^a/, 'boom'] }];\nvar schema = Joi.compile(definition);\n\n// Same as:\n\nvar schema = Joi.alternatives().try([\n Joi.string().valid('key'),\n Joi.number().valid(5),\n Joi.object().keys({\n a: Joi.boolean().valid(true),\n b: Joi.alternatives().try([\n Joi.string().regex(/^a/),\n Joi.string().valid('boom')\n ])\n })\n]);\n```\n\n### `assert(value, schema, [message])`\n\nValidates a value against a schema and throws if validation fails where:\n- `value` - the value to validate.\n- `schema` - the schema object.\n- `message` - optional message sting prefix added in front of the error message.\n\n```javascript\nJoi.assert('x', Joi.number());\n```\n\n### `any`\n\nGenerates a schema object that matches any data type.\n\n```javascript\nvar any = Joi.any();\nany.validate('a', function (err, value) { });\n```\n\n#### `any.allow(value)`\n\nWhitelists a value where:\n- `value` - the allowed value which can be of any type and will be matched against the validated value before applying any other rules.\n `value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options).\n\n```javascript\nvar schema = {\n a: Joi.any().allow('a'),\n b: Joi.any().allow('b', 'B'),\n c: Joi.any().allow(['c', 'C'])\n};\n```\n\n#### `any.valid(value)`\n\nAdds the provided values into the allowed whitelist and marks them as the only valid values allowed where:\n- `value` - the allowed value which can be of any type and will be matched against the validated value before applying any other rules.\n `value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options).\n\n```javascript\nvar schema = {\n a: Joi.any().valid('a'),\n b: Joi.any().valid('b', 'B'),\n c: Joi.any().valid(['c', 'C'])\n};\n```\n\n#### `any.invalid(value)`\n\nBlacklists a value where:\n- `value` - the forbidden value which can be of any type and will be matched against the validated value before applying any other rules.\n `value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options).\n\n```javascript\nvar schema = {\n a: Joi.any().invalid('a'),\n b: Joi.any().invalid('b', 'B'),\n c: Joi.any().invalid(['c', 'C'])\n};\n```\n\n#### `any.required()`\n\nMarks a key as required which will not allow `undefined` as value. All keys are optional by default.\n\n```javascript\nvar schema = Joi.any().required();\n```\n\n#### `any.optional()`\n\nMarks a key as optional which will allow `undefined` as values. Used to annotate the schema for readability as all keys are optional by default.\n\n```javascript\nvar schema = Joi.any().optional();\n```\n\n#### `any.forbidden()`\n\nMarks a key as forbidden which will not allow any value except `undefined`. Used to explicitly forbid keys.\n\n```javascript\nvar schema = {\n a: Joi.any().forbidden()\n};\n```\n\n#### `any.description(desc)`\n\nAnnotates the key where:\n- `desc` - the description string.\n\n```javascript\nvar schema = Joi.any().description('this key will match anything you give it');\n```\n\n#### `any.notes(notes)`\n\nAnnotates the key where:\n- `notes` - the notes string or array of strings.\n\n```javascript\nvar schema = Joi.any().notes(['this is special', 'this is important']);\n```\n\n#### `any.tags(tags)`\n\nAnnotates the key where:\n- `tags` - the tag string or array of strings.\n\n```javascript\nvar schema = Joi.any().tags(['api', 'user']);\n```\n\n#### `any.meta(meta)`\n\nAttaches metadata to the key where:\n- `meta` - the meta object to attach.\n\n```javascript\nvar schema = Joi.any().meta({ index: true });\n```\n\n#### `any.example(value)`\n\nAnnotates the key where:\n- `value` - an example value.\n\nIf the example fails to pass validation, the function will throw.\n\n```javascript\nvar schema = Joi.string().min(4).example('abcd');\n```\n\n#### `any.unit(name)`\n\nAnnotates the key where:\n- `name` - the unit name of the value.\n\n```javascript\nvar schema = Joi.number().unit('milliseconds');\n```\n\n#### `any.options(options)`\n\nOverrides the global `validate()` options for the current key and any sub-key where:\n- `options` - an object with the same optional keys as [`Joi.validate(value, schema, options, callback)`](#joivalidatevalue-schema-options-callback).\n\n```javascript\nvar schema = Joi.any().options({ convert: false });\n```\n\n#### `any.strict()`\n\nSets the `options.convert` options to `false` which prevent type casting for the current key and any child keys.\n\n```javascript\nvar schema = Joi.any().strict();\n```\n\n#### `any.default(value)`\n\nSets a default value if the original value is undefined where:\n- `value` - the value. `value` supports [references](#refkey-options).\n\nNote that if `value` is an object, any changes to the object after `default()` is called will change the reference\nand any future assignment.\n\n```javascript\nvar schema = {\n username: Joi.string().default('new_user')\n};\nJoi.validate({}, schema, function (err, value) { });\n// value === { username: \"new_user\" }\n```\n\n#### `any.concat(schema)`\n\nReturns a new type that is the result of adding the rules of one type to another where:\n- `schema` - a **joi** type to merge into the current schema. Can only be of the same type as the context type or `any`.\n\n```javascript\nvar a = Joi.string().valid('a');\nvar b = Joi.string().valid('b');\nvar ab = a.concat(b);\n```\n\n#### `any.when(ref, options)`\n\nConverts the type into an [`alternatives`](#alternatives) type where the conditions are merged into the type definition where:\n- `ref` - the key name or [reference](#refkey-options).\n- `options` - an object with:\n - `is` - the required condition **joi** type.\n - `then` - the alternative schema type if the condition is true. Required if `otherwise` is missing.\n - `otherwise` - the alternative schema type if the condition is false. Required if `then` is missing.\n\n```javascript\nvar schema = {\n a: Joi.any().valid('x').when('b', { is: 5, then: Joi.valid('y'), otherwise: Joi.valid('z') }),\n b: Joi.any()\n};\n```\n\nAlternatively, if you want to specify a specific type such as `string`, `array`, etc, you can do so like this:\n\n```javascript\nvar schema = {\n a: Joi.valid('a', 'b', 'other'),\n other: Joi.string()\n .when('a', { is: 'other', then: Joi.required() }),\n};\n```\n\n#### `any.label(name)`\n\nOverrides the key name in error messages.\n- `name` - the name of the key.\n\n```javascript\nvar schema = {\n first_name: Joi.string().label('First Name')\n};\n```\n\n#### `any.raw(isRaw)`\n\nOutputs the original untouched value instead of the casted value.\n- `isRaw` - whether to enable raw mode or not. Defaults to true.\n\n```javascript\nvar schema = {\n timestamp: Joi.date().format('YYYYMMDD').raw()\n};\n```\n\n### `array`\n\nGenerates a schema object that matches an array data type. Note that undefined values inside arrays are not allowed by default but can be by using `sparse()`.\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar array = Joi.array().includes(Joi.string().valid('a', 'b'));\narray.validate(['a', 'b', 'a'], function (err, value) { });\n```\n\n#### `array.sparse(enabled)`\n\nAllow this array to be sparse. `enabled` can be used with a falsy value to go back to the default behavior.\n\n```javascript\nvar schema = Joi.array().sparse(); // undefined values are now allowed\nschema = schema.sparse(false); // undefined values are now denied\n```\n\n#### `array.single(enabled)`\n\nAllow single values to be checked against rules as if it were provided as an array.\n\n`enabled` can be used with a falsy value to go back to the default behavior.\n\n```javascript\nvar schema = Joi.array().includes(Joi.number()).single();\nschema.validate([4]); // returns `{ error: null, value: [ 4 ] }`\nschema.validate(4); // returns `{ error: null, value: [ 4 ] }`\n```\n\n#### `array.includes(type)`\n\nList the types allowed for the array values where:\n- `type` - a **joi** schema object to validate each array item against. `type` can be an array of values, or multiple values can be passed as individual arguments.\n\n```javascript\nvar schema = Joi.array().includes(Joi.string(), Joi.number());\n```\n\n#### `array.excludes(type)`\n\nList the types forbidden for the array values where:\n- `type` - a **joi** schema object to validate each array item against. `type` can be an array of values, or multiple values can be passed as individual arguments.\n\n```javascript\nvar schema = Joi.array().excludes(Joi.object());\n```\n\n#### `array.min(limit)`\n\nSpecifies the minimum number of items in the array where:\n- `limit` - the lowest number of array items allowed.\n\n```javascript\nvar schema = Joi.array().min(2);\n```\n\n#### `array.max(limit)`\n\nSpecifies the maximum number of items in the array where:\n- `limit` - the highest number of array items allowed.\n\n```javascript\nvar schema = Joi.array().max(10);\n```\n\n#### `array.length(limit)`\n\nSpecifies the exact number of items in the array where:\n- `limit` - the number of array items allowed.\n\n```javascript\nvar schema = Joi.array().length(5);\n```\n\n#### `array.unique()`\n\nRequires the array values to be unique.\n\nBe aware that a deep equality is performed on elements of the array having a type of `object`, a performance penalty is to be expected for this kind of operation.\n\n```javascript\nvar schema = Joi.array().unique();\n```\n\n### `boolean`\n\nGenerates a schema object that matches a boolean data type (as well as the strings 'true', 'false', 'yes', and 'no'). Can also be called via `bool()`.\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar boolean = Joi.boolean();\nboolean.validate(true, function (err, value) { });\n```\n\n### `binary`\n\nGenerates a schema object that matches a Buffer data type (as well as the strings which will be converted to Buffers).\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar schema = Joi.binary();\n```\n\n#### `binary.encoding(encoding)`\n\nSets the string encoding format if a string input is converted to a buffer where:\n- `encoding` - the encoding scheme.\n\n```javascript\nvar schema = Joi.binary().encoding('base64');\n```\n\n#### `binary.min(limit)`\n\nSpecifies the minimum length of the buffer where:\n- `limit` - the lowest size of the buffer.\n\n```javascript\nvar schema = Joi.binary().min(2);\n```\n\n#### `binary.max(limit)`\n\nSpecifies the maximum length of the buffer where:\n- `limit` - the highest size of the buffer.\n\n```javascript\nvar schema = Joi.binary().max(10);\n```\n\n#### `binary.length(limit)`\n\nSpecifies the exact length of the buffer:\n- `limit` - the size of buffer allowed.\n\n```javascript\nvar schema = Joi.binary().length(5);\n```\n\n### `date`\n\nGenerates a schema object that matches a date type (as well as a JavaScript date string or number of milliseconds).\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar date = Joi.date();\ndate.validate('12-21-2012', function (err, value) { });\n```\n\n#### `date.min(date)`\n\nSpecifies the oldest date allowed where:\n- `date` - the oldest date allowed.\n\n```javascript\nvar schema = Joi.date().min('1-1-1974');\n```\n\nNotes: `'now'` can be passed in lieu of `date` so as to always compare relatively to the current date, allowing to explicitly ensure a date is either in the past or in the future.\n\n```javascript\nvar schema = Joi.date().min('now');\n```\n\nIt can also be a reference to another field.\n\n```javascript\nvar schema = Joi.object({\n from: Joi.date().required(),\n to: Joi.date().min(Joi.ref('from')).required()\n});\n```\n\n#### `date.max(date)`\n\nSpecifies the latest date allowed where:\n- `date` - the latest date allowed.\n\n```javascript\nvar schema = Joi.date().max('12-31-2020');\n```\n\nNotes: `'now'` can be passed in lieu of `date` so as to always compare relatively to the current date, allowing to explicitly ensure a date is either in the past or in the future.\n\n```javascript\nvar schema = Joi.date().max('now');\n```\n\nIt can also be a reference to another field.\n\n```javascript\nvar schema = Joi.object({\n from: Joi.date().max(Joi.ref('to')).required(),\n to: Joi.date().required()\n});\n```\n\n#### `date.format(format)`\n\nSpecifies the allowed date format:\n- `format` - string or array of strings that follow the `moment.js` [format](http://momentjs.com/docs/#/parsing/string-format/).\n\n```javascript\nvar schema = Joi.date().format('YYYY/MM/DD');\n```\n\n#### `date.iso()`\n\nRequires the string value to be in valid ISO 8601 date format.\n\n```javascript\nvar schema = Joi.date().iso();\n```\n\n### `func`\n\nGenerates a schema object that matches a function type.\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar func = Joi.func();\nfunc.validate(function () {}, function (err, value) { });\n```\n\n### `number`\n\nGenerates a schema object that matches a number data type (as well as strings that can be converted to numbers).\n\n`Infinity` and `-Infinity` are invalid by default, you can change that behavior by calling `allow(Infinity, -Infinity)`.\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar number = Joi.number();\nnumber.validate(5, function (err, value) { });\n```\n\n#### `number.min(limit)`\n\nSpecifies the minimum value where:\n- `limit` - the minimum value allowed.\n\n```javascript\nvar schema = Joi.number().min(2);\n```\n\n#### `number.max(limit)`\n\nSpecifies the maximum value where:\n- `limit` - the maximum value allowed.\n\n```javascript\nvar schema = Joi.number().max(10);\n```\n\n#### `number.greater(limit)`\n\nSpecifies that the value must be greater than `limit`.\n\n```javascript\nvar schema = Joi.number().greater(5);\n```\n\n#### `number.less(limit)`\n\nSpecifies that the value must be less than `limit`.\n\n```javascript\nvar schema = Joi.number().less(10);\n```\n\n#### `number.integer()`\n\nRequires the number to be an integer (no floating point).\n\n```javascript\nvar schema = Joi.number().integer();\n```\n\n#### `number.precision(limit)`\n\nSpecifies the maximum number of decimal places where:\n- `limit` - the maximum number of decimal places allowed.\n\n```javascript\nvar schema = Joi.number().precision(2);\n```\n\n### `object`\n\nGenerates a schema object that matches an object data type (as well as JSON strings that parsed into objects). Defaults\nto allowing any child key.\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar object = Joi.object().keys({\n a: Joi.number().min(1).max(10).integer(),\n b: 'some string'\n});\n\nobject.validate({ a: 5 }, function (err, value) { });\n```\n\n#### `object.keys([schema])`\n\nSets or extends the allowed object keys where:\n- `schema` - optional object where each key is assigned a **joi** type object. If `schema` is `{}` no keys allowed.\n If `schema` is `null` or `undefined`, any key allowed. If `schema` is an object with keys, the keys are added to any\n previously defined keys (but narrows the selection if all keys previously allowed). Defaults to 'undefined' which\n allows any child key.\n\n```javascript\nvar base = Joi.object().keys({\n a: Joi.number(),\n b: Joi.string()\n});\n// Validate keys a, b and c.\nvar extended = base.keys({\n c: Joi.boolean()\n});\n```\n\n#### `object.min(limit)`\n\nSpecifies the minimum number of keys in the object where:\n- `limit` - the lowest number of keys allowed.\n\n```javascript\nvar schema = Joi.object().min(2);\n```\n\n#### `object.max(limit)`\n\nSpecifies the maximum number of keys in the object where:\n- `limit` - the highest number of object keys allowed.\n\n```javascript\nvar schema = Joi.object().max(10);\n```\n\n#### `object.length(limit)`\n\nSpecifies the exact number of keys in the object where:\n- `limit` - the number of object keys allowed.\n\n```javascript\nvar schema = Joi.object().length(5);\n```\n\n#### `object.pattern(regex, schema)`\n\nSpecify validation rules for unknown keys matching a pattern where:\n- `regex` - a regular expression tested against the unknown key names.\n- `schema` - the schema object matching keys much validate against.\n\n```javascrip\nvar schema = Joi.object({\n a: Joi.string()\n}).pattern(/\\w\\d/, Joi.boolean());\n```\n\n#### `object.and(peers)`\n\nDefines an all-or-nothing relationship between keys where if one of the peers is present, all of them are required as\nwell where:\n- `peers` - the key names of which if one present, all are required. `peers` can be a single string value, an\n array of string values, or each peer provided as an argument.\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.any(),\n b: Joi.any()\n}).and('a', 'b');\n```\n\n#### `object.nand(peers)`\n\nDefines a relationship between keys where not all peers can be present at the\nsame time where:\n- `peers` - the key names of which if one present, the others may not all be present. `peers` can be a single string value, an\n array of string values, or each peer provided as an argument.\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.any(),\n b: Joi.any()\n}).nand('a', 'b');\n```\n\n#### `object.or(peers)`\n\nDefines a relationship between keys where one of the peers is required (and more than one is allowed) where:\n- `peers` - the key names of which at least one must appear. `peers` can be a single string value, an\n array of string values, or each peer provided as an argument.\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.any(),\n b: Joi.any()\n}).or('a', 'b');\n```\n\n#### `object.xor(peers)`\n\nDefines an exclusive relationship between a set of keys where one of them is required but not at the same time where:\n- `peers` - the exclusive key names that must not appear together but where one of them is required. `peers` can be a single string value, an\n array of string values, or each peer provided as an argument.\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.any(),\n b: Joi.any()\n}).xor('a', 'b');\n```\n\n#### `object.with(key, peers)`\n\nRequires the presence of other keys whenever the specified key is present where:\n- `key` - the reference key.\n- `peers` - the required peer key names that must appear together with `key`. `peers` can be a single string value or an array of string values.\n\nNote that unlike [`object.and()`](#objectandpeers), `with()` creates a dependency only between the `key` and each of the `peers`, not\nbetween the `peers` themselves.\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.any(),\n b: Joi.any()\n}).with('a', 'b');\n```\n\n#### `object.without(key, peers)`\n\nForbids the presence of other keys whenever the specified is present where:\n- `key` - the reference key.\n- `peers` - the forbidden peer key names that must not appear together with `key`. `peers` can be a single string value or an array of string values.\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.any(),\n b: Joi.any()\n}).without('a', ['b']);\n```\n\n#### `object.rename(from, to, [options])`\n\nRenames a key to another name (deletes the renamed key) where:\n- `from` - the original key name.\n- `to` - the new key name.\n- `options` - an optional object with the following optional keys:\n - `alias` - if `true`, does not delete the old key name, keeping both the new and old keys in place. Defaults to `false`.\n - `multiple` - if `true`, allows renaming multiple keys to the same destination where the last rename wins. Defaults to `false`.\n - `override` - if `true`, allows renaming a key over an existing key. Defaults to `false`.\n\nKeys are renamed before any other validation rules are applied.\n\n```javascript\nvar object = Joi.object().keys({\n a: Joi.number()\n}).rename('b', 'a');\n\nobject.validate({ b: 5 }, function (err, value) { });\n```\n\n#### `object.assert(ref, schema, [message])`\n\nVerifies an assertion where:\n- `ref` - the key name or [reference](#refkey-options).\n- `schema` - the validation rules required to satisfy the assertion. If the `schema` includes references, they are resolved against\n the object value, not the value of the `ref` target.\n- `message` - optional human-readable message used when the assertion fails. Defaults to 'failed to pass the assertion test'.\n\n```javascript\nvar schema = Joi.object().keys({\n a: {\n b: Joi.string(),\n c: Joi.number()\n },\n d: {\n e: Joi.any()\n }\n}).assert('d.e', Joi.ref('a.c'), 'equal to a.c');\n```\n\n#### `object.unknown([allow])`\n\nOverrides the handling of unknown keys for the scope of the current object only (does not apply to children) where:\n- `allow` - if `false`, unknown keys are not allowed, otherwise unknown keys are ignored.\n\n```javascript\nvar schema = Joi.object({ a: Joi.any() }).unknown();\n```\n\n#### `object.type(constructor, [name])`\n\nRequires the object to be an instance of a given constructor where:\n- `constructor` - the constructor function that the object must be an instance of.\n- `name` - an alternate name to use in validation errors. This is useful when the constructor function does not have a name.\n\n```javascript\nvar schema = Joi.object().type(RegExp);\n```\n\n#### `object.requiredKeys(children)`\n\nSets the specified children to required.\n- `children` - can be a single string value, an array of string values, or each child provided as an argument.\n\n```javascript\nvar schema = Joi.object().keys({ a: { b: Joi.number() }, c: { d: Joi.string() } });\nvar requiredSchema = schema.requiredKeys('', 'a.b', 'c', 'c.d');\n```\n\nNote that in this example `''` means the current object, `a` is not required but `b` is, as well as `c` and `d`.\n\n#### `object.optionalKeys(children)`\n\nSets the specified children to optional.\n- `children` - can be a single string value, an array of string values, or each child provided as an argument.\n\n```javascript\nvar schema = Joi.object().keys({ a: { b: Joi.number().required() }, c: { d: Joi.string().required() } });\nvar requiredSchema = schema.optionalKeys('a.b', 'c.d');\n```\n\nThe behavior is exactly the same as `requiredKeys`.\n\n### `string`\n\nGenerates a schema object that matches a string data type. Note that empty strings are not allowed by default and must be enabled with `allow('')`.\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar schema = Joi.string().min(1).max(10);\nschema.validate('12345', function (err, value) { });\n```\n\n#### `string.insensitive()`\n\nAllows the value to match any whitelist of blacklist item in a case insensitive comparison.\n\n```javascript\nvar schema = Joi.string().valid('a').insensitive();\n```\n\n#### `string.min(limit, [encoding])`\n\nSpecifies the minimum number string characters where:\n- `limit` - the minimum number of string characters required.\n- `encoding` - is specified, the string length is calculated in bytes using the provided encoding.\n\n```javascript\nvar schema = Joi.string().min(2);\n```\n\n#### `string.max(limit, [encoding])`\n\nSpecifies the maximum number of string characters where:\n- `limit` - the maximum number of string characters allowed.\n- `encoding` - is specified, the string length is calculated in bytes using the provided encoding.\n\n```javascript\nvar schema = Joi.string().max(10);\n```\n\n#### `string.creditCard()`\n\nRequires the number to be a credit card number (Using [Lunh\nAlgorithm](http://en.wikipedia.org/wiki/Luhn_algorithm)).\n\n```javascript\nvar schema = Joi.string().creditCard();\n```\n\n#### `string.length(limit, [encoding])`\n\nSpecifies the exact string length required where:\n- `limit` - the required string length.\n- `encoding` - is specified, the string length is calculated in bytes using the provided encoding.\n\n```javascript\nvar schema = Joi.string().length(5);\n```\n\n#### `string.regex(pattern, [name])`\n\nDefines a regular expression rule where:\n- `pattern` - a regular expression object the string value must match against.\n- `name` - optional name for patterns (useful with multiple patterns). Defaults to 'required'.\n\n```javascript\nvar schema = Joi.string().regex(/^[abc]+$/);\n```\n\n#### `string.alphanum()`\n\nRequires the string value to only contain a-z, A-Z, and 0-9.\n\n```javascript\nvar schema = Joi.string().alphanum();\n```\n\n#### `string.token()`\n\nRequires the string value to only contain a-z, A-Z, 0-9, and underscore _.\n\n```javascript\nvar schema = Joi.string().token();\n```\n\n#### `string.email()`\n\nRequires the string value to be a valid email address.\n\n```javascript\nvar schema = Joi.string().email();\n```\n\n#### `string.guid()`\n\nRequires the string value to be a valid GUID.\n\n```javascript\nvar schema = Joi.string().guid();\n```\n\n#### `string.hostname()`\n\nRequires the string value to be a valid hostname as per [RFC1123](http://tools.ietf.org/html/rfc1123).\n\n```javascript\nvar schema = Joi.string().hostname();\n```\n\n#### `string.lowercase()`\n\nRequires the string value to be all lowercase. If the validation `convert` option is on (enabled by default), the string\nwill be forced to lowercase.\n\n```javascript\nvar schema = Joi.string().lowercase();\n```\n\n#### `string.uppercase()`\n\nRequires the string value to be all uppercase. If the validation `convert` option is on (enabled by default), the string\nwill be forced to uppercase.\n\n```javascript\nvar schema = Joi.string().uppercase();\n```\n\n#### `string.trim()`\n\nRequires the string value to contain no whitespace before or after. If the validation `convert` option is on (enabled by\ndefault), the string will be trimmed.\n\n```javascript\nvar schema = Joi.string().trim();\n```\n\n### `alternatives`\n\nGenerates a type that will match one of the provided alternative schemas via the [`try()`](#alternativestryschemas)\nmethod. If no schemas are added, the type will not match any value except for `undefined`.\n\nSupports the same methods of the [`any()`](#any) type.\n\nAlternatives can be expressed using the shorter `[]` notation.\n\n```javascript\nvar alt = Joi.alternatives().try(Joi.number(), Joi.string());\n// Same as [Joi.number(), Joi.string()]\n```\n\n#### `alternatives.try(schemas)`\n\nAdds an alternative schema type for attempting to match against the validated value where:\n- `schema` - an array of alternative **joi** types. Also supports providing each type as a separate argument.\n\n```javascript\nvar alt = Joi.alternatives().try(Joi.number(), Joi.string());\nalt.validate('a', function (err, value) { });\n```\n\n#### `alternatives.when(ref, options)`\n\nAdds a conditional alternative schema type based on another key (not the same as `any.when()`) value where:\n- `ref` - the key name or [reference](#refkey-options).\n- `options` - an object with:\n - `is` - the required condition **joi** type.\n - `then` - the alternative schema type to **try** if the condition is true. Required if `otherwise` is missing.\n - `otherwise` - the alternative schema type to **try** if the condition is false. Required if `then` is missing.\n\n```javascript\nvar schema = {\n a: Joi.alternatives().when('b', { is: 5, then: Joi.string(), otherwise: Joi.number() }),\n b: Joi.any()\n};\n```\n\nNote that `when()` only adds additional alternatives to try and does not impact the overall type. Setting\na `required()` rule on a single alternative will not apply to the overall key. For example,\nthis definition of `a`:\n\n```javascript\nvar schema = {\n a: Joi.alternatives().when('b', { is: true, then: Joi.required() }),\n b: Joi.boolean()\n};\n```\n\nDoes not turn `a` into a required key when `b` is `true`. Instead, it tells the validator to try and match the\nvalue to anything that's not `undefined`. However, since `Joi.alternatives()` by itself allows `undefined`, the rule\ndoes not accomplish turning `a` to a required value. This rule is the same as `Joi.alternatives([Joi.required()])`\nwhen `b` is `true` which will allow any value including `undefined`.\n\nTo accomplish the desired result above use:\n\n```javascript\nvar schema = {\n a: Joi.when('b', { is: true, then: Joi.required() }),\n b: Joi.boolean()\n};\n```\n\n### `ref(key, [options])`\n\nGenerates a reference to the value of the named key. References are resolved at validation time and in order of dependency\nso that if one key validation depends on another, the dependent key is validated second after the reference is validated.\nReferences support the following arguments:\n- `key` - the reference target. References cannot point up the object tree, only to sibling keys, but they can point to\n their siblings' children (e.g. 'a.b.c') using the `.` separator. If a `key` starts with `$` is signifies a context reference\n which is looked up in the `context` option object.\n- `options` - optional settings:\n - `separator` - overrides the default `.` hierarchy separator.\n - `contextPrefix` - overrides the default `$` context prefix signifier.\n\nNote that references can only be used where explicitly supported such as in `valid()` or `invalid()` rules. If upwards\n(parents) references are needed, use [`object.assert()`](#objectassertref-schema-message).\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.ref('b.c'),\n b: {\n c: Joi.any()\n },\n c: Joi.ref('$x')\n});\n\nJoi.validate({ a: 5, b: { c: 5 } }, schema, { context: { x: 5 } }, function (err, value) {});\n```\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/hapijs/joi/issues" + }, + "_id": "joi@5.1.0", + "_from": "joi@5.x.x" +} diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/test/alternatives.js b/node_modules/hapi/node_modules/vision/node_modules/joi/test/alternatives.js new file mode 100755 index 0000000..e82ca88 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/test/alternatives.js @@ -0,0 +1,454 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('..'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('alternatives', function () { + + it('fails when no alternatives are provided', function (done) { + + Joi.alternatives().validate('a', function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('value not matching any of the allowed alternatives'); + done(); + }); + }); + + it('allows undefined when no alternatives are provided', function (done) { + + Joi.alternatives().validate(undefined, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('applies modifiers when higher priority converts', function (done) { + + var schema = Joi.object({ + a: [ + Joi.number(), + Joi.string() + ] + }); + + schema.validate({ a: '5' }, function (err, value) { + + expect(err).to.not.exist(); + expect(value.a).to.equal(5); + done(); + }); + }); + + it('applies modifiers when lower priority valid is a match', function (done) { + + var schema = Joi.object({ + a: [ + Joi.number(), + Joi.valid('5') + ] + }); + + schema.validate({ a: '5' }, function (err, value) { + + expect(err).to.not.exist(); + expect(value.a).to.equal(5); + done(); + }); + }); + + it('does not apply modifier if alternative fails', function (done) { + + var schema = Joi.object({ + a: [ + Joi.object({ c: Joi.any(), d: Joi.number() }).rename('b', 'c'), + { b: Joi.any(), d: Joi.string() } + ] + }); + + var input = { a: { b: 'any', d: 'string' } }; + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + expect(value.a.b).to.equal('any'); + done(); + }); + }); + + describe('#try', function () { + + it('throws when missing alternatives', function (done) { + + expect(function () { + + Joi.alternatives().try(); + }).to.throw('Cannot add other alternatives without at least one schema'); + done(); + }); + }); + + describe('#when', function () { + + it('throws on invalid ref (not string)', function (done) { + + expect(function () { + + Joi.alternatives().when(5, { is: 6, then: Joi.number() }); + }).to.throw('Invalid reference: 5'); + done(); + }); + + it('validates conditional alternatives', function (done) { + + var schema = { + a: Joi.alternatives().when('b', { is: 5, then: 'x', otherwise: 'y' }) + .try('z'), + b: Joi.any() + }; + + Helper.validate(schema, [ + [{ a: 'x', b: 5 }, true], + [{ a: 'x', b: 6 }, false], + [{ a: 'y', b: 5 }, false], + [{ a: 'y', b: 6 }, true], + [{ a: 'z', b: 5 }, true], + [{ a: 'z', b: 6 }, true] + ], done); + }); + + it('validates conditional alternatives (empty key)', function (done) { + + var schema = { + a: Joi.alternatives().when('', { is: 5, then: 'x', otherwise: 'y' }) + .try('z'), + '': Joi.any() + }; + + Helper.validate(schema, [ + [{ a: 'x', '': 5 }, true], + [{ a: 'x', '': 6 }, false], + [{ a: 'y', '': 5 }, false], + [{ a: 'y', '': 6 }, true], + [{ a: 'z', '': 5 }, true], + [{ a: 'z', '': 6 }, true] + ], done); + }); + + it('validates only then', function (done) { + + var schema = { + a: Joi.alternatives().when(Joi.ref('b'), { is: 5, then: 'x' }) + .try('z'), + b: Joi.any() + }; + + Helper.validate(schema, [ + [{ a: 'x', b: 5 }, true], + [{ a: 'x', b: 6 }, false], + [{ a: 'y', b: 5 }, false], + [{ a: 'y', b: 6 }, false], + [{ a: 'z', b: 5 }, true], + [{ a: 'z', b: 6 }, true] + ], done); + }); + + it('validates only otherwise', function (done) { + + var schema = { + a: Joi.alternatives().when('b', { is: 5, otherwise: 'y' }) + .try('z'), + b: Joi.any() + }; + + Helper.validate(schema, [ + [{ a: 'x', b: 5 }, false], + [{ a: 'x', b: 6 }, false], + [{ a: 'y', b: 5 }, false], + [{ a: 'y', b: 6 }, true], + [{ a: 'z', b: 5 }, true], + [{ a: 'z', b: 6 }, true] + ], done); + }); + + it('validates when is has ref', function (done) { + + var schema = { + a: Joi.alternatives().when('b', { is: Joi.ref('c'), then: 'x' }), + b: Joi.any(), + c: Joi.number() + }; + + Helper.validate(schema, [ + [{ a: 'x', b: 5, c: '5' }, true], + [{ a: 'x', b: 5, c: '1' }, false], + [{ a: 'x', b: '5', c: '5' }, false], + [{ a: 'y', b: 5, c: 5 }, false], + [{ a: 'y' }, false] + ], done); + }); + + it('validates when then has ref', function (done) { + + var schema = { + a: Joi.alternatives().when('b', { is: 5, then: Joi.ref('c') }), + b: Joi.any(), + c: Joi.number() + }; + + Helper.validate(schema, [ + [{ a: 'x', b: 5, c: '1' }, false], + [{ a: 1, b: 5, c: '1' }, true], + [{ a: '1', b: 5, c: '1' }, false] + ], done); + }); + + it('validates when otherwise has ref', function (done) { + + var schema = { + a: Joi.alternatives().when('b', { is: 6, otherwise: Joi.ref('c') }), + b: Joi.any(), + c: Joi.number() + }; + + Helper.validate(schema, [ + [{ a: 'x', b: 5, c: '1' }, false], + [{ a: 1, b: 5, c: '1' }, true], + [{ a: '1', b: 5, c: '1' }, false] + ], done); + }); + + it('validates when empty value', function (done) { + + var schema = { + a: Joi.alternatives().when('b', { is: true, then: Joi.required() }), + b: Joi.boolean().default(false) + }; + + Helper.validate(schema, [ + [{ b: false }, true], + [{ b: true }, true] // true because required() only applies to the one alternative + ], done); + }); + }); + + describe('#describe', function () { + + it('describes when', function (done) { + + var schema = { + a: Joi.alternatives().when('b', { is: 5, then: 'x', otherwise: 'y' }) + .try('z'), + b: Joi.any() + }; + + var outcome = { + type: 'object', + children: { + b: { + type: 'any' + }, + a: { + type: 'alternatives', + alternatives: [ + { + ref: 'ref:b', + is: { + type: 'number', + flags: { + allowOnly: true + }, + valids: [5], + invalids: [Infinity, -Infinity] + }, + then: { + type: 'string', + flags: { + allowOnly: true + }, + valids: ['x'], + invalids: [''] + }, + otherwise: { + type: 'string', + flags: { + allowOnly: true + }, + valids: ['y'], + invalids: [''] + } + }, + { + type: 'string', + flags: { + allowOnly: true + }, + valids: ['z'], + invalids: [''] + } + ] + } + } + }; + + expect(Joi.describe(schema)).to.deep.equal(outcome); + done(); + }); + + it('describes when (only then)', function (done) { + + var schema = { + a: Joi.alternatives().when('b', { is: 5, then: 'x' }) + .try('z'), + b: Joi.any() + }; + + var outcome = { + type: 'object', + children: { + b: { + type: 'any' + }, + a: { + type: 'alternatives', + alternatives: [ + { + ref: 'ref:b', + is: { + type: 'number', + flags: { + allowOnly: true + }, + valids: [5], + invalids: [Infinity, -Infinity] + }, + then: { + type: 'string', + flags: { + allowOnly: true + }, + valids: ['x'], + invalids: [''] + } + }, + { + type: 'string', + flags: { + allowOnly: true + }, + valids: ['z'], + invalids: [''] + } + ] + } + } + }; + + expect(Joi.describe(schema)).to.deep.equal(outcome); + done(); + }); + + it('describes when (only otherwise)', function (done) { + + var schema = { + a: Joi.alternatives().when('b', { is: 5, otherwise: 'y' }) + .try('z'), + b: Joi.any() + }; + + var outcome = { + type: 'object', + children: { + b: { + type: 'any' + }, + a: { + type: 'alternatives', + alternatives: [ + { + ref: 'ref:b', + is: { + type: 'number', + flags: { + allowOnly: true + }, + valids: [5], + invalids: [Infinity, -Infinity] + }, + otherwise: { + type: 'string', + flags: { + allowOnly: true + }, + valids: ['y'], + invalids: [''] + } + }, + { + type: 'string', + flags: { + allowOnly: true + }, + valids: ['z'], + invalids: [''] + } + ] + } + } + }; + + expect(Joi.describe(schema)).to.deep.equal(outcome); + done(); + }); + + it('describes inherited fields (from any)', function (done) { + + var schema = Joi.alternatives() + .try('a') + .description('d') + .example('a') + .meta('b') + .meta('c') + .notes('f') + .tags('g'); + + var outcome = { + type: 'alternatives', + description: 'd', + notes: ['f'], + tags: ['g'], + meta: ['b', 'c'], + examples: ['a'], + alternatives: [{ + type: 'string', + flags: { + allowOnly: true + }, + valids: ['a'], + invalids: [''] + }] + }; + + expect(Joi.describe(schema)).to.deep.equal(outcome); + done(); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/test/any.js b/node_modules/hapi/node_modules/vision/node_modules/joi/test/any.js new file mode 100755 index 0000000..3a89bf6 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/test/any.js @@ -0,0 +1,960 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('any', function () { + + describe('#equal', function () { + + it('validates valid values', function (done) { + + Helper.validate(Joi.equal(4), [ + [4, true], + [5, false] + ], done); + }); + }); + + describe('#not', function () { + + it('validates invalid values', function (done) { + + Helper.validate(Joi.not(5), [ + [4, true], + [5, false] + ], done); + }); + }); + + describe('#exist', function () { + + it('validates required values', function (done) { + + Helper.validate(Joi.exist(), [ + [4, true], + [undefined, false] + ], done); + }); + }); + + describe('#strict', function () { + + it('validates without converting', function (done) { + + var schema = Joi.object({ + array: Joi.array().includes(Joi.string().min(5), Joi.number().min(3)) + }).strict(); + + Helper.validate(schema, [ + [{ array: ['12345'] }, true], + [{ array: ['1'] }, false], + [{ array: [3] }, true], + [{ array: ['12345', 3] }, true] + ], done); + }); + }); + + describe('#options', function () { + + it('adds to existing options', function (done) { + + var schema = Joi.object({ b: Joi.number().strict().options({ convert: true }) }); + var input = { b: '2' }; + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + expect(value.b).to.equal(2); + done(); + }); + }); + }); + + describe('#label', function () { + + it('adds to existing options', function (done) { + + var schema = Joi.object({ b: Joi.string().email().label('Custom label') }); + var input = { b: 'not_a_valid_email' }; + schema.validate(input, function (err, value) { + + expect(err).to.exist(); + expect(err.details[0].message).to.equal('Custom label must be a valid email'); + done(); + }); + }); + + it('throws when label is missing', function (done) { + + expect(function () { + + Joi.label(); + }).to.throw('Label name must be a non-empty string'); + done(); + }); + + it('can describe a label', function (done) { + + var schema = Joi.object().label('lbl').describe(); + expect(schema).to.deep.equal({ type: 'object', label: 'lbl' }); + done(); + }); + }); + + describe('#strict', function () { + + it('adds to existing options', function (done) { + + var schema = Joi.object({ b: Joi.number().options({ convert: true }).strict() }); + var input = { b: '2' }; + schema.validate(input, function (err, value) { + + expect(err).to.exist(); + expect(value.b).to.equal('2'); + done(); + }); + }); + }); + + describe('#raw', function () { + + it('gives the raw input', function (done) { + + var tests = [ + [Joi.array(), '[1,2,3]'], + [Joi.binary(), 'abc'], + [Joi.boolean(), 'false'], + [Joi.date().format('YYYYMMDD'), '19700101'], + [Joi.number(), '12'], + [Joi.object(), '{ "a": 1 }'], + [Joi.any().strict(), 'abc'] + ]; + + tests.forEach(function (test) { + + var baseSchema = test[0]; + var input = test[1]; + var schemas = [ + baseSchema.raw(), + baseSchema.raw(true), + baseSchema.options({ raw: true }) + ]; + + schemas.forEach(function (schema) { + + schema.raw().validate(input, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.equal(input); + }); + }); + }); + + done(); + }); + }); + + describe('#default', function () { + + it('sets the value', function (done) { + + var schema = Joi.object({ foo: Joi.string().default('test') }); + var input = {}; + + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + expect(value.foo).to.equal('test'); + done(); + }); + }); + + it('should not overide a value when value is given', function (done) { + + var schema = Joi.object({ foo: Joi.string().default('bar') }); + var input = { foo: 'test' }; + + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + expect(value.foo).to.equal('test'); + done(); + }); + }); + + it('sets value based on condition (outer)', function (done) { + + var schema = Joi.object({ + a: Joi.boolean(), + b: Joi.boolean().default(false).when('a', { is: true, then: Joi.required(), otherwise: Joi.forbidden() }) + }); + + schema.validate({ a: false }, function (err, value) { + + expect(err).to.not.exist(); + expect(value.b).to.equal(false); + done(); + }); + }); + + it('sets value based on condition (inner)', function (done) { + + var schema = Joi.object({ + a: Joi.boolean(), + b: Joi.boolean().when('a', { is: true, then: Joi.default(false), otherwise: Joi.forbidden() }) + }); + + schema.validate({ a: true }, function (err, value) { + + expect(err).to.not.exist(); + expect(value.b).to.equal(false); + done(); + }); + }); + }); + + describe('#optional', function () { + + it('validates optional with default required', function (done) { + + var schema = Joi.object({ + a: Joi.any(), + b: Joi.any(), + c: { + d: Joi.any() + } + }).options({ presence: 'required' }); + + Helper.validate(schema, [ + [{ a: 5 }, false], + [{ a: 5, b: 6 }, false], + [{ a: 5, b: 6, c: {} }, false], + [{ a: 5, b: 6, c: { d: 7 } }, true], + [{}, false], + [{ b: 5 }, false] + ], done); + }); + }); + + describe('#forbidden', function () { + + it('validates forbidden', function (done) { + + var schema = { + a: Joi.number(), + b: Joi.forbidden() + }; + + Helper.validate(schema, [ + [{ a: 5 }, true], + [{ a: 5, b: 6 }, false], + [{ a: 'a' }, false], + [{}, true], + [{ b: undefined }, true], + [{ b: null }, false] + ], done); + }); + }); + + describe('#description', function () { + + it('sets the description', function (done) { + + var b = Joi.description('my description'); + expect(b._description).to.equal('my description'); + done(); + }); + + it('throws when description is missing', function (done) { + + expect(function () { + + Joi.description(); + }).to.throw('Description must be a non-empty string'); + done(); + }); + }); + + describe('#notes', function () { + + it('sets the notes', function (done) { + + var b = Joi.notes(['a']).notes('my notes'); + expect(b._notes).to.deep.equal(['a', 'my notes']); + done(); + }); + + it('throws when notes are missing', function (done) { + + expect(function () { + + Joi.notes(); + }).to.throw('Notes must be a non-empty string or array'); + done(); + }); + + it('throws when notes are invalid', function (done) { + + expect(function () { + + Joi.notes(5); + }).to.throw('Notes must be a non-empty string or array'); + done(); + }); + }); + + describe('#tags', function () { + + it('sets the tags', function (done) { + + var b = Joi.tags(['tag1', 'tag2']).tags('tag3'); + expect(b._tags).to.include('tag1'); + expect(b._tags).to.include('tag2'); + expect(b._tags).to.include('tag3'); + done(); + }); + + it('throws when tags are missing', function (done) { + + expect(function () { + + Joi.tags(); + }).to.throw('Tags must be a non-empty string or array'); + done(); + }); + + it('throws when tags are invalid', function (done) { + + expect(function () { + + Joi.tags(5); + }).to.throw('Tags must be a non-empty string or array'); + done(); + }); + }); + + describe('#meta', function () { + + it('sets the meta', function (done) { + + var meta = { prop: 'val', prop2: 3 }; + var b = Joi.meta(meta); + expect(b.describe().meta).to.deep.equal([meta]); + + b = b.meta({ other: true }); + expect(b.describe().meta).to.deep.equal([meta, { + other: true + }]); + + done(); + }); + + it('throws when meta is missing', function (done) { + + expect(function () { + + Joi.meta(); + }).to.throw('Meta cannot be undefined'); + done(); + }); + }); + + describe('#example', function () { + + it('sets an example', function (done) { + + var schema = Joi.valid(5, 6, 7).example(5); + expect(schema._examples).to.include(5); + expect(schema.describe().examples).to.deep.equal([5]); + done(); + }); + + it('throws when tags are missing', function (done) { + + expect(function () { + + Joi.example(); + }).to.throw('Missing example'); + done(); + }); + + it('throws when example fails own rules', function (done) { + + expect(function () { + + var schema = Joi.valid(5, 6, 7).example(4); + }).to.throw('Bad example: value must be one of 5, 6, 7'); + done(); + }); + }); + + describe('#unit', function () { + + it('sets the unit', function (done) { + + var b = Joi.unit('milliseconds'); + expect(b._unit).to.equal('milliseconds'); + expect(b.describe().unit).to.equal('milliseconds'); + done(); + }); + + it('throws when unit is missing', function (done) { + + expect(function () { + + Joi.unit(); + }).to.throw('Unit name must be a non-empty string'); + done(); + }); + }); + + describe('#_validate', function () { + + it('checks value after conversion', function (done) { + + var schema = Joi.number().invalid(2); + Joi.validate('2', schema, { abortEarly: false }, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + }); + + describe('#concat', function () { + + it('throws when schema is not any', function (done) { + + expect(function () { + + Joi.string().concat(Joi.number()); + }).to.throw('Cannot merge with another type: number'); + done(); + }); + + it('throws when schema is missing', function (done) { + + expect(function () { + + Joi.string().concat(); + }).to.throw('Invalid schema object'); + done(); + }); + + it('throws when schema is invalid', function (done) { + + expect(function () { + + Joi.string().concat(1); + }).to.throw('Invalid schema object'); + done(); + }); + + it('merges two schemas (settings)', function (done) { + + var a = Joi.number().options({ convert: true }); + var b = Joi.options({ convert: false }); + + Helper.validate(a, [ + [1, true], ['1', true] + ]); + + Helper.validate(a.concat(b), [ + [1, true], ['1', false] + ], done); + }); + + it('merges two schemas (valid)', function (done) { + + var a = Joi.string().valid('a'); + var b = Joi.string().valid('b'); + + Helper.validate(a, [ + ['a', true], + ['b', false] + ]); + + Helper.validate(b, [ + ['b', true], + ['a', false] + ]); + + Helper.validate(a.concat(b), [ + ['a', true], + ['b', true] + ], done); + }); + + it('merges two schemas (invalid)', function (done) { + + var a = Joi.string().invalid('a'); + var b = Joi.invalid('b'); + + Helper.validate(a, [ + ['b', true], ['a', false] + ]); + + Helper.validate(b, [ + ['a', true], ['b', false] + ]); + + Helper.validate(a.concat(b), [ + ['a', false], ['b', false] + ], done); + }); + + it('merges two schemas (valid/invalid)', function (done) { + + var a = Joi.string().valid('a').invalid('b'); + var b = Joi.string().valid('b').invalid('a'); + + Helper.validate(a, [ + ['a', true], + ['b', false] + ]); + + Helper.validate(b, [ + ['b', true], + ['a', false] + ]); + + Helper.validate(a.concat(b), [ + ['a', false], + ['b', true] + ], done); + }); + + it('merges two schemas (tests)', function (done) { + + var a = Joi.number().min(5); + var b = Joi.number().max(10); + + Helper.validate(a, [ + [4, false], [11, true] + ]); + + Helper.validate(b, [ + [6, true], [11, false] + ]); + + Helper.validate(a.concat(b), [ + [4, false], [6, true], [11, false] + ], done); + }); + + it('merges two schemas (flags)', function (done) { + + var a = Joi.string().valid('a'); + var b = Joi.string().insensitive(); + + Helper.validate(a, [ + ['a', true], ['A', false], ['b', false] + ]); + + Helper.validate(a.concat(b), [ + ['a', true], ['A', true], ['b', false] + ], done); + }); + + it('overrides and append information', function (done) { + + var a = Joi.description('a').unit('a').tags('a').example('a'); + var b = Joi.description('b').unit('b').tags('b').example('b'); + + var desc = a.concat(b).describe(); + expect(desc).to.deep.equal({ + type: 'any', + description: 'b', + tags: ['a', 'b'], + examples: ['a', 'b'], + unit: 'b' + }); + done(); + }); + + it('merges two objects (any key + specific key)', function (done) { + + var a = Joi.object(); + var b = Joi.object({ b: 1 }); + + Helper.validate(a, [ + [{ b: 1 }, true], [{ b: 2 }, true] + ]); + + Helper.validate(b, [ + [{ b: 1 }, true], [{ b: 2 }, false] + ]); + + Helper.validate(a.concat(b), [ + [{ b: 1 }, true], [{ b: 2 }, false] + ]); + + Helper.validate(b.concat(a), [ + [{ b: 1 }, true], [{ b: 2 }, false] + ], done); + }); + + it('merges two objects (no key + any key)', function (done) { + + var a = Joi.object({}); + var b = Joi.object(); + + Helper.validate(a, [ + [{}, true], [{ b: 2 }, false] + ]); + + Helper.validate(b, [ + [{}, true], [{ b: 2 }, true] + ]); + + Helper.validate(a.concat(b), [ + [{}, true], [{ b: 2 }, false] + ]); + + Helper.validate(b.concat(a), [ + [{}, true], [{ b: 2 }, false] + ], done); + }); + + it('merges two objects (key + key)', function (done) { + + var a = Joi.object({ a: 1 }); + var b = Joi.object({ b: 2 }); + + Helper.validate(a, [ + [{ a: 1 }, true], [{ b: 2 }, false] + ]); + + Helper.validate(b, [ + [{ a: 1 }, false], [{ b: 2 }, true] + ]); + + Helper.validate(a.concat(b), [ + [{ a: 1 }, true], [{ b: 2 }, true] + ]); + + Helper.validate(b.concat(a), [ + [{ a: 1 }, true], [{ b: 2 }, true] + ], done); + }); + + it('merges two objects (renames)', function (done) { + + var a = Joi.object({ a: 1 }).rename('c', 'a'); + var b = Joi.object({ b: 2 }).rename('d', 'b'); + + a.concat(b).validate({ c: 1, d: 2 }, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal({ a: 1, b: 2 }); + done(); + }); + }); + + it('merges two objects (deps)', function (done) { + + var a = Joi.object({ a: 1 }); + var b = Joi.object({ b: 2 }).and('b', 'a'); + + a.concat(b).validate({ a: 1, b: 2 }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('merges two alternatives with references', function (done) { + + var schema = { + a: { c: Joi.number() }, + b: Joi.alternatives(Joi.ref('a.c')).concat(Joi.alternatives(Joi.ref('c'))), + c: Joi.number() + }; + + Helper.validate(schema, [ + [{ a: {} }, true], + [{ a: { c: '5' }, b: 5 }, true], + [{ a: { c: '5' }, b: 6, c: '6' }, true], + [{ a: { c: '5' }, b: 7, c: '6' }, false] + ], done); + }); + + it('merges meta properly', function (done) { + + var metaA = { a: 1 }; + var metaB = { b: 1 }; + var a = Joi.any().meta(metaA); + var b = Joi.any().meta(metaB); + var c = Joi.any(); + var d = Joi.any(); + + expect(a.concat(b)._meta).to.deep.equal([{ a: 1 }, { b: 1 }]); + expect(a.concat(c)._meta).to.deep.equal([metaA]); + expect(b.concat(c)._meta).to.deep.equal([metaB]); + expect(c.concat(d)._meta).to.deep.equal([]); + + done(); + }); + }); + + describe('#when', function () { + + it('throws when options are invalid', function (done) { + + expect(function () { + + Joi.when('a'); + }).to.throw('Invalid options'); + done(); + }); + + it('forks type into alternatives', function (done) { + + var schema = { + a: Joi.any(), + b: Joi.string().valid('x').when('a', { is: 5, then: Joi.valid('y'), otherwise: Joi.valid('z') }) + }; + + Helper.validate(schema, [ + [{ a: 5, b: 'x' }, true], + [{ a: 5, b: 'y' }, true], + [{ a: 5, b: 'z' }, false], + [{ a: 1, b: 'x' }, true], + [{ a: 1, b: 'y' }, false], + [{ a: 1, b: 'z' }, true], + [{ a: 5, b: 'a' }, false], + [{ b: 'a' }, false] + ], done); + }); + + it('forks type into alternatives (only then)', function (done) { + + var schema = { + a: Joi.any(), + b: Joi.string().valid('x').when('a', { is: 5, then: Joi.valid('y') }) + }; + + Helper.validate(schema, [ + [{ a: 5, b: 'x' }, true], + [{ a: 5, b: 'y' }, true], + [{ a: 5, b: 'z' }, false], + [{ a: 1, b: 'x' }, true], + [{ a: 1, b: 'y' }, false], + [{ a: 1, b: 'z' }, false], + [{ a: 5, b: 'a' }, false], + [{ b: 'a' }, false] + ], done); + }); + + it('forks type into alternatives (only otherwise)', function (done) { + + var schema = { + a: Joi.any(), + b: Joi.string().valid('x').when('a', { is: 5, otherwise: Joi.valid('z') }) + }; + + Helper.validate(schema, [ + [{ a: 5, b: 'x' }, true], + [{ a: 5, b: 'y' }, false], + [{ a: 5, b: 'z' }, false], + [{ a: 1, b: 'x' }, true], + [{ a: 1, b: 'y' }, false], + [{ a: 1, b: 'z' }, true], + [{ a: 5, b: 'a' }, false], + [{ b: 'a' }, false] + ], done); + }); + + it('makes peer required', function (done) { + + var schema = { + a: Joi.when('b', { is: 5, then: Joi.required() }), + b: Joi.any() + }; + + Helper.validate(schema, [ + [{ b: 5 }, false], + [{ b: 6 }, true], + [{ a: 'b' }, true], + [{ b: 5, a: 'x' }, true] + ], done) + }); + }); + + describe('#requiredKeys', function () { + + it('should set keys as required', function (done) { + + var schema = Joi.object({ a: 0, b: 0, c: { d: 0, e: { f: 0 } }, g: { h: 0 } }) + .requiredKeys('a', 'b', 'c.d', 'c.e.f', 'g'); + Helper.validate(schema, [ + [{}, false], + [{ a: 0 }, false], + [{ a: 0, b: 0 }, false], + [{ a: 0, b: 0, g: {} }, true], + [{ a: 0, b: 0, c: {}, g: {} }, false], + [{ a: 0, b: 0, c: { d: 0 }, g: {} }, true], + [{ a: 0, b: 0, c: { d: 0, e: {} }, g: {} }, false], + [{ a: 0, b: 0, c: { d: 0, e: { f: 0 } }, g: {} }, true] + ], done); + }); + + it('should work on types other than objects', function (done) { + + var schemas = [Joi.array(), Joi.binary(), Joi.boolean(), Joi.date(), Joi.func(), Joi.number(), Joi.string()]; + schemas.forEach(function (schema) { + + expect(function () { + + schema.applyFunctionToChildren([''], 'required'); + }).to.not.throw(); + + expect(function () { + + schema.applyFunctionToChildren(['', 'a'], 'required'); + }).to.throw(); + + expect(function () { + + schema.applyFunctionToChildren(['a'], 'required'); + }).to.throw(); + }); + + done(); + }); + + it('should throw on unknown key', function (done) { + + expect(function() { + Joi.object({ a: 0, b: 0 }).requiredKeys('a', 'c', 'b', 'd', 'd.e.f'); + }).to.throw(Error, 'unknown key(s) c, d'); + expect(function() { + Joi.object({ a: 0, b: 0 }).requiredKeys('a', 'b', 'a.c.d'); + }).to.throw(Error, 'unknown key(s) a.c.d'); + done(); + }); + + it('should throw on empty object', function (done) { + + expect(function() { + Joi.object().requiredKeys('a', 'c', 'b', 'd'); + }).to.throw(Error, 'unknown key(s) a, b, c, d'); + done(); + }); + + it('should not modify original object', function (done) { + + var schema = Joi.object({ a: 0 }); + var requiredSchema = schema.requiredKeys('a'); + schema.validate({}, function (err) { + + expect(err).to.not.exist(); + + requiredSchema.validate({}, function (err) { + + expect(err).to.exist(); + done(); + }); + }); + }); + }); + + describe('#optionalKeys', function () { + + it('should set keys as optional', function (done) { + + var schema = Joi.object({ a: Joi.number().required(), b: Joi.number().required() }).optionalKeys('a', 'b'); + Helper.validate(schema, [ + [{}, true], + [{ a: 0 }, true], + [{ a: 0, b: 0 }, true] + ], done); + }); + }); + + describe('Set', function () { + + describe('#add', function () { + + it('throws when adding a non ref function', function (done) { + + expect(function () { + + Joi.valid(function () { }); + }).to.throw('Value cannot be an object or function'); + done(); + }); + + it('throws when adding an object function', function (done) { + + expect(function () { + + Joi.valid({}); + }).to.throw('Value cannot be an object or function'); + done(); + }); + }); + + describe('#has', function () { + + it('compares date to null', function (done) { + + var any = Joi.any().clone(); + any._valids.add(null); + expect(any._valids.has(new Date())).to.equal(false); + done(); + }); + + it('compares buffer to null', function (done) { + + var any = Joi.any().clone(); + any._valids.add(null); + expect(any._valids.has(new Buffer(''))).to.equal(false); + done(); + }); + }); + + describe('#values', function () { + + it('returns array', function (done) { + + var a = Joi.any().valid('x').invalid('y'); + var b = a.invalid('x'); + expect(a._valids.values().length).to.equal(1); + expect(b._valids.values().length).to.equal(0); + expect(a._invalids.values().length).to.equal(1); + expect(b._invalids.values().length).to.equal(2); + done(); + }); + }); + + describe('#toString', function () { + + it('includes undefined', function (done) { + + var b = Joi.any().allow(undefined); + expect(b._valids.toString(true)).to.equal('undefined'); + done(); + }); + }); + }); +}); + diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/test/array.js b/node_modules/hapi/node_modules/vision/node_modules/joi/test/array.js new file mode 100755 index 0000000..7c1d549 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/test/array.js @@ -0,0 +1,593 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('array', function () { + + it('converts a string to an array', function (done) { + + Joi.array().validate('[1,2,3]', function (err, value) { + + expect(err).to.not.exist(); + expect(value.length).to.equal(3); + done(); + }); + }); + + it('errors on non-array string', function (done) { + + Joi.array().validate('{ "something": false }', function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('value must be an array'); + done(); + }); + }); + + it('errors on number', function (done) { + + Joi.array().validate(3, function (err, value) { + + expect(err).to.exist(); + expect(value).to.equal(3); + done(); + }); + }); + + it('converts a non-array string with number type', function (done) { + + Joi.array().validate('3', function (err, value) { + + expect(err).to.exist(); + expect(value).to.equal('3'); + done(); + }); + }); + + it('errors on a non-array string', function (done) { + + Joi.array().validate('asdf', function (err, value) { + + expect(err).to.exist(); + expect(value).to.equal('asdf'); + done(); + }); + }); + + describe('#includes', function () { + + it('converts members', function (done) { + + var schema = Joi.array().includes(Joi.number()); + var input = ['1', '2', '3']; + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal([1, 2, 3]); + done(); + }); + }); + + it('allows zero size', function (done) { + + var schema = Joi.object({ + test: Joi.array().includes(Joi.object({ + foo: Joi.string().required() + })) + }); + var input = { test: [] }; + + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('returns the first error when only one inclusion', function (done) { + + var schema = Joi.object({ + test: Joi.array().includes(Joi.object({ + foo: Joi.string().required() + })) + }); + var input = { test: [{ foo: 'a' }, { bar: 2 }] }; + + schema.validate(input, function (err, value) { + + expect(err.message).to.equal('test at position 1 fails because foo is required'); + done(); + }); + }); + + it('validates multiple types added in two calls', function (done) { + + var schema = Joi.array() + .includes(Joi.number()) + .includes(Joi.string()); + + Helper.validate(schema, [ + [[1, 2, 3], true], + [[50, 100, 1000], true], + [[1, 'a', 5, 10], true], + [['joi', 'everydaylowprices', 5000], true] + ], done); + }); + }); + + describe('#min', function () { + + it('validates array size', function (done) { + + var schema = Joi.array().min(2); + Helper.validate(schema, [ + [[1, 2], true], + [[1], false] + ], done); + }); + + it('throws when limit is not a number', function (done) { + + expect(function () { + + Joi.array().min('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('throws when limit is not an integer', function (done) { + + expect(function () { + + Joi.array().min(1.2); + }).to.throw('limit must be a positive integer'); + done(); + }); + }); + + describe('#max', function () { + + it('validates array size', function (done) { + + var schema = Joi.array().max(1); + Helper.validate(schema, [ + [[1, 2], false], + [[1], true] + ], done); + }); + + it('throws when limit is not a number', function (done) { + + expect(function () { + + Joi.array().max('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('throws when limit is not an integer', function (done) { + + expect(function () { + + Joi.array().max(1.2); + }).to.throw('limit must be a positive integer'); + done(); + }); + }); + + describe('#length', function () { + + it('validates array size', function (done) { + + var schema = Joi.array().length(2); + Helper.validate(schema, [ + [[1, 2], true], + [[1], false] + ], done); + }); + + it('throws when limit is not a number', function (done) { + + expect(function () { + + Joi.array().length('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('throws when limit is not an integer', function (done) { + + expect(function () { + + Joi.array().length(1.2); + }).to.throw('limit must be a positive integer'); + done(); + }); + }); + + describe('#validate', function () { + + it('should, by default, allow undefined, allow empty array', function (done) { + + Helper.validate(Joi.array(), [ + [undefined, true], + [[], true] + ], done); + }); + + it('should, when .required(), deny undefined', function (done) { + + Helper.validate(Joi.array().required(), [ + [undefined, false] + ], done); + }); + + it('allows empty arrays', function (done) { + + Helper.validate(Joi.array(), [ + [undefined, true], + [[], true] + ], done); + }); + + it('excludes values when excludes is called', function (done) { + + Helper.validate(Joi.array().excludes(Joi.string()), [ + [['2', '1'], false], + [['1'], false], + [[2], true] + ], done); + }); + + it('allows types to be excluded', function (done) { + + var schema = Joi.array().excludes(Joi.number()); + + var n = [1, 2, 'hippo']; + schema.validate(n, function (err, value) { + + expect(err).to.exist(); + + var m = ['x', 'y', 'z']; + schema.validate(m, function (err2, value) { + + expect(err2).to.not.exist(); + done(); + }); + }); + }); + + it('validates array of Numbers', function (done) { + + Helper.validate(Joi.array().includes(Joi.number()), [ + [[1, 2, 3], true], + [[50, 100, 1000], true], + [['a', 1, 2], false], + [['1', '2', 4], true] + ], done); + }); + + it('validates array of mixed Numbers & Strings', function (done) { + + Helper.validate(Joi.array().includes(Joi.number(), Joi.string()), [ + [[1, 2, 3], true], + [[50, 100, 1000], true], + [[1, 'a', 5, 10], true], + [['joi', 'everydaylowprices', 5000], true] + ], done); + }); + + it('validates array of objects with schema', function (done) { + + Helper.validate(Joi.array().includes(Joi.object({ h1: Joi.number().required() })), [ + [[{ h1: 1 }, { h1: 2 }, { h1: 3 }], true], + [[{ h2: 1, h3: 'somestring' }, { h1: 2 }, { h1: 3 }], false], + [[1, 2, [1]], false] + ], done); + }); + + it('errors on array of unallowed mixed types (Array)', function (done) { + + Helper.validate(Joi.array().includes(Joi.number()), [ + [[1, 2, 3], true], + [[1, 2, [1]], false] + ], done); + }); + + it('errors on invalid number rule using includes', function (done) { + + var schema = Joi.object({ + arr: Joi.array().includes(Joi.number().integer()) + }); + + var input = { arr: [1, 2, 2.1] }; + schema.validate(input, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('arr at position 2 fails because 2 must be an integer'); + done(); + }); + }); + + it('validates an array within an object', function (done) { + + var schema = Joi.object({ + array: Joi.array().includes(Joi.string().min(5), Joi.number().min(3)) + }).options({ convert: false }); + + Helper.validate(schema, [ + [{ array: ['12345'] }, true], + [{ array: ['1'] }, false], + [{ array: [3] }, true], + [{ array: ['12345', 3] }, true] + ], done); + }); + + it('should not change original value', function (done) { + + var schema = Joi.array().includes(Joi.number()).unique(); + var input = ['1', '2']; + + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal([1, 2]); + expect(input).to.deep.equal(['1', '2']); + done(); + }); + }); + + describe('#describe', function () { + + it('returns an empty description when no rules are applied', function (done) { + + var schema = Joi.array(); + var desc = schema.describe(); + expect(desc).to.deep.equal({ + type: 'array', + flags: { sparse: false } + }); + done(); + }); + + it('returns an updated description when sparse rule is applied', function (done) { + + var schema = Joi.array().sparse(); + var desc = schema.describe(); + expect(desc).to.deep.equal({ + type: 'array', + flags: { sparse: true } + }); + done(); + }); + + it('returns an includes array only if includes are specified', function (done) { + + var schema = Joi.array().includes().max(5); + var desc = schema.describe(); + expect(desc.includes).to.not.exist(); + done(); + }); + + it('returns a recursively defined array of includes when specified', function (done) { + + var schema = Joi.array().includes(Joi.number(), Joi.string()).excludes(Joi.boolean()); + var desc = schema.describe(); + expect(desc.includes).to.have.length(2); + expect(desc.excludes).to.have.length(1); + expect(desc).to.deep.equal({ + type: 'array', + flags: { sparse: false }, + includes: [{ type: 'number', invalids: [Infinity, -Infinity] }, { type: 'string', invalids: [''] }], + excludes: [{ type: 'boolean' }] + }); + + done(); + }); + }); + }); + + describe('#unique', function() { + + it('errors if duplicate numbers, strings, objects, binaries, functions, dates and booleans', function(done) { + var buffer = new Buffer('hello world'); + var func = function() {}; + var now = new Date(); + var schema = Joi.array().sparse().unique(); + + Helper.validate(schema, [ + [[2, 2], false], + [[02, 2], false], + [[0x2, 2], false], + [['duplicate', 'duplicate'], false], + [[{ a: 'b' }, { a: 'b' }], false], + [[buffer, buffer], false], + [[func, func], false], + [[now, now], false], + [[true, true], false], + [[undefined, undefined], false] + ], done); + }); + + it('ignores duplicates if they are of different types', function(done) { + var schema = Joi.array().unique(); + + Helper.validate(schema, [ + [[2, '2'], true] + ], done); + }); + + it('validates without duplicates', function(done) { + var buffer = new Buffer('hello world'); + var buffer2 = new Buffer('Hello world'); + var func = function() {}; + var func2 = function() {}; + var now = new Date(); + var now2 = new Date(+now + 100); + var schema = Joi.array().unique(); + + Helper.validate(schema, [ + [[1, 2], true], + [['s1', 's2'], true], + [[{ a: 'b' }, { a: 'c' }], true], + [[buffer, buffer2], true], + [[func, func2], true], + [[now, now2], true], + [[true, false], true] + ], done); + }); + }); + + describe('#sparse', function () { + + it('errors on undefined value', function (done) { + + var schema = Joi.array().includes(Joi.number()); + + Helper.validate(schema, [ + [[undefined], false], + [[2, undefined], false] + ], done); + }); + + it('validates on undefined value with sparse', function (done) { + + var schema = Joi.array().includes(Joi.number()).sparse(); + + Helper.validate(schema, [ + [[undefined], true], + [[2, undefined], true] + ], done); + }); + + it('switches the sparse flag', function (done) { + + var schema = Joi.array().sparse(); + var desc = schema.describe(); + expect(desc).to.deep.equal({ + type: 'array', + flags: { sparse: true } + }); + done(); + }); + + it('switches the sparse flag with explicit value', function (done) { + + var schema = Joi.array().sparse(true); + var desc = schema.describe(); + expect(desc).to.deep.equal({ + type: 'array', + flags: { sparse: true } + }); + done(); + }); + + it('switches the sparse flag back', function (done) { + + var schema = Joi.array().sparse().sparse(false); + var desc = schema.describe(); + expect(desc).to.deep.equal({ + type: 'array', + flags: { sparse: false } + }); + done(); + }); + }); + + describe('#single', function() { + + it('should allow a single element', function(done) { + + var schema = Joi.array().includes(Joi.number()).excludes(Joi.boolean()).single(); + + Helper.validate(schema, [ + [[1, 2, 3], true], + [1, true], + [['a'], false, null, 'value at position 0 fails because value must be a number'], + ['a', false, null, 'single value of value fails because value must be a number'], + [true, false, null, 'single value of value contains an excluded value'] + ], done); + }); + + it('should allow a single element with multiple types', function(done) { + + var schema = Joi.array().includes(Joi.number(), Joi.string()).single(); + + Helper.validate(schema, [ + [[1, 2, 3], true], + [1, true], + [[1, 'a'], true], + ['a', true], + [true, false, null, 'single value of value does not match any of the allowed types'] + ], done); + }); + + it('should allow nested arrays', function(done) { + + var schema = Joi.array().includes(Joi.array().includes(Joi.number())).single(); + + Helper.validate(schema, [ + [[[1],[2],[3]], true], + [[1, 2, 3], true], + [[['a']], false, null, 'value at position 0 fails because value at position 0 fails because value must be a number'], + [['a'], false, null, 'value at position 0 fails because value must be an array'], + ['a', false, null, 'single value of value fails because value must be an array'], + [1, false, null, 'single value of value fails because value must be an array'], + [true, false, null, 'single value of value fails because value must be an array'] + ], done); + }); + + it('should allow nested arrays with multiple types', function (done) { + + var schema = Joi.array().includes(Joi.array().includes(Joi.number(), Joi.boolean())).single(); + + Helper.validate(schema, [ + [[[1, true]], true], + [[1, true], true], + [[[1, 'a']], false, null, 'value at position 0 fails because value at position 1 does not match any of the allowed types'], + [[1, 'a'], false, null, 'value at position 0 fails because value must be an array'] + ], done); + }); + + it('switches the single flag with explicit value', function (done) { + + var schema = Joi.array().single(true); + var desc = schema.describe(); + expect(desc).to.deep.equal({ + type: 'array', + flags: { sparse: false, single: true } + }); + done(); + }); + + it('switches the single flag back', function (done) { + + var schema = Joi.array().single().single(false); + var desc = schema.describe(); + expect(desc).to.deep.equal({ + type: 'array', + flags: { sparse: false, single: false } + }); + done(); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/test/binary.js b/node_modules/hapi/node_modules/vision/node_modules/joi/test/binary.js new file mode 100755 index 0000000..7a89a4c --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/test/binary.js @@ -0,0 +1,194 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('binary', function () { + + it('converts a string to a buffer', function (done) { + + Joi.binary().validate('test', function (err, value) { + + expect(err).to.not.exist(); + expect(value instanceof Buffer).to.equal(true); + expect(value.length).to.equal(4); + expect(value.toString('utf8')).to.equal('test'); + done(); + }); + }); + + it('validates allowed buffer content', function (done) { + + var hello = new Buffer('hello'); + var schema = Joi.binary().valid(hello); + + Helper.validate(schema, [ + ['hello', true], + [hello, true], + [new Buffer('hello'), true], + ['goodbye', false], + [new Buffer('goodbye'), false], + [new Buffer('HELLO'), false] + ], done); + }); + + describe('#validate', function () { + + it('returns an error when a non-buffer or non-string is used', function (done) { + + Joi.binary().validate(5, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('value must be a buffer or a string'); + done(); + }); + }); + + it('accepts a buffer object', function (done) { + + var schema = { + buffer: Joi.binary + }; + + Joi.binary().validate(new Buffer('hello world'), function (err, value) { + + expect(err).to.not.exist(); + expect(value.toString('utf8')).to.equal('hello world'); + done(); + }); + }); + }); + + describe('#encoding', function () { + + it('applies encoding', function (done) { + + var schema = Joi.binary().encoding('base64'); + var input = new Buffer('abcdef'); + schema.validate(input.toString('base64'), function (err, value) { + + expect(err).to.not.exist(); + expect(value instanceof Buffer).to.equal(true); + expect(value.toString()).to.equal('abcdef'); + done(); + }); + }); + + it('throws when encoding is invalid', function (done) { + + expect(function () { + + Joi.binary().encoding('base6'); + }).to.throw('Invalid encoding: base6'); + done(); + }); + }); + + describe('#min', function () { + + it('validates buffer size', function (done) { + + var schema = Joi.binary().min(5); + Helper.validate(schema, [ + [new Buffer('testing'), true], + [new Buffer('test'), false] + ], done); + }); + + it('throws when min is not a number', function (done) { + + expect(function () { + + Joi.binary().min('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('throws when min is not an integer', function (done) { + + expect(function () { + + Joi.binary().min(1.2); + }).to.throw('limit must be a positive integer'); + done(); + }); + }); + + describe('#max', function () { + + it('validates buffer size', function (done) { + + var schema = Joi.binary().max(5); + Helper.validate(schema, [ + [new Buffer('testing'), false], + [new Buffer('test'), true] + ], done); + }); + + it('throws when max is not a number', function (done) { + + expect(function () { + + Joi.binary().max('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('throws when max is not an integer', function (done) { + + expect(function () { + + Joi.binary().max(1.2); + }).to.throw('limit must be a positive integer'); + done(); + }); + }); + + describe('#length', function () { + + it('validates buffer size', function (done) { + + var schema = Joi.binary().length(4); + Helper.validate(schema, [ + [new Buffer('test'), true], + [new Buffer('testing'), false] + ], done); + }); + + it('throws when length is not a number', function (done) { + + expect(function () { + + Joi.binary().length('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('throws when length is not an integer', function (done) { + + expect(function () { + + Joi.binary().length(1.2); + }).to.throw('limit must be a positive integer'); + done(); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/test/boolean.js b/node_modules/hapi/node_modules/vision/node_modules/joi/test/boolean.js new file mode 100755 index 0000000..5be2e97 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/test/boolean.js @@ -0,0 +1,132 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('boolean', function () { + + it('converts a string to a boolean', function (done) { + + Joi.boolean().validate('true', function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.equal(true); + done(); + }); + }); + + it('errors on a number', function (done) { + + Joi.boolean().validate(1, function (err, value) { + + expect(err).to.exist(); + expect(value).to.equal(1); + done(); + }); + }); + + describe('#validate', function () { + + it('converts string values and validates', function (done) { + + var rule = Joi.boolean(); + Helper.validate(rule, [ + ['1234', false], + [false, true], + [true, true], + [null, false], + ['on', true], + ['off', true], + ['true', true], + ['false', true], + ['yes', true], + ['no', true] + ], done); + }); + + it('should handle work with required', function (done) { + + var rule = Joi.boolean().required(); + Helper.validate(rule, [ + ['1234', false], + ['true', true], + [false, true], + [true, true], + [null, false] + ], done); + }); + + it('should handle work with allow', function (done) { + + var rule = Joi.boolean().allow(false); + Helper.validate(rule, [ + ['1234', false], + [false, true], + [null, false] + ], done); + }); + + it('should handle work with invalid', function (done) { + + var rule = Joi.boolean().invalid(false); + Helper.validate(rule, [ + ['1234', false], + [false, false], + [true, true], + [null, false] + ], done); + }); + + it('should handle work with invalid and null allowed', function (done) { + + var rule = Joi.boolean().invalid(false).allow(null); + Helper.validate(rule, [ + ['1234', false], + [false, false], + [true, true], + [null, true] + ], done); + }); + + it('should handle work with allow and invalid', function (done) { + + var rule = Joi.boolean().invalid(true).allow(false); + Helper.validate(rule, [ + ['1234', false], + [false, true], + [true, false], + [null, false] + ], done); + }); + + it('should handle work with allow, invalid, and null allowed', function (done) { + + var rule = Joi.boolean().invalid(true).allow(false).allow(null); + Helper.validate(rule, [ + ['1234', false], + [false, true], + [true, false], + [null, true] + ], done); + }); + }); +}); + diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/test/date.js b/node_modules/hapi/node_modules/vision/node_modules/joi/test/date.js new file mode 100755 index 0000000..6eb9d21 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/test/date.js @@ -0,0 +1,291 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('date', function () { + + it('fails on boolean', function (done) { + + var schema = Joi.date(); + Helper.validate(schema, [ + [true, false], + [false, false] + ], done); + }); + + it('matches specific date', function (done) { + + var now = Date.now(); + Joi.date().valid(new Date(now)).validate(new Date(now), function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('errors on invalid input and convert disabled', function (done) { + + Joi.date().options({ convert: false }).validate('1-1-2013 UTC', function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('value must be a number of milliseconds or valid date string'); + done(); + }); + }); + + it('validates date', function (done) { + + Joi.date().validate(new Date(), function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('validates millisecond date as a string', function (done) { + + var now = new Date(); + var mili = now.getTime(); + + Joi.date().validate(mili.toString(), function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal(now); + done(); + }); + }); + + describe('#validate', function () { + + describe('min', function () { + + it('validates min', function (done) { + + Helper.validate(Joi.date().min('1-1-2000 UTC'), [ + ['1-1-2001 UTC', true], + ['1-1-2000 UTC', true], + [0, false], + ["0", false], + ["-1", false], + ['1-1-1999 UTC', false] + ], done); + }); + + it('accepts "now" as the min date', function(done) { + + var future = new Date(Date.now() + 1000000); + + Joi.date().min('now').validate(future, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal(future); + done(); + }); + }); + + it('errors if .min("now") is used with a past date', function(done) { + + var past = new Date(Date.now() - 1000000); + + Joi.date().min('now').validate(past, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('accepts references as min date', function(done) { + + var schema = Joi.object({ a: Joi.date(), b: Joi.date().min(Joi.ref('a')) }); + var now = Date.now(); + + Helper.validate(schema, [ + [{ a: now, b: now }, true], + [{ a: now, b: now + 1e3 }, true], + [{ a: now, b: now - 1e3 }, false] + ], done); + }); + + it('errors if reference is not a date', function(done) { + + var schema = Joi.object({ a: Joi.string(), b: Joi.date().min(Joi.ref('a')) }); + + Helper.validate(schema, [ + [{ a: 'abc', b: new Date() }, false, null, 'b references a which is not a date'], + [{ a: '123', b: new Date() }, true], + [{ a: (Date.now() + 1e3).toString(), b: new Date() }, false, null, /^b must be larger than or equal to/] + ], done); + }); + }); + + describe('max', function () { + + it('validates max', function (done) { + + Helper.validate(Joi.date().max('1-1-1970 UTC'), [ + ['1-1-1971 UTC', false], + ['1-1-1970 UTC', true], + [0, true], + [1, false], + ["0", true], + ["-1", true], + ['1-1-2014 UTC', false] + ], done); + }); + + it('accepts "now" as the max date', function(done) { + + var past = new Date(Date.now() - 1000000); + + Joi.date().max('now').validate(past, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal(past); + done(); + }); + }); + + it('errors if .max("now") is used with a future date', function(done) { + + var future = new Date(Date.now() + 1000000); + + Joi.date().max('now').validate(future, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('accepts references as max date', function(done) { + + var schema = Joi.object({ a: Joi.date(), b: Joi.date().max(Joi.ref('a')) }); + var now = Date.now(); + + Helper.validate(schema, [ + [{ a: now, b: now }, true], + [{ a: now, b: now + 1e3 }, false], + [{ a: now, b: now - 1e3 }, true] + ], done); + }); + + it('errors if reference is not a date', function(done) { + + var schema = Joi.object({ a: Joi.string(), b: Joi.date().max(Joi.ref('a')) }); + + Helper.validate(schema, [ + [{ a: 'abc', b: new Date() }, false, null, 'b references a which is not a date'], + [{ a: '100000000000000', b: new Date() }, true], + [{ a: (Date.now() - 1e3).toString(), b: new Date() }, false, null, /^b must be less than or equal to/] + ], done); + }); + }); + + it('validates only valid dates', function (done) { + + Helper.validate(Joi.date(), [ + ['1-1-2013 UTC', true], + ['not a valid date', false], + [new Date('not a valid date'), false] + ], done); + }); + + describe('#iso', function() { + + it('validates isoDate', function (done) { + + Helper.validate(Joi.date().iso(), [ + ['2013-06-07T14:21:46.295Z', true], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', true], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', true], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', true], + ['2013-06-07T14:21:46-07:00', true], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', true], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', true], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', true], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false] + ], done); + }); + + it('validates isoDate with a friendly error message', function (done) { + + var schema = { item: Joi.date().iso() }; + Joi.compile(schema).validate({ item: 'something' }, function (err, value) { + + expect(err.message).to.contain('must be a valid ISO 8601 date'); + done(); + }); + }); + + it('validates isoDate after clone', function (done) { + + var schema = { item: Joi.date().iso().clone() }; + Joi.compile(schema).validate({ item: '2013-06-07T14:21:46.295Z' }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + }); + + describe('#format', function () { + + it('validates custom format', function (done) { + + Helper.validate(Joi.date().format('DD#YYYY$MM'), [ + ['07#2013$06', true], + ['2013-06-07', false] + ], done); + }); + + it('validates several custom formats', function (done) { + + Helper.validate(Joi.date().format(['DD#YYYY$MM', 'YY|DD|MM']), [ + ['13|07|06', true], + ['2013-06-07', false] + ], done); + }); + + it('fails with bad formats', function (done) { + + expect(function () { + + Joi.date().format(true); + }).to.throw('Invalid format.'); + + expect(function () { + + Joi.date().format(['YYYYMMDD', true]); + }).to.throw('Invalid format.'); + done(); + }); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/test/errors.js b/node_modules/hapi/node_modules/vision/node_modules/joi/test/errors.js new file mode 100755 index 0000000..3b343ed --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/test/errors.js @@ -0,0 +1,270 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('errors', function () { + + it('supports custom errors when validating types', function (done) { + + var schema = Joi.object({ + email: Joi.string().email(), + date: Joi.date(), + alphanum: Joi.string().alphanum(), + min: Joi.string().min(3), + max: Joi.string().max(3), + required: Joi.string().required(), + xor: Joi.string(), + renamed: Joi.string().valid('456'), + notEmpty: Joi.string().required() + }).rename('renamed', 'required').without('required', 'xor').without('xor', 'required'); + + var input = { + email: 'invalid-email', + date: 'invalid-date', + alphanum: '\b\n\f\r\t', + min: 'ab', + max: 'abcd', + required: 'hello', + xor: '123', + renamed: '456', + notEmpty: '' + }; + + var lang = { + any: { + empty: '3' + }, + date: { + base: '18' + }, + string: { + base: '13', + min: '14', + max: '15', + alphanum: '16', + email: '19' + }, + object: { + without: '7', + rename: { + override: '11' + } + } + }; + + Joi.validate(input, schema, { abortEarly: false, language: lang }, function (err, value) { + + expect(err).to.exist(); + expect(err.name).to.equal('ValidationError'); + expect(err.message).to.equal('value 11. required 7. xor 7. email 19. date 18. alphanum 16. min 14. max 15. notEmpty 3'); + done(); + }); + }); + + it('does not prefix with key when language uses context.key', function (done) { + + Joi.valid('sad').options({ language: { any: { allowOnly: 'my hero {{key}} is not {{valids}}' } } }).validate(5, function (err, value) { + + expect(err.message).to.equal('my hero value is not sad'); + done(); + }); + }); + + it('escapes unsafe keys', function (done) { + + var schema = { + 'a()': Joi.number() + }; + + Joi.validate({ 'a()': 'x' }, schema, function (err, value) { + + expect(err.message).to.equal('a() must be a number'); + + Joi.validate({ 'b()': 'x' }, schema, function (err, value) { + + expect(err.message).to.equal('b() is not allowed'); + done(); + }); + }); + }); + + it('returns error type in validation error', function (done) { + + var input = { + notNumber: '', + notString: true, + notBoolean: 9 + }; + + var schema = { + notNumber: Joi.number().required(), + notString: Joi.string().required(), + notBoolean: Joi.boolean().required() + } + + Joi.validate(input, schema, { abortEarly: false }, function (err, value) { + + expect(err).to.exist(); + expect(err.details).to.have.length(3); + expect(err.details[0].type).to.equal('number.base'); + expect(err.details[1].type).to.equal('string.base'); + expect(err.details[2].type).to.equal('boolean.base'); + done(); + }); + }); + + it('returns a full path to an error value on an array (includes)', function (done) { + + var schema = Joi.array().includes(Joi.array().includes({ x: Joi.number() })); + var input = [ + [{ x: 1 }], + [{ x: 1 }, { x: 'a' }] + ]; + + schema.validate(input, function (err, value) { + + expect(err).to.exist(); + expect(err.details[0].path).to.equal('1.1.x'); + done(); + }); + }); + + it('returns a full path to an error value on an array (excludes)', function (done) { + + var schema = Joi.array().includes(Joi.array().excludes({ x: Joi.string() })); + var input = [ + [{ x: 1 }], + [{ x: 1 }, { x: 'a' }] + ]; + + schema.validate(input, function (err, value) { + + expect(err).to.exist(); + expect(err.details[0].path).to.equal('1.1'); + done(); + }); + }); + + it('returns a full path to an error value on an object', function (done) { + + var schema = { + x: Joi.array().includes({ x: Joi.number() }) + }; + + var input = { + x: [{ x: 1 }, { x: 'a' }] + }; + + Joi.validate(input, schema, function (err, value) { + + expect(err).to.exist(); + expect(err.details[0].path).to.equal('x.1.x'); + done(); + }); + }); + + it('overrides root key language', function (done) { + + Joi.string().options({ language: { root: 'blah' } }).validate(4, function (err, value) { + + expect(err.message).to.equal('blah must be a string'); + done(); + }); + }); + + it('overrides label key language', function (done) { + + Joi.string().options({ language: { root: 'blah', label: 'bleh' } }).validate(4, function (err, value) { + + expect(err.message).to.equal('bleh must be a string'); + done(); + }); + }); + + it('provides context with the error', function (done) { + + Joi.object({ length: Joi.number().min(3).required() }).validate({ length: 1 }, function (err) { + + expect(err.details).to.deep.equal([{ + message: 'length must be larger than or equal to 3', + path: 'length', + type: 'number.min', + context: { + limit: 3, + key: 'length' + } + }]); + done(); + }); + }); + + describe('#annotate', function () { + + it('annotates error', function (done) { + + var object = { + a: 'm', + y: { + b: { + c: 10 + } + } + }; + + var schema = { + a: Joi.string().valid('a', 'b', 'c', 'd'), + y: Joi.object({ + u: Joi.string().valid(['e', 'f', 'g', 'h']).required(), + b: Joi.string().valid('i', 'j').allow(false), + d: Joi.object({ + x: Joi.string().valid('k', 'l').required(), + c: Joi.number() + }) + }) + }; + + Joi.validate(object, schema, { abortEarly: false }, function (err, value) { + + expect(err).to.exist(); + expect(err.annotate()).to.equal('{\n \"y\": {\n \"b\" \u001b[31m[1]\u001b[0m: {\n \"c\": 10\n },\n \u001b[41m\"u\"\u001b[0m\u001b[31m [2]: -- missing --\u001b[0m\n },\n \"a\" \u001b[31m[3]\u001b[0m: \"m\"\n}\n\u001b[31m\n[1] a must be one of a, b, c, d\n[2] u is required\n[3] b must be a string\u001b[0m'); + done(); + }); + }); + + it('displays alternatives fail as a single line', function (done) { + + var schema = { + x: [ + Joi.string(), + Joi.number(), + Joi.date() + ] + }; + + Joi.validate({ x: true }, schema, function (err, value) { + + expect(err).to.exist(); + expect(err.annotate()).to.equal('{\n \"x\" \u001b[31m[1, 2, 3]\u001b[0m: true\n}\n\u001b[31m\n[1] x must be a string\n[2] x must be a number\n[3] x must be a number of milliseconds or valid date string\u001b[0m'); + done(); + }); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/test/function.js b/node_modules/hapi/node_modules/vision/node_modules/joi/test/function.js new file mode 100755 index 0000000..f98d57d --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/test/function.js @@ -0,0 +1,34 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('func', function () { + + it('should validate a function', function (done) { + + Helper.validate(Joi.func().required(), [ + [function () { }, true], + ['', false] + ], done); + }); +}); + diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/test/helper.js b/node_modules/hapi/node_modules/vision/node_modules/joi/test/helper.js new file mode 100755 index 0000000..50c12ba --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/test/helper.js @@ -0,0 +1,70 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +exports.validate = function (schema, config, callback) { + + return exports.validateOptions(schema, config, null, callback); +} + + +exports.validateOptions = function (schema, config, options, callback) { + + var compiled = Joi.compile(schema); + for (var i = 0, il = config.length; i < il; ++i) { + + var item = config[i]; + var result = Joi.validate(item[0], compiled, item[2] || options); + + var err = result.error; + var value = result.value; + + if (err !== null && item[1]) { + console.log(err); + } + + if (err === null && !item[1]) { + console.log(item[0]); + } + + expect(err === null).to.equal(item[1]); + + if (item.length >= 4) { + var comparator = item[3]; + if (item[1]) { + expect(value).to.deep.equal(comparator); + } + else { + if (comparator instanceof RegExp) { + expect(err.message).to.match(comparator); + } + else { + expect(err.message).to.deep.equal(comparator); + } + } + } + } + + if (callback) { + callback(); + } +}; + diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/test/index.js b/node_modules/hapi/node_modules/vision/node_modules/joi/test/index.js new file mode 100755 index 0000000..9a05886 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/test/index.js @@ -0,0 +1,1472 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Path = require('path'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('Joi', function () { + + it('validates object', function (done) { + + var schema = Joi.object({ + a: Joi.number().min(0).max(3), + b: Joi.string().valid('a', 'b', 'c'), + c: Joi.string().email().optional() + }).without('a', 'none'); + + var obj = { + a: 1, + b: 'a', + c: 'joe@example.com' + }; + + schema.validate(obj, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('keeps schema immutable', function (done) { + + var a = Joi.string(); + var b = a.valid('b'); + + Helper.validate(a, [ + ['a', true], + ['b', true], + [5, false] + ], function () { + + Helper.validate(b, [ + ['a', false], + ['b', true], + [5, false] + ], done); + }); + + }); + + it('validates null', function (done) { + + Joi.string().validate(null, function (err, value) { + + expect(err).to.exist(); + expect(err.annotate()).to.equal('{\n \u001b[41m\"value\"\u001b[0m\u001b[31m [1]: -- missing --\u001b[0m\n}\n\u001b[31m\n[1] value must be a string\u001b[0m'); + done(); + }); + }); + + it('validates null schema', function (done) { + + Helper.validate(null, [ + ['a', false], + [null, true] + ], done); + }); + + it('validates number literal', function (done) { + + Helper.validate(5, [ + [6, false], + [5, true] + ], done); + }); + + it('validates string literal', function (done) { + + Helper.validate('5', [ + ['6', false], + ['5', true] + ], done); + }); + + it('validates boolean literal', function (done) { + + Helper.validate(true, [ + [false, false], + [true, true] + ], done); + }); + + it('validates date literal', function (done) { + + var now = Date.now(); + Helper.validate(new Date(now), [ + [new Date(now), true], + [now, true], + [now * 2, false] + ], done); + }); + + it('validates complex literal', function (done) { + + var schema = ['key', 5, { a: true, b: [/^a/, 'boom'] }]; + Helper.validate(schema, [ + ['key', true], + [5, true], + ['other', false], + [6, false], + [{ c: 5 }, false], + [{}, true], + [{ b: 'abc' }, true], + [{ a: true, b: 'boom' }, true], + [{ a: 5, b: 'a' }, false] + ], done); + }); + + it('validates a compiled complex literal', function (done) { + + var schema = Joi.compile(['key', 5, { a: true, b: [/^a/, 'boom'] }]); + Helper.validate(schema, [ + ['key', true], + [5, true], + ['other', false], + [6, false], + [{ c: 5 }, false], + [{}, true], + [{ b: 'abc' }, true], + [{ a: true, b: 'boom' }, true], + [{ a: 5, b: 'a' }, false] + ], done); + }); + + it('validates regex directly', function (done) { + + Joi.compile(/^5$/).validate('5', function (err, value) { + + expect(err).to.not.exist(); + Joi.compile(/.{2}/).validate('6', function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + }); + + it('validated with', function (done) { + + var schema = Joi.object({ + txt: Joi.string(), + upc: Joi.string() + }).with('txt', 'upc'); + + Joi.validate({ txt: 'a' }, schema, { abortEarly: false }, function (err, value) { + + expect(err.message).to.equal('txt missing required peer upc'); + + Helper.validate(schema, [ + [{ upc: 'test' }, true], + [{ txt: 'test' }, false], + [{ txt: 'test', upc: null }, false], + [{ txt: 'test', upc: '' }, false], + [{ txt: 'test', upc: undefined }, false], + [{ txt: 'test', upc: 'test' }, true] + ], done); + }); + }); + + it('validated without', function (done) { + + var schema = Joi.object({ + txt: Joi.string(), + upc: Joi.string() + }).without('txt', 'upc'); + + Joi.validate({ txt: 'a', upc: 'b' }, schema, { abortEarly: false }, function (err, value) { + + expect(err.message).to.equal('txt conflict with forbidden peer upc'); + + Helper.validate(schema, [ + [{ upc: 'test' }, true], + [{ txt: 'test' }, true], + [{ txt: 'test', upc: null }, false], + [{ txt: 'test', upc: '' }, false], + [{ txt: 'test', upc: undefined }, true], + [{ txt: 'test', upc: 'test' }, false] + ], done); + }); + }); + + it('validates xor', function (done) { + + var schema = Joi.object({ + txt: Joi.string(), + upc: Joi.string() + }).xor('txt', 'upc'); + + Joi.validate({}, schema, { abortEarly: false }, function (err, value) { + + expect(err.message).to.equal('value must contain at least one of txt, upc'); + + Helper.validate(schema, [ + [{ upc: null }, false], + [{ upc: 'test' }, true], + [{ txt: null }, false], + [{ txt: 'test' }, true], + [{ txt: 'test', upc: null }, false], + [{ txt: 'test', upc: '' }, false], + [{ txt: '', upc: 'test' }, false], + [{ txt: null, upc: 'test' }, false], + [{ txt: undefined, upc: 'test' }, true], + [{ txt: 'test', upc: undefined }, true], + [{ txt: 'test', upc: '' }, false], + [{ txt: 'test', upc: null }, false], + [{ txt: '', upc: undefined }, false], + [{ txt: '', upc: '' }, false], + [{ txt: 'test', upc: 'test' }, false] + ], done); + }); + }); + + it('validates multiple peers xor', function (done) { + + var schema = Joi.object({ + txt: Joi.string(), + upc: Joi.string(), + code: Joi.string() + }).xor('txt', 'upc', 'code'); + + Helper.validate(schema, [ + [{ upc: 'test' }, true], + [{ txt: 'test' }, true], + [{}, false] + ], done); + }); + + it('validates xor with number types', function (done) { + + var schema = Joi.object({ + code: Joi.number(), + upc: Joi.number() + }).xor('code', 'upc'); + + Helper.validate(schema, [ + [{ upc: 123 }, true], + [{ code: 456 }, true], + [{ code: 456, upc: 123 }, false], + [{}, false] + ], done); + }); + + it('validates xor when empty value of peer allowed', function (done) { + + var schema = Joi.object({ + code: Joi.string(), + upc: Joi.string().allow('') + }).xor('code', 'upc'); + + Helper.validate(schema, [ + [{ upc: '' }, true], + [{ upc: '123' }, true], + [{ code: '456' }, true], + [{ code: '456', upc: '' }, false], + [{}, false] + ], done); + }); + + it('validates or', function (done) { + + var schema = Joi.object({ + txt: Joi.string(), + upc: Joi.string().allow(null, ''), + code: Joi.number() + }).or('txt', 'upc', 'code'); + + Joi.validate({}, schema, { abortEarly: false }, function (err, value) { + + expect(err.message).to.equal('value must contain at least one of txt, upc, code'); + + Helper.validate(schema, [ + [{ upc: null }, true], + [{ upc: 'test' }, true], + [{ txt: null }, false], + [{ txt: 'test' }, true], + [{ code: null }, false], + [{ code: 123 }, true], + [{ txt: 'test', upc: null }, true], + [{ txt: 'test', upc: '' }, true], + [{ txt: '', upc: 'test' }, false], + [{ txt: null, upc: 'test' }, false], + [{ txt: undefined, upc: 'test' }, true], + [{ txt: 'test', upc: undefined }, true], + [{ txt: 'test', upc: '' }, true], + [{ txt: 'test', upc: null }, true], + [{ txt: '', upc: undefined }, false], + [{ txt: '', upc: undefined, code: 999 }, false], + [{ txt: '', upc: undefined, code: undefined }, false], + [{ txt: '', upc: '' }, false], + [{ txt: 'test', upc: 'test' }, true], + [{ txt: 'test', upc: 'test', code: 322 }, true] + ], done); + }); + }); + + it('validates and', function (done) { + + var schema = Joi.object({ + txt: Joi.string(), + upc: Joi.string().allow(null, ''), + code: Joi.number() + }).and('txt', 'upc', 'code'); + + Joi.validate({ txt: 'x' }, schema, { abortEarly: false }, function (err, value) { + + expect(err.message).to.equal('value contains txt without its required peers upc, code'); + + Helper.validate(schema, [ + [{}, true], + [{ upc: null }, false], + [{ upc: 'test' }, false], + [{ txt: null }, false], + [{ txt: 'test' }, false], + [{ code: null }, false], + [{ code: 123 }, false], + [{ txt: 'test', upc: null }, false], + [{ txt: 'test', upc: '' }, false], + [{ txt: '', upc: 'test' }, false], + [{ txt: null, upc: 'test' }, false], + [{ txt: undefined, upc: 'test' }, false], + [{ txt: 'test', upc: undefined }, false], + [{ txt: 'test', upc: '' }, false], + [{ txt: 'test', upc: null }, false], + [{ txt: '', upc: undefined }, false], + [{ txt: '', upc: undefined, code: 999 }, false], + [{ txt: '', upc: undefined, code: undefined }, false], + [{ txt: '', upc: '' }, false], + [{ txt: 'test', upc: 'test' }, false], + [{ txt: 'test', upc: 'test', code: 322 }, true], + [{ txt: 'test', upc: null, code: 322 }, true] + ], done); + }); + }); + + it('validates nand()', function (done) { + + var schema = Joi.object({ + txt: Joi.string(), + upc: Joi.string().allow(null, ''), + code: Joi.number() + }).nand('txt', 'upc', 'code'); + + Joi.validate({ txt: 'x', upc: 'y', code: 123 }, schema, { abortEarly: false }, function (err, value) { + + expect(err.message).to.equal('value txt must not exist simultaneously with upc, code'); + + Helper.validate(schema, [ + [{}, true], + [{ upc: null }, true], + [{ upc: 'test' }, true], + [{ txt: 'test' }, true], + [{ code: 123 }, true], + [{ txt: 'test', upc: null }, true], + [{ txt: 'test', upc: '' }, true], + [{ txt: undefined, upc: 'test' }, true], + [{ txt: 'test', upc: undefined }, true], + [{ txt: 'test', upc: '' }, true], + [{ txt: 'test', upc: null }, true], + [{ txt: 'test', upc: undefined, code: 999 }, true], + [{ txt: 'test', upc: 'test' }, true], + [{ txt: 'test', upc: 'test', code: 322 }, false], + [{ txt: 'test', upc: null, code: 322 }, false] + ], done); + }); + }); + + it('validates an array of valid types', function (done) { + + var schema = Joi.object({ + auth: [ + Joi.object({ + mode: Joi.string().valid('required', 'optional', 'try').allow(null) + }).allow(null), + Joi.string(), + Joi.boolean() + ] + }); + + schema.validate({ auth: { mode: 'none' } }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('mode must be one of required, optional, try, null. auth must be a string. auth must be a boolean'); + + Helper.validate(schema, [ + [{ auth: { mode: 'try' } }, true], + [{ something: undefined }, false], + [{ auth: { something: undefined } }, false], + [{ auth: null }, true], + [{ auth: undefined }, true], + [{}, true], + [{ auth: true }, true], + [{ auth: 123 }, false] + ], done); + }); + }); + + it('validates alternatives', function (done) { + + var schema = Joi.object({ + auth: Joi.alternatives( + Joi.object({ + mode: Joi.string().valid('required', 'optional', 'try').allow(null) + }).allow(null), + Joi.string(), + Joi.boolean() + ) + }); + + schema.validate({ auth: { mode: 'none' } }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('mode must be one of required, optional, try, null. auth must be a string. auth must be a boolean'); + + Helper.validate(schema, [ + [{ auth: { mode: 'try' } }, true], + [{ something: undefined }, false], + [{ auth: { something: undefined } }, false], + [{ auth: null }, true], + [{ auth: undefined }, true], + [{}, true], + [{ auth: true }, true], + [{ auth: 123 }, false] + ], done); + }); + }); + + it('validates required alternatives', function (done) { + + var schema = { + a: Joi.alternatives( + Joi.string().required(), + Joi.boolean().required() + ) + }; + + Helper.validate(schema, [ + [{ a: null }, false], + [{ a: undefined }, true], + [{}, true], + [{ a: true }, true], + [{ a: 'true' }, true], + [{ a: 123 }, false], + [{ a: { c: 1 } }, false], + [{ b: undefined }, false] + ], done); + }); + + it('validates required [] alternatives', function (done) { + + var schema = { + a: [ + Joi.string().required(), + Joi.boolean().required() + ] + }; + + Helper.validate(schema, [ + [{ a: null }, false], + [{ a: undefined }, true], + [{}, true], + [{ a: true }, true], + [{ a: 'true' }, true], + [{ a: 123 }, false], + [{ a: { c: 1 } }, false], + [{ b: undefined }, false] + ], done); + }); + + it('validates an array of string with valid', function (done) { + + var schema = { + brand: Joi.array().includes(Joi.string().valid('amex', 'visa')) + }; + + Helper.validate(schema, [ + [{ brand: ['amex'] }, true], + [{ brand: ['visa', 'mc'] }, false] + ], done); + }); + + it('validates pre and post convert value', function (done) { + + var schema = Joi.number().valid(5); + + Helper.validate(schema, [ + [5, true], + ['5', true] + ], done); + }); + + it('does not change object when validation fails', function (done) { + + var schema = Joi.object({ + a: Joi.number().valid(2) + }); + + var obj = { + a: '5' + }; + + schema.validate(obj, function (err, value) { + + expect(err).to.exist(); + expect(value.a).to.equal('5'); + done(); + }); + }); + + it('does not set optional keys when missing', function (done) { + + var schema = Joi.object({ + a: Joi.number() + }); + + var obj = {}; + + schema.validate(obj, function (err, value) { + + expect(err).to.not.exist(); + expect(value.hasOwnProperty('a')).to.equal(false); + done(); + }); + }); + + it('invalidates pre and post convert value', function (done) { + + var schema = Joi.number().invalid(5); + + Helper.validate(schema, [ + [5, false], + ['5', false] + ], done); + }); + + it('invalidates missing peers', function (done) { + + var schema = Joi.object({ + username: Joi.string(), + password: Joi.string() + }).with('username', 'password').without('password', 'access_token'); + + schema.validate({ username: 'bob' }, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('validates config where the root item is a joi type', function (done) { + + Joi.boolean().allow(null).validate(true, function (err, value) { + + expect(err).to.be.null(); + Joi.object().validate({ auth: { mode: 'try' } }, function (err, value) { + + expect(err).to.be.null(); + + Joi.object().validate(true, function (err, value) { + + expect(err.message).to.contain('value must be an object'); + + Joi.string().validate(true, function (err, value) { + + expect(err.message).to.contain('value must be a string'); + + Joi.string().email().validate('test@test.com', function (err, value) { + + expect(err).to.be.null(); + Joi.object({ param: Joi.string().required() }).validate({ param: 'item' }, function (err, value) { + + expect(err).to.be.null(); + done(); + }); + }); + }); + }); + }); + }); + }); + + it('converts string to number', function (done) { + + var schema = Joi.object({ + a: Joi.number() + }); + + var input = { a: '5' }; + schema.validate(input, function (err, value) { + + expect(err).to.be.null(); + expect(value.a).to.equal(5); + expect(input.a).to.equal('5'); + done(); + }); + }); + + it('allows unknown keys in objects if no schema was given', function (done) { + + Joi.object().validate({ foo: 'bar' }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('fails on unknown keys in objects if a schema was given', function (done) { + + Joi.object({}).validate({ foo: 'bar' }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('foo is not allowed'); + + Joi.compile({}).validate({ foo: 'bar' }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('foo is not allowed'); + + Joi.compile({ other: Joi.number() }).validate({ foo: 'bar' }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('foo is not allowed'); + + done(); + }); + }); + }); + }); + + it('validates an unknown option', function (done) { + + var config = { + auth: Joi.object({ + mode: Joi.string().valid('required', 'optional', 'try').allow(null) + }).allow(null) + }; + + Joi.compile(config).validate({ auth: { unknown: true } }, function (err, value) { + + expect(err).to.not.be.null(); + expect(err.message).to.contain('unknown is not allowed'); + + Joi.compile(config).validate({ something: false }, function (err, value) { + + expect(err).to.not.be.null(); + expect(err.message).to.contain('something is not allowed'); + + done(); + }); + }); + }); + + it('validates required key with multiple options', function (done) { + + var config = { + module: Joi.alternatives([ + Joi.object({ + compile: Joi.func().required(), + execute: Joi.func() + }), + Joi.string() + ]).required() + }; + + Joi.compile(config).validate({}, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.contain('module is required'); + + Joi.compile(config).validate({ module: 'test' }, function (err, value) { + + expect(err).to.be.null(); + + Joi.compile(config).validate({ module: {} }, function (err, value) { + + expect(err).to.not.be.null(); + expect(err.message).to.contain('compile is required'); + expect(err.message).to.contain('module must be a string'); + + Joi.compile(config).validate({ module: { compile: function () { } } }, function (err, value) { + + expect(err).to.be.null(); + done(); + }); + }); + }); + }); + }); + + it('validates key with required alternatives', function (done) { + + var config = { + module: Joi.alt().try( + Joi.object({ + compile: Joi.func().required(), + execute: Joi.func() + }).required(), + Joi.string().required() + ) + }; + + Joi.compile(config).validate({}, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('validates required key with alternatives', function (done) { + + var config = { + module: Joi.alt().try( + Joi.object({ + compile: Joi.func().required(), + execute: Joi.func() + }), + Joi.string() + ).required() + }; + + Joi.compile(config).validate({}, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.contain('module is required'); + done(); + }); + }); + + it('does not require optional numbers', function (done) { + + var config = { + position: Joi.number(), + suggestion: Joi.string() + }; + + Joi.compile(config).validate({ suggestion: 'something' }, function (err, value) { + + expect(err).to.be.null(); + + Joi.compile(config).validate({ position: 1 }, function (err, value) { + + expect(err).to.be.null(); + done(); + }) + }); + }); + + it('does not require optional objects', function (done) { + + var config = { + position: Joi.number(), + suggestion: Joi.object() + }; + + Joi.compile(config).validate({ suggestion: {} }, function (err, value) { + + expect(err).to.be.null(); + + Joi.compile(config).validate({ position: 1 }, function (err, value) { + + expect(err).to.be.null(); + done(); + }); + }); + }); + + it('validates object successfully when config has an array of types', function (done) { + + var schema = { + f: [Joi.number(), Joi.boolean()], + g: [Joi.string(), Joi.object()] + }; + + var obj = { + f: true, + g: 'test' + }; + + Joi.compile(schema).validate(obj, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('validates object successfully when config allows for optional key and key is missing', function (done) { + + var schema = { + h: Joi.number(), + i: Joi.string(), + j: Joi.object() + }; + + var obj = { + h: 12, + i: 'test' + }; + + Joi.compile(schema).validate(obj, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('fails validation', function (done) { + + var schema = { + a: Joi.number().min(0).max(3), + b: Joi.string().valid('a', 'b', 'c'), + c: Joi.string().email().optional() + }; + + var obj = { + a: 10, + b: 'a', + c: 'joe@example.com' + }; + + Joi.compile(schema).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('fails validation when the wrong types are supplied', function (done) { + + var schema = { + a: Joi.number().min(0).max(3), + b: Joi.string().valid('a', 'b', 'c'), + c: Joi.string().email().optional() + }; + + var obj = { + a: 'a', + b: 'a', + c: 'joe@example.com' + }; + + Joi.compile(schema).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('fails validation when missing a required parameter', function (done) { + + var obj = { + c: 10 + }; + + Joi.compile({ a: Joi.string().required() }).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('fails validation when missing a required parameter within an object config', function (done) { + + var obj = { + a: {} + }; + + Joi.compile({ a: Joi.object({ b: Joi.string().required() }) }).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('fails validation when parameter is required to be an object but is given as string', function (done) { + + var obj = { + a: 'a string' + }; + + Joi.compile({ a: Joi.object({ b: Joi.string().required() }) }).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('validates when parameter is required to be an object and is given correctly as a json string', function (done) { + + var schema = { + a: Joi.object({ + b: Joi.string().required() + }) + }; + + var input = { + a: '{"b":"string"}' + }; + + Joi.validate(input, schema, function (err, value) { + + expect(err).to.not.exist(); + expect(input.a).to.equal('{"b":"string"}'); + expect(value.a.b).to.equal('string'); + done(); + }); + }); + + it('fails validation when parameter is required to be an object but is given as a json string that is incorrect (number instead of string)', function (done) { + + var obj = { + a: '{"b":2}' + }; + + Joi.object({ a: Joi.object({ b: Joi.string().required() }) }).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('fails validation when parameter is required to be an Array but is given as string', function (done) { + + var obj = { + a: "an array" + }; + + Joi.object({ a: Joi.array() }).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('validates when parameter is required to be an Array and is given correctly as a json string', function (done) { + + var obj = { + a: '[1,2]' + }; + + Joi.object({ a: Joi.array() }).validate(obj, function (err, value) { + + expect(err).to.be.null(); + done(); + }); + }); + + it('fails validation when parameter is required to be an Array but is given as a json that is incorrect (object instead of array)', function (done) { + + var obj = { + a: '{"b":2}' + }; + + Joi.object({ a: Joi.object({ b: Joi.string().required() }) }).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('fails validation when config is an array and fails', function (done) { + + var schema = { + d: [Joi.string(), Joi.boolean()], + e: [Joi.number(), Joi.object()] + }; + + var obj = { + d: 10, + e: 'a' + }; + + Joi.compile(schema).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('fails validation when config is an array and fails with extra keys', function (done) { + + var schema = { + d: [Joi.string(), Joi.boolean()], + e: [Joi.number(), Joi.object()] + }; + + var obj = { + a: 10, + b: 'a' + }; + + Joi.compile(schema).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('fails validation with extra keys', function (done) { + + var schema = { + a: Joi.number(), + }; + + var obj = { + a: 1, + b: 'a', + }; + + Joi.compile(schema).validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('validates missing optional key with string condition', function (done) { + + var schema = { + key: Joi.string().alphanum(false).min(8) + }; + + Joi.compile(schema).validate({}, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('validates with extra keys and remove them when stripUnknown is set', function (done) { + + var schema = { + a: Joi.number().min(0).max(3), + b: Joi.string().valid('a', 'b', 'c'), + c: Joi.string().email().optional() + }; + + var obj = { + a: 1, + b: 'a', + d: 'c' + }; + + Joi.validate(obj, schema, { stripUnknown: true, allowUnknown: true }, function (err, value) { + + expect(err).to.be.null(); + expect(value).to.deep.equal({ a: 1, b: 'a' }); + done(); + }); + }); + + it('fails to validate with incorrect property when asked to strip unkown keys without aborting early', function (done) { + + var schema = { + a: Joi.number().min(0).max(3), + b: Joi.string().valid('a', 'b', 'c'), + c: Joi.string().email().optional() + }; + + var obj = { + a: 1, + b: 'f', + d: 'c' + }; + + Joi.validate(obj, schema, { stripUnknown: true, abortEarly: false }, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('should pass validation with extra keys when allowUnknown is set', function (done) { + + var schema = { + a: Joi.number().min(0).max(3), + b: Joi.string().valid('a', 'b', 'c'), + c: Joi.string().email().optional() + }; + + var obj = { + a: 1, + b: 'a', + d: 'c' + }; + + Joi.validate(obj, schema, { allowUnknown: true }, function (err, value) { + + expect(err).to.be.null(); + expect(value).to.deep.equal({ a: 1, b: 'a', d: 'c' }); + done(); + }); + }); + + it('should pass validation with extra keys set', function (done) { + + var localConfig = Joi.object({ + a: Joi.number().min(0).max(3), + b: Joi.string().valid('a', 'b', 'c'), + }).options({ allowUnknown: true }); + + var obj = { + a: 1, + b: 'a', + d: 'c' + }; + + localConfig.validate(obj, function (err, value) { + + expect(err).to.be.null(); + expect(value).to.deep.equal({ a: 1, b: 'a', d: 'c' }); + + localConfig.validate(value, function (err, value) { + + expect(err).to.be.null(); + expect(value).to.deep.equal({ a: 1, b: 'a', d: 'c' }); + done(); + }); + }); + }); + + + it('should pass validation with extra keys and remove them when skipExtraKeys is set locally', function (done) { + + var localConfig = Joi.object({ + a: Joi.number().min(0).max(3), + b: Joi.string().valid('a', 'b', 'c') + }).options({ stripUnknown: true, allowUnknown: true }); + + var obj = { + a: 1, + b: 'a', + d: 'c' + }; + + localConfig.validate(obj, function (err, value) { + + expect(err).to.be.null(); + expect(value).to.deep.equal({ a: 1, b: 'a' }); + + localConfig.validate(value, function (err, value) { + + expect(err).to.be.null(); + expect(value).to.deep.equal({ a: 1, b: 'a' }); + done(); + }); + }); + }); + + it('should work when the skipFunctions setting is enabled', function (done) { + + var schema = Joi.object({ username: Joi.string() }).options({ skipFunctions: true }); + var input = { username: 'test', func: function () { } }; + Joi.validate(input, schema, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('should work when the skipFunctions setting is disabled', function (done) { + + var schema = { username: Joi.string() }; + var input = { username: 'test', func: function () { } }; + + Joi.validate(input, schema, { skipFunctions: false }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.contain('func is not allowed'); + done(); + }); + }); + + it('should not convert values when convert is false', function (done) { + + var schema = { + arr: Joi.array().includes(Joi.string()) + }; + + var input = { arr: 'foo' }; + Joi.validate(input, schema, { convert: false }, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('full errors when abortEarly is false', function (done) { + + var schema = { + a: Joi.string(), + b: Joi.string() + }; + + var input = { a: 1, b: 2 }; + + Joi.validate(input, schema, function (errOne, value) { + + Joi.validate(input, schema, { abortEarly: false }, function (errFull, value) { + + expect(errOne).to.exist(); + expect(errFull).to.exist(); + expect(errFull.details.length).to.be.greaterThan(errOne.details.length); + done(); + }); + }); + }); + + it('validates using the root any object', function (done) { + + var any = Joi; + any.validate('abc', function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('validates using the root any object (no callback)', function (done) { + + var any = Joi; + var result = any.validate('abc'); + expect(result.error).to.not.exist(); + expect(result.value).to.equal('abc'); + done(); + }); + + it('accepts no options', function (done) { + + Joi.validate('test', Joi.string(), function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('accepts no options (no callback)', function (done) { + + var result = Joi.validate('test', Joi.string()); + expect(result.error).to.not.exist(); + expect(result.value).to.equal('test'); + done(); + }); + + it('accepts options', function (done) { + + Joi.validate('5', Joi.number(), { convert: false }, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('accepts options (no callback)', function (done) { + + var result = Joi.validate('5', Joi.number(), { convert: false }); + expect(result.error).to.exist(); + done(); + }); + + it('accepts null options', function (done) { + + Joi.validate('test', Joi.string(), null, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('accepts undefined options', function (done) { + + Joi.validate('test', Joi.string(), undefined, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + describe('#describe', function () { + + var schema = Joi.object({ + sub: { + email: Joi.string().email(), + date: Joi.date(), + child: Joi.object({ + alphanum: Joi.string().alphanum() + }), + }, + min: [Joi.number(), Joi.string().min(3)], + max: Joi.string().max(3), + required: Joi.string().required(), + xor: Joi.string(), + renamed: Joi.string().valid('456'), + notEmpty: Joi.string().required().description('a').notes('b').tags('c') + }).rename('renamed', 'required').without('required', 'xor').without('xor', 'required'); + + var result = { + type: 'object', + children: { + sub: { + type: 'object', + children: { + email: { + type: 'string', + invalids: [''], + rules: [{ name: 'email' }] + }, + date: { + type: 'date' + }, + child: { + type: 'object', + children: { + alphanum: { + type: 'string', + invalids: [''], + rules: [{ name: 'alphanum' }] + } + } + } + } + }, + min: { + type: 'alternatives', + alternatives: [ + { + type: 'number', + invalids: [Infinity, -Infinity] + }, + { + type: 'string', + invalids: [''], + rules: [{ name: 'min', arg: 3 }] + } + ] + }, + max: { + type: 'string', + invalids: [''], + rules: [{ name: 'max', arg: 3 }] + }, + required: { + type: 'string', + flags: { + presence: 'required' + }, + invalids: [ ''] + }, + xor: { + type: 'string', + invalids: [''] + }, + renamed: { + type: 'string', + flags: { + allowOnly: true + }, + valids: ['456'], + invalids: [''] + }, + notEmpty: { + type: 'string', + flags: { + presence: 'required' + }, + description: 'a', + notes: ['b'], + tags: ['c'], + invalids: [''] + } + }, + dependencies: [ + { + type: 'without', + key: 'required', + peers: ['xor'] + }, + { + type: 'without', + key: 'xor', + peers: ['required'] + } + ] + }; + + it('describes schema (direct)', function (done) { + + var description = schema.describe(); + expect(description).to.deep.equal(result); + done(); + }); + + it('describes schema (root)', function (done) { + + var description = Joi.describe(schema); + expect(description).to.deep.equal(result); + done(); + }); + + it('describes schema (any)', function (done) { + + var any = Joi; + var description = any.describe(); + expect(description).to.deep.equal({ + type: 'any' + }); + done(); + }); + + it('describes schema without invalids', function (done) { + + var description = Joi.allow(null).describe(); + expect(description.invalids).to.not.exist(); + done(); + }) + }); + + describe('#assert', function () { + + it('throws on invalid value', function (done) { + + expect(function () { + + Joi.assert('x', Joi.number()); + }).to.throw('"x"\n\u001b[31m\n[1] value must be a number\u001b[0m'); + done(); + }); + + it('does not throw on valid value', function (done) { + + expect(function () { + + Joi.assert('4', Joi.number()); + }).to.not.throw(); + done(); + }); + + it('throws on invalid value with message', function (done) { + + expect(function () { + + Joi.assert('x', Joi.number(), 'the reason is'); + }).to.throw('the reason is "x"\n\u001b[31m\n[1] value must be a number\u001b[0m'); + done(); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/test/number.js b/node_modules/hapi/node_modules/vision/node_modules/joi/test/number.js new file mode 100755 index 0000000..84d05b1 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/test/number.js @@ -0,0 +1,589 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('number', function () { + + it('fails on boolean', function (done) { + + var schema = Joi.number(); + Helper.validate(schema, [ + [true, false], + [false, false] + ], done); + }); + + describe('#validate', function () { + + it('should, by default, allow undefined', function (done) { + + Helper.validate(Joi.number(), [ + [undefined, true] + ], done); + }); + + it('should, when .required(), deny undefined', function (done) { + + Helper.validate(Joi.number().required(), [ + [undefined, false] + ], done); + }); + + it('should return false for denied value', function (done) { + + var text = Joi.number().invalid(50); + text.validate(50, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('should validate integer', function (done) { + + var t = Joi.number().integer(); + Helper.validate(t, [ + [100, true], + [0, true], + [null, false], + [1.02, false], + [0.01, false] + ], done); + }); + + it('should return false for Infinity', function(done) { + + var t = Joi.number(); + Helper.validate(t, [ + [Infinity, false], + [-Infinity, false] + ], done); + }); + + it('should return true for allowed Infinity', function(done) { + + var t = Joi.number().allow(Infinity, -Infinity); + Helper.validate(t, [ + [Infinity, true], + [-Infinity, true] + ], done); + }); + + it('can accept string numbers', function (done) { + + var t = Joi.number(); + Helper.validate(t, [ + ['1', true], + ['100', true], + ['1e3', true], + ['1 some text', false], + ['\t\r', false], + [' ', false], + [' 2', true], + ['\t\r43', true], + ['43 ', true], + ['', false] + ], done); + }); + + it('required validates correctly', function (done) { + + var t = Joi.number().required(); + Helper.validate(t, [ + [NaN, false], + ['100', true] + ], done); + }); + + it('converts an object string to a number', function (done) { + + var config = { a: Joi.number() }; + var obj = { a: '123' }; + + Joi.compile(config).validate(obj, function (err, value) { + + expect(err).to.not.exist(); + expect(value.a).to.equal(123); + done(); + }); + }); + + it('converts a string to a number', function (done) { + + Joi.number().validate('1', function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.equal(1); + done(); + }); + }); + + it('errors on null', function (done) { + + Joi.number().validate(null, function (err, value) { + + expect(err).to.exist(); + expect(value).to.equal(null); + done(); + }); + }); + + it('should handle combination of min and max', function (done) { + + var rule = Joi.number().min(8).max(10); + Helper.validate(rule, [ + [1, false], + [11, false], + [8, true], + [9, true], + [null, false] + ], done); + }); + + it('should handle combination of min, max, and null allowed', function (done) { + + var rule = Joi.number().min(8).max(10).allow(null); + Helper.validate(rule, [ + [1, false], + [11, false], + [8, true], + [9, true], + [null, true] + ], done); + }); + + it('should handle combination of min and positive', function (done) { + + var rule = Joi.number().min(-3).positive(); + Helper.validate(rule, [ + [1, true], + [-2, false], + [8, true], + [null, false] + ], done); + }); + + it('should handle combination of max and positive', function (done) { + + var rule = Joi.number().max(5).positive(); + Helper.validate(rule, [ + [4, true], + [-2, false], + [8, false], + [null, false] + ], done); + }); + + it('should handle combination of min and negative', function (done) { + + var rule = Joi.number().min(-3).negative(); + Helper.validate(rule, [ + [4, false], + [-2, true], + [-4, false], + [null, false] + ], done); + }); + + it('should handle combination of negative and positive', function (done) { + + var rule = Joi.number().negative().positive(); + Helper.validate(rule, [ + [4, false], + [-2, false], + [0, false], + [null, false] + ], done); + }); + + it('should handle combination of negative and allow', function (done) { + + var rule = Joi.number().negative().allow(1); + Helper.validate(rule, [ + [1, true], + [-10, true], + [8, false], + [0, false], + [null, false] + ], done); + }); + + it('should handle combination of positive and allow', function (done) { + + var rule = Joi.number().positive().allow(-1); + Helper.validate(rule, [ + [1, true], + [-1, true], + [8, true], + [-10, false], + [null, false] + ], done); + }); + + it('should handle combination of positive, allow, and null allowed', function (done) { + + var rule = Joi.number().positive().allow(-1).allow(null); + Helper.validate(rule, [ + [1, true], + [-1, true], + [8, true], + [-10, false], + [null, true] + ], done); + }); + + it('should handle combination of negative, allow, and null allowed', function (done) { + + var rule = Joi.number().negative().allow(1).allow(null); + Helper.validate(rule, [ + [1, true], + [-10, true], + [8, false], + [0, false], + [null, true] + ], done); + }); + + it('should handle combination of positive, allow, null allowed, and invalid', function (done) { + + var rule = Joi.number().positive().allow(-1).allow(null).invalid(1); + Helper.validate(rule, [ + [1, false], + [-1, true], + [8, true], + [-10, false], + [null, true] + ], done); + }); + + it('should handle combination of negative, allow, null allowed, and invalid', function (done) { + + var rule = Joi.number().negative().allow(1).allow(null).invalid(-5); + Helper.validate(rule, [ + [1, true], + [-10, true], + [-5, false], + [8, false], + [0, false], + [null, true] + ], done); + }); + + it('should handle combination of min, max, and allow', function (done) { + + var rule = Joi.number().min(8).max(10).allow(1); + Helper.validate(rule, [ + [1, true], + [11, false], + [8, true], + [9, true], + [null, false] + ], done); + }); + + it('should handle combination of min, max, allow, and null allowed', function (done) { + + var rule = Joi.number().min(8).max(10).allow(1).allow(null); + Helper.validate(rule, [ + [1, true], + [11, false], + [8, true], + [9, true], + [null, true] + ], done); + }); + + it('should handle combination of min, max, allow, and invalid', function (done) { + + var rule = Joi.number().min(8).max(10).allow(1).invalid(9); + Helper.validate(rule, [ + [1, true], + [11, false], + [8, true], + [9, false], + [null, false] + ], done); + }); + + it('should handle combination of min, max, allow, invalid, and null allowed', function (done) { + + var rule = Joi.number().min(8).max(10).allow(1).invalid(9).allow(null); + Helper.validate(rule, [ + [1, true], + [11, false], + [8, true], + [9, false], + [null, true] + ], done); + }); + + it('should handle combination of min, max, and integer', function (done) { + + var rule = Joi.number().min(8).max(10).integer(); + Helper.validate(rule, [ + [1, false], + [11, false], + [8, true], + [9, true], + [9.1, false], + [null, false] + ], done); + }); + + it('should handle combination of min, max, integer, and allow', function (done) { + + var rule = Joi.number().min(8).max(10).integer().allow(9.1); + Helper.validate(rule, [ + [1, false], + [11, false], + [8, true], + [9, true], + [9.1, true], + [9.2, false], + [null, false] + ], done); + }); + + it('should handle combination of min, max, integer, allow, and invalid', function (done) { + + var rule = Joi.number().min(8).max(10).integer().allow(9.1).invalid(8); + Helper.validate(rule, [ + [1, false], + [11, false], + [8, false], + [9, true], + [9.1, true], + [9.2, false], + [null, false] + ], done); + }); + + it('should handle combination of min, max, integer, allow, invalid, and null allowed', function (done) { + + var rule = Joi.number().min(8).max(10).integer().allow(9.1).invalid(8).allow(null); + Helper.validate(rule, [ + [1, false], + [11, false], + [8, false], + [9, true], + [9.1, true], + [9.2, false], + [null, true] + ], done); + }); + + it('should handle limiting the number of decimal places', function (done) { + + var rule = Joi.number().precision(1).options({ convert: false }); + Helper.validate(rule, [ + [1, true], + [9.1, true], + [9.21, false], + [9.9999, false], + [9.999e99, true], + [9.9e-99, false], + [9.9e3, true], + [null, false] + ], done); + }); + + it('should handle combination of min, max, integer, allow, invalid, null allowed and precision', function (done) { + + var rule = Joi.number().min(8).max(10).integer().allow(9.1).invalid(8).allow(null).precision(1).options({ convert: false }); + Helper.validate(rule, [ + [1, false], + [11, false], + [8, false], + [9, true], + [9.1, true], + [9.11, false], + [9.2, false], + [9.22, false], + [null, true] + ], done); + }); + + it('should handle combination of greater and less', function (done) { + + var rule = Joi.number().greater(5).less(10); + Helper.validate(rule, [ + [0, false], + [11, false], + [5, false], + [10, false], + [8, true], + [5.01, true], + [9.99, true], + [null, false] + ], done); + }); + + it('should handle combination of greater, less, and integer', function (done) { + + var rule = Joi.number().integer().greater(5).less(10); + Helper.validate(rule, [ + [0, false], + [11, false], + [5, false], + [10, false], + [6, true], + [9, true], + [5.01, false], + [9.99, false] + ], done); + }); + + it('should handle combination of greater, less, and null allowed', function (done) { + + var rule = Joi.number().greater(5).less(10).allow(null); + Helper.validate(rule, [ + [0, false], + [11, false], + [5, false], + [10, false], + [8, true], + [5.01, true], + [9.99, true], + [null, true] + ], done); + }); + + it('should handle combination of greater, less, invalid, and allow', function (done) { + + var rule = Joi.number().greater(5).less(10).invalid(6).allow(-3); + Helper.validate(rule, [ + [0, false], + [11, false], + [5, false], + [10, false], + [6, false], + [8, true], + [5.01, true], + [9.99, true], + [-3, true], + [null, false] + ], done); + }); + }); + + it('should instantiate separate copies on invocation', function (done) { + + var result1 = Joi.number().min(5); + var result2 = Joi.number().max(5); + + expect(Object.keys(result1)).to.not.equal(Object.keys(result2)); + done(); + }); + + it('should show resulting object with #valueOf', function (done) { + + var result = Joi.number().min(5); + expect(result.valueOf()).to.exist(); + done(); + }); + + describe('error message', function () { + + it('should display correctly for int type', function (done) { + + var t = Joi.number().integer(); + Joi.compile(t).validate('1.1', function (err, value) { + + expect(err.message).to.contain('integer'); + done(); + }); + }); + }); + + describe('#min', function () { + + it('throws when limit is not a number', function (done) { + + expect(function () { + + Joi.number().min('a'); + }).to.throw('limit must be an integer'); + done(); + }); + + it('supports 64bit numbers', function (done) { + + var schema = Joi.number().min(1394035612500); + var input = 1394035612552 + + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.equal(input); + done(); + }); + }); + }); + + describe('#max', function () { + + it('throws when limit is not a number', function (done) { + + expect(function () { + + Joi.number().max('a'); + }).to.throw('limit must be an integer'); + done(); + }); + }); + + describe('#precision', function (done) { + + it('converts numbers', function (done) { + + var rule = Joi.number().precision(4); + Helper.validate(rule, [ + [1.5, true, null, 1.5], + [0.12345, true, null, 0.1235], + [123456, true, null, 123456], + [123456.123456, true, null, 123456.1235], + ["123456.123456", true, null, 123456.1235], + ["abc", false], + [NaN, false] + ], done); + }); + }); + + describe('#describe', function () { + + it('should describe a minimum of 0', function (done) { + + var schema = Joi.number().min(0); + expect(schema.describe()).to.deep.equal({ + "type": "number", + "invalids": [Infinity, -Infinity], + "rules": [ + { + "name": "min", + "arg": 0 + } + ] + }); + done(); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/test/object.js b/node_modules/hapi/node_modules/vision/node_modules/joi/test/object.js new file mode 100755 index 0000000..021401b --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/test/object.js @@ -0,0 +1,1058 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('object', function () { + + it('converts a json string to an object', function (done) { + + Joi.object().validate('{"hi":true}', function (err, value) { + + expect(err).to.not.exist(); + expect(value.hi).to.equal(true); + done(); + }); + }); + + it('errors on non-object string', function (done) { + + Joi.object().validate('a string', function (err, value) { + + expect(err).to.exist(); + expect(value).to.equal('a string'); + done(); + }); + }); + + it('validates an object', function (done) { + + var schema = Joi.object().required(); + Helper.validate(schema, [ + [{}, true], + [{ hi: true }, true], + ['', false] + ], done); + }); + + it('return object reference when no rules specified', function (done) { + + var schema = Joi.object({ + a: Joi.object() + }); + + var item = { x: 5 }; + schema.validate({ a: item }, function (err, value) { + + expect(value.a).to.equal(item); + done(); + }); + }); + + it('retains ignored values', function (done) { + + var schema = Joi.object(); + schema.validate({ a: 5 }, function (err, value) { + + expect(value.a).to.equal(5); + done(); + }); + }); + + it('retains skipped values', function (done) { + + var schema = Joi.object({ b: 5 }).unknown(true); + schema.validate({ b: '5', a: 5 }, function (err, value) { + + expect(value.a).to.equal(5); + expect(value.b).to.equal(5); + done(); + }); + }); + + it('allows any key when schema is undefined', function (done) { + + Joi.object().validate({ a: 4 }, function (err, value) { + + expect(err).to.not.exist(); + + Joi.object(undefined).validate({ a: 4 }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + }); + + it('allows any key when schema is null', function (done) { + + Joi.object(null).validate({ a: 4 }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('throws on invalid object schema', function (done) { + + expect(function () { + + Joi.object(4); + }).to.throw('Object schema must be a valid object'); + done(); + }); + + it('throws on joi object schema', function (done) { + + expect(function () { + + Joi.object(Joi.object()); + }).to.throw('Object schema cannot be a joi schema'); + done(); + }); + + it('skips conversion when value is undefined', function (done) { + + Joi.object({ a: Joi.object() }).validate(undefined, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.not.exist(); + done(); + }); + }); + + it('errors on array', function (done) { + + Joi.object().validate([1, 2, 3], function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('should prevent extra keys from existing by default', function (done) { + + var schema = Joi.object({ item: Joi.string().required() }).required(); + Helper.validate(schema, [ + [{ item: 'something' }, true], + [{ item: 'something', item2: 'something else' }, false], + ['', false] + ], done); + }); + + it('should validate count when min is set', function (done) { + + var schema = Joi.object().min(3); + Helper.validate(schema, [ + [{ item: 'something' }, false], + [{ item: 'something', item2: 'something else' }, false], + [{ item: 'something', item2: 'something else', item3: 'something something else' }, true], + ['', false] + ], done); + }); + + it('should validate count when max is set', function (done) { + + var schema = Joi.object().max(2); + Helper.validate(schema, [ + [{ item: 'something' }, true], + [{ item: 'something', item2: 'something else' }, true], + [{ item: 'something', item2: 'something else', item3: 'something something else' }, false], + ['', false] + ], done); + }); + + it('should validate count when min and max is set', function (done) { + + var schema = Joi.object().max(3).min(2); + Helper.validate(schema, [ + [{ item: 'something' }, false], + [{ item: 'something', item2: 'something else' }, true], + [{ item: 'something', item2: 'something else', item3: 'something something else' }, true], + [{ item: 'something', item2: 'something else', item3: 'something something else', item4: 'item4' }, false], + ['', false] + ], done); + }); + + it('should validate count when length is set', function (done) { + + var schema = Joi.object().length(2); + Helper.validate(schema, [ + [{ item: 'something' }, false], + [{ item: 'something', item2: 'something else' }, true], + [{ item: 'something', item2: 'something else', item3: 'something something else' }, false], + ['', false] + ], done); + }); + + it('should validate constructor when type is set', function (done) { + + var schema = Joi.object().type(RegExp); + Helper.validate(schema, [ + [{ item: 'something' }, false], + ['', false], + [new Date(), false], + [/abcd/, true], + [new RegExp(), true] + ], done); + }); + + it('should traverse an object and validate all properties in the top level', function (done) { + + var schema = Joi.object({ + num: Joi.number() + }); + + Helper.validate(schema, [ + [{ num: 1 }, true], + [{ num: [1, 2, 3] }, false] + ], done); + }); + + it('should traverse an object and child objects and validate all properties', function (done) { + + var schema = Joi.object({ + num: Joi.number(), + obj: Joi.object({ + item: Joi.string() + }) + }); + + Helper.validate(schema, [ + [{ num: 1 }, true], + [{ num: [1, 2, 3] }, false], + [{ num: 1, obj: { item: 'something' } }, true], + [{ num: 1, obj: { item: 123 } }, false] + ], done); + }); + + it('should traverse an object several levels', function (done) { + + var schema = Joi.object({ + obj: Joi.object({ + obj: Joi.object({ + obj: Joi.object({ + item: Joi.boolean() + }) + }) + }) + }); + + Helper.validate(schema, [ + [{ num: 1 }, false], + [{ obj: {} }, true], + [{ obj: { obj: {} } }, true], + [{ obj: { obj: { obj: {} } } }, true], + [{ obj: { obj: { obj: { item: true } } } }, true], + [{ obj: { obj: { obj: { item: 10 } } } }, false] + ], done); + }); + + it('should traverse an object several levels with required levels', function (done) { + + var schema = Joi.object({ + obj: Joi.object({ + obj: Joi.object({ + obj: Joi.object({ + item: Joi.boolean() + }) + }).required() + }) + }); + + Helper.validate(schema, [ + [null, false], + [undefined, true], + [{}, true], + [{ obj: {} }, false], + [{ obj: { obj: {} } }, true], + [{ obj: { obj: { obj: {} } } }, true], + [{ obj: { obj: { obj: { item: true } } } }, true], + [{ obj: { obj: { obj: { item: 10 } } } }, false] + ], done); + }); + + it('should traverse an object several levels with required levels (without Joi.obj())', function (done) { + + var schema = { + obj: { + obj: { + obj: { + item: Joi.boolean().required() + } + } + } + }; + + Helper.validate(schema, [ + [null, false], + [undefined, true], + [{}, true], + [{ obj: {} }, true], + [{ obj: { obj: {} } }, true], + [{ obj: { obj: { obj: {} } } }, false], + [{ obj: { obj: { obj: { item: true } } } }, true], + [{ obj: { obj: { obj: { item: 10 } } } }, false] + ], done); + }); + + it('errors on unknown keys when functions allows', function (done) { + + var schema = Joi.object({ a: Joi.number() }).options({ skipFunctions: true }); + var obj = { a: 5, b: 'value' }; + schema.validate(obj, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('validates both valid() and with()', function (done) { + + var schema = Joi.object({ + first: Joi.valid('value'), + second: Joi.any() + }).with('first', 'second'); + + Helper.validate(schema, [ + [{ first: 'value' }, false] + ], done); + }); + + describe('#keys', function () { + + it('allows any key', function (done) { + + var a = Joi.object({ a: 4 }); + var b = a.keys(); + a.validate({ b: 3 }, function (err, value) { + + expect(err).to.exist(); + b.validate({ b: 3 }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + }); + + it('forbids all keys', function (done) { + + var a = Joi.object(); + var b = a.keys({}); + a.validate({ b: 3 }, function (err, value) { + + expect(err).to.not.exist(); + b.validate({ b: 3 }, function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + }); + + it('adds to existing keys', function (done) { + + var a = Joi.object({ a: 1 }); + var b = a.keys({ b: 2 }); + a.validate({ a: 1, b: 2 }, function (err, value) { + + expect(err).to.exist(); + b.validate({ a: 1, b: 2 }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + }); + }); + + describe('#unknown', function () { + + it('allows local unknown without applying to children', function (done) { + + var schema = Joi.object({ + a: { + b: Joi.number() + } + }).unknown(); + + Helper.validate(schema, [ + [{ a: { b: 5 } }, true], + [{ a: { b: 'x' } }, false], + [{ a: { b: 5 }, c: 'ignore' }, true], + [{ a: { b: 5, c: 'ignore' } }, false] + ], done); + }); + + it('forbids local unknown without applying to children', function (done) { + + var schema = Joi.object({ + a: Joi.object({ + b: Joi.number() + }).unknown() + }).options({ allowUnknown: false }); + + Helper.validate(schema, [ + [{ a: { b: 5 } }, true], + [{ a: { b: 'x' } }, false], + [{ a: { b: 5 }, c: 'ignore' }, false], + [{ a: { b: 5, c: 'ignore' } }, true] + ], done); + }); + }); + + describe('#rename', function () { + + it('allows renaming multiple times with multiple enabled', function (done) { + + var schema = Joi.object({ + test: Joi.string() + }).rename('test1', 'test').rename('test2', 'test', { multiple: true }); + + Joi.compile(schema).validate({ test1: 'a', test2: 'b' }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('errors renaming multiple times with multiple disabled', function (done) { + + var schema = Joi.object({ + test: Joi.string() + }).rename('test1', 'test').rename('test2', 'test'); + + Joi.compile(schema).validate({ test1: 'a', test2: 'b' }, function (err, value) { + + expect(err.message).to.equal('value cannot rename child test2 because multiple renames are disabled and another key was already renamed to test'); + done(); + }); + }); + + it('errors multiple times when abortEarly is false', function (done) { + + Joi.object().rename('a', 'b').rename('c', 'b').rename('d', 'b').options({ abortEarly: false }).validate({ a: 1, c: 1, d: 1 }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('value cannot rename child c because multiple renames are disabled and another key was already renamed to b. value cannot rename child d because multiple renames are disabled and another key was already renamed to b'); + done(); + }); + }); + + it('aliases a key', function (done) { + + var schema = Joi.object({ + a: Joi.number(), + b: Joi.number() + }).rename('a', 'b', { alias: true }); + + var obj = { a: 10 }; + + Joi.compile(schema).validate(obj, function (err, value) { + + expect(err).to.not.exist(); + expect(value.a).to.equal(10); + expect(value.b).to.equal(10); + done(); + }); + }); + + it('with override disabled should not allow overwriting existing value', function (done) { + + var schema = Joi.object({ + test1: Joi.string() + }).rename('test', 'test1'); + + schema.validate({ test: 'b', test1: 'a' }, function (err, value) { + + expect(err.message).to.equal('value cannot rename child test because override is disabled and target test1 exists'); + done(); + }); + }); + + it('with override enabled should allow overwriting existing value', function (done) { + + var schema = Joi.object({ + test1: Joi.string() + }).rename('test', 'test1', { override: true }); + + schema.validate({ test: 'b', test1: 'a' }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('renames when data is nested in an array via includes', function (done) { + + var schema = { + arr: Joi.array().includes(Joi.object({ + one: Joi.string(), + two: Joi.string() + }).rename('uno', 'one').rename('dos', 'two')) + }; + + var data = { arr: [{ uno: '1', dos: '2' }] }; + Joi.object(schema).validate(data, function (err, value) { + + expect(err).to.not.exist(); + expect(value.arr[0].one).to.equal('1'); + expect(value.arr[0].two).to.equal('2'); + done(); + }); + }); + + it('applies rename and validation in the correct order regardless of key order', function (done) { + + var schema1 = Joi.object({ + a: Joi.number() + }).rename('b', 'a'); + + var input1 = { b: '5' }; + + schema1.validate(input1, function (err1, value1) { + + expect(err1).to.not.exist(); + expect(value1.b).to.not.exist(); + expect(value1.a).to.equal(5); + + var schema2 = Joi.object({ a: Joi.number(), b: Joi.any() }).rename('b', 'a'); + var input2 = { b: '5' }; + + schema2.validate(input2, function (err2, value2) { + + expect(err2).to.not.exist(); + expect(value2.b).to.not.exist(); + expect(value2.a).to.equal(5); + + done(); + }); + }); + }); + + it('sets the default value after key is renamed', function (done) { + + var schema = Joi.object({ + foo2: Joi.string().default('test') + }).rename('foo', 'foo2'); + + var input = {}; + + Joi.validate(input, schema, function (err, value) { + + expect(err).to.not.exist(); + expect(value.foo2).to.equal('test'); + + done(); + }); + }); + + it('should be able to rename keys that are empty strings', function (done) { + + var schema = Joi.object().rename('', 'notEmpty'); + var input = { + '': 'something' + }; + + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + expect(value['']).to.not.exist(); + expect(value.notEmpty).to.equal('something'); + done(); + }); + }); + + it('should not create new keys when they key in question does not exist', function (done) { + + var schema = Joi.object().rename('b', '_b'); + + var input = { + a: 'something' + }; + + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + expect(Object.keys(value)).to.include('a'); + expect(value.a).to.equal('something'); + done(); + }); + }); + }); + + describe('#describe', function () { + + it('return empty description when no schema defined', function (done) { + + var schema = Joi.object(); + var desc = schema.describe(); + expect(desc).to.deep.equal({ + type: 'object' + }); + done(); + }); + + it('respects the shallow parameter', function (done) { + + var schema = Joi.object({ + name: Joi.string(), + child: Joi.object({ + name: Joi.string() + }) + }); + + expect(Object.keys(schema.describe(true))).to.not.include('children'); + expect(Object.keys(schema.describe())).to.include('children'); + + done(); + }); + + it('describes patterns', function (done) { + + var schema = Joi.object({ + a: Joi.string() + }).pattern(/\w\d/i, Joi.boolean()); + + expect(schema.describe()).to.deep.equal({ + type: 'object', + children: { + a: { + type: 'string', + invalids: [''] + } + }, + patterns: [ + { + regex: '/\\w\\d/i', + rule: { + type: 'boolean' + } + } + ] + }); + + done(); + }); + }); + + describe('#length', function () { + + it('throws when length is not a number', function (done) { + + expect(function () { + + Joi.object().length('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + }); + + describe('#min', function () { + + it('throws when limit is not a number', function (done) { + + expect(function () { + + Joi.object().min('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + }); + + describe('#max', function () { + + it('throws when limit is not a number', function (done) { + + expect(function () { + + Joi.object().max('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + }); + + describe('#pattern', function () { + + it('validates unknown keys using a pattern', function (done) { + + var schema = Joi.object({ + a: Joi.number() + }).pattern(/\d+/, Joi.boolean()).pattern(/\w\w+/, 'x'); + + Joi.validate({ bb: 'y', 5: 'x' }, schema, { abortEarly: false }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('5 must be a boolean. bb must be one of x'); + + Helper.validate(schema, [ + [{ a: 5 }, true], + [{ a: 'x' }, false], + [{ b: 'x' }, false], + [{ bb: 'x' }, true], + [{ 5: 'x' }, false], + [{ 5: false }, true], + [{ 5: undefined }, true] + ], done) + }); + }); + + it('validates unknown keys using a pattern (nested)', function (done) { + + var schema = { + x: Joi.object({ + a: Joi.number() + }).pattern(/\d+/, Joi.boolean()).pattern(/\w\w+/, 'x') + }; + + Joi.validate({ x: { bb: 'y', 5: 'x' } }, schema, { abortEarly: false }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('5 must be a boolean. bb must be one of x'); + done(); + }); + }); + + it('errors when using a pattern on empty schema with unknown(false) and pattern mismatch', function (done) { + + var schema = Joi.object().pattern(/\d/, Joi.number()).unknown(false); + + Joi.validate({ a: 5 }, schema, { abortEarly: false }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('a is not allowed'); + done(); + }); + }); + + it('removes global flag from patterns', function (done) { + + var schema = Joi.object().pattern(/a/g, Joi.number()); + + Joi.validate({ a1: 5, a2: 6 }, schema, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + }); + + describe('#with', function () { + + it('should throw an error when a parameter is not a string', function (done) { + + try { + Joi.object().with({}); + var error = false; + } + catch (e) { + error = true; + } + expect(error).to.equal(true); + + try { + Joi.object().with(123); + error = false; + } + catch (e) { + error = true; + } + expect(error).to.equal(true); + done(); + }); + + it('should validate correctly when key is an empty string', function (done) { + + var schema = Joi.object().with('', 'b'); + Helper.validate(schema, [ + [{ c: 'hi', d: 'there' }, true], + ]); + done(); + }); + }); + + describe('#without', function () { + + it('should throw an error when a parameter is not a string', function (done) { + + try { + Joi.object().without({}); + var error = false; + } + catch (e) { + error = true; + } + expect(error).to.equal(true); + + try { + Joi.object().without(123); + error = false; + } + catch (e) { + error = true; + } + expect(error).to.equal(true); + + + done(); + }); + + it('should validate correctly when key is an empty string', function (done) { + + var schema = Joi.object().without('', 'b'); + Helper.validate(schema, [ + [{ a: 'hi', b: 'there' }, true] + ]); + done(); + }); + }); + + describe('#xor', function () { + + it('should throw an error when a parameter is not a string', function (done) { + + try { + Joi.object().xor({}); + var error = false; + } + catch (e) { + error = true; + } + expect(error).to.equal(true); + + try { + Joi.object().xor(123); + error = false; + } + catch (e) { + error = true; + } + expect(error).to.equal(true); + done(); + }); + }); + + describe('#or', function () { + + it('should throw an error when a parameter is not a string', function (done) { + + try { + Joi.object().or({}); + var error = false; + } + catch (e) { + error = true; + } + expect(error).to.equal(true); + + try { + Joi.object().or(123); + error = false; + } + catch (e) { + error = true; + } + expect(error).to.equal(true); + done(); + }); + + it('errors multiple levels deep', function (done) { + + Joi.object({ + a: { + b: Joi.object().or('x', 'y') + } + }).validate({ a: { b: { c: 1 } } }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('value must contain at least one of x, y'); + done(); + }); + }); + }); + + describe('#assert', function () { + + it('validates upwards reference', function (done) { + + var schema = Joi.object({ + a: { + b: Joi.string(), + c: Joi.number() + }, + d: { + e: Joi.any() + } + }).assert(Joi.ref('d/e', { separator: '/' }), Joi.ref('a.c'), 'equal to a.c'); + + schema.validate({ a: { b: 'x', c: 5 }, d: { e: 6 } }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('value validation failed because d.e failed to equal to a.c'); + + Helper.validate(schema, [ + [{ a: { b: 'x', c: 5 }, d: { e: 5 } }, true] + ], done); + }); + }); + + it('validates upwards reference with implicit context', function (done) { + + var schema = Joi.object({ + a: { + b: Joi.string(), + c: Joi.number() + }, + d: { + e: Joi.any() + } + }).assert('d.e', Joi.ref('a.c'), 'equal to a.c'); + + schema.validate({ a: { b: 'x', c: 5 }, d: { e: 6 } }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('value validation failed because d.e failed to equal to a.c'); + + Helper.validate(schema, [ + [{ a: { b: 'x', c: 5 }, d: { e: 5 } }, true] + ], done); + }); + }); + + it('throws when context is at root level', function (done) { + + expect(function () { + + var schema = Joi.object({ + a: { + b: Joi.string(), + c: Joi.number() + }, + d: { + e: Joi.any() + } + }).assert('a', Joi.ref('d.e'), 'equal to d.e'); + }).to.throw('Cannot use assertions for root level references - use direct key rules instead'); + done(); + }); + + it('allows root level context ref', function (done) { + + expect(function () { + + var schema = Joi.object({ + a: { + b: Joi.string(), + c: Joi.number() + }, + d: { + e: Joi.any() + } + }).assert('$a', Joi.ref('d.e'), 'equal to d.e'); + }).to.not.throw(); + done(); + }); + + it('provides a default message for failed assertions', function (done) { + + var schema = Joi.object({ + a: { + b: Joi.string(), + c: Joi.number() + }, + d: { + e: Joi.any() + } + }).assert('d.e', Joi.boolean()); + + schema.validate({ + d: { + e:[] + } + }, function (err) { + + expect(err).to.exist(); + expect(err.message).to.equal('value validation failed because d.e failed to pass the assertion test'); + done(); + }); + }); + }); + + describe('#type', function () { + + it('uses constructor name for default type name', function (done) { + + function Foo () {} + + var schema = Joi.object().type(Foo); + schema.validate({}, function (err) { + + expect(err).to.exist(); + expect(err.message).to.equal('value must be an instance of Foo'); + done(); + }); + }); + + it('uses custom type name if supplied', function (done) { + + var Foo = function () {}; + + var schema = Joi.object().type(Foo, 'Bar'); + schema.validate({}, function (err) { + + expect(err).to.exist(); + expect(err.message).to.equal('value must be an instance of Bar'); + done(); + }); + }); + + it('overrides constructor name with custom name', function (done) { + + function Foo () {} + + var schema = Joi.object().type(Foo, 'Bar'); + schema.validate({}, function (err) { + + expect(err).to.exist(); + expect(err.message).to.equal('value must be an instance of Bar'); + done(); + }); + }); + + it('throws when constructor is not a function', function (done) { + + expect(function () { + + var schema = Joi.object().type(''); + }).to.throw('type must be a constructor function'); + done(); + }); + + it('uses the constructor name in the schema description', function (done) { + + var description = Joi.object().type(RegExp).describe(); + + expect(description.rules).to.deep.include({ name: 'type', arg: 'RegExp' }); + done(); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/test/ref.js b/node_modules/hapi/node_modules/vision/node_modules/joi/test/ref.js new file mode 100755 index 0000000..3cc1ae8 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/test/ref.js @@ -0,0 +1,389 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('ref', function () { + + it('uses ref as a valid value', function (done) { + + var schema = Joi.object({ + a: Joi.ref('b'), + b: Joi.any() + }); + + schema.validate({ a: 5, b: 6 }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('a must be one of ref:b'); + + Helper.validate(schema, [ + [{ a: 5 }, false], + [{ b: 5 }, true], + [{ a: 5, b: 5 }, true], + [{ a: '5', b: '5' }, true] + ], done); + }); + }); + + it('uses ref as a valid value (empty key)', function (done) { + + var schema = Joi.object({ + a: Joi.ref(''), + '': Joi.any() + }); + + schema.validate({ a: 5, '': 6 }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('a must be one of ref:'); + + Helper.validate(schema, [ + [{ a: 5 }, false], + [{ '': 5 }, true], + [{ a: 5, '': 5 }, true], + [{ a: '5', '': '5' }, true] + ], done); + }); + }); + + it('uses ref with nested keys as a valid value', function (done) { + + var schema = Joi.object({ + a: Joi.ref('b.c'), + b: { + c: Joi.any() + } + }); + + schema.validate({ a: 5, b: { c: 6 } }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('a must be one of ref:b.c'); + + Helper.validate(schema, [ + [{ a: 5 }, false], + [{ b: { c: 5 } }, true], + [{ a: 5, b: 5 }, false], + [{ a: '5', b: { c: '5' } }, true] + ], done); + }); + }); + + it('uses ref with combined nested keys in sub child', function (done) { + + var ref = Joi.ref('b.c'); + expect(ref.root).to.equal('b'); + + var schema = Joi.object({ + a: ref, + b: { + c: Joi.any() + } + }); + + var input = { a: 5, b: { c: 5 } }; + schema.validate(input, function (err, value) { + + expect(err).to.not.exist(); + + var parent = Joi.object({ + e: schema + }); + + parent.validate({ e: input }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + }); + + it('uses ref reach options', function (done) { + + var ref = Joi.ref('b/c', { separator: '/' }); + expect(ref.root).to.equal('b'); + + var schema = Joi.object({ + a: ref, + b: { + c: Joi.any() + } + }); + + schema.validate({ a: 5, b: { c: 5 } }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('ignores the order in which keys are defined', function (done) { + + var ab = Joi.object({ + a: { + c: Joi.number() + }, + b: Joi.ref('a.c') + }); + + ab.validate({ a: { c: '5' }, b: 5 }, function (err, value) { + + expect(err).to.not.exist(); + + var ba = Joi.object({ + b: Joi.ref('a.c'), + a: { + c: Joi.number() + } + }); + + ba.validate({ a: { c: '5' }, b: 5 }, function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + }); + + it('uses ref as default value', function (done) { + + var schema = Joi.object({ + a: Joi.default(Joi.ref('b')), + b: Joi.any() + }); + + schema.validate({ b: 6 }, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal({ a: 6, b: 6 }); + done(); + }); + }); + + it('uses ref as default value regardless of order', function (done) { + + var ab = Joi.object({ + a: Joi.default(Joi.ref('b')), + b: Joi.number() + }); + + ab.validate({ b: '6' }, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal({ a: 6, b: 6 }); + + var ba = Joi.object({ + b: Joi.number(), + a: Joi.default(Joi.ref('b')) + }); + + ba.validate({ b: '6' }, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal({ a: 6, b: 6 }); + done(); + }); + }); + }); + + it('ignores the order in which keys are defined with alternatives', function (done) { + + var a = { c: Joi.number() }; + var b = [Joi.ref('a.c'), Joi.ref('c')]; + var c = Joi.number(); + + Helper.validate({ a: a, b: b, c: c }, [ + [{ a: {} }, true], + [{ a: { c: '5' }, b: 5 }, true], + [{ a: { c: '5' }, b: 6, c: '6' }, true], + [{ a: { c: '5' }, b: 7, c: '6' }, false] + ]); + + Helper.validate({ b: b, a: a, c: c }, [ + [{ a: {} }, true], + [{ a: { c: '5' }, b: 5 }, true], + [{ a: { c: '5' }, b: 6, c: '6' }, true], + [{ a: { c: '5' }, b: 7, c: '6' }, false] + ]); + + Helper.validate({ b: b, c: c, a: a }, [ + [{ a: {} }, true], + [{ a: { c: '5' }, b: 5 }, true], + [{ a: { c: '5' }, b: 6, c: '6' }, true], + [{ a: { c: '5' }, b: 7, c: '6' }, false] + ]); + + Helper.validate({ a: a, c: c, b: b }, [ + [{ a: {} }, true], + [{ a: { c: '5' }, b: 5 }, true], + [{ a: { c: '5' }, b: 6, c: '6' }, true], + [{ a: { c: '5' }, b: 7, c: '6' }, false] + ]); + + Helper.validate({ c: c, a: a, b: b }, [ + [{ a: {} }, true], + [{ a: { c: '5' }, b: 5 }, true], + [{ a: { c: '5' }, b: 6, c: '6' }, true], + [{ a: { c: '5' }, b: 7, c: '6' }, false] + ]); + + Helper.validate({ c: c, b: b, a: a }, [ + [{ a: {} }, true], + [{ a: { c: '5' }, b: 5 }, true], + [{ a: { c: '5' }, b: 6, c: '6' }, true], + [{ a: { c: '5' }, b: 7, c: '6' }, false] + ], done); + }); + + it('uses context as default value', function (done) { + + var schema = Joi.object({ + a: Joi.default(Joi.ref('$x')), + b: Joi.any() + }); + + Joi.validate({ b: 6 }, schema, { context: { x: 22 } }, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal({ a: 22, b: 6 }); + done(); + }); + }); + + it('uses context as default value with custom prefix', function (done) { + + var schema = Joi.object({ + a: Joi.default(Joi.ref('%x', { contextPrefix: '%' })), + b: Joi.any() + }); + + Joi.validate({ b: 6 }, schema, { context: { x: 22 } }, function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.deep.equal({ a: 22, b: 6 }); + done(); + }); + }); + + it('uses context as a valid value', function (done) { + + var schema = Joi.object({ + a: Joi.ref('$x'), + b: Joi.any() + }); + + Joi.validate({ a: 5, b: 6 }, schema, { context: { x: 22 } }, function (err, value) { + + expect(err).to.exist(); + expect(err.message).to.equal('a must be one of context:x'); + + Helper.validateOptions(schema, [ + [{ a: 5 }, false], + [{ a: 22 }, true], + [{ b: 5 }, true], + [{ a: 22, b: 5 }, true], + [{ a: '22', b: '5' }, false] + ], { context: { x: 22 } }, done); + }); + }); + + it('uses context in when condition', function (done) { + + var schema = { + a: Joi.boolean().when('$x', { is: Joi.exist(), otherwise: Joi.forbidden() }) + }; + + Helper.validate(schema, [ + [{}, true], + [{ a: 'x' }, false], + [{ a: true }, false], + [{}, true, { context: {} }], + [{ a: 'x' }, false, { context: {} }], + [{ a: true }, false, { context: {} }], + [{}, true, { context: { x: 1 } }], + [{ a: 'x' }, false, { context: { x: 1 } }], + [{ a: true }, true, { context: { x: 1 } }] + ], done); + }); + + it('uses nested context in when condition', function (done) { + + var schema = { + a: Joi.boolean().when('$x.y', { is: Joi.exist(), otherwise: Joi.forbidden() }) + }; + + Helper.validate(schema, [ + [{}, true], + [{ a: 'x' }, false], + [{ a: true }, false], + [{}, true, { context: {} }], + [{ a: 'x' }, false, { context: {} }], + [{ a: true }, false, { context: {} }], + [{}, true, { context: { x: 1 } }], + [{ a: 'x' }, false, { context: { x: 1 } }], + [{ a: true }, false, { context: { x: 1 } }], + [{}, true, { context: { x: {} } }], + [{ a: 'x' }, false, { context: { x: {} } }], + [{ a: true }, false, { context: { x: {} } }], + [{}, true, { context: { x: { y: 1 } } }], + [{ a: 'x' }, false, { context: { x: { y: 1 } } }], + [{ a: true }, true, { context: { x: { y: 1 } } }] + ], done); + }); + + it('describes schema with ref', function (done) { + + var desc = Joi.compile(Joi.ref('a.b')).describe(); + expect(Joi.isRef(desc.valids[0])).to.be.true(); + done(); + }); + + describe('#create', function () { + + it('throws when key is missing', function (done) { + + expect(function () { + + Joi.ref(5); + }).to.throw('Invalid reference key: 5'); + done(); + }); + + it('finds root with default separator', function (done) { + + expect(Joi.ref('a.b.c').root).to.equal('a'); + done(); + }); + + it('finds root with default separator and options', function (done) { + + expect(Joi.ref('a.b.c', {}).root).to.equal('a'); + done(); + }); + + it('finds root with custom separator', function (done) { + + expect(Joi.ref('a+b+c', { separator: '+' }).root).to.equal('a'); + done(); + }); + }); +}); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/test/string.js b/node_modules/hapi/node_modules/vision/node_modules/joi/test/string.js new file mode 100755 index 0000000..c9c61c0 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/node_modules/joi/test/string.js @@ -0,0 +1,1797 @@ +// Load modules + +var Lab = require('lab'); +var Code = require('code'); +var Joi = require('../lib'); +var Helper = require('./helper'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var before = lab.before; +var after = lab.after; +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('string', function () { + + it('fails on boolean', function (done) { + + var schema = Joi.string(); + Helper.validate(schema, [ + [true, false], + [false, false] + ], done); + }); + + describe('#valid', function () { + + it('should throw error on input not matching type', function (done) { + + expect(function () { + + Joi.string().valid({}); + }).to.throw(); + done(); + }); + + it('should not throw on input matching type', function (done) { + + expect(function () { + + Joi.string().valid('joi'); + }).to.not.throw(); + done(); + }); + + it('validates case sensitive values', function (done) { + + Helper.validate(Joi.string().valid('a', 'b'), [ + ['a', true], + ['b', true], + ['A', false], + ['B', false] + ], done); + }); + + it('validates case insensitive values', function (done) { + + Helper.validate(Joi.string().valid('a', 'b').insensitive(), [ + ['a', true], + ['b', true], + ['A', true], + ['B', true], + [4, false] + ], done); + }); + + it('validates case insensitive values with non-strings', function (done) { + + Helper.validate(Joi.string().valid('a', 'b', 5).insensitive(), [ + ['a', true], + ['b', true], + ['A', true], + ['B', true], + [4, false], + [5, true] + ], done); + }); + }); + + describe('#invalid', function () { + + it('should throw error on input not matching type', function (done) { + + expect(function () { + + Joi.string().invalid({}); + }).to.throw(); + done(); + }); + + it('should not throw on input matching type', function (done) { + + expect(function () { + + Joi.string().invalid('joi'); + }).to.not.throw(); + done(); + }); + + it('invalidates case sensitive values', function (done) { + + Helper.validate(Joi.string().invalid('a', 'b'), [ + ['a', false], + ['b', false], + ['A', true], + ['B', true] + ], done); + }); + + it('invalidates case insensitive values', function (done) { + + Helper.validate(Joi.string().invalid('a', 'b').insensitive(), [ + ['a', false], + ['b', false], + ['A', false], + ['B', false] + ], done); + }); + }); + + describe('#min', function () { + + it('throws when limit is not a number', function (done) { + + expect(function () { + + Joi.string().min('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('throws when limit is not an integer', function (done) { + + expect(function () { + + Joi.string().min(1.2); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('enforces a limit using byte count', function (done) { + + var schema = Joi.string().min(2, 'utf8'); + Helper.validate(schema, [ + ['\u00bd', true], + ['a', false] + ], done); + }); + }); + + describe('#max', function () { + + it('throws when limit is not a number', function (done) { + + expect(function () { + + Joi.string().max('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('throws when limit is not an integer', function (done) { + + expect(function () { + + Joi.string().max(1.2); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('enforces a limit using byte count', function (done) { + + var schema = Joi.string().max(1, 'utf8'); + Helper.validate(schema, [ + ['\u00bd', false], + ['a', true] + ], done); + }); + }); + + describe('#creditCard', function () { + + it('should validate credit card', function (done) { + + var t = Joi.string().creditCard(); + t.validate('4111111111111112', function (err, value) { + + expect(err.message).to.equal('value must be a credit card'); + + Helper.validate(t, [ + ['378734493671000', true], // american express + ['371449635398431', true], // american express + ['378282246310005', true], // american express + ['341111111111111', true], // american express + ['5610591081018250', true], // australian bank + ['5019717010103742', true], // dankort pbs + ['38520000023237', true], // diners club + ['30569309025904', true], // diners club + ['6011000990139424', true], // discover + ['6011111111111117', true], // discover + ['6011601160116611', true], // discover + ['3566002020360505', true], // jbc + ['3530111333300000', true], // jbc + ['5105105105105100', true], // mastercard + ['5555555555554444', true], // mastercard + ['5431111111111111', true], // mastercard + ['6331101999990016', true], // switch/solo paymentech + ['4222222222222', true], // visa + ['4012888888881881', true], // visa + ['4111111111111111', true], // visa + ['4111111111111112', false], + [null, false], + ], done); + }); + }); + }); + + describe('#length', function () { + + it('throws when limit is not a number', function (done) { + + expect(function () { + + Joi.string().length('a'); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('throws when limit is not an integer', function (done) { + + expect(function () { + + Joi.string().length(1.2); + }).to.throw('limit must be a positive integer'); + done(); + }); + + it('enforces a limit using byte count', function (done) { + + var schema = Joi.string().length(2, 'utf8'); + Helper.validate(schema, [ + ['\u00bd', true], + ['a', false] + ], done); + }); + }); + + describe('#hostname', function () { + + it('validates hostnames', function (done) { + + var schema = Joi.string().hostname(); + Helper.validate(schema, [ + ['www.example.com', true], + ['domain.local', true], + ['3domain.local', true], + ['hostname', true], + ['host:name', false], + ['-', false], + ['2387628', true], + ['01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789', false], + ['::1', true], + ['0:0:0:0:0:0:0:1', true], + ['0:?:0:0:0:0:0:1', false] + ], done); + }); + }); + + describe('#lowercase', function () { + + it('only allows strings that are entirely lowercase', function (done) { + + var schema = Joi.string().lowercase(); + Helper.validateOptions(schema, [ + ['this is all lowercase', true], + ['5', true], + ['lower\tcase', true], + ['Uppercase', false], + ['MixEd cAsE', false], + [1, false] + ], { convert: false }, done); + }); + + it('coerce string to lowercase before validation', function (done) { + + var schema = Joi.string().lowercase(); + schema.validate('UPPER TO LOWER', function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.equal('upper to lower'); + done(); + }); + }); + + it('should work in combination with a trim', function (done) { + + var schema = Joi.string().lowercase().trim(); + Helper.validate(schema, [ + [' abc', true], + [' ABC', true], + ['ABC', true], + [1, false] + ], done); + }); + }); + + describe('#uppercase', function () { + + it('only allow strings that are entirely uppercase', function (done) { + + var schema = Joi.string().uppercase(); + Helper.validateOptions(schema, [ + ['THIS IS ALL UPPERCASE', true], + ['5', true], + ['UPPER\nCASE', true], + ['lOWERCASE', false], + ['MixEd cAsE', false], + [1, false] + ], { convert: false }, done); + }); + + it('coerce string to uppercase before validation', function (done) { + + var schema = Joi.string().uppercase(); + schema.validate('lower to upper', function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.equal('LOWER TO UPPER'); + done(); + }); + }); + + it('works in combination with a forced trim', function (done) { + + var schema = Joi.string().uppercase().trim(); + Helper.validate(schema, [ + [' abc', true], + [' ABC', true], + ['ABC', true], + [1, false] + ], done); + }); + }); + + describe('#trim', function () { + + it('only allow strings that have no leading or trailing whitespace', function (done) { + + var schema = Joi.string().trim(); + Helper.validateOptions(schema, [ + [' something', false], + ['something ', false], + ['something\n', false], + ['some thing', true], + ['something', true] + ], { convert: false }, done); + }); + + it('removes leading and trailing whitespace before validation', function (done) { + + var schema = Joi.string().trim(); + schema.validate(' trim this ', function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.equal('trim this'); + done(); + }); + }); + + it('removes leading and trailing whitespace before validation', function (done) { + + var schema = Joi.string().trim().allow(''); + schema.validate(' ', function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.equal(''); + done(); + }); + }); + + it('should work in combination with min', function (done) { + + var schema = Joi.string().min(4).trim(); + Helper.validate(schema, [ + [' a ', false], + ['abc ', false], + ['abcd ', true] + ], done); + }); + + it('should work in combination with max', function (done) { + + var schema = Joi.string().max(4).trim(); + Helper.validate(schema, [ + [' abcde ', false], + ['abc ', true], + ['abcd ', true] + ], done); + }); + + it('should work in combination with length', function (done) { + + var schema = Joi.string().length(4).trim(); + Helper.validate(schema, [ + [' ab ', false], + ['abc ', false], + ['abcd ', true] + ], done); + }); + + it('should work in combination with a case change', function (done) { + + var schema = Joi.string().trim().lowercase(); + Helper.validate(schema, [ + [' abc', true], + [' ABC', true], + ['ABC', true] + ], done); + }); + }); + + describe('#regex', function () { + + it('should not include a pattern name by default', function (done) { + + var schema = Joi.string().regex(/[a-z]+/).regex(/[0-9]+/); + schema.validate('abcd', function (err, value) { + + expect(err.message).to.contain('required pattern'); + done(); + }); + }); + + it('should include a pattern name if specified', function (done) { + + var schema = Joi.string().regex(/[a-z]+/, 'letters').regex(/[0-9]+/, 'numbers'); + schema.validate('abcd', function (err, value) { + + expect(err.message).to.contain('numbers pattern'); + done(); + }); + }); + }); + + describe('#validate', function () { + + it('should, by default, allow undefined, deny empty string', function (done) { + + Helper.validate(Joi.string(), [ + [undefined, true], + ['', false] + ], done); + }); + + it('should, when .required(), deny undefined, deny empty string', function (done) { + + Helper.validate(Joi.string().required(), [ + [undefined, false], + ['', false] + ], done); + }); + + it('should, when .required(), print a friend error message for an empty string', function (done) { + + var schema = Joi.string().required(); + Joi.compile(schema).validate('', function (err, value) { + + expect(err.message).to.contain('be empty'); + done(); + }); + }); + + it('should, when .required(), validate non-empty strings', function (done) { + + var schema = Joi.string().required(); + Helper.validate(schema, [ + ['test', true], + ['0', true], + [null, false] + ], done); + }); + + it('validates invalid values', function (done) { + + var schema = Joi.string().invalid('a', 'b', 'c'); + Helper.validate(schema, [ + ['x', true], + ['a', false], + ['c', false] + ], done); + }); + + it('should invalidate invalid values', function (done) { + + var schema = Joi.string().valid('a', 'b', 'c'); + Helper.validate(schema, [ + ['x', false], + ['a', true], + ['c', true] + ], done); + }); + + it('validates array arguments correctly', function (done) { + + var schema = Joi.string().valid(['a', 'b', 'c']); + Helper.validate(schema, [ + ['x', false], + ['a', true], + ['c', true] + ], done); + }); + + it('validates minimum length when min is used', function (done) { + + var schema = Joi.string().min(3); + Helper.validate(schema, [ + ['test', true], + ['0', false], + [null, false] + ], done); + }); + + it('validates minimum length when min is 0', function (done) { + + var schema = Joi.string().min(0).required(); + Helper.validate(schema, [ + ['0', true], + [null, false], + [undefined, false] + ], done); + }); + + it('should return false with minimum length and a null value passed in', function (done) { + + var schema = Joi.string().min(3); + Helper.validate(schema, [ + [null, false] + ], done); + }); + + it('null allowed overrides min length requirement', function (done) { + + var schema = Joi.string().min(3).allow(null); + Helper.validate(schema, [ + [null, true] + ], done); + }); + + it('validates maximum length when max is used', function (done) { + + var schema = Joi.string().max(3); + Helper.validate(schema, [ + ['test', false], + ['0', true], + [null, false] + ], done); + }); + + it('should return true with max and not required when value is undefined', function (done) { + + var schema = Joi.string().max(3); + Helper.validate(schema, [ + [undefined, true] + ], done); + }); + + it('validates length requirements', function (done) { + + var schema = Joi.string().length(3); + Helper.validate(schema, [ + ['test', false], + ['0', false], + [null, false], + ['abc', true] + ], done); + }); + + it('validates regex', function (done) { + + var schema = Joi.string().regex(/^[0-9][-][a-z]+$/); + Helper.validate(schema, [ + ['van', false], + ['0-www', true] + ], done); + }); + + it('validates regex (ignoring global flag)', function (done) { + + var schema = Joi.string().regex(/a/g); + Helper.validate(schema, [ + ['ab', true], + ['ac', true] + ], done); + }); + + it('validates token', function (done) { + + var schema = Joi.string().token(); + Helper.validate(schema, [ + ['w0rld_of_w4lm4rtl4bs', true], + ['w0rld of_w4lm4rtl4bs', false], + ['abcd#f?h1j orly?', false] + ], done); + }); + + it('validates alphanum', function (done) { + + var schema = Joi.string().alphanum(); + Helper.validate(schema, [ + ['w0rld of w4lm4rtl4bs', false], + ['w0rldofw4lm4rtl4bs', true], + ['abcd#f?h1j orly?', false] + ], done); + }); + + it('validates email', function (done) { + + var schema = Joi.string().email(); + Helper.validate(schema, [ + ['joe@example.com', true], + ['"joe"@example.com', true], + ['@iaminvalid.com', false], + ['joe@[IPv6:2a00:1450:4001:c02::1b]', true], + ['12345678901234567890123456789012345678901234567890123456789012345@walmartlabs.com', false], + ['123456789012345678901234567890123456789012345678901234567890@12345678901234567890123456789012345678901234567890123456789.12345678901234567890123456789012345678901234567890123456789.12345678901234567890123456789012345678901234567890123456789.12345.toolong.com', false] + ], done); + }); + + it('validates email with a friendly error message', function (done) { + + var schema = { item: Joi.string().email() }; + Joi.compile(schema).validate({ item: 'something' }, function (err, value) { + + expect(err.message).to.contain('must be a valid email'); + done(); + }); + }); + + it('should return false for denied value', function (done) { + + var text = Joi.string().invalid('joi'); + text.validate('joi', function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + + it('should return true for allowed value', function (done) { + + var text = Joi.string().allow('hapi'); + text.validate('result', function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('validates with one validator (min)', function (done) { + + var text = Joi.string().min(3); + text.validate('joi', function (err, value) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('validates with two validators (min, required)', function (done) { + + var text = Joi.string().min(3).required(); + text.validate('joi', function (err, value) { + + expect(err).to.not.exist(); + + text.validate('', function (err, value) { + + expect(err).to.exist(); + done(); + }); + }); + }); + + it('validates null with allow(null)', function (done) { + + Helper.validate(Joi.string().allow(null), [ + [null, true] + ], done); + }); + + it('validates "" (empty string) with allow(\'\')', function (done) { + + Helper.validate(Joi.string().allow(''), [ + ['', true], + ['', true] + ], done); + }); + + it('validates combination of required and min', function (done) { + + var rule = Joi.string().required().min(3); + Helper.validate(rule, [ + ['x', false], + ['123', true], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of required and max', function (done) { + + var rule = Joi.string().required().max(3); + Helper.validate(rule, [ + ['x', true], + ['123', true], + ['1234', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of allow(\'\') and min', function (done) { + + var rule = Joi.string().allow('').min(3); + Helper.validate(rule, [ + ['x', false], + ['123', true], + ['1234', true], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of allow(\'\') and max', function (done) { + + var rule = Joi.string().allow('').max(3); + Helper.validate(rule, [ + ['x', true], + ['123', true], + ['1234', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of null allowed and max', function (done) { + var rule = Joi.string().allow(null).max(3); + Helper.validate(rule, [ + ['x', true], + ['123', true], + ['1234', false], + ['', false], + [null, true] + ], done); + }); + + it('validates combination of min and max', function (done) { + + var rule = Joi.string().min(2).max(3); + Helper.validate(rule, [ + ['x', false], + ['123', true], + ['1234', false], + ['12', true], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of min, max, and allow(\'\')', function (done) { + + var rule = Joi.string().min(2).max(3).allow(''); + Helper.validate(rule, [ + ['x', false], + ['123', true], + ['1234', false], + ['12', true], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of min, max, and required', function (done) { + + var rule = Joi.string().min(2).max(3).required(); + Helper.validate(rule, [ + ['x', false], + ['123', true], + ['1234', false], + ['12', true], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of min, max, and regex', function (done) { + + var rule = Joi.string().min(2).max(3).regex(/^a/); + Helper.validate(rule, [ + ['x', false], + ['123', false], + ['1234', false], + ['12', false], + ['ab', true], + ['abc', true], + ['abcd', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of min, max, regex, and allow(\'\')', function (done) { + + var rule = Joi.string().min(2).max(3).regex(/^a/).allow(''); + Helper.validate(rule, [ + ['x', false], + ['123', false], + ['1234', false], + ['12', false], + ['ab', true], + ['abc', true], + ['abcd', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of min, max, regex, and required', function (done) { + + var rule = Joi.string().min(2).max(3).regex(/^a/).required(); + Helper.validate(rule, [ + ['x', false], + ['123', false], + ['1234', false], + ['12', false], + ['ab', true], + ['abc', true], + ['abcd', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of min, max, and alphanum', function (done) { + + var rule = Joi.string().min(2).max(3).alphanum(); + Helper.validate(rule, [ + ['x', false], + ['123', true], + ['1234', false], + ['12', true], + ['ab', true], + ['abc', true], + ['abcd', false], + ['*ab', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of min, max, alphanum, and allow(\'\')', function (done) { + + var rule = Joi.string().min(2).max(3).alphanum().allow(''); + Helper.validate(rule, [ + ['x', false], + ['123', true], + ['1234', false], + ['12', true], + ['ab', true], + ['abc', true], + ['abcd', false], + ['*ab', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of min, max, alphanum, and required', function (done) { + + var rule = Joi.string().min(2).max(3).alphanum().required(); + Helper.validate(rule, [ + ['x', false], + ['123', true], + ['1234', false], + ['12', true], + ['ab', true], + ['abc', true], + ['abcd', false], + ['*ab', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of min, max, alphanum, and regex', function (done) { + + var rule = Joi.string().min(2).max(3).alphanum().regex(/^a/); + Helper.validate(rule, [ + ['x', false], + ['123', false], + ['1234', false], + ['12', false], + ['ab', true], + ['abc', true], + ['a2c', true], + ['abcd', false], + ['*ab', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of min, max, alphanum, required, and regex', function (done) { + + var rule = Joi.string().min(2).max(3).alphanum().required().regex(/^a/); + Helper.validate(rule, [ + ['x', false], + ['123', false], + ['1234', false], + ['12', false], + ['ab', true], + ['abc', true], + ['a2c', true], + ['abcd', false], + ['*ab', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of min, max, alphanum, allow(\'\'), and regex', function (done) { + + var rule = Joi.string().min(2).max(3).alphanum().allow('').regex(/^a/); + Helper.validate(rule, [ + ['x', false], + ['123', false], + ['1234', false], + ['12', false], + ['ab', true], + ['abc', true], + ['a2c', true], + ['abcd', false], + ['*ab', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of email and min', function (done) { + + var rule = Joi.string().email().min(8); + Helper.validate(rule, [ + ['x@x.com', false], + ['123@x.com', true], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of email, min, and max', function (done) { + + var rule = Joi.string().email().min(8).max(10); + Helper.validate(rule, [ + ['x@x.com', false], + ['123@x.com', true], + ['1234@x.com', true], + ['12345@x.com', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, and invalid', function (done) { + + var rule = Joi.string().email().min(8).max(10).invalid('123@x.com'); + Helper.validate(rule, [ + ['x@x.com', false], + ['123@x.com', false], + ['1234@x.com', true], + ['12345@x.com', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, and allow', function (done) { + + var rule = Joi.string().email().min(8).max(10).allow('x@x.com'); + Helper.validate(rule, [ + ['x@x.com', true], + ['123@x.com', true], + ['1234@x.com', true], + ['12345@x.com', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, allow, and invalid', function (done) { + + var rule = Joi.string().email().min(8).max(10).allow('x@x.com').invalid('123@x.com'); + Helper.validate(rule, [ + ['x@x.com', true], + ['123@x.com', false], + ['1234@x.com', true], + ['12345@x.com', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, allow, invalid, and allow(\'\')', function (done) { + + var rule = Joi.string().email().min(8).max(10).allow('x@x.com').invalid('123@x.com').allow(''); + Helper.validate(rule, [ + ['x@x.com', true], + ['123@x.com', false], + ['1234@x.com', true], + ['12345@x.com', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, allow, and allow(\'\')', function (done) { + + var rule = Joi.string().email().min(8).max(10).allow('x@x.com').allow(''); + Helper.validate(rule, [ + ['x@x.com', true], + ['123@x.com', true], + ['1234@x.com', true], + ['12345@x.com', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, allow, invalid, and regex', function (done) { + + var rule = Joi.string().email().min(8).max(10).allow('x@x.com').invalid('123@x.com').regex(/^1/); + Helper.validate(rule, [ + ['x@x.com', true], + ['123@x.com', false], + ['1234@x.com', true], + ['12345@x.com', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, allow, invalid, regex, and allow(\'\')', function (done) { + + var rule = Joi.string().email().min(8).max(10).allow('x@x.com').invalid('123@x.com').regex(/^1/).allow(''); + Helper.validate(rule, [ + ['x@x.com', true], + ['123@x.com', false], + ['1234@x.com', true], + ['12345@x.com', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, and allow(\'\')', function (done) { + + var rule = Joi.string().email().min(8).max(10).allow(''); + Helper.validate(rule, [ + ['x@x.com', false], + ['123@x.com', true], + ['1234@x.com', true], + ['12345@x.com', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, and regex', function (done) { + + var rule = Joi.string().email().min(8).max(10).regex(/^1234/); + Helper.validate(rule, [ + ['x@x.com', false], + ['123@x.com', false], + ['1234@x.com', true], + ['12345@x.com', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, regex, and allow(\'\')', function (done) { + + var rule = Joi.string().email().min(8).max(10).regex(/^1234/).allow(''); + Helper.validate(rule, [ + ['x@x.com', false], + ['123@x.com', false], + ['1234@x.com', true], + ['12345@x.com', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of email, min, max, regex, and required', function (done) { + + var rule = Joi.string().email().min(8).max(10).regex(/^1234/).required(); + Helper.validate(rule, [ + ['x@x.com', false], + ['123@x.com', false], + ['1234@x.com', true], + ['12345@x.com', false], + ['', false], + [null, false] + ], done); + }); + + it('validates isoDate', function (done) { + + Helper.validate(Joi.string().isoDate(), [ + ['2013-06-07T14:21:46.295Z', true], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', true], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', true], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', true], + ['2013-06-07T14:21:46-07:00', true], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', true], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', true], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', true], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false] + ], done); + }); + + it('validates isoDate with a friendly error message', function (done) { + + var schema = { item: Joi.string().isoDate() }; + Joi.compile(schema).validate({ item: 'something' }, function (err, value) { + + expect(err.message).to.contain('must be a valid ISO 8601 date'); + done(); + }); + }); + + it('validates combination of isoDate and min', function (done) { + + var rule = Joi.string().isoDate().min(23); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', true], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', true], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', true], + ['2013-06-07T14:21:46Z', false], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', true], + ['2013-06-07T14:21:46-07:00', true], + ['2013-06-07T14:21Z', false], + ['2013-06-07T14:21+07:00', false], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', false], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min and max', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', false], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', true], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', true], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max and invalid', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).invalid('2013-06-07T14:21+07:00'); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', false], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', false], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', true], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max and allow', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).allow('2013-06-07T14:21:46.295+07:00'); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', true], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', true], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', true], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max, allow and invalid', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).allow('2013-06-07T14:21:46.295+07:00').invalid('2013-06-07T14:21+07:00'); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', true], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', false], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', true], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max, allow, invalid and allow(\'\')', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).allow('2013-06-07T14:21:46.295+07:00').invalid('2013-06-07T14:21+07:00').allow(''); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', true], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', false], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', true], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max, allow, invalid and allow(\'\')', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).allow('2013-06-07T14:21:46.295+07:00').allow(''); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', true], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', true], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', true], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max, allow, invalid and regex', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).allow('2013-06-07T14:21:46.295+07:00').invalid('2013-06-07T14:21Z').regex(/Z$/); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', true], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', false], + ['2013-06-07T14:21+07:00', false], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', false], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max, allow, invalid, regex and allow(\'\')', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).allow('2013-06-07T14:21:46.295+07:00').invalid('2013-06-07T14:21Z').regex(/Z$/).allow(''); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', true], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', false], + ['2013-06-07T14:21+07:00', false], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', false], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max and allow(\'\')', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).allow(''); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', false], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', true], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', true], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max and regex', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).regex(/Z$/); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', false], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', false], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', false], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max, regex and allow(\'\')', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).regex(/Z$/).allow(''); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', false], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', false], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', false], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of isoDate, min, max, regex and required', function (done) { + + var rule = Joi.string().isoDate().min(17).max(23).regex(/Z$/).required(); + Helper.validate(rule, [ + ['2013-06-07T14:21:46.295Z', false], + ['2013-06-07T14:21:46.295Z0', false], + ['2013-06-07T14:21:46.295+07:00', false], + ['2013-06-07T14:21:46.295+07:000', false], + ['2013-06-07T14:21:46.295-07:00', false], + ['2013-06-07T14:21:46Z', true], + ['2013-06-07T14:21:46Z0', false], + ['2013-06-07T14:21:46+07:00', false], + ['2013-06-07T14:21:46-07:00', false], + ['2013-06-07T14:21Z', true], + ['2013-06-07T14:21+07:00', false], + ['2013-06-07T14:21+07:000', false], + ['2013-06-07T14:21-07:00', false], + ['2013-06-07T14:21Z+7:00', false], + ['2013-06-07', false], + ['2013-06-07T', false], + ['2013-06-07T14:21', false], + ['1-1-2013', false], + ['', false], + [null, false] + ], done); + }); + + it('validates guid', function (done) { + + Helper.validate(Joi.string().guid(), [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', true], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], + ['69593D62-71EA-4548-85E4-04FC71357423', true], + ['677E2553DD4D43B09DA77414DB1EB8EA', true], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', true], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', true], + ['b4b2fb69c6244e5eb0698e0c6ec66618', true], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false] + ], done); + }); + + it('validates guid with a friendly error message', function (done) { + + var schema = { item: Joi.string().guid() }; + Joi.compile(schema).validate({ item: 'something' }, function (err, value) { + + expect(err.message).to.contain('must be a valid GUID'); + done(); + }); + }); + + it('validates combination of guid and min', function (done) { + + var rule = Joi.string().guid().min(36); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', true], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', false], + ['69593D62-71EA-4548-85E4-04FC71357423', true], + ['677E2553DD4D43B09DA77414DB1EB8EA', false], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', true], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', false], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', true], + ['b4b2fb69c6244e5eb0698e0c6ec66618', false], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of guid, min and max', function (done) { + + var rule = Joi.string().guid().min(32).max(34); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', true], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', true], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max and invalid', function (done) { + + var rule = Joi.string().guid().min(32).max(34).invalid('b4b2fb69c6244e5eb0698e0c6ec66618'); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', true], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', false], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max and allow', function (done) { + + var rule = Joi.string().guid().min(32).max(34).allow('{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D'); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', true], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', true], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', true], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max, allow and invalid', function (done) { + + var rule = Joi.string().guid().min(32).max(34).allow('{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D').invalid('b4b2fb69c6244e5eb0698e0c6ec66618'); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', true], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', false], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', true], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max, allow, invalid and allow(\'\')', function (done) { + + var rule = Joi.string().guid().min(32).max(34).allow('{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D').invalid('b4b2fb69c6244e5eb0698e0c6ec66618').allow(''); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', true], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', false], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', true], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max, allow and allow(\'\')', function (done) { + + var rule = Joi.string().guid().min(32).max(34).allow('{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D').allow(''); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', true], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', true], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', true], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max, allow, invalid and regex', function (done) { + + var rule = Joi.string().guid().min(32).max(34).allow('{D1A5279D-B27D-4CD4-A05E-EFDD53D08').invalid('b4b2fb69c6244e5eb0698e0c6ec66618').regex(/^{7e908/); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', false], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', false], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', false], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08', true], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max, allow, invalid, regex and allow(\'\')', function (done) { + + var rule = Joi.string().guid().min(32).max(34).allow('{D1A5279D-B27D-4CD4-A05E-EFDD53D08').invalid('b4b2fb69c6244e5eb0698e0c6ec66618').regex(/^{7e908/).allow(''); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', false], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', false], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', false], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08', true], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max and allow(\'\')', function (done) { + + var rule = Joi.string().guid().min(32).max(34).allow(''); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', true], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', true], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max and regex', function (done) { + + var rule = Joi.string().guid().min(32).max(34).regex(/^{7e9081/i); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', false], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', false], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', false], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', false], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max, regex and allow(\'\')', function (done) { + + var rule = Joi.string().guid().min(32).max(34).regex(/^{7e9081/i).allow(''); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', false], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', false], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', false], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', true], + [null, false] + ], done); + }); + + it('validates combination of guid, min, max, regex and required', function (done) { + + var rule = Joi.string().guid().min(32).max(34).regex(/^{7e9081/i).required(); + Helper.validate(rule, [ + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['{B59511BD6A5F4DF09ECF562A108D8A2E}', false], + ['69593D62-71EA-4548-85E4-04FC71357423', false], + ['677E2553DD4D43B09DA77414DB1EB8EA', false], + ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], + ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], + ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], + ['b4b2fb69c6244e5eb0698e0c6ec66618', false], + ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], + ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], + ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], + ['', false], + [null, false] + ], done); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/vision/package.json b/node_modules/hapi/node_modules/vision/package.json new file mode 100755 index 0000000..0e8eab1 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/package.json @@ -0,0 +1,52 @@ +{ + "name": "vision", + "description": "Templates rendering plugin support for hapi.js", + "version": "2.0.0", + "repository": { + "type": "git", + "url": "git://github.com/hapijs/vision" + }, + "main": "index", + "keywords": [ + "view", + "render", + "template", + "hapi" + ], + "engines": { + "node": ">=0.10.32" + }, + "dependencies": { + "boom": "2.x.x", + "hoek": "^2.9.x", + "items": "^1.1.x", + "joi": "5.x.x" + }, + "devDependencies": { + "code": "1.x.x", + "hapi": "8.x.x", + "lab": "5.x.x", + "handlebars": "2.x.x", + "jade": "1.x.x" + }, + "scripts": { + "test": "make test-cov" + }, + "licenses": [ + { + "type": "BSD", + "url": "http://github.com/hapijs/vision/raw/master/LICENSE" + } + ], + "readme": "#vision\n\nTemplates rendering plugin support for hapi.js.\n\n[![Build Status](https://secure.travis-ci.org/hapijs/vision.png)](http://travis-ci.org/hapijs/vision)\n\nLead Maintainer - [Eran Hammer](https://github.com/hueniverse)\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/hapijs/vision/issues" + }, + "_id": "vision@2.0.0", + "dist": { + "shasum": "741e013d6c2376aa1e802bf12871657f3a3d910b" + }, + "_from": "vision@2.0.0", + "_resolved": "https://registry.npmjs.org/vision/-/vision-2.0.0.tgz" +} diff --git a/node_modules/hapi/node_modules/vision/test/index.js b/node_modules/hapi/node_modules/vision/test/index.js new file mode 100755 index 0000000..fff7790 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/test/index.js @@ -0,0 +1,586 @@ +// Load modules + +var Path = require('path'); +var Code = require('code'); +var Handlebars = require('handlebars'); +var Hapi = require('hapi'); +var Hoek = require('hoek'); +var Jade = require('jade'); +var Lab = require('lab'); +var Vision = require('..'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('handler()', function () { + + it('handles routes to views', function (done) { + + var server = new Hapi.Server({ minimal: true }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates' + }); + + server.route({ method: 'GET', path: '/{param}', handler: { view: 'valid/handler' } }); + server.inject({ + method: 'GET', + url: '/hello' + }, function (res) { + + expect(res.result).to.contain('hello'); + done(); + }); + }); + + it('handles custom context', function (done) { + + var server = new Hapi.Server({ minimal: true }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + engines: { jade: Jade }, + path: __dirname + '/templates' + }); + + server.route({ method: 'GET', path: '/', handler: { view: { template: 'valid/index', context: { message: 'heyloo' } } } }); + server.inject('/', function (res) { + + expect(res.result).to.contain('heyloo'); + done(); + }); + }); + + it('handles custom options', function (done) { + + var server = new Hapi.Server({ minimal: true }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates', + layoutPath: __dirname + '/templates/layout' + }); + + server.route({ method: 'GET', path: '/', handler: { view: { template: 'valid/options', options: { layout: 'elsewhere' } } } }); + server.inject('/', function (res) { + + expect(res.result).to.contain('+hello'); + done(); + }); + }); + + it('includes prerequisites in the default view context', function (done) { + + var pre = function (request, reply) { + + reply('PreHello'); + }; + + var server = new Hapi.Server({ minimal: true }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates' + }); + + server.route({ + method: 'GET', + path: '/', + config: { + pre: [ + { method: pre, assign: 'p' } + ], + handler: { + view: 'valid/handler' + } + } + }); + + server.inject('/', function (res) { + + expect(res.result).to.contain('PreHello'); + done(); + }); + }); + + it('handles both custom and default contexts', function (done) { + + var server = new Hapi.Server({ minimal: true }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates' + }); + + server.route({ method: 'GET', path: '/', handler: { view: { template: 'valid/testContext', context: { message: 'heyloo' } } } }); + server.inject('/?test=yes', function (res) { + + expect(res.result).to.contain('heyloo'); + expect(res.result).to.contain('yes'); + done(); + }); + }); + + it('overrides default contexts when provided with context of same name', function (done) { + + var server = new Hapi.Server({ minimal: true }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates' + }); + + server.route({ method: 'GET', path: '/', handler: { view: { template: 'valid/testContext', context: { message: 'heyloo', query: { test: 'no' } } } } }); + server.inject('/?test=yes', function (res) { + + expect(res.result).to.contain('heyloo'); + expect(res.result).to.contain('no'); + done(); + }); + }); + + it('handles a global context', function (done) { + + var server = new Hapi.Server({ minimal: true }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates', + context: { + message: 'default message' + } + }); + + server.route({ method: 'GET', path: '/', handler: { view: { template: 'valid/testContext' } } }); + server.inject('/', function (res) { + + expect(res.result).to.contain('

'); + expect(res.result).to.contain('

default message

'); + done(); + }); + }); + + it('overrides the global context with the default handler context', function (done) { + + var server = new Hapi.Server({ minimal: true }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates', + + context: { + message: 'default message', + query: { + test: 'global' + } + } + }); + + server.route({ method: 'GET', path: '/', handler: { view: { template: 'valid/testContext' } } }); + server.inject('/?test=yes', function (res) { + + expect(res.result).to.contain('

yes

'); + expect(res.result).to.contain('

default message

'); + done(); + }); + }); + + it('overrides the global and default contexts with a custom handler context', function (done) { + + var server = new Hapi.Server({ minimal: true }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates', + + context: { + message: 'default message', + + query: { + test: 'global' + } + } + }); + + server.route({ method: 'GET', path: '/', handler: { view: { template: 'valid/testContext', context: { message: 'override', query: { test: 'no' } } } } }); + server.inject('/?test=yes', function (res) { + + expect(res.result).to.contain('

no

'); + expect(res.result).to.contain('

override

'); + done(); + }); + }); + + it('throws on missing views', function (done) { + + var server = new Hapi.Server({ minimal: true, debug: false }); + server.register(Vision, Hoek.ignore); + server.connection(); + server.route({ path: '/', method: 'GET', handler: function (request, reply) { return reply.view('test', { message: 'steve' }); } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(500); + done(); + }); + }); +}); + +describe('render()', function () { + + it('renders view (root)', function (done) { + + var server = new Hapi.Server({ minimal: true }); + server.connection(); + server.register(Vision, Hoek.ignore); + + server.views({ + engines: { html: Handlebars }, + path: __dirname + '/templates/valid' + }); + + server.render('test', { title: 'test', message: 'Hapi' }, function (err, rendered, config) { + + expect(rendered).to.exist(); + expect(rendered).to.contain('Hapi'); + done(); + }); + }); + + it('renders view (root with options)', function (done) { + + var server = new Hapi.Server({ minimal: true }); + server.connection(); + server.register(Vision, Hoek.ignore); + + server.views({ + engines: { html: Handlebars } + }); + + server.render('test', { title: 'test', message: 'Hapi' }, { path: Path.join(__dirname, '/templates/valid') }, function (err, rendered, config) { + + expect(rendered).to.exist(); + expect(rendered).to.contain('Hapi'); + done(); + }); + }); + + it('renders view (plugin)', function (done) { + + var test = function (server, options, next) { + + server.views({ + engines: { 'html': Handlebars }, + relativeTo: Path.join(__dirname, '/templates/plugin') + }); + + var view = server.render('test', { message: 'steve' }, function (err, rendered, config) { + + server.route([ + { + path: '/view', method: 'GET', handler: function (request, reply) { + + return reply(rendered); + } + } + ]); + + return next(); + }); + }; + + test.attributes = { + name: 'test' + }; + + var server = new Hapi.Server({ minimal: true }); + server.connection(); + server.register(Vision, Hoek.ignore); + + server.register(test, function (err) { + + expect(err).to.not.exist(); + server.inject('/view', function (res) { + + expect(res.result).to.equal('

steve

'); + done(); + }); + }); + }); + + it('renders view (plugin without views)', function (done) { + + var test = function (server, options, next) { + + var view = server.render('test', { message: 'steve' }, function (err, rendered, config) { + + server.route([ + { + path: '/view', method: 'GET', handler: function (request, reply) { + + return reply(rendered); + } + } + ]); + + return next(); + }); + }; + + test.attributes = { + name: 'test' + }; + + var server = new Hapi.Server({ minimal: true }); + server.connection(); + server.register(Vision, Hoek.ignore); + + server.views({ + engines: { 'html': Handlebars }, + relativeTo: Path.join(__dirname, '/templates/plugin') + }); + + server.register(test, function (err) { + + expect(err).to.not.exist(); + server.inject('/view', function (res) { + + expect(res.result).to.equal('

steve

'); + done(); + }); + }); + }); + + it('renders view (plugin with options)', function (done) { + + var test = function (server, options, next) { + + server.views({ + engines: { 'html': Handlebars } + }); + + var view = server.render('test', { message: 'steve' }, { relativeTo: Path.join(__dirname, '/templates/plugin') }, function (err, rendered, config) { + + server.route([ + { + path: '/view', method: 'GET', handler: function (request, reply) { + + return reply(rendered); + } + } + ]); + + return next(); + }); + }; + + test.attributes = { + name: 'test' + }; + + var server = new Hapi.Server({ minimal: true }); + server.connection(); + server.register(Vision, Hoek.ignore); + + server.register(test, function (err) { + + expect(err).to.not.exist(); + server.inject('/view', function (res) { + + expect(res.result).to.equal('

steve

'); + done(); + }); + }); + }); + + it('throws on missing views', function (done) { + + var server = new Hapi.Server({ minimal: true }); + server.register(Vision, Hoek.ignore); + expect(function () { + + server.render('test'); + }).to.throw('Missing views manager'); + done(); + }); +}); + +describe('views()', function () { + + it('requires plugin with views', function (done) { + + var test = function (server, options, next) { + + server.path(__dirname); + + var views = { + engines: { 'html': Handlebars }, + path: './templates/plugin' + }; + + server.views(views); + if (Object.keys(views).length !== 2) { + return next(new Error('plugin.view() modified options')); + } + + server.route([ + { + path: '/view', method: 'GET', handler: function (request, reply) { + + return reply.view('test', { message: options.message }); + } + } + ]); + + server.ext('onRequest', function (request, reply) { + + if (request.path === '/ext') { + return reply.view('test', { message: 'grabbed' }); + } + + return reply.continue(); + }); + + return next(); + }; + + test.attributes = { + name: 'test' + }; + + var server = new Hapi.Server({ minimal: true }); + server.connection(); + server.register(Vision, Hoek.ignore); + + server.register({ register: test, options: { message: 'viewing it' } }, function (err) { + + expect(err).to.not.exist(); + server.inject('/view', function (res) { + + expect(res.result).to.equal('

viewing it

'); + + server.inject('/ext', function (res) { + + expect(res.result).to.equal('

grabbed

'); + done(); + }); + }); + }); + }); + + it('requires plugin with views with specific relativeTo', function (done) { + + var test = function (server, options, next) { + + server.views({ + engines: { 'html': Handlebars }, + relativeTo: Path.join(__dirname, '/templates/plugin') + }); + + server.route([ + { + path: '/view', method: 'GET', handler: function (request, reply) { + + return reply.view('test', { message: 'steve' }); + } + } + ]); + + return next(); + }; + + test.attributes = { + name: 'test' + }; + + var server = new Hapi.Server({ minimal: true }); + server.connection(); + server.register(Vision, Hoek.ignore); + + server.register(test, function (err) { + + expect(err).to.not.exist(); + server.inject('/view', function (res) { + + expect(res.result).to.equal('

steve

'); + done(); + }); + }); + }); + + it('defaults to server views', function (done) { + + var test = function (server, options, next) { + + server.route({ + path: '/view', + method: 'GET', + handler: function (request, reply) { + + return reply.view('test', { message: options.message }); + } + }); + + return next(); + }; + + test.attributes = { + name: 'test' + }; + + var server = new Hapi.Server({ minimal: true }); + server.connection(); + server.register(Vision, Hoek.ignore); + + server.path(__dirname); + + var views = { + engines: { 'html': Handlebars }, + path: './templates/plugin' + }; + + server.views(views); + + server.register({ register: test, options: { message: 'viewing it' } }, function (err) { + + expect(err).to.not.exist(); + server.inject('/view', function (res) { + + expect(res.result).to.equal('

viewing it

'); + done(); + }); + }); + }); + + it('throws on multiple views', function (done) { + + var server = new Hapi.Server({ minimal: true }); + server.register(Vision, Hoek.ignore); + server.views({ engines: { 'html': Handlebars } }); + expect(function () { + + server.views({ engines: { 'html': Handlebars } }); + }).to.throw('Cannot set views manager more than once'); + done(); + }); +}); diff --git a/node_modules/hapi/node_modules/vision/test/manager.js b/node_modules/hapi/node_modules/vision/test/manager.js new file mode 100755 index 0000000..df39140 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/test/manager.js @@ -0,0 +1,1524 @@ +// Load modules + +var Fs = require('fs'); +var Code = require('code'); +var Handlebars = require('handlebars'); +var Hapi = require('hapi'); +var Hoek = require('hoek'); +var Jade = require('jade'); +var Lab = require('lab'); +var Vision = require('..'); +var Manager = require('../lib/manager'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('Manager', function () { + + it('renders handlebars template', function (done) { + + var server = new Hapi.Server({ minimal: true }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + engines: { + html: { + module: require('handlebars'), + path: __dirname + '/templates/valid' + } + } + }); + + server.route({ method: 'GET', path: '/handlebars', handler: { view: { template: 'test.html', context: { message: 'Hello World!' } } } }); + + server.inject('/handlebars', function (res) { + + expect(res.result).to.exist(); + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('shallow copies global context', function (done) { + + var options = { + engines: { + html: { + module: require('handlebars'), + path: __dirname + '/templates/valid' + } + }, + context: { + a: 1 + } + }; + + var manager = new Manager(options); + + expect(manager._context).to.equal(options.context); + done(); + }); + + it('sets content type', function (done) { + + var server = new Hapi.Server({ minimal: true }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + engines: { + html: { + module: require('handlebars'), + path: __dirname + '/templates/valid', + contentType: 'something/else' + } + } + }); + + server.route({ method: 'GET', path: '/', handler: { view: { template: 'test', context: { message: 'Hello World!' } } } }); + server.inject('/', function (res) { + + expect(res.headers['content-type']).to.equal('something/else'); + expect(res.result).to.exist(); + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('errors on invalid template path', function (done) { + + var server = new Hapi.Server({ minimal: true, debug: false }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + engines: { 'html': require('handlebars') }, + path: __dirname + '/templates/invalid' + }); + + server.route({ method: 'GET', path: '/', handler: { view: { template: 'test', context: { message: 'Hello, World!' } } } }); + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(500); + done(); + }); + }); + + it('returns a compiled Handlebars template reply', function (done) { + + var server = new Hapi.Server({ minimal: true }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + engines: { 'html': require('handlebars') }, + path: __dirname + '/templates/valid' + }); + + server.route({ method: 'GET', path: '/', handler: { view: { template: 'test', context: { message: 'Hello, World!' } } } }); + + server.inject('/', function (res) { + + expect(res.result).to.exist(); + expect(res.result).to.have.string('Hello, World!'); + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('errors absolute path given and allowAbsolutePath is false (by default)', function (done) { + + var server = new Hapi.Server({ minimal: true, debug: false }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + engines: { 'html': require('handlebars') }, + path: __dirname + '/templates/valid' + }); + + server.route({ method: 'GET', path: '/', handler: { view: { template: __dirname + '/templates/valid/test', context: { message: 'Hello, World!' } } } }); + + server.inject('/', function (res) { + + expect(res.result).to.exist(); + expect(res.statusCode).to.equal(500); + done(); + }); + }); + + it('errors if path given includes ../ and allowInsecureAccess is false (by default)', function (done) { + + var server = new Hapi.Server({ minimal: true, debug: false }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + engines: { 'html': require('handlebars') }, + path: __dirname + '/templates/valid' + }); + + server.route({ method: 'GET', path: '/', handler: { view: { template: '../test', context: { message: 'Hello, World!' } } } }); + + server.inject('/', function (res) { + + expect(res.result).to.exist(); + expect(res.statusCode).to.equal(500); + done(); + }); + }); + + it('allows if path given includes ../ and allowInsecureAccess is true', function (done) { + + var server = new Hapi.Server({ minimal: true }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + engines: { 'html': require('handlebars') }, + allowInsecureAccess: true, + path: __dirname + '/templates/valid/helpers' + }); + + server.route({ method: 'GET', path: '/', handler: { view: { template: '../test', context: { message: 'Hello, World!' } } } }); + + server.inject('/', function (res) { + + expect(res.result).to.exist(); + expect(res.result).to.have.string('Hello, World!'); + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('errors if template does not exist()', function (done) { + + var server = new Hapi.Server({ minimal: true, debug: false }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + engines: { 'html': require('handlebars') }, + path: __dirname + '/templates/valid' + }); + + server.route({ method: 'GET', path: '/', handler: { view: { template: 'testNope', context: { message: 'Hello, World!' } } } }); + + server.inject('/', function (res) { + + expect(res.result).to.exist(); + expect(res.statusCode).to.equal(500); + done(); + }); + }); + + it('errors if engine.compile throws', function (done) { + + var server = new Hapi.Server({ minimal: true, debug: false }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + engines: { 'html': require('handlebars') }, + path: __dirname + '/templates/valid' + }); + + server.route({ method: 'GET', path: '/', handler: { view: { template: 'badmustache', context: { message: 'Hello, World!' }, options: { path: __dirname + '/templates/valid/invalid' } } } }); + + server.inject('/', function (res) { + + expect(res.result).to.exist(); + expect(res.statusCode).to.equal(500); + done(); + }); + }); + + it('should not fail if rendered template returns undefined', function (done) { + + var server = new Hapi.Server({ minimal: true }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + engines: { + html: { + module: { + compile: function (template, options) { + + return function (context, options) { + + return undefined; + }; + } + }, + path: __dirname + '/templates/valid' + } + } + }); + + server.route({ method: 'GET', path: '/', handler: { view: { template: 'test.html' } } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + describe('with layout', function (done) { + + it('returns response', function (done) { + + var server = new Hapi.Server({ minimal: true }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + engines: { 'html': require('handlebars') }, + path: __dirname + '/templates', + layout: true + }); + + server.route({ method: 'GET', path: '/', handler: { view: { template: 'valid/test', context: { title: 'test', message: 'Hapi' } } } }); + + server.inject('/', function (res) { + + expect(res.result).to.exist(); + expect(res.statusCode).to.equal(200); + expect(res.result).to.equal('\n\n \n test\n \n \n
\n

Hapi

\n
\n\n \n\n'); + done(); + }); + }); + + it('returns response with relativeTo and absolute path', function (done) { + + var server = new Hapi.Server({ minimal: true }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + engines: { 'html': require('handlebars') }, + relativeTo: '/none/shall/pass', + path: __dirname + '/templates', + layout: true + }); + + server.route({ method: 'GET', path: '/', handler: { view: { template: 'valid/test', context: { title: 'test', message: 'Hapi' } } } }); + + server.inject('/', function (res) { + + expect(res.result).to.exist(); + expect(res.statusCode).to.equal(200); + expect(res.result).to.equal('\n\n \n test\n \n \n
\n

Hapi

\n
\n\n \n\n'); + done(); + }); + }); + + it('returns response with layout override', function (done) { + + var server = new Hapi.Server({ minimal: true }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + engines: { 'html': require('handlebars') }, + path: __dirname + '/templates', + layout: true + }); + + server.route({ method: 'GET', path: '/', handler: { view: { template: 'valid/test', context: { title: 'test', message: 'Hapi' }, options: { layout: 'otherLayout' } } } }); + + server.inject('/', function (res) { + + expect(res.result).to.exist(); + expect(res.statusCode).to.equal(200); + expect(res.result).to.equal('test:
\n

Hapi

\n
\n'); + done(); + }); + }); + + it('returns response with custom server layout', function (done) { + + var server = new Hapi.Server({ minimal: true }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + engines: { 'html': require('handlebars') }, + path: __dirname + '/templates', + layout: 'otherLayout' + }); + + server.route({ method: 'GET', path: '/', handler: { view: { template: 'valid/test', context: { title: 'test', message: 'Hapi' } } } }); + + server.inject('/', function (res) { + + expect(res.result).to.exist(); + expect(res.statusCode).to.equal(200); + expect(res.result).to.equal('test:
\n

Hapi

\n
\n'); + done(); + }); + }); + + it('returns response with custom server layout and path', function (done) { + + var server = new Hapi.Server({ minimal: true }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + engines: { 'html': require('handlebars') }, + relativeTo: __dirname, + path: 'templates', + layoutPath: 'templates/layout', + layout: 'elsewhere' + }); + + server.route({ method: 'GET', path: '/', handler: { view: { template: 'valid/test', context: { title: 'test', message: 'Hapi' } } } }); + + server.inject('/', function (res) { + + expect(res.result).to.exist(); + expect(res.statusCode).to.equal(200); + expect(res.result).to.equal('test+
\n

Hapi

\n
\n'); + done(); + }); + }); + + it('errors on missing layout', function (done) { + + var server = new Hapi.Server({ minimal: true, debug: false }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + engines: { 'html': require('handlebars') }, + path: __dirname + '/templates', + layout: 'missingLayout' + }); + + server.route({ method: 'GET', path: '/', handler: { view: { template: 'valid/test', context: { title: 'test', message: 'Hapi' } } } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(500); + done(); + }); + }); + + it('errors on invalid layout', function (done) { + + var server = new Hapi.Server({ minimal: true, debug: false }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + engines: { 'html': require('handlebars') }, + path: __dirname + '/templates', + layout: 'invalidLayout' + }); + + server.route({ method: 'GET', path: '/', handler: { view: { template: 'valid/test', context: { title: 'test', message: 'Hapi' } } } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(500); + done(); + }); + }); + + it('returns response without layout', function (done) { + + var server = new Hapi.Server({ minimal: true }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + engines: { 'html': require('handlebars') }, + path: __dirname + '/templates', + layout: true + }); + + server.route({ method: 'GET', path: '/', handler: { view: { template: 'valid/test', context: { title: 'test', message: 'Hapi' }, options: { layout: false } } } }); + + server.inject('/', function (res) { + + expect(res.result).to.exist(); + expect(res.statusCode).to.equal(200); + expect(res.result).to.equal('
\n

Hapi

\n
\n'); + done(); + }); + }); + + it('errors on layoutKeyword conflict', function (done) { + + var server = new Hapi.Server({ minimal: true, debug: false }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + engines: { 'html': require('handlebars') }, + path: __dirname + '/templates/valid', + layout: true + }); + + server.route({ method: 'GET', path: '/', handler: { view: { template: 'test', context: { message: 'Hello, World!', content: 'fail' } } } }); + + server.inject('/', function (res) { + + expect(res.result).to.exist(); + expect(res.statusCode).to.equal(500); + done(); + }); + }); + + it('errors absolute path given and allowAbsolutePath is false (by default)', function (done) { + + var server = new Hapi.Server({ minimal: true, debug: false }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + engines: { 'html': require('handlebars') }, + path: __dirname + '/templates/valid', + layout: true + }); + + server.route({ method: 'GET', path: '/', handler: { view: { template: 'test', context: { title: 'test', message: 'Hapi' }, options: { path: __dirname + '/templates/valid/invalid' } } } }); + + server.inject('/', function (res) { + + expect(res.result).to.exist(); + expect(res.statusCode).to.equal(500); + done(); + }); + }); + }); + + describe('with multiple engines', function () { + + it('renders handlebars template', function (done) { + + var server = new Hapi.Server({ minimal: true }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + path: __dirname + '/templates/valid', + engines: { + 'html': require('handlebars'), + 'jade': require('jade'), + 'hbar': { + module: { + compile: function (engine) { return engine.compile; } + } + } + } + }); + + server.route({ method: 'GET', path: '/', handler: { view: { template: 'test.html', context: { message: 'Hello World!' } } } }); + + server.inject('/', function (res) { + + expect(res.result).to.exist(); + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('renders jade template', function (done) { + + var server = new Hapi.Server({ minimal: true }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + path: __dirname + '/templates/valid', + engines: { + 'html': require('handlebars'), + 'jade': require('jade'), + 'hbar': { + module: { + compile: function (engine) { return engine.compile; } + } + } + } + }); + + server.route({ method: 'GET', path: '/', handler: { view: { template: 'testMulti.jade', context: { message: 'Hello World!' } } } }); + + server.inject('/', function (res) { + + expect(res.result).to.exist(); + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('returns 500 on unknown extension', function (done) { + + var server = new Hapi.Server({ minimal: true, debug: false }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + path: __dirname + '/templates/valid', + engines: { + 'html': require('handlebars'), + 'jade': require('jade'), + 'hbar': { + module: { + compile: function (engine) { return engine.compile; } + } + } + } + }); + + server.route({ method: 'GET', path: '/', handler: { view: { template: 'test', context: { message: 'Hello World!' } } } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(500); + done(); + }); + }); + + it('returns 500 on missing extension engine', function (done) { + + var server = new Hapi.Server({ minimal: true, debug: false }); + server.connection(); + server.register(Vision, Hoek.ignore); + server.views({ + path: __dirname + '/templates/valid', + engines: { + 'html': require('handlebars'), + 'jade': require('jade'), + 'hbar': { + module: { + compile: function (engine) { return engine.compile; } + } + } + } + }); + + server.route({ method: 'GET', path: '/', handler: { view: { template: 'test.xyz', context: { message: 'Hello World!' } } } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(500); + done(); + }); + }); + }); + + describe('render()', function () { + + it('renders with async compile', function (done) { + + var views = new Manager({ + path: __dirname + '/templates', + engines: { + html: { + compileMode: 'async', + module: { + compile: function (string, options, callback) { + + var compiled = Handlebars.compile(string, options); + var renderer = function (context, opt, next) { + + return next(null, compiled(context, opt)); + }; + + return callback(null, renderer); + } + } + } + } + }); + + views.render('valid/test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { + + expect(rendered).to.exist(); + expect(rendered).to.contain('Hapi'); + done(); + }); + }); + + it('errors on sync compile that throws', function (done) { + + var views = new Manager({ + path: __dirname + '/templates', + engines: { + html: { + compileMode: 'sync', + module: { + compile: function (string, options) { + + throw (new Error('Bad bad view')); + } + } + } + } + }); + + views.render('valid/test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { + + expect(err).to.exist(); + expect(err.message).to.equal('Bad bad view'); + done(); + }); + }); + + it('allows valid (no layouts)', function (done) { + + var testView = new Manager({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates', + layout: false + }); + + testView.render('valid/test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { + + expect(rendered).to.exist(); + expect(rendered).to.contain('Hapi'); + done(); + }); + }); + + it('renders without context', function (done) { + + var testView = new Manager({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates' + }); + + testView.render('valid/test', null, null, function (err, rendered, config) { + + expect(rendered).to.exist(); + expect(rendered).to.equal('
\n

\n
\n'); + done(); + }); + }); + + it('renders without handler/global-context (with layout)', function (done) { + + var testView = new Manager({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates', + layout: true + }); + + testView.render('valid/test', null, null, function (err, rendered, config) { + + expect(rendered).to.exist(); + expect(rendered).to.contain('
\n

\n
\n'); + done(); + }); + }); + + it('renders with a global context object', function (done) { + + var testView = new Manager({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates', + + context: { + message: 'default message', + + query: { + test: 'global' + } + } + }); + + testView.render('valid/testContext', null, null, function (err, rendered, config) { + + expect(rendered).to.exist(); + expect(rendered).to.contain('

global

'); + expect(rendered).to.contain('

default message

'); + done(); + }); + }); + + it('overrides the global context object with local values', function (done) { + + var testView = new Manager({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates', + + context: { + message: 'default message', + + query: { + test: 'global' + } + } + }); + + testView.render('valid/testContext', { message: 'override' }, null, function (err, rendered, config) { + + expect(rendered).to.exist(); + expect(rendered).to.contain('

global

'); + expect(rendered).to.contain('

override

'); + done(); + }); + }); + + it('renders with a global context function', function (done) { + + var testView = new Manager({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates', + + context: function () { + + return { + message: 'default message', + + query: { + test: 'global' + } + }; + } + }); + + testView.render('valid/testContext', null, null, function (err, rendered, config) { + + expect(rendered).to.exist(); + expect(rendered).to.contain('

global

'); + expect(rendered).to.contain('

default message

'); + done(); + }); + }); + + it('overrides the global context function values with local values', function (done) { + + var testView = new Manager({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates', + + context: function () { + + return { + message: 'default message', + + query: { + test: 'global' + } + }; + } + }); + + testView.render('valid/testContext', { message: 'override' }, null, function (err, rendered, config) { + + expect(rendered).to.exist(); + expect(rendered).to.contain('

global

'); + expect(rendered).to.contain('

override

'); + done(); + }); + }); + + it('uses specified default ext', function (done) { + + var testView = new Manager({ + defaultExtension: 'html', + engines: { html: require('handlebars'), jade: Jade }, + path: __dirname + '/templates' + }); + + testView.render('valid/test', null, null, function (err, rendered, config) { + + expect(rendered).to.exist(); + expect(rendered).to.equal('
\n

\n
\n'); + done(); + }); + }); + + it('allows relative path with no base', function (done) { + + var testView = new Manager({ + engines: { html: require('handlebars') }, + path: './test/templates', + layout: false + }); + + testView.render('valid/test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { + + expect(rendered).to.exist(); + expect(rendered).to.equal('
\n

Hapi

\n
\n'); + done(); + }); + }); + + it('allows multiple relative paths with no base', function (done) { + + var testView = new Manager({ + engines: { html: require('handlebars') }, + path: ['./test/templates/layout', './test/templates/valid'], + layout: false + }); + + testView.render('test', { message: 'Hapi' }, null, function (err, rendered, config) { + + expect(rendered).to.exist(); + expect(rendered).to.contain('

Hapi

'); + done(); + }); + }); + + it('allows multiple relative paths with a base', function (done) { + + var testView = new Manager({ + engines: { html: require('handlebars') }, + relativeTo: __dirname + '/templates', + path: ['layout', 'valid'], + layout: false + }); + + testView.render('test', { message: 'Hapi' }, null, function (err, rendered, config) { + + expect(rendered).to.exist(); + expect(rendered).to.contain('

Hapi

'); + done(); + }); + }); + + it('uses the first matching template', function (done) { + + var testView = new Manager({ + engines: { html: require('handlebars') }, + relativeTo: __dirname + '/templates', + path: ['valid', 'invalid'], + layout: false + }); + + testView.render('test', { message: 'Hapi' }, null, function (err, rendered, config) { + + expect(rendered).to.exist(); + expect(rendered).to.contain('

Hapi

'); + done(); + }); + }); + + it('allows multiple absolute paths', function (done) { + + var testView = new Manager({ + engines: { html: require('handlebars') }, + path: [__dirname + '/templates/layout', __dirname + '/templates/valid'], + layout: false + }); + + testView.render('test', { message: 'Hapi' }, null, function (err, rendered, config) { + + expect(rendered).to.exist(); + expect(rendered).to.contain('

Hapi

'); + done(); + }); + }); + + it('allows valid (with layouts)', function (done) { + + var testViewWithLayouts = new Manager({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates', + layout: true + }); + + testViewWithLayouts.render('valid/test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { + + expect(rendered).to.exist(); + expect(rendered).to.contain('Hapi'); + done(); + }); + }); + + it('allows absolute path', function (done) { + + var testViewWithLayouts = new Manager({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates', + layout: __dirname + '/templates/layout', + allowAbsolutePaths: true + }); + + testViewWithLayouts.render('valid/test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { + + expect(rendered).to.exist(); + expect(rendered).to.contain('Hapi'); + done(); + }); + }); + + it('errors on invalid layout', function (done) { + + var views = new Manager({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates', + layout: 'badlayout' + }); + + views.render('valid/test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { + + expect(err).to.exist(); + expect(err.message).to.equal('Parse error on line 1:\n{{}\n--^\nExpecting \'ID\', \'DATA\', got \'INVALID\': Parse error on line 1:\n{{}\n--^\nExpecting \'ID\', \'DATA\', got \'INVALID\''); + done(); + }); + }); + + it('errors on layout compile error', function (done) { + + var views = new Manager({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates', + layout: 'layout' + }); + + var layout = __dirname + '/templates/layout.html'; + var mode = Fs.statSync(layout).mode; + + Fs.chmodSync(layout, '0300'); + views.render('valid/test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { + + try { + expect(err).to.exist(); + expect(err.message).to.contain('Failed to read view file'); + } + finally { + Fs.chmodSync(layout, mode); + } + done(); + }); + }); + + it('errors on invalid layout path', function (done) { + + var views = new Manager({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates', + layout: '/badlayout' + }); + + views.render('valid/test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { + + expect(err).to.exist(); + expect(err.message).to.equal('Absolute paths are not allowed in views'); + done(); + }); + }); + + it('allows multiple layout paths', function (done) { + + var views = new Manager({ + engines: { html: require('handlebars') }, + relativeTo: __dirname + '/templates', + path: 'valid', + layoutPath: ['invalid', 'layout'], + layout: 'elsewhere' + }); + + views.render('test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { + + expect(err).not.to.exist(); + expect(rendered).to.contain('Hapi'); + done(); + }); + }); + + it('uses the first matching layout', function (done) { + + var views = new Manager({ + engines: { html: require('handlebars') }, + relativeTo: __dirname, + path: 'templates/valid', + layoutPath: ['templates', 'templates/invalid'], + layout: true + }); + + views.render('test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { + + expect(err).not.to.exist(); + expect(rendered).to.contain('Hapi'); + done(); + }); + }); + + it('allows valid jade layouts', function (done) { + + var testViewWithJadeLayouts = new Manager({ + engines: { jade: Jade }, + path: __dirname + '/templates' + '/valid/', + layout: true + }); + + testViewWithJadeLayouts.render('index', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { + + expect(rendered).to.contain('Hapi'); + done(); + }); + }); + + it('should work and not throw without jade layouts', function (done) { + + var testViewWithoutJadeLayouts = new Manager({ + engines: { jade: Jade }, + path: __dirname + '/templates' + '/valid/', + layout: false + }); + + testViewWithoutJadeLayouts.render('test', { title: 'test', message: 'Hapi Message' }, null, function (err, rendered, config) { + + expect(rendered).to.contain('Hapi Message'); + done(); + }); + }); + + it('allows relativeTo, template name, and no path', function (done) { + + var views = new Manager({ engines: { html: require('handlebars') } }); + views.render('test', { title: 'test', message: 'Hapi' }, { relativeTo: __dirname + '/templates/valid' }, function (err, rendered, config) { + + expect(rendered).to.exist(); + expect(rendered).to.contain('Hapi'); + done(); + }); + }); + + it('errors when referencing non existant partial (with layouts)', function (done) { + + var testViewWithLayouts = new Manager({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates', + layout: true + }); + + testViewWithLayouts.render('invalid/test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { + + expect(err).to.exist(); + done(); + }); + }); + + it('errors when referencing non existant partial (no layouts)', function (done) { + + var testView = new Manager({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates', + layout: false + }); + + testView.render('invalid/test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { + + expect(err).to.exist(); + done(); + }); + + }); + + it('errors if context uses layoutKeyword as a key', function (done) { + + var testViewWithLayouts = new Manager({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates', + layout: true + }); + + var opts = { title: 'test', message: 'Hapi', content: 1 }; + testViewWithLayouts.render('valid/test', opts, null, function (err, rendered, config) { + + expect(err).to.exist(); + done(); + }); + }); + + it('errors on compile error (invalid template code)', function (done) { + + var testView = new Manager({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates', + layout: false + }); + + testView.render('invalid/badmustache', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { + + expect(err instanceof Error).to.equal(true); + done(); + }); + }); + + it('loads partials and be able to render them', function (done) { + + var tempView = new Manager({ + engines: { html: { module: Handlebars.create() } }, // Clear environment from other tests + path: __dirname + '/templates/valid', + partialsPath: __dirname + '/templates/valid/partials' + }); + + tempView.render('testPartials', {}, null, function (err, rendered, config) { + + expect(rendered).to.equal(' Nav:|'); + done(); + }); + }); + + it('normalizes full partial name (windows)', function (done) { + + var tempView = new Manager({ + engines: { html: { module: Handlebars.create() } }, // Clear environment from other tests + path: __dirname + '/templates/valid', + partialsPath: __dirname + '/templates/valid/partials' + }); + + tempView.render('testPartialsName', {}, null, function (err, rendered, config) { + + expect(rendered).to.equal(' Nav:|'); + done(); + }); + }); + + it('loads partials from relative path without base', function (done) { + + var tempView = new Manager({ + engines: { html: { module: Handlebars.create() } }, // Clear environment from other tests + path: __dirname + '/templates/valid', + partialsPath: './test/templates/valid/partials' + }); + + tempView.render('testPartials', {}, null, function (err, rendered, config) { + + expect(rendered).to.equal(' Nav:|'); + done(); + }); + }); + + it('loads partals from multiple relative paths without base', function (done) { + + var tempView = new Manager({ + engines: { html: { module: Handlebars.create() } }, // Clear environment from other tests + path: __dirname + '/templates/valid', + partialsPath: ['./test/templates/invalid', './test/templates/valid/partials'] + }); + + tempView.render('testPartials', {}, null, function (err, rendered, config) { + + expect(rendered).to.equal(' Nav:|'); + done(); + }); + }); + + it('loads partals from multiple relative paths with base', function (done) { + + var tempView = new Manager({ + engines: { html: { module: Handlebars.create() } }, // Clear environment from other tests + relativeTo: __dirname + '/templates', + path: 'valid', + partialsPath: ['invalid', 'valid/partials'] + }); + + tempView.render('testPartials', {}, null, function (err, rendered, config) { + + expect(rendered).to.equal(' Nav:|'); + done(); + }); + }); + + it('loads partials from multiple absolute paths', function (done) { + + var tempView = new Manager({ + engines: { html: { module: Handlebars.create() } }, // Clear environment from other tests + path: __dirname + '/templates/valid', + partialsPath: [__dirname + '/templates/invalid', __dirname + '/templates/valid/partials'] + }); + + tempView.render('testPartials', {}, null, function (err, rendered, config) { + + expect(rendered).to.equal(' Nav:|'); + done(); + }); + }); + + it('loads partials from relative path without base (no dot)', function (done) { + + var tempView = new Manager({ + engines: { html: { module: Handlebars.create() } }, // Clear environment from other tests + path: __dirname + '/templates/valid', + partialsPath: 'test/templates/valid/partials' + }); + + tempView.render('testPartials', {}, null, function (err, rendered, config) { + + expect(rendered).to.equal(' Nav:|'); + done(); + }); + }); + + it('loads partials and render them EVEN if viewsPath has trailing slash', function (done) { + + var tempView = new Manager({ + engines: { html: { module: Handlebars.create() } }, // Clear environment from other tests + path: __dirname + '/templates/valid', + partialsPath: __dirname + '/templates/valid/partials/' + }); + + tempView.render('testPartials', {}, null, function (err, rendered, config) { + + expect(rendered).to.exist(); + expect(rendered.length).above(1); + done(); + }); + }); + + it('skips loading partials and helpers if engine does not support them', function (done) { + + var tempView = new Manager({ + path: __dirname + '/templates/valid', + partialsPath: __dirname + '/templates/valid/partials', + helpersPath: __dirname + '/templates/valid/helpers', + engines: { html: Jade } + }); + + tempView.render('testPartials', {}, null, function (err, rendered, config) { + + expect(rendered).to.equal('Nav:{{> nav}}|{{> nested/nav}}'); + done(); + }); + }); + + it('loads helpers and render them', function (done) { + + var tempView = new Manager({ + engines: { html: { module: Handlebars.create() } }, // Clear environment from other tests + path: __dirname + '/templates/valid', + helpersPath: __dirname + '/templates/valid/helpers' + }); + + tempView.render('testHelpers', { something: 'uppercase' }, null, function (err, rendered, config) { + + expect(rendered).to.equal('

This is all UPPERCASE and this is how we like it!

'); + done(); + }); + }); + + it('loads helpers and render them when helpersPath ends with a slash', function (done) { + + var tempView = new Manager({ + engines: { html: { module: Handlebars.create() } }, // Clear environment from other tests + path: __dirname + '/templates/valid', + helpersPath: __dirname + '/templates/valid/helpers/' + }); + + tempView.render('testHelpers', { something: 'uppercase' }, null, function (err, rendered, config) { + + expect(rendered).to.equal('

This is all UPPERCASE and this is how we like it!

'); + done(); + }); + }); + + it('loads helpers using relative paths', function (done) { + + var tempView = new Manager({ + engines: { html: { module: Handlebars.create() } }, // Clear environment from other tests + relativeTo: './test/templates', + path: './valid', + helpersPath: './valid/helpers' + }); + + tempView.render('testHelpers', { something: 'uppercase' }, null, function (err, rendered, config) { + + expect(rendered).to.equal('

This is all UPPERCASE and this is how we like it!

'); + done(); + }); + }); + + it('loads helpers from multiple paths without a base', function (done) { + + var tempView = new Manager({ + engines: { html: { module: Handlebars.create() } }, // Clear environment from other tests + path: './test/templates/valid', + helpersPath: ['./test/templates/valid/helpers/tools', './test/templates/valid/helpers'] + }); + + tempView.render('testHelpers', { something: 'uppercase' }, null, function (err, rendered, config) { + + expect(rendered).to.equal('

This is all UPPERCASE and this is how we like it!

'); + done(); + }); + }); + + it('loads helpers from multiple paths with a base', function (done) { + + var tempView = new Manager({ + engines: { html: { module: Handlebars.create() } }, // Clear environment from other tests + relativeTo: './test/templates', + path: './valid', + helpersPath: ['./valid/helpers/tools', './valid/helpers'] + }); + + tempView.render('testHelpers', { something: 'uppercase' }, null, function (err, rendered, config) { + + expect(rendered).to.equal('

This is all UPPERCASE and this is how we like it!

'); + done(); + }); + }); + + it('loads helpers using relative paths (without dots)', function (done) { + + var tempView = new Manager({ + engines: { html: { module: Handlebars.create() } }, // Clear environment from other tests + relativeTo: 'test/templates', + path: 'valid', + helpersPath: 'valid/helpers' + }); + + tempView.render('testHelpers', { something: 'uppercase' }, null, function (err, rendered, config) { + + expect(rendered).to.equal('

This is all UPPERCASE and this is how we like it!

'); + done(); + }); + }); + + it('reuses cached compilation', function (done) { + + var gen = 0; + var views = new Manager({ + path: __dirname + '/templates', + engines: { + html: { + compileMode: 'async', + module: { + compile: function (string, options, callback) { + + ++gen; + var compiled = Handlebars.compile(string, options); + var renderer = function (context, opt, next) { + + return next(null, compiled(context, opt)); + }; + + return callback(null, renderer); + } + } + } + } + }); + + views.render('valid/test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { + + expect(rendered).to.exist(); + expect(rendered).to.contain('Hapi'); + + views.render('valid/test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { + + expect(rendered).to.exist(); + expect(rendered).to.contain('Hapi'); + + expect(gen).to.equal(1); + done(); + }); + }); + }); + + it('disables caching', function (done) { + + var gen = 0; + var views = new Manager({ + path: __dirname + '/templates', + engines: { + html: { + compileMode: 'async', + module: { + compile: function (string, options, callback) { + + ++gen; + var compiled = Handlebars.compile(string, options); + var renderer = function (context, opt, next) { + + return next(null, compiled(context, opt)); + }; + + return callback(null, renderer); + } + } + } + }, + isCached: false + }); + + views.render('valid/test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { + + expect(rendered).to.exist(); + expect(rendered).to.contain('Hapi'); + + views.render('valid/test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { + + expect(rendered).to.exist(); + expect(rendered).to.contain('Hapi'); + + expect(gen).to.equal(2); + done(); + }); + }); + }); + }); + + describe('_response()', function () { + + it('sets Content-Type', function (done) { + + var server = new Hapi.Server({ minimal: true }); + server.register(Vision, Hoek.ignore); + server.connection(); + server.views({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates/valid' + }); + + var handler = function (request, reply) { + + return reply.view('test.html', { message: 'hi' }); + }; + + server.route({ method: 'GET', path: '/', handler: handler }); + server.inject('/', function (res) { + + expect(res.headers['content-type']).to.contain('text/html'); + done(); + }); + }); + + it('does not override Content-Type', function (done) { + + var server = new Hapi.Server({ minimal: true }); + server.register(Vision, Hoek.ignore); + server.connection(); + + server.views({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates/valid' + }); + + var handler = function (request, reply) { + + return reply.view('test.html', { message: 'hi' }).type('text/plain'); + }; + + server.route({ method: 'GET', path: '/', handler: handler }); + server.inject('/', function (res) { + + expect(res.headers['content-type']).to.contain('text/plain'); + done(); + }); + }); + + it('errors on invalid template', function (done) { + + var server = new Hapi.Server({ minimal: true, debug: false }); + server.register(Vision, Hoek.ignore); + server.connection(); + server.views({ + engines: { html: require('handlebars') }, + path: __dirname + '/templates/invalid' + }); + + var handler = function (request, reply) { + + return reply.view('test.html', { message: 'hi' }); + }; + + server.route({ method: 'GET', path: '/', handler: handler }); + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(500); + done(); + }); + }); + }); +}); diff --git a/node_modules/hapi/node_modules/vision/test/templates/badlayout.html b/node_modules/hapi/node_modules/vision/test/templates/badlayout.html new file mode 100755 index 0000000..b9669c0 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/test/templates/badlayout.html @@ -0,0 +1 @@ +{{} \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/invalid/badmustache.html b/node_modules/hapi/node_modules/vision/test/templates/invalid/badmustache.html new file mode 100755 index 0000000..5bdc36d --- /dev/null +++ b/node_modules/hapi/node_modules/vision/test/templates/invalid/badmustache.html @@ -0,0 +1,2 @@ +}}!} +{{invalid } \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/invalid/layout.html b/node_modules/hapi/node_modules/vision/test/templates/invalid/layout.html new file mode 100755 index 0000000..b9669c0 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/test/templates/invalid/layout.html @@ -0,0 +1 @@ +{{} \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/invalid/test.html b/node_modules/hapi/node_modules/vision/test/templates/invalid/test.html new file mode 100755 index 0000000..2c8246f --- /dev/null +++ b/node_modules/hapi/node_modules/vision/test/templates/invalid/test.html @@ -0,0 +1,3 @@ +
+

{{> message}}

+
diff --git a/node_modules/hapi/node_modules/vision/test/templates/layout.html b/node_modules/hapi/node_modules/vision/test/templates/layout.html new file mode 100755 index 0000000..b52a914 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/test/templates/layout.html @@ -0,0 +1,9 @@ + + + + {{title}} + + + {{{ content }}} + + diff --git a/node_modules/hapi/node_modules/vision/test/templates/layout/elsewhere.html b/node_modules/hapi/node_modules/vision/test/templates/layout/elsewhere.html new file mode 100755 index 0000000..64570f8 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/test/templates/layout/elsewhere.html @@ -0,0 +1 @@ +{{title}}+{{{ content }}} \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/otherLayout.html b/node_modules/hapi/node_modules/vision/test/templates/otherLayout.html new file mode 100755 index 0000000..6de1d10 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/test/templates/otherLayout.html @@ -0,0 +1 @@ +{{title}}:{{{ content }}} \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/plugin/test.html b/node_modules/hapi/node_modules/vision/test/templates/plugin/test.html new file mode 100755 index 0000000..73d4029 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/test/templates/plugin/test.html @@ -0,0 +1 @@ +

{{message}}

\ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/handler.html b/node_modules/hapi/node_modules/vision/test/templates/valid/handler.html new file mode 100755 index 0000000..0c1ed88 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/test/templates/valid/handler.html @@ -0,0 +1,12 @@ + + + + + + + {{ payload }} + {{ querystring }} + {{ params.param }} + {{ pre.p }} + + \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/helpers/.hidden.js b/node_modules/hapi/node_modules/vision/test/templates/valid/helpers/.hidden.js new file mode 100755 index 0000000..211b6ec --- /dev/null +++ b/node_modules/hapi/node_modules/vision/test/templates/valid/helpers/.hidden.js @@ -0,0 +1 @@ +throw new Error('Do not load me'); diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/helpers/ignore.js b/node_modules/hapi/node_modules/vision/test/templates/valid/helpers/ignore.js new file mode 100755 index 0000000..5c40913 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/test/templates/valid/helpers/ignore.js @@ -0,0 +1 @@ +exports = module.exports = 'not a function'; diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/helpers/tools/lowercase.js b/node_modules/hapi/node_modules/vision/test/templates/valid/helpers/tools/lowercase.js new file mode 100755 index 0000000..e64b95e --- /dev/null +++ b/node_modules/hapi/node_modules/vision/test/templates/valid/helpers/tools/lowercase.js @@ -0,0 +1,4 @@ +exports = module.exports = function (context) { + + return context.toLowerCase(); +}; diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/helpers/uppercase.js b/node_modules/hapi/node_modules/vision/test/templates/valid/helpers/uppercase.js new file mode 100755 index 0000000..7d68936 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/test/templates/valid/helpers/uppercase.js @@ -0,0 +1,4 @@ +exports = module.exports = function (context) { + + return context.toUpperCase(); +}; diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/index.jade b/node_modules/hapi/node_modules/vision/test/templates/valid/index.jade new file mode 100644 index 0000000..37fa7f0 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/test/templates/valid/index.jade @@ -0,0 +1,4 @@ +extends layout + +block content + p= message \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/layout.jade b/node_modules/hapi/node_modules/vision/test/templates/valid/layout.jade new file mode 100644 index 0000000..658a3e3 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/test/templates/valid/layout.jade @@ -0,0 +1,4 @@ +html + body + block content + =content \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/options.html b/node_modules/hapi/node_modules/vision/test/templates/valid/options.html new file mode 100644 index 0000000..ce01362 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/test/templates/valid/options.html @@ -0,0 +1 @@ +hello diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/partials/.ignore.html b/node_modules/hapi/node_modules/vision/test/templates/valid/partials/.ignore.html new file mode 100644 index 0000000..e69de29 diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/partials/nav.html b/node_modules/hapi/node_modules/vision/test/templates/valid/partials/nav.html new file mode 100755 index 0000000..fb91898 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/test/templates/valid/partials/nav.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/partials/nested/deep/nav.html b/node_modules/hapi/node_modules/vision/test/templates/valid/partials/nested/deep/nav.html new file mode 100755 index 0000000..f8024d8 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/test/templates/valid/partials/nested/deep/nav.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/partials/nested/nav.html b/node_modules/hapi/node_modules/vision/test/templates/valid/partials/nested/nav.html new file mode 100755 index 0000000..f8024d8 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/test/templates/valid/partials/nested/nav.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/test.html b/node_modules/hapi/node_modules/vision/test/templates/valid/test.html new file mode 100755 index 0000000..92257b3 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/test/templates/valid/test.html @@ -0,0 +1,3 @@ +
+

{{message}}

+
diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/test.jade b/node_modules/hapi/node_modules/vision/test/templates/valid/test.jade new file mode 100644 index 0000000..e8fee38 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/test/templates/valid/test.jade @@ -0,0 +1 @@ +p= message \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/testContext.html b/node_modules/hapi/node_modules/vision/test/templates/valid/testContext.html new file mode 100755 index 0000000..2d6b72b --- /dev/null +++ b/node_modules/hapi/node_modules/vision/test/templates/valid/testContext.html @@ -0,0 +1,4 @@ +
+

{{query.test}}

+

{{message}}

+
diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/testHelpers.html b/node_modules/hapi/node_modules/vision/test/templates/valid/testHelpers.html new file mode 100755 index 0000000..916780b --- /dev/null +++ b/node_modules/hapi/node_modules/vision/test/templates/valid/testHelpers.html @@ -0,0 +1 @@ +

This is all {{uppercase this.something}} and this is how we like it!

\ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/testMulti.jade b/node_modules/hapi/node_modules/vision/test/templates/valid/testMulti.jade new file mode 100755 index 0000000..37fa7f0 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/test/templates/valid/testMulti.jade @@ -0,0 +1,4 @@ +extends layout + +block content + p= message \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/testPartials.html b/node_modules/hapi/node_modules/vision/test/templates/valid/testPartials.html new file mode 100755 index 0000000..5a56835 --- /dev/null +++ b/node_modules/hapi/node_modules/vision/test/templates/valid/testPartials.html @@ -0,0 +1 @@ + Nav:{{> nav}}|{{> nested/nav}} \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/testPartialsName.html b/node_modules/hapi/node_modules/vision/test/templates/valid/testPartialsName.html new file mode 100755 index 0000000..bae016f --- /dev/null +++ b/node_modules/hapi/node_modules/vision/test/templates/valid/testPartialsName.html @@ -0,0 +1 @@ + Nav:{{> nav}}|{{> nested/deep/nav}} \ No newline at end of file diff --git a/node_modules/hapi/node_modules/wreck/.npmignore b/node_modules/hapi/node_modules/wreck/.npmignore new file mode 100644 index 0000000..77ba16c --- /dev/null +++ b/node_modules/hapi/node_modules/wreck/.npmignore @@ -0,0 +1,18 @@ +.idea +*.iml +npm-debug.log +dump.rdb +node_modules +results.tap +results.xml +npm-shrinkwrap.json +config.json +.DS_Store +*/.DS_Store +*/*/.DS_Store +._* +*/._* +*/*/._* +coverage.* +lib-cov + diff --git a/node_modules/hapi/node_modules/wreck/.travis.yml b/node_modules/hapi/node_modules/wreck/.travis.yml new file mode 100755 index 0000000..047f7e3 --- /dev/null +++ b/node_modules/hapi/node_modules/wreck/.travis.yml @@ -0,0 +1,5 @@ +language: node_js + +node_js: + - 0.10 + diff --git a/node_modules/hapi/node_modules/wreck/CONTRIBUTING.md b/node_modules/hapi/node_modules/wreck/CONTRIBUTING.md new file mode 100644 index 0000000..2fe9f7c --- /dev/null +++ b/node_modules/hapi/node_modules/wreck/CONTRIBUTING.md @@ -0,0 +1,14 @@ +# How to contribute +We welcome contributions from the community and are pleased to have them. Please follow this guide when logging issues or making code changes. + +## Logging Issues +All issues should be created using the [new issue form](https://github.com/hapijs/wreck/issues/new). Clearly describe the issue including steps to reproduce if there are any. Also, make sure to indicate the earliest version that has the issue being reported. + +## Patching Code +Code changes are welcome and should follow the guidelines below. + +* Fork the repository on GitHub. +* Fix the issue ensuring that your code follows the [style guide](https://github.com/hapijs/contrib/blob/master/Style.md). +* Add tests for your new code ensuring that you have 100% code coverage (we can help you reach 100% but will not merge without it). + * Run `make test-cov-html` to generate a report of test coverage +* [Pull requests](http://help.github.com/send-pull-requests/) should be made to the [master branch](https://github.com/hapijs/wreck/tree/master). diff --git a/node_modules/hapi/node_modules/wreck/LICENSE b/node_modules/hapi/node_modules/wreck/LICENSE new file mode 100755 index 0000000..0d67fed --- /dev/null +++ b/node_modules/hapi/node_modules/wreck/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2012-2014, Walmart and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/wreck/graphs/contributors diff --git a/node_modules/hapi/node_modules/wreck/Makefile b/node_modules/hapi/node_modules/wreck/Makefile new file mode 100755 index 0000000..5404b23 --- /dev/null +++ b/node_modules/hapi/node_modules/wreck/Makefile @@ -0,0 +1,9 @@ +test: + @node node_modules/lab/bin/lab +test-cov: + @node node_modules/lab/bin/lab -t 100 +test-cov-html: + @node node_modules/lab/bin/lab -r html -o coverage.html + +.PHONY: test test-cov test-cov-html + diff --git a/node_modules/hapi/node_modules/wreck/README.md b/node_modules/hapi/node_modules/wreck/README.md new file mode 100755 index 0000000..dd028e3 --- /dev/null +++ b/node_modules/hapi/node_modules/wreck/README.md @@ -0,0 +1,197 @@ +![wreck Logo](https://raw.github.com/hapijs/wreck/master/images/wreck.png) + +HTTP Client Utilities + +[![Build Status](https://secure.travis-ci.org/hapijs/wreck.png)](http://travis-ci.org/hapijs/wreck) + +Lead Maintainer: [Wyatt Preul](https://github.com/wpreul) + +## Usage +### Basic +```javascript +var Wreck = require('wreck'); + +Wreck.get('https://google.com/', function (err, res, payload) { + /* do stuff */ +}); +``` + +### Advanced +```javascript +var Wreck = require('wreck'); + +var method = 'GET'; // GET, POST, PUT, DELETE +var uri = 'https://google.com/'; +var readableStream = Wreck.toReadableStream('foo=bar'); + +// all attributes are optional +var options = { + payload: readableStream || 'foo=bar' || new Buffer('foo=bar'), + headers: { /* http headers */ }, + redirects: 3, + timeout: 1000, // 1 second, default: unlimited + maxBytes: 1048576, // 1 MB, default: unlimited + rejectUnauthorized: true || false, + downstreamRes: null, + agent: null, // Node Core http.Agent + secureProtocol: 'SSLv3_method' // The SSL method to use +}; + +var optionalCallback = function (err, res) { + + /* handle err if it exists, in which case res will be undefined */ + + // buffer the response stream + Wreck.read(res, null, function (err, body) { + /* do stuff */ + }); +}; + +var req = Wreck.request(method, uri, options, optionalCallback); +``` + + +### `request(method, uri, [options, [callback]])` + +Initiate an HTTP request. +- `method` - A string specifying the HTTP request method, defaulting to 'GET'. +- `uri` - The URI of the requested resource. +- `options` - An optional configuration object. To omit this argument but still + use a callback, pass `null` in this position. The options object supports the + following optional keys: + - `payload` - The request body as string, Buffer, or Readable Stream. + - `headers` - An object containing request headers. + - `rejectUnauthorized` - [TLS](http://nodejs.org/api/tls.html) flag indicating + whether the client should reject a response from a server with invalid certificates. This cannot be set at the + same time as the `agent` option is set. + - `redirects` - The maximum number of redirects to follow. + - `agent` - Node Core [http.Agent](http://nodejs.org/api/http.html#http_class_http_agent). + Defaults to either `wreck.agents.http` or `wreck.agents.https`. Setting to `false` disables agent pooling. + - `timeout` - The number of milliseconds to wait without receiving a response + before aborting the request. Defaults to unlimited. + - `secureProtocol` - [TLS](http://nodejs.org/api/tls.html) flag indicating the SSL method to use, e.g. `SSLv3_method` + to force SSL version 3. The possible values depend on your installation of OpenSSL. Read the official OpenSSL docs + for possible [SSL_METHODS](http://www.openssl.org/docs/ssl/ssl.html#DEALING_WITH_PROTOCOL_METHODS). +- `callback` - The optional callback function using the signature `function (err, response)` where: + - `err` - Any error that may have occurred during the handling of the request. + - `response` - The [HTTP Incoming Message](http://nodejs.org/api/http.html#http_http_incomingmessage) + object, which is also a readable stream. + +Returns an instance of the node.js [ClientRequest](http://nodejs.org/api/http.html#http_class_http_clientrequest) object. + + +### `read(response, options, callback)` +- `response` - An HTTP Incoming Message object. +- `options` - `null` or a configuration object with the following optional keys: + - `timeout` - The number of milliseconds to wait while reading data before + aborting handling of the response. Defaults to unlimited. + - `json` - A value indicating how to try to parse the payload as JSON. Defaults to `undefined` meaning no parse logic. + - `true`, 'smart' - only try `JSON.parse` if the response indicates a JSON content-type. + - `force` - try `JSON.parse` regardless of the content-type header. + - `maxBytes` - The maximum allowed response payload size. Defaults to unlimited. +- `callback` - The callback function using the signature `function (err, payload)` where: + - `err` - Any error that may have occurred while reading the response. + - `payload` - The payload in the form of a Buffer or (optionally) parsed JavaScript object (JSON). + + +### `get(uri, [options], callback)` + +Convenience method for GET operations. +- `uri` - The URI of the requested resource. +- `options` - Optional config object containing settings for both `request` and + `read` operations. +- `callback` - The callback function using the signature `function (err, response, payload)` where: + - `err` - Any error that may have occurred during handling of the request. + - `response` - The [HTTP Incoming Message](http://nodejs.org/api/http.html#http_http_incomingmessage) + object, which is also a readable stream. + - `payload` - The payload in the form of a Buffer or (optionally) parsed JavaScript object (JSON). + +Returns an instance of the node.js [ClientRequest](http://nodejs.org/api/http.html#http_class_http_clientrequest) object. + + +### `post(uri, [options], callback)` + +Convenience method for POST operations. +- `uri` - The URI of the requested resource. +- `options` - Optional config object containing settings for both `request` and + `read` operations. +- `callback` - The callback function using the signature `function (err, response, payload)` where: + - `err` - Any error that may have occurred during handling of the request. + - `response` - The [HTTP Incoming Message](http://nodejs.org/api/http.html#http_http_incomingmessage) + object, which is also a readable stream. + - `payload` - The payload in the form of a Buffer or (optionally) parsed JavaScript object (JSON). + +Returns an instance of the node.js [ClientRequest](http://nodejs.org/api/http.html#http_class_http_clientrequest) object. + + +### `put(uri, [options], callback)` + +Convenience method for PUT operations. +- `uri` - The URI of the requested resource. +- `options` - Optional config object containing settings for both `request` and + `read` operations. +- `callback` - The callback function using the signature `function (err, response, payload)` where: + - `err` - Any error that may have occurred during handling of the request. + - `response` - The [HTTP Incoming Message](http://nodejs.org/api/http.html#http_http_incomingmessage) + object, which is also a readable stream. + - `payload` - The payload in the form of a Buffer or (optionally) parsed JavaScript object (JSON). + +Returns an instance of the node.js [ClientRequest](http://nodejs.org/api/http.html#http_class_http_clientrequest) object. + + +### `delete(uri, [options], callback)` + +Convenience method for DELETE operations. +- `uri` - The URI of the requested resource. +- `options` - Optional config object containing settings for both `request` and + `read` operations. +- `callback` - The callback function using the signature `function (err, response, payload)` where: + - `err` - Any error that may have occurred during handling of the request. + - `response` - The [HTTP Incoming Message](http://nodejs.org/api/http.html#http_http_incomingmessage) + object, which is also a readable stream. + - `payload` - The payload in the form of a Buffer or (optionally) parsed JavaScript object (JSON). + +Returns an instance of the node.js [ClientRequest](http://nodejs.org/api/http.html#http_class_http_clientrequest) object. + + +### `toReadableStream(payload, [encoding])` + +Creates a [readable stream](http://nodejs.org/api/stream.html#stream_class_stream_readable) +for the provided payload and encoding. +- `payload` - The Buffer or string to be wrapped in a readable stream. +- `encoding` - The encoding to use. Must be a valid Buffer encoding, such as 'utf8' or 'ascii'. + +```javascript +var stream = Wreck.toReadableStream(new Buffer('Hello', 'ascii'), 'ascii'); +var read = stream.read(); +// read -> 'Hello' +``` + +### `parseCacheControl(field)` + +Parses the provided *cache-control* request header value into an object containing +a property for each directive and it's value. Boolean directives, such as "private" +or "no-cache" will be set to the boolean `true`. +- `field` - The header cache control value to be parsed. + +```javascript +var result = Wreck.parseCacheControl('private, max-age=0, no-cache'); +// result.private -> true +// result['max-age'] -> 0 +// result['no-cache'] -> true +``` + +### `agents` + +Object that contains the agents for pooling connections for `http` and `https`. The properties are `http`, `https`, and +`httpsAllowUnauthorized` which is an `https` agent with `rejectUnauthorized` set to true. All agents have `maxSockets` +configured to `Infinity`. They are each instances of the node.js [Agent](http://nodejs.org/api/http.html#http_class_http_agent) +and expose the standard properties. + +For example, the following code demonstrates changing `maxSockets` on the `http` agent. + + ```js + var Wreck = require('wreck'); + + Wreck.agents.http.maxSockets = 20; + ``` diff --git a/node_modules/hapi/node_modules/wreck/images/wreck.png b/node_modules/hapi/node_modules/wreck/images/wreck.png new file mode 100755 index 0000000000000000000000000000000000000000..2122a10e28dcd80b258a4492a5a851da3fbee7fe GIT binary patch literal 30090 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ξqP3x&1C0nTLMyM~6* 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 H5cq!p-1Q?L literal 0 HcmV?d00001 diff --git a/node_modules/hapi/node_modules/wreck/index.js b/node_modules/hapi/node_modules/wreck/index.js new file mode 100755 index 0000000..4cc88b3 --- /dev/null +++ b/node_modules/hapi/node_modules/wreck/index.js @@ -0,0 +1 @@ +module.exports = require('./lib'); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/wreck/lib/index.js b/node_modules/hapi/node_modules/wreck/lib/index.js new file mode 100755 index 0000000..8067b6d --- /dev/null +++ b/node_modules/hapi/node_modules/wreck/lib/index.js @@ -0,0 +1,404 @@ + +// Load modules + +var Url = require('url'); +var Http = require('http'); +var Https = require('https'); +var Stream = require('stream'); +var Hoek = require('hoek'); +var Boom = require('boom'); +var Payload = require('./payload'); +var Recorder = require('./recorder'); +var Tap = require('./tap'); + + +// Declare internals + +var internals = {}; + + +exports.agents = { + https: new Https.Agent({ maxSockets: Infinity }), + http: new Http.Agent({ maxSockets: Infinity }), + httpsAllowUnauthorized: new Https.Agent({ maxSockets: Infinity, rejectUnauthorized: false }) +}; + + +exports.request = function (method, url, options, callback, _trace) { + + options = options || {}; + + Hoek.assert(options.payload === null || options.payload === undefined || typeof options.payload === 'string' || + options.payload instanceof Stream || Buffer.isBuffer(options.payload), + 'options.payload must be a string, a Buffer, or a Stream'); + + Hoek.assert((options.agent === undefined || options.agent === null) || (typeof options.rejectUnauthorized !== 'boolean'), + 'options.agent cannot be set to an Agent at the same time as options.rejectUnauthorized is set'); + + // Setup request + + var uri = Url.parse(url); + var timeoutId; + uri.method = method.toUpperCase(); + uri.headers = options.headers; + + var payloadSupported = (uri.method !== 'GET' && uri.method !== 'HEAD' && options.payload !== null && options.payload !== undefined); + if (payloadSupported && + (typeof options.payload === 'string' || Buffer.isBuffer(options.payload))) { + + uri.headers = Hoek.clone(uri.headers) || {}; + uri.headers['Content-Length'] = Buffer.isBuffer(options.payload) ? options.payload.length : Buffer.byteLength(options.payload); + } + + var redirects = (options.hasOwnProperty('redirects') ? options.redirects : false); // Needed to allow 0 as valid value when passed recursively + + _trace = (_trace || []); + _trace.push({ method: uri.method, url: url }); + + var client = (uri.protocol === 'https:' ? Https : Http); + + if (options.rejectUnauthorized !== undefined && uri.protocol === 'https:') { + uri.agent = options.rejectUnauthorized ? exports.agents.https : exports.agents.httpsAllowUnauthorized; + } + else if (options.agent || options.agent === false) { + uri.agent = options.agent; + } + else { + uri.agent = uri.protocol === 'https:' ? exports.agents.https : exports.agents.http; + } + + if (options.secureProtocol !== undefined) { + uri.secureProtocol = options.secureProtocol; + } + + var req = client.request(uri); + + var shadow = null; // A copy of the streamed request payload when redirects are enabled + + // Register handlers + + var finish = function (err, res) { + + if (!callback || err) { + if (res) { + res.destroy(); + } + + req.abort(); + } + + req.removeListener('response', onResponse); + req.removeListener('error', onError); + req.on('error', Hoek.ignore); + clearTimeout(timeoutId); + + if (callback) { + return callback(err, res); + } + }; + + finish = Hoek.once(finish); + + var onError = function (err) { + + err.trace = _trace; + return finish(Boom.badGateway('Client request error', err)); + }; + + req.once('error', onError); + + var onResponse = function (res) { + + // Pass-through response + + if (redirects === false || + [301, 302, 307, 308].indexOf(res.statusCode) === -1) { + + return finish(null, res); + } + + // Redirection + + var redirectMethod = (res.statusCode === 301 || res.statusCode === 302 ? 'GET' : uri.method); + var location = res.headers.location; + + res.destroy(); + + if (redirects === 0) { + return finish(Boom.badGateway('Maximum redirections reached', _trace)); + } + + if (!location) { + return finish(Boom.badGateway('Received redirection without location', _trace)); + } + + if (!/^https?:/i.test(location)) { + location = Url.resolve(uri.href, location); + } + + var redirectOptions = { + headers: options.headers, + payload: shadow || options.payload, // shadow must be ready at this point if set + redirects: --redirects + }; + + return exports.request(redirectMethod, location, redirectOptions, finish, _trace); + }; + + req.once('response', onResponse); + + if (options.timeout) { + timeoutId = setTimeout(function () { + + return finish(Boom.gatewayTimeout('Client request timeout')); + }, options.timeout); + } + + // Write payload + + if (payloadSupported) { + if (options.payload instanceof Stream) { + var stream = options.payload; + + if (redirects) { + var collector = new Tap(); + collector.once('finish', function () { + + shadow = collector.collect(); + }); + + stream = options.payload.pipe(collector); + } + + stream.pipe(req); + return; + } + + req.write(options.payload); + } + + // Finalize request + + req.end(); + + return req; +}; + + +// read() + +exports.read = function (res, options, callback) { + + options = options || {}; + + // Set stream timeout + + var clientTimeout = options.timeout; + var clientTimeoutId = null; + + if (clientTimeout && + clientTimeout > 0) { + + clientTimeoutId = setTimeout(function () { + + finish(Boom.clientTimeout()); + }, clientTimeout); + } + + // Finish once + + var finish = function (err, buffer) { + + clearTimeout(clientTimeoutId); + reader.removeListener('error', onReaderError); + reader.removeListener('finish', onReaderFinish); + res.removeListener('error', onResError); + res.removeListener('close', onResClose); + res.on('error', Hoek.ignore); + + if (err || !options.json) { + return callback(err, buffer); + } + + // Parse JSON + + var result; + if (buffer.length === 0) { + return callback(null, null); + } + + if (options.json === 'force') { + result = internals.tryParseBuffer(buffer); + return callback(result.err, result.json); + } + + // mode is "smart" or true + + var contentType = (res.headers && res.headers['content-type']) || ''; + var mime = contentType.split(';')[0].trim().toLowerCase(); + + if (mime !== 'application/json') { + return callback(null, buffer); + } + + result = internals.tryParseBuffer(buffer); + return callback(result.err, result.json); + }; + + finish = Hoek.once(finish); + + // Hander errors + + var onResError = function (err) { + + return finish(Boom.internal('Payload stream error', err)); + }; + + var onResClose = function () { + + return finish(Boom.internal('Payload stream closed prematurely')); + }; + + res.once('error', onResError); + res.once('close', onResClose); + + // Read payload + + var reader = new Recorder({ maxBytes: options.maxBytes }); + + var onReaderError = function (err) { + + res.destroy(); + return finish(err); + }; + + reader.once('error', onReaderError); + + var onReaderFinish = function () { + + return finish(null, reader.collect()); + }; + + reader.once('finish', onReaderFinish); + + res.pipe(reader); +}; + + +// toReadableStream() + +exports.toReadableStream = function (payload, encoding) { + + return new Payload(payload, encoding); +}; + + +// parseCacheControl() + +exports.parseCacheControl = function (field) { + + /* + Cache-Control = 1#cache-directive + cache-directive = token [ "=" ( token / quoted-string ) ] + token = [^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+ + quoted-string = "(?:[^"\\]|\\.)*" + */ + + // 1: directive = 2: token 3: quoted-string + var regex = /(?:^|(?:\s*\,\s*))([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)(?:\=(?:([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)|(?:\"((?:[^"\\]|\\.)*)\")))?/g; + + var header = {}; + var err = field.replace(regex, function ($0, $1, $2, $3) { + + var value = $2 || $3; + header[$1] = value ? value.toLowerCase() : true; + return ''; + }); + + if (header['max-age']) { + try { + var maxAge = parseInt(header['max-age'], 10); + if (isNaN(maxAge)) { + return null; + } + + header['max-age'] = maxAge; + } + catch (err) { } + } + + return (err ? null : header); +}; + + +// Shortcuts + +exports.get = function (uri, options, callback) { + + return internals.shortcutWrap('GET', uri, options, callback); +}; + + +exports.post = function (uri, options, callback) { + + return internals.shortcutWrap('POST', uri, options, callback); +}; + + +exports.put = function (uri, options, callback) { + + return internals.shortcutWrap('PUT', uri, options, callback); +}; + + +exports.delete = function (uri, options, callback) { + + return internals.shortcutWrap('DELETE', uri, options, callback); +}; + + +// Wrapper so that shortcut can be optimized with required params +internals.shortcutWrap = function (method, uri /* [options], callback */) { + + var options = (typeof arguments[2] === 'function' ? {} : arguments[2]); + var callback = (typeof arguments[2] === 'function' ? arguments[2] : arguments[3]); + + return internals.shortcut(method, uri, options, callback); +}; + + +internals.shortcut = function (method, uri, options, callback) { + + return exports.request(method, uri, options, function (err, res) { + + if (err) { + return callback(err); + } + + exports.read(res, options, function (err, payload) { + + if (payload instanceof Buffer) { + payload = payload.toString(); + } + + return callback(err, res, payload); + }); + }); +}; + + +internals.tryParseBuffer = function (buffer) { + + var result = { + json: null, + err: null + }; + try { + var json = JSON.parse(buffer.toString()); + result.json = json; + } + catch (err) { + result.err = err; + } + return result; +}; diff --git a/node_modules/hapi/node_modules/wreck/lib/payload.js b/node_modules/hapi/node_modules/wreck/lib/payload.js new file mode 100644 index 0000000..59a7196 --- /dev/null +++ b/node_modules/hapi/node_modules/wreck/lib/payload.js @@ -0,0 +1,42 @@ + +// Load modules + +var Hoek = require('hoek'); +var Stream = require('stream'); + + +// Declare internals + +var internals = {}; + + +module.exports = internals.Payload = function (payload, encoding) { + + Stream.Readable.call(this); + + var data = [].concat(payload || ''); + var size = 0; + for (var i = 0, il = data.length; i < il; ++i) { + var chunk = data[i]; + size += chunk.length; + data[i] = Buffer.isBuffer(chunk) ? chunk : new Buffer(chunk); + } + + this._data = Buffer.concat(data, size); + this._position = 0; + this._encoding = encoding || 'utf8'; +}; + +Hoek.inherits(internals.Payload, Stream.Readable); + + +internals.Payload.prototype._read = function (size) { + + var chunk = this._data.slice(this._position, this._position + size); + this.push(chunk, this._encoding); + this._position += chunk.length; + + if (this._position >= this._data.length) { + this.push(null); + } +}; diff --git a/node_modules/hapi/node_modules/wreck/lib/recorder.js b/node_modules/hapi/node_modules/wreck/lib/recorder.js new file mode 100644 index 0000000..4acf892 --- /dev/null +++ b/node_modules/hapi/node_modules/wreck/lib/recorder.js @@ -0,0 +1,44 @@ + +// Load modules + +var Boom = require('boom'); +var Hoek = require('hoek'); +var Stream = require('stream'); + + +// Declare internals + +var internals = {}; + + +module.exports = internals.Recorder = function (options) { + + Stream.Writable.call(this); + + this.settings = options; // No need to clone since called internally with new object + this.buffers = []; + this.length = 0; +}; + +Hoek.inherits(internals.Recorder, Stream.Writable); + + +internals.Recorder.prototype._write = function (chunk, encoding, next) { + + if (this.settings.maxBytes && + this.length + chunk.length > this.settings.maxBytes) { + + return this.emit('error', Boom.badRequest('Payload content length greater than maximum allowed: ' + this.settings.maxBytes)); + } + + this.length += chunk.length; + this.buffers.push(chunk); + next(); +}; + + +internals.Recorder.prototype.collect = function () { + + var buffer = (this.buffers.length === 0 ? new Buffer(0) : (this.buffers.length === 1 ? this.buffers[0] : Buffer.concat(this.buffers, this.length))); + return buffer; +}; diff --git a/node_modules/hapi/node_modules/wreck/lib/tap.js b/node_modules/hapi/node_modules/wreck/lib/tap.js new file mode 100644 index 0000000..3a7aa9e --- /dev/null +++ b/node_modules/hapi/node_modules/wreck/lib/tap.js @@ -0,0 +1,33 @@ + +// Load modules + +var Hoek = require('hoek'); +var Stream = require('stream'); +var Payload = require('./payload'); + + +// Declare internals + +var internals = {}; + + +module.exports = internals.Tap = function () { + + Stream.Transform.call(this); + this.buffers = []; +}; + +Hoek.inherits(internals.Tap, Stream.Transform); + + +internals.Tap.prototype._transform = function (chunk, encoding, next) { + + this.buffers.push(chunk); + next(null, chunk); +}; + + +internals.Tap.prototype.collect = function () { + + return new Payload(this.buffers); +}; diff --git a/node_modules/hapi/node_modules/wreck/package.json b/node_modules/hapi/node_modules/wreck/package.json new file mode 100644 index 0000000..96d2b4d --- /dev/null +++ b/node_modules/hapi/node_modules/wreck/package.json @@ -0,0 +1,46 @@ +{ + "name": "wreck", + "description": "HTTP Client Utilities", + "version": "5.2.0", + "repository": { + "type": "git", + "url": "git://github.com/hapijs/wreck" + }, + "main": "index", + "keywords": [ + "utilities", + "http", + "client" + ], + "engines": { + "node": ">=0.10.30" + }, + "dependencies": { + "hoek": "2.x.x", + "boom": "2.x.x" + }, + "devDependencies": { + "lab": "5.x.x", + "code": "1.x.x" + }, + "scripts": { + "test": "make test-cov" + }, + "licenses": [ + { + "type": "BSD", + "url": "http://github.com/hapijs/wreck/raw/master/LICENSE" + } + ], + "readme": "![wreck Logo](https://raw.github.com/hapijs/wreck/master/images/wreck.png)\n\nHTTP Client Utilities\n\n[![Build Status](https://secure.travis-ci.org/hapijs/wreck.png)](http://travis-ci.org/hapijs/wreck)\n\nLead Maintainer: [Wyatt Preul](https://github.com/wpreul)\n\n## Usage\n### Basic\n```javascript\nvar Wreck = require('wreck');\n\nWreck.get('https://google.com/', function (err, res, payload) {\n /* do stuff */\n});\n```\n\n### Advanced\n```javascript\nvar Wreck = require('wreck');\n\nvar method = 'GET'; // GET, POST, PUT, DELETE\nvar uri = 'https://google.com/';\nvar readableStream = Wreck.toReadableStream('foo=bar');\n\n// all attributes are optional\nvar options = {\n payload: readableStream || 'foo=bar' || new Buffer('foo=bar'),\n headers: { /* http headers */ },\n redirects: 3,\n timeout: 1000, // 1 second, default: unlimited\n maxBytes: 1048576, // 1 MB, default: unlimited\n rejectUnauthorized: true || false,\n downstreamRes: null,\n agent: null, // Node Core http.Agent\n secureProtocol: 'SSLv3_method' // The SSL method to use\n};\n\nvar optionalCallback = function (err, res) {\n\n /* handle err if it exists, in which case res will be undefined */\n \n // buffer the response stream\n Wreck.read(res, null, function (err, body) {\n /* do stuff */\n });\n};\n\nvar req = Wreck.request(method, uri, options, optionalCallback);\n```\n\n\n### `request(method, uri, [options, [callback]])`\n\nInitiate an HTTP request.\n- `method` - A string specifying the HTTP request method, defaulting to 'GET'.\n- `uri` - The URI of the requested resource.\n- `options` - An optional configuration object. To omit this argument but still\n use a callback, pass `null` in this position. The options object supports the\n following optional keys:\n - `payload` - The request body as string, Buffer, or Readable Stream.\n - `headers` - An object containing request headers.\n - `rejectUnauthorized` - [TLS](http://nodejs.org/api/tls.html) flag indicating\n whether the client should reject a response from a server with invalid certificates. This cannot be set at the\n same time as the `agent` option is set.\n - `redirects` - The maximum number of redirects to follow.\n - `agent` - Node Core [http.Agent](http://nodejs.org/api/http.html#http_class_http_agent).\n Defaults to either `wreck.agents.http` or `wreck.agents.https`. Setting to `false` disables agent pooling.\n - `timeout` - The number of milliseconds to wait without receiving a response\n before aborting the request. Defaults to unlimited.\n - `secureProtocol` - [TLS](http://nodejs.org/api/tls.html) flag indicating the SSL method to use, e.g. `SSLv3_method`\n to force SSL version 3. The possible values depend on your installation of OpenSSL. Read the official OpenSSL docs\n for possible [SSL_METHODS](http://www.openssl.org/docs/ssl/ssl.html#DEALING_WITH_PROTOCOL_METHODS).\n- `callback` - The optional callback function using the signature `function (err, response)` where:\n - `err` - Any error that may have occurred during the handling of the request.\n - `response` - The [HTTP Incoming Message](http://nodejs.org/api/http.html#http_http_incomingmessage)\n object, which is also a readable stream.\n\nReturns an instance of the node.js [ClientRequest](http://nodejs.org/api/http.html#http_class_http_clientrequest) object.\n\n\n### `read(response, options, callback)`\n- `response` - An HTTP Incoming Message object.\n- `options` - `null` or a configuration object with the following optional keys:\n - `timeout` - The number of milliseconds to wait while reading data before\n aborting handling of the response. Defaults to unlimited.\n - `json` - A value indicating how to try to parse the payload as JSON. Defaults to `undefined` meaning no parse logic.\n - `true`, 'smart' - only try `JSON.parse` if the response indicates a JSON content-type.\n - `force` - try `JSON.parse` regardless of the content-type header.\n - `maxBytes` - The maximum allowed response payload size. Defaults to unlimited.\n- `callback` - The callback function using the signature `function (err, payload)` where:\n - `err` - Any error that may have occurred while reading the response.\n - `payload` - The payload in the form of a Buffer or (optionally) parsed JavaScript object (JSON).\n\n\n### `get(uri, [options], callback)`\n\nConvenience method for GET operations.\n- `uri` - The URI of the requested resource.\n- `options` - Optional config object containing settings for both `request` and\n `read` operations.\n- `callback` - The callback function using the signature `function (err, response, payload)` where:\n - `err` - Any error that may have occurred during handling of the request.\n - `response` - The [HTTP Incoming Message](http://nodejs.org/api/http.html#http_http_incomingmessage)\n object, which is also a readable stream.\n - `payload` - The payload in the form of a Buffer or (optionally) parsed JavaScript object (JSON).\n\nReturns an instance of the node.js [ClientRequest](http://nodejs.org/api/http.html#http_class_http_clientrequest) object.\n\n\n### `post(uri, [options], callback)`\n\nConvenience method for POST operations.\n- `uri` - The URI of the requested resource.\n- `options` - Optional config object containing settings for both `request` and\n `read` operations.\n- `callback` - The callback function using the signature `function (err, response, payload)` where:\n - `err` - Any error that may have occurred during handling of the request.\n - `response` - The [HTTP Incoming Message](http://nodejs.org/api/http.html#http_http_incomingmessage)\n object, which is also a readable stream.\n - `payload` - The payload in the form of a Buffer or (optionally) parsed JavaScript object (JSON).\n\nReturns an instance of the node.js [ClientRequest](http://nodejs.org/api/http.html#http_class_http_clientrequest) object.\n\n\n### `put(uri, [options], callback)`\n\nConvenience method for PUT operations.\n- `uri` - The URI of the requested resource.\n- `options` - Optional config object containing settings for both `request` and\n `read` operations.\n- `callback` - The callback function using the signature `function (err, response, payload)` where:\n - `err` - Any error that may have occurred during handling of the request.\n - `response` - The [HTTP Incoming Message](http://nodejs.org/api/http.html#http_http_incomingmessage)\n object, which is also a readable stream.\n - `payload` - The payload in the form of a Buffer or (optionally) parsed JavaScript object (JSON).\n\nReturns an instance of the node.js [ClientRequest](http://nodejs.org/api/http.html#http_class_http_clientrequest) object.\n\n\n### `delete(uri, [options], callback)`\n\nConvenience method for DELETE operations.\n- `uri` - The URI of the requested resource.\n- `options` - Optional config object containing settings for both `request` and\n `read` operations.\n- `callback` - The callback function using the signature `function (err, response, payload)` where:\n - `err` - Any error that may have occurred during handling of the request.\n - `response` - The [HTTP Incoming Message](http://nodejs.org/api/http.html#http_http_incomingmessage)\n object, which is also a readable stream.\n - `payload` - The payload in the form of a Buffer or (optionally) parsed JavaScript object (JSON).\n\nReturns an instance of the node.js [ClientRequest](http://nodejs.org/api/http.html#http_class_http_clientrequest) object.\n\n\n### `toReadableStream(payload, [encoding])`\n\nCreates a [readable stream](http://nodejs.org/api/stream.html#stream_class_stream_readable)\nfor the provided payload and encoding.\n- `payload` - The Buffer or string to be wrapped in a readable stream.\n- `encoding` - The encoding to use. Must be a valid Buffer encoding, such as 'utf8' or 'ascii'.\n\n```javascript\nvar stream = Wreck.toReadableStream(new Buffer('Hello', 'ascii'), 'ascii');\nvar read = stream.read();\n// read -> 'Hello'\n```\n\n### `parseCacheControl(field)`\n\nParses the provided *cache-control* request header value into an object containing\na property for each directive and it's value. Boolean directives, such as \"private\"\nor \"no-cache\" will be set to the boolean `true`.\n- `field` - The header cache control value to be parsed.\n\n```javascript\nvar result = Wreck.parseCacheControl('private, max-age=0, no-cache');\n// result.private -> true\n// result['max-age'] -> 0\n// result['no-cache'] -> true\n```\n\n### `agents`\n\nObject that contains the agents for pooling connections for `http` and `https`. The properties are `http`, `https`, and\n`httpsAllowUnauthorized` which is an `https` agent with `rejectUnauthorized` set to true. All agents have `maxSockets`\nconfigured to `Infinity`. They are each instances of the node.js [Agent](http://nodejs.org/api/http.html#http_class_http_agent)\nand expose the standard properties.\n\nFor example, the following code demonstrates changing `maxSockets` on the `http` agent.\n\n ```js\n var Wreck = require('wreck');\n\n Wreck.agents.http.maxSockets = 20;\n ```\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/hapijs/wreck/issues" + }, + "_id": "wreck@5.2.0", + "dist": { + "shasum": "7850e2c5f754c4d961cad628a4b2626e5479e890" + }, + "_from": "wreck@5.2.0", + "_resolved": "https://registry.npmjs.org/wreck/-/wreck-5.2.0.tgz" +} diff --git a/node_modules/hapi/node_modules/wreck/test/index.js b/node_modules/hapi/node_modules/wreck/test/index.js new file mode 100755 index 0000000..c9065a6 --- /dev/null +++ b/node_modules/hapi/node_modules/wreck/test/index.js @@ -0,0 +1,1499 @@ +// Load modules + +var Http = require('http'); +var Https = require('https'); +var Path = require('path'); +var Fs = require('fs'); +var Events = require('events'); +var Stream = require('stream'); +var Code = require('code'); +var Lab = require('lab'); +var Wreck = require('../'); + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +var payload = new Array(1640).join('0123456789'); // make sure we have a payload larger than 16384 bytes for chunking coverage + +describe('request()', function () { + + it('requests a resource with callback', function (done) { + + var server = Http.createServer(function (req, res) { + + res.writeHead(200, { 'Content-Type': 'text/plain' }); + res.end(payload); + }); + + server.listen(0, function () { + + Wreck.request('get', 'http://localhost:' + server.address().port, {}, function (err, res) { + + expect(err).to.not.exist(); + Wreck.read(res, null, function (err, body) { + + expect(err).to.not.exist(); + expect(body.toString()).to.equal(payload); + server.close(); + done(); + }); + }); + }); + }); + + it('requests a POST resource', function (done) { + + var server = Http.createServer(function (req, res) { + + expect(req.headers['content-length']).to.equal('16390'); + res.writeHead(200, { 'Content-Type': 'text/plain' }); + req.pipe(res); + }); + + server.listen(0, function () { + + Wreck.request('post', 'http://localhost:' + server.address().port, { payload: payload }, function (err, res) { + + expect(err).to.not.exist(); + Wreck.read(res, null, function (err, body) { + + expect(err).to.not.exist(); + expect(body.toString()).to.equal(payload); + server.close(); + done(); + }); + }); + }); + }); + + it('requests a POST resource with unicode characters in payload', function (done) { + + var server = Http.createServer(function (req, res) { + + expect(req.headers['content-length']).to.equal('14'); + res.writeHead(200, { 'Content-Type': 'text/plain' }); + req.pipe(res); + }); + + server.listen(0, function () { + + var unicodePayload = JSON.stringify({ field: 'ć' }); + Wreck.request('post', 'http://localhost:' + server.address().port, { payload: unicodePayload }, function (err, res) { + + expect(err).to.not.exist(); + Wreck.read(res, null, function (err, body) { + + expect(err).to.not.exist(); + expect(body.toString()).to.equal(unicodePayload); + server.close(); + done(); + }); + }); + }); + }); + + it('requests a POST resource with headers', function (done) { + + var server = Http.createServer(function (req, res) { + + res.writeHead(200, { 'Content-Type': 'text/plain' }); + req.pipe(res); + }); + + server.listen(0, function () { + + Wreck.request('post', 'http://localhost:' + server.address().port, { headers: { 'user-agent': 'wreck' }, payload: payload }, function (err, res) { + + expect(err).to.not.exist(); + Wreck.read(res, null, function (err, body) { + + expect(err).to.not.exist(); + expect(body.toString()).to.equal(payload); + server.close(); + done(); + }); + }); + }); + }); + + it('requests a POST resource with stream payload', function (done) { + + var server = Http.createServer(function (req, res) { + + res.writeHead(200, { 'Content-Type': 'text/plain' }); + req.pipe(res); + }); + + server.listen(0, function () { + + Wreck.request('post', 'http://localhost:' + server.address().port, { payload: Wreck.toReadableStream(payload) }, function (err, res) { + + expect(err).to.not.exist(); + Wreck.read(res, null, function (err, body) { + + expect(err).to.not.exist(); + expect(body.toString()).to.equal(payload); + server.close(); + done(); + }); + }); + }); + }); + + it('requests a resource without callback', function (done) { + + var server = Http.createServer(function (req, res) { + + res.writeHead(200, { 'Content-Type': 'text/plain' }); + res.end(payload); + server.close(); + done(); + }); + + server.listen(0, function () { + + Wreck.request('get', 'http://localhost:' + server.address().port, {}); + }); + }); + + it('cannot set agent and rejectUnauthorized at the same time', function (done) { + + var fn = function () { + + Wreck.request('get', 'https://google.com', { rejectUnauthorized: true, agent: new Https.Agent() }, function (err, res) {}); + }; + + expect(fn).to.throw(); + done(); + }); + + it('cannot set a false agent and rejectUnauthorized at the same time', function (done) { + + var fn = function () { + + Wreck.request('get', 'https://google.com', { rejectUnauthorized: false, agent: false }, function (err, res) {}); + }; + + expect(fn).to.throw(); + done(); + }); + + it('can set a null agent and rejectUnauthorized at the same time', function (done) { + + var fn = function () { + + Wreck.request('get', 'https://google.com', { rejectUnauthorized: false, agent: null }, function (err, res) {}); + }; + + expect(fn).to.not.throw(); + done(); + }); + + it('requests an https resource', function (done) { + + Wreck.request('get', 'https://google.com', { rejectUnauthorized: true }, function (err, res) { + + expect(err).to.not.exist(); + Wreck.read(res, null, function (err, body) { + + expect(err).to.not.exist(); + expect(body.toString()).to.contain(''); + done(); + }); + }); + }); + + it('requests an https resource with secure protocol set', function (done) { + + Wreck.request('get', 'https://google.com', { rejectUnauthorized: true, secureProtocol: 'SSLv3_method' }, function (err, res) { + + expect(err).to.not.exist(); + Wreck.read(res, null, function (err, body) { + + expect(err).to.not.exist(); + expect(body.toString()).to.contain(''); + done(); + }); + }); + }); + + it('fails when an https resource has invalid certs and the default rejectUnauthorized', function (done) { + + var httpsOptions = { + key: '-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA0UqyXDCqWDKpoNQQK/fdr0OkG4gW6DUafxdufH9GmkX/zoKz\ng/SFLrPipzSGINKWtyMvo7mPjXqqVgE10LDI3VFV8IR6fnART+AF8CW5HMBPGt/s\nfQW4W4puvBHkBxWSW1EvbecgNEIS9hTGvHXkFzm4xJ2e9DHp2xoVAjREC73B7JbF\nhc5ZGGchKw+CFmAiNysU0DmBgQcac0eg2pWoT+YGmTeQj6sRXO67n2xy/hA1DuN6\nA4WBK3wM3O4BnTG0dNbWUEbe7yAbV5gEyq57GhJIeYxRvveVDaX90LoAqM4cUH06\n6rciON0UbDHV2LP/JaH5jzBjUyCnKLLo5snlbwIDAQABAoIBAQDJm7YC3pJJUcxb\nc8x8PlHbUkJUjxzZ5MW4Zb71yLkfRYzsxrTcyQA+g+QzA4KtPY8XrZpnkgm51M8e\n+B16AcIMiBxMC6HgCF503i16LyyJiKrrDYfGy2rTK6AOJQHO3TXWJ3eT3BAGpxuS\n12K2Cq6EvQLCy79iJm7Ks+5G6EggMZPfCVdEhffRm2Epl4T7LpIAqWiUDcDfS05n\nNNfAGxxvALPn+D+kzcSF6hpmCVrFVTf9ouhvnr+0DpIIVPwSK/REAF3Ux5SQvFuL\njPmh3bGwfRtcC5d21QNrHdoBVSN2UBLmbHUpBUcOBI8FyivAWJhRfKnhTvXMFG8L\nwaXB51IZAoGBAP/E3uz6zCyN7l2j09wmbyNOi1AKvr1WSmuBJveITouwblnRSdvc\nsYm4YYE0Vb94AG4n7JIfZLKtTN0xvnCo8tYjrdwMJyGfEfMGCQQ9MpOBXAkVVZvP\ne2k4zHNNsfvSc38UNSt7K0HkVuH5BkRBQeskcsyMeu0qK4wQwdtiCoBDAoGBANF7\nFMppYxSW4ir7Jvkh0P8bP/Z7AtaSmkX7iMmUYT+gMFB5EKqFTQjNQgSJxS/uHVDE\nSC5co8WGHnRk7YH2Pp+Ty1fHfXNWyoOOzNEWvg6CFeMHW2o+/qZd4Z5Fep6qCLaa\nFvzWWC2S5YslEaaP8DQ74aAX4o+/TECrxi0z2lllAoGAdRB6qCSyRsI/k4Rkd6Lv\nw00z3lLMsoRIU6QtXaZ5rN335Awyrfr5F3vYxPZbOOOH7uM/GDJeOJmxUJxv+cia\nPQDflpPJZU4VPRJKFjKcb38JzO6C3Gm+po5kpXGuQQA19LgfDeO2DNaiHZOJFrx3\nm1R3Zr/1k491lwokcHETNVkCgYBPLjrZl6Q/8BhlLrG4kbOx+dbfj/euq5NsyHsX\n1uI7bo1Una5TBjfsD8nYdUr3pwWltcui2pl83Ak+7bdo3G8nWnIOJ/WfVzsNJzj7\n/6CvUzR6sBk5u739nJbfgFutBZBtlSkDQPHrqA7j3Ysibl3ZIJlULjMRKrnj6Ans\npCDwkQKBgQCM7gu3p7veYwCZaxqDMz5/GGFUB1My7sK0hcT7/oH61yw3O8pOekee\nuctI1R3NOudn1cs5TAy/aypgLDYTUGQTiBRILeMiZnOrvQQB9cEf7TFgDoRNCcDs\nV/ZWiegVB/WY7H0BkCekuq5bHwjgtJTpvHGqQ9YD7RhE8RSYOhdQ/Q==\n-----END RSA PRIVATE KEY-----\n', + cert: '-----BEGIN CERTIFICATE-----\nMIIDBjCCAe4CCQDvLNml6smHlTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJV\nUzETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0\ncyBQdHkgTHRkMB4XDTE0MDEyNTIxMjIxOFoXDTE1MDEyNTIxMjIxOFowRTELMAkG\nA1UEBhMCVVMxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0\nIFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nANFKslwwqlgyqaDUECv33a9DpBuIFug1Gn8Xbnx/RppF/86Cs4P0hS6z4qc0hiDS\nlrcjL6O5j416qlYBNdCwyN1RVfCEen5wEU/gBfAluRzATxrf7H0FuFuKbrwR5AcV\nkltRL23nIDRCEvYUxrx15Bc5uMSdnvQx6dsaFQI0RAu9weyWxYXOWRhnISsPghZg\nIjcrFNA5gYEHGnNHoNqVqE/mBpk3kI+rEVzuu59scv4QNQ7jegOFgSt8DNzuAZ0x\ntHTW1lBG3u8gG1eYBMquexoSSHmMUb73lQ2l/dC6AKjOHFB9Ouq3IjjdFGwx1diz\n/yWh+Y8wY1Mgpyiy6ObJ5W8CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAoSc6Skb4\ng1e0ZqPKXBV2qbx7hlqIyYpubCl1rDiEdVzqYYZEwmst36fJRRrVaFuAM/1DYAmT\nWMhU+yTfA+vCS4tql9b9zUhPw/IDHpBDWyR01spoZFBF/hE1MGNpCSXXsAbmCiVf\naxrIgR2DNketbDxkQx671KwF1+1JOMo9ffXp+OhuRo5NaGIxhTsZ+f/MA4y084Aj\nDI39av50sTRTWWShlN+J7PtdQVA5SZD97oYbeUeL7gI18kAJww9eUdmT0nEjcwKs\nxsQT1fyKbo7AlZBY4KSlUMuGnn0VnAsB9b+LxtXlDfnjyM8bVQx1uAfRo0DO8p/5\n3J5DTjAU55deBQ==\n-----END CERTIFICATE-----\n' + }; + + var server = Https.createServer(httpsOptions, function (req, res) { + + res.writeHead(200); + res.end(); + }); + + server.listen(0, function (err) { + + expect(err).to.not.exist(); + + Wreck.request('get', 'https://localhost:' + server.address().port, {}, function (err, res) { + + expect(err).to.exist(); + done(); + }); + }); + }); + + it('succeeds when an https resource has unauthorized certs and rejectUnauthorized is false', function (done) { + + var httpsOptions = { + key: '-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA0UqyXDCqWDKpoNQQK/fdr0OkG4gW6DUafxdufH9GmkX/zoKz\ng/SFLrPipzSGINKWtyMvo7mPjXqqVgE10LDI3VFV8IR6fnART+AF8CW5HMBPGt/s\nfQW4W4puvBHkBxWSW1EvbecgNEIS9hTGvHXkFzm4xJ2e9DHp2xoVAjREC73B7JbF\nhc5ZGGchKw+CFmAiNysU0DmBgQcac0eg2pWoT+YGmTeQj6sRXO67n2xy/hA1DuN6\nA4WBK3wM3O4BnTG0dNbWUEbe7yAbV5gEyq57GhJIeYxRvveVDaX90LoAqM4cUH06\n6rciON0UbDHV2LP/JaH5jzBjUyCnKLLo5snlbwIDAQABAoIBAQDJm7YC3pJJUcxb\nc8x8PlHbUkJUjxzZ5MW4Zb71yLkfRYzsxrTcyQA+g+QzA4KtPY8XrZpnkgm51M8e\n+B16AcIMiBxMC6HgCF503i16LyyJiKrrDYfGy2rTK6AOJQHO3TXWJ3eT3BAGpxuS\n12K2Cq6EvQLCy79iJm7Ks+5G6EggMZPfCVdEhffRm2Epl4T7LpIAqWiUDcDfS05n\nNNfAGxxvALPn+D+kzcSF6hpmCVrFVTf9ouhvnr+0DpIIVPwSK/REAF3Ux5SQvFuL\njPmh3bGwfRtcC5d21QNrHdoBVSN2UBLmbHUpBUcOBI8FyivAWJhRfKnhTvXMFG8L\nwaXB51IZAoGBAP/E3uz6zCyN7l2j09wmbyNOi1AKvr1WSmuBJveITouwblnRSdvc\nsYm4YYE0Vb94AG4n7JIfZLKtTN0xvnCo8tYjrdwMJyGfEfMGCQQ9MpOBXAkVVZvP\ne2k4zHNNsfvSc38UNSt7K0HkVuH5BkRBQeskcsyMeu0qK4wQwdtiCoBDAoGBANF7\nFMppYxSW4ir7Jvkh0P8bP/Z7AtaSmkX7iMmUYT+gMFB5EKqFTQjNQgSJxS/uHVDE\nSC5co8WGHnRk7YH2Pp+Ty1fHfXNWyoOOzNEWvg6CFeMHW2o+/qZd4Z5Fep6qCLaa\nFvzWWC2S5YslEaaP8DQ74aAX4o+/TECrxi0z2lllAoGAdRB6qCSyRsI/k4Rkd6Lv\nw00z3lLMsoRIU6QtXaZ5rN335Awyrfr5F3vYxPZbOOOH7uM/GDJeOJmxUJxv+cia\nPQDflpPJZU4VPRJKFjKcb38JzO6C3Gm+po5kpXGuQQA19LgfDeO2DNaiHZOJFrx3\nm1R3Zr/1k491lwokcHETNVkCgYBPLjrZl6Q/8BhlLrG4kbOx+dbfj/euq5NsyHsX\n1uI7bo1Una5TBjfsD8nYdUr3pwWltcui2pl83Ak+7bdo3G8nWnIOJ/WfVzsNJzj7\n/6CvUzR6sBk5u739nJbfgFutBZBtlSkDQPHrqA7j3Ysibl3ZIJlULjMRKrnj6Ans\npCDwkQKBgQCM7gu3p7veYwCZaxqDMz5/GGFUB1My7sK0hcT7/oH61yw3O8pOekee\nuctI1R3NOudn1cs5TAy/aypgLDYTUGQTiBRILeMiZnOrvQQB9cEf7TFgDoRNCcDs\nV/ZWiegVB/WY7H0BkCekuq5bHwjgtJTpvHGqQ9YD7RhE8RSYOhdQ/Q==\n-----END RSA PRIVATE KEY-----\n', + cert: '-----BEGIN CERTIFICATE-----\nMIIDBjCCAe4CCQDvLNml6smHlTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJV\nUzETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0\ncyBQdHkgTHRkMB4XDTE0MDEyNTIxMjIxOFoXDTE1MDEyNTIxMjIxOFowRTELMAkG\nA1UEBhMCVVMxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0\nIFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nANFKslwwqlgyqaDUECv33a9DpBuIFug1Gn8Xbnx/RppF/86Cs4P0hS6z4qc0hiDS\nlrcjL6O5j416qlYBNdCwyN1RVfCEen5wEU/gBfAluRzATxrf7H0FuFuKbrwR5AcV\nkltRL23nIDRCEvYUxrx15Bc5uMSdnvQx6dsaFQI0RAu9weyWxYXOWRhnISsPghZg\nIjcrFNA5gYEHGnNHoNqVqE/mBpk3kI+rEVzuu59scv4QNQ7jegOFgSt8DNzuAZ0x\ntHTW1lBG3u8gG1eYBMquexoSSHmMUb73lQ2l/dC6AKjOHFB9Ouq3IjjdFGwx1diz\n/yWh+Y8wY1Mgpyiy6ObJ5W8CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAoSc6Skb4\ng1e0ZqPKXBV2qbx7hlqIyYpubCl1rDiEdVzqYYZEwmst36fJRRrVaFuAM/1DYAmT\nWMhU+yTfA+vCS4tql9b9zUhPw/IDHpBDWyR01spoZFBF/hE1MGNpCSXXsAbmCiVf\naxrIgR2DNketbDxkQx671KwF1+1JOMo9ffXp+OhuRo5NaGIxhTsZ+f/MA4y084Aj\nDI39av50sTRTWWShlN+J7PtdQVA5SZD97oYbeUeL7gI18kAJww9eUdmT0nEjcwKs\nxsQT1fyKbo7AlZBY4KSlUMuGnn0VnAsB9b+LxtXlDfnjyM8bVQx1uAfRo0DO8p/5\n3J5DTjAU55deBQ==\n-----END CERTIFICATE-----\n' + }; + + var server = Https.createServer(httpsOptions, function (req, res) { + + res.writeHead(200); + res.end(); + }); + + server.listen(0, function (err) { + + expect(err).to.not.exist(); + + Wreck.request('get', 'https://localhost:' + server.address().port, { rejectUnauthorized: false }, function (err, res) { + + expect(err).to.not.exist(); + done(); + }); + }); + }); + + it('requests a resource with downstream dependency', function (done) { + + var up = Http.createServer(function (req, res) { + + res.writeHead(200, { 'Content-Type': 'text/plain' }); + res.end(payload); + }); + + up.listen(0, function () { + + var down = Http.createServer(function (req, res1) { + + res1.writeHead(200, { 'Content-Type': 'text/plain' }); + Wreck.request('get', 'http://localhost:' + up.address().port, { downstreamRes: res1 }, function (err, res2) { + + expect(err).to.not.exist(); + res2.pipe(res1); + }); + }); + + down.listen(0, function () { + + Wreck.request('get', 'http://localhost:' + down.address().port, {}, function (err, res) { + + expect(err).to.not.exist(); + Wreck.read(res, null, function (err, body) { + + expect(err).to.not.exist(); + expect(body.toString()).to.equal(payload); + up.close(); + down.close(); + done(); + }); + }); + }); + }); + }); + + it('does not follow redirections by default', function (done) { + + var gen = 0; + var server = Http.createServer(function (req, res) { + + if (!gen++) { + res.writeHead(301, { 'Location': 'http://localhost:' + server.address().port }); + res.end(); + } + else { + res.writeHead(200, { 'Content-Type': 'text/plain' }); + res.end(payload); + } + }); + + server.listen(0, function () { + + Wreck.request('get', 'http://localhost:' + server.address().port, {}, function (err, res) { + + expect(err).to.not.exist(); + Wreck.read(res, null, function (err, body) { + + expect(err).to.not.exist(); + expect(res.statusCode).to.equal(301); + server.close(); + done(); + }); + }); + }); + }); + + it('handles redirections', function (done) { + + var gen = 0; + var server = Http.createServer(function (req, res) { + + if (!gen++) { + res.writeHead(301, { 'Location': 'http://localhost:' + server.address().port }); + res.end(); + } + else { + res.writeHead(200, { 'Content-Type': 'text/plain' }); + res.end(payload); + } + }); + + server.listen(0, function () { + + Wreck.request('get', 'http://localhost:' + server.address().port, { redirects: 1 }, function (err, res) { + + expect(err).to.not.exist(); + Wreck.read(res, null, function (err, body) { + + expect(err).to.not.exist(); + expect(body.toString()).to.equal(payload); + server.close(); + done(); + }); + }); + }); + }); + + it('handles redirections with relative location', function (done) { + + var gen = 0; + var server = Http.createServer(function (req, res) { + + if (!gen++) { + res.writeHead(301, { 'Location': '/' }); + res.end(); + } + else { + res.writeHead(200, { 'Content-Type': 'text/plain' }); + res.end(payload); + } + }); + + server.listen(0, function () { + + Wreck.request('get', 'http://localhost:' + server.address().port, { redirects: 1 }, function (err, res) { + + expect(err).to.not.exist(); + Wreck.read(res, null, function (err, body) { + + expect(err).to.not.exist(); + expect(body.toString()).to.equal(payload); + server.close(); + done(); + }); + }); + }); + }); + + it('reaches max redirections count', function (done) { + + var gen = 0; + var server = Http.createServer(function (req, res) { + + if (gen++ < 2) { + res.writeHead(301, { 'Location': 'http://localhost:' + server.address().port }); + res.end(); + } + else { + res.writeHead(200, { 'Content-Type': 'text/plain' }); + res.end(payload); + } + }); + + server.listen(0, function () { + + Wreck.request('get', 'http://localhost:' + server.address().port, { redirects: 1 }, function (err, res) { + + expect(err.message).to.equal('Maximum redirections reached'); + server.close(); + done(); + }); + }); + }); + + it('handles malformed redirection response', function (done) { + + var server = Http.createServer(function (req, res) { + + res.writeHead(301); + res.end(); + }); + + server.listen(0, function () { + + Wreck.request('get', 'http://localhost:' + server.address().port, { redirects: 1 }, function (err, res) { + + expect(err.message).to.equal('Received redirection without location'); + server.close(); + done(); + }); + }); + }); + + it('handles redirections with POST stream payload', function (done) { + + var gen = 0; + var server = Http.createServer(function (req, res) { + + if (!gen++) { + res.writeHead(307, { 'Location': '/' }); + res.end(); + } + else { + res.writeHead(200, { 'Content-Type': 'text/plain' }); + Wreck.read(req, null, function (err, res2) { + + res.end(res2); + }); + } + }); + + server.listen(0, function () { + + Wreck.request('post', 'http://localhost:' + server.address().port, { redirects: 1, payload: Wreck.toReadableStream(payload) }, function (err, res) { + + expect(err).to.not.exist(); + Wreck.read(res, null, function (err, body) { + + expect(err).to.not.exist(); + expect(body.toString()).to.equal(payload); + server.close(); + done(); + }); + }); + }); + }); + + it('handles request errors with a boom response', function (done) { + + var server = Http.createServer(function (req, res) { + + req.destroy(); + res.end(); + }); + + server.once('listening', function () { + + Wreck.request('get', 'http://127.0.0.1:' + server.address().port, { payload: '' }, function (err) { + + expect(err.code).to.equal('ECONNRESET'); + done(); + }); + }); + + server.listen(0); + }); + + it('handles request errors with a boom response when payload is being sent', function (done) { + + var server = Http.createServer(function (req, res) { + + req.destroy(); + res.end(); + }); + + server.once('listening', function () { + + Wreck.request('get', 'http://127.0.0.1:' + server.address().port, { payload: '' }, function (err) { + + expect(err.code).to.equal('ECONNRESET'); + done(); + }); + }); + + server.listen(0); + }); + + it('handles response errors with a boom response', function (done) { + + var server = Http.createServer(function (req, res) { + + res.destroy(); + }); + + server.once('listening', function () { + + Wreck.request('get', 'http://127.0.0.1:' + server.address().port, { payload: '' }, function (err) { + + expect(err.code).to.equal('ECONNRESET'); + done(); + }); + }); + + server.listen(0); + }); + + it('handles errors when remote server is unavailable', function (done) { + + Wreck.request('get', 'http://127.0.0.1:10', { payload: '' }, function (err) { + + expect(err).to.exist(); + done(); + }); + }); + + it('handles a timeout during a socket close', function (done) { + + var server = Http.createServer(function (req, res) { + + req.once('error', function () { }); + res.once('error', function () { }); + + setTimeout(function () { + + req.destroy(); + }, 5); + }); + + server.once('error', function () { }); + + server.once('listening', function () { + + Wreck.request('get', 'http://127.0.0.1:' + server.address().port, { payload: '', timeout: 5 }, function (err) { + + expect(err).to.exist(); + server.close(); + + setTimeout(done, 5); + }); + }); + + server.listen(0); + }); + + it('handles an error after a timeout', function (done) { + + var server = Http.createServer(function (req, res) { + + req.once('error', function () { }); + res.once('error', function () { }); + + setTimeout(function () { + + res.socket.write('ERROR'); + }, 5); + }); + + server.once('error', function () { }); + + server.once('listening', function () { + + Wreck.request('get', 'http://127.0.0.1:' + server.address().port, { payload: '', timeout: 5 }, function (err) { + + expect(err).to.exist(); + server.close(); + + setTimeout(done, 5); + }); + }); + + server.listen(0); + }); + + it('allows request without a callback', function (done) { + + var server = Http.createServer(function (req, res) { + + res.end('ok'); + }); + + server.once('listening', function () { + + Wreck.request('get', 'http://127.0.0.1:' + server.address().port); + done(); + }); + + server.listen(0); + }); + + it('requests can be aborted', function (done) { + + var server = Http.createServer(function (req, res) { + + res.writeHead(200); + res.end(); + }); + + server.listen(0, function () { + + var req = Wreck.request('get', 'http://localhost:' + server.address().port, {}, function (err) { + + expect(err).to.exist(); + expect(err.code).to.equal('ECONNRESET'); + done(); + }); + + req.abort(); + }); + }); + + it('request shortcuts can be aborted', function (done) { + + var server = Http.createServer(function (req, res) { + + res.writeHead(200); + res.end(); + }); + + server.listen(0, function () { + + var req = Wreck.get('http://localhost:' + server.address().port, function (err) { + + expect(err).to.exist(); + expect(err.code).to.equal('ECONNRESET'); + done(); + }); + + req.abort(); + }); + }); + + it('uses agent option', function (done) { + + var agent = new Http.Agent(); + expect(Object.keys(agent.sockets).length).to.equal(0); + + Wreck.request('get', 'http://localhost/', { agent: agent }, function (err, res) { + + expect(Object.keys(agent.sockets).length).to.equal(1); + done(); + }); + }); + + it('pooling can be disabled by setting agent to false', function (done) { + + var complete; + + var server = Http.createServer(function (req, res) { + + res.writeHead(200); + res.write('foo'); + + complete = complete || function () { + + res.end(); + }; + }); + + server.listen(0, function () { + + + Wreck.request('get', 'http://localhost:' + server.address().port, { agent: false, timeout: 15 }, function (err, res) { + + expect(err).to.not.exist(); + expect(Object.keys(Wreck.agents.http.sockets).length).to.equal(0); + expect(Object.keys(Wreck.agents.http.requests).length).to.equal(0); + + Wreck.request('get', 'http://localhost:' + server.address().port + '/thatone', { agent: false, timeout: 15 }, function (err, innerRes) { + + expect(err).to.not.exist(); + + expect(Object.keys(Wreck.agents.http.sockets).length).to.equal(0); + expect(Object.keys(Wreck.agents.http.requests).length).to.equal(0); + + complete(); + + Wreck.read(res, null, function () { + + setTimeout(function () { + + expect(Object.keys(Wreck.agents.http.sockets).length).to.equal(0); + expect(Object.keys(Wreck.agents.http.requests).length).to.equal(0); + + done(); + }, 100); + }); + }); + }); + }); + }); + + it('requests payload in buffer', function (done) { + + var server = Http.createServer(function (req, res) { + + res.writeHead(200, { 'Content-Type': 'text/plain' }); + req.pipe(res); + }); + + server.listen(0, function () { + + var buf = new Buffer(payload, 'ascii'); + + Wreck.request('post', 'http://localhost:' + server.address().port, { payload: buf }, function (err, res) { + + expect(err).to.not.exist(); + Wreck.read(res, null, function (err, body) { + + expect(err).to.not.exist(); + expect(body.toString()).to.equal(payload); + server.close(); + done(); + }); + }); + }); + }); + + it('requests head method', function (done) { + + var server = Http.createServer(function (req, res) { + + res.writeHead(200); + req.pipe(res); + }); + + server.listen(0, function () { + + var buf = new Buffer(payload, 'ascii'); + + Wreck.request('head', 'http://localhost:' + server.address().port, { payload: null }, function (err, res) { + + expect(err).to.not.exist(); + Wreck.read(res, null, function (err, body) { + + expect(err).to.not.exist(); + expect(body.toString()).to.equal(''); + server.close(); + done(); + }); + }); + }); + }); + + it('post null payload', function (done) { + + var server = Http.createServer(function (req, res) { + res.statusCode = 500; + res.end(); + }); + + server.listen(0, function () { + + Wreck.request('post', 'http://localhost:' + server.address().port, { headers: { connection: 'close' }, payload: null }, function (err, res) { + + expect(err).to.not.exist(); + Wreck.read(res, null, function (err, body) { + + expect(err).to.not.exist(); + expect(body.toString()).to.equal(''); + server.close(); + done(); + }); + }); + }); + }); + + it('handles read timeout', function (done) { + + var server = Http.createServer(function (req, res) { + + setTimeout(function () { + + res.writeHead(200); + res.write(payload); + res.end(); + }, 2000); + }); + + server.listen(0, function () { + + Wreck.request('get', 'http://localhost:' + server.address().port, { timeout: 100 }, function (err, res) { + + expect(err).to.exist(); + expect(err.output.statusCode).to.equal(504); + done(); + }); + }); + }); + + it('cleans socket on agent deferred read timeout', function (done) { + + var complete; + + var server = Http.createServer(function (req, res) { + + res.writeHead(200); + res.write('foo'); + + complete = complete || function () { + + res.end(); + }; + }); + + server.listen(0, function () { + + var agent = new Http.Agent({ maxSockets: 1 }); + expect(Object.keys(agent.sockets).length).to.equal(0); + + Wreck.request('get', 'http://localhost:' + server.address().port, { agent: agent, timeout: 15 }, function (err, res) { + + expect(err).to.not.exist(); + expect(Object.keys(agent.sockets).length).to.equal(1); + expect(Object.keys(agent.requests).length).to.equal(0); + + Wreck.request('get', 'http://localhost:' + server.address().port + '/thatone', { agent: agent, timeout: 15 }, function (err, innerRes) { + + expect(err).to.exist(); + expect(err.output.statusCode).to.equal(504); + + expect(Object.keys(agent.sockets).length).to.equal(1); + expect(Object.keys(agent.requests).length).to.equal(1); + + complete(); + + Wreck.read(res, null, function () { + + setTimeout(function () { + + expect(Object.keys(agent.sockets).length).to.equal(0); + expect(Object.keys(agent.requests).length).to.equal(0); + + done(); + }, 100); + }); + }); + }); + }); + }); + + it('defaults maxSockets to Infinity', function (done) { + + var server = Http.createServer(function (req, res) { + + res.writeHead(200); + res.write(payload); + res.end(); + }); + + server.listen(0, function () { + + Wreck.request('get', 'http://localhost:' + server.address().port, { timeout: 100 }, function (err, res) { + + expect(err).to.not.exist(); + expect(res.statusCode).to.equal(200); + expect(Wreck.agents.http.maxSockets).to.equal(Infinity); + done(); + }); + }); + }); + + it('maxSockets on default agents can be changed', function (done) { + + var complete; + + var server = Http.createServer(function (req, res) { + + res.writeHead(200); + res.write('foo'); + + complete = complete || function () { + + res.end(); + }; + }); + + server.listen(0, function () { + + Wreck.agents.http.maxSockets = 1; + + Wreck.request('get', 'http://localhost:' + server.address().port, { timeout: 15 }, function (err, res) { + + expect(err).to.not.exist(); + + Wreck.request('get', 'http://localhost:' + server.address().port + '/thatone', { timeout: 15 }, function (err, innerRes) { + + expect(err).to.exist(); + expect(err.output.statusCode).to.equal(504); + + complete(); + + Wreck.read(res, null, function () { + + Wreck.agents.http.maxSockets = Infinity; + done(); + }); + }); + }); + }); + }); +}); + +describe('read()', function () { + + it('handles errors with a boom response', function (done) { + + var res = new Events.EventEmitter(); + res.pipe = function () { }; + + Wreck.read(res, null, function (err) { + + expect(err.isBoom).to.equal(true); + done(); + }); + + res.emit('error', new Error('my error')); + }); + + it('handles responses that close early', function (done) { + + var res = new Events.EventEmitter(); + res.pipe = function () { }; + + Wreck.read(res, null, function (err) { + + expect(err.isBoom).to.equal(true); + done(); + }); + + res.emit('close'); + }); + + it('times out when stream read takes too long', function (done) { + + var server = Http.createServer(function (req, res) { + + res.writeHead(200, { 'Content-Type': 'text/plain' }); + res.write(payload); + }); + + server.listen(0, function () { + + Wreck.request('get', 'http://localhost:' + server.address().port, {}, function (err, res) { + + expect(err).to.not.exist(); + Wreck.read(res, { timeout: 100 }, function (err, body) { + + expect(err).to.exist(); + expect(err.output.statusCode).to.equal(408); + expect(body).to.not.exist(); + server.close(); + done(); + }); + }); + }); + }); + + it('errors when stream is too big', function (done) { + + var server = Http.createServer(function (req, res) { + + res.writeHead(200, { 'Content-Type': 'text/plain' }); + res.write(payload); + res.end(payload); + }); + + server.listen(0, function () { + + Wreck.request('get', 'http://localhost:' + server.address().port, {}, function (err, res) { + + expect(err).to.not.exist(); + Wreck.read(res, { maxBytes: 120 }, function (err, body) { + + expect(err).to.exist(); + expect(err.output.statusCode).to.equal(400); + expect(body).to.not.exist(); + server.close(); + done(); + }); + }); + }); + }); + + it('reads a file streamed via HTTP', function (done) { + + var path = Path.join(__dirname, '../images/wreck.png'); + var stats = Fs.statSync(path); + var fileStream = Fs.createReadStream(path); + + var server = Http.createServer(function (req, res) { + + res.writeHead(200); + fileStream.pipe(res); + }); + + server.listen(0, function () { + + Wreck.request('get', 'http://localhost:' + server.address().port, {}, function (err, res) { + + expect(err).to.not.exist(); + expect(res.statusCode).to.equal(200); + + Wreck.read(res, null, function (err, body) { + + expect(body.length).to.equal(stats.size); + server.close(); + done(); + }); + }); + }); + }); + + it('reads a multiple buffers response', function (done) { + + var path = Path.join(__dirname, '../images/wreck.png'); + var stats = Fs.statSync(path); + var file = Fs.readFileSync(path); + + var server = Http.createServer(function (req, res) { + + res.writeHead(200); + res.write(file); + setTimeout(function () { + + res.write(file); + res.end(); + }, 100); + }); + + server.listen(0, function () { + + Wreck.request('get', 'http://localhost:' + server.address().port, {}, function (err, res) { + + expect(err).to.not.exist(); + expect(res.statusCode).to.equal(200); + + Wreck.read(res, null, function (err, body) { + + expect(body.length).to.equal(stats.size * 2); + server.close(); + done(); + }); + }); + }); + }); + + it('writes a file streamed via HTTP', function (done) { + + var path = Path.join(__dirname, '../images/wreck.png'); + var stats = Fs.statSync(path); + var fileStream = Fs.createReadStream(path); + + var server = Http.createServer(function (req, res) { + + res.writeHead(200); + + Wreck.read(req, null, function (err, body) { + + res.end(body); + }); + }); + + server.listen(0, function () { + + Wreck.request('post', 'http://localhost:' + server.address().port, { payload: fileStream }, function (err, res) { + + expect(err).to.not.exist(); + expect(res.statusCode).to.equal(200); + + Wreck.read(res, null, function (err, body) { + + expect(body.length).to.equal(stats.size); + server.close(); + done(); + }); + }); + }); + }); + + it('handles responses with no headers', function (done) { + + var res = Wreck.toReadableStream(payload); + Wreck.read(res, { json: true }, function (err) { + + expect(err).to.equal(null); + done(); + }); + }); + +}); + +describe('parseCacheControl()', function () { + + it('parses valid header', function (done) { + + var header = Wreck.parseCacheControl('must-revalidate, max-age=3600'); + expect(header).to.exist(); + expect(header['must-revalidate']).to.equal(true); + expect(header['max-age']).to.equal(3600); + done(); + }); + + it('parses valid header with quoted string', function (done) { + + var header = Wreck.parseCacheControl('must-revalidate, max-age="3600"'); + expect(header).to.exist(); + expect(header['must-revalidate']).to.equal(true); + expect(header['max-age']).to.equal(3600); + done(); + }); + + it('errors on invalid header', function (done) { + + var header = Wreck.parseCacheControl('must-revalidate, b =3600'); + expect(header).to.not.exist(); + done(); + }); + + it('errors on invalid max-age', function (done) { + + var header = Wreck.parseCacheControl('must-revalidate, max-age=a3600'); + expect(header).to.not.exist(); + done(); + }); +}); + +describe('Shortcut', function () { + + it('get request', function (done) { + + var server = Http.createServer(function (req, res) { + + res.writeHead(200); + res.end('ok'); + }); + + server.listen(0, function () { + + Wreck.get('http://localhost:' + server.address().port, function (err, res, payload) { + + expect(err).to.not.exist(); + expect(res.statusCode).to.equal(200); + expect(payload).to.equal('ok'); + server.close(); + done(); + }); + }); + }); + + it('post request', function (done) { + + var server = Http.createServer(function (req, res) { + + res.writeHead(200); + res.end('ok'); + }); + + server.listen(0, function () { + + Wreck.post('http://localhost:' + server.address().port, { payload: '123' }, function (err, res, payload) { + + expect(err).to.not.exist(); + expect(res.statusCode).to.equal(200); + expect(payload).to.equal('ok'); + server.close(); + done(); + }); + }); + }); + + it('put request', function (done) { + + var server = Http.createServer(function (req, res) { + + res.writeHead(200); + res.end('ok'); + }); + + server.listen(0, function () { + + Wreck.put('http://localhost:' + server.address().port, function (err, res, payload) { + + expect(err).to.not.exist(); + expect(res.statusCode).to.equal(200); + expect(payload).to.equal('ok'); + server.close(); + done(); + }); + }); + }); + + it('delete request', function (done) { + + var server = Http.createServer(function (req, res) { + + res.writeHead(200); + res.end('ok'); + }); + + server.listen(0, function () { + + Wreck.delete('http://localhost:' + server.address().port, function (err, res, payload) { + + expect(err).to.not.exist(); + expect(res.statusCode).to.equal(200); + expect(payload).to.equal('ok'); + server.close(); + done(); + }); + }); + }); + + it('errors on bad request', function (done) { + + var server = Http.createServer(function (req, res) { + + res.writeHead(200); + res.end('ok'); + }); + + server.listen(0, function () { + + var port = server.address().port; + server.close(); + + Wreck.get('http://localhost:' + port, function (err, res, payload) { + + expect(err).to.exist(); + done(); + }); + }); + }); +}); + +describe('json', function () { + + it('json requested and received', function (done) { + + var server = Http.createServer(function (req, res) { + + res.writeHead(200, { 'Content-Type': 'application/json' }); + res.end(JSON.stringify({ foo: 'bar' })); + }); + + server.listen(0, function () { + + var port = server.address().port; + var options = { + json: true + }; + + Wreck.get('http://localhost:' + port, options, function (err, res, payload) { + + expect(err).to.not.exist(); + expect(res.statusCode).to.equal(200); + expect(payload).to.not.equal(null); + expect(payload.foo).to.exist(); + server.close(); + done(); + }); + }); + }); + + it('json requested but not received - flag is ignored', function (done) { + + var server = Http.createServer(function (req, res) { + + res.writeHead(200); + res.end('ok'); + }); + + server.listen(0, function () { + + var port = server.address().port; + var options = { + json: true + }; + + Wreck.get('http://localhost:' + port, options, function (err, res, payload) { + + expect(err).to.not.exist(); + expect(res.statusCode).to.equal(200); + expect(payload).to.not.equal(null); + server.close(); + done(); + }); + }); + }); + + it('invalid json received', function (done) { + + var server = Http.createServer(function (req, res) { + + res.writeHead(200, { 'Content-Type': 'application/json' }); + res.end('ok'); + }); + + server.listen(0, function () { + + var port = server.address().port; + var options = { + json: true + }; + + Wreck.get('http://localhost:' + port, options, function (err, res, payload) { + + expect(err).to.exist(); + server.close(); + done(); + }); + }); + }); + + it('json not requested but received as string', function (done) { + + var server = Http.createServer(function (req, res) { + + res.writeHead(200, { 'Content-Type': 'application/json' }); + res.end(JSON.stringify({ foo: 'bar' })); + }); + + server.listen(0, function () { + + var port = server.address().port; + var options = { + json: false + }; + + Wreck.get('http://localhost:' + port, options, function (err, res, payload) { + + expect(err).to.not.exist(); + expect(res.statusCode).to.equal(200); + expect(payload).to.not.equal(null); + server.close(); + done(); + }); + }); + }); + + it('should not be parsed on empty buffer', function (done) { + + var server = Http.createServer(function (req, res) { + + res.writeHead(204, { 'Content-Type': 'application/json' }); + res.end(); + }); + + server.listen(0, function () { + + var port = server.address().port; + var options = { + json: 'SMART' + }; + + Wreck.get('http://localhost:' + port, options, function (err, res, payload) { + + expect(err).to.not.exist(); + expect(res.statusCode).to.equal(204); + expect(payload).to.equal(null); + server.close(); + done(); + }); + }); + }); + + it('will try to parse json in "force" mode, regardless of the header', function (done) { + + var server = Http.createServer(function (req, res) { + + res.writeHead(200, { 'Content-Type': 'text/plain' }); + res.end(JSON.stringify({ foo: 'bar' })); + }); + + server.listen(0, function () { + + var port = server.address().port; + var options = { + json: 'force' + }; + + Wreck.get('http://localhost:' + port, options, function (err, res, payload) { + + expect(err).to.not.exist(); + expect(res.statusCode).to.equal(200); + expect(payload).to.not.equal(null); + expect(payload).to.deep.equal({ + foo: 'bar' + }); + server.close(); + done(); + }); + }); + }); + + it('will error on invalid json received in "force" mode', function (done) { + + var server = Http.createServer(function (req, res) { + + res.writeHead(200, { 'Content-Type': 'text/plain' }); + res.end('ok'); + }); + + server.listen(0, function () { + + var port = server.address().port; + var options = { + json: 'force' + }; + + Wreck.get('http://localhost:' + port, options, function (err, res, payload) { + + expect(err).to.exist(); + server.close(); + done(); + }); + }); + }); +}); + +describe('toReadableStream()', function () { + + it('handle empty payload', function (done) { + + var stream = Wreck.toReadableStream(); + expect(stream instanceof Stream).to.be.true; + var read = stream.read(); // Make sure read has no problems + expect(read).to.be.null; + done(); + }); + + it('handle explicit encoding', function (done) { + + var data = 'Hello'; + var buf = new Buffer(data, 'ascii'); + var stream = Wreck.toReadableStream(data, 'ascii'); + expect(stream instanceof Stream).to.be.true; + var read = stream.read(); + expect(read.toString()).to.equal(data); + done(); + }); + + it('chunks to requested size', function (done) { + var buf; + var data = new Array(101).join('0123456789'); + var stream = Wreck.toReadableStream(data); + + buf = stream.read(100); + expect(buf.length).to.equal(100); + + buf = stream.read(400); + expect(buf.length).to.equal(400); + + buf = stream.read(); + expect(buf.length).to.equal(500); + + buf = stream.read(); + expect(buf).to.equal(null); + + done(); + }); +}); diff --git a/node_modules/hapi/npm-shrinkwrap.json b/node_modules/hapi/npm-shrinkwrap.json new file mode 100755 index 0000000..71c49d6 --- /dev/null +++ b/node_modules/hapi/npm-shrinkwrap.json @@ -0,0 +1,117 @@ +{ + "name": "hapi", + "version": "8.4.0", + "dependencies": { + "accept": { + "version": "1.0.0" + }, + "ammo": { + "version": "1.0.0" + }, + "boom": { + "version": "2.6.1" + }, + "call": { + "version": "2.0.1" + }, + "catbox": { + "version": "4.2.2" + }, + "catbox-memory": { + "version": "1.1.1" + }, + "cryptiles": { + "version": "2.0.4" + }, + "h2o2": { + "version": "4.0.0" + }, + "heavy": { + "version": "3.0.0" + }, + "hoek": { + "version": "2.11.1" + }, + "inert": { + "version": "2.1.4", + "dependencies": { + "lru-cache": { + "version": "2.5.0" + } + } + }, + "iron": { + "version": "2.1.2" + }, + "items": { + "version": "1.1.0" + }, + "joi": { + "version": "6.0.8", + "dependencies": { + "isemail": { + "version": "1.1.1" + }, + "moment": { + "version": "2.9.0" + } + } + }, + "kilt": { + "version": "1.1.1" + }, + "mimos": { + "version": "2.0.2", + "dependencies": { + "mime-db": { + "version": "1.7.0" + } + } + }, + "peekaboo": { + "version": "1.0.0" + }, + "qs": { + "version": "2.4.0" + }, + "shot": { + "version": "1.4.2" + }, + "statehood": { + "version": "2.0.0" + }, + "subtext": { + "version": "1.0.2", + "dependencies": { + "content": { + "version": "1.0.1" + }, + "pez": { + "version": "1.0.0", + "dependencies": { + "b64": { + "version": "2.0.0" + }, + "nigel": { + "version": "1.0.1", + "dependencies": { + "vise": { + "version": "1.0.0" + } + } + } + } + } + } + }, + "topo": { + "version": "1.0.2" + }, + "vision": { + "version": "2.0.0" + }, + "wreck": { + "version": "5.2.0" + } + } +} diff --git a/node_modules/hapi/package.json b/node_modules/hapi/package.json new file mode 100755 index 0000000..7ccc35c --- /dev/null +++ b/node_modules/hapi/package.json @@ -0,0 +1,69 @@ +{ + "name": "hapi", + "description": "HTTP Server framework", + "homepage": "http://hapijs.com", + "version": "8.4.0", + "repository": { + "type": "git", + "url": "git://github.com/hapijs/hapi" + }, + "main": "index", + "keywords": [ + "framework", + "http", + "api", + "router" + ], + "engines": { + "node": ">=0.10.32" + }, + "dependencies": { + "accept": "1.x.x", + "ammo": "1.x.x", + "boom": "^2.5.x", + "call": "2.x.x", + "catbox": "^4.2.x", + "catbox-memory": "1.x.x", + "cryptiles": "2.x.x", + "h2o2": "4.x.x", + "heavy": "3.x.x", + "hoek": "^2.10.x", + "inert": "2.x.x", + "iron": "2.x.x", + "items": "1.x.x", + "joi": "6.x.x", + "kilt": "^1.1.x", + "mimos": "2.x.x", + "peekaboo": "1.x.x", + "qs": "2.x.x", + "shot": "1.x.x", + "statehood": "2.x.x", + "subtext": "1.x.x", + "topo": "1.x.x", + "vision": "2.x.x" + }, + "devDependencies": { + "bluebird": "2.x.x", + "code": "1.x.x", + "handlebars": "2.x.x", + "lab": "5.x.x", + "wreck": "5.x.x" + }, + "scripts": { + "test": "node node_modules/lab/bin/lab -a code -t 100 -L", + "test-tap": "node node_modules/lab/bin/lab -a code -r tap -o tests.tap" + }, + "licenses": [ + { + "type": "BSD", + "url": "http://github.com/hapijs/hapi/raw/master/LICENSE" + } + ], + "readme": "\n\n### Web and services application framework\n\nLead Maintainer: [Eran Hammer](https://github.com/hueniverse)\n\n**hapi** is a simple to use configuration-centric framework with built-in support for input validation, caching,\nauthentication, and other essential facilities for building web and services applications. **hapi** enables\ndevelopers to focus on writing reusable application in a highly modular and prescriptive approach. \n\nDevelopment version: **8.4.x** ([release notes](https://github.com/hapijs/hapi/issues?labels=release+notes&page=1&state=closed)) \n[![Build Status](https://secure.travis-ci.org/hapijs/hapi.svg)](http://travis-ci.org/hapijs/hapi)\n\nFor the latest updates and release information visit [hapijs.com](http://hapijs.com) and follow [@hapijs](https://twitter.com/hapijs) on twitter. If you have questions, please open an issue in the\n[discussion forum](https://github.com/hapijs/discuss).\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/hapijs/hapi/issues" + }, + "_id": "hapi@8.4.0", + "_from": "hapi@" +} diff --git a/node_modules/hapi/test/.hidden b/node_modules/hapi/test/.hidden new file mode 100755 index 0000000..c889117 --- /dev/null +++ b/node_modules/hapi/test/.hidden @@ -0,0 +1 @@ +Ssssh! diff --git a/node_modules/hapi/test/auth.js b/node_modules/hapi/test/auth.js new file mode 100755 index 0000000..1d3250e --- /dev/null +++ b/node_modules/hapi/test/auth.js @@ -0,0 +1,1353 @@ +// Load modules + +var Path = require('path'); +var Boom = require('boom'); +var Code = require('code'); +var Handlebars = require('handlebars'); +var Hapi = require('..'); +var Hoek = require('hoek'); +var Lab = require('lab'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('authentication', function () { + + it('requires and authenticates a request', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { steve: {} } }); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(request.auth.credentials.user); } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(401); + + server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + }); + + it('defaults cache to private if request authenticated', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { steve: {} } }); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok').ttl(1000); } }); + + server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.headers['cache-control']).to.equal('max-age=1, must-revalidate, private'); + done(); + }); + }); + + describe('strategy()', function () { + + it('fails when options default to null', function (done) { + + var server = new Hapi.Server({ debug: false }); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(request.auth.credentials.user); } }); + + server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { + + expect(res.statusCode).to.equal(500); + done(); + }); + }); + + it('throws when strategy missing scheme', function (done) { + + var server = new Hapi.Server(); + server.connection(); + expect(function () { + + server.auth.strategy('none'); + }).to.throw('Authentication strategy none missing scheme'); + done(); + }); + + it('adds a route to server', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { steve: {} }, route: true }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(401); + + server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + }); + + it('uses views', function (done) { + + var implementation = function (server, options) { + + server.views({ + engines: { 'html': Handlebars }, + relativeTo: Path.join(__dirname, '/templates/plugin') + }); + + var handler = function (request, reply) { + + return reply.view('test', { message: 'steve' }); + }; + + server.route({ method: 'GET', path: '/view', handler: handler, config: { auth: false } }); + + return { + authenticate: function (request, reply) { + + return reply.view('test', { message: 'xyz' }); + } + }; + }; + + var server = new Hapi.Server(); + server.connection(); + + server.views({ + engines: { 'html': Handlebars }, + relativeTo: Path.join(__dirname, '/no/such/directory') + }); + + server.auth.scheme('custom', implementation); + server.auth.strategy('default', 'custom', true); + + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(); } }); + + server.inject('/view', function (res) { + + expect(res.result).to.equal('

steve

'); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result).to.equal('

xyz

'); + done(); + }); + }); + }); + }); + + describe('default()', function () { + + it('sets default', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', { users: { steve: {} } }); + + server.auth.default('default'); + expect(server.connections[0].auth.settings.default).to.deep.equal({ strategies: ['default'], mode: 'required' }); + + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(request.auth.credentials.user); } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(401); + + server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + }); + + it('sets default with object', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', { users: { steve: {} } }); + server.auth.default({ strategy: 'default' }); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(request.auth.credentials.user); } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(401); + + server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + }); + + it('throws when setting default twice', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', { users: { steve: {} } }); + expect(function () { + + server.auth.default('default'); + server.auth.default('default'); + }).to.throw('Cannot set default strategy more than once'); + done(); + }); + + it('throws when setting default without strategy', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', { users: { steve: {} } }); + expect(function () { + + server.auth.default({ mode: 'required' }); + }).to.throw('Default authentication strategy missing strategy name'); + done(); + }); + }); + + describe('_setupRoute()', function () { + + it('throws when route refers to nonexistent strategy', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('a', 'custom', { users: { steve: {} } }); + server.auth.strategy('b', 'custom', { users: { steve: {} } }); + + expect(function () { + + server.route({ + path: '/', + method: 'GET', + config: { + auth: { + strategy: 'c' + }, + handler: function (request, reply) { + + return reply('ok'); + } + } + }); + }).to.throw('Unknown authentication strategy: c in path: /'); + + done(); + }); + }); + + describe('authenticate()', function () { + + it('setups route with optional authentication', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { steve: {} } }); + + var handler = function (request, reply) { + + return reply(!!request.auth.credentials); + }; + server.route({ method: 'GET', path: '/', config: { handler: handler, auth: { mode: 'optional' } } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.payload).to.equal('false'); + + server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.payload).to.equal('true'); + done(); + }); + }); + }); + + it('exposes mode', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { steve: {} } }); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(request.auth.mode); } }); + + server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result).to.equal('required'); + done(); + }); + }); + + it('authenticates using multiple strategies', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('first', 'custom', { users: { steve: 'skip' } }); + server.auth.strategy('second', 'custom', { users: { steve: {} } }); + server.route({ + method: 'GET', + path: '/', + config: { + handler: function (request, reply) { return reply(request.auth.strategy); }, + auth: { + strategies: ['first', 'second'] + } + } + }); + + server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result).to.equal('second'); + done(); + }); + }); + + it('authenticates using credentials object', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { steve: {} } }); + + var doubleHandler = function (request, reply) { + + var options = { url: '/2', credentials: request.auth.credentials }; + server.inject(options, function (res) { + + return reply(res.result); + }); + }; + + server.route({ method: 'GET', path: '/1', handler: doubleHandler }); + server.route({ method: 'GET', path: '/2', handler: function (request, reply) { return reply(request.auth.credentials.user); } }); + + server.inject({ url: '/1', headers: { authorization: 'Custom steve' } }, function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('authenticates a request with custom auth settings', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { steve: {} } }); + server.route({ + method: 'GET', + path: '/', + config: { + handler: function (request, reply) { return reply(request.auth.credentials.user); }, + auth: { + strategy: 'default' + } + } + }); + + server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('authenticates a request with auth strategy name config', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', { users: { steve: {} } }); + server.route({ + method: 'GET', + path: '/', + config: { + handler: function (request, reply) { return reply(request.auth.credentials.user); }, + auth: 'default' + } + }); + + server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('tries to authenticate a request', function (done) { + + var handler = function (request, reply) { + + return reply({ status: request.auth.isAuthenticated, error: request.auth.error }); + }; + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', 'try', { users: { steve: {} } }); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result.status).to.equal(false); + expect(res.result.error.message).to.equal('Missing authentication'); + + server.inject({ url: '/', headers: { authorization: 'Custom john' } }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result.status).to.equal(false); + expect(res.result.error.message).to.equal('Missing credentials'); + + server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result.status).to.equal(true); + expect(res.result.error).to.not.exist(); + done(); + }); + }); + }); + }); + + it('errors on invalid authenticate callback missing both error and credentials', function (done) { + + var server = new Hapi.Server({ debug: false }); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { steve: {} } }); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(request.auth.credentials.user); } }); + + server.inject({ url: '/', headers: { authorization: 'Custom' } }, function (res) { + + expect(res.statusCode).to.equal(500); + done(); + }); + }); + + it('logs error', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { steve: {} } }); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(request.auth.credentials.user); } }); + + server.on('request-internal', function (request, event, tags) { + + if (tags.auth) { + done(); + } + }); + + server.inject({ url: '/', headers: { authorization: 'Custom john' } }, function (res) { + + expect(res.statusCode).to.equal(401); + }); + }); + + it('returns a non Error error response', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { message: 'in a bottle' } }); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(request.auth.credentials.user); } }); + + server.inject({ url: '/', headers: { authorization: 'Custom message' } }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result).to.equal('in a bottle'); + done(); + }); + }); + + it('handles errors thrown inside authenticate', function (done) { + + var server = new Hapi.Server({ debug: false }); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { steve: 'throw' } }); + + server.once('request-error', function (request, err) { + + expect(err.message).to.equal('Uncaught error: Boom'); + }); + + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok'); } }); + + server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { + + expect(res.statusCode).to.equal(500); + done(); + }); + }); + + it('passes non Error error response when set to try ', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', 'try', { users: { message: 'in a bottle' } }); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok'); } }); + + server.inject({ url: '/', headers: { authorization: 'Custom message' } }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result).to.equal('in a bottle'); + done(); + }); + }); + + it('matches scope (array to single)', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { steve: { scope: ['one'] } } }); + server.route({ + method: 'GET', + path: '/', + config: { + handler: function (request, reply) { return reply(request.auth.credentials.user); }, + auth: { + scope: 'one' + } + } + }); + + server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('matches scope (array to array)', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { steve: { scope: ['one', 'two'] } } }); + server.route({ + method: 'GET', + path: '/', + config: { + handler: function (request, reply) { return reply(request.auth.credentials.user); }, + auth: { + scope: ['one', 'three'] + } + } + }); + + server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('matches scope (single to array)', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { steve: { scope: 'one' } } }); + server.route({ + method: 'GET', + path: '/', + config: { + handler: function (request, reply) { return reply(request.auth.credentials.user); }, + auth: { + scope: ['one', 'three'] + } + } + }); + + server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('matches scope (single to single)', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { steve: { scope: 'one' } } }); + server.route({ + method: 'GET', + path: '/', + config: { + handler: function (request, reply) { return reply(request.auth.credentials.user); }, + auth: { + scope: 'one' + } + } + }); + + server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('does not match scope (single to single)', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { steve: { scope: 'one' } } }); + server.route({ + method: 'GET', + path: '/', + config: { + handler: function (request, reply) { return reply(request.auth.credentials.user); }, + auth: { + scope: 'onex' + } + } + }); + + server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { + + expect(res.statusCode).to.equal(403); + done(); + }); + }); + + it('errors on missing scope', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { steve: { scope: ['a'] } } }); + server.route({ + method: 'GET', + path: '/', + config: { + handler: function (request, reply) { return reply(request.auth.credentials.user); }, + auth: { + scope: 'b' + } + } + }); + + server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { + + expect(res.statusCode).to.equal(403); + done(); + }); + }); + + it('errors on missing scope property', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { steve: {} } }); + server.route({ + method: 'GET', + path: '/', + config: { + handler: function (request, reply) { return reply(request.auth.credentials.user); }, + auth: { + scope: 'b' + } + } + }); + + server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { + + expect(res.statusCode).to.equal(403); + done(); + }); + }); + + it('errors on missing scope using arrays', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { steve: { scope: ['a', 'b'] } } }); + server.route({ + method: 'GET', + path: '/', + config: { + handler: function (request, reply) { return reply(request.auth.credentials.user); }, + auth: { + scope: ['c', 'd'] + } + } + }); + + server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { + + expect(res.statusCode).to.equal(403); + done(); + }); + }); + + it('ignores default scope when override set to null', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', { users: { steve: {} } }); + server.auth.default({ + strategy: 'default', + scope: 'one' + }); + + server.route({ + method: 'GET', + path: '/', + config: { + handler: function (request, reply) { return reply(request.auth.credentials.user); }, + auth: { + scope: false + } + } + }); + + server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('matches user entity', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { steve: { user: 'steve' } } }); + server.route({ + method: 'GET', + path: '/', + config: { + handler: function (request, reply) { return reply(request.auth.credentials.user); }, + auth: { + entity: 'user' + } + } + }); + + server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('errors on missing user entity', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { client: {} } }); + server.route({ + method: 'GET', + path: '/', + config: { + handler: function (request, reply) { return reply(request.auth.credentials.user); }, + auth: { + entity: 'user' + } + } + }); + + server.inject({ url: '/', headers: { authorization: 'Custom client' } }, function (res) { + + expect(res.statusCode).to.equal(403); + done(); + }); + }); + + it('matches app entity', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { client: {} } }); + server.route({ + method: 'GET', + path: '/', + config: { + handler: function (request, reply) { return reply(request.auth.credentials.user); }, + auth: { + entity: 'app' + } + } + }); + + server.inject({ url: '/', headers: { authorization: 'Custom client' } }, function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('errors on missing app entity', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { steve: { user: 'steve' } } }); + server.route({ + method: 'GET', + path: '/', + config: { + handler: function (request, reply) { return reply(request.auth.credentials.user); }, + auth: { + entity: 'app' + } + } + }); + + server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { + + expect(res.statusCode).to.equal(403); + done(); + }); + }); + + it('logs error code when authenticate returns a non-error error', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('test', function (server, options) { + + return { + authenticate: function (request, reply) { + + return reply('Redirecting ...').redirect('/test'); + } + }; + }); + + server.auth.strategy('test', 'test', true, {}); + + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('test'); } }); + + var result; + server.on('request-internal', function (request, event, tags) { + + if (tags.unauthenticated) { + result = event.data; + } + }); + + server.inject('/', function (res) { + + expect(result).to.equal(302); + done(); + }); + }); + }); + + describe('payload()', function () { + + it('authenticates request payload', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { validPayload: { payload: null } } }); + server.route({ + method: 'POST', + path: '/', + config: { + handler: function (request, reply) { return reply(request.auth.credentials.user); }, + auth: { + payload: 'required' + } + } + }); + + server.inject({ method: 'POST', url: '/', headers: { authorization: 'Custom validPayload' } }, function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('skips when scheme does not support it', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { validPayload: { payload: null } }, payload: false }); + server.route({ + method: 'POST', + path: '/', + config: { + handler: function (request, reply) { return reply(request.auth.credentials.user); } + } + }); + + server.inject({ method: 'POST', url: '/', headers: { authorization: 'Custom validPayload' } }, function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('authenticates request payload (required scheme)', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { validPayload: { payload: null } }, options: { payload: true } }); + server.route({ + method: 'POST', + path: '/', + config: { + handler: function (request, reply) { return reply(request.auth.credentials.user); }, + auth: {} + } + }); + + server.inject({ method: 'POST', url: '/', headers: { authorization: 'Custom validPayload' } }, function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('authenticates request payload (required scheme and required route)', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { validPayload: { payload: null } }, options: { payload: true } }); + server.route({ + method: 'POST', + path: '/', + config: { + handler: function (request, reply) { return reply(request.auth.credentials.user); }, + auth: { + payload: true + } + } + }); + + server.inject({ method: 'POST', url: '/', headers: { authorization: 'Custom validPayload' } }, function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('throws when scheme requires payload authentication and route conflicts', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { validPayload: { payload: null } }, options: { payload: true } }); + expect(function () { + + server.route({ + method: 'POST', + path: '/', + config: { + handler: function (request, reply) { return reply(request.auth.credentials.user); }, + auth: { + payload: 'optional' + } + } + }); + }).to.throw('Cannot set authentication payload to optional when a strategy requires payload validation /'); + done(); + }); + + it('throws when strategy does not support payload authentication', function (done) { + + var server = new Hapi.Server(); + server.connection(); + var implementation = function () { return { authenticate: internals.implementation().authenticate }; }; + + server.auth.scheme('custom', implementation); + server.auth.strategy('default', 'custom', true, {}); + expect(function () { + + server.route({ + method: 'POST', + path: '/', + config: { + handler: function (request, reply) { return reply(request.auth.credentials.user); }, + auth: { + payload: 'required' + } + } + }); + }).to.throw('Payload validation can only be required when all strategies support it in path: /'); + done(); + }); + + it('throws when no strategy supports optional payload authentication', function (done) { + + var server = new Hapi.Server(); + server.connection(); + var implementation = function () { return { authenticate: internals.implementation().authenticate }; }; + + server.auth.scheme('custom', implementation); + server.auth.strategy('default', 'custom', true, {}); + expect(function () { + + server.route({ + method: 'POST', + path: '/', + config: { + handler: function (request, reply) { return reply(request.auth.credentials.user); }, + auth: { + payload: 'optional' + } + } + }); + }).to.throw('Payload authentication requires at least one strategy with payload support in path: /'); + done(); + }); + + it('allows one strategy to supports optional payload authentication while another does not', function (done) { + + var server = new Hapi.Server(); + server.connection(); + var implementation = function () { return { authenticate: internals.implementation().authenticate }; }; + + server.auth.scheme('custom1', implementation); + server.auth.scheme('custom2', internals.implementation); + server.auth.strategy('default1', 'custom1', {}); + server.auth.strategy('default2', 'custom2', {}); + expect(function () { + + server.route({ + method: 'POST', + path: '/', + config: { + handler: function (request, reply) { return reply(request.auth.credentials.user); }, + auth: { + strategies: ['default2', 'default1'], + payload: 'optional' + } + } + }); + }).to.not.throw(); + done(); + }); + + it('skips request payload by default', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { skip: {} } }); + server.route({ + method: 'POST', + path: '/', + config: { + handler: function (request, reply) { return reply(request.auth.credentials.user); } + } + }); + + server.inject({ method: 'POST', url: '/', headers: { authorization: 'Custom skip' } }, function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('skips request payload when unauthenticated', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { skip: {} } }); + server.route({ + method: 'POST', + path: '/', + config: { + handler: function (request, reply) { return reply(); }, + auth: { + mode: 'try', + payload: 'required' + } + } + }); + + server.inject({ method: 'POST', url: '/' }, function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('skips optional payload', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { optionalPayload: { payload: Boom.unauthorized(null, 'Custom') } } }); + server.route({ + method: 'POST', + path: '/', + config: { + handler: function (request, reply) { return reply(request.auth.credentials.user); }, + auth: { + payload: 'optional' + } + } + }); + + server.inject({ method: 'POST', url: '/', headers: { authorization: 'Custom optionalPayload' } }, function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('errors on missing payload when required', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { optionalPayload: { payload: Boom.unauthorized(null, 'Custom') } } }); + server.route({ + method: 'POST', + path: '/', + config: { + handler: function (request, reply) { return reply(request.auth.credentials.user); }, + auth: { + payload: 'required' + } + } + }); + + server.inject({ method: 'POST', url: '/', headers: { authorization: 'Custom optionalPayload' } }, function (res) { + + expect(res.statusCode).to.equal(401); + done(); + }); + }); + + it('errors on invalid payload auth when required', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { optionalPayload: { payload: Boom.unauthorized() } } }); + server.route({ + method: 'POST', + path: '/', + config: { + handler: function (request, reply) { return reply(request.auth.credentials.user); }, + auth: { + payload: 'required' + } + } + }); + + server.inject({ method: 'POST', url: '/', headers: { authorization: 'Custom optionalPayload' } }, function (res) { + + expect(res.statusCode).to.equal(401); + done(); + }); + }); + + it('errors on invalid request payload (non error)', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { invalidPayload: { payload: 'Payload is invalid' } } }); + server.route({ + method: 'POST', + path: '/', + config: { + handler: function (request, reply) { return reply(request.auth.credentials.user); }, + auth: { + payload: 'required' + } + } + }); + + server.inject({ method: 'POST', url: '/', headers: { authorization: 'Custom invalidPayload' } }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result).to.equal('Payload is invalid'); + done(); + }); + }); + }); + + describe('response()', function () { + + it('fails on response error', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', true, { users: { steve: { response: Boom.internal() } } }); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(request.auth.credentials.user); } }); + + server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { + + expect(res.statusCode).to.equal(500); + done(); + }); + }); + }); + + describe('test()', function () { + + it('tests a request', function (done) { + + var handler = function (request, reply) { + + request.server.auth.test('default', request, function (err, credentials) { + + if (err) { + return reply({ status: false }); + } + + return reply({ status: true, user: credentials.name }); + }); + }; + + var server = new Hapi.Server(); + server.connection(); + server.auth.scheme('custom', internals.implementation); + server.auth.strategy('default', 'custom', { users: { steve: { name: 'steve' } } }); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result.status).to.equal(false); + + server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result.status).to.equal(true); + expect(res.result.user).to.equal('steve'); + done(); + }); + }); + }); + }); +}); + + +internals.implementation = function (server, options) { + + var settings = Hoek.clone(options); + + if (settings && + settings.route) { + + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(request.auth.credentials.user); } }); + } + + var scheme = { + authenticate: function (request, reply) { + + var req = request.raw.req; + var authorization = req.headers.authorization; + if (!authorization) { + return reply(Boom.unauthorized(null, 'Custom')); + } + + var parts = authorization.split(/\s+/); + if (parts.length !== 2) { + return reply.continue(); // Error without error or credentials + } + + var username = parts[1]; + var credentials = settings.users[username]; + + if (!credentials) { + return reply(Boom.unauthorized('Missing credentials', 'Custom')); + } + + if (credentials === 'skip') { + return reply(Boom.unauthorized(null, 'Custom')); + } + + if (credentials === 'throw') { + throw new Error('Boom'); + } + + if (typeof credentials === 'string') { + return reply(credentials); + } + + return reply.continue({ credentials: credentials }); + }, + response: function (request, reply) { + + if (request.auth.credentials.response) { + return reply(request.auth.credentials.response); + } + + return reply.continue(); + } + }; + + if (!settings || + settings.payload !== false) { + + scheme.payload = function (request, reply) { + + if (request.auth.credentials.payload) { + return reply(request.auth.credentials.payload); + } + + return reply.continue(); + }; + } + + if (settings && + settings.options) { + + scheme.options = settings.options; + } + + return scheme; +}; diff --git a/node_modules/hapi/test/connection.js b/node_modules/hapi/test/connection.js new file mode 100755 index 0000000..2776d61 --- /dev/null +++ b/node_modules/hapi/test/connection.js @@ -0,0 +1,1306 @@ +// Load modules + +var ChildProcess = require('child_process'); +var Fs = require('fs'); +var Http = require('http'); +var Https = require('https'); +var Net = require('net'); +var Os = require('os'); +var Path = require('path'); +var Boom = require('boom'); +var Code = require('code'); +var Handlebars = require('handlebars'); +var Hapi = require('..'); +var Hoek = require('hoek'); +var Lab = require('lab'); +var Wreck = require('wreck'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('Connection', function () { + + it('allows null port and host', function (done) { + + var server = new Hapi.Server(); + expect(function () { + + server.connection({ host: null, port: null }); + }).to.not.throw(); + done(); + }); + + it('removes duplicate labels', function (done) { + + var server = new Hapi.Server(); + server.connection({ labels: ['a', 'b', 'a', 'c', 'b'] }); + expect(server.connections[0].settings.labels).to.deep.equal(['a', 'b', 'c']); + done(); + }); + + it('throws when disabling autoListen and providing a port', function (done) { + + var server = new Hapi.Server(); + expect(function () { + + server.connection({ port: 80, autoListen: false }); + }).to.throw('Cannot specify port when autoListen is false'); + done(); + }); + + it('throws when disabling autoListen and providing special host', function (done) { + + var server = new Hapi.Server(); + var port = Path.join(__dirname, 'hapi-server.socket'); + expect(function () { + + server.connection({ port: port, autoListen: false }); + }).to.throw('Cannot specify port when autoListen is false'); + done(); + }); + + it('defaults address to 0.0.0.0 or :: when no host is provided', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.start(function () { + + var expectedBoundAddress = '0.0.0.0'; + if (Net.isIPv6(server.listener.address().address)) { + expectedBoundAddress = '::'; + } + + expect(server.info.address).to.equal(expectedBoundAddress); + done(); + }); + }); + + it('uses address when present instead of host', function (done) { + + var server = new Hapi.Server(); + server.connection({ host: 'no.such.domain.hapi', address: 'localhost' }); + server.start(function () { + + expect(server.info.host).to.equal('no.such.domain.hapi'); + expect(server.info.address).to.equal('127.0.0.1'); + done(); + }); + }); + + it('uses uri when present instead of host and port', function (done) { + + var server = new Hapi.Server(); + server.connection({ host: 'no.such.domain.hapi', address: 'localhost', uri: 'http://uri.example.com:8080' }); + expect(server.info.uri).to.equal('http://uri.example.com:8080'); + server.start(function () { + + expect(server.info.host).to.equal('no.such.domain.hapi'); + expect(server.info.address).to.equal('127.0.0.1'); + expect(server.info.uri).to.equal('http://uri.example.com:8080'); + done(); + }); + }); + + it('throws on uri ending with /', function (done) { + + var server = new Hapi.Server(); + expect(function () { + + server.connection({ uri: 'http://uri.example.com:8080/' }); + }).to.throw(/Invalid connection options/); + done(); + }); + + it('creates a server listening on a unix domain socket', { skip: process.platform === 'win32' }, function (done) { + + var port = Path.join(__dirname, 'hapi-server.socket'); + var server = new Hapi.Server(); + server.connection({ port: port }); + + expect(server.connections[0].type).to.equal('socket'); + + server.start(function () { + + var absSocketPath = Path.resolve(port); + expect(server.info.port).to.equal(absSocketPath); + server.stop(function () { + + if (Fs.existsSync(port)) { + Fs.unlinkSync(port); + } + done(); + }); + }); + }); + + it('creates a server listening on a windows named pipe', function (done) { + + var port = '\\\\.\\pipe\\6653e55f-26ec-4268-a4f2-882f4089315c'; + var server = new Hapi.Server(); + server.connection({ port: port }); + + expect(server.connections[0].type).to.equal('socket'); + + server.start(function () { + + expect(server.info.port).to.equal(port); + server.stop(function () { + + done(); + }); + }); + }); + + it('creates an https server when passed tls options', function (done) { + + var tlsOptions = { + key: '-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA0UqyXDCqWDKpoNQQK/fdr0OkG4gW6DUafxdufH9GmkX/zoKz\ng/SFLrPipzSGINKWtyMvo7mPjXqqVgE10LDI3VFV8IR6fnART+AF8CW5HMBPGt/s\nfQW4W4puvBHkBxWSW1EvbecgNEIS9hTGvHXkFzm4xJ2e9DHp2xoVAjREC73B7JbF\nhc5ZGGchKw+CFmAiNysU0DmBgQcac0eg2pWoT+YGmTeQj6sRXO67n2xy/hA1DuN6\nA4WBK3wM3O4BnTG0dNbWUEbe7yAbV5gEyq57GhJIeYxRvveVDaX90LoAqM4cUH06\n6rciON0UbDHV2LP/JaH5jzBjUyCnKLLo5snlbwIDAQABAoIBAQDJm7YC3pJJUcxb\nc8x8PlHbUkJUjxzZ5MW4Zb71yLkfRYzsxrTcyQA+g+QzA4KtPY8XrZpnkgm51M8e\n+B16AcIMiBxMC6HgCF503i16LyyJiKrrDYfGy2rTK6AOJQHO3TXWJ3eT3BAGpxuS\n12K2Cq6EvQLCy79iJm7Ks+5G6EggMZPfCVdEhffRm2Epl4T7LpIAqWiUDcDfS05n\nNNfAGxxvALPn+D+kzcSF6hpmCVrFVTf9ouhvnr+0DpIIVPwSK/REAF3Ux5SQvFuL\njPmh3bGwfRtcC5d21QNrHdoBVSN2UBLmbHUpBUcOBI8FyivAWJhRfKnhTvXMFG8L\nwaXB51IZAoGBAP/E3uz6zCyN7l2j09wmbyNOi1AKvr1WSmuBJveITouwblnRSdvc\nsYm4YYE0Vb94AG4n7JIfZLKtTN0xvnCo8tYjrdwMJyGfEfMGCQQ9MpOBXAkVVZvP\ne2k4zHNNsfvSc38UNSt7K0HkVuH5BkRBQeskcsyMeu0qK4wQwdtiCoBDAoGBANF7\nFMppYxSW4ir7Jvkh0P8bP/Z7AtaSmkX7iMmUYT+gMFB5EKqFTQjNQgSJxS/uHVDE\nSC5co8WGHnRk7YH2Pp+Ty1fHfXNWyoOOzNEWvg6CFeMHW2o+/qZd4Z5Fep6qCLaa\nFvzWWC2S5YslEaaP8DQ74aAX4o+/TECrxi0z2lllAoGAdRB6qCSyRsI/k4Rkd6Lv\nw00z3lLMsoRIU6QtXaZ5rN335Awyrfr5F3vYxPZbOOOH7uM/GDJeOJmxUJxv+cia\nPQDflpPJZU4VPRJKFjKcb38JzO6C3Gm+po5kpXGuQQA19LgfDeO2DNaiHZOJFrx3\nm1R3Zr/1k491lwokcHETNVkCgYBPLjrZl6Q/8BhlLrG4kbOx+dbfj/euq5NsyHsX\n1uI7bo1Una5TBjfsD8nYdUr3pwWltcui2pl83Ak+7bdo3G8nWnIOJ/WfVzsNJzj7\n/6CvUzR6sBk5u739nJbfgFutBZBtlSkDQPHrqA7j3Ysibl3ZIJlULjMRKrnj6Ans\npCDwkQKBgQCM7gu3p7veYwCZaxqDMz5/GGFUB1My7sK0hcT7/oH61yw3O8pOekee\nuctI1R3NOudn1cs5TAy/aypgLDYTUGQTiBRILeMiZnOrvQQB9cEf7TFgDoRNCcDs\nV/ZWiegVB/WY7H0BkCekuq5bHwjgtJTpvHGqQ9YD7RhE8RSYOhdQ/Q==\n-----END RSA PRIVATE KEY-----\n', + cert: '-----BEGIN CERTIFICATE-----\nMIIDBjCCAe4CCQDvLNml6smHlTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJV\nUzETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0\ncyBQdHkgTHRkMB4XDTE0MDEyNTIxMjIxOFoXDTE1MDEyNTIxMjIxOFowRTELMAkG\nA1UEBhMCVVMxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0\nIFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nANFKslwwqlgyqaDUECv33a9DpBuIFug1Gn8Xbnx/RppF/86Cs4P0hS6z4qc0hiDS\nlrcjL6O5j416qlYBNdCwyN1RVfCEen5wEU/gBfAluRzATxrf7H0FuFuKbrwR5AcV\nkltRL23nIDRCEvYUxrx15Bc5uMSdnvQx6dsaFQI0RAu9weyWxYXOWRhnISsPghZg\nIjcrFNA5gYEHGnNHoNqVqE/mBpk3kI+rEVzuu59scv4QNQ7jegOFgSt8DNzuAZ0x\ntHTW1lBG3u8gG1eYBMquexoSSHmMUb73lQ2l/dC6AKjOHFB9Ouq3IjjdFGwx1diz\n/yWh+Y8wY1Mgpyiy6ObJ5W8CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAoSc6Skb4\ng1e0ZqPKXBV2qbx7hlqIyYpubCl1rDiEdVzqYYZEwmst36fJRRrVaFuAM/1DYAmT\nWMhU+yTfA+vCS4tql9b9zUhPw/IDHpBDWyR01spoZFBF/hE1MGNpCSXXsAbmCiVf\naxrIgR2DNketbDxkQx671KwF1+1JOMo9ffXp+OhuRo5NaGIxhTsZ+f/MA4y084Aj\nDI39av50sTRTWWShlN+J7PtdQVA5SZD97oYbeUeL7gI18kAJww9eUdmT0nEjcwKs\nxsQT1fyKbo7AlZBY4KSlUMuGnn0VnAsB9b+LxtXlDfnjyM8bVQx1uAfRo0DO8p/5\n3J5DTjAU55deBQ==\n-----END CERTIFICATE-----\n' + }; + + var server = new Hapi.Server(); + server.connection({ tls: tlsOptions }); + expect(server.listener instanceof Https.Server).to.equal(true); + done(); + }); + + it('uses a provided listener', function (done) { + + var listener = Http.createServer(); + var server = new Hapi.Server(); + server.connection({ listener: listener }); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok'); } }); + + server.start(function () { + + Wreck.get('http://localhost:' + server.info.port + '/', {}, function (err, res, body) { + + server.stop(); + expect(err).to.not.exist(); + expect(body.toString()).to.equal('ok'); + done(); + }); + }); + }); + + it('uses a provided listener (TLS)', function (done) { + + var listener = Http.createServer(); + var server = new Hapi.Server(); + server.connection({ listener: listener, tls: true }); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok'); } }); + + server.start(function () { + + expect(server.info.protocol).to.equal('https'); + server.stop(); + done(); + }); + }); + + it('uses a provided listener with manual listen', function (done) { + + var listener = Http.createServer(); + var server = new Hapi.Server(); + server.connection({ listener: listener, autoListen: false }); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok'); } }); + + listener.listen(0, 'localhost', function () { + + server.start(function () { + + Wreck.get('http://localhost:' + server.info.port + '/', {}, function (err, res, body) { + + server.stop(); + expect(err).to.not.exist(); + expect(body.toString()).to.equal('ok'); + done(); + }); + }); + }); + }); + + it('sets info.uri with default localhost when no hostname', { parallel: false }, function (done) { + + var orig = Os.hostname; + Os.hostname = function () { + + Os.hostname = orig; + return ''; + }; + + var server = new Hapi.Server(); + server.connection({ port: 80 }); + expect(server.info.uri).to.equal('http://localhost:80'); + done(); + }); + + it('sets info.uri without port when 0', function (done) { + + var server = new Hapi.Server(); + server.connection({ host: 'example.com' }); + expect(server.info.uri).to.equal('http://example.com'); + done(); + }); + + it('closes connection on socket timeout', { parallel: false }, function (done) { + + var server = new Hapi.Server(); + server.connection({ routes: { timeout: { socket: 50 }, payload: { timeout: 45 } } }); + server.route({ + method: 'GET', path: '/', config: { + handler: function (request, reply) { + + setTimeout(function () { + + return reply('too late'); + }, 70); + } + } + }); + + server.start(function () { + + Wreck.request('GET', 'http://localhost:' + server.info.port + '/', {}, function (err, res) { + + server.stop(); + expect(err).to.exist(); + expect(err.message).to.equal('Client request error: socket hang up'); + done(); + }); + }); + }); + + it('disables node socket timeout', { parallel: false }, function (done) { + + var server = new Hapi.Server(); + server.connection({ routes: { timeout: { socket: false } } }); + server.route({ method: 'GET', path: '/', config: { handler: function (request, reply) { return reply(); } } }); + + server.start(function () { + + var timeout; + var orig = Net.Socket.prototype.setTimeout; + Net.Socket.prototype.setTimeout = function () { + + timeout = 'gotcha'; + Net.Socket.prototype.setTimeout = orig; + return orig.apply(this, arguments); + }; + + Wreck.request('GET', 'http://localhost:' + server.info.port + '/', {}, function (err, res) { + + server.stop(); + expect(err).to.not.exist(); + expect(timeout).to.equal('gotcha'); + done(); + }); + }); + }); + + describe('_start()', function () { + + it('starts connection', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.start(function () { + + var expectedBoundAddress = '0.0.0.0'; + if (Net.isIPv6(server.listener.address().address)) { + expectedBoundAddress = '::'; + } + + expect(server.info.host).to.equal(Os.hostname()); + expect(server.info.address).to.equal(expectedBoundAddress); + expect(server.info.port).to.be.a.number().and.above(1); + server.stop(); + done(); + }); + }); + + it('starts connection (tls)', function (done) { + + var tlsOptions = { + key: '-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA0UqyXDCqWDKpoNQQK/fdr0OkG4gW6DUafxdufH9GmkX/zoKz\ng/SFLrPipzSGINKWtyMvo7mPjXqqVgE10LDI3VFV8IR6fnART+AF8CW5HMBPGt/s\nfQW4W4puvBHkBxWSW1EvbecgNEIS9hTGvHXkFzm4xJ2e9DHp2xoVAjREC73B7JbF\nhc5ZGGchKw+CFmAiNysU0DmBgQcac0eg2pWoT+YGmTeQj6sRXO67n2xy/hA1DuN6\nA4WBK3wM3O4BnTG0dNbWUEbe7yAbV5gEyq57GhJIeYxRvveVDaX90LoAqM4cUH06\n6rciON0UbDHV2LP/JaH5jzBjUyCnKLLo5snlbwIDAQABAoIBAQDJm7YC3pJJUcxb\nc8x8PlHbUkJUjxzZ5MW4Zb71yLkfRYzsxrTcyQA+g+QzA4KtPY8XrZpnkgm51M8e\n+B16AcIMiBxMC6HgCF503i16LyyJiKrrDYfGy2rTK6AOJQHO3TXWJ3eT3BAGpxuS\n12K2Cq6EvQLCy79iJm7Ks+5G6EggMZPfCVdEhffRm2Epl4T7LpIAqWiUDcDfS05n\nNNfAGxxvALPn+D+kzcSF6hpmCVrFVTf9ouhvnr+0DpIIVPwSK/REAF3Ux5SQvFuL\njPmh3bGwfRtcC5d21QNrHdoBVSN2UBLmbHUpBUcOBI8FyivAWJhRfKnhTvXMFG8L\nwaXB51IZAoGBAP/E3uz6zCyN7l2j09wmbyNOi1AKvr1WSmuBJveITouwblnRSdvc\nsYm4YYE0Vb94AG4n7JIfZLKtTN0xvnCo8tYjrdwMJyGfEfMGCQQ9MpOBXAkVVZvP\ne2k4zHNNsfvSc38UNSt7K0HkVuH5BkRBQeskcsyMeu0qK4wQwdtiCoBDAoGBANF7\nFMppYxSW4ir7Jvkh0P8bP/Z7AtaSmkX7iMmUYT+gMFB5EKqFTQjNQgSJxS/uHVDE\nSC5co8WGHnRk7YH2Pp+Ty1fHfXNWyoOOzNEWvg6CFeMHW2o+/qZd4Z5Fep6qCLaa\nFvzWWC2S5YslEaaP8DQ74aAX4o+/TECrxi0z2lllAoGAdRB6qCSyRsI/k4Rkd6Lv\nw00z3lLMsoRIU6QtXaZ5rN335Awyrfr5F3vYxPZbOOOH7uM/GDJeOJmxUJxv+cia\nPQDflpPJZU4VPRJKFjKcb38JzO6C3Gm+po5kpXGuQQA19LgfDeO2DNaiHZOJFrx3\nm1R3Zr/1k491lwokcHETNVkCgYBPLjrZl6Q/8BhlLrG4kbOx+dbfj/euq5NsyHsX\n1uI7bo1Una5TBjfsD8nYdUr3pwWltcui2pl83Ak+7bdo3G8nWnIOJ/WfVzsNJzj7\n/6CvUzR6sBk5u739nJbfgFutBZBtlSkDQPHrqA7j3Ysibl3ZIJlULjMRKrnj6Ans\npCDwkQKBgQCM7gu3p7veYwCZaxqDMz5/GGFUB1My7sK0hcT7/oH61yw3O8pOekee\nuctI1R3NOudn1cs5TAy/aypgLDYTUGQTiBRILeMiZnOrvQQB9cEf7TFgDoRNCcDs\nV/ZWiegVB/WY7H0BkCekuq5bHwjgtJTpvHGqQ9YD7RhE8RSYOhdQ/Q==\n-----END RSA PRIVATE KEY-----\n', + cert: '-----BEGIN CERTIFICATE-----\nMIIDBjCCAe4CCQDvLNml6smHlTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJV\nUzETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0\ncyBQdHkgTHRkMB4XDTE0MDEyNTIxMjIxOFoXDTE1MDEyNTIxMjIxOFowRTELMAkG\nA1UEBhMCVVMxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0\nIFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nANFKslwwqlgyqaDUECv33a9DpBuIFug1Gn8Xbnx/RppF/86Cs4P0hS6z4qc0hiDS\nlrcjL6O5j416qlYBNdCwyN1RVfCEen5wEU/gBfAluRzATxrf7H0FuFuKbrwR5AcV\nkltRL23nIDRCEvYUxrx15Bc5uMSdnvQx6dsaFQI0RAu9weyWxYXOWRhnISsPghZg\nIjcrFNA5gYEHGnNHoNqVqE/mBpk3kI+rEVzuu59scv4QNQ7jegOFgSt8DNzuAZ0x\ntHTW1lBG3u8gG1eYBMquexoSSHmMUb73lQ2l/dC6AKjOHFB9Ouq3IjjdFGwx1diz\n/yWh+Y8wY1Mgpyiy6ObJ5W8CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAoSc6Skb4\ng1e0ZqPKXBV2qbx7hlqIyYpubCl1rDiEdVzqYYZEwmst36fJRRrVaFuAM/1DYAmT\nWMhU+yTfA+vCS4tql9b9zUhPw/IDHpBDWyR01spoZFBF/hE1MGNpCSXXsAbmCiVf\naxrIgR2DNketbDxkQx671KwF1+1JOMo9ffXp+OhuRo5NaGIxhTsZ+f/MA4y084Aj\nDI39av50sTRTWWShlN+J7PtdQVA5SZD97oYbeUeL7gI18kAJww9eUdmT0nEjcwKs\nxsQT1fyKbo7AlZBY4KSlUMuGnn0VnAsB9b+LxtXlDfnjyM8bVQx1uAfRo0DO8p/5\n3J5DTjAU55deBQ==\n-----END CERTIFICATE-----\n' + }; + + var server = new Hapi.Server(); + server.connection({ host: '0.0.0.0', port: 0, tls: tlsOptions }); + server.start(function () { + + expect(server.info.host).to.equal('0.0.0.0'); + expect(server.info.port).to.not.equal(0); + server.stop(); + done(); + }); + }); + + it('sets info with defaults when missing hostname and address', { parallel: false }, function (done) { + + var hostname = Os.hostname; + Os.hostname = function () { + + Os.hostname = hostname; + return ''; + }; + + var server = new Hapi.Server(); + server.connection({ port: '8000' }); + expect(server.info.host).to.equal('localhost'); + expect(server.info.uri).to.equal('http://localhost:8000'); + done(); + }); + + it('ignored repeated calls', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.start(function () { + + server.start(function () { + + server.stop(function () { + + done(); + }); + }); + }); + }); + }); + + describe('_stop()', function () { + + it('waits to stop until all connections are closed', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.start(function () { + + var socket1 = new Net.Socket(); + var socket2 = new Net.Socket(); + socket1.on('error', function () { }); + socket2.on('error', function () { }); + + socket1.connect(server.info.port, '127.0.0.1', function () { + + socket2.connect(server.info.port, '127.0.0.1', function () { + + server.listener.getConnections(function (err, count) { + + expect(count).to.be.greaterThan(0); + + server.stop(function () { + + server.listener.getConnections(function (err, count) { + + expect(count).to.equal(0); + done(); + }); + }); + + socket1.end(); + socket2.end(); + }); + }); + }); + }); + }); + + it('waits to destroy connections until after the timeout', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.start(function () { + + var socket1 = new Net.Socket(); + var socket2 = new Net.Socket(); + + socket1.once('error', function (err) { + + expect(err.errno).to.equal('ECONNRESET'); + }); + + socket2.once('error', function (err) { + + expect(err.errno).to.equal('ECONNRESET'); + }); + + socket1.connect(server.info.port, server.connections[0].settings.host, function () { + + socket2.connect(server.info.port, server.connections[0].settings.host, function () { + + server.listener.getConnections(function (err, count) { + + expect(count).to.be.greaterThan(0); + var timer = new Hoek.Bench(); + + server.stop({ timeout: 20 }, function () { + + expect(timer.elapsed()).to.be.at.least(19); + done(); + }); + }); + }); + }); + }); + }); + + it('waits to destroy connections if they close by themselves', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.start(function () { + + var socket1 = new Net.Socket(); + var socket2 = new Net.Socket(); + + socket1.once('error', function (err) { + + expect(err.errno).to.equal('ECONNRESET'); + }); + + socket2.once('error', function (err) { + + expect(err.errno).to.equal('ECONNRESET'); + }); + + socket1.connect(server.info.port, server.connections[0].settings.host, function () { + + socket2.connect(server.info.port, server.connections[0].settings.host, function () { + + server.listener.getConnections(function (err, count) { + + expect(count).to.be.greaterThan(0); + var timer = new Hoek.Bench(); + + server.stop(function () { + + server.listener.getConnections(function (err, count) { + + expect(count).to.equal(0); + expect(timer.elapsed()).to.be.at.least(9); + done(); + }); + }); + + setTimeout(function () { + + socket1.end(); + socket2.end(); + }, 10); + }); + }); + }); + }); + }); + + it('refuses to handle new incoming requests', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok'); } }); + server.start(function () { + + var agent = new Http.Agent({ keepAlive: true, maxSockets: 1 }); + var err2; + + Wreck.get('http://localhost:' + server.info.port + '/', { agent: agent }, function (err1, res, body) { + + server.stop(function () { + + expect(err1).to.not.exist(); + expect(body.toString()).to.equal('ok'); + expect(server.connections[0]._started).to.equal(false); + expect(err2).to.exist(); + done(); + }); + }); + + Wreck.get('http://localhost:' + server.info.port + '/', { agent: agent }, function (err, res, body) { + + err2 = err; + }); + + }); + }); + + it('removes connection event listeners after it stops', function (done) { + + var server = new Hapi.Server(); + server.connection(); + var initial = server.listener.listeners('connection').length; + server.start(function () { + + expect(server.listener.listeners('connection').length).to.be.greaterThan(initial); + + server.stop(function () { + + server.start(function () { + + server.stop(function () { + + expect(server.listener.listeners('connection').length).to.equal(initial); + done(); + }); + }); + }); + }); + }); + + it('ignores repeated calls', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.stop(); + server.stop(); + done(); + }); + }); + + describe('_dispatch()', function () { + + it('rejects request due to high rss load', { parallel: false }, function (done) { + + var server = new Hapi.Server({ load: { sampleInterval: 5 } }); + server.connection({ load: { maxRssBytes: 1 } }); + + var handler = function (request, reply) { + + var start = Date.now(); + while (Date.now() - start < 10) { } + return reply('ok'); + }; + + var logged = null; + server.once('log', function (event, tags) { + + logged = (event.internal && tags.load && event.data); + }); + + server.route({ method: 'GET', path: '/', handler: handler }); + server.start(function (err) { + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + + setImmediate(function () { + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(503); + expect(logged.rss > 10000).to.equal(true); + server.stop(); + done(); + }); + }); + }); + }); + }); + }); + + describe('inject()', function () { + + it('keeps the options.credentials object untouched', function (done) { + + var handler = function (request, reply) { return reply(); }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', config: { handler: handler } }); + + var options = { + url: '/', + credentials: { foo: 'bar' } + }; + + server.connections[0].inject(options, function (res) { + + expect(res.statusCode).to.equal(200); + expect(options.credentials).to.exist(); + done(); + }); + }); + + it('returns the request object', function (done) { + + var handler = function (request, reply) { + + request.app.key = 'value'; + return reply(); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', config: { handler: handler } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.request.app.key).to.equal('value'); + done(); + }); + }); + }); + + describe('table()', function () { + + it('returns an array of the current routes', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + server.route({ path: '/test/', method: 'get', handler: function () { } }); + server.route({ path: '/test/{p}/end', method: 'get', handler: function () { } }); + + var routes = server.table()[0].table; + + expect(routes.length).to.equal(2); + expect(routes[0].path).to.equal('/test/'); + done(); + }); + + it('returns the labels for the connections', function (done) { + + var server = new Hapi.Server(); + server.connection({ labels: ['test'] }); + + server.route({ path: '/test/', method: 'get', handler: function () { } }); + server.route({ path: '/test/{p}/end', method: 'get', handler: function () { } }); + + var connection = server.table()[0]; + + expect(connection.labels).to.only.include(['test']); + done(); + }); + + it('returns an array of the current routes (connection)', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + server.route({ path: '/test/', method: 'get', handler: function () { } }); + server.route({ path: '/test/{p}/end', method: 'get', handler: function () { } }); + + var routes = server.connections[0].table(); + + expect(routes.length).to.equal(2); + expect(routes[0].path).to.equal('/test/'); + done(); + }); + + it('combines global and vhost routes', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + server.route({ path: '/test/', method: 'get', handler: function () { } }); + server.route({ path: '/test/', vhost: 'one.example.com', method: 'get', handler: function () { } }); + server.route({ path: '/test/', vhost: 'two.example.com', method: 'get', handler: function () { } }); + server.route({ path: '/test/{p}/end', method: 'get', handler: function () { } }); + + var routes = server.table()[0].table; + + expect(routes.length).to.equal(4); + done(); + }); + + it('combines global and vhost routes and filters based on host', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + server.route({ path: '/test/', method: 'get', handler: function () { } }); + server.route({ path: '/test/', vhost: 'one.example.com', method: 'get', handler: function () { } }); + server.route({ path: '/test/', vhost: 'two.example.com', method: 'get', handler: function () { } }); + server.route({ path: '/test/{p}/end', method: 'get', handler: function () { } }); + + var routes = server.table('one.example.com')[0].table; + + expect(routes.length).to.equal(3); + done(); + }); + + it('accepts a list of hosts', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + server.route({ path: '/test/', method: 'get', handler: function () { } }); + server.route({ path: '/test/', vhost: 'one.example.com', method: 'get', handler: function () { } }); + server.route({ path: '/test/', vhost: 'two.example.com', method: 'get', handler: function () { } }); + server.route({ path: '/test/{p}/end', method: 'get', handler: function () { } }); + + var routes = server.table(['one.example.com', 'two.example.com'])[0].table; + + expect(routes.length).to.equal(4); + done(); + }); + + it('ignores unknown host', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + server.route({ path: '/test/', method: 'get', handler: function () { } }); + server.route({ path: '/test/', vhost: 'one.example.com', method: 'get', handler: function () { } }); + server.route({ path: '/test/', vhost: 'two.example.com', method: 'get', handler: function () { } }); + server.route({ path: '/test/{p}/end', method: 'get', handler: function () { } }); + + var routes = server.table('three.example.com')[0].table; + + expect(routes.length).to.equal(2); + done(); + }); + }); + + describe('ext()', function () { + + it('supports adding an array of methods', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.ext('onPreHandler', [ + function (request, reply) { + + request.app.x = '1'; + return reply.continue(); + }, + function (request, reply) { + + request.app.x += '2'; + return reply.continue(); + } + ]); + + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(request.app.x); } }); + + server.inject('/', function (res) { + + expect(res.result).to.equal('12'); + done(); + }); + }); + + it('sets bind via options', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.ext('onPreHandler', function (request, reply) { + + request.app.x = this.y; + return reply.continue(); + }, { bind: { y: 42 } }); + + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(request.app.x); } }); + + server.inject('/', function (res) { + + expect(res.result).to.equal(42); + done(); + }); + }); + + it('uses server views for ext added via server', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + server.views({ + engines: { html: Handlebars }, + path: __dirname + '/templates' + }); + + server.ext('onPreHandler', function (request, reply) { + + return reply.view('test'); + }); + + var test = function (plugin, options, next) { + + plugin.views({ + engines: { html: Handlebars }, + path: './no_such_directory_found' + }); + + plugin.route({ path: '/view', method: 'GET', handler: function (request, reply) { } }); + return next(); + }; + + test.attributes = { + name: 'test' + }; + + server.register(test, function (err) { + + server.inject('/view', function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + }); + + it('supports reply decorators on empty result', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.ext('onRequest', function (request, reply) { + + return reply().redirect('/elsewhere'); + }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(302); + expect(res.headers.location).to.equal('/elsewhere'); + done(); + }); + }); + + it('supports direct reply decorators', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.ext('onRequest', function (request, reply) { + + return reply.redirect('/elsewhere'); + }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(302); + expect(res.headers.location).to.equal('/elsewhere'); + done(); + }); + }); + + describe('onRequest', function (done) { + + it('replies with custom response', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.ext('onRequest', function (request, reply) { + + return reply(Boom.badRequest('boom')); + }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(400); + expect(res.result.message).to.equal('boom'); + done(); + }); + }); + + it('replies with error using reply(null, result)', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.ext('onRequest', function (request, reply) { + + return reply(null, Boom.badRequest('boom')); + }); + + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok'); } }); + + server.inject('/', function (res) { + + expect(res.result.message).to.equal('boom'); + done(); + }); + }); + + it('replies with a view', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.views({ + engines: { 'html': Handlebars }, + path: __dirname + '/templates' + }); + + server.ext('onRequest', function (request, reply) { + + return reply.view('test', { message: 'hola!' }); + }); + + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok'); } }); + + server.inject('/', function (res) { + + expect(res.result).to.equal('
\n

hola!

\n
\n'); + done(); + }); + }); + }); + + describe('onPreResponse', function (done) { + + it('replies with custom response', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.ext('onPreResponse', function (request, reply) { + + if (typeof request.response.source === 'string') { + return reply(Boom.badRequest('boom')); + } + + return reply.continue(); + }); + + server.route({ method: 'GET', path: '/text', handler: function (request, reply) { return reply('ok'); } }); + server.route({ method: 'GET', path: '/obj', handler: function (request, reply) { return reply({ status: 'ok' }); } }); + + server.inject({ method: 'GET', url: '/text' }, function (res) { + + expect(res.result.message).to.equal('boom'); + server.inject({ method: 'GET', url: '/obj' }, function (res) { + + expect(res.result.status).to.equal('ok'); + done(); + }); + }); + }); + + it('intercepts 404 responses', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.ext('onPreResponse', function (request, reply) { + + return reply(null, request.response.output.statusCode); + }); + + server.inject({ method: 'GET', url: '/missing' }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result).to.equal(404); + done(); + }); + }); + + it('intercepts 404 when using directory handler and file is missing', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + server.ext('onPreResponse', function (request, reply) { + + var response = request.response; + return reply({ isBoom: response.isBoom }); + }); + + server.route({ method: 'GET', path: '/{path*}', handler: { directory: { path: './somewhere', listing: false, index: true } } }); + + server.inject('/missing', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result.isBoom).to.equal(true); + done(); + }); + }); + + it('intercepts 404 when using file handler and file is missing', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + server.ext('onPreResponse', function (request, reply) { + + var response = request.response; + return reply({ isBoom: response.isBoom }); + }); + + server.route({ method: 'GET', path: '/{path*}', handler: { file: './somewhere/something.txt' } }); + + server.inject('/missing', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result.isBoom).to.equal(true); + done(); + }); + }); + + it('cleans unused file stream when response is overridden', { skip: process.platform === 'win32' }, function (done) { + + var server = new Hapi.Server(); + server.connection(); + + server.ext('onPreResponse', function (request, reply) { + + return reply({ something: 'else' }); + }); + + server.route({ method: 'GET', path: '/{path*}', handler: { directory: { path: './' } } }); + + server.inject('/package.json', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result.something).to.equal('else'); + + var cmd = ChildProcess.spawn('lsof', ['-p', process.pid]); + var lsof = ''; + cmd.stdout.on('data', function (buffer) { + + lsof += buffer.toString(); + }); + + cmd.stdout.on('end', function () { + + var count = 0; + var lines = lsof.split('\n'); + for (var i = 0, il = lines.length; i < il; ++i) { + count += !!lines[i].match(/package.json/); + } + + expect(count).to.equal(0); + done(); + }); + + cmd.stdin.end(); + }); + }); + + it('executes multiple extensions', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.ext('onPreResponse', function (request, reply) { + + request.response.source = request.response.source + '1'; + return reply.continue(); + }); + + server.ext('onPreResponse', function (request, reply) { + + request.response.source = request.response.source + '2'; + return reply.continue(); + }); + + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('0'); } }); + + server.inject({ method: 'GET', url: '/' }, function (res) { + + expect(res.result).to.equal('012'); + done(); + }); + }); + }); + }); + + describe('route()', function () { + + it('overrides the default notFound handler', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: '*', path: '/{p*}', handler: function (request, reply) { return reply('found'); } }); + server.inject({ method: 'GET', url: '/page' }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result).to.equal('found'); + done(); + }); + }); + + it('responds to HEAD requests for a GET route', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok').etag('test').code(205); } }); + server.inject({ method: 'HEAD', url: '/' }, function (res) { + + expect(res.statusCode).to.equal(205); + expect(res.headers['content-type']).to.contain('text/html'); + expect(res.headers['content-length']).to.not.exist(); + expect(res.headers.etag).to.equal('"test"'); + expect(res.result).to.not.exist(); + done(); + }); + }); + + it('returns 404 on HEAD requests for non-GET routes', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'POST', path: '/', handler: function (request, reply) { return reply('ok'); } }); + server.inject({ method: 'HEAD', url: '/' }, function (res) { + + expect(res.statusCode).to.equal(404); + expect(res.result).to.not.exist(); + + server.inject({ method: 'HEAD', url: '/not-there' }, function (res) { + + expect(res.statusCode).to.equal(404); + expect(res.result).to.not.exist(); + done(); + }); + }); + }); + + it('allows methods array', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + var config = { method: ['GET', 'PUT', 'POST', 'DELETE'], path: '/', handler: function (request, reply) { return reply(request.route.method); } }; + server.route(config); + server.inject({ method: 'HEAD', url: '/' }, function (res) { + + expect(res.statusCode).to.equal(200); + + server.inject({ method: 'GET', url: '/' }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.payload).to.equal('get'); + + server.inject({ method: 'PUT', url: '/' }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.payload).to.equal('put'); + + server.inject({ method: 'POST', url: '/' }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.payload).to.equal('post'); + + server.inject({ method: 'DELETE', url: '/' }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.payload).to.equal('delete'); + expect(config.method).to.deep.equal(['GET', 'PUT', 'POST', 'DELETE']); + done(); + }); + }); + }); + }); + }); + }); + + it('adds routes using single and array methods', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route([ + { + method: 'GET', + path: '/api/products', + handler: function (request, reply) { return reply(); } + }, + { + method: 'GET', + path: '/api/products/{id}', + handler: function (request, reply) { return reply(); } + }, + { + method: 'POST', + path: '/api/products', + handler: function (request, reply) { return reply(); } + }, + { + method: ['PUT', 'PATCH'], + path: '/api/products/{id}', + handler: function (request, reply) { return reply(); } + }, + { + method: 'DELETE', + path: '/api/products/{id}', + handler: function (request, reply) { return reply(); } + } + ]); + + var table = server.table()[0].table; + var paths = table.map(function (route) { + var obj = { + method: route.method, + path: route.path + }; + return obj; + }); + + expect(table).to.have.length(6); + expect(paths).to.only.deep.include([ + { method: 'get', path: '/api/products' }, + { method: 'get', path: '/api/products/{id}' }, + { method: 'post', path: '/api/products' }, + { method: 'put', path: '/api/products/{id}' }, + { method: 'patch', path: '/api/products/{id}' }, + { method: 'delete', path: '/api/products/{id}' } + ]); + done(); + }); + }); + + describe('_defaultRoutes()', function () { + + it('returns 404 when making a request to a route that does not exist', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.inject({ method: 'GET', url: '/nope' }, function (res) { + + expect(res.statusCode).to.equal(404); + done(); + }); + }); + + it('returns 404 on OPTIONS when cors disabled', function (done) { + + var server = new Hapi.Server(); + server.connection({ routes: { cors: false } }); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(); } }); + + server.inject({ method: 'OPTIONS', url: '/' }, function (res) { + + expect(res.statusCode).to.equal(404); + done(); + }); + }); + + it('returns 400 on bad request', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/a/{p}', handler: function (request, reply) { return reply(); } }); + server.inject('/a/%', function (res) { + + expect(res.statusCode).to.equal(400); + done(); + }); + }); + + it('returns OPTIONS response', function (done) { + + var handler = function (request, reply) { + + return reply(Boom.badRequest()); + }; + + var server = new Hapi.Server(); + server.connection({ routes: { cors: true } }); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject({ method: 'OPTIONS', url: '/' }, function (res) { + + expect(res.headers['access-control-allow-origin']).to.equal('*'); + done(); + }); + }); + }); +}); diff --git a/node_modules/hapi/test/file/image.jpg b/node_modules/hapi/test/file/image.jpg new file mode 100755 index 0000000000000000000000000000000000000000..6f7af65c1639bc875d8c6206e6a35324911ed577 GIT binary patch literal 180452 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�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 ugY3YjH1Af6p5;U=+=H`k23{k4u}=vb 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 z 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 M^_5D!lI{Ed2bx`WTmS$7 literal 0 HcmV?d00001 diff --git a/node_modules/hapi/test/file/image.png.gz b/node_modules/hapi/test/file/image.png.gz new file mode 100755 index 0000000000000000000000000000000000000000..6e9183bf98edc9f8689b7f7b268160d1cff2e519 GIT binary patch literal 41936 zcmV(nK=QvIiwFpO#&S{u18HqxXJsyMZf5{Ay>oOdPxrn(v2C8%w(XqQwr$(CZQC|Z za$?)oiJiRpJm2^CM<%n@tnR7Wz3blh)m2>+AulTq2aOF4007`5B}5bf03f5E_s@{v zKd<9LtUs>+D0>MFCjbBj<-b25KxQ^3001p#AuKE}Z*J#o=VWeYPar8QOknS5XKG<> z0sy$L=O~#eE1jY9K5st=Nr(F;e=tzLa{`Anq(3S^z%y2;6d)i57ey1*kIsP)((WIRUG*00v1lQwczQ8=!w0 z5vCCU2@7CQ2oIqIfO-M+$BBvE0l^snRIxiXo?Gf##1pEYNM$tgbdYe0253RjIzXtY z(cx1}OJY!?vKasyWD3v?dSqZR1+XCO-v0#v@)OX0dVBxrJ`G|d-Ut3o zWN3Ksbu?3DF8~1SIs49i(a<+x`*VZ)+k6$0UW1zJ!sNR=N0~Mv2($q5&(_uM?f;97 zXhD3(+S<|K;i}ZIke0!On$MTnpkBY)r}e8Z&&TuQZtp%x0FzFDIOxmn;NOSeCAc$* zP{D?q$8q8xZ7|;-cnd_sl7=1XRHz3E$PTe0nbG%5B}5TIiIgLx^WVn%J2dYgd^@aw zdP_bauLRn19V3t@X>vq$=l=a?0N}36ZeWoD62#v;Xm7^t`-cBhJf9TcZz`GS008KU zkkBblH1Ur?0stcU0aW#ZI1dAuH2vVX17Mp2FdzDC!9pa%gF=Wx(8m6_j{20c7=xS0%~`a7kE@ z)}h#;K!Ozp$%&H6rJKn*kzR)}4Vf6j)Fo($myzR8=n=ibg@@TmkRybd$UEYJB^!#B z=aJ{d=4};;&uA*LSR}BClm4t5TQx#(Cesj5kB1!Q91a~aAL1Mm-f2PS7z#KPzbNff zC{9>PVI3hJu^fS$q%#Ss6lE%Il@}-@vBqf%)fBWU)+vOQqp-MSa!v)IOG=m26s9a- zn`4+iThyI8cOq@2;LE1Xs?ATHiJzvOf;_mv!iAy*jfI<0U}a%KV47jMVb-PpF2!1i z!WvU%U}wBYKgmGIuv1Z|YNhfd762Ll4)-bi^?Ml^^{)yKW#amfXz$wfu#jMt(c%N*_4{?z0@RIE;3w1(K zmUizOxs7^5xlf5x%JRE|(L~#-GBqt#y-K1=p-TLshpqOiET^sq z+$?SyEayaNO=+tPx(r>0m+P^XuF|Rmr=Uy3tur&&eCE5B;a| zr_Ed0qd2TOcoQrM_y+7WCeH|~gB=eZ{n*B>g0RkzfN+UHib2|5a6-o%PtlTCj2J?+ z#i;fH$$`zN&1exBI2j?Cw9L88b*7?BM=50~_iygsV^e>p3a6GcShIK;SC~$+PO?_A zcG~nc-8E@i%Ujz`BpVMkOEs=ryKO@>IWFW2wT;vcT_^P<`E>fkeDXrTg{{F?;c4ReIyF0@ za;b7{XHI8d^ZSfEq@K~6sm~zJtTG?8qD)c_TjVHZEr^?8m~}V>-G@g-NC!^RrSZ{a z;f!vL_Z&(&KRW2_dCouPWHn_CUX^duU9(+VT!(Gu{bk9c%++9anjIP!-c>l76L=%h) ztO-0Cs39~Tzl^UTd_GB^PMEfU50UphU7m$7I5vnH@`WW22@6pR<&U)wSI3@XOk;JM z+Z1-%5qT3y71_=*W0d2pqm^Q%;;W>y@|%SlI7%Vulc zyYq2%AGV*f4|Cv!kxoCZWA9NgJ@^n(hF(F3Ov9Bb@H*)+g$jnur?LG?41OajA!CyLN}`i$p~`^%~3}%c}0BpZ@AxESzNj3nXUvj zOuSq@j6sPB@eV?jgfdC3X6I(drmmCKCLxVqBeqd(^!OH(c-Be_f%VQHu5-l zY(O8Nfl-I5f>-mjN48SgEXh?}sioEW_Ktx{~dAK`@AP4s1KCO2194R;vNn9iG?9dFa-YQd*g zrX8oj+rq7_H^c3yHeWqHiEhxRO;K!g1+@xy6!r16cbk;`nV#b2S1wk5P<~TpyPn@_ zF<5!Aox8^I>V9ImT-wm;e*Wb9)4QPpq$0Cqx@7V$`QG%*UmH<*_LBN;qf;Ym<8U=|n386S>o z-8I^)dJkgZmn)tb9=)Yd=3S;(mQv=smZ4Us++V)A<@0UN5Als(2-z$=8Xi*j%6}}@ z&jJ^c%=7+MVwjH;z!$ z+SM}axb$q!ozHo`k{0B~y0W`6Ydf^9I<7r?TD(l3&v0_tr?(z@JZ{mymzQ!mdAEA* zJ?)-Ho*#G6w|pJRKc^?V*4)UiYr5sS^&SMS1lNSO!j|~8zBX5HHvKI7-SY3}HpQR8 zLxN_$5+36agu&u6;wD4kLN9VT_&7QD`5iycKFWk=jAzJlF}@1FCTlU!>3v_8E>@=J z(&q}&?$VO_Y`jZ8&-*X1>NZ9PNAY|AxHB{AKB&H54Y+N(;oTJNAjlnh6Zlblo4+Wzp202!i^B7(~9>z6q$$+#-(VR>3AS6fC{d6K4N*K~-;fn8lF`T-*vn|uWA zT}@FmG&JxAbMe8!?OkzQGtF8{pI@i41c(Fzt1*i=*?dk+XBFqQozE4|z0YU^zmk;{ z+Ae$qg)#iM$dbR1Wuv5u*ySnm7wHz`f_Gu^L6k~;MGe{C`R<-|AqXK)Z}s?llaKS) zP(~l0`Z>%`UBML0(I!v~DtBKl5XU5{ z;hO{;0DgxZ$NYs-@Z4PLt=n;wN|8##^d!L_eO0Is&zq?-fzUv;qyiT2dSQ&~uOCek%cv2;@Xc^3#YsIf&qbdQmSqynPP7{LML>3|yzWR=VeW`9` z7)1rhuze9#*7*`GXqX-Dj3jXkaOk%h=>b5(eS_U9rN1+n3_iFI zm6bst0eA$NCpP~S`)u(lk3phPs&j{>5r{us#$%bH-$KSmOAswYmtU~BO1a14E}$4t zF-^AVlzvXY@Z|#ykfBm;6D3(-vxvVYXviZ#p&v=~Z{h_*MO)L2tk#n#_XJ|0Jw7Ci zn1a~aHNSWLf35yizL0zg>h_m{7?;E*`d z?ed<4m@d!29lD52uA1rP}+2!xBkRxHrfw=1L5!~c7oAXuZMB4{FU|Epy>kxYp) z+9!wCkF6g>HvHyUH@zpvemf2OOPWpOUkI!V>dO0NMa0;a#QZPE5J^^m3_M)T!z z#Y)8s%wk7Zs)|0W1pU7_RlyIn)HTtHs##;v7-`K<-MG+}{$8+{Of1?~d`m&etSYjU zbJx=|D2hhU79i|SG*-dVx6UFlrR#N!pb!SQP<2-k?|@I_L|S%I{?2HjWYdFaVhiD{ z^+SkG5@-bp>F+W;<_s>XZeC-;XqrecCh|`Ll6>^JfIqg zQUG5b6ct1Rm%5t-!e4FHB8Hn0{q~8;-qn8=;Fh1z1RIl%P*}q^$1zGi>RlpJi z+D6EOl_*B8Xgmpy(hg(Rh+EJa#B&Yxs3)C847lRBp5Z5U_#g+r1T@I>xMl&>%=$98 zT$5B*8SYPW0G*G}uU{rs;gR_TT`Gj5tHJ3w38N8SakzszZrV{>2IR)42W=q3KP)6e z(KcFwTV;X$gRn?H*K_?||HFt6_(&iH9BpSxBXkk9e&(YfsVr;k!!C*vdkm=2h9i|Ud>-0b)E8zc^glXDj5mHvIo!5g;li<)Gw}vK<=>{; z4*gsFjghSRvsB42Mf0bArvoS)M~g%0oJQEPWne%aT=Nwq+GPKIX^Yt)M+LloQLtha zqKZmO3~6288x;HY9R@UXBPDf}!S)Afb93{;>a5t=n^fg_7La8YNfoVvj21L#yMZ zF#Q^TeY@zGMk0PMQfEP@*OW2RftiY_SzKX52_KUWQLmNGK#Lo`6W*iHiMp!?C`2FF zlp}ogQ_?88qC1q91b z(8;Li2u*};?Z1)I6>`S^zRG5BrK*I*_Jpa&J*|Xl;K7Z$`dqh4I$P-rZkc3P&{~l| zl`qgm+5c=$>J{WsP~2k*RsOT#C`{iBxZDxI^6?I4sra^e1FI9Qb@swI3Jsx?hpL z0qQqx(mw?cH2`q@Eog9xRRhT=M<;cSTSUmfv@896)tq{JJfDTuKi{70fi7ZTWTUil z9IE<}0Eu3%5c1MScZ6D84e|!GrB=JfVm#CdZPN!Lw&15Pw`^UF3l9sv46=pVE&y?I zl$JN$9a2R>TQxw5s;Ic-&J7a$$ZA91vU*FoPko&|2*J%n~*#TcLi}a*>rp7A|u|mFh6hwHy?x zn+IBpo-*nQl;U7PL$;>`|09PIodlTyT=}NAfhwFSXfCK|M+b{6Lbork{o>%bm4wx5 zIxb{NWz%KN-KxL_Wu^^XTe5riU~DVA^;yD3WjHX7Q8C?BT@=3&v(~|AjS@?kr32^# z+(^B_tnH~PXDZ4^5y&jb<%#nv8yZq7&pkaKC`jt8=#cM}+mSIHj+V?4)#9gi^u7T3 zNa{8X=0YkeEHWd3fk3KG=IL)r1lED8i?z@PB-X-`((XY@3OG5D*c+o8zydwNm6*-7 zS}IbmvKa8Z#y7!Lz|&Z~#dd8@WcZU8bv{Bm!Z6tTDEd9}prHo4uG|itxR?=^jz5EG zxt?-C<`!mhF;5BA9N5x-0t`mYjkB;b;1)$}|LVaAGx0!{D|}vN$@^}O#UIY$u&kdl zvXG!;*tBWSew6@`0fp~(1_7JN;LGzMm-(p;3EN#Ido?YNZf8YgVIr_B-zP&bV*8e? zuJ;~qrY3hi)UCS61iXM7hjr+btqQ8jfMwI*O!9yAF1WsecU|Td=a5_>w279i80`&?%4;^VOboa8-qk6+P84> z{Qq5W>!gxU_OSxRKDWwxHJ#9Ibez}dFeKjjt>q8hG&KK`F4AqOEo6pTcx9uTjSpd# z>i}v&X$u_s)$VUJMQC`=F1QNX@MA%=I;b+i7NIFEEUxs|+3#PUH}XJ+l?yi0z2jsH znY0igd0&UK{$_LpJG{s3XI9OK{g}FM^#I{11H*~tP?;YObOjAGg=`r#SFVToZ!c^? zz1I@OwSWgTWmK`O@LZC59fGAiob<~+nES>(mJ~+S;UNOTeg!WrAJ|v;TQT7CZ-L5ttBB$*vFxo6YpP^dLuWb1@nSOO*U3E#CHDQ5aRmd_M$u z9&4J+V6Z4vul;$BIih5C8G;)@hV4JJx+tS$(QcNQZ0|n)K zzkFP=l9;lc)g(YDX@yodxIWilj%)P)?QY|`F7`UNx;8q>ScE1!29hoMr4O01hu+d1 zIx-k^ds(>AqG5q%!Wn}^s2l2}&G*%?bD^=y7WU6t>x=!KxSg6{hrH()*T?ToAT&2+B z$HWdMBV`atWgixJIXWTJd8X#VM&`z<-S=EHHgmen1$BA31+KNAJL0~T6XcblZR8eY zZ)w(G@U1L@(P|^-3Y|d?kO_K$NZUcz&xt@Jt29{!sN#DInz?9a_sni?g|Rs5F(%RL z3L1Kxs#Pdx`-Pk^uYei0;b`^$7iKifF$w1kTL_|!cTPWj!gqiQnfG)@)kPw7vhf5rKBb#gn` zkeqzhB6xZ3^BZpzt-@kzb)!r?Kx8q|9&8Dt7o0Lu`jG5LE+_}H zVn(2@D6@w9jKUlA=j(#@2&&dlP9Y~EtAxi*?KPvQk9r~c%S^5Y-{J!u`~q;MXYb>q zZMwwNaN^bIip64&*CTzJS6UeedrZm8K#M}&)^HYog)wXo(HQ*K%V$i?A@m(5M0pZ* zWeKgm3MyiBXy!eCg@=okoDQedx&23(dMJ~KV7TM@|E%o~%i-DK*-g*iC#}vZfgaXs zDjh#@;9a`SVk&OQmdff0C{GmG2>GayvBAmwSo|OJdx zj^!}rrx7w37*ttqXOW!^zC(`i{PQ2&{HTmO1c*i)sbb}jzcdhGf%!mS%K1M+AC9}# z&+iCpR6>(bs^l5hryEojXQU)WrI2x81rmXH`#lpWbAu2cVG zVgm^K4X6zD@H*^n@O3;MZZ90Xw10PAY4qmwfWmxCRhG+*=NvFoXClg?&0$a=D?ZI7 zeD24S62hHA6a$ceXkCZN3MfpN8jw#(<~U2>#wGC^V?<8%V*H_z&rV9eAQ<3JZ}oig zScE@*W8Rc9ppyXDusM{4FLA_UFr`9t}{2wP!Vwtbj={Nu$Nc}CM8XlU>S@bHpbH;9qY z!y|d>UySCb*t-h5G$3@pfz!LAokL--k}GO^4!bv#JgZS3_XC4x$bSww!5j0y$PsZd!E@WZW4V~9%l?@H zU|F=-**%F}2{fj+=X2S*-YqO1YXV|%gpztId?5uSA%b9m6*!_j$O3(TbDCRb{5Yc) z%T+wpVit273$xEmMeOq|jTS?Y$+YSrjPGqre71aqvK$v&ohWFHE>B`BwOXU|MU7^N zK!6jieV>W~e^LaToYMcbS1CXn5DoDJ1`qJubUb+dc${E<8FRW}I@?YIaJ(;~sH-k4#vVlU19H|7cR3XVw$6Up6{*Jf%wiIZYgRurs|MDN{=4JK|nWRskNi5z;P$ zI+8?z`oEqq2Ur7j0=)wc{2hwK;7{F71ByCM2GoGuUwSt>u8$?VZ{M1-nQtAHU)D>@ z!^jMBEzu@k6)dtLP!qzJ?Gx+C(m);s`1BnhkMM;5rP7(iwI{m)AUIfKgyD1ggF!~; zi`3japRQwfZps>Z1ME3|lOPk}$05ay03>-V*3La~DdCh=ge5!id@Y!$D+3qK`mbE| z+cwNCEsf^7Q@rnPS*R{DCEU8&pE~>O?=r>`GcyH6J>c%m=#Q8B`bHXAFMyUgLmV3s z4O1e(f4KKI=C_7GE3i($Cm1f_E+)ug?^f6SOq-tJ;;BNlMpt0=rE_ifKHIkEyODO} z+e*Db^+G}&FzFAgj+W02nOmEWZk&~rcBYGmpLdJ+{4-B!mZCkHPc z@3;GUcR%CG3;{-=k4F<$GezxQ?Aq5XLIaq2zAtF>Jl}Hb-h3?W3#H{rzj@OCQ?!>E z{{{e)%5VhNT?G)YmpWa?KG8JiH%s9hqSZ<@DS8Z(`8Z&G!#f(s0aAuf4|6uVvQ)?A zQLkg~yOxxeHAkPpf65jlzo;l^J(H_cCS!nK&qrFX)3e4|i*|kOBzHIiMUIf3Kdp2W z{oK;(pT`CixX)>4Y^f!r=&MXWn$X9wWYq<@Y+6qD2Tdi_`RfTk-+tFCHK6^p+lb?# z+-J_^bghdY?+OUtZTyFfM6!vYf-H#^Oy-uy#QoX(}Wfip|3+N1uGv#EpCJP@d zm}A=gN44$3!d`s;hN4jWnILwh*_Qay(4Tf!L4tM%3jx6r$Br0EtM~I~dP9-HD60rA zDdWO(t5$(gl2%q)vs%Cj7hZ7f$p@RWgxX>f9L+56N-9^fNX$r(7D;1Equ1^aynhLH z@%INe47ERvI$2mfCuXjP==Qubm@OmcdOnD%+E9S0U!hKD2!)%F(f!8EVqi1qCf2_M zhyjzE+l%2g-gI1Wk?Gol%gE3^TrUKHIi=a(>eU(WyLQ2KZAFe00wJ!r5EW1a=!c(Iik;)EM@XmWGl-aZk@NY557u@RmvBf(yU44j z%ZQ0Vvt^;lEFcOY#*IOR5DgbH5+zV5`rcTkDiQ?~(DO%`b4(n>bx&V{QDbe^K_p%G z!1@vRw=s|B4+Kd{UJZ)h_>LaL^@g+KiuJ3(i}q;ulcC`JcWXC`;ft7I*&lhA0nDL1 zfCpCI%;y=&D-LIfc4d1iD2^AQU!yFye@JdSW~#Qq^T@K(m0CpV&%NAN&`F*boE}NS z-_-MZr(q-r`$ecQX5&)<*rELH?&#K3Q=$ZdTXhyFg9fnR3JZK5dhL{U3OTy!+*{Jhes z`7;u1r~+z3$^{WEZ^++j7F~}$-mlLAcGy#`!Qw7@a`Y$#wG{zXSNNjQOBoLfIJ@pU zwmd(+oN0YT>V3wjLT#%;qjzm1Hc=JS05X!f`~vC!4A4|ndOEJGKBj#$*)X94Wf-2{ zUjvarB))G?E)9#bO|KoBY|dMfiOI=-UOuq+Y~g20rVeKzD++6~kOFC_>}GjR$l`c@ z6kCyMJF0fQ0gG1UEn(@NO#-CZx3evM&}5Pcl;E0!;HBpptF*FZU4_)(>T^5XCxRl>$Ox3IG#LVYNr0G4S201q+LtFt&dGBY~o zgutlYzHK;_)5#qs!pepDylHXR3qS{Tu2KA6sxPg|j}-B3k}53K9+r5)0@WuWuO{oK zLWb)gL1ZDIs<4i1YNZ?8Y|+*Ipp!B}rFnvtPWKlyMh|k-_ zcoen9^D=G)i?^E8b=?Ep$1kE~#f=<6PMX8#^PZG27t+W7%@xP@#RR^KI&mfx?kDY} z4b@)&HHYHPM0ey1(79B7!itx9=3!5X0V1QXl`L+dK3@l?kDh+xe)D zJp4cX9gI3&pR6#seNoYlOgQl16&Ds>E|cuquSUHptjou0EwWuk9kQKA8UB%~ahh)|AM|}l(D(dY- z7vM+|kjKvTn5mKZF{G5``Gxh2!5YqQrOj<_%8GYk49x-w`U)ZqiN_jG|9$0om%3gvnxxfd_?HlTsWgV}Fw)?Ishlk(B}i4=E>QmWyEI$rI!jE&iJVT< zhe!W(CH+5PEt5f~o*k*BNFoY#C;(N=k+tnRAfxO2(B|USw6L%(EpJah+wmUbb>kaN zRDptdDmH>YE}SHvuW6^YvB_y>Y1w^j-M_FFX5Tl@bgBBsG8BJ^VLZ3FIw6ek83mUm zh1CBU*42LdU@f5}m_|UL`imT$8FAui$8ZSHrIcS87{4PBSpyNC3>CCyiV?-@cjtzFVu`hSxmi(8w&%c*i_80^TdJ|W?A5l zAXZqB_{b=)b^9kuE;{y(%YbsC#yC8@4bfwTV8onoN$E5+u}nl&qMc$T1cylrTHObE zZ>bZJtI-7sXc(0xo+&`NUF1O{0ba-t3VDLsWZIZ)T>`Ytvl`eYi#00N4}&r*d1Jco zumuIZCX+$N%<)~%6o&^0y?bXT+Xg#7rS^8YZ+3H0j00D4@i;~-9x@dESHMv2UJggJ47L{VX(_ZrE8WqScnrnvf?8~7Du;m|Z1>T)KC_4qB0>OAtYFB; z`#oYAe*+NAgmM(o7dp#B$`6ghQ67`N2q%#$3F2ZiMF(}7nlTzJWAOYt{VXnChXn72 zWXbirV|~JQps4GZSRgcc!WeG2-0cZ-9#}y%&ysfSYe8|OVLn3RbK+$LD*1M z$-%@jjL^A84ctsewbHjCJBr5Y985Zm3xlaY2WrJ8R&Et-G}X5Icg~&*bS|8vnNiBJ zb~N;)lbHzv-~B~}t)`BIo*#zz3_%i=Y@U+3=J+KE;rI{*-uO7Xr2FX^;Sc>^F%^~K zWc6xSWtDpO0Uj={OpixBIj4QbFht=mV*S$vP>!d3LQ^p4U}M<+gm=_{B}oo*fk`Rj z113l|a@+iokY=ue%8Z34c;?EiAk5JKMaND~B^k^cD8&F=AYq`ZVx>5ffAI#+Z|Aq3 zJv`5cRna>a6t*3oK;3-w2s?f#c7Femg~JdGt}@}0ZMEfmbU15hABPJGS)y1w1lwAi zw+Q+OvL+feYx~Y91@b4!85GK9)FAaR4#YUsfKKKS`aaU=DcwETAcWR)YUD$7r@BgU8v)%CXD&8hT! zxsrZ{@t=N#h)T_dwX16N-r%=R>|F0X!P@QzZIa7h3=cP;#+QT#lY)lA?T`fgOW=%n zYu&(W3ec^}_3Z?&yUWTzsyNK(V&xW5K!!zxhrgXNGa0s(^e=an9KYy0M0_bQI@| z9PqslW%_rw`b?W<+%Xd7Asr6HAAP#H!r+`3ICj7(Ai>~$I}@aTnFEIfR#l;q;6Ayd z4Bc1}AWHXZU<-6kv{?!*`J362{P!=5ull??q#y+<8EWLew!WO8v7^I=vagZI zl8ZCV?6BGke-Q|r67^|*L^7{)wYS!bBZ{*TZNmIhQjLk5^ZByC6rMw=x7_@c^3UYfhN&-E}(8Z z->5l!^cZ=5RNt@rdD_me9>axPC0SJFmgS`-oO`kL>ec0yPcVGi5gS*-wr!3#K6Ua+ zN|Qz8X7+b;l*3eo5k8&2Is%1}pw6hm;2J={Z*;Q%M&e;B0N7 z5}m1+=mE^Udoy`0gu|7Y>UUg|^aqNr=?l&)z!SgbbLZn9#v&!pfZjIHj+~(?U{Y&~ zOKSs?;<%H?@;btV<2V3yD{@xSGpU>oQnncm?webyF zAa|E1H1}F z5oxw9fq1#lYIf%6<~fI)%snH;#>8$K2@Z|0VKk) z+EiF^foa<(rP?6d3T;37NAwm-4quAk_lFSl_NU+NL>83UY$?dGBar^JEXeCg(x49* zwvZCT`g*u&t-wKd9Wi+wBlG3*C6;Y0BuP8L!fF7evc`6G7SPG{@x}jZwe?=^OaYNe1uF z87pQs(8EaR#4M;MQAZKBi=Jz$i?PF>FdB&I=yuR0!|wvf%(AKx;@g&$w18wybxzGt zf-0*nIxIH4H|)G1Rjc3@zq_6A#N;ol5Nx7vS zF=8l+4ITrh;@)#rUKzP$xl`*dHxyr7;$?1Qd5}BCPaq!jy{Qf`2=ZUqT_J)x2pz73 z@-()jsfiW}gSX-G30-}if#dw$-j_?$HW-27vR6zB^z{~pzMY4Y&sluGH*9SWIe3LU zhgzl;DRp3^BPpj6p*qs)7$X7~FXKQ1EC%PmM0M6oxq)ip+Y+#lBPQkvJ!gJtrcV<- zvhVEt#`&IIl+J5LS=Vz*DIE4xqUC@e6H}wbDu^b87&B^NZEmoy7h6}+TAa3SMQOQ z8wc!)DvFBQo31O=*6KZ}OV8-De*QW7Ca4W~w}X|y%djy+*XFxbj|Lxd82gS?!NTBA zEGa1^Nb@z&A)nSX+L(q9JuZMvUuCW&x^V){U&8E(Q25ZRThI;hB-kk*^@7dGl4Tvz z0jOY?&@XVZKKTJ|X<(dJhr%2e*+mr<7H=lfy6mT_*<;mMQ61j}YFMjv+|Qd{q%~JL zTAOJ6x~#^|k|Tu`o34`!)m!obN)&ORCAa=M3e$>6ZRhjjk&+Q#L4sdJRXYX!xLNY4 zR6^CM|LF3+)5a2I&jK2*%g*lpchcATE`xWtbYC3m2^K2xXpjWk14pO5>Zrf zg4=~sP6=s0+ef) z$DSg*u#%z@x^Iq%5jN}M)Ik%GnzbF*3QWw39{YcA=3Ij8 zIqsN!U2-dC zJc%nfc_A{l8Bpg#5p@*`4Kvq@ZqhS9*fQ}&4c0@_#!YhsiI8to?oVy@xAKS1KRD4w zDK)Vkbaw;3)hnED=l&^|5oOnge^(QdQ&bBp(TiEkZ7WNPim*f#8q}-%F0?}l|C}aD zIaTFN()+|C&@Xa))#C=bG~~6>k#fu{PgoXVBAu?Sq(Zh%&bE6hg2>5U6`wWK8kbZB z1CO?TZ>NMa!-quYWs76$H$gA{Mx%kQDM8A8Ys@JteLIt&JI9-5A&bTtPG|h2pra&V zrp}p`{k1L2U)lL-B#fPyh#&ItIr8j&GgP7NGJ=KcxT^k>xqgOt--zR{A)LV79oMB^vnDtuB__dv1IA)SB<%EQA@}GG&&6RBX9~kn^nKAAIe*? zl_=|K2Wl$COe=L3okK;m*)8#eJOq&Tv0mQ^tyh9iOQb#Wf{B4-@w5g({P3i2$F0pP ziF7qX#i&me)w$O%w z#}|V+$moukRb^Vf@AKrCoDT`uYU#xlKm+^{>e^!L$G?*b`TAbPAO&S@F=~50;dof1 z)bEs`=Isz;|Kxe_uP&&3v5w4W)U^T<4PM!%f8Ffw0=ed99iLR#^?3V=!iU8l`F8IVeY;Pt*OPdX{Bzs!L1Vu_oYtj_Y`I?h6Z!(WSvrLhd|LHg?X+ml4H9NP7w zD@x7J^EkV{bi5>X{h2%)Op@CYAwYavlj)xln4X*&-Pk*@Q{$D$TA5i&%Nx@{*p!lS z!LzBcp@&x>SI0ravt`bes z+SL}7mcXG&*+hEM)W5Mu|AL9PK$@Usw9qc~Z{HvH)%Lk#hzv6p5T~7kyHF^SDR&iA z3Y(bM45C*H_1M$mH`wZ@TbwUnoMG0-+I6F<+#L02y;#p=@)_--3P&T@A{wS-q|5_O zHp}Zs0}_5~aPZ+&&B{3*wbazYnPq`NkGew0nPDLDc-48a{SvcGqc_|V=FEo_Li$4= z>Y#!W{XFsXG5bh9>GVB*@&Yy0ICdMZ0P z;%3_pAeO_JqUSv|J}nPSKr1WlywVeNC(Zqx7lD)z6c3ND({=J-_yB%4D6WjrYgrMV z%h=A+3fu1~y|QwCaaBsHGHc_eJ^20FCxSfJBjxRlEZ6gk4;4s8rpBFzE|o@e`Yy%l zEYG>x6|~3Mwbk*jgW3Iv*>_>5FP4!Qet~bhev;?;s&gej_5>b+-G1#KINm@p=M>>` zHR?d}qaQeKBO4BIpv()GEZPwKZ1T8D1);#y0cE`ipVAXp+=-+f0hYypVHbUMH3|B%TUIQ`u>y?Dm$QGg?xwlAN{N)2 zwIIvo?_l(bj07Fhmi%W^AyF|g^PF%O=3iRWO`+C`cCPzA`1*R!>1|#c zfEGQbG*lJ3^B6g9q~mCGtisOXWR)2H@C*aL|Kjn$nd{}c>owc!T7?Hb8}eatYJVO^ zZa2nko2Z&vS$Rsl$^4Ri4;7tOb8w-ov)xJmi<~ zstMWzkb=b~#KVm1hWmM;LN=EJ?C_vS8a=^!CsNi{AnAgzkxewcDww(^p3(LwrgUY| zaLF*$aF&7vj|3Bwp%!|B1=fu(6Z5}T{8j9DBeaRfpVRF%ZVXTQ`K33YjLIwM2Gw4$ zEUWE5wi-34BMEI00w$)X^{+ozy+8Bl-OvBhB_FPbgSS5IVRsInE6-{}3xO?__)Cwl z_RE&*p1fM*;3nD_jPu!cnpHepTACcnLsVoET<*B)7*Pr)?2gMTG_g{xh;ck7fL~|q zm*}`TT+Y2a9k`S+`SuwQpssIpyK{dIAKdQP0DUK#z#_tnQ(UG>)8HCSccY&<;4g{NAnV;XBh#G*>}=ByM?nG&z${XBV;#G<&vt>axzlf zJwcUx)Zdw3V8uwOR4tTUGbGJ*H_?qMzC3gixA!O+#^n5M7%gKGy!?0I-_q`cgs8cy zsx|cepF092Rq+=~(cni~1ym6Uv`w6(JB$3yit;_ZEWL&+Kutz~*^k%24yP5!RSDlH zRMbsR$(?Yb=M(r2@S&iu5`!$Sq9sSYGith8m5K!eThn$O+EJiNReDl{V$w(aQg{d= zRxuekXISZ72pFQ8Ma5JxJX$q?&-4Kg<6RnWGIQRWPnw5Z8u9%k%$L5jMI%)!YNDB# zvTM2h(B=mWfj=J1Ps$aF*Ae~rw11u;8)#?^ya@QB3W<-IqKzrZp<4#RDk`X8hKxDt zEMjJ1aZz8M>|0TH9p3>}w-AB+l2zMm>2QvYodj?}(sUhR$II~7UGL!2UH^V}=jg)o zA23az*AWn)W=p^)CRVKJ)U&kAx3uHj^ga`fY<11auZ;J;=gDeG6ED>M(f=-5C|H;Z zZ0xDgb13}#wctfL6EQ!9*Y(`U_``pij@_PwmEHPrZ${0Z`Wv}sOHboC65iwbCkNp z5#{>b0x>l)uQfLSM~M~{^d{PK_)i@hi<@SYmU^i7bS6)H`k*7!{+(6q+an^m7Vox zk)u-6c7Q%0i_Y)an(S;jDzCij60D|xmMz0e+lVNH3`QJ2aQOHlm@|*I=aA*VEhw!F zaIu;U7u$b0)B5`baWfKc;IroSKyXZ_E=hnXq_T7s*icEu!qz(9qD7~s=R(%D{Y7Kf z`^adP>qDfmmZ9x@r?A=V4yGm@loq^;Lx{P)IO_N#J;;!uD^ zx#mTMtD>H1Y+`ctjO6@zpEtE;K310w)b=m=bo-|cJ{=(k`jU;~;TaZ2&@!(oSp&WT950I)|e;g88yEgv%I`-{5cM|$-YzvdNEVmN|iR&{0RyOdS%@`_94Hx6k;k906{>$zmjM|>h-{tD>A%zMTM>Y@?TQtW;Y@@ zNgW#$6*L!-LPnwj$XP5Etfqr6tbMJ=Djc8*z_~m;u2D|?*VnTAACiW6yqg5JxPxj zY>c)$J?#grRT<7RC?AiH=-VBvdF~p~-9#`jH#26Zk1d7O%+q@C(tE*CI`!tP2^KD= zVxTM#nY3V4T7=lM8Etg^$t?z@HL(nBM3Evt+((X7!5?KzJA0|D%xo~^taO=S8%Yu_ zZT-JzBYMD}&Ia!N{2;>?1YJ~UUAuzJS%iFaI2Ez^&-xpPKZ-Thur?q3>gKyGIUi@x z3|fRJXxf0wd6mGT09nAKs@FX=xf^^ICrkIt8SV~b%A$n&`T&C+xq}eNr&bgX^z&u0 z_T3WG-c3aC-TI*Cz2YQjVrcJ<5I$4{i#Zszd1e8a8?uQ zdYX?(zd=o+NC_n5?&DJyLXw>kfKSbz6?HX(#*T`$9QZt!Ct7Tvk!Imf}Gw1%E$@6o4Ojw5W_mJjc(diJy| zy%6N4Ee0heek{+OwrZX3`~zj9In-2flSW4(<`CR@sChSgI&Fbm9K)e(;E$s*AVV*%B5xH{99S zM#imxW>yRKxU>2t)Xyl4$KnoW`$2&;_;dr)$nl7X;CwE!kF4{(?YWs)kd|eR|Mq5< zqy4W=)j3~HlAW&e#XU6oRL)8o0`F>j2Xt?^1+mzyI6m{Zw4oq{m748tt1T+M>E+#i zvpbpvy7S1eNz0)#d-W2XMMii+#Kb#nAvW=nB*$GKps=!;rKQ2~%rm+@Rvxs+3!`Z# zpa`pJMn3S1fR+|di{>^j$pF*&W;=!bi!+0L=Pf(St~>j}t}{9{m2JNP^QQX~s>TKn z*M65T8jn3QwN!O|gL{^R_RMejY_2NUqY2&dBf_s>90YA9)t?Z``Lw-LOQW6R@2O-9 zEM;@UWdZQNGkxhr;EV>g;RiT_(%Q)SPCi))_Il_BF0z;l5*i52>`3hQpo7)_W)pQV zM*mE8+Nu(giI(si&R6yZ2~ku(++ zEy2iO;5R=x@0Ns1e}ADS=X>-J$Ms)l_B^ScGE<9q9)Ff!j)|RAr~7UuDHN%^~XC-_Aj{jWZ9zqWCYjMuuD$n1h^{g zh5!kw>0x;QuFoJ4EdDw~9lL;*6@(B4e-a&?1IN{>jcRT8r7pG>_v`UR+nMS-TpzuF zt{{A7<^0@UNlOWw&WhiiK%yd(zW%T4?oT9qzkQQhevXhZx@n^Mc>VI4;R#kbw)>Zr zoNfMPFcRiMP-rc+AQFJqnr0ARAhD zq!r?*ql~SV>`c9T<(4Zvr~JbY@+x3eOJW?j#kH+G1{I%@J9D;eND(3(r~Bj`&h-2< z+w$EiB*DbuM(3LV2;Sv!#vq+;7Xu7*H4%pm&`Kf-y9nmeu9R+;6!{17+L%p|r%k-N zX8RRXdcb?kuc;1{IFdGkthY{6qP=lfjUh!cLl0g`SzLH-TG}h?b@e~dl=m4u_GnCJ zZg{J8+`Mn-2hQAc2V4pE#$9Y%zEdeiEgJS5SIulK%tmiQAA6ARvG{-2{5W&}Ry$+k zXaX8!2*^DlO%+-jGOcR;l0lw#!u)zZanaD0Hi8$A-zF0z9=zPd#jxijqI*X3gl0D; zI=x`d7Ph4FIb*4HN*1b;Ts6>mn`o`QE2-_gm;S&kpxh2gTD?U5_!H1&5V#*~x#_>P z9&~4)!$&jA{_SvGNB|#6OwMVodR3D4t58}M!?N;xmIX~^iJ@3f*oV}UC-jNiO2(Sp z!k+8Oo6UtYR)YKlKONqH*kDhpzPPIU-NwJ-LP*=soyrLQRzA5hF|8sYt7NV%4lm5# zo&iam2CjY`bQzhtMuqXIqbAi&HJIXBv;X^ZM>N}hKH#)dR@jF*luiNlwu+#6t-83x zLta_XM+fHS`&~NMV_&9pO8d8p4$7+r7VNL>w7nv5#aY@kb!~D?NTjF{#%MecAl_OO z=+K{BgvFl6flF^QhRgHi3L5zIVlZ~+@7Cq_)c%eLsiOeyqnGIW;w}HFtLts|nCz~o zTVCiW|NQb+(c{McoF>LjS&BB97nhbGLxQ59{R<@Ye4q(bPtIsMHo{CK9_wKI0H2E= zRDU>R*`A@085^pc{rQt7!(E`&pDeXai0k=OP6;IvJ z?E7_3z=0fBBHRUAL8YZ5)OB%1Md)&>Cr>VFvayKZU|=#-6g{%AR1m+Vz4dngdmp#1 z$x`G|GryKdrZnOm4o7uFEmlu$osp7N^zsNVK#VQ?za!AUi`JrQ=j=~IKGR*e4D&8VIamr|~} zWVxv9p)8OPL&I%ALwJ<`t?t{sYd^KVXL5QI>Mmfw$Z_K#&vm7!sljt@e)mNNBPt=` zB~Izg6#H_$BF^@j{=@V3l4Gr|7l{Z=N!sDDMx$FFT~*he)9Oke$M@!^ZGWqwtg4oKTB;XbHOEl1&NC*H^qU)xzR=U@jy`py^_vZAowvAC43I zDQUFc94#~HzS0<-WHAkfPDnPo7km)Moh<357uU8RE>#I3SBaB0Dax@=j%qn}o>DF{9s4XXV|_9okjY*b%Z5r}&J*nf(j* zEjB6s2_GsnO4O*Y3$x7_4GA)iPl7#a+2nM6!e@9Wk@xGA_5`~!lkEqj;=<+&7YISG zn-(NtcrY<)8Y+X|wPGr*&dgcaFBqZxF&7q@p(|I%_Zox-??XL7L!TbQp-zy7#sNb^K`60KEleJ1(h&1RDm|?^^t-v; zV1bE^_CRNv2_D;%iUIvaJg)ZDJ>YG^{IE(bxiABI^~d`&N*cU%(hJ;{LH2DJ=zxK_4U?vu|0`B(46?TCk3V)Swwy(F&Flej z-y!H#TGiGgPIzfHcsOUDjFc7WJ~JgJVBttWMTG|+qZ7ZZyE-)nhw4_0NQ-XQKUXvw zpF7xq_+4qfC*GVz?8jMkeqBtu4lz(rO`jAYl-}L(^Bpb^DYl=y;ZnpQvkOcvGkAmV zwQ^7Zv(6pDB~({G?XBp3-PNhC6C=w|WV=ojWV^2uQbhhZ?tApfe`O~r=9yBeuHXau z;Tg>6w~uB`6jc@y>OUre*Aqiwu?JALA<2PCh#o^ab(>=jfDx3c%({zF`J34WECY$} z^}ywca4P6w@u(`$s!6+AjXuqBVLBRvH`Vp4TSUbK4nHodv=se`|BQ&v+U9_CxBFU0 zgSVOVHXLuXDF$+tuxTa_*l(!QyXYSV(AQZulWh zC`wtgQDb3IYWp21{RrIXmUywlh6dKI0s++;a#Lxz$f!u!^x_C%tyf=+$s?n{-s#Y& z!(qe0nX0yclM&8-uRi{gJ!I_mcQ41KT$NyG|>lm*#M7zO0!uGu_b_ zM4p~C54C?h4Z=%k<}XxK)AFZxiPr}3eugK8&P zk~)I4=4Mposlc5Rv!S;X5n=;WQDJsi(5!{XHd%UfA!`flb7$@!I#STv817^>`TcIX zjXv3EB};aq=S)N_jxfmJoSC`a+Og5M#x?zSBEO(E!t2^IVszQHv#j6afCu*GngpFa z{2VbHlZF=VZY~jV>5s0sF!+PP{;N2%zP;VLCdwZi{?<@-kV(^~#N33yS{xSkmfIhN zWqj-!p%D1q9&x_W60xi#S70YX9bh2grVMJkx|6)0U0eTCmgfi2Z-k&HeB--SQCYpy zSdo^JGq5jO)$!ch=k&>n;q*C`rqo#xc+DHx{x8%k<71usCAgoK6a$3bWiqUi>j|GZ zyY1@}Hz$WrQIQAN?PH``y*Hb*?TFdhKSy60*Q__>&w@AZyETexautgx&;LD~bpv4q zUjOT#yR4XITO7Y%&SJB2CADSvh@m+;&efGnGuw(m!`CR$Eiy}0=;TrVl>>6juzFu> z_G?obqsciBZ~{dJK069MNA4%WT9gEbkdn~`n+}AhHhCREmOR67)Qrz~^jcJajoP~c zE#)PdMoN(Y$6;tFd~C6#Iwn2ZYN_of!* zweFzWPPdGe70&Bxhxf}IhPK0N%_iI?87NG#v3F(I;3ez?o9f*FA$ZYE{r?M=4(bT7Yzo6!_q}YZuG^L# zC2h@b&35cLbN4V3H*4LmvJ&z_8ZK_{zquXh&pWS?Z_Dt|jh*&uDrO9Z4+7X1Sx_&+ zT7$=}0F4z%$;ThaET}AuZK+~c(Af$cGLUZ8Xw;&l7%wa@_75Dy6)J$Np}pd#yrU}- zQ9)&DV*V*6G#bsB^kg&ofA(2}C5`*wPL+iE1bG{{twBEs4I6S+&~CMEgrzdW-ZI5X zeY(PHJv4akR$Wd*i<=hW5apGV$6)BYC&`n{{^iN(mF@U%J2$)S-?npJK1fq)bpzMQ z|C0#1?JvC6fl5Uq zn>08N|J~yHE`suT_(9Y6-XXPZKCz7b;tX)2=K;#v`l%Z4sxsUvDkC>Ai2uSQWL%tP z3yc($(JaP?jg+Je8#sXc!Yd~{B}QTGLdy*>)oHNTICTUdQ|UD($8KZ|ZqH)?#_id# zS35bjq_01p4hW>jy56Xctsd3D5dL#{qr6NV^XDV2*43NN`u<3krsK!!;}18G;OYSy zjl-G#FGNRaJ50ViJ>@kON*)^4otdqx|;7z@*5bG5Ea6zMozT>+`XQz@iEf zV#J^yy2>&};;Eyk|E(zbas2&;bN|6{hJC-euJ<(_-pXp zdt1aiaG2U+@G@-CplYA&*^17NbW?gY#Af8O_0&ZVl^IF>W182o0 zC5jpfQ(q7DsKW`!@H`K*P?y{W^qN{I46W+b&aTb7_oSK>pBk!} z$%#*{^zdOh#Ib8}s9`yj3m6PPrv7Q$iy>s|?)3EECt$cwCe&cpe*F*q@8M;>ul}l! z_aI7^R#*A#ys6&zm}0d)!(c>E5W>QQZ{5JqLJEq?z|zX{%)nC1^2)%%%7{fL8JTWz zB<}VQr9lWgr`10bzs-~^SgF-)^#^;2f5zfZU>eqJjLl3LOxAfCo0vFHcW;|n+V-Bo zFxd_0rJ(Q4<3=4iw>BLgL;hQYsI0bx95s@}nx#}xS#Egz*W*&j&}3BrLWC5kZa{hm zEa6|HX!tq5S9X@Tzgiq;Wogs3@40P_wcMDK0!|W@M$`7pXjI$Ta+~0D*WT zS)OpzxTtr0-;_RWXN>0^Cotks*y6@+be(S-I6jvx0%~r&sHH)zI+^1sw_ebEhAx;P zaRdTZ-Vl2ZDKD#&=dn)|Od3)OA$=$H26Yx#VX~@btYIUE!ds3|76vvyenN)C8VMRz zI29!YG_WdKpoN02{b-7X7IMRORZk*Uy$n=`QCD1lr0NtU6y@A zxD42^I68>yI~u+;b8c|i*`uHLs7J~)f-B{9{ z=BI&z_IrRb}ey{Ed&c6Ks%D(f&vZC!k2JwqCwlkB=aBh_?E6mmgPMRf3O7dBVYQoZe z_d1QD%4XQ2iOKR103CThd%%^0*DF%Go@Wk5UHK!c;*jRn<|Qp1IT92?B)Fv5F-UOY z5hE!2tj--rU08pv@l~TjO&jtpp;fCwqW`iqI(F?ka-+1wq6yNVlcUEJT=X$6%KGnM z)%>#f32KkyIjvHt1KEdZE&3S_q@C;WLR&?%lZn^;o;?Ah6<{f$jn=+ zwX*1c8gw_#T$B}yv(Gn0zItkaHJ{2Gnh3fSu4joNnO>0mXJ;INGX#8f1>rk9BI+Ba zRFiUlJAK(%HfddTYIEFbiTk&@@LgE6Fh*&HFDRojgl=V>MX(H)Z405( zS$sQE#_WFG;TC?%)f0J##pX$%ngy1}{?8|PB+n2^nno4IH7v%RMpoDc=OVK_!){%EuQg;a zks7_Oq@p&2tuD@ep8gQg(h9eOgf2!DSu^Q1C{e_+KEXLToFv}nPa2v%)c7)@kJ0?N z&Hd|wrnj$|hYW}->O8a352i``uHY&z@QMr~4emh(>d}K>Lx)Pr+}Ga(C;a|&CH($4 zDcfW`L;k5-q9d;yG|)=DnSVM^4Rk1Vws!E3OVs!Vj~pAn2aL+AY~G;4x9~ACG|qT#$N67fpAG+js9Sl$-~ zDKGS?X0n{H4s&E>{snl3hDC9)yZhyy+Nq9p>?Lr9$%3`=%+EpQnBLfh=MfWEPwERh~d^YLyfyV3m|QO^4AHL_zdtv zK!`vA7$Xg0%#&_Y!=R>us*HmqVb5DyeCGAQ4cwO@9O4ketV<4`k92vth4EW6*zZ+4 z5+Mc5t{H~X8STLj4{46;;Gyz=5P;M58h`R%J_%uY?pXe3O~?1gRyTJa(g<^Q@_EBj zBL~3xCN9ZXS%!e914TCV5GV|#KA8#Iw;mdQafwEt`Gtkncq$-c*UV%+6_xTD3j%ij zEJ-(A;C`o>UXaj$ErTHj*iP3;QtSwa1=hHKkBhIc=Q}|I!tW#k)i>@S)=o&zKVz(z zP@~tLb)heP>hhJ^{OQdBvSf`Y*-cn64>Re`c9&Qmynef)yhc_u<|}nRK~^;7PoISw zl_gp|dOE^y2tKfF2);PNos~TqmGCtro#)y$!ml- zRX9sJG&#ypX0fRf2IuR2<3sL#y77yKiNuTOZzH>^}CdGFly0QYp)Ho(3>_`dV^jUE-04?f7C3z+Zs`@*h~sOax5!M%N~unFIW7hX0Z-|7;aGZ zD@w7jB833gTd#RmtHvZNvkyT$8?HxlTCc0eZXA%&^2XSiO%tzf51{U9<`a!fEvaP# z_4j>!LIIOgQrZG~H&BrR!eJ!{`QMtXFteBpx~cyF730L$0%vGo4HrVmlHjHW=Ge7L zoL^*eoFxmN=_>YL*nNdf+-V;F)&4ux#v8+qX_z+`gvnD#k9W1L7v28CiwJJtk>jqY zy{O8{@ENuCSF1g8T7I=2$|N(midaz>EA7r=S4-apIo0n?EJaD-KvvX7Qu8l!z@L7< zeMQ;Se+gv6rRSxprM{eDofF`SO1!JqsWzH__9T)A3$+30wCbV+h(by#;IQX#{p+ka z64KJ5km)@IxDfSih}jUBIMn4Z!I-O6)CIEqS9p)Vv)=IhF&mE;!{W3(>?%zZ!~QOG~~4a!Webz2sTTl5SwQfWz?u zSb)(4T(l=#Rl)}X%$@%}WJFzkdO92JhWB!8VGkHrRZm5V6&9D2%{Ecw#T>EzT(yyK z1rSVzdUAj?M%`g>QXC0#7-TG_{8tB*4miSQFLreoHlh<}#D*2$bm%>!lSop0#j zjr!z`q|`g*T_>Fh3uHc3q!ufws&qyZz6SN|WEQ!*ci->XsF8hCS84UJD2$qcSvaXq zjKrMd;|uz}lA^7sDbpf3U%C44#igomHgZ;szdT%wOqr z&_5QaEfszk?VlvUE=<0~Iyxj}Wu$y^PGj@#F|^GYRs{g|*Lqs*77X&5Gxs>MtN;gE zu>M-$((iXq_>!eZ|8mukc3QF{G_E^ZeM&z=vjaT95rsU&U((yz7q-|BZDATa>ziaH zzARB47vfxH_QUin7*qt=Aq}-I@_N8cWf;wUxKoEuU$En!WVD6?xyaugY>?BTPhNI3Ra$5ut ztEfPM5ic&2r1qWZC_;S+J+|%u8;B}M$lU)BuvMy^{#%-pdPi+`dopV!BEoPyiVNiq zC^}HfADQNy^?7OACl_EVf6D$9heK2#y*HwS*$1pB3N1ZJsYo1Am3XF%zXok{wDeIj zXf4Sp%ReklK}RXkPL*0sgdWu}Q%?AR$C?b|UsY_(DPYBoPS}1CYjyj&;c@lo20$N+ z&--HkIQeP%jU_Y)9`YQlyxz)7kkGZG^i)9398>FB4GViqqvsMCZe%3+k_-#-CkUeK zhjT|x`zE~9iW<{n6eo>tZ|;)-gP~w|^$=KRvL6IGU`bXK?%HzFrmRrRp9&erJ5Ms5 zdY2l_+X+R*8{ zIOusROH{hgboI1A+ii$Fzg}n4D+;s)6n_&}aPh2vHbyyK`f@`=4&) zAju=UIfuuEl>eppUa9%Uhh?=L-M@Db^Gqp{!XMuX9~PxQ+jhT&7$r8FXD|Ju4tHL_ zg(b=5nUUmMF?9yck319Oy;M)`lJ!gm+E&= zPQ!zuRyX`T8(aug+qtB*2qfMk)b`rn>w{LF+g#xF`Zh_^0pkS{^*ikl*d(!Qc9 zZWH0qQ-ul&sgNpHiAl0Ny`SJK2uW6Eb8Wu7dX8gv?T><8ob<{^rYGaWUC^mQODr zC&#y&k6${q)^I3PabmK{zC%ZyCFaqJjX+;h1pAxGXXHOr=ybtF+_kf`D56EG_!O3MCgKPg0PAJm_UCYfe+9E!Gv>x09&g!NX^c`VHobD=ZDJBVy<4T!@G* zP$p6$*fT^LdCro-&%uZ^Wrd+Zp}k1QkTrOm;@A;nUj?+M>JZU zu|sjVa<;nYG&}u=fAks*m$dA&>94LLr#Qxif z*F+SM=buRdTU$|S^q@OrVPX3zC^9l_f}>S~&b8j7oU&p7b}7sKR;NDtznl6$$o7NZ zY_(J+&7Jrl_0Wv;R7Xlk7S$vT9Y;G$pM!nEK*$N`*X_yhXo4y-2fEWER+!AL6c$*N zfW;NIf-x7abrkEE3$800yx<|EAI}%B_#=8jE>`S~#%EM4|Ls&@xj^;bjx#H0pqVkj zdMxdRuh=IM*+`d3sdJN2WJf)IU6=@#48$NiWR!$uFNFY^@62ig^l^gMsKuaIVs@)a#7Xx2?^Wa48w+EmrM(+h0&9ksF-4vdI?_e4=dP|e< z?y!IIF_hA&?Lj(Oao?F!Az1%zOmFTC!I>(Y8rC=~!^X@~Txu*w=prp1Me!wJTr2{aNx+1 z$!6krrR7Bfq(e}^rhX^+?~K%2yCj5ih&kXy73yV&zYbw!G`TtdhM)z(JYfg3PY3zSET9i)F_Px@m&{qFl`*AR~*u_)yV^u$WdhJSY3 zu2>^r<;2bF=_2jlu@E+NMnK9MV%M8KJ&$HJhnO~2?2QmE@w@21d*VBVkP(M*-~^}7 zZ#i0pD6Wki&1*JW%gazCnyWZ}kmDl`;c$M^xa3~7(bI@jV3R7@PrT%oryl6^MNi#I z(5Or3MivAfoNg70&Lw)7ZxEM&6f>?YIc*uYkg~F+vN2ZIClc^qVPLVsgzn*_v)u=!u$u!v(_yjs}lRLU4w129)$u>0?JYlF@EB&Hk$Ob#ucU zOH3Mr3C_gM$_Wsl&=680LN%ET-TvOzN#O9~N%ha#G7w&IfgS2Ul6|2$nNlAtt>mJa ztt7S$moh?^KTuxGX%U#x-?h-!+fB;3B-DZa3!JUO8lwu*;U_FyRno$G%fPbFmBjy& zO-j9-4|V(8o=i_lp5Af3+O!Dqf@2RK!F9Hg*?!hPerQF62(b-8oI@J4T=gJxpCK1vj%ZOkF=!#FzKlBZ~y8o};Nu%{EcC}D9a++fz z)IP6lMSm2@M6>P(Gr<>W+|U`x6ZuzebLF!&=665zo#pH@5^RI54yA1z3RHPyYYAIO zCDp1m`lTz5Y#CnGR;1}%D=L~I>aCu}wT*5oiREo4<387ptd4-N7KCfT-)M=0>cfRr z5AsbB#Y7M{VtcHJ(fX{Ttv`HKBnmWrsO9qcy+u=#Z>%N}7jSoW#BV;u6Hy;T$XkkOs&{!j>l|o3M$Tn`$9W63e zl<9LUuQ;#dix0EgE~7XJ?P1chGiI2-D)C$v&GP!9X~Vh=D2Q+G*BuV}w2p|Gxc`q| z&)o3A^zLgrX|O16&neFg9WofYa+s^3$g357Jv=r^OgtxKrp8N~6qJ^R*pq*8QwxxO zkU~?pK?j^yVyibA({AfSX32lyrH+#1dy~VeO@iV>OuwZ(zq;<<&e0Vx+n$OHI?xD3 z5WgZD<3WArRq%?_U+E*-ElWyL&~GOh;7ZE2s)7+&sn#^%HqYEDFS6Ts1dUminav=J z#rzpN`)?BF_VvR*zojJRZC%Ve2Z&8|vB~|Yv<5ymWq{h>YK zRNxb*xDtBL-dNfoUo=V$1y-~k=4gr}yvl99eJ`jDWcYG;@&gkwe%wFMkV1$8`FNzb zVIA}qzpS?Z%WwY{VQ0ahI*H=rstuY{QFUW?`nU8!wUXR!JuyOoRU0lY9kqsr#!vS_ zfk81t1Bg)fZ#nktgUv~Vq@8eRX>FWcU(9VROujBhyuX&5bv=)W`P}`W({voTj7H%} zv7;8|7ei|=Hm-URh4L@BJeiECkRuJzCb$hOHf4zn4b60@y4vo2_Hx|4K}lH76;-Q* zibqSj=YHB(f$w*B3-j#E9s+EhiAZW-;oezX!sNA`_HfM%{_g;RZGP>H^oJJa7o`Xg z*XO%YGsYv8mWIi6Rb9!zbnY9}S*qD^Fg_lwsV1vD4pRK?ADHVLS9<6d+Pr|wSy)?1aSFd0--+b|H4Zjq~_obcfmww1(+aNC=+Q25$P`e zJzu?lFtcNVcvAoGcO1YExloS+;tg;!t{s?7&dGmT7Mhuf_TL2WM5Lvnl9Gd$HfoA< ziCiB(%Od;2_HsgaKErS-Q)^y{?8=*lO+05$BU~O#pJ9% zf69JMe?eS{vS1fA6qrPTb<^6!e$q)k87wg7Zh;BFZZt@Dzj`z!`T9b!B$%%l6Dojg zSkrWxS=!8-*MCcn>Gg;Ya+sg0=4a_pJcqy@jH9*%kxm{fZu$@)@Y+*9@4Ry0B_MX3 zQHl&P0v8~TjOcKF6&G>5J{+8`Ri)oGR_4{Xb-%j()VSsr*Z8EY5i2|X$!<;)@97eB)a0D4H?_3P&H&idrt_1G2@ z30bF9=4uTZ=%&fXi=a=%K>x0ecF#>5(Mlj!hC(f@!~wbAkIyS^{~83VZAHSi`<0LB ze!l(i;{cP{m!m-$14-XUlof&Jj^{mwH}%giUrAqs?Ydm)@L-&xj*5^U>ojktuea@f z1IG9LArs5v&cB?t;l9rY9fYR`_I}*uDHyU;d1TTI1oxGv*m-nY?eDW%rV`8V7?0E zvQ!Y-ygrb9pnQCPv<8elCtly#VOD{**1~`HYA~B-Buc&C`P6hB=~&@vwA~I4y1$px z4lxdQB^`<`cEr6$jJW99K-xB-7%VY5wl^+H8Q6z^Ur}X3M?)-s4;&09A@T)WL0)av z=x0BmU~GgqN`pF%#$x>`?y@bd_9o@ai>v+%Tl!P3H85m|E)o94%C`$b(vU<_!UDty zJ&69qfLXC2#)>3{g!pE$i5pvM>WPVmr9t5LB|U$A0#nM8*Y&LJ-F)n)xj0IzakeVOyT=9Mz1^5SXMDoVkH0Jvj_^6<; zT7Y&GqFG3ZL;Ql}(U}?k;K@yXYbkiy@_{xeGAKz43jXz&umy^*NzvkM^pmwJ820+~Ug12mmd5OVv*k@fpvZkbDWikAT z@}F%%56U_FWUdS&f#m>O5+v3l{UITn~4Jl*NOf4||m85Be=Z$byuBxk8esMf7p{q$ts9G`#j zqD~ds9!b6MA`>ZW7+#$}8lRZnuC3THo4)8D(`yXePx&NmxTP1Ae{ z$H%RBPn@hWMb*v7Dk|Ew!E>JIyJA3GeGv?;E9EEH#U|E2q#?M~&_ z@qkN%9us+INrQf67O+{;Uvg_pG1Bm|IQ;I4scIR6;m}lkT=5h0gem zSpwn(g`K!<({c*;g&dujD5%EuCBBKk5w3+DB-w+B%&jcOE*?Lvk@EABDl3f5T=%M* z>hzbZ!L;AfQ0h<2n%s53;ApRgyMYe;_k2XZuR{#y5?i_-uhoo8%WjXXtrXvo9udWQ_qF?+o^#|8g z?6QUZB+mnJNF2V}n@3)4d*b3wobN^_rgBJYa6L~0w0({&E_rQXTUy|LeA36I*oLVF4R%EZWwz6F z%HN!>^m|DbKj~MXah!m#l0$|5#00U{TBVJ%gTlV-KRIrC;wmOr^lv3zPgHwvRyX@C zD?1~UsECG)430njYLMKuj#FIqc;EfZME{!hLWJlA=z@F=UEi3sCa#v_rF?M0Vz$H0 zUPHFT|J#uR=aa0Jb+y2}iF6pnj<13`V(52WFW}9WhHfCmfvVe)XxAXzL?mA>ARbC= zc8)1R_;dK{`GMp^k@4pDZgD`p>NK(BBSXFK zF<|<71V`d=O}M*AgcN9ji>>gMNn5!)?gzX-)l$^c^PGMgvuiJt8DNCbA{vy#A+Ht@`LsaQcsNX%MuNarfP)SS3^ve(aZp78 z6-}0tEy;uaL4Tpx8=hj${l3NxlkZNw_sbjm6Z~QH$o13k&B;j#rYz5!rGj)T9kQ7O z1LF-r7x@%E8CsA(L)|}^NFkM0Cx-m!Bq|$<(A?VGbi6(w+x<>~U%NBAH)$IN!7J4C z#^1;ps8))uiJx?CT;(#b8&k6IWr`-B*Wz_Yf=FidiQhQ{7vi_{c2$oI=J)HQA=vn0 za5~@+my0J)Q1~t(=4!VtEYBeW5=c>i!WgkS0;w);uBb1lLJs}@h%_UZOOxYble*)m z(~FW~oU};#EtPJHU)3xuZ8H#8xAWT+5Sx@J+v-YTOUIK8Of#gPcX(4YH}3jc3i1Vj zz-58=4=(`8ZjaI$?P^qkjo4@4mICI0e!*5x3?83`HPM>y^vf9rzZB9}MD9(^`F9^H zvt5S)7^`I&cV(Sig+GKDM)ZdQaq2%HI=2!F)fD`EglIxUOhT-VL#m5$IGwXtld?*X{6cJV5kDh(UK%n2$=+=j~#jsBqHc#gzQE#-Ri@z>Y)* zkQCsw$~u3~eqo55z$e-@0kOTLe+g)WrDO&Ydz$v=7*~fZhBtigiAL;fTPCcuwU($N`1Q_~yoFv}T7&d*D>{s=&U+0`MW0DH=)XNUOJ zO;0;jvtiH!!^PEo>DRArEwt91;D#GvxYAW<(#Z8K9h@{RAx<;EsxQ4Y++5z6_>tv605mK@go#V393Do9{;@XI zbp^o$nt8B`>djq2twUpfafNXIg!5~*$?e&ulUiA&pr$6MwbeD(<5p1D_uBUj;n!bl zLJp)C>hGEDjIlo|DIVWm*F7z+YBy_KUgQCY=t!daBFPw78s6ffCfeX(3aB0~qX`bE z;v)*USes&~X$(b;6(Hr81W_c|jRMHyy=B~5Zd^TfEn7#~&v8!N&db-8wdb`Y&(E)$ zawXI%E;BtR+dDqfO&|CnKpzj{JNu2)+k*GKpTxB#d=r4=DUiCjGhi2T)j9Dnvpx*-+x91T{4#LEDXWNAR^dbtM}E(v&&18WFpEhUJ5Bnw817zrD_>yc86VHDEllq zM98?r%?U~an^>^7cd?`2@Y{u@y-{RZZQU(HJM0On4?$-jb#lqGO76Od^iXMz2|RuL zqT(9}D=slQ<)&7jU<)3kX7eM7@2lS2|0;$}Mn*$uiR{*bP$*U4NW+!@wAcZHBYoVH zXP;U4*?ySAS}=DyqR)rsg7d27!zDYMTJJQIU0>x6$LmE#Db~{Bwh#>x1Sx)&+Yj7&V`w7=C(LLzS%I3t>zuerb*LexNkD-kL<{ zT`zu*@Y-0qiHUvDmdJ~9OZV3!HI2qYwBHNEKock?#!YN+PNfR?QHjahX_#Y+7;xFKj7FrEu_9ZGRnRktnU(X z<((u|o_U97gL23(-q#!}3D~+l{nXOhMi#f@k!qS=7PBluNSUI-RaL2yIK3wIaH6-` zrWp{B>#1lZ{97NBjcp>F+E1s2#cFqR z$05Jr@U}t~!G>zid&aqbu&KL%m41KI>{%}G|v*z%w zu0OfvMEM+5U%uEM^?YAiGPI+{yws}@436}RiIit5p2yab>5c9UG^?zuThL;7O;ryp z2ZXdm9;j00N@NgQs~<0ug~49SmpYa#t`M%sLuf6Wij*aO;BYWH_xvI|JUyFa*_YZ2 z3UaKltvh8z1f+n`MR2Xyut55y*K@(0P`Pm@)+KtPPSAExFUaa_p<1z+CFNb3u5C8^In`82b8}pM z=nkRuT{unWMe(&KQf6Z+)}cC6S0*Ng%r)R=M22x+5Sy>>xB3jLdx3eU8|y(;?yPb@ zc?$2{>EUp7r6*^r5;>+twYMcSfy=a4Pqy0%_9mDhWp{);D6=jG5}kT)=NLDg|&IJ{GDZ{V_)$B zdf%-v(S-_PUaINi9UIlmXHty(4@VAN-GMj}ks02tyeW58DYqj-SdjbY&h!HQo`TC9 zF(h|JMZVb-R()^MSm-l8UEZsnlOe0hFJFd5Gz-QliW>MubaV+CTbObhv-%6e&r~v7 zF5dBYfsSZKheAj<8+706GDvWKr@N=AjQ@{(?~E>t*c15Yy9;W5EfNoYzfq>J z$>M-eSdycOeRHyB?F7ZS&GC#y%aI2QWgOu_{=e>+@0btC7YM#x7g-f+9e`%(bzZNu zd*8bku#tjp5q!^sLj{}a2EJ^K#utJ*%)vprw&nlOF`T*)HzaYXp`amZCxvef7SXZA?W zxDmNVddi*B2m4j^I*{}H^J+xgokWB5bT~g13F$DLfVq4CG~yMpRffttXtp~V#(H>| z_chszmGo_)N7(Vkqbo`q&R{~Ag;|bq3xtB>@qM$#fXbfm!;Xd}o%b|%hSc1c52-&8REoXK(d@j2yLQ%-q zn6glBA^om8Or`|h;Bhu_sj;O=Dlv&xOwVWQO=s$ll<-0Eh|{V&-qGIN?+!m^u%o3a z#8X8D(E~jkM~=xk(OmDgojv;Y#qRXN!OcuQ%hcz`*T=V4UC&`F8AV zBJ%`FmTWWVY5tK%!Ko3Y>%0>4bz$I)#ngP9$rD}eC!u7~ttyStk~H7i3x;ITC)dlw zl|ME=x*2ZlRZ~u_N1<%PW)@{3X!={%op_x`<#0Hr8qd6pUPZCy57lu;u6X}F@5ZQf?k10owSXdbyz202C4jQ$3}F>e?chDCet5aTwy5P$b$*h03$u{rl)oNpUeP z7Mq3w3ZhV=L@CPrL!j^9>SAuM;Sdz_F(&$iq)N_;-iqT5q1-uh-E~YtmUJv|OG*S% zV9bgO0Xfu3{^`5V94CPcs?Hp!2#O2(*PJ4rr?4k(^a-~wf1P~i#;yKr(PjUa%qxOz zc&ASHT0e5Si9#k&{9HhSz)?Z?-TDX3;Uds;A9#w?fLM#VaQjK-`g|xIpNy1U)B!Wi zOKv$l%Bali6dbIUX>2T*_^qF$5uHT+2E9_XxACikLY%@X`P3KT&Pt}q2m%ttG8`uC zs3JSYh~#AL@gWfcUih#GA1|CWWdae9Je|{azRy4f5VYu#KJo@g5ovLCNd|g_0||t& zBWgaGkbT1Sj6Wnsm1n{WNX4wm=TOxj&N7z?Z_DrVCSQtaoM4zXYCNPQ&BXKTR*8JC(F_daSZ{ZIM4-9T)mXJ>`J;J9!2%OUK6KribSu|SR%q6bwdFA_ zx2m$|+59V_D&s?fFgrM7)qOajX#xirp05xU1R z`U%>0Bw3;p^!QDuu%{j^*|bFdtbF~ux2P}GBLCHS;c!Xy=mR>o=jI}@nSzjq&@A5{ zyiKlcjAlk3r(9NstzA}#5ilsm+Xy+ml<8T@>%|P69-9x*skO$9Uw3am15H!9zCU*F zj@{;*7vtNr_BuyMXwb);A^pEOV5$w~^JiG(@jII(VaR6z=tK5#isw1=^6FE(*h|pf zokGlA8E8gHjC%HF4;ko#(tUIM1Vb&+7Ry%_x1R4@EUDKVbA8>vaFaoYDC2`KG8M#J z^(@Ske0|xlx&pVzJ~c8T&4tC~on%h68TR_$mmYVJdrEixsr`x0oqkPbCBIHYTx!f3E#Qhu8+9Z=<5yY&d4i{JZ%UZihBV=W=qpI6Hv}=)1gxi5^ zkdhE`I>xx%ZRok7&ziZqHIN~^_gA{64!%wii!BjSezY&4V@=WgcTwN{3G4Q4xpAm=Cys8Tol&}@n1j=ycU3fwAN>i$*(`hX9abS3%xOtv zvfPknD$8j;BVDCTx%CHjR^rtDY3c}zzF|7rS*5CC{vHYLn8b6gFr=w0O-p6M#pgKJ zD6Q^DQ<2%+>+&U6waVPex_@GHS?VwxadEl7ZQ<*V@l%C*%!@?6TTo*Wy@=<$YppvV z;8ya^Ehp3Fp%{JQMxy|R8Voa=>l)%fL+`@cs!ur266qplo2-i9lL+af z&hA8Njeb&e!|_V1UK;95;buvAzEDW~&3ri-hb@4U^jXhq$xAEU=z7h~ z*_V2pJG+}zy>0F9kuORYK19B_3x5gtD3-C=3SsnF-W8;p!tuHzk86sS3sp|`BhR0j z29kp?EL7>6vm8x$Aj&YIB=CNF+6Lz@m(o!-auiqN z`nPq>t3VYEFaoo$8h(v9d`OmO%B`tQTTf+9(@0S(_i7@1mDl^%<6t;FIa;tUEB&mo zLx|nN;XTfF@Iiy?p%KjThQkQILgh?=gM@?#fv_2e%t_V>AgCq7Eu!25!^M118go|k z7#vIRLZsEa(8_7ltlzyDP5alt>YAV(Lk531yvvuAEG;3TLf=$eM!2D#Om|(O#$3^g z=x?*+0;}P1W(#g>$8$?Z3qJ(DuOSwekf;|~Cmm5AwEx7^rOdGVO5$sDC@)8;$qLJ?F*uUT=YT zB(sI;vTvi+9%x10O%QtHWjGhR-SDCM@<>ys?` zM6VaCm~M)DF&<~nKhltwH`)EcL>A;1&CIVj4f7Z5A3iKYA^jyw76v5?>KjMD%QPp|hP62L;_fl7lwg(HCS3o$u;6!j-fB*_s+q{V1BHoIYC!YYpZCKy$mhk*EzZ(g0BOD=q{@`6py-7kNJ;pMihA@u^uUKSLQoO zR`ZblHO!kbWYoojx;~&Qj8OL1_{gi8REDg?O6%Lh^DJRss^9Lx#MO#LEmj>G_c8uQ zjV8S-Z>Q;VG^hD#uDbsIZDWgeKs`#YoR*&VL#yhrp)dA7NYNEz>wQ~LnH_}Z6d7l_ z^BkBQ0~Y>WwP^Hr#;|t7-Fpp6Of|jOw*$!nLv>X<$@92KNz9eosCQ@m&Ii(c8EBOYs2Ur*z#%z7v0p zyIx0ir+=jb2E)P#Wgdbs^6cbLYUGT^S>+6s;<(#qH&uG#7m+tshDYNiTky}iPc}fz zBLA^}X-0GhT>(a0sV(W26}Y_e`bsM%I>NC-o~WjJjM6|>D`to`b)s!1J1s)oOz{Uc zedza??#BUYUa-GXjN?kfB;(dV*g$MGBkA%84d$sG^Si_Jxiz`7SaVuc+4Ss%O_I^L z&=cP{?*INXA29Y?B>r$eH1J3}?V=RN3?HIA?I4PREh zA{@dei3^L)PE2$2Xt~`oP)&DhG-+NhdW8hIkyLh5)TDk0mwayP1f35bS9$gPF}v}}st$r(KzsWWZ-3svN8hly9_k*TE} zP9({x&ubh56ou$MrqR+kpGjMPEZRAp7R003?H|+eDL2=F=FO*<|?E0uTIQykop-DBsiu(75J>;73lNifQWx{WC$ zO&WOLH;hAKvyp3XhG%_>r1>%ID8pJ5ECXhe*HK|>C7xBN)|EOn%|4`~$Hj>zz?9LUw~WyP~@qPAHp>3M>$hr@Zst=M7KWKM2~7tsD}^+%0yHtpBAw-!IQ% z1)@Koe?Os<+=xn(h1?(rhlRo2E4%pNt>R$tNBp)Duz;VEqU+SV%vX!AslOd z=(OSmFp4^FH+C$^CA_oHSdvXIf|#UC->=l3H_X$RT9{z?B^{f>x!51@j+^}HFAvJ$?jW7oRR-!lXC(5$dYa!M50+vOaxKu+ZR||i~Ajq zt?l_s-M);p=hJ-5bixJT#5q#n^~}z7osy9NrLJb3@a*yDve}#Ik`~xA4PA|ZlF0U$ zPK}L92QM$|oZ!Y%dE%3Fo8ZSaMW`Y#RCi7~@v%L>g)RVD3ZmSUNQ=L$z8Tu&tMO=e zI-F?=9Z(8yBBo*e!$j0ctHk12NY48cMS{hu;1rVNb&b8nL%tT~Px%v);uKznr9J?n zhr7jI$0NG2z)dT*TsAYF_HF=Q9h)HKAtPZmP#I`crpKEwBTqcWBn7TIT#~B9htR9; zIOy|@3GH#k(K|q&eF_mS=&H}@eZ(}q&45K1|7Hr^D_$;sv^kUoG5*w>)J!@vk}IE*7+nEV+65T+;A_rDI?Z&$LVO!mdof zLAJFduK?BbC$R}Z!^BIP8j4xo9g1-<%b-5h-R8{mNynpPe6!Zlu|bg-KA zZgE@5z3=DO-`|BTFd{X{E&HuS(obWV4-dBHvI$1yDUClF+VlLn%`z^w4}x>noG{!G z)$5K5O@Q$=;&71N&TRF74&?EV0jmBxzkM?B%li{u_rxQ4hc1-xsdCPoUuW>yH$VRh zv?R)tl5QY5Z#$Oiq96CafL{J%yQbL~LOZtZ4LkKAhjeb@Z-`=!={Y&{)k%%7%8wC# zh=b%(-Pq?6IR4rxy)llz`Ed{RXfNdb z0b`N?Zl1qX_E3Ut(y95j&KdmX1IFg7Zf$Q8euO!_4KQb*G?6&8K<7skAmqF(F5vld zXheHmlH0kdVjG^e^~i;o@k6z2D$Rp~Z*tkormzM+rnZO(FYa~#(fExDtfJ6=R_Mnw z@Fao!P2hH!5I9}c$$3g1!Szh5@wy`MbIae3^sjdv6m!fW=zRNWJn1EP4tIFqdUHi&wAIU)CJlt&M?hn?{EO&;RkXvDE{m9&v9xmeM!(d}7h-KXYU)p>`H zV5zkLtGuQ0F-NKVcd>RRA?rc%{Nz`#!Nvy}+^yQ1_5HJxs{P!x{+VzXUW}mR`A@bp zI8O+6-pE2A>ZZC5)9{iUNGuGeoH)ZFEq6t*2v#5bAm!xUK;$L|ek86v+k4i|sMnPp zviHbWkC7rAMg_FV3PmP5(DH2cUF`8ac{*F&W$0u1v}Fnq_i}VCtOLf$Uf4I( zU4px9Qs!i0Cm1bPr!mHr-vlA2is4z52(_^Oei!;>*o1v{oBXpSb_U%-UO*xggScKq z)vr_P-|}7lxF*UA{UCqlJl%Y;RRIa6AXAdw!kXwHbsFcE;Q2WCnqLO%>PWV&Zs{=!{{Wj=j3C-D zyM^Af!^1>Is|G%obPHPuL9Ox6Mi&qrOHJN1-Z8!HA8q^}lf+up&$?Sv0Nr zuIHKwJdDh9B_2ZIc|XT(h^qle0-+%=tC!0lzgo$iv6lb(p@ho^=gH18F(Mb5VXx(R z6Hr%Bp5aLZ`mbZPQ2Yf;1HW?G01A}+Yvbwnva5_^JT4LWVElQ6E5rcKp_- zbAZw`3gIf9M2B}>aw!mNgVLI?O`D69L7zEo$M|JAAx_FVZ>xHpSO5-UqK~z+1@g$g z$aH&^Xn%VI;_qyU-Iq4IXPF~J_!Rsa;p<}4<>ifz!bqr5Yc8H(hkbYE31G2XVV52N z4`!%M?;!MHQjGfeobTZ!n^4N~&b$W@)sOgPt|wa4cJPYBL+ewBBhk6%Ee9@#ypITs zmE{j}C=X`xerosYhp1nW_v!&jq0fa5e^H#(D<9j6&vx$vZy6R@k!rjOiBsGkbdyEz z-R^{A@3>PwPZK8eW)}$~NlBC^6+(s#T$%-50k?lC*HP`(dG#foP52*QZ=zk_sw42; zKRgBbAmPeekBy{xTysLd%=L?^pJz~hMDu${hoTduTNN($$L8fNNE3Ru0xTr1MH)g6qyt|cdTgn;*$>$krIxVeQx__&o0O>&BYq^!t-s7g}l7lBoKRp?2POSiCA2_ zK*I?w?n7BEEGdc(&iIeIL_g?=>I=_3w&Ip^!7^jV;wa)&`(S#sKEfKhl5;~hkl)-3 zdY&M}<2m>hiW&w1rKH@4>W|YVY!#yf=e2aI|M_Z>B~y(`L2R>+KT>U7s}%}ZaBz}D zw~JuOGRoHp2Sf|s-vEDoaWJ2Bc4rwWdAc$h(A-xpcd!$=x)1LL2EO_sPx;Q_;lP@2 z%`@=Z)*EuTxHRUyQ^Op|1iN)sg}z9MJ^S0}b6VAJyMC|T=+A0MvHwjdxMmaGX>BjA zMhJu(qS3@hJk@8(@?cnvQ(KesKzt*#V`l%PJfsav1NI?Da8l!Z7x;zb+0C0}@forE zb@tGwb{*5tvffG%{3{_x!LSvi0MISQMN_?1S+os=;!Uk zGJ*mCW)wS^<9|*Cv<%!Aj^ER^SOoyqu%s$awc$yRi%m~x#bg$@?Rcxw!!Ccvy)|Uc z`(@z%2~$_?K}Iz!m#WXBGDI|wb~sH{$~M4H{8mTkhWCnQ)rAXsU+^1b9Udl}PX$;5 zJ(Kl7;Oh$N_oqOQ>)PU!5s);c-}{HR86Ob_Q3STt{dDeIw}tM|fKC5-(M{J`cDu!f_H%>ap#=BGV-K@zkq=wBMO_2rTQ>Yhek*gbt!grz^O`T6}r?MaHTF`Nl%LuYrkF@Qm` zO6wj-#skIxydVB)|3E64;kN@$sQ$+BGXg!W zFhbr;cGM1w<)8VC6?y1nlh^)PnB-U~15>=vfgFvQpH?|phoplG6%HN%Ga*y9X47=z ziEVpE=dpvRZrC^yJ{VQmuu^!1JJ2S2g?SB8rRgH8gB$?F!uCYxCsct<2_>5&2j9ub?M`x%pr4@Ta$-kA{tD?f z7OrjUW7yL&%7!6qN|V#Wx4?`@6aZ=}3J@#gKcMK?+KR9xO%mhL|9}w}MynK`PojYc z$HB5;C`cINe{%oV|Km`?|J+fr)r$W)5Hrf+ShK#1{ipn|U=76jZ<_zg|Bbc_OZxTV zpYk6o6oA?Qh){PO^?z}RUgVo0(z3Fn0915N(vQje|A)L!{c{i1Na=riX179)hW~*N z+}N?Q&4&*J{m%kYMts5M{lDAW|793-L@n_8uj&75Jsteve'); + done(); + }); + }); + }); + + describe('prerequisites()', function () { + + it('shows the complete prerequisite pipeline in the response', function (done) { + + var pre1 = function (request, reply) { + + return reply('Hello').code(444); + }; + + var pre2 = function (request, reply) { + + return reply(request.pre.m1 + request.pre.m3 + request.pre.m4); + }; + + var pre3 = function (request, reply) { + + process.nextTick(function () { + + return reply(' '); + }); + }; + + var pre4 = function (request, reply) { + + return reply('World'); + }; + + var pre5 = function (request, reply) { + + return reply(request.pre.m2 + '!'); + }; + + var handler = function (request, reply) { + + return reply(request.pre.m5); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ + method: 'GET', + path: '/', + config: { + pre: [ + [ + { method: pre1, assign: 'm1' }, + { method: pre3, assign: 'm3' }, + { method: pre4, assign: 'm4' } + ], + { method: pre2, assign: 'm2' }, + { method: pre5, assign: 'm5' } + ], + handler: handler + } + }); + + server.inject('/', function (res) { + + expect(res.result).to.equal('Hello World!'); + done(); + }); + }); + + it('allows a single prerequisite', function (done) { + + var pre = function (request, reply) { + + return reply('Hello'); + }; + + var handler = function (request, reply) { + + return reply(request.pre.p); + }; + + var server = new Hapi.Server(); + server.connection(); + + server.route({ + method: 'GET', + path: '/', + config: { + pre: [ + { method: pre, assign: 'p' } + ], + handler: handler + } + }); + + server.inject('/', function (res) { + + expect(res.result).to.equal('Hello'); + done(); + }); + }); + + it('allows an empty prerequisite array', function (done) { + + var handler = function (request, reply) { + + return reply('Hello'); + }; + + var server = new Hapi.Server(); + server.connection(); + + server.route({ + method: 'GET', + path: '/', + config: { + pre: [], + handler: handler + } + }); + + server.inject('/', function (res) { + + expect(res.result).to.equal('Hello'); + done(); + }); + }); + + it('takes over response', function (done) { + + var pre1 = function (request, reply) { + + return reply('Hello'); + }; + + var pre2 = function (request, reply) { + + return reply(request.pre.m1 + request.pre.m3 + request.pre.m4); + }; + + var pre3 = function (request, reply) { + + process.nextTick(function () { + + return reply(' ').takeover(); + }); + }; + + var pre4 = function (request, reply) { + + return reply('World'); + }; + + var pre5 = function (request, reply) { + + return reply(request.pre.m2 + '!'); + }; + + var handler = function (request, reply) { + + return reply(request.pre.m5); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ + method: 'GET', + path: '/', + config: { + pre: [ + [ + { method: pre1, assign: 'm1' }, + { method: pre3, assign: 'm3' }, + { method: pre4, assign: 'm4' } + ], + { method: pre2, assign: 'm2' }, + { method: pre5, assign: 'm5' } + ], + handler: handler + } + }); + + server.inject('/', function (res) { + + expect(res.result).to.equal(' '); + done(); + }); + }); + + it('returns error if prerequisite returns error', function (done) { + + var pre1 = function (request, reply) { + + return reply('Hello'); + }; + + var pre2 = function (request, reply) { + + return reply(Boom.internal('boom')); + }; + + var handler = function (request, reply) { + + return reply(request.pre.m1); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ + method: 'GET', + path: '/', + config: { + pre: [ + [{ method: pre1, assign: 'm1' }], + { method: pre2, assign: 'm2' } + ], + handler: handler + } + }); + + server.inject('/', function (res) { + + expect(res.result.statusCode).to.equal(500); + done(); + }); + }); + + it('passes wrapped object', function (done) { + + var pre = function (request, reply) { + + return reply('Hello').code(444); + }; + + var handler = function (request, reply) { + + return reply(request.preResponses.p); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ + method: 'GET', + path: '/', + config: { + pre: [ + { method: pre, assign: 'p' } + ], + handler: handler + } + }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(444); + done(); + }); + }); + + it('returns 500 if prerequisite throws', function (done) { + + var pre1 = function (request, reply) { + + return reply('Hello'); + }; + + var pre2 = function (request, reply) { + + a.b.c = 0; + }; + + var handler = function (request, reply) { + + return reply(request.pre.m1); + }; + + + var server = new Hapi.Server({ debug: false }); + server.connection(); + server.route({ + method: 'GET', + path: '/', + config: { + pre: [ + [{ method: pre1, assign: 'm1' }], + { method: pre2, assign: 'm2' } + ], + handler: handler + } + }); + + server.inject('/', function (res) { + + expect(res.result.statusCode).to.equal(500); + done(); + }); + }); + + it('returns a user record using server method', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + server.method('user', function (id, next) { + + return next(null, { id: id, name: 'Bob' }); + }); + + server.route({ + method: 'GET', + path: '/user/{id}', + config: { + pre: [ + 'user(params.id)' + ], + handler: function (request, reply) { + + return reply(request.pre.user); + } + } + }); + + server.inject('/user/5', function (res) { + + expect(res.result).to.deep.equal({ id: '5', name: 'Bob' }); + done(); + }); + }); + + it('returns a user record using server method in object', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + server.method('user', function (id, next) { + + return next(null, { id: id, name: 'Bob' }); + }); + + server.route({ + method: 'GET', + path: '/user/{id}', + config: { + pre: [ + { + method: 'user(params.id)', + assign: 'steve' + } + ], + handler: function (request, reply) { + + return reply(request.pre.steve); + } + } + }); + + server.inject('/user/5', function (res) { + + expect(res.result).to.deep.equal({ id: '5', name: 'Bob' }); + done(); + }); + }); + + it('returns a user name using multiple server methods', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + server.method('user', function (id, next) { + + return next(null, { id: id, name: 'Bob' }); + }); + + server.method('name', function (user, next) { + + return next(null, user.name); + }); + + server.route({ + method: 'GET', + path: '/user/{id}/name', + config: { + pre: [ + 'user(params.id)', + 'name(pre.user)' + ], + handler: function (request, reply) { + + return reply(request.pre.name); + } + } + }); + + server.inject('/user/5/name', function (res) { + + expect(res.result).to.equal('Bob'); + done(); + }); + }); + + it('returns a user record using server method with trailing space', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + server.method('user', function (id, next) { + + return next(null, { id: id, name: 'Bob' }); + }); + + server.route({ + method: 'GET', + path: '/user/{id}', + config: { + pre: [ + 'user(params.id )' + ], + handler: function (request, reply) { + + return reply(request.pre.user); + } + } + }); + + server.inject('/user/5', function (res) { + + expect(res.result).to.deep.equal({ id: '5', name: 'Bob' }); + done(); + }); + }); + + it('returns a user record using server method with leading space', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + server.method('user', function (id, next) { + + return next(null, { id: id, name: 'Bob' }); + }); + + server.route({ + method: 'GET', + path: '/user/{id}', + config: { + pre: [ + 'user( params.id)' + ], + handler: function (request, reply) { + + return reply(request.pre.user); + } + } + }); + + server.inject('/user/5', function (res) { + + expect(res.result).to.deep.equal({ id: '5', name: 'Bob' }); + done(); + }); + }); + + it('returns a user record using server method with zero args', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + server.method('user', function (next) { + + return next(null, { name: 'Bob' }); + }); + + server.route({ + method: 'GET', + path: '/user', + config: { + pre: [ + 'user()' + ], + handler: function (request, reply) { + + return reply(request.pre.user); + } + } + }); + + server.inject('/user', function (res) { + + expect(res.result).to.deep.equal({ name: 'Bob' }); + done(); + }); + }); + + it('returns a user record using server method with no args', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + server.method('user', function (request, next) { + + return next(null, { id: request.params.id, name: 'Bob' }); + }); + + server.route({ + method: 'GET', + path: '/user/{id}', + config: { + pre: [ + 'user' + ], + handler: function (request, reply) { + + return reply(request.pre.user); + } + } + }); + + server.inject('/user/5', function (res) { + + expect(res.result).to.deep.equal({ id: '5', name: 'Bob' }); + done(); + }); + }); + + it('returns a user record using server method with nested name', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + server.method('user.get', function (next) { + + return next(null, { name: 'Bob' }); + }); + + server.route({ + method: 'GET', + path: '/user', + config: { + pre: [ + 'user.get()' + ], + handler: function (request, reply) { + + return reply(request.pre['user.get']); + } + } + }); + + server.inject('/user', function (res) { + + expect(res.result).to.deep.equal({ name: 'Bob' }); + done(); + }); + }); + + it('fails on bad method name', function (done) { + + var server = new Hapi.Server(); + server.connection(); + var test = function () { + + server.route({ + method: 'GET', + path: '/x/{id}', + config: { + pre: [ + 'xuser(params.id)' + ], + handler: function (request, reply) { + + return reply(request.pre.user); + } + } + }); + }; + + expect(test).to.throw('Unknown server method in string notation: xuser(params.id)'); + done(); + }); + + it('fails on bad method syntax name', function (done) { + + var server = new Hapi.Server(); + server.connection(); + var test = function () { + + server.route({ + method: 'GET', + path: '/x/{id}', + config: { + pre: [ + 'userparams.id)' + ], + handler: function (request, reply) { + + return reply(request.pre.user); + } + } + }); + }; + + expect(test).to.throw('Invalid server method string notation: userparams.id)'); + done(); + }); + + it('sets pre failAction to error', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ + method: 'GET', + path: '/', + config: { + pre: [ + { + method: function (request, reply) { + + return reply(Boom.forbidden()); + }, + failAction: 'error' + } + ], + handler: function (request, reply) { + + return reply('ok'); + } + } + }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(403); + done(); + }); + }); + + it('sets pre failAction to ignore', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ + method: 'GET', + path: '/', + config: { + pre: [ + { + method: function (request, reply) { + + return reply(Boom.forbidden()); + }, + failAction: 'ignore' + } + ], + handler: function (request, reply) { + + return reply('ok'); + } + } + }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('sets pre failAction to log', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ + method: 'GET', + path: '/', + config: { + pre: [ + { + assign: 'before', + method: function (request, reply) { + + return reply(Boom.forbidden()); + }, + failAction: 'log' + } + ], + handler: function (request, reply) { + + return reply('ok'); + } + } + }); + + var log = null; + server.on('request-internal', function (request, event, tags) { + + if (event.internal && + tags.pre && + tags.error) { + + log = event.data.assign; + } + }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + expect(log).to.equal('before'); + done(); + }); + }); + + it('binds pre to route bind object', function (done) { + + var item = { x: 123 }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ + method: 'GET', + path: '/', + config: { + pre: [{ method: function (request, reply) { return reply(this.x); }, assign: 'x' }], + handler: function (request, reply) { return reply(request.pre.x); }, + bind: item + } + }); + + server.inject('/', function (res) { + + expect(res.result).to.equal(item.x); + done(); + }); + }); + + it('logs boom error instance as data if handler returns boom error', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ + method: 'GET', + path: '/', + config: { + handler: function (request, reply) { + + return reply(Boom.forbidden()); + } + } + }); + + var log = null; + server.on('request-internal', function (request, event, tags) { + + if (event.internal && + tags.handler && + tags.error) { + + log = event.data; + } + }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(403); + expect(log.data.isBoom).to.equal(true); + expect(log.data.output.statusCode).to.equal(403); + expect(log.data.message).to.equal('Forbidden'); + done(); + }); + }); + + it('logs server method using string notation when cache enabled', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + server.method('user', function (id, next) { + + return next(null, { id: id, name: 'Bob' }); + }, { cache: { expiresIn: 1000 } }); + + server.route({ + method: 'GET', + path: '/user/{id}', + config: { + pre: [ + 'user(params.id)' + ], + handler: function (request, reply) { + + return reply(request.getLog('method')); + } + } + }); + + server.inject('/user/5', function (res) { + + expect(res.result[0].tags).to.deep.equal(['pre', 'method', 'user']); + expect(res.result[0].internal).to.equal(true); + expect(res.result[0].data.msec).to.exist(); + done(); + }); + }); + + it('uses server method with cache via string notation', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + var gen = 0; + server.method('user', function (id, next) { + + return next(null, { id: id, name: 'Bob', gen: gen++ }); + }, { cache: { expiresIn: 1000 } }); + + server.route({ + method: 'GET', + path: '/user/{id}', + config: { + pre: [ + 'user(params.id)' + ], + handler: function (request, reply) { + + return reply(request.pre.user.gen); + } + } + }); + + server.start(function () { + + server.inject('/user/5', function (res) { + + expect(res.result).to.equal(0); + + server.inject('/user/5', function (res) { + + expect(res.result).to.equal(0); + done(); + }); + }); + }); + }); + }); + + describe('fromString()', function () { + + it('uses string handler', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.method('handler.get', function (request, reply) { + + return reply(null, request.params.x + request.params.y).code(299); + }); + + server.route({ method: 'GET', path: '/{x}/{y}', handler: 'handler.get' }); + server.inject('/a/b', function (res) { + + expect(res.statusCode).to.equal(299); + expect(res.result).to.equal('ab'); + done(); + }); + }); + }); + + describe('defaults()', function () { + + it('returns handler without defaults', function (done) { + + var handler = function (route, options) { + + return function (request, reply) { + + return reply(request.route.settings.app); + }; + }; + + var server = new Hapi.Server(); + server.connection(); + server.handler('test', handler); + server.route({ method: 'get', path: '/', handler: { test: 'value' } }); + server.inject('/', function (res) { + + expect(res.result).to.deep.equal({}); + done(); + }); + }); + + it('returns handler with object defaults', function (done) { + + var handler = function (route, options) { + + return function (request, reply) { + + return reply(request.route.settings.app); + }; + }; + + handler.defaults = { + app: { + x: 1 + } + }; + + var server = new Hapi.Server(); + server.connection(); + server.handler('test', handler); + server.route({ method: 'get', path: '/', handler: { test: 'value' } }); + server.inject('/', function (res) { + + expect(res.result).to.deep.equal({ x: 1 }); + done(); + }); + }); + + it('returns handler with function defaults', function (done) { + + var handler = function (route, options) { + + return function (request, reply) { + + return reply(request.route.settings.app); + }; + }; + + handler.defaults = function (method) { + return { + app: { + x: method + } + }; + }; + + var server = new Hapi.Server(); + server.connection(); + server.handler('test', handler); + server.route({ method: 'get', path: '/', handler: { test: 'value' } }); + server.inject('/', function (res) { + + expect(res.result).to.deep.equal({ x: 'get' }); + done(); + }); + }); + + it('throws on handler with invalid defaults', function (done) { + + var handler = function (route, options) { + + return function (request, reply) { + + return reply(request.route.settings.app); + }; + }; + + handler.defaults = 'invalid'; + + var server = new Hapi.Server(); + server.connection(); + expect(function () { + + server.handler('test', handler); + }).to.throw('Handler defaults property must be an object or function'); + + done(); + }); + }); + + describe('invoke()', function () { + + it('returns 500 on ext method exception (same tick)', function (done) { + + var server = new Hapi.Server({ debug: false }); + server.connection(); + server.ext('onRequest', function (request, next) { + + var x = a.b.c; + }); + + var handler = function (request, reply) { + + return reply('neven gonna happen'); + }; + + server.route({ method: 'GET', path: '/domain', handler: handler }); + + server.inject('/domain', function (res) { + + expect(res.statusCode).to.equal(500); + done(); + }); + }); + }); +}); diff --git a/node_modules/hapi/test/methods.js b/node_modules/hapi/test/methods.js new file mode 100755 index 0000000..24e9f89 --- /dev/null +++ b/node_modules/hapi/test/methods.js @@ -0,0 +1,1044 @@ +// Load modules + +var Bluebird = require('bluebird'); +var CatboxMemory = require('catbox-memory'); +var Code = require('code'); +var Hapi = require('..'); +var Lab = require('lab'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('Methods', function () { + + it('registers a method', function (done) { + + var add = function (a, b, next) { + + return next(null, a + b); + }; + + var server = new Hapi.Server(); + server.method('add', add); + + server.methods.add(1, 5, function (err, result) { + + expect(result).to.equal(6); + done(); + }); + }); + + it('registers a method with leading _', function (done) { + + var _add = function (a, b, next) { + + return next(null, a + b); + }; + + var server = new Hapi.Server(); + server.method('_add', _add); + + server.methods._add(1, 5, function (err, result) { + + expect(result).to.equal(6); + done(); + }); + }); + + it('registers a method with leading $', function (done) { + + var $add = function (a, b, next) { + + return next(null, a + b); + }; + + var server = new Hapi.Server(); + server.method('$add', $add); + + server.methods.$add(1, 5, function (err, result) { + + expect(result).to.equal(6); + done(); + }); + }); + + it('registers a method with _', function (done) { + + var _add = function (a, b, next) { + + return next(null, a + b); + }; + + var server = new Hapi.Server(); + server.method('add_._that', _add); + + server.methods.add_._that(1, 5, function (err, result) { + + expect(result).to.equal(6); + done(); + }); + }); + + it('registers a method with $', function (done) { + + var $add = function (a, b, next) { + + return next(null, a + b); + }; + + var server = new Hapi.Server(); + server.method('add$.$that', $add); + + server.methods.add$.$that(1, 5, function (err, result) { + + expect(result).to.equal(6); + done(); + }); + }); + + it('registers a method (no callback)', function (done) { + + var add = function (a, b) { + + return a + b; + }; + + var server = new Hapi.Server(); + server.method('add', add, { callback: false }); + + expect(server.methods.add(1, 5)).to.equal(6); + done(); + }); + + it('registers a method (promise)', function (done) { + + var addAsync = function (a, b, next) { + + return next(null, a + b); + }; + + var add = Bluebird.promisify(addAsync); + + var server = new Hapi.Server(); + server.method('add', add, { callback: false }); + + server.methods.add(1, 5).then(function (result) { + + expect(result).to.equal(6); + done(); + }); + }); + + it('registers a method with nested name', function (done) { + + var add = function (a, b, next) { + + return next(null, a + b); + }; + + var server = new Hapi.Server(); + server.connection(); + server.method('tools.add', add); + + server.start(function () { + + server.methods.tools.add(1, 5, function (err, result) { + + expect(result).to.equal(6); + done(); + }); + }); + }); + + it('registers a method with bind and callback', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + var context = { name: 'Bob' }; + server.method('user', function (id, next) { + + return next(null, { id: id, name: this.name }); + }, { bind: context }); + + server.route({ + method: 'GET', + path: '/user/{id}', + config: { + pre: [ + 'user(params.id)' + ], + handler: function (request, reply) { + + return reply(request.pre.user); + } + } + }); + + server.inject('/user/5', function (res) { + + expect(res.result).to.deep.equal({ id: '5', name: 'Bob' }); + done(); + }); + }); + + it('registers two methods with shared nested name', function (done) { + + var add = function (a, b, next) { + + return next(null, a + b); + }; + + var sub = function (a, b, next) { + + return next(null, a - b); + }; + + var server = new Hapi.Server(); + server.connection(); + server.method('tools.add', add); + server.method('tools.sub', sub); + + server.start(function () { + + server.methods.tools.add(1, 5, function (err, result) { + + expect(result).to.equal(6); + server.methods.tools.sub(1, 5, function (err, result) { + + expect(result).to.equal(-4); + done(); + }); + }); + }); + }); + + it('throws when registering a method with nested name twice', function (done) { + + var add = function (a, b, next) { + + return next(null, a + b); + }; + + var server = new Hapi.Server(); + server.method('tools.add', add); + expect(function () { + + server.method('tools.add', add); + }).to.throw('Server method function name already exists'); + + done(); + }); + + it('throws when registering a method with name nested through a function', function (done) { + + var add = function (a, b, next) { + + return next(null, a + b); + }; + + var server = new Hapi.Server(); + server.method('add', add); + expect(function () { + + server.method('add.another', add); + }).to.throw('Invalid segment another in reach path add.another'); + + done(); + }); + + it('calls non cached method multiple times', function (done) { + + var gen = 0; + var method = function (id, next) { + + return next(null, { id: id, gen: gen++ }); + }; + + var server = new Hapi.Server(); + server.connection(); + server.method('test', method); + + server.start(function () { + + server.methods.test(1, function (err, result) { + + expect(result.gen).to.equal(0); + + server.methods.test(1, function (err, result) { + + expect(result.gen).to.equal(1); + done(); + }); + }); + }); + }); + + it('caches method value', function (done) { + + var gen = 0; + var method = function (id, next) { + + return next(null, { id: id, gen: gen++ }); + }; + + var server = new Hapi.Server(); + server.connection(); + server.method('test', method, { cache: { expiresIn: 1000 } }); + + server.start(function () { + + server.methods.test(1, function (err, result) { + + expect(err).to.not.exist(); + expect(result.gen).to.equal(0); + + server.methods.test(1, function (err, result) { + + expect(err).to.not.exist(); + expect(result.gen).to.equal(0); + done(); + }); + }); + }); + }); + + it('caches method value (no callback)', function (done) { + + var gen = 0; + var method = function (id) { + + return { id: id, gen: gen++ }; + }; + + var server = new Hapi.Server(); + server.connection(); + server.method('test', method, { cache: { expiresIn: 1000 }, callback: false }); + + server.start(function () { + + server.methods.test(1, function (err, result) { + + expect(err).to.not.exist(); + expect(result.gen).to.equal(0); + + server.methods.test(1, function (err, result) { + + expect(err).to.not.exist(); + expect(result.gen).to.equal(0); + done(); + }); + }); + }); + }); + + it('caches method value (promise)', function (done) { + + var gen = 0; + var methodAsync = function (id, next) { + + if (id === 2) { + return next(new Error('boom')); + } + + return next(null, { id: id, gen: gen++ }); + }; + + var method = Bluebird.promisify(methodAsync); + + var server = new Hapi.Server(); + server.connection(); + server.method('test', method, { cache: { expiresIn: 1000 }, callback: false }); + + server.start(function () { + + server.methods.test(1, function (err, result) { + + expect(err).to.not.exist(); + expect(result.gen).to.equal(0); + + server.methods.test(1, function (err, result) { + + expect(err).to.not.exist(); + expect(result.gen).to.equal(0); + + server.methods.test(2, function (err, result) { + + expect(err).to.exist(); + expect(err.message).to.equal('boom'); + done(); + }); + }); + }); + }); + }); + + it('reuses cached method value with custom key function', function (done) { + + var gen = 0; + var method = function (id, next) { + + return next(null, { id: id, gen: gen++ }); + }; + + var server = new Hapi.Server(); + server.connection(); + server.method('test', method, { cache: { expiresIn: 1000 }, generateKey: function (id) { return '' + (id + 1); } }); + + server.start(function () { + + server.methods.test(1, function (err, result) { + + expect(result.gen).to.equal(0); + + server.methods.test(1, function (err, result) { + + expect(result.gen).to.equal(0); + done(); + }); + }); + }); + }); + + it('errors when custom key function return null', function (done) { + + var method = function (id, next) { + + return next(null, { id: id }); + }; + + var server = new Hapi.Server(); + server.connection(); + server.method('test', method, { cache: { expiresIn: 1000 }, generateKey: function (id) { return null; } }); + + server.start(function () { + + server.methods.test(1, function (err, result) { + + expect(err).to.exist(); + expect(err.message).to.equal('Invalid method key when invoking: test'); + done(); + }); + }); + }); + + it('does not cache when custom key function returns a non-string', function (done) { + + var method = function (id, next) { + + return next(null, { id: id }); + }; + + var server = new Hapi.Server(); + server.connection(); + server.method('test', method, { cache: { expiresIn: 1000 }, generateKey: function (id) { return 123; } }); + + server.start(function () { + + server.methods.test(1, function (err, result) { + + expect(err).to.exist(); + expect(err.message).to.equal('Invalid method key when invoking: test'); + done(); + }); + }); + }); + + it('does not cache value when ttl is 0', function (done) { + + var gen = 0; + var method = function (id, next) { + + return next(null, { id: id, gen: gen++ }, 0); + }; + + var server = new Hapi.Server(); + server.connection(); + server.method('test', method, { cache: { expiresIn: 1000 } }); + + server.start(function () { + + server.methods.test(1, function (err, result) { + + expect(result.gen).to.equal(0); + + server.methods.test(1, function (err, result) { + + expect(result.gen).to.equal(1); + done(); + }); + }); + }); + }); + + it('generates new value after cache drop', function (done) { + + var gen = 0; + var method = function (id, next) { + + return next(null, { id: id, gen: gen++ }); + }; + + var server = new Hapi.Server(); + server.connection(); + server.method('dropTest', method, { cache: { expiresIn: 1000 } }); + + server.start(function () { + + server.methods.dropTest(2, function (err, result) { + + expect(result.gen).to.equal(0); + server.methods.dropTest.cache.drop(2, function (err) { + + expect(err).to.not.exist(); + + server.methods.dropTest(2, function (err, result) { + + expect(result.gen).to.equal(1); + done(); + }); + }); + }); + }); + }); + + it('errors on invalid drop key', function (done) { + + var gen = 0; + var method = function (id, next) { + + return next(null, { id: id, gen: gen++ }); + }; + + var server = new Hapi.Server(); + server.connection(); + server.method('dropErrTest', method, { cache: { expiresIn: 1000 } }); + + server.start(function () { + + server.methods.dropErrTest.cache.drop(function () { }, function (err) { + + expect(err).to.exist(); + done(); + }); + }); + }); + + it('throws an error when name is not a string', function (done) { + + expect(function () { + + var server = new Hapi.Server(); + server.method(0, function () { }); + }).to.throw('name must be a string'); + done(); + }); + + it('throws an error when name is invalid', function (done) { + + expect(function () { + + var server = new Hapi.Server(); + server.method('0', function () { }); + }).to.throw('Invalid name: 0'); + + expect(function () { + + var server = new Hapi.Server(); + server.method('a..', function () { }); + }).to.throw('Invalid name: a..'); + + expect(function () { + + var server = new Hapi.Server(); + server.method('a.0', function () { }); + }).to.throw('Invalid name: a.0'); + + expect(function () { + + var server = new Hapi.Server(); + server.method('.a', function () { }); + }).to.throw('Invalid name: .a'); + + done(); + }); + + it('throws an error when method is not a function', function (done) { + + expect(function () { + + var server = new Hapi.Server(); + server.method('user', 'function'); + }).to.throw('method must be a function'); + done(); + }); + + it('throws an error when options is not an object', function (done) { + + expect(function () { + + var server = new Hapi.Server(); + server.method('user', function () { }, 'options'); + }).to.throw(/Invalid method options \(user\)/); + done(); + }); + + it('throws an error when options.generateKey is not a function', function (done) { + + expect(function () { + + var server = new Hapi.Server(); + server.method('user', function () { }, { generateKey: 'function' }); + }).to.throw(/Invalid method options \(user\)/); + done(); + }); + + it('throws an error when options.cache is not valid', function (done) { + + expect(function () { + + var server = new Hapi.Server({ cache: CatboxMemory }); + server.method('user', function () { }, { cache: { x: 'y' } }); + }).to.throw(/Invalid cache policy configuration/); + done(); + }); + + it('returns a valid result when calling a method without using the cache', function (done) { + + var server = new Hapi.Server(); + server.method('user', function (id, next) { return next(null, { id: id }); }); + server.methods.user(4, function (err, result) { + + expect(result.id).to.equal(4); + done(); + }); + }); + + it('returns a valid result when calling a method when using the cache', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.start(function () { + + server.method('user', function (id, str, next) { return next(null, { id: id, str: str }); }, { cache: { expiresIn: 1000 } }); + server.methods.user(4, 'something', function (err, result) { + + expect(result.id).to.equal(4); + expect(result.str).to.equal('something'); + done(); + }); + }); + }); + + it('returns an error result when calling a method that returns an error', function (done) { + + var server = new Hapi.Server(); + server.method('user', function (id, next) { return next(new Error()); }); + server.methods.user(4, function (err, result) { + + expect(err).to.exist(); + done(); + }); + }); + + it('returns a different result when calling a method without using the cache', function (done) { + + var server = new Hapi.Server(); + var gen = 0; + server.method('user', function (id, next) { return next(null, { id: id, gen: ++gen }); }); + server.methods.user(4, function (err, result1) { + + expect(result1.id).to.equal(4); + expect(result1.gen).to.equal(1); + server.methods.user(4, function (err, result2) { + + expect(result2.id).to.equal(4); + expect(result2.gen).to.equal(2); + done(); + }); + }); + }); + + it('returns a valid result when calling a method using the cache', function (done) { + + var server = new Hapi.Server({ cache: CatboxMemory }); + server.connection(); + + var gen = 0; + server.method('user', function (id, next) { return next(null, { id: id, gen: ++gen }); }, { cache: { expiresIn: 2000 } }); + + server.start(function () { + + var id = Math.random(); + server.methods.user(id, function (err, result1) { + + expect(result1.id).to.equal(id); + expect(result1.gen).to.equal(1); + server.methods.user(id, function (err, result2) { + + expect(result2.id).to.equal(id); + expect(result2.gen).to.equal(1); + done(); + }); + }); + }); + }); + + it('returns timeout when method taking too long using the cache', function (done) { + + var server = new Hapi.Server({ cache: CatboxMemory }); + server.connection(); + + var gen = 0; + var method = function (id, next) { + + setTimeout(function () { + + return next(null, { id: id, gen: ++gen }); + }, 5); + }; + + server.method('user', method, { cache: { expiresIn: 2000, generateTimeout: 3 } }); + + server.start(function () { + + var id = Math.random(); + server.methods.user(id, function (err, result1) { + + expect(err.output.statusCode).to.equal(503); + + setTimeout(function () { + + server.methods.user(id, function (err, result2) { + + expect(result2.id).to.equal(id); + expect(result2.gen).to.equal(1); + done(); + }); + }, 3); + }); + }); + }); + + it('supports empty key method', function (done) { + + var server = new Hapi.Server({ cache: CatboxMemory }); + server.connection(); + + var gen = 0; + var terms = 'I agree to give my house'; + server.method('tos', function (next) { return next(null, { gen: gen++, terms: terms }); }, { cache: { expiresIn: 2000 } }); + + server.start(function () { + + server.methods.tos(function (err, result1) { + + expect(result1.terms).to.equal(terms); + expect(result1.gen).to.equal(0); + server.methods.tos(function (err, result2) { + + expect(result2.terms).to.equal(terms); + expect(result2.gen).to.equal(0); + done(); + }); + }); + }); + }); + + it('returns valid results when calling a method (with different keys) using the cache', function (done) { + + var server = new Hapi.Server({ cache: CatboxMemory }); + server.connection(); + var gen = 0; + server.method('user', function (id, next) { return next(null, { id: id, gen: ++gen }); }, { cache: { expiresIn: 2000 } }); + server.start(function () { + + var id1 = Math.random(); + server.methods.user(id1, function (err, result1) { + + expect(result1.id).to.equal(id1); + expect(result1.gen).to.equal(1); + var id2 = Math.random(); + server.methods.user(id2, function (err, result2) { + + expect(result2.id).to.equal(id2); + expect(result2.gen).to.equal(2); + done(); + }); + }); + }); + }); + + it('errors when key generation fails', function (done) { + + var server = new Hapi.Server({ cache: CatboxMemory }); + server.connection(); + + var method = function (id, next) { + + return next(null, { id: id }); + }; + + server.method([{ name: 'user', method: method, options: { cache: { expiresIn: 2000 } } }]); + + server.start(function () { + + server.methods.user(1, function (err, result1) { + + expect(result1.id).to.equal(1); + + server.methods.user(function () { }, function (err, result2) { + + expect(err).to.exist(); + expect(err.message).to.equal('Invalid method key when invoking: user'); + done(); + }); + }); + }); + }); + + it('sets method bind without cache', function (done) { + + var method = function (id, next) { + + return next(null, { id: id, gen: this.gen++ }); + }; + + var server = new Hapi.Server(); + server.connection(); + server.method('test', method, { bind: { gen: 7 } }); + + server.start(function () { + + server.methods.test(1, function (err, result) { + + expect(result.gen).to.equal(7); + + server.methods.test(1, function (err, result) { + + expect(result.gen).to.equal(8); + done(); + }); + }); + }); + }); + + it('sets method bind with cache', function (done) { + + var method = function (id, next) { + + return next(null, { id: id, gen: this.gen++ }); + }; + + var server = new Hapi.Server(); + server.connection(); + server.method('test', method, { bind: { gen: 7 }, cache: { expiresIn: 1000 } }); + + server.start(function () { + + server.methods.test(1, function (err, result) { + + expect(result.gen).to.equal(7); + + server.methods.test(1, function (err, result) { + + expect(result.gen).to.equal(7); + done(); + }); + }); + }); + }); + + it('shallow copies bind config', function (done) { + + var bind = { gen: 7 }; + var method = function (id, next) { + + return next(null, { id: id, gen: this.gen++, bound: (this === bind) }); + }; + + var server = new Hapi.Server(); + server.connection(); + server.method('test', method, { bind: bind, cache: { expiresIn: 1000 } }); + + server.start(function () { + + server.methods.test(1, function (err, result) { + + expect(result.gen).to.equal(7); + expect(result.bound).to.equal(true); + + server.methods.test(1, function (err, result) { + + expect(result.gen).to.equal(7); + done(); + }); + }); + }); + }); + + describe('_add()', function () { + + it('normalizes no callback into callback (direct)', function (done) { + + var add = function (a, b) { + + return a + b; + }; + + var server = new Hapi.Server(); + server.method('add', add, { callback: false }); + var result = server.methods.add(1, 5); + expect(result).to.equal(6); + done(); + }); + + it('normalizes no callback into callback (direct error)', function (done) { + + var add = function (a, b) { + + return new Error('boom'); + }; + + var server = new Hapi.Server(); + server.method('add', add, { callback: false }); + var result = server.methods.add(1, 5); + expect(result).to.be.instanceof(Error); + expect(result.message).to.equal('boom'); + done(); + }); + + it('normalizes no callback into callback (direct throw)', function (done) { + + var add = function (a, b) { + + throw new Error('boom'); + }; + + var server = new Hapi.Server(); + server.method('add', add, { callback: false }); + expect(function () { + + server.methods.add(1, 5); + }).to.throw('boom'); + done(); + }); + + it('normalizes no callback into callback (normalized)', function (done) { + + var add = function (a, b) { + + return a + b; + }; + + var server = new Hapi.Server(); + server.method('add', add, { callback: false }); + + server._methods._normalized.add(1, 5, function (err, result) { + + expect(result).to.equal(6); + done(); + }); + }); + + it('normalizes no callback into callback (normalized error)', function (done) { + + var add = function (a, b) { + + return new Error('boom'); + }; + + var server = new Hapi.Server(); + server.method('add', add, { callback: false }); + + server._methods._normalized.add(1, 5, function (err, result) { + + expect(err).to.exist(); + expect(err.message).to.equal('boom'); + done(); + }); + }); + + it('normalizes no callback into callback (normalized throw)', function (done) { + + var add = function (a, b) { + + throw new Error('boom'); + }; + + var server = new Hapi.Server(); + server.method('add', add, { callback: false }); + + server._methods._normalized.add(1, 5, function (err, result) { + + expect(err).to.exist(); + expect(err.message).to.equal('boom'); + done(); + }); + }); + }); + + it('normalizes no callback into callback (cached)', function (done) { + + var add = function (a, b) { + + return a + b; + }; + + var server = new Hapi.Server(); + server.method('add', add, { cache: { expiresIn: 10 }, callback: false }); + + server._methods._normalized.add(1, 5, function (err, result) { + + expect(result).to.equal(6); + done(); + }); + }); + + it('normalizes no callback into callback (cached error)', function (done) { + + var add = function (a, b) { + + return new Error('boom'); + }; + + var server = new Hapi.Server(); + server.method('add', add, { cache: { expiresIn: 10 }, callback: false }); + + server._methods._normalized.add(1, 5, function (err, result) { + + expect(err).to.exist(); + expect(err.message).to.equal('boom'); + done(); + }); + }); + + it('normalizes no callback into callback (cached throw)', function (done) { + + var add = function (a, b) { + + throw new Error('boom'); + }; + + var server = new Hapi.Server(); + server.method('add', add, { cache: { expiresIn: 10 }, callback: false }); + + server._methods._normalized.add(1, 5, function (err, result) { + + expect(err).to.exist(); + expect(err.message).to.equal('boom'); + done(); + }); + }); +}); diff --git a/node_modules/hapi/test/payload.js b/node_modules/hapi/test/payload.js new file mode 100755 index 0000000..f37a8a7 --- /dev/null +++ b/node_modules/hapi/test/payload.js @@ -0,0 +1,649 @@ +// Load modules + +var Fs = require('fs'); +var Http = require('http'); +var Path = require('path'); +var Zlib = require('zlib'); +var Code = require('code'); +var Hapi = require('..'); +var Hoek = require('hoek'); +var Lab = require('lab'); +var Wreck = require('wreck'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('payload', function () { + + it('sets payload', function (done) { + + var payload = '{"x":"1","y":"2","z":"3"}'; + + var handler = function (request, reply) { + + expect(request.payload).to.exist(); + expect(request.payload.z).to.equal('3'); + expect(request.mime).to.equal('application/json'); + return reply(request.payload); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'POST', path: '/', config: { handler: handler } }); + + server.inject({ method: 'POST', url: '/', payload: payload }, function (res) { + + expect(res.result).to.exist(); + expect(res.result.x).to.equal('1'); + done(); + }); + }); + + it('handles request socket error', function (done) { + + var handler = function () { + + throw new Error('never called'); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'POST', path: '/', config: { handler: handler } }); + + server.inject({ method: 'POST', url: '/', payload: 'test', simulate: { error: true, end: false } }, function (res) { + + expect(res.result).to.exist(); + expect(res.result.statusCode).to.equal(500); + done(); + }); + }); + + it('handles request socket close', function (done) { + + var handler = function () { + + throw new Error('never called'); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'POST', path: '/', config: { handler: handler } }); + + server.once('response', function (request) { + + expect(request._isBailed).to.equal(true); + done(); + }); + + server.inject({ method: 'POST', url: '/', payload: 'test', simulate: { close: true, end: false } }, function (res) { }); + }); + + it('handles aborted request', function (done) { + + var handler = function (request, reply) { + + return reply('Success'); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'POST', path: '/', config: { handler: handler, payload: { parse: false } } }); + + server.start(function () { + + var options = { + hostname: 'localhost', + port: server.info.port, + path: '/', + method: 'POST', + headers: { + 'Content-Length': '10' + } + }; + + var req = Http.request(options, function (res) { + + }); + + req.write('Hello\n'); + + req.on('error', function (err) { + + expect(err.code).to.equal('ECONNRESET'); + done(); + }); + + setTimeout(function () { + + req.abort(); + }, 15); + }); + }); + + it('errors when payload too big', function (done) { + + var payload = '{"x":"1","y":"2","z":"3"}'; + + var handler = function (request, reply) { + + expect(request.payload.toString()).to.equal(payload); + return reply(request.payload); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'POST', path: '/', config: { handler: handler, payload: { maxBytes: 10 } } }); + + server.inject({ method: 'POST', url: '/', payload: payload, headers: { 'content-length': payload.length } }, function (res) { + + expect(res.statusCode).to.equal(400); + expect(res.result).to.exist(); + expect(res.result.message).to.equal('Payload content length greater than maximum allowed: 10'); + done(); + }); + }); + + it('returns 400 with response when payload is not consumed', function (done) { + + var payload = new Buffer(10 * 1024 * 1024).toString(); + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'POST', path: '/', config: { handler: function (request, reply) { return reply(); }, payload: { maxBytes: 1024 * 1024 } } }); + + server.start(function () { + + var uri = 'http://localhost:' + server.info.port; + + Wreck.post(uri, { payload: payload }, function (err, res, body) { + + expect(err).to.not.exist(); + expect(res.statusCode).to.equal(400); + expect(body).to.equal('{"statusCode":400,"error":"Bad Request","message":"Payload content length greater than maximum allowed: 1048576"}'); + + done(); + }); + }); + }); + + it('peeks at unparsed data', function (done) { + + var data = null; + var ext = function (request, reply) { + + var chunks = []; + request.on('peek', function (chunk) { + + chunks.push(chunk); + }); + + request.once('finish', function () { + + data = Buffer.concat(chunks); + }); + + return reply.continue(); + }; + + var handler = function (request, reply) { + + return reply(data); + }; + + var server = new Hapi.Server(); + server.connection(); + server.ext('onRequest', ext); + server.route({ method: 'POST', path: '/', config: { handler: handler, payload: { parse: false } } }); + + var payload = '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789'; + server.inject({ method: 'POST', url: '/', payload: payload }, function (res) { + + expect(res.result).to.equal(payload); + done(); + }); + }); + + it('handles gzipped payload', function (done) { + + var message = { 'msg': 'This message is going to be gzipped.' }; + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'POST', path: '/', handler: function (request, reply) { return reply(request.payload); } }); + + Zlib.gzip(JSON.stringify(message), function (err, buf) { + + var request = { + method: 'POST', + url: '/', + headers: { + 'content-type': 'application/json', + 'content-encoding': 'gzip', + 'content-length': buf.length + }, + payload: buf + }; + + server.inject(request, function (res) { + + expect(res.result).to.exist(); + expect(res.result).to.deep.equal(message); + done(); + }); + }); + }); + + it('saves a file after content decoding', function (done) { + + var path = Path.join(__dirname, './file/image.jpg'); + var sourceContents = Fs.readFileSync(path); + var stats = Fs.statSync(path); + + Zlib.gzip(sourceContents, function (err, compressed) { + + var handler = function (request, reply) { + + var receivedContents = Fs.readFileSync(request.payload.path); + Fs.unlinkSync(request.payload.path); + expect(receivedContents).to.deep.equal(sourceContents); + return reply(request.payload.bytes); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'POST', path: '/file', config: { handler: handler, payload: { output: 'file' } } }); + server.inject({ method: 'POST', url: '/file', payload: compressed, headers: { 'content-encoding': 'gzip' } }, function (res) { + + expect(res.result).to.equal(stats.size); + done(); + }); + }); + }); + + it('errors saving a file without parse', function (done) { + + var handler = function (request, reply) { }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'POST', path: '/file', config: { handler: handler, payload: { output: 'file', parse: false, uploads: '/a/b/c/d/not' } } }); + server.inject({ method: 'POST', url: '/file', payload: 'abcde' }, function (res) { + + expect(res.statusCode).to.equal(500); + done(); + }); + }); + + it('sets parse mode when route methos is * and request is POST', function (done) { + + var handler = function (request, reply) { + + return reply(request.payload.key); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: '*', path: '/any', handler: handler }); + + server.inject({ url: '/any', method: 'POST', payload: { key: '09876' } }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result).to.equal('09876'); + done(); + }); + }); + + it('returns an error on unsupported mime type', function (done) { + + var handler = function (request, reply) { + + return reply(request.payload.key); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'POST', path: '/', config: { handler: handler } }); + + server.start(function () { + + var options = { + hostname: 'localhost', + port: server.info.port, + path: '/?x=4', + method: 'POST', + headers: { + 'Content-Type': 'application/unknown', + 'Content-Length': '18' + } + }; + + var req = Http.request(options, function (res) { + + expect(res.statusCode).to.equal(415); + done(); + }); + + req.end('{ "key": "value" }'); + }); + }); + + it('ignores unsupported mime type', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'POST', path: '/', config: { handler: function (request, reply) { return reply(request.payload); }, payload: { failAction: 'ignore' } } }); + + server.inject({ method: 'POST', url: '/', payload: 'testing123', headers: { 'content-type': 'application/unknown' } }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result).to.deep.equal({}); + done(); + }); + }); + + it('returns 200 on octet mime type', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'POST', path: '/', handler: function (request, reply) { return reply('ok'); } }); + + server.inject({ method: 'POST', url: '/', payload: 'testing123', headers: { 'content-type': 'application/octet-stream' } }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result).to.equal('ok'); + done(); + }); + }); + + it('returns 200 on text mime type', function (done) { + + var textHandler = function (request, reply) { + + return reply(request.payload + '+456'); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'POST', path: '/text', config: { handler: textHandler } }); + + server.inject({ method: 'POST', url: '/text', payload: 'testing123', headers: { 'content-type': 'text/plain' } }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result).to.equal('testing123+456'); + done(); + }); + }); + + it('returns 200 on override mime type', function (done) { + + var handler = function (request, reply) { + + return reply(request.payload.key); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'POST', path: '/override', config: { handler: handler, payload: { override: 'application/json' } } }); + + server.inject({ method: 'POST', url: '/override', payload: '{"key":"cool"}', headers: { 'content-type': 'text/plain' } }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result).to.equal('cool'); + done(); + }); + }); + + it('returns 200 on text mime type when allowed', function (done) { + + var textHandler = function (request, reply) { + + return reply(request.payload + '+456'); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'POST', path: '/textOnly', config: { handler: textHandler, payload: { allow: 'text/plain' } } }); + + server.inject({ method: 'POST', url: '/textOnly', payload: 'testing123', headers: { 'content-type': 'text/plain' } }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result).to.equal('testing123+456'); + done(); + }); + }); + + it('returns 415 on non text mime type when disallowed', function (done) { + + var textHandler = function (request, reply) { + + return reply(request.payload + '+456'); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'POST', path: '/textOnly', config: { handler: textHandler, payload: { allow: 'text/plain' } } }); + + server.inject({ method: 'POST', url: '/textOnly', payload: 'testing123', headers: { 'content-type': 'application/octet-stream' } }, function (res) { + + expect(res.statusCode).to.equal(415); + done(); + }); + }); + + it('returns 200 on text mime type when allowed (array)', function (done) { + + var textHandler = function (request, reply) { + + return reply(request.payload + '+456'); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'POST', path: '/textOnlyArray', config: { handler: textHandler, payload: { allow: ['text/plain'] } } }); + + server.inject({ method: 'POST', url: '/textOnlyArray', payload: 'testing123', headers: { 'content-type': 'text/plain' } }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result).to.equal('testing123+456'); + done(); + }); + }); + + it('returns 415 on non text mime type when disallowed (array)', function (done) { + + var textHandler = function (request, reply) { + + return reply(request.payload + '+456'); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'POST', path: '/textOnlyArray', config: { handler: textHandler, payload: { allow: ['text/plain'] } } }); + + server.inject({ method: 'POST', url: '/textOnlyArray', payload: 'testing123', headers: { 'content-type': 'application/octet-stream' } }, function (res) { + + expect(res.statusCode).to.equal(415); + done(); + }); + }); + + it('parses application/x-www-form-urlencoded with arrays', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + server.route({ + method: 'POST', + path: '/', + handler: function (request, reply) { + + return reply(request.payload.x.y + request.payload.x.z); + } + }); + + server.inject({ method: 'POST', url: '/', payload: 'x[y]=1&x[z]=2', headers: { 'content-type': 'application/x-www-form-urlencoded' } }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result).to.equal('12'); + done(); + }); + }); + + it('returns parsed multipart data', function (done) { + + var multipartPayload = + '--AaB03x\r\n' + + 'content-disposition: form-data; name="x"\r\n' + + '\r\n' + + 'First\r\n' + + '--AaB03x\r\n' + + 'content-disposition: form-data; name="x"\r\n' + + '\r\n' + + 'Second\r\n' + + '--AaB03x\r\n' + + 'content-disposition: form-data; name="x"\r\n' + + '\r\n' + + 'Third\r\n' + + '--AaB03x\r\n' + + 'content-disposition: form-data; name="field1"\r\n' + + '\r\n' + + 'Joe Blow\r\nalmost tricked you!\r\n' + + '--AaB03x\r\n' + + 'content-disposition: form-data; name="field1"\r\n' + + '\r\n' + + 'Repeated name segment\r\n' + + '--AaB03x\r\n' + + 'content-disposition: form-data; name="pics"; filename="file1.txt"\r\n' + + 'Content-Type: text/plain\r\n' + + '\r\n' + + '... contents of file1.txt ...\r\r\n' + + '--AaB03x--\r\n'; + + var handler = function (request, reply) { + + var result = {}; + var keys = Object.keys(request.payload); + for (var i = 0, il = keys.length; i < il; ++i) { + var key = keys[i]; + var value = request.payload[key]; + result[key] = value._readableState ? true : value; + } + + return reply(result); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'POST', path: '/echo', config: { handler: handler } }); + + server.inject({ method: 'POST', url: '/echo', payload: multipartPayload, headers: { 'content-type': 'multipart/form-data; boundary=AaB03x' } }, function (res) { + + expect(Object.keys(res.result).length).to.equal(3); + expect(res.result.field1).to.exist(); + expect(res.result.field1.length).to.equal(2); + expect(res.result.field1[1]).to.equal('Repeated name segment'); + expect(res.result.pics).to.exist(); + done(); + }); + }); + + it('times out when client request taking too long', function (done) { + + var server = new Hapi.Server(); + server.connection({ routes: { payload: { timeout: 50 } } }); + server.route({ method: 'POST', path: '/fast', config: { handler: function (request, reply) { return reply('fast'); } } }); + server.start(function () { + + var timer = new Hoek.Bench(); + var options = { + hostname: '127.0.0.1', + port: server.info.port, + path: '/fast', + method: 'POST' + }; + + var req = Http.request(options, function (res) { + + expect(res.statusCode).to.equal(408); + expect(timer.elapsed()).to.be.at.least(45); + done(); + }); + + req.on('error', function (err) { }); // Will error out, so don't allow error to escape test + + req.write('{}\n'); + var now = Date.now(); + setTimeout(function () { + + req.end(); + }, 100); + }); + }); + + it('times out when client request taking too long (route override)', function (done) { + + var server = new Hapi.Server(); + server.connection({ routes: { payload: { timeout: false } } }); + server.route({ method: 'POST', path: '/fast', config: { payload: { timeout: 50 }, handler: function (request, reply) { return reply('fast'); } } }); + server.start(function () { + + var timer = new Hoek.Bench(); + var options = { + hostname: '127.0.0.1', + port: server.info.port, + path: '/fast', + method: 'POST' + }; + + var req = Http.request(options, function (res) { + + expect(res.statusCode).to.equal(408); + expect(timer.elapsed()).to.be.at.least(45); + done(); + }); + + req.on('error', function (err) { }); // Will error out, so don't allow error to escape test + + req.write('{}\n'); + var now = Date.now(); + setTimeout(function () { + + req.end(); + }, 100); + }); + }); + + it('returns payload when timeout is not triggered', function (done) { + + var server = new Hapi.Server(); + server.connection({ routes: { payload: { timeout: 50 } } }); + server.route({ method: 'POST', path: '/fast', config: { handler: function (request, reply) { return reply('fast'); } } }); + server.start(function () { + + var options = { + hostname: '127.0.0.1', + port: server.info.port, + path: '/fast', + method: 'POST' + }; + + var req = Http.request(options, function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + + req.end(); + }); + }); +}); diff --git a/node_modules/hapi/test/plugin.js b/node_modules/hapi/test/plugin.js new file mode 100755 index 0000000..44da358 --- /dev/null +++ b/node_modules/hapi/test/plugin.js @@ -0,0 +1,2574 @@ +// Load modules + +var Os = require('os'); +var Path = require('path'); +var Boom = require('boom'); +var CatboxMemory = require('catbox-memory'); +var Code = require('code'); +var Handlebars = require('handlebars'); +var Hapi = require('..'); +var Hoek = require('hoek'); +var Lab = require('lab'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('Plugin', function () { + + describe('select()', function () { + + it('creates a subset of connections for manipulation', function (done) { + + var server = new Hapi.Server(); + server.connection({ labels: ['s1', 'a', 'b'] }); + server.connection({ labels: ['s2', 'a', 'c'] }); + server.connection({ labels: ['s3', 'a', 'b', 'd'] }); + server.connection({ labels: ['s4', 'b', 'x'] }); + + var register = function (server, options, next) { + + var a = server.select('a'); + var ab = a.select('b'); + var memoryx = server.select('x', 's4'); + var sodd = server.select(['s2', 's4']); + + expect(server.connections.length).to.equal(4); + expect(a.connections.length).to.equal(3); + expect(ab.connections.length).to.equal(2); + expect(memoryx.connections.length).to.equal(1); + expect(sodd.connections.length).to.equal(2); + + server.route({ method: 'GET', path: '/all', handler: function (request, reply) { return reply('all'); } }); + a.route({ method: 'GET', path: '/a', handler: function (request, reply) { return reply('a'); } }); + ab.route([{ method: 'GET', path: '/ab', handler: function (request, reply) { return reply('ab'); } }]); + memoryx.route({ method: 'GET', path: '/memoryx', handler: function (request, reply) { return reply('memoryx'); } }); + sodd.route({ method: 'GET', path: '/sodd', handler: function (request, reply) { return reply('sodd'); } }); + + memoryx.state('sid', { encoding: 'base64' }); + server.method({ + name: 'testMethod', method: function (next) { + + return next(null, '123'); + }, options: { cache: { expiresIn: 1000 } } + }); + + server.methods.testMethod(function (err, result) { + + expect(result).to.equal('123'); + + server.methods.testMethod(function (err, result) { + + expect(result).to.equal('123'); + return next(); + }); + }); + }; + + register.attributes = { + name: 'plugin' + }; + + server.register(register, function (err) { + + expect(err).to.not.exist(); + + expect(internals.routesList(server, 's1')).to.deep.equal(['/a', '/ab', '/all']); + expect(internals.routesList(server, 's2')).to.deep.equal(['/a', '/all', '/sodd']); + expect(internals.routesList(server, 's3')).to.deep.equal(['/a', '/ab', '/all']); + expect(internals.routesList(server, 's4')).to.deep.equal(['/all', '/memoryx', '/sodd']); + done(); + }); + }); + + it('registers a plugin on selection inside a plugin', function (done) { + + var server = new Hapi.Server(); + server.connection({ labels: ['a'] }); + server.connection({ labels: ['b'] }); + server.connection({ labels: ['c'] }); + + var server1 = server.connections[0]; + var server2 = server.connections[1]; + var server3 = server.connections[2]; + + var child = function (server, options, next) { + + server.expose('key2', server.connections.length); + return next(); + }; + + child.attributes = { + name: 'child' + }; + + var test = function (server, options, next) { + + server.expose('key1', server.connections.length); + server.select('a').register(child, next); + }; + + test.attributes = { + name: 'test' + }; + + server.register(test, { select: ['a', 'b'] }, function (err) { + + expect(err).to.not.exist(); + expect(server.plugins.test.key1).to.equal(2); + expect(server.plugins.child.key2).to.equal(1); + done(); + }); + }); + }); + + describe('register()', function () { + + it('registers plugin with options', function (done) { + + var server = new Hapi.Server(); + server.connection({ labels: ['a', 'b'] }); + + var test = function (server, options, next) { + + expect(options.something).to.be.true(); + return next(); + }; + + test.attributes = { + name: 'test' + }; + + server.register({ register: test, options: { something: true } }, function (err) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('registers a required plugin', function (done) { + + var server = new Hapi.Server(); + server.connection({ labels: ['a', 'b'] }); + + var test = { + register: function (server, options, next) { + + expect(options.something).to.be.true(); + return next(); + } + }; + + test.register.attributes = { + name: 'test' + }; + + server.register({ register: test, options: { something: true } }, function (err) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('throws on bad plugin (missing attributes)', function (done) { + + var server = new Hapi.Server(); + expect(function () { + + server.register({ register: function (server, options, next) { return next(); } }, function (err) { }); + }).to.throw('Invalid plugin object - invalid or missing register function attributes property'); + + done(); + }); + + it('throws on bad plugin (missing name)', function (done) { + + var register = function (server, options, next) { + + return next(); + }; + + register.attributes = {}; + + var server = new Hapi.Server(); + expect(function () { + + server.register(register, function (err) { }); + }).to.throw('Missing plugin name'); + + done(); + }); + + it('throws on bad plugin (empty pkg)', function (done) { + + var register = function (server, options, next) { + + return next(); + }; + + register.attributes = { + pkg: {} + }; + + var server = new Hapi.Server(); + expect(function () { + + server.register(register, function (err) { }); + }).to.throw('Missing plugin name'); + + done(); + }); + + it('throws when register is missing a callback function', function (done) { + + var server = new Hapi.Server(); + server.connection({ labels: ['a', 'b'] }); + + var test = function (server, options, next) { + + expect(options.something).to.be.true(); + return next(); + }; + + test.attributes = { + name: 'test' + }; + + expect(function () { + + server.register(test); + }).to.throw('A callback function is required to register a plugin'); + done(); + }); + + it('returns plugin error', function (done) { + + var test = function (server, options, next) { + + return next(new Error('from plugin')); + }; + + test.attributes = { + name: 'test' + }; + + var server = new Hapi.Server(); + server.connection(); + server.register(test, function (err) { + + expect(err).to.exist(); + expect(err.message).to.equal('from plugin'); + done(); + }); + }); + + it('sets version to 0.0.0 if missing', function (done) { + + var test = function (server, options, next) { + + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(server.version); } }); + return next(); + }; + + test.attributes = { + pkg: { + name: 'steve' + } + }; + + var server = new Hapi.Server(); + server.connection(); + + server.register(test, function (err) { + + expect(err).to.not.exist(); + expect(server.connections[0]._registrations.steve.version).to.equal('0.0.0'); + server.inject('/', function (res) { + + expect(res.result).to.equal(require('../package.json').version); + done(); + }); + }); + }); + + it('prevents plugin from multiple registrations', function (done) { + + var test = function (server, options, next) { + + server.route({ method: 'GET', path: '/a', handler: function (request, reply) { return reply('a'); } }); + return next(); + }; + + test.attributes = { + name: 'test' + }; + + var server = new Hapi.Server(); + server.connection({ host: 'example.com' }); + server.register(test, function (err) { + + expect(err).to.not.exist(); + expect(function () { + + server.register(test, function (err) { }); + }).to.throw('Plugin test already registered in: http://example.com'); + + done(); + }); + }); + + it('allows plugin multiple registrations (attributes)', function (done) { + + var test = function (server, options, next) { + + server.app.x = server.app.x ? server.app.x + 1 : 1; + return next(); + }; + + test.attributes = { + name: 'test', + multiple: true + }; + + var server = new Hapi.Server(); + server.connection(); + server.register(test, function (err) { + + expect(err).to.not.exist(); + server.register(test, function (err) { + + expect(err).to.not.exist(); + expect(server.app.x).to.equal(2); + done(); + }); + }); + }); + + it('registers multiple plugins', function (done) { + + var server = new Hapi.Server(); + server.connection({ labels: 'test' }); + var log = null; + server.once('log', function (event, tags) { + + log = [event, tags]; + }); + + server.register([internals.plugins.test1, internals.plugins.test2], function (err) { + + expect(err).to.not.exist(); + expect(internals.routesList(server)).to.deep.equal(['/test1', '/test2']); + expect(log[1].test).to.equal(true); + expect(log[0].data).to.equal('abc'); + done(); + }); + }); + + it('registers multiple plugins (verbose)', function (done) { + + var server = new Hapi.Server(); + server.connection({ labels: 'test' }); + var log = null; + server.once('log', function (event, tags) { + + log = [event, tags]; + }); + + server.register([{ register: internals.plugins.test1 }, { register: internals.plugins.test2 }], function (err) { + + expect(err).to.not.exist(); + expect(internals.routesList(server)).to.deep.equal(['/test1', '/test2']); + expect(log[1].test).to.equal(true); + expect(log[0].data).to.equal('abc'); + done(); + }); + }); + + it('registers a child plugin', function (done) { + + var server = new Hapi.Server(); + server.connection({ labels: 'test' }); + server.register(internals.plugins.child, function (err) { + + expect(err).to.not.exist(); + server.inject('/test1', function (res) { + + expect(res.result).to.equal('testing123'); + done(); + }); + }); + }); + + it('registers a plugin with routes path prefix', function (done) { + + var server = new Hapi.Server(); + server.connection({ labels: 'test' }); + server.register(internals.plugins.test1, { routes: { prefix: '/xyz' } }, function (err) { + + expect(server.plugins.test1.prefix).to.equal('/xyz'); + expect(err).to.not.exist(); + server.inject('/xyz/test1', function (res) { + + expect(res.result).to.equal('testing123'); + done(); + }); + }); + }); + + it('registers a plugin with routes path prefix and plugin root route', function (done) { + + var test = function (server, options, next) { + + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok'); } }); + return next(); + }; + + test.attributes = { + name: 'test' + }; + + var server = new Hapi.Server(); + server.connection({ labels: 'test' }); + server.register(test, { routes: { prefix: '/xyz' } }, function (err) { + + expect(err).to.not.exist(); + server.inject('/xyz', function (res) { + + expect(res.result).to.equal('ok'); + done(); + }); + }); + }); + + it('ignores the type of the plugin value', function (done) { + + var a = function () { }; + a.register = function (server, options, next) { + + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok'); } }); + return next(); + }; + + a.register.attributes = { name: 'a' }; + + var server = new Hapi.Server(); + server.connection({ labels: 'test' }); + server.register(a, { routes: { prefix: '/xyz' } }, function (err) { + + expect(err).to.not.exist(); + server.inject('/xyz', function (res) { + + expect(res.result).to.equal('ok'); + done(); + }); + }); + }); + + it('registers a child plugin with parent routes path prefix', function (done) { + + var server = new Hapi.Server(); + server.connection({ labels: 'test' }); + server.register(internals.plugins.child, { routes: { prefix: '/xyz' } }, function (err) { + + expect(err).to.not.exist(); + server.inject('/xyz/test1', function (res) { + + expect(res.result).to.equal('testing123'); + done(); + }); + }); + }); + + it('registers a child plugin with parent routes vhost prefix', function (done) { + + var server = new Hapi.Server(); + server.connection({ labels: 'test' }); + server.register(internals.plugins.child, { routes: { vhost: 'example.com' } }, function (err) { + + expect(err).to.not.exist(); + server.inject({ url: '/test1', headers: { host: 'example.com' } }, function (res) { + + expect(res.result).to.equal('testing123'); + done(); + }); + }); + }); + + it('registers a child plugin with parent routes path prefix and inner register prefix', function (done) { + + var server = new Hapi.Server(); + server.connection({ labels: 'test' }); + server.register({ register: internals.plugins.child, options: { routes: { prefix: '/inner' } } }, { routes: { prefix: '/xyz' } }, function (err) { + + expect(err).to.not.exist(); + server.inject('/xyz/inner/test1', function (res) { + + expect(res.result).to.equal('testing123'); + done(); + }); + }); + }); + + it('registers a child plugin with parent routes vhost prefix and inner register vhost', function (done) { + + var server = new Hapi.Server(); + server.connection({ labels: 'test' }); + server.register({ register: internals.plugins.child, options: { routes: { vhost: 'example.net' } } }, { routes: { vhost: 'example.com' } }, function (err) { + + expect(err).to.not.exist(); + server.inject({ url: '/test1', headers: { host: 'example.com' } }, function (res) { + + expect(res.result).to.equal('testing123'); + done(); + }); + }); + }); + + it('registers a plugin with routes vhost', function (done) { + + var server = new Hapi.Server(); + server.connection({ labels: 'test' }); + server.register(internals.plugins.test1, { routes: { vhost: 'example.com' } }, function (err) { + + expect(err).to.not.exist(); + server.inject('/test1', function (res) { + + expect(res.statusCode).to.equal(404); + + server.inject({ url: '/test1', headers: { host: 'example.com' } }, function (res) { + + expect(res.result).to.equal('testing123'); + done(); + }); + }); + }); + }); + + it('registers plugins with pre-selected label', function (done) { + + var server = new Hapi.Server(); + server.connection({ labels: ['a'] }); + server.connection({ labels: ['b'] }); + + var server1 = server.connections[0]; + var server2 = server.connections[1]; + + var test = function (server, options, next) { + + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok'); } }); + return next(); + }; + + test.attributes = { + name: 'test' + }; + + server.register(test, { select: 'a' }, function (err) { + + expect(err).to.not.exist(); + server1.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + server2.inject('/', function (res) { + + expect(res.statusCode).to.equal(404); + done(); + }); + }); + }); + }); + + it('registers plugins with pre-selected labels', function (done) { + + var server = new Hapi.Server(); + server.connection({ labels: ['a'] }); + server.connection({ labels: ['b'] }); + server.connection({ labels: ['c'] }); + + var server1 = server.connections[0]; + var server2 = server.connections[1]; + var server3 = server.connections[2]; + + var test = function (server, options, next) { + + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok'); } }); + server.expose('super', 'trooper'); + return next(); + }; + + test.attributes = { + name: 'test' + }; + + server.register(test, { select: ['a', 'c'] }, function (err) { + + expect(err).to.not.exist(); + expect(server.plugins.test.super).to.equal('trooper'); + + server1.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + server2.inject('/', function (res) { + + expect(res.statusCode).to.equal(404); + server3.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + }); + }); + }); + + it('sets multiple dependencies in one statement', function (done) { + + var a = function (server, options, next) { + + server.dependency(['b', 'c']); + return next(); + }; + + a.attributes = { + name: 'a' + }; + + var b = function (server, options, next) { + + return next(); + }; + + b.attributes = { + name: 'b' + }; + + var c = function (server, options, next) { + + return next(); + }; + + c.attributes = { + name: 'c' + }; + + var server = new Hapi.Server(); + server.connection(); + server.register(b, function (err) { + + server.register(c, function (err) { + + server.register(a, function (err) { + + done(); + }); + }); + }); + }); + + it('sets multiple dependencies in attributes', function (done) { + + var a = function (server, options, next) { + + return next(); + }; + + a.attributes = { + name: 'a', + dependencies: ['b', 'c'] + }; + + var b = function (server, options, next) { + + return next(); + }; + + b.attributes = { + name: 'b' + }; + + var c = function (server, options, next) { + + return next(); + }; + + c.attributes = { + name: 'c' + }; + + var server = new Hapi.Server(); + server.connection(); + server.register(b, function (err) { + + server.register(c, function (err) { + + server.register(a, function (err) { + + done(); + }); + }); + }); + }); + + it('sets multiple dependencies in multiple statements', function (done) { + + var a = function (server, options, next) { + + server.dependency('b'); + server.dependency('c'); + return next(); + }; + + a.attributes = { + name: 'a' + }; + + var b = function (server, options, next) { + + return next(); + }; + + b.attributes = { + name: 'b' + }; + + var c = function (server, options, next) { + + return next(); + }; + + c.attributes = { + name: 'c' + }; + + var server = new Hapi.Server(); + server.connection(); + server.register(b, function (err) { + + server.register(c, function (err) { + + server.register(a, function (err) { + + done(); + }); + }); + }); + }); + + it('sets multiple dependencies in multiple locations', function (done) { + + var a = function (server, options, next) { + + server.dependency('b'); + return next(); + }; + + a.attributes = { + name: 'a', + dependecies: 'c' + }; + + var b = function (server, options, next) { + + return next(); + }; + + b.attributes = { + name: 'b' + }; + + var c = function (server, options, next) { + + return next(); + }; + + c.attributes = { + name: 'c' + }; + + var server = new Hapi.Server(); + server.connection(); + server.register(b, function (err) { + + server.register(c, function (err) { + + server.register(a, function (err) { + + done(); + }); + }); + }); + }); + + it('throws when dependencies is an object', function (done) { + + var a = function (server, options, next) { + + next(); + }; + a.attributes = { + name: 'a', + dependencies: { b: true } + }; + + var server = new Hapi.Server(); + server.connection(); + + expect(function () { + + server.register(a, function () {}); + }).to.throw('Invalid dependencies options (must be a string or an array of strings) {\n \"b\": true,\n \u001b[41m\"0\"\u001b[0m\u001b[31m [1]: -- missing --\u001b[0m\n}\n\u001b[31m\n[1] "0" must be a string\u001b[0m'); + done(); + }); + + it('throws when dependencies contain something else than a string', function (done) { + + var a = function (server, options, next) { + + next(); + }; + a.attributes = { + name: 'a', + dependencies: [true] + }; + + var server = new Hapi.Server(); + server.connection(); + + expect(function () { + + server.register(a, function () {}); + }).to.throw('Invalid dependencies options (must be a string or an array of strings) [\n null\n]\n\u001b[31m\n[1] "0" must be a string\u001b[0m'); + done(); + }); + }); + + describe('after()', function () { + + it('calls method after plugin', function (done) { + + var x = function (server, options, next) { + + server.expose('a', 'b'); + return next(); + }; + + x.attributes = { + name: 'x' + }; + + var server = new Hapi.Server(); + server.connection(); + + expect(server.plugins.x).to.not.exist(); + + var called = false; + server.after(function (server, next) { + + expect(server.plugins.x.a).to.equal('b'); + called = true; + return next(); + }, 'x'); + + server.register(x, function (err) { + + expect(err).to.not.exist(); + server.start(function (err) { + + expect(called).to.be.true(); + done(); + }); + }); + }); + + it('calls method before start', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + var called = false; + server.after(function (server, next) { + + called = true; + return next(); + }); + + server.start(function (err) { + + expect(called).to.be.true(); + done(); + }); + }); + + it('calls method before start even if plugin not registered', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + var called = false; + server.after(function (server, next) { + + called = true; + return next(); + }, 'x'); + + server.start(function (err) { + + expect(called).to.be.true(); + done(); + }); + }); + + it('fails to start server when after method fails', function (done) { + + var test = function (server, options, next) { + + server.after(function (server, finish) { + + return finish(); + }); + + server.after(function (server, finish) { + + return finish(new Error('Not in the mood')); + }); + + return next(); + }; + + test.attributes = { + name: 'test' + }; + + var server = new Hapi.Server(); + server.connection(); + server.register(test, function (err) { + + expect(err).to.not.exist(); + server.start(function (err) { + + expect(err).to.exist(); + done(); + }); + }); + }); + }); + + describe('auth', function () { + + it('adds auth strategy via plugin', function (done) { + + var server = new Hapi.Server(); + server.connection({ labels: 'a' }); + server.connection({ labels: 'b' }); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('authenticated!'); } }); + + server.register(internals.plugins.auth, function (err) { + + expect(err).to.not.exist(); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(401); + server.inject({ method: 'GET', url: '/', headers: { authorization: 'Basic ' + (new Buffer('john:12345', 'utf8')).toString('base64') } }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result).to.equal('authenticated!'); + done(); + }); + }); + }); + }); + }); + + describe('bind()', function () { + + it('sets plugin context', function (done) { + + var test = function (server, options, next) { + + var bind = { + value: 'in context', + suffix: ' throughout' + }; + + server.bind(bind); + + server.route({ + method: 'GET', + path: '/', + handler: function (request, reply) { + + return reply(this.value); + } + }); + + server.ext('onPreResponse', function (request, reply) { + + return reply(request.response.source + this.suffix); + }); + + return next(); + }; + + test.attributes = { + name: 'test' + }; + + var server = new Hapi.Server(); + server.connection(); + server.register(test, function (err) { + + expect(err).to.not.exist(); + server.inject('/', function (res) { + + expect(res.result).to.equal('in context throughout'); + done(); + }); + }); + }); + }); + + describe('cache()', function () { + + it('provisions a server cache', function (done) { + + var server = new Hapi.Server(); + server.connection(); + var cache = server.cache({ segment: 'test', expiresIn: 1000 }); + server.start(function () { + + cache.set('a', 'going in', 0, function (err) { + + cache.get('a', function (err, value, cached, report) { + + expect(value).to.equal('going in'); + + server.stop(function () { + + done(); + }); + }); + }); + }); + }); + + it('throws when missing segment', function (done) { + + var server = new Hapi.Server(); + server.connection(); + expect(function () { + + server.cache({ expiresIn: 1000 }); + }).to.throw('Missing cache segment name'); + done(); + }); + + it('provisions a server cache with custom partition', function (done) { + + var server = new Hapi.Server({ cache: { engine: CatboxMemory, partition: 'hapi-test-other' } }); + server.connection(); + var cache = server.cache({ segment: 'test', expiresIn: 1000 }); + server.start(function () { + + cache.set('a', 'going in', 0, function (err) { + + cache.get('a', function (err, value, cached, report) { + + expect(value).to.equal('going in'); + expect(cache._cache.connection.settings.partition).to.equal('hapi-test-other'); + + server.stop(function () { + + done(); + }); + }); + }); + }); + }); + + it('throws when allocating an invalid cache segment', function (done) { + + var server = new Hapi.Server(); + server.connection(); + expect(function () { + + server.cache({ segment: 'a', expiresAt: '12:00', expiresIn: 1000 }); + }).throws(); + + done(); + }); + + it('allows allocating a cache segment with empty options', function (done) { + + var server = new Hapi.Server(); + server.connection(); + expect(function () { + + server.cache({ segment: 'a' }); + }).to.not.throw(); + + done(); + }); + + it('allows reusing the same cache segment (server)', function (done) { + + var server = new Hapi.Server({ cache: { engine: CatboxMemory, shared: true } }); + server.connection(); + expect(function () { + + var a1 = server.cache({ segment: 'a', expiresIn: 1000 }); + var a2 = server.cache({ segment: 'a', expiresIn: 1000 }); + }).to.not.throw(); + done(); + }); + + it('allows reusing the same cache segment (cache)', function (done) { + + var server = new Hapi.Server(); + server.connection(); + expect(function () { + + var a1 = server.cache({ segment: 'a', expiresIn: 1000 }); + var a2 = server.cache({ segment: 'a', expiresIn: 1000, shared: true }); + }).to.not.throw(); + done(); + }); + + it('uses plugin cache interface', function (done) { + + var test = function (server, options, next) { + + var cache = server.cache({ expiresIn: 10 }); + server.expose({ + get: function (key, callback) { + + cache.get(key, function (err, value, cached, report) { + + callback(err, value); + }); + }, + set: function (key, value, callback) { + + cache.set(key, value, 0, callback); + } + }); + + return next(); + }; + + test.attributes = { + name: 'test' + }; + + var server = new Hapi.Server(); + server.connection(); + server.register(test, function (err) { + + expect(err).to.not.exist(); + server.start(function () { + + server.plugins.test.set('a', '1', function (err) { + + expect(err).to.not.exist(); + server.plugins.test.get('a', function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.equal('1'); + setTimeout(function () { + + server.plugins.test.get('a', function (err, value) { + + expect(err).to.not.exist(); + expect(value).to.equal(null); + done(); + }); + }, 11); + }); + }); + }); + }); + }); + }); + + describe('decorate()', function () { + + it('decorates reply', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + server.decorate('reply', 'success', function () { + + return this.response({ status: 'ok' }); + }); + + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply.success(); } }); + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result.status).to.equal('ok'); + done(); + }); + }); + + it('throws on double reply decoration', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + server.decorate('reply', 'success', function () { + + return this.response({ status: 'ok' }); + }); + + expect(function () { + + server.decorate('reply', 'success', function () { }); + }).to.throw('Reply interface decoration already defined: success'); + done(); + }); + + it('throws on internal conflict', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + expect(function () { + + server.decorate('reply', 'redirect', function () { }); + }).to.throw('Cannot override built-in reply interface decoration: redirect'); + done(); + }); + + it('decorates server', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + server.decorate('server', 'ok', function (path) { + + server.route({ method: 'GET', path: path, handler: function (request, reply) { return reply('ok'); } }); + }); + + server.ok('/'); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result).to.equal('ok'); + done(); + }); + }); + + it('throws on double server decoration', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + server.decorate('server', 'ok', function (path) { + + server.route({ method: 'GET', path: path, handler: function (request, reply) { return reply('ok'); } }); + }); + + expect(function () { + + server.decorate('server', 'ok', function () { }); + }).to.throw('Server decoration already defined: ok'); + done(); + }); + + it('throws on server decoration root conflict', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + expect(function () { + + server.decorate('server', 'start', function () { }); + }).to.throw('Cannot override the built-in server interface method: start'); + done(); + }); + + it('throws on server decoration plugin conflict', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + expect(function () { + + server.decorate('server', 'select', function () { }); + }).to.throw('Cannot override the built-in server interface method: select'); + done(); + }); + + it('throws on invalid decoration name', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + expect(function () { + + server.decorate('server', '_special', function () { }); + }).to.throw('Property name cannot begin with an underscore: _special'); + done(); + }); + }); + + describe('dependency()', function () { + + it('fails to register single plugin with dependencies', function (done) { + + var test = function (server, options, next) { + + server.dependency('none'); + return next(); + }; + + test.attributes = { + name: 'test' + }; + + var server = new Hapi.Server(); + server.connection(); + server.register(test, function (err) { + + expect(function () { + + server.start(); + }).to.throw('Plugin test missing dependency none in connection: ' + server.info.uri); + done(); + }); + }); + + it('fails to register single plugin with dependencies (attributes)', function (done) { + + var test = function (server, options, next) { + + return next(); + }; + + test.attributes = { + name: 'test', + dependencies: 'none' + }; + + var server = new Hapi.Server(); + server.connection(); + server.register(test, function (err) { + + expect(function () { + + server.start(); + }).to.throw('Plugin test missing dependency none in connection: ' + server.info.uri); + done(); + }); + }); + + it('fails to register multiple plugins with dependencies', function (done) { + + var server = new Hapi.Server(); + server.connection({ port: 80, host: 'localhost' }); + server.register([internals.plugins.deps1, internals.plugins.deps3], function (err) { + + expect(function () { + + server.start(); + }).to.throw('Plugin deps1 missing dependency deps2 in connection: http://localhost:80'); + done(); + }); + }); + + it('recognizes dependencies from peer plugins', function (done) { + + var a = function (server, options, next) { + + server.register(b, next); + }; + + a.attributes = { + name: 'a' + }; + + var b = function (server, options, next) { + + return next(); + }; + + b.attributes = { + name: 'b' + }; + + var c = function (server, options, next) { + + server.dependency('b'); + return next(); + }; + + c.attributes = { + name: 'c' + }; + + var server = new Hapi.Server(); + server.connection(); + server.register([a, c], function (err) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('errors when missing inner dependencies', function (done) { + + var a = function (server, options, next) { + + server.register(b, next); + }; + + a.attributes = { + name: 'a' + }; + + var b = function (server, options, next) { + + server.dependency('c'); + return next(); + }; + + b.attributes = { + name: 'b' + }; + + var server = new Hapi.Server(); + server.connection({ port: 80, host: 'localhost' }); + server.register(a, function (err) { + + expect(function () { + + server.start(); + }).to.throw('Plugin b missing dependency c in connection: http://localhost:80'); + done(); + }); + }); + + it('errors when missing inner dependencies (attributes)', function (done) { + + var a = function (server, options, next) { + + server.register(b, next); + }; + + a.attributes = { + name: 'a' + }; + + var b = function (server, options, next) { + + return next(); + }; + + b.attributes = { + name: 'b', + dependencies: 'c' + }; + + var server = new Hapi.Server(); + server.connection({ port: 80, host: 'localhost' }); + server.register(a, function (err) { + + expect(function () { + + server.start(); + }).to.throw('Plugin b missing dependency c in connection: http://localhost:80'); + done(); + }); + }); + }); + + describe('events', function () { + + it('plugin event handlers receive more than 2 arguments when they exist', function (done) { + + var test = function (server, options, next) { + + server.once('request-internal', function () { + + expect(arguments).to.have.length(3); + done(); + }); + + return next(); + }; + + test.attributes = { + name: 'test' + }; + + var server = new Hapi.Server(); + server.connection(); + server.register(test, function (err) { + + expect(err).to.not.exist(); + server.inject({ url: '/' }, function () { }); + }); + }); + + it('listens to events on selected connections', function (done) { + + var server = new Hapi.Server(); + server.connection({ labels: ['a'] }); + server.connection({ labels: ['b'] }); + server.connection({ labels: ['c'] }); + + var server1 = server.connections[0]; + var server2 = server.connections[1]; + var server3 = server.connections[2]; + + var counter = 0; + var test = function (server, options, next) { + + server.select(['a', 'b']).on('test', function () { + + ++counter; + }); + + server.select(['a']).on('start', function () { + + ++counter; + }); + + return next(); + }; + + test.attributes = { + name: 'test' + }; + + server.register(test, function (err) { + + expect(err).to.not.exist(); + server1.emit('test'); + server2.emit('test'); + server3.emit('test'); + + server.start(function () { + + server.stop(function () { + + expect(counter).to.equal(3); + done(); + }); + }); + }); + }); + }); + + describe('expose()', function () { + + it('exposes an api', function (done) { + + var server = new Hapi.Server(); + server.connection({ labels: ['s1', 'a', 'b'] }); + server.connection({ labels: ['s2', 'a', 'test'] }); + server.connection({ labels: ['s3', 'a', 'b', 'd', 'cache'] }); + server.connection({ labels: ['s4', 'b', 'test', 'cache'] }); + + server.register(internals.plugins.test1, function (err) { + + expect(err).to.not.exist(); + + expect(server.connections[0]._router.routes.get).to.not.exist(); + expect(internals.routesList(server, 's2')).to.deep.equal(['/test1']); + expect(server.connections[2]._router.routes.get).to.not.exist(); + expect(internals.routesList(server, 's4')).to.deep.equal(['/test1']); + + expect(server.plugins.test1.add(1, 3)).to.equal(4); + expect(server.plugins.test1.glue('1', '3')).to.equal('13'); + + done(); + }); + }); + }); + + describe('ext()', function () { + + it('extends onRequest point', function (done) { + + var test = function (server, options, next) { + + server.route({ method: 'GET', path: '/b', handler: function (request, reply) { return reply('b'); } }); + server.ext('onRequest', function (request, reply) { + + request.setUrl('/b'); + return reply.continue(); + }); + + return next(); + }; + + test.attributes = { + name: 'test' + }; + + var server = new Hapi.Server(); + server.connection(); + server.register(test, function (err) { + + expect(err).to.not.exist(); + expect(internals.routesList(server)).to.deep.equal(['/b']); + + server.inject('/a', function (res) { + + expect(res.result).to.equal('b'); + done(); + }); + }); + }); + + it('adds multiple ext functions with dependencies', function (done) { + + var server = new Hapi.Server(); + server.connection({ labels: ['a', 'b', '0'] }); + server.connection({ labels: ['a', 'c', '1'] }); + server.connection({ labels: ['c', 'b', '2'] }); + + var handler = function (request, reply) { + + return reply(request.app.deps); + }; + + server.select('0').route({ method: 'GET', path: '/', handler: handler }); + server.select('1').route({ method: 'GET', path: '/', handler: handler }); + server.select('2').route({ method: 'GET', path: '/', handler: handler }); + + server.register([internals.plugins.deps1, internals.plugins.deps2, internals.plugins.deps3], function (err) { + + expect(err).to.not.exist(); + + server.start(function (err) { + + expect(err).to.not.exist(); + expect(server.plugins.deps1.breaking).to.equal('bad'); + + server.connections[0].inject('/', function (res) { + + expect(res.result).to.equal('|2|1|'); + + server.connections[1].inject('/', function (res) { + + expect(res.result).to.equal('|3|1|'); + + server.connections[2].inject('/', function (res) { + + expect(res.result).to.equal('|3|2|'); + done(); + }); + }); + }); + }); + }); + }); + }); + + describe('handler()', function () { + + it('add new handler', function (done) { + + var test = function (server, options, next) { + + server.handler('bar', function (route, options) { + + return function (request, reply) { + + return reply('success'); + }; + }); + + return next(); + }; + + test.attributes = { + name: 'test' + }; + + var server = new Hapi.Server(); + server.connection(); + server.register(test, function (err) { + + expect(err).to.not.exist(); + server.route({ + method: 'GET', + path: '/', + handler: { + bar: {} + } + }); + + server.inject('/', function (res) { + + expect(res.payload).to.equal('success'); + done(); + }); + }); + }); + + it('errors on duplicate handler', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + expect(function () { + + server.handler('proxy', function () { }); + }).to.throw('Handler name already exists: proxy'); + done(); + }); + + it('errors on unknown handler', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + expect(function () { + + server.route({ method: 'GET', path: '/', handler: { test: {} } }); + }).to.throw('Unknown handler: test'); + done(); + }); + + it('errors on non-string name', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + expect(function () { + + server.handler(); + }).to.throw('Invalid handler name'); + done(); + }); + + it('errors on non-function handler', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + expect(function () { + + server.handler('foo', 'bar'); + }).to.throw('Handler must be a function: foo'); + done(); + }); + }); + + describe('log()', { parallel: false }, function () { + + it('emits a log event', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + var count = 0; + server.once('log', function (event) { + + ++count; + expect(event.data).to.equal('log event 1'); + }); + + server.once('log', function (event) { + + ++count; + expect(event.data).to.equal('log event 1'); + }); + + server.log('1', 'log event 1', Date.now()); + + server.once('log', function (event) { + + ++count; + expect(event.data).to.equal('log event 2'); + }); + + server.log(['2'], 'log event 2', new Date(Date.now())); + + expect(count).to.equal(3); + done(); + }); + + it('emits a log event and print to console', { parallel: false }, function (done) { + + var server = new Hapi.Server(); + server.connection(); + + server.once('log', function (event) { + + expect(event.data).to.equal('log event 1'); + }); + + var orig = console.error; + console.error = function () { + + console.error = orig; + expect(arguments[0]).to.equal('Debug:'); + expect(arguments[1]).to.equal('internal, implementation, error'); + + done(); + }; + + server.log(['internal', 'implementation', 'error'], 'log event 1'); + }); + + it('outputs log data to debug console', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + var orig = console.error; + console.error = function () { + + console.error = orig; + expect(arguments[0]).to.equal('Debug:'); + expect(arguments[1]).to.equal('implementation'); + expect(arguments[2]).to.equal('\n {"data":1}'); + done(); + }; + + server.log(['implementation'], { data: 1 }); + }); + + it('outputs log error data to debug console', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + var orig = console.error; + console.error = function () { + + console.error = orig; + expect(arguments[0]).to.equal('Debug:'); + expect(arguments[1]).to.equal('implementation'); + expect(arguments[2]).to.contain('\n Error: test\n at'); + done(); + }; + + server.log(['implementation'], new Error('test')); + }); + + it('outputs log data to debug console without data', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + var orig = console.error; + console.error = function () { + + console.error = orig; + expect(arguments[0]).to.equal('Debug:'); + expect(arguments[1]).to.equal('implementation'); + expect(arguments[2]).to.equal(''); + done(); + }; + + server.log(['implementation']); + }); + + it('does not output events when debug disabled', function (done) { + + var server = new Hapi.Server({ debug: false }); + server.connection(); + + var i = 0; + var orig = console.error; + console.error = function () { + + ++i; + }; + + server.log(['implementation']); + console.error('nothing'); + expect(i).to.equal(1); + console.error = orig; + done(); + }); + + it('does not output events when debug.log disabled', function (done) { + + var server = new Hapi.Server({ debug: { log: false } }); + server.connection(); + + var i = 0; + var orig = console.error; + console.error = function () { + + ++i; + }; + + server.log(['implementation']); + console.error('nothing'); + expect(i).to.equal(1); + console.error = orig; + done(); + }); + + it('does not output non-implementation events by default', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + var i = 0; + var orig = console.error; + console.error = function () { + + ++i; + }; + + server.log(['xyz']); + console.error('nothing'); + expect(i).to.equal(1); + console.error = orig; + done(); + }); + + it('emits server log events once', function (done) { + + var pc = 0; + var test = function (server, options, next) { + + server.on('log', function (event, tags) { + + ++pc; + }); + + next(); + }; + + test.attributes = { + name: 'test' + }; + + var server = new Hapi.Server(); + server.connection(); + + var sc = 0; + server.on('log', function (event, tags) { + + ++sc; + }); + + server.register(test, function (err) { + + expect(err).to.not.exist(); + server.log('test'); + expect(sc).to.equal(1); + expect(pc).to.equal(1); + done(); + }); + }); + }); + + describe('lookup()', function () { + + it('returns route based on id', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', config: { handler: function (request, reply) { return reply(); }, id: 'root', app: { test: 123 } } }); + var root = server.lookup('root'); + expect(root.path).to.equal('/'); + expect(root.settings.app.test).to.equal(123); + done(); + }); + + it('returns null on unknown route', function (done) { + + var server = new Hapi.Server(); + server.connection(); + var root = server.lookup('root'); + expect(root).to.be.null(); + done(); + }); + + it('throws on missing id', function (done) { + + var server = new Hapi.Server(); + server.connection(); + expect(function () { + + server.lookup(); + }).to.throw('Invalid route id: '); + done(); + }); + }); + + describe('match()', function () { + + it('returns route based on path', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', config: { handler: function (request, reply) { return reply(); }, id: 'root' } }); + server.route({ method: 'GET', path: '/abc', config: { handler: function (request, reply) { return reply(); }, id: 'abc' } }); + server.route({ method: 'POST', path: '/abc', config: { handler: function (request, reply) { return reply(); }, id: 'post' } }); + server.route({ method: 'GET', path: '/{p}/{x}', config: { handler: function (request, reply) { return reply(); }, id: 'params' } }); + server.route({ method: 'GET', path: '/abc', vhost: 'example.com', config: { handler: function (request, reply) { return reply(); }, id: 'vhost' } }); + + expect(server.match('GET', '/').settings.id).to.equal('root'); + expect(server.match('GET', '/none')).to.equal(null); + expect(server.match('GET', '/abc').settings.id).to.equal('abc'); + expect(server.match('get', '/').settings.id).to.equal('root'); + expect(server.match('post', '/abc').settings.id).to.equal('post'); + expect(server.match('get', '/a/b').settings.id).to.equal('params'); + expect(server.match('GET', '/abc', 'example.com').settings.id).to.equal('vhost'); + done(); + }); + + it('throws on missing method', function (done) { + + var server = new Hapi.Server(); + server.connection(); + expect(function () { + + server.match(); + }).to.throw('Invalid method: '); + done(); + }); + + it('throws on invalid method', function (done) { + + var server = new Hapi.Server(); + server.connection(); + expect(function () { + + server.match(5); + }).to.throw('Invalid method: 5'); + done(); + }); + + it('throws on missing path', function (done) { + + var server = new Hapi.Server(); + server.connection(); + expect(function () { + + server.match('get'); + }).to.throw('Invalid path: '); + done(); + }); + + it('throws on invalid path type', function (done) { + + var server = new Hapi.Server(); + server.connection(); + expect(function () { + + server.match('get', 5); + }).to.throw('Invalid path: 5'); + done(); + }); + + it('throws on invalid path prefix', function (done) { + + var server = new Hapi.Server(); + server.connection(); + expect(function () { + + server.match('get', '5'); + }).to.throw('Invalid path: 5'); + done(); + }); + + it('throws on invalid path', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/{p}', config: { handler: function (request, reply) { return reply(); } } }); + expect(function () { + + server.match('GET', '/%p'); + }).to.throw('Invalid path: /%p'); + done(); + }); + + it('throws on invalid host type', function (done) { + + var server = new Hapi.Server(); + server.connection(); + expect(function () { + + server.match('get', '/a', 5); + }).to.throw('Invalid host: 5'); + done(); + }); + }); + + describe('method()', function () { + + it('adds server method using arguments', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + var test = function (server, options, next) { + + server.method('log', function (methodNext) { return methodNext(null); }); + return next(); + }; + + test.attributes = { + name: 'test' + }; + + server.register(test, function (err) { + + expect(err).to.not.exist(); + done(); + }); + }); + + it('adds server method with plugin bind', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + var test = function (server, options, next) { + + server.bind({ x: 1 }); + server.method('log', function (methodNext) { return methodNext(null, this.x); }); + return next(); + }; + + test.attributes = { + name: 'test' + }; + + server.register(test, function (err) { + + expect(err).to.not.exist(); + server.methods.log(function (err, result) { + + expect(result).to.equal(1); + done(); + }); + }); + }); + + it('adds server method with method bind', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + var test = function (server, options, next) { + + server.method('log', function (methodNext) { return methodNext(null, this.x); }, { bind: { x: 2 } }); + return next(); + }; + + test.attributes = { + name: 'test' + }; + + server.register(test, function (err) { + + expect(err).to.not.exist(); + server.methods.log(function (err, result) { + + expect(result).to.equal(2); + done(); + }); + }); + }); + + it('adds server method with method and ext bind', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + var test = function (server, options, next) { + + server.bind({ x: 1 }); + server.method('log', function (methodNext) { return methodNext(null, this.x); }, { bind: { x: 2 } }); + return next(); + }; + + test.attributes = { + name: 'test' + }; + + server.register(test, function (err) { + + expect(err).to.not.exist(); + server.methods.log(function (err, result) { + + expect(result).to.equal(2); + done(); + }); + }); + }); + }); + + describe('path()', function () { + + it('sets local path for directory route handler', function (done) { + + var test = function (server, options, next) { + + server.path(Path.join(__dirname, '..')); + + server.route({ + method: 'GET', + path: '/handler/{file*}', + handler: { + directory: { + path: './' + } + } + }); + + return next(); + }; + + test.attributes = { + name: 'test' + }; + + var server = new Hapi.Server(); + server.connection({ routes: { files: { relativeTo: __dirname } } }); + server.register(test, function (err) { + + expect(err).to.not.exist(); + server.inject('/handler/package.json', function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + }); + + it('throws when plugin sets undefined path', function (done) { + + var test = function (server, options, next) { + + server.path(); + return next(); + }; + + test.attributes = { + name: 'test' + }; + + var server = new Hapi.Server(); + server.connection(); + expect(function () { + + server.register(test, function (err) { }); + }).to.throw('relativeTo must be a non-empty string'); + done(); + }); + }); + + describe('render()', function () { + + it('renders view', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.views({ + engines: { html: Handlebars }, + path: __dirname + '/templates' + }); + + server.render('test', { title: 'test', message: 'Hapi' }, function (err, rendered, config) { + + expect(rendered).to.exist(); + expect(rendered).to.contain('Hapi'); + done(); + }); + }); + }); + + describe('views()', function () { + + it('requires plugin with views', function (done) { + + var test = function (server, options, next) { + + server.path(__dirname); + + var views = { + engines: { 'html': Handlebars }, + path: './templates/plugin' + }; + + server.views(views); + if (Object.keys(views).length !== 2) { + return next(new Error('plugin.view() modified options')); + } + + server.route([ + { + path: '/view', method: 'GET', handler: function (request, reply) { + + return reply.view('test', { message: options.message }); + } + }, + { + path: '/file', method: 'GET', handler: { file: './templates/plugin/test.html' } + } + ]); + + server.ext('onRequest', function (request, reply) { + + if (request.path === '/ext') { + return reply.view('test', { message: 'grabbed' }); + } + + return reply.continue(); + }); + + return next(); + }; + + test.attributes = { + name: 'test' + }; + + var server = new Hapi.Server(); + server.connection(); + server.register({ register: test, options: { message: 'viewing it' } }, function (err) { + + expect(err).to.not.exist(); + server.inject('/view', function (res) { + + expect(res.result).to.equal('

viewing it

'); + + server.inject('/file', function (res) { + + expect(res.result).to.equal('

{{message}}

'); + + server.inject('/ext', function (res) { + + expect(res.result).to.equal('

grabbed

'); + done(); + }); + }); + }); + }); + }); + }); +}); + + +internals.routesList = function (server, label) { + + var tables = server.select(label || []).table(); + + var list = []; + for (var c = 0, cl = tables.length; c < cl; ++c) { + var routes = tables[c].table; + for (var i = 0, il = routes.length; i < il; ++i) { + var route = routes[i]; + if (route.method === 'get') { + list.push(route.path); + } + } + } + + return list; +}; + + +internals.plugins = { + auth: function (server, options, next) { + + server.auth.scheme('basic', function (server, options) { + + var settings = Hoek.clone(options); + + var scheme = { + authenticate: function (request, reply) { + + var req = request.raw.req; + var authorization = req.headers.authorization; + if (!authorization) { + return reply(Boom.unauthorized(null, 'Basic')); + } + + var parts = authorization.split(/\s+/); + + if (parts[0] && + parts[0].toLowerCase() !== 'basic') { + + return reply(Boom.unauthorized(null, 'Basic')); + } + + if (parts.length !== 2) { + return reply(Boom.badRequest('Bad HTTP authentication header format', 'Basic')); + } + + var credentialsParts = new Buffer(parts[1], 'base64').toString().split(':'); + if (credentialsParts.length !== 2) { + return reply(Boom.badRequest('Bad header internal syntax', 'Basic')); + } + + var username = credentialsParts[0]; + var password = credentialsParts[1]; + + settings.validateFunc(username, password, function (err, isValid, credentials) { + + if (!isValid) { + return reply(Boom.unauthorized('Bad username or password', 'Basic'), { credentials: credentials }); + } + + return reply.continue({ credentials: credentials }); + }); + } + }; + + return scheme; + }); + + var loadUser = function (username, password, callback) { + + if (username === 'john') { + return callback(null, password === '12345', { user: 'john' }); + } + + return callback(null, false); + }; + + server.auth.strategy('basic', 'basic', 'required', { validateFunc: loadUser }); + + server.auth.scheme('special', function () { return { authenticate: function () { } }; }); + server.auth.strategy('special', 'special', {}); + + return next(); + }, + child: function (server, options, next) { + + if (options.routes) { + return server.register(internals.plugins.test1, options, next); + } + + return server.register(internals.plugins.test1, next); + }, + deps1: function (server, options, next) { + + server.dependency('deps2', function (server, next) { + + server.expose('breaking', server.plugins.deps2.breaking); + return next(); + }); + + server.select('a').ext('onRequest', function (request, reply) { + + request.app.deps = request.app.deps || '|'; + request.app.deps += '1|'; + return reply.continue(); + }, { after: 'deps3' }); + + return next(); + }, + deps2: function (server, options, next) { + + server.select('b').ext('onRequest', function (request, reply) { + + request.app.deps = request.app.deps || '|'; + request.app.deps += '2|'; + return reply.continue(); + }, { after: 'deps3', before: 'deps1' }); + + server.expose('breaking', 'bad'); + + return next(); + }, + deps3: function (server, options, next) { + + server.select('c').ext('onRequest', function (request, reply) { + + request.app.deps = request.app.deps || '|'; + request.app.deps += '3|'; + return reply.continue(); + }); + + return next(); + }, + test1: function (server, options, next) { + + var handler = function (request, reply) { + + return reply('testing123' + ((server.settings.app && server.settings.app.my) || '')); + }; + + server.select('test').route({ path: '/test1', method: 'GET', handler: handler }); + + server.expose({ + add: function (a, b) { + + return a + b; + } + }); + + server.expose('glue', function (a, b) { + + return a + b; + }); + + server.expose('prefix', server.realm.modifiers.route.prefix); + + return next(); + }, + test2: function (server, options, next) { + + server.route({ path: '/test2', method: 'GET', handler: function (request, reply) { return reply('testing123'); } }); + server.log('test', 'abc'); + return next(); + } +}; + + +internals.plugins.auth.attributes = { + name: 'auth' +}; + + +internals.plugins.child.attributes = { + name: 'child' +}; + + +internals.plugins.deps1.attributes = { + name: 'deps1' +}; + + +internals.plugins.deps2.attributes = { + name: 'deps2' +}; + + +internals.plugins.deps3.attributes = { + name: 'deps3' +}; + + +internals.plugins.test1.attributes = { + name: 'test1', + version: '1.0.0' +}; + + +internals.plugins.test2.attributes = { + pkg: { + name: 'test2', + version: '1.0.0' + } +}; diff --git a/node_modules/hapi/test/protect.js b/node_modules/hapi/test/protect.js new file mode 100755 index 0000000..567e5e8 --- /dev/null +++ b/node_modules/hapi/test/protect.js @@ -0,0 +1,156 @@ +// Load modules + +var Events = require('events'); +var Code = require('code'); +var Hapi = require('..'); +var Hoek = require('hoek'); +var Lab = require('lab'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('Protect', function () { + + it('catches error when handler throws after reply() is called', function (done) { + + var server = new Hapi.Server({ debug: false }); + server.connection(); + + var handler = function (request, reply) { + + reply('ok'); + process.nextTick(function () { + + throw new Error('should not leave domain'); + }); + }; + + server.route({ method: 'GET', path: '/', handler: handler }); + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('catches error when handler throws twice after reply() is called', function (done) { + + var server = new Hapi.Server({ debug: false }); + server.connection(); + + var handler = function (request, reply) { + + reply('ok'); + + process.nextTick(function () { + + throw new Error('should not leave domain 1'); + }); + + process.nextTick(function () { + + throw new Error('should not leave domain 2'); + }); + }; + + server.route({ method: 'GET', path: '/', handler: handler }); + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('catches errors thrown during request handling in non-request domain', function (done) { + + var Client = function () { + + Events.EventEmitter.call(this); + }; + + Hoek.inherits(Client, Events.EventEmitter); + + var test = function (plugin, options, next) { + + plugin.after(function (plugin, afterNext) { + + var client = new Client(); // Created in the global domain + plugin.bind({ client: client }); + afterNext(); + }); + + plugin.route({ + method: 'GET', + path: '/', + handler: function (request, reply) { + + this.client.on('event', request.domain.bind(function () { + + throw new Error('boom'); // Caught by the global domain by default, not request domain + })); + + this.client.emit('event'); + } + }); + + return next(); + }; + + test.attributes = { + name: 'test' + }; + + var server = new Hapi.Server({ debug: false }); + server.connection(); + server.register(test, function (err) { + + expect(err).to.not.exist(); + + server.start(function () { + + server.inject('/', function (res) { + + done(); + }); + }); + }); + }); + + it('logs to console after request completed', function (done) { + + var handler = function (request, reply) { + + reply('ok'); + setTimeout(function () { + + throw new Error('After done'); + }, 10); + }; + + var server = new Hapi.Server({ debug: false }); + server.connection(); + + server.on('log', function (event, tags) { + + expect(tags.implementation).to.exist(); + done(); + }); + + server.route({ method: 'GET', path: '/', handler: handler }); + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + }); + }); +}); diff --git a/node_modules/hapi/test/reply.js b/node_modules/hapi/test/reply.js new file mode 100755 index 0000000..2c28054 --- /dev/null +++ b/node_modules/hapi/test/reply.js @@ -0,0 +1,590 @@ +// Load modules + +var Http = require('http'); +var Stream = require('stream'); +var Bluebird = require('bluebird'); +var Boom = require('boom'); +var Code = require('code'); +var Hapi = require('..'); +var Hoek = require('hoek'); +var Lab = require('lab'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('Reply', function () { + + it('throws when reply called twice', function (done) { + + var server = new Hapi.Server({ debug: false }); + server.connection(); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { reply('ok'); return reply('not ok'); } }); + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(500); + done(); + }); + }); + + it('redirects from handler', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply.redirect('/elsewhere'); } }); + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(302); + expect(res.headers.location).to.equal('/elsewhere'); + done(); + }); + }); + + describe('_interface()', function () { + + it('uses reply(null, result) for result', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(null, 'steve'); } }); + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result).to.equal('steve'); + done(); + }); + }); + + it('uses reply(null, err) for err', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(null, Boom.badRequest()); } }); + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(400); + done(); + }); + }); + + it('ignores result when err provided in reply(err, result)', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(Boom.badRequest(), 'steve'); } }); + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(400); + done(); + }); + }); + }); + + describe('response()', function () { + + it('returns null', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(null, null); } }); + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result).to.equal(null); + expect(res.payload).to.equal(''); + expect(res.headers['content-type']).to.not.exist(); + done(); + }); + }); + + it('returns a buffer reply', function (done) { + + var handler = function (request, reply) { + + return reply(new Buffer('Tada1')).code(299); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', config: { handler: handler } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(299); + expect(res.result).to.equal('Tada1'); + expect(res.headers['content-type']).to.equal('application/octet-stream'); + done(); + }); + }); + + it('returns an object response', function (done) { + + var handler = function (request, reply) { + + return reply({ a: 1, b: 2 }); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + expect(res.payload).to.equal('{\"a\":1,\"b\":2}'); + expect(res.headers['content-length']).to.equal(13); + done(); + }); + }); + + it('returns false', function (done) { + + var handler = function (request, reply) { + + return reply(false); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + expect(res.payload).to.equal('false'); + done(); + }); + }); + + it('returns an error reply', function (done) { + + var handler = function (request, reply) { + + return reply(new Error('boom')); + }; + + var server = new Hapi.Server({ debug: false }); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(500); + expect(res.result).to.exist(); + done(); + }); + }); + + it('returns an empty reply', function (done) { + + var handler = function (request, reply) { + + return reply().code(299); + }; + + var server = new Hapi.Server(); + server.connection({ routes: { cors: { credentials: true } } }); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(299); + expect(res.result).to.equal(null); + expect(res.headers['access-control-allow-credentials']).to.equal('true'); + done(); + }); + }); + + it('returns a stream reply', function (done) { + + var TestStream = function () { + + Stream.Readable.call(this); + }; + + Hoek.inherits(TestStream, Stream.Readable); + + TestStream.prototype._read = function (size) { + + if (this.isDone) { + return; + } + this.isDone = true; + + this.push('x'); + this.push('y'); + this.push(null); + }; + + var handler = function (request, reply) { + + return reply(new TestStream()).ttl(2000); + }; + + var server = new Hapi.Server(); + server.connection({ routes: { cors: { origin: ['test.example.com'] } } }); + server.route({ method: 'GET', path: '/stream', config: { handler: handler, cache: { expiresIn: 9999 } } }); + + server.inject('/stream', function (res) { + + expect(res.result).to.equal('xy'); + expect(res.statusCode).to.equal(200); + expect(res.headers['cache-control']).to.equal('max-age=2, must-revalidate'); + expect(res.headers['access-control-allow-origin']).to.equal('test.example.com'); + + server.inject({ method: 'HEAD', url: '/stream' }, function (res) { + + expect(res.result).to.equal(''); + expect(res.statusCode).to.equal(200); + expect(res.headers['cache-control']).to.equal('max-age=2, must-revalidate'); + expect(res.headers['access-control-allow-origin']).to.equal('test.example.com'); + done(); + }); + }); + }); + + it('errors on non-readable stream reply', function (done) { + + var streamHandler = function (request, reply) { + + var stream = new Stream(); + stream.writable = true; + + reply(stream); + }; + + var writableHandler = function (request, reply) { + + var writable = new Stream.Writable(); + writable._write = function () {}; + + reply(writable); + }; + + var server = new Hapi.Server({ debug: false }); + server.connection(); + server.route({ method: 'GET', path: '/stream', handler: streamHandler }); + server.route({ method: 'GET', path: '/writable', handler: writableHandler }); + + var requestError; + server.on('request-error', function (request, err) { + + requestError = err; + }); + + server.start(function () { + + server.inject('/stream', function (res) { + + expect(res.statusCode).to.equal(500); + expect(requestError).to.exist(); + expect(requestError.message).to.equal('Stream must have a streams2 readable interface'); + + requestError = undefined; + server.inject('/writable', function (res) { + + expect(res.statusCode).to.equal(500); + expect(requestError).to.exist(); + expect(requestError.message).to.equal('Stream must have a streams2 readable interface'); + done(); + }); + }); + }); + }); + + it('errors on an http client stream reply', function (done) { + + var handler = function (request, reply) { + + reply('just a string'); + }; + + var streamHandler = function (request, reply) { + + reply(Http.get(request.server.info + '/')); + }; + + var server = new Hapi.Server({ debug: false }); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + server.route({ method: 'GET', path: '/stream', handler: streamHandler }); + + server.start(function () { + + server.inject('/stream', function (res) { + + expect(res.statusCode).to.equal(500); + done(); + }); + }); + }); + + it('errors on objectMode stream reply', function (done) { + + var TestStream = function () { + + Stream.Readable.call(this, { objectMode: true }); + }; + + Hoek.inherits(TestStream, Stream.Readable); + + TestStream.prototype._read = function (size) { + + if (this.isDone) { + return; + } + this.isDone = true; + + this.push({ x: 1 }); + this.push({ y: 1 }); + this.push(null); + }; + + var handler = function (request, reply) { + + return reply(new TestStream()); + }; + + var server = new Hapi.Server({ debug: false }); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(500); + done(); + }); + }); + + describe('promises', function () { + + it('returns a stream', function (done) { + + var TestStream = function () { + + Stream.Readable.call(this); + + this.statusCode = 200; + }; + + Hoek.inherits(TestStream, Stream.Readable); + + TestStream.prototype._read = function (size) { + + if (this.isDone) { + return; + } + this.isDone = true; + + this.push('x'); + this.push('y'); + this.push(null); + }; + + var handler = function (request, reply) { + + return reply(Bluebird.resolve(new TestStream())).ttl(2000).code(299); + }; + + var server = new Hapi.Server({ debug: false }); + server.connection({ routes: { cors: { origin: ['test.example.com'] } } }); + server.route({ method: 'GET', path: '/stream', config: { handler: handler, cache: { expiresIn: 9999 } } }); + + server.inject('/stream', function (res) { + + expect(res.result).to.equal('xy'); + expect(res.statusCode).to.equal(299); + expect(res.headers['cache-control']).to.equal('max-age=2, must-revalidate'); + expect(res.headers['access-control-allow-origin']).to.equal('test.example.com'); + done(); + }); + }); + + it('returns a buffer', function (done) { + + var handler = function (request, reply) { + + return reply(Bluebird.resolve(new Buffer('buffer content'))).code(299).type('something/special'); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(299); + expect(res.result.toString()).to.equal('buffer content'); + expect(res.headers['content-type']).to.equal('something/special'); + done(); + }); + }); + }); + }); + + describe('hold()', function () { + + it('undo scheduled next tick in reply interface', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + var handler = function (request, reply) { + + return reply('123').hold().send(); + }; + + server.route({ method: 'GET', path: '/domain', handler: handler }); + + server.inject('/domain', function (res) { + + expect(res.result).to.equal('123'); + done(); + }); + }); + + it('sends reply after timed handler', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + var handler = function (request, reply) { + + var response = reply('123').hold(); + setTimeout(function () { + response.send(); + }, 10); + }; + + server.route({ method: 'GET', path: '/domain', handler: handler }); + + server.inject('/domain', function (res) { + + expect(res.result).to.equal('123'); + done(); + }); + }); + }); + + describe('close()', function () { + + it('returns a reply with manual end', function (done) { + + var handler = function (request, reply) { + + request.raw.res.end(); + return reply.close({ end: false }); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', config: { handler: handler } }); + + server.inject('/', function (res) { + + expect(res.result).to.equal(''); + done(); + }); + }); + + it('returns a reply with auto end', function (done) { + + var handler = function (request, reply) { + + return reply.close(); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', config: { handler: handler } }); + + server.inject('/', function (res) { + + expect(res.result).to.equal(''); + done(); + }); + }); + }); + + describe('continue()', function () { + + it('sets empty reply on continue in handler', function (done) { + + var handler = function (request, reply) { + + return reply.continue(); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', config: { handler: handler } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result).to.equal(null); + expect(res.payload).to.equal(''); + done(); + }); + }); + + it('sets empty reply on continue in prerequisite', function (done) { + + var pre1 = function (request, reply) { + + return reply.continue(); + }; + + var pre2 = function (request, reply) { + + return reply.continue(); + }; + + var pre3 = function (request, reply) { + + return reply({ + m1: request.pre.m1, + m2: request.pre.m2 + }); + }; + + var handler = function (request, reply) { + return reply(request.pre.m3); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ + method: 'GET', + path: '/', + config: { + pre: [ + { method: pre1, assign: 'm1' }, + { method: pre2, assign: 'm2' }, + { method: pre3, assign: 'm3' } + ], + handler: handler + } + }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result).to.deep.equal({ + m1: null, + m2: null + }); + expect(res.payload).to.equal('{"m1":null,"m2":null}'); + done(); + }); + }); + }); +}); diff --git a/node_modules/hapi/test/request.js b/node_modules/hapi/test/request.js new file mode 100755 index 0000000..27b0776 --- /dev/null +++ b/node_modules/hapi/test/request.js @@ -0,0 +1,1368 @@ +// Load modules + +var Http = require('http'); +var Net = require('net'); +var Stream = require('stream'); +var Boom = require('boom'); +var Code = require('code'); +var Hapi = require('..'); +var Hoek = require('hoek'); +var Lab = require('lab'); +var Wreck = require('wreck'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('Request', function () { + + it('sets client address', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + var handler = function (request, reply) { + + var expectedClientAddress = '127.0.0.1'; + if (Net.isIPv6(server.listener.address().address)) { + expectedClientAddress = '::ffff:127.0.0.1'; + } + + expect(request.info.remoteAddress).to.equal(expectedClientAddress); + expect(request.info.remoteAddress).to.equal(request.info.remoteAddress); + return reply('ok'); + }; + + server.route({ method: 'GET', path: '/', handler: handler }); + + server.start(function () { + + Wreck.get('http://localhost:' + server.info.port, function (err, res, body) { + + expect(body).to.equal('ok'); + done(); + }); + }); + }); + + it('sets referrer', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + var handler = function (request, reply) { + + expect(request.info.referrer).to.equal('http://site.com'); + return reply('ok'); + }; + + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject({ url: '/', headers: { referrer: 'http://site.com' } }, function (res) { + + expect(res.result).to.equal('ok'); + done(); + }); + }); + + it('sets referer', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + var handler = function (request, reply) { + + expect(request.info.referrer).to.equal('http://site.com'); + return reply('ok'); + }; + + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject({ url: '/', headers: { referer: 'http://site.com' } }, function (res) { + + expect(res.result).to.equal('ok'); + done(); + }); + }); + + it('sets headers', function (done) { + + var handler = function (request, reply) { + + return reply(request.headers['user-agent']); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + expect(res.payload).to.equal('shot'); + done(); + }); + }); + + it('generates unique request id', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.connections[0]._requestCounter = { value: 10, min: 10, max: 11 }; + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(request.id); } }); + server.inject('/', function (res1) { + + server.inject('/', function (res2) { + + server.inject('/', function (res3) { + + expect(res1.result).to.match(/10$/); + expect(res2.result).to.match(/11$/); + expect(res3.result).to.match(/10$/); + done(); + }); + }); + }); + }); + + describe('_execute()', function () { + + it('returns 400 on invalid path', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.inject('invalid', function (res) { + + expect(res.statusCode).to.equal(400); + done(); + }); + }); + + it('returns error response on ext error', function (done) { + + var handler = function (request, reply) { + + return reply('OK'); + }; + + var server = new Hapi.Server(); + server.connection(); + + var ext = function (request, reply) { + + return reply(Boom.badRequest()); + }; + + server.ext('onPostHandler', ext); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + expect(res.result.statusCode).to.equal(400); + done(); + }); + }); + + it('handles aborted requests', { parallel: false }, function (done) { + + var handler = function (request, reply) { + + var TestStream = function () { + + Stream.Readable.call(this); + }; + + Hoek.inherits(TestStream, Stream.Readable); + + TestStream.prototype._read = function (size) { + + if (this.isDone) { + return; + } + this.isDone = true; + + this.push('success'); + this.emit('data', 'success'); + }; + + var stream = new TestStream(); + return reply(stream); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.start(function () { + + var total = 2; + var createConnection = function () { + + var client = Net.connect(server.info.port, function () { + + client.write('GET / HTTP/1.1\r\n\r\n'); + client.write('GET / HTTP/1.1\r\n\r\n'); + }); + + client.on('data', function () { + + total--; + client.destroy(); + }); + }; + + var check = function () { + + if (total) { + createConnection(); + setTimeout(check, 10); + } + else { + done(); + } + }; + + check(); + }); + }); + + it('returns empty params array when none present', function (done) { + + var handler = function (request, reply) { + + return reply(request.params); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + expect(res.result).to.deep.equal({}); + done(); + }); + }); + + it('does not fail on abort', function (done) { + + var clientRequest; + + var handler = function (request, reply) { + + clientRequest.abort(); + + setTimeout(function () { + + reply(new Error('fail')); + setTimeout(done, 10); + }, 10); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.start(function () { + + clientRequest = Http.request({ + hostname: 'localhost', + port: server.info.port, + method: 'GET' + }); + + clientRequest.on('error', function () { /* NOP */ }); + clientRequest.end(); + }); + }); + + it('does not fail on abort with ext', function (done) { + + var clientRequest; + + var handler = function (request, reply) { + + clientRequest.abort(); + setTimeout(function () { + + return reply(new Error('boom')); + }, 10); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.ext('onPreResponse', function (request, reply) { + + return reply.continue(); + }); + + server.on('tail', function () { + + done(); + }); + + server.start(function () { + + clientRequest = Http.request({ + hostname: 'localhost', + port: server.info.port, + method: 'GET' + }); + + clientRequest.on('error', function () { /* NOP */ }); + clientRequest.end(); + }); + }); + }); + + describe('_finalize()', function (done) { + + it('generate response event', function (done) { + + var handler = function (request, reply) { + + return reply('ok'); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', config: { handler: handler } }); + + server.once('response', function (request) { + + expect(request.info.responded).to.be.min(request.info.received); + done(); + }); + + server.inject('/', function (res) { }); + }); + + it('closes response after server timeout', function (done) { + + var handler = function (request, reply) { + + setTimeout(function () { + + var stream = new Stream.Readable(); + stream._read = function (size) { + + this.push('value'); + this.push(null); + }; + + stream.close = function () { + + done(); + }; + + return reply(stream); + }, 10); + }; + + var server = new Hapi.Server(); + server.connection({ routes: { timeout: { server: 5 } } }); + server.route({ + method: 'GET', + path: '/', + handler: handler + }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(503); + }); + }); + + it('does not attempt to close error response after server timeout', function (done) { + + var handler = function (request, reply) { + + setTimeout(function () { + + return reply(new Error('after')); + }, 10); + }; + + var server = new Hapi.Server(); + server.connection({ routes: { timeout: { server: 5 } } }); + server.route({ + method: 'GET', + path: '/', + handler: handler + }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(503); + done(); + }); + }); + + it('emits request-error once', function (done) { + + var server = new Hapi.Server({ debug: false }); + server.connection(); + + var errs = 0; + var req = null; + server.on('request-error', function (request, err) { + + errs++; + expect(err).to.exist(); + expect(err.message).to.equal('boom2'); + req = request; + }); + + server.ext('onPreResponse', function (request, reply) { + + return reply(new Error('boom2')); + }); + + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(new Error('boom1')); } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(500); + expect(res.result).to.exist(); + expect(res.result.message).to.equal('An internal server error occurred'); + }); + + server.once('response', function () { + + expect(errs).to.equal(1); + expect(req.getLog('error')[1].tags).to.deep.equal(['internal', 'error']); + done(); + }); + }); + + it('emits request-error on implementation error', function (done) { + + var server = new Hapi.Server({ debug: false }); + server.connection(); + + var errs = 0; + var req = null; + server.on('request-error', function (request, err) { + + errs++; + expect(err).to.exist(); + expect(err.message).to.equal('Uncaught error: boom'); + req = request; + }); + + server.route({ method: 'GET', path: '/', handler: function (request, reply) { throw new Error('boom'); } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(500); + expect(res.result).to.exist(); + expect(res.result.message).to.equal('An internal server error occurred'); + }); + + server.once('response', function () { + + expect(errs).to.equal(1); + expect(req.getLog('error')[0].tags).to.deep.equal(['internal', 'implementation', 'error']); + done(); + }); + }); + + it('does not emit request-error when error is replaced with valid response', function (done) { + + var server = new Hapi.Server({ debug: false }); + server.connection(); + + var errs = 0; + server.on('request-error', function (request, err) { + + errs++; + }); + + server.ext('onPreResponse', function (request, reply) { + + return reply('ok'); + }); + + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(new Error('boom1')); } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result).to.equal('ok'); + }); + + server.once('response', function () { + + expect(errs).to.equal(0); + done(); + }); + }); + }); + + describe('tail()', function () { + + it('generates tail event', function (done) { + + var handler = function (request, reply) { + + var t1 = request.addTail('t1'); + var t2 = request.addTail('t2'); + + reply('Done'); + + t1(); + t1(); // Ignored + setTimeout(t2, 10); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + var result = null; + + server.once('tail', function () { + + expect(result).to.equal('Done'); + done(); + }); + + server.inject('/', function (res) { + + result = res.result; + }); + }); + + it('generates tail event without name', function (done) { + + var handler = function (request, reply) { + + var tail = request.tail(); + reply('Done'); + tail(); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + var result = null; + + server.once('tail', function () { + + done(); + }); + + server.inject('/', function (res) { + + }); + }); + }); + + describe('setMethod()', function () { + + it('changes method with a lowercase version of the value passed in', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { } }); + + server.ext('onRequest', function (request, reply) { + + request.setMethod('POST'); + return reply(request.method); + }); + + server.inject('/', function (res) { + + expect(res.payload).to.equal('post'); + done(); + }); + }); + + it('errors on missing method', function (done) { + + var server = new Hapi.Server({ debug: false }); + server.connection(); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { } }); + + server.ext('onRequest', function (request, reply) { + + request.setMethod(); + }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(500); + done(); + }); + }); + + it('errors on invalid method type', function (done) { + + var server = new Hapi.Server({ debug: false }); + server.connection(); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { } }); + + server.ext('onRequest', function (request, reply) { + + request.setMethod(42); + }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(500); + done(); + }); + }); + }); + + describe('setUrl()', function () { + + it('parses nested query string', function (done) { + + var handler = function (request, reply) { + + return reply(request.query); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/?a[b]=5&d[ff]=ok', function (res) { + + expect(res.result).to.deep.equal({ a: { b: '5' }, d: { ff: 'ok' } }); + done(); + }); + }); + + it('sets url, path, and query', function (done) { + + var url = 'http://localhost/page?param1=something'; + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { } }); + + server.ext('onRequest', function (request, reply) { + + request.setUrl(url); + return reply([request.url.href, request.path, request.query.param1].join('|')); + }); + + server.inject('/', function (res) { + + expect(res.payload).to.equal(url + '|/page|something'); + done(); + }); + }); + + it('normalizes a path', function (done) { + + var rawPath = '/%0%1%2%3%4%5%6%7%8%9%a%b%c%d%e%f%10%11%12%13%14%15%16%17%18%19%1a%1b%1c%1d%1e%1f%20%21%22%23%24%25%26%27%28%29%2a%2b%2c%2d%2e%2f%30%31%32%33%34%35%36%37%38%39%3a%3b%3c%3d%3e%3f%40%41%42%43%44%45%46%47%48%49%4a%4b%4c%4d%4e%4f%50%51%52%53%54%55%56%57%58%59%5a%5b%5c%5d%5e%5f%60%61%62%63%64%65%66%67%68%69%6a%6b%6c%6d%6e%6f%70%71%72%73%74%75%76%77%78%79%7a%7b%7c%7d%7e%7f%80%81%82%83%84%85%86%87%88%89%8a%8b%8c%8d%8e%8f%90%91%92%93%94%95%96%97%98%99%9a%9b%9c%9d%9e%9f%a0%a1%a2%a3%a4%a5%a6%a7%a8%a9%aa%ab%ac%ad%ae%af%b0%b1%b2%b3%b4%b5%b6%b7%b8%b9%ba%bb%bc%bd%be%bf%c0%c1%c2%c3%c4%c5%c6%c7%c8%c9%ca%cb%cc%cd%ce%cf%d0%d1%d2%d3%d4%d5%d6%d7%d8%d9%da%db%dc%dd%de%df%e0%e1%e2%e3%e4%e5%e6%e7%e8%e9%ea%eb%ec%ed%ee%ef%f0%f1%f2%f3%f4%f5%f6%f7%f8%f9%fa%fb%fc%fd%fe%ff%0%1%2%3%4%5%6%7%8%9%A%B%C%D%E%F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20%21%22%23%24%25%26%27%28%29%2A%2B%2C%2D%2E%2F%30%31%32%33%34%35%36%37%38%39%3A%3B%3C%3D%3E%3F%40%41%42%43%44%45%46%47%48%49%4A%4B%4C%4D%4E%4F%50%51%52%53%54%55%56%57%58%59%5A%5B%5C%5D%5E%5F%60%61%62%63%64%65%66%67%68%69%6A%6B%6C%6D%6E%6F%70%71%72%73%74%75%76%77%78%79%7A%7B%7C%7D%7E%7F%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF'; + var normPath = '/%0%1%2%3%4%5%6%7%8%9%a%b%c%d%e%f%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20!%22%23$%25&\'()*+,-.%2F0123456789:;%3C=%3E%3F@ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~%7F%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF%0%1%2%3%4%5%6%7%8%9%A%B%C%D%E%F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20!%22%23$%25&\'()*+,-.%2F0123456789:;%3C=%3E%3F@ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~%7F%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF'; + + var url = 'http://localhost' + rawPath + '?param1=something'; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { } }); + + server.ext('onRequest', function (request, reply) { + + request.setUrl(url); + return reply([request.url.href, request.path, request.query.param1].join('|')); + }); + + server.inject('/', function (res) { + + expect(res.payload).to.equal(url + '|' + normPath + '|something'); + done(); + }); + }); + + it('allows missing path', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.ext('onRequest', function (request, reply) { + + request.setUrl(''); + return reply.continue(); + }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(400); + done(); + }); + }); + + it('strips trailing slash', function (done) { + + var server = new Hapi.Server(); + server.connection({ router: { stripTrailingSlash: true } }); + server.route({ method: 'GET', path: '/test', handler: function (request, reply) { return reply(); } }); + server.inject('/test/', function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('does not strip trailing slash on /', function (done) { + + var server = new Hapi.Server(); + server.connection({ router: { stripTrailingSlash: true } }); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(); } }); + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('strips trailing slash with query', function (done) { + + var server = new Hapi.Server(); + server.connection({ router: { stripTrailingSlash: true } }); + server.route({ method: 'GET', path: '/test', handler: function (request, reply) { return reply(); } }); + server.inject('/test/?a=b', function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + }); + + describe('log()', { parallel: false }, function () { + + it('outputs log data to debug console', function (done) { + + var handler = function (request, reply) { + + request.log(['implementation'], 'data'); + return reply(); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + var orig = console.error; + console.error = function () { + + expect(arguments[0]).to.equal('Debug:'); + expect(arguments[1]).to.equal('implementation'); + expect(arguments[2]).to.equal('\n data'); + console.error = orig; + done(); + }; + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + }); + }); + + it('emits a request event', function (done) { + + var handler = function (request, reply) { + + server.on('request', function (request, event, tags) { + + expect(event).to.contain(['request', 'timestamp', 'tags', 'data', 'internal']); + expect(event.data).to.equal('data'); + expect(event.internal).to.be.false(); + expect(tags).to.deep.equal({ test: true }); + return reply(); + }); + + request.log(['test'], 'data'); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('outputs log to debug console without data', function (done) { + + var handler = function (request, reply) { + + request.log(['implementation']); + return reply(); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + var orig = console.error; + console.error = function () { + + expect(arguments[0]).to.equal('Debug:'); + expect(arguments[1]).to.equal('implementation'); + expect(arguments[2]).to.equal(''); + console.error = orig; + done(); + }; + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + }); + }); + + it('outputs log to debug console with error data', function (done) { + + var handler = function (request, reply) { + + request.log(['implementation'], new Error('boom')); + return reply(); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + var orig = console.error; + console.error = function () { + + expect(arguments[0]).to.equal('Debug:'); + expect(arguments[1]).to.equal('implementation'); + expect(arguments[2]).to.contain('Error: boom'); + console.error = orig; + done(); + }; + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + }); + }); + + it('handles invalid log data object stringify', function (done) { + + var handler = function (request, reply) { + + var obj = {}; + obj.a = obj; + + request.log(['implementation'], obj); + return reply(); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + var orig = console.error; + console.error = function () { + + console.error = orig; + expect(arguments[0]).to.equal('Debug:'); + expect(arguments[1]).to.equal('implementation'); + expect(arguments[2]).to.equal('\n [Cannot display object: Converting circular structure to JSON]'); + done(); + }; + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + }); + }); + + it('adds a log event to the request', function (done) { + + var handler = function (request, reply) { + + request.log('1', 'log event 1', Date.now()); + request.log(['2'], 'log event 2', new Date(Date.now())); + request.log(['3', '4']); + request.log(['1', '4']); + request.log(['2', '3']); + request.log(['4']); + request.log('4'); + + return reply([request.getLog('1').length, request.getLog('4').length, request.getLog(['4']).length, request.getLog('0').length, request.getLog(['1', '2', '3', '4']).length, request.getLog().length >= 7].join('|')); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + expect(res.payload).to.equal('2|4|4|0|7|true'); + done(); + }); + }); + + it('does not output events when debug disabled', function (done) { + + var server = new Hapi.Server({ debug: false }); + server.connection(); + + var i = 0; + var orig = console.error; + console.error = function () { + + ++i; + }; + + var handler = function (request, reply) { + + request.log(['implementation']); + return reply(); + }; + + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + console.error('nothing'); + expect(i).to.equal(1); + console.error = orig; + done(); + }); + }); + + it('does not output events when debug.request disabled', function (done) { + + var server = new Hapi.Server({ debug: { request: false } }); + server.connection(); + + var i = 0; + var orig = console.error; + console.error = function () { + + ++i; + }; + + var handler = function (request, reply) { + + request.log(['implementation']); + return reply(); + }; + + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + console.error('nothing'); + expect(i).to.equal(1); + console.error = orig; + done(); + }); + }); + + it('does not output non-implementation events by default', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + var i = 0; + var orig = console.error; + console.error = function () { + + ++i; + }; + + var handler = function (request, reply) { + + request.log(['xyz']); + return reply(); + }; + + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + console.error('nothing'); + expect(i).to.equal(1); + console.error = orig; + done(); + }); + }); + }); + + describe('_log()', { parallel: false }, function () { + + it('emits a request-internal event', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.once('request-internal', function (request, event, tags) { + + expect(tags.received).to.be.true(); + done(); + }); + + server.inject('/', function (res) { }); + }); + }); + + describe('getLog()', function () { + + it('returns the selected logs', function (done) { + + var handler = function (request, reply) { + + request._log('1'); + request.log('1'); + + return reply([request.getLog('1').length, request.getLog('1', true).length, request.getLog('1', false).length, request.getLog(true).length, request.getLog(false).length, request.getLog().length].join('|')); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + expect(res.payload).to.equal('2|1|1|2|1|3'); + done(); + }); + }); + }); + + describe('_setResponse()', function () { + + it('leaves the response open when the same response is set again', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.ext('onPostHandler', function (request, reply) { + + return reply(request.response); + }); + + var handler = function (request, reply) { + + var stream = new Stream.Readable(); + stream._read = function (size) { + + this.push('value'); + this.push(null); + }; + + return reply(stream); + }; + + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + expect(res.result).to.equal('value'); + done(); + }); + }); + + it('leaves the response open when the same response source is set again', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.ext('onPostHandler', function (request, reply) { + + return reply(request.response.source); + }); + + var handler = function (request, reply) { + + var stream = new Stream.Readable(); + stream._read = function (size) { + + this.push('value'); + this.push(null); + }; + + return reply(stream); + }; + + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + expect(res.result).to.equal('value'); + done(); + }); + }); + }); + + describe('timeout', { parallel: false }, function () { + + it('returns server error message when server taking too long', function (done) { + + var timeoutHandler = function (request, reply) { }; + + var server = new Hapi.Server(); + server.connection({ routes: { timeout: { server: 50 } } }); + server.route({ method: 'GET', path: '/timeout', config: { handler: timeoutHandler } }); + + var timer = new Hoek.Bench(); + + server.inject('/timeout', function (res) { + + expect(res.statusCode).to.equal(503); + expect(timer.elapsed()).to.be.at.least(45); + done(); + }); + }); + + it('returns server error message when server timeout happens during request execution (and handler yields)', function (done) { + + var slowHandler = function (request, reply) { + + setTimeout(function () { + + return reply('Slow'); + }, 30); + }; + + var server = new Hapi.Server(); + server.connection({ routes: { timeout: { server: 2 } } }); + server.route({ method: 'GET', path: '/', config: { handler: slowHandler } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(503); + done(); + }); + }); + + it('returns server error message when server timeout is short and already occurs when request executes', function (done) { + + var server = new Hapi.Server(); + server.connection({ routes: { timeout: { server: 2 } } }); + server.route({ method: 'GET', path: '/', config: { handler: function () { } } }); + server.ext('onRequest', function (request, reply) { + + setTimeout(function () { + + return reply.continue(); + }, 10); + }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(503); + done(); + }); + }); + + it('handles server handler timeout with onPreResponse ext', function (done) { + + var handler = function (request, reply) { + + setTimeout(reply, 20); + }; + + var server = new Hapi.Server(); + server.connection({ routes: { timeout: { server: 10 } } }); + server.route({ method: 'GET', path: '/', config: { handler: handler } }); + server.ext('onPreResponse', function (request, reply) { + + return reply.continue(); + }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(503); + done(); + }); + }); + + it('does not return an error response when server is slow but faster than timeout', function (done) { + + var slowHandler = function (request, reply) { + + setTimeout(function () { + + return reply('Slow'); + }, 30); + }; + + var server = new Hapi.Server(); + server.connection({ routes: { timeout: { server: 50 } } }); + server.route({ method: 'GET', path: '/slow', config: { handler: slowHandler } }); + + var timer = new Hoek.Bench(); + server.inject('/slow', function (res) { + + expect(timer.elapsed()).to.be.at.least(20); + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('does not return an error when server is responding when the timeout occurs', function (done) { + + var respondingHandler = function (request, reply) { + + var s = new Stream.PassThrough(); + reply(s); + + for (var i = 10000; i > 0; --i) { + s.write(i.toString()); + } + + setTimeout(function () { + + s.emit('end'); + }, 40); + }; + + var timer = new Hoek.Bench(); + + var server = new Hapi.Server(); + server.connection({ routes: { timeout: { server: 50 } } }); + server.route({ method: 'GET', path: '/responding', config: { handler: respondingHandler } }); + server.start(function () { + + var options = { + hostname: '127.0.0.1', + port: server.info.port, + path: '/responding', + method: 'GET' + }; + + var req = Http.request(options, function (res) { + + expect(timer.elapsed()).to.be.at.least(60); + expect(res.statusCode).to.equal(200); + done(); + }); + + req.write('\n'); + }); + }); + + it('does not return an error response when server is slower than timeout but response has started', function (done) { + + var streamHandler = function (request, reply) { + + var TestStream = function () { + + Stream.Readable.call(this); + }; + + Hoek.inherits(TestStream, Stream.Readable); + + TestStream.prototype._read = function (size) { + + var self = this; + + if (this.isDone) { + return; + } + this.isDone = true; + + setTimeout(function () { + + self.push('Hello'); + }, 30); + + setTimeout(function () { + + self.push(null); + }, 60); + }; + + return reply(new TestStream()); + }; + + var server = new Hapi.Server(); + server.connection({ routes: { timeout: { server: 50 } } }); + server.route({ method: 'GET', path: '/stream', config: { handler: streamHandler } }); + server.start(function () { + + var options = { + hostname: '127.0.0.1', + port: server.info.port, + path: '/stream', + method: 'GET' + }; + + var req = Http.request(options, function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + req.end(); + }); + }); + + it('does not return an error response when server takes less than timeout to respond', function (done) { + + var fastHandler = function (request, reply) { + + return reply('Fast'); + }; + + var server = new Hapi.Server(); + server.connection({ routes: { timeout: { server: 50 } } }); + server.route({ method: 'GET', path: '/fast', config: { handler: fastHandler } }); + + server.inject('/fast', function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('handles race condition between equal client and server timeouts', function (done) { + + var timeoutHandler = function (request, reply) { }; + + var server = new Hapi.Server(); + server.connection({ routes: { timeout: { server: 50 }, payload: { timeout: 50 } } }); + server.route({ method: 'POST', path: '/timeout', config: { handler: timeoutHandler } }); + + server.start(function () { + + var timer = new Hoek.Bench(); + var options = { + hostname: '127.0.0.1', + port: server.info.port, + path: '/timeout', + method: 'POST' + }; + + var req = Http.request(options, function (res) { + + expect([503, 408]).to.contain(res.statusCode); + expect(timer.elapsed()).to.be.at.least(45); + done(); + }); + + req.on('error', function (err) { + + }); + + req.write('\n'); + setTimeout(function () { + + req.end(); + }, 100); + }); + }); + }); +}); diff --git a/node_modules/hapi/test/response.js b/node_modules/hapi/test/response.js new file mode 100755 index 0000000..4f80e96 --- /dev/null +++ b/node_modules/hapi/test/response.js @@ -0,0 +1,982 @@ +// Load modules + +var Stream = require('stream'); +var Bluebird = require('bluebird'); +var Boom = require('boom'); +var Code = require('code'); +var Handlebars = require('handlebars'); +var Hapi = require('..'); +var Hoek = require('hoek'); +var Lab = require('lab'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('Response', function () { + + it('returns a reply', function (done) { + + var handler = function (request, reply) { + + return reply('text') + .type('text/plain') + .charset('ISO-8859-1') + .ttl(1000) + .header('set-cookie', 'abc=123') + .state('sid', 'abcdefg123456') + .state('other', 'something', { isSecure: true }) + .unstate('x') + .header('Content-Type', 'text/plain; something=something') + .header('vary', 'x-control') + .header('combo', 'o') + .header('combo', 'k', { append: true, separator: '-' }) + .header('combo', 'bad', { override: false }) + .code(200); + }; + + var server = new Hapi.Server(); + server.connection({ routes: { cors: true } }); + server.route({ method: 'GET', path: '/', config: { handler: handler, cache: { expiresIn: 9999 } } }); + server.state('sid', { encoding: 'base64' }); + server.state('always', { autoValue: 'present' }); + server.ext('onPostHandler', function (request, reply) { + + reply.state('test', '123'); + reply.unstate('empty'); + return reply.continue(); + }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.result).to.exist(); + expect(res.result).to.equal('text'); + expect(res.headers['cache-control']).to.equal('max-age=1, must-revalidate, private'); + expect(res.headers['content-type']).to.equal('text/plain; something=something, charset=ISO-8859-1'); + expect(res.headers['access-control-allow-origin']).to.equal('*'); + expect(res.headers['access-control-allow-credentials']).to.not.exist(); + expect(res.headers['access-control-allow-methods']).to.equal('GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS'); + expect(res.headers['set-cookie']).to.deep.equal(['abc=123', 'sid=YWJjZGVmZzEyMzQ1Ng==', 'other=something; Secure', 'x=; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00 GMT', 'test=123', 'empty=; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00 GMT', 'always=present']); + expect(res.headers.vary).to.equal('x-control,origin'); + expect(res.headers.combo).to.equal('o-k'); + done(); + }); + }); + + describe('header()', function () { + + it('appends to set-cookie header', function (done) { + + var handler = function (request, reply) { + + return reply('ok').header('set-cookie', 'A').header('set-cookie', 'B', { append: true }); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.headers['set-cookie']).to.deep.equal(['A', 'B']); + done(); + }); + }); + }); + + describe('created()', function () { + + it('returns a stream reply (created)', function (done) { + + var handler = function (request, reply) { + + return reply({ a: 1 }).created('/special'); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'POST', path: '/', handler: handler }); + + server.inject({ method: 'POST', url: '/' }, function (res) { + + expect(res.result).to.deep.equal({ a: 1 }); + expect(res.statusCode).to.equal(201); + expect(res.headers.location).to.equal('/special'); + expect(res.headers['cache-control']).to.equal('no-cache'); + done(); + }); + }); + + it('returns error on created with GET', function (done) { + + var handler = function (request, reply) { + + return reply().created('/something'); + }; + + var server = new Hapi.Server({ debug: false }); + server.connection(); + server.route({ method: 'GET', path: '/', config: { handler: handler } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(500); + done(); + }); + }); + }); + + describe('state()', function () { + + it('returns an error on bad cookie', function (done) { + + var handler = function (request, reply) { + + return reply('text').state(';sid', 'abcdefg123456'); + }; + + var server = new Hapi.Server({ debug: false }); + server.connection(); + server.route({ method: 'GET', path: '/', config: { handler: handler } }); + + server.inject('/', function (res) { + + expect(res.result).to.exist(); + expect(res.statusCode).to.equal(500); + expect(res.result.message).to.equal('An internal server error occurred'); + expect(res.headers['set-cookie']).to.not.exist(); + done(); + }); + }); + }); + + describe('unstate()', function () { + + it('allows options', function (done) { + + var handler = function (request, reply) { + + return reply().unstate('session', { path: '/unset', isSecure: true }); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (unset) { + + expect(unset.statusCode).to.equal(200); + expect(unset.headers['set-cookie']).to.deep.equal(['session=; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; Path=/unset']); + done(); + }); + }); + }); + + describe('vary()', function () { + + it('sets Vary header with single value', function (done) { + + var handler = function (request, reply) { + + return reply('ok').vary('x'); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + expect(res.result).to.equal('ok'); + expect(res.statusCode).to.equal(200); + expect(res.headers.vary).to.equal('x'); + done(); + }); + }); + + it('sets Vary header with multiple values', function (done) { + + var handler = function (request, reply) { + + return reply('ok').vary('x').vary('y'); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + expect(res.result).to.equal('ok'); + expect(res.statusCode).to.equal(200); + expect(res.headers.vary).to.equal('x,y'); + done(); + }); + }); + + it('sets Vary header with *', function (done) { + + var handler = function (request, reply) { + + return reply('ok').vary('*'); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + expect(res.result).to.equal('ok'); + expect(res.statusCode).to.equal(200); + expect(res.headers.vary).to.equal('*'); + done(); + }); + }); + + it('leaves Vary header with * on additional values', function (done) { + + var handler = function (request, reply) { + + return reply('ok').vary('*').vary('x'); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + expect(res.result).to.equal('ok'); + expect(res.statusCode).to.equal(200); + expect(res.headers.vary).to.equal('*'); + done(); + }); + }); + + it('drops other Vary header values when set to *', function (done) { + + var handler = function (request, reply) { + + return reply('ok').vary('x').vary('*'); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + expect(res.result).to.equal('ok'); + expect(res.statusCode).to.equal(200); + expect(res.headers.vary).to.equal('*'); + done(); + }); + }); + }); + + describe('etag()', function () { + + it('sets etag', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok').etag('abc'); } }); + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.headers.etag).to.equal('"abc"'); + done(); + }); + }); + + it('sets weak etag', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok').etag('abc', { weak: true }); } }); + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.headers.etag).to.equal('W/"abc"'); + done(); + }); + }); + + it('ignores varyEtag when etag header is removed', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { var response = reply('ok').etag('abc').vary('x'); delete response.headers.etag; } }); + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.headers.etag).to.not.exist(); + done(); + }); + }); + + it('leaves etag header when varyEtag is false', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok').etag('abc', { vary: false }).vary('x'); } }); + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.headers.etag).to.equal('"abc"'); + + server.inject({ url: '/', headers: { 'if-none-match': '"abc-gzip"', 'accept-encoding': 'gzip' } }, function (res) { + + expect(res.statusCode).to.equal(200); + expect(res.headers.etag).to.equal('"abc"'); + done(); + }); + }); + }); + }); + + describe('passThrough()', function () { + + it('passes stream headers and code through', function (done) { + + var TestStream = function () { + + Stream.Readable.call(this); + this.statusCode = 299; + this.headers = { xcustom: 'some value' }; + }; + + Hoek.inherits(TestStream, Stream.Readable); + + TestStream.prototype._read = function (size) { + + if (this.isDone) { + return; + } + this.isDone = true; + + this.push('x'); + this.push(null); + }; + + var handler = function (request, reply) { + + return reply(new TestStream()); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', config: { handler: handler } }); + + server.inject('/', function (res) { + + expect(res.result).to.equal('x'); + expect(res.statusCode).to.equal(299); + expect(res.headers.xcustom).to.equal('some value'); + done(); + }); + }); + + it('excludes stream headers and code when passThrough is false', function (done) { + + var TestStream = function () { + + Stream.Readable.call(this); + this.statusCode = 299; + this.headers = { xcustom: 'some value' }; + }; + + Hoek.inherits(TestStream, Stream.Readable); + + TestStream.prototype._read = function (size) { + + if (this.isDone) { + return; + } + this.isDone = true; + + this.push('x'); + this.push(null); + }; + + var handler = function (request, reply) { + + return reply(new TestStream()).passThrough(false); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', config: { handler: handler } }); + + server.inject('/', function (res) { + + expect(res.result).to.equal('x'); + expect(res.statusCode).to.equal(200); + expect(res.headers.xcustom).to.not.exist(); + done(); + }); + }); + + it('ignores stream headers when empty', function (done) { + + var TestStream = function () { + + Stream.Readable.call(this); + this.statusCode = 299; + this.headers = {}; + }; + + Hoek.inherits(TestStream, Stream.Readable); + + TestStream.prototype._read = function (size) { + + if (this.isDone) { + return; + } + this.isDone = true; + + this.push('x'); + this.push(null); + }; + + var handler = function (request, reply) { + + return reply(new TestStream()); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', config: { handler: handler } }); + + server.inject('/', function (res) { + + expect(res.result).to.equal('x'); + expect(res.statusCode).to.equal(299); + expect(res.headers.xcustom).to.not.exist(); + done(); + }); + }); + + it('retains local headers with stream headers pass-through', function (done) { + + var TestStream = function () { + + Stream.Readable.call(this); + this.headers = { xcustom: 'some value', 'set-cookie': 'a=1' }; + }; + + Hoek.inherits(TestStream, Stream.Readable); + + TestStream.prototype._read = function (size) { + + if (this.isDone) { + return; + } + this.isDone = true; + + this.push('x'); + this.push(null); + }; + + var handler = function (request, reply) { + + return reply(new TestStream()).header('xcustom', 'other value').state('b', '2'); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', config: { handler: handler } }); + + server.inject('/', function (res) { + + expect(res.result).to.equal('x'); + expect(res.headers.xcustom).to.equal('other value'); + expect(res.headers['set-cookie']).to.deep.equal(['a=1', 'b=2']); + done(); + }); + }); + }); + + describe('replacer()', function () { + + it('errors when called on wrong type', function (done) { + + var server = new Hapi.Server({ debug: false }); + server.connection(); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('x').replacer(['x']); } }); + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(500); + done(); + }); + }); + }); + + describe('spaces()', function () { + + it('errors when called on wrong type', function (done) { + + var server = new Hapi.Server({ debug: false }); + server.connection(); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('x').spaces(2); } }); + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(500); + done(); + }); + }); + }); + + describe('suffix()', function () { + + it('errors when called on wrong type', function (done) { + + var server = new Hapi.Server({ debug: false }); + server.connection(); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('x').suffix('x'); } }); + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(500); + done(); + }); + }); + }); + + describe('type()', function () { + + it('returns a file in the response with the correct headers using custom mime type', function (done) { + + var server = new Hapi.Server(); + server.connection({ routes: { files: { relativeTo: __dirname } } }); + var handler = function (request, reply) { + + return reply.file('../Makefile').type('application/example'); + }; + + server.route({ method: 'GET', path: '/file', handler: handler }); + + server.inject('/file', function (res) { + + expect(res.headers['content-type']).to.equal('application/example'); + done(); + }); + }); + }); + + describe('redirect()', function () { + + it('returns a redirection reply', function (done) { + + var handler = function (request, reply) { + + return reply('Please wait while we send your elsewhere').redirect('/example'); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', config: { handler: handler } }); + + server.inject('http://example.org/', function (res) { + + expect(res.result).to.exist(); + expect(res.headers.location).to.equal('/example'); + expect(res.statusCode).to.equal(302); + done(); + }); + }); + + it('returns a redirection reply using verbose call', function (done) { + + var handler = function (request, reply) { + + return reply('We moved!').redirect().location('/examplex'); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', config: { handler: handler } }); + + server.inject('/', function (res) { + + expect(res.result).to.exist(); + expect(res.result).to.equal('We moved!'); + expect(res.headers.location).to.equal('/examplex'); + expect(res.statusCode).to.equal(302); + done(); + }); + }); + + it('returns a 301 redirection reply', function (done) { + + var handler = function (request, reply) { + + return reply().redirect('example').permanent().rewritable(); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', config: { handler: handler } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(301); + done(); + }); + }); + + it('returns a 302 redirection reply', function (done) { + + var handler = function (request, reply) { + + return reply().redirect('example').temporary().rewritable(); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', config: { handler: handler } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(302); + done(); + }); + }); + + it('returns a 307 redirection reply', function (done) { + + var handler = function (request, reply) { + + return reply().redirect('example').temporary().rewritable(false); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', config: { handler: handler } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(307); + done(); + }); + }); + + it('returns a 308 redirection reply', function (done) { + + var handler = function (request, reply) { + + return reply().redirect('example').permanent().rewritable(false); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', config: { handler: handler } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(308); + done(); + }); + }); + + it('returns a 301 redirection reply (reveresed methods)', function (done) { + + var handler = function (request, reply) { + + return reply().redirect('example').rewritable().permanent(); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', config: { handler: handler } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(301); + done(); + }); + }); + + it('returns a 302 redirection reply (reveresed methods)', function (done) { + + var handler = function (request, reply) { + + return reply().redirect('example').rewritable().temporary(); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', config: { handler: handler } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(302); + done(); + }); + }); + + it('returns a 307 redirection reply (reveresed methods)', function (done) { + + var handler = function (request, reply) { + + return reply().redirect('example').rewritable(false).temporary(); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', config: { handler: handler } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(307); + done(); + }); + }); + + it('returns a 308 redirection reply (reveresed methods)', function (done) { + + var handler = function (request, reply) { + + return reply().redirect('example').rewritable(false).permanent(); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', config: { handler: handler } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(308); + done(); + }); + }); + + it('returns a 302 redirection reply (flip flop)', function (done) { + + var handler = function (request, reply) { + + return reply().redirect('example').permanent().temporary(); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', config: { handler: handler } }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(302); + done(); + }); + }); + }); + + describe('_prepare()', function () { + + it('handles promises that resolve', function (done) { + + var handler = function (request, reply) { + + return reply(Bluebird.resolve('promised response')).code(201); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + expect(res.result).to.equal('promised response'); + expect(res.statusCode).to.equal(201); + done(); + }); + }); + + it('handles promises that resolve (object)', function (done) { + + var handler = function (request, reply) { + + return reply(Bluebird.resolve({ status: 'ok' })).code(201); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + expect(res.result.status).to.equal('ok'); + expect(res.statusCode).to.equal(201); + done(); + }); + }); + + it('handles promises that reject', function (done) { + + var handler = function (request, reply) { + + var promise = Bluebird.reject(Boom.forbidden('this is not allowed!')); + promise.catch(Hoek.ignore); + + return reply(promise).code(299); // Code ignored + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + expect(res.result.message).to.equal('this is not allowed!'); + expect(res.statusCode).to.equal(403); + done(); + }); + }); + }); + + describe('_marshal()', function () { + + it('emits request-error when view file for handler not found', function (done) { + + var server = new Hapi.Server({ debug: false }); + server.connection(); + + server.views({ + engines: { 'html': Handlebars }, + path: __dirname + }); + + server.once('request-error', function (request, err) { + + expect(err).to.exist(); + expect(err.message).to.contain('View file not found'); + done(); + }); + + server.route({ method: 'GET', path: '/{param}', handler: { view: 'noview' } }); + + server.inject('/hello', function (res) { + + expect(res.statusCode).to.equal(500); + expect(res.result).to.exist(); + expect(res.result.message).to.equal('An internal server error occurred'); + }); + }); + }); + + describe('_streamify()', function () { + + it('returns a formatted response', function (done) { + + var handler = function (request, reply) { + + return reply({ a: 1, b: 2 }); + }; + + var server = new Hapi.Server(); + server.connection({ routes: { json: { replacer: ['a'], space: 4, suffix: '\n' } } }); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + expect(res.payload).to.equal('{\n \"a\": 1\n}\n'); + done(); + }); + }); + + it('returns a response with options', function (done) { + + var handler = function (request, reply) { + + return reply({ a: 1, b: 2 }).type('application/x-test').spaces(2).replacer(['a']).suffix('\n'); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + expect(res.payload).to.equal('{\n \"a\": 1\n}\n'); + expect(res.headers['content-type']).to.equal('application/x-test'); + done(); + }); + }); + + it('returns a response with options (different order)', function (done) { + + var handler = function (request, reply) { + + return reply({ a: 1, b: 2 }).type('application/x-test').replacer(['a']).suffix('\n').spaces(2); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + expect(res.payload).to.equal('{\n \"a\": 1\n}\n'); + expect(res.headers['content-type']).to.equal('application/x-test'); + done(); + }); + }); + + it('captures object which cannot be stringify', function (done) { + + var handler = function (request, reply) { + + var obj = {}; + obj.a = obj; + return reply(obj); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', handler: handler }); + + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(500); + done(); + }); + }); + }); + + describe('_close()', function () { + + it('calls custom close processor', function (done) { + + var closed = false; + var close = function (response) { + + closed = true; + }; + + var handler = function (request, reply) { + + return reply(request.generateResponse(null, { close: close })); + }; + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', config: { handler: handler } }); + + server.inject('/', function (res) { + + expect(closed).to.be.true(); + done(); + }); + }); + }); +}); diff --git a/node_modules/hapi/test/route.js b/node_modules/hapi/test/route.js new file mode 100755 index 0000000..d4d28e2 --- /dev/null +++ b/node_modules/hapi/test/route.js @@ -0,0 +1,338 @@ +// Load modules + +var Code = require('code'); +var Hapi = require('..'); +var Joi = require('joi'); +var Lab = require('lab'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('Route', function () { + + it('throws an error when a route is missing a path', function (done) { + + expect(function () { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', handler: function () { } }); + }).to.throw('Route missing path'); + done(); + }); + + it('throws an error when a route is made without a connection', function (done) { + + expect(function () { + + var server = new Hapi.Server(); + server.route({ method: 'GET', path: '/dork', handler: function () { } }); + }).to.throw('Cannot add a route without any connections'); + done(); + }); + + it('throws an error when a route is missing a method', function (done) { + + expect(function () { + + var server = new Hapi.Server(); + server.connection(); + server.route({ path: '/', handler: function () { } }); + }).to.throw(/"method" is required/); + done(); + }); + + it('throws an error when a route has a malformed method name', function (done) { + + expect(function () { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: '"GET"', path: '/', handler: function () { } }); + }).to.throw(/Invalid method name/); + done(); + }); + + it('throws an error when a route uses the HEAD method', function (done) { + + expect(function () { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'HEAD', path: '/', handler: function () { } }); + }).to.throw(/Method name not allowed/); + done(); + }); + + it('throws an error when a route is missing a handler', function (done) { + + expect(function () { + + var server = new Hapi.Server(); + server.connection(); + server.route({ path: '/test', method: 'put' }); + }).to.throw('Missing or undefined handler: put /test'); + done(); + }); + + it('throws when handler is missing in config', function (done) { + + var server = new Hapi.Server(); + server.connection(); + expect(function () { + server.route({ method: 'GET', path: '/', config: {} }); + }).to.throw('Missing or undefined handler: GET /'); + done(); + }); + + it('throws when path has trailing slash and server set to strip', function (done) { + + var server = new Hapi.Server(); + server.connection({ router: { stripTrailingSlash: true } }); + expect(function () { + + server.route({ method: 'GET', path: '/test/', handler: function () { } }); + }).to.throw('Path cannot end with a trailing slash when connection configured to strip: GET /test/'); + done(); + }); + + it('allows / when path has trailing slash and server set to strip', function (done) { + + var server = new Hapi.Server(); + server.connection({ router: { stripTrailingSlash: true } }); + expect(function () { + + server.route({ method: 'GET', path: '/', handler: function () { } }); + }).to.not.throw(); + done(); + }); + + it('sets route plugins and app settings', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/', config: { handler: function (request, reply) { return reply(request.route.settings.app.x + request.route.settings.plugins.x.y); }, app: { x: 'o' }, plugins: { x: { y: 'k' } } } }); + server.inject('/', function (res) { + + expect(res.result).to.equal('ok'); + done(); + }); + }); + + it('throws when validation is set without payload parsing', function (done) { + + var server = new Hapi.Server(); + server.connection(); + expect(function () { + + server.route({ method: 'POST', path: '/', handler: function () { }, config: { validate: { payload: {} }, payload: { parse: false } } }); + }).to.throw('Route payload must be set to \'parse\' when payload validation enabled: POST /'); + done(); + }); + + it('throws when validation is set on GET', function (done) { + + var server = new Hapi.Server(); + server.connection(); + expect(function () { + + server.route({ method: 'GET', path: '/', handler: function () { }, config: { validate: { payload: {} } } }); + }).to.throw('Cannot validate HEAD or GET requests: /'); + done(); + }); + + it('throws when payload parsing is set on GET', function (done) { + + var server = new Hapi.Server(); + server.connection(); + expect(function () { + + server.route({ method: 'GET', path: '/', handler: function () { }, config: { payload: { parse: true } } }); + }).to.throw('Cannot set payload settings on HEAD or GET request: /'); + done(); + }); + + it('ignores validation on * route when request is GET', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: '*', path: '/', handler: function (request, reply) { return reply(); }, config: { validate: { payload: { a: Joi.required() } } } }); + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('ignores default validation on GET', function (done) { + + var server = new Hapi.Server(); + server.connection({ routes: { validate: { payload: { a: Joi.required() } } } }); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(); } }); + server.inject('/', function (res) { + + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('shallow copies route config bind', function (done) { + + var server = new Hapi.Server(); + server.connection(); + var context = { key: 'is ' }; + + var count = 0; + Object.defineProperty(context, 'test', { + enumerable: true, + configurable: true, + get: function () { + + ++count; + } + }); + + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(this.key + (this === context)); }, config: { bind: context } }); + server.inject('/', function (res) { + + expect(res.result).to.equal('is true'); + expect(count).to.equal(0); + done(); + }); + }); + + it('shallow copies route config bind (server.bind())', function (done) { + + var server = new Hapi.Server(); + server.connection(); + var context = { key: 'is ' }; + + var count = 0; + Object.defineProperty(context, 'test', { + enumerable: true, + configurable: true, + get: function () { + + ++count; + } + }); + + server.bind(context); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(this.key + (this === context)); } }); + server.inject('/', function (res) { + + expect(res.result).to.equal('is true'); + expect(count).to.equal(0); + done(); + }); + }); + + it('shallow copies route config bind (connection defaults)', function (done) { + + var server = new Hapi.Server(); + var context = { key: 'is ' }; + + var count = 0; + Object.defineProperty(context, 'test', { + enumerable: true, + configurable: true, + get: function () { + + ++count; + } + }); + + server.connection({ routes: { bind: context } }); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('' + this.key + (this === context)); } }); + server.inject('/', function (res) { + + expect(res.result).to.equal('is true'); + expect(count).to.equal(0); + done(); + }); + }); + + it('shallow copies route config bind (server defaults)', function (done) { + + var context = { key: 'is ' }; + + var count = 0; + Object.defineProperty(context, 'test', { + enumerable: true, + configurable: true, + get: function () { + + ++count; + } + }); + + var server = new Hapi.Server({ connections: { routes: { bind: context } } }); + server.connection(); + server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(this.key + (this === context)); } }); + server.inject('/', function (res) { + + expect(res.result).to.equal('is true'); + expect(count).to.equal(0); + done(); + }); + }); + + it('overrides server relativeTo', function (done) { + + var server = new Hapi.Server(); + server.connection(); + var handler = function (request, reply) { + + return reply.file('../package.json'); + }; + + server.route({ method: 'GET', path: '/file', handler: handler, config: { files: { relativeTo: __dirname } } }); + + server.inject('/file', function (res) { + + expect(res.payload).to.contain('hapi'); + done(); + }); + }); + + it('throws when server timeout is more then socket timeout', function (done) { + + var server = new Hapi.Server(); + expect(function () { + + server.connection({ routes: { timeout: { server: 60000, socket: 12000 } } }); + }).to.throw('Server timeout must be shorter than socket timeout: /{p*}'); + done(); + }); + + it('throws when server timeout is more then socket timeout (node default)', function (done) { + + var server = new Hapi.Server(); + expect(function () { + + server.connection({ routes: { timeout: { server: 6000000 } } }); + }).to.throw('Server timeout must be shorter than socket timeout: /{p*}'); + done(); + }); + + it('ignores large server timeout when socket timeout disabled', function (done) { + + var server = new Hapi.Server(); + expect(function () { + + server.connection({ routes: { timeout: { server: 6000000, socket: false } } }); + }).to.not.throw(); + done(); + }); +}); diff --git a/node_modules/hapi/test/security.js b/node_modules/hapi/test/security.js new file mode 100755 index 0000000..9ce89ac --- /dev/null +++ b/node_modules/hapi/test/security.js @@ -0,0 +1,281 @@ +// Load modules + +var Code = require('code'); +var Hapi = require('..'); +var Joi = require('joi'); +var Lab = require('lab'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var lab = exports.lab = Lab.script(); +var describe = lab.describe; +var it = lab.it; +var expect = Code.expect; + + +describe('security', function () { + + it('blocks response splitting through the request.create method', function (done) { + + var server = new Hapi.Server(); + server.connection(); + + var createItemHandler = function (request, reply) { + + return reply('Moved').created('/item/' + request.payload.name); + }; + + server.route({ method: 'POST', path: '/item', handler: createItemHandler }); + + server.inject({ + method: 'POST', url: '/item', + payload: '{"name": "foobar\r\nContent-Length: \r\n\r\nHTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: 19\r\n\r\nShazam"}', + headers: { 'Content-Type': 'application/json' } + }, function (res) { + + expect(res.statusCode).to.equal(400); + done(); + }); + }); + + it('blocks path traversal to files outside of hosted directory is not allowed with null byte injection', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/{path*}', handler: { directory: { path: './directory' } } }); + + server.inject('/%00/../security.js', function (res) { + + expect(res.statusCode).to.equal(403); + done(); + }); + }); + + it('blocks path traversal to files outside of hosted directory is not allowed', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/{path*}', handler: { directory: { path: './directory' } } }); + + server.inject('/../security.js', function (res) { + + expect(res.statusCode).to.equal(403); + done(); + }); + }); + + it('blocks path traversal to files outside of hosted directory is not allowed with encoded slash', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/{path*}', handler: { directory: { path: './directory' } } }); + + server.inject('/..%2Fsecurity.js', function (res) { + + expect(res.statusCode).to.equal(403); + done(); + }); + }); + + it('blocks path traversal to files outside of hosted directory is not allowed with double encoded slash', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/{path*}', handler: { directory: { path: './directory' } } }); + + server.inject('/..%252Fsecurity.js', function (res) { + + expect(res.statusCode).to.equal(403); + done(); + }); + }); + + it('blocks path traversal to files outside of hosted directory is not allowed with unicode encoded slash', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/{path*}', handler: { directory: { path: './directory' } } }); + + server.inject('/..\u2216security.js', function (res) { + + expect(res.statusCode).to.equal(403); + done(); + }); + }); + + it('blocks null byte injection when serving a file', function (done) { + + var server = new Hapi.Server(); + server.connection(); + server.route({ method: 'GET', path: '/{path*}', handler: { directory: { path: './directory' } } }); + + server.inject('/index%00.html', function (res) { + + expect(res.statusCode).to.equal(404); + done(); + }); + }); + + it('prevents xss with invalid content types', function (done) { + + var handler = function (request, reply) { + + return reply('Success'); + }; + + var server = new Hapi.Server(); + server.connection(); + server.state('encoded', { encoding: 'iron' }); + server.route({ method: 'POST', path: '/', handler: handler }); + + server.inject({ + method: 'POST', + url: '/', + payload: '{"something":"something"}', + headers: { 'content-type': ';' } + }, + function (res) { + + expect(res.result.message).to.not.contain('script'); + done(); + }); + }); + + it('prevents xss with invalid cookie values in the request', function (done) { + + var handler = function (request, reply) { + + return reply('Success'); + }; + + var server = new Hapi.Server(); + server.connection(); + server.state('encoded', { encoding: 'iron' }); + server.route({ method: 'POST', path: '/', handler: handler }); + + server.inject({ + method: 'POST', + url: '/', + payload: '{"something":"something"}', + headers: { cookie: 'encoded="";' } + }, + function (res) { + + expect(res.result.message).to.not.contain('=value;' } + }, + function (res) { + + expect(res.result.message).to.not.contain('":"other"}', + headers: { 'content-type': 'application/json' } + }, + function (res) { + + expect(res.result.message).to.not.contain('=value' + }, + function (res) { + + expect(res.result.message).to.not.contain(''); + expect(encoded).to.equal('\\x3cscript\\x3ealert\\x281\\x29\\x3c\\x2fscript\\x3e'); + done(); + }); + + it('encodes \' characters', function (done) { + + var encoded = Hoek.escapeJavaScript('something(\'param\')'); + expect(encoded).to.equal('something\\x28\\x27param\\x27\\x29'); + done(); + }); + + it('encodes large unicode characters with the correct padding', function (done) { + + var encoded = Hoek.escapeJavaScript(String.fromCharCode(500) + String.fromCharCode(1000)); + expect(encoded).to.equal('\\u0500\\u1000'); + done(); + }); + + it('doesn\'t throw an exception when passed null', function (done) { + + var encoded = Hoek.escapeJavaScript(null); + expect(encoded).to.equal(''); + done(); + }); +}); + +describe('escapeHtml()', function () { + + it('encodes / characters', function (done) { + + var encoded = Hoek.escapeHtml(''); + expect(encoded).to.equal('<script>alert(1)</script>'); + done(); + }); + + it('encodes < and > as named characters', function (done) { + + var encoded = Hoek.escapeHtml(''); - expect(encoded).to.equal('\\x3cscript\\x3ealert\\x281\\x29\\x3c\\x2fscript\\x3e'); - done(); - }); - - it('encodes \' characters', function (done) { - - var encoded = Hoek.escapeJavaScript('something(\'param\')'); - expect(encoded).to.equal('something\\x28\\x27param\\x27\\x29'); - done(); - }); - - it('encodes large unicode characters with the correct padding', function (done) { - - var encoded = Hoek.escapeJavaScript(String.fromCharCode(500) + String.fromCharCode(1000)); - expect(encoded).to.equal('\\u0500\\u1000'); - done(); - }); - - it('doesn\'t throw an exception when passed null', function (done) { - - var encoded = Hoek.escapeJavaScript(null); - expect(encoded).to.equal(''); - done(); - }); -}); - -describe('escapeHtml()', function () { - - it('encodes / characters', function (done) { - - var encoded = Hoek.escapeHtml(''); - expect(encoded).to.equal('<script>alert(1)</script>'); - done(); - }); - - it('encodes < and > as named characters', function (done) { - - var encoded = Hoek.escapeHtml(' - \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/examples/cms/views/edit.html b/node_modules/hapi/node_modules/vision/examples/cms/views/edit.html deleted file mode 100755 index 5b780ff..0000000 --- a/node_modules/hapi/node_modules/vision/examples/cms/views/edit.html +++ /dev/null @@ -1,25 +0,0 @@ -
- - - \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/examples/cms/views/index.html b/node_modules/hapi/node_modules/vision/examples/cms/views/index.html deleted file mode 100755 index b12f5a8..0000000 --- a/node_modules/hapi/node_modules/vision/examples/cms/views/index.html +++ /dev/null @@ -1,34 +0,0 @@ -{{#if pages}} -

Sitemap

-
    - {{#each pages}} -
  • {{this}}

  • - {{/each}} -
-{{else}} -
- Create a page -
-
- - -
-
- - -
-
- -
-
-
- - - -{{/if}} \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/examples/cms/views/layout.html b/node_modules/hapi/node_modules/vision/examples/cms/views/layout.html deleted file mode 100755 index 0612ce4..0000000 --- a/node_modules/hapi/node_modules/vision/examples/cms/views/layout.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - {{title}} - - - - - - {{> nav}} -
- {{{ content }}} -
-
-
-
- {{> footer}} -
-
- - \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/examples/cms/views/page.html b/node_modules/hapi/node_modules/vision/examples/cms/views/page.html deleted file mode 100755 index fa42b6f..0000000 --- a/node_modules/hapi/node_modules/vision/examples/cms/views/page.html +++ /dev/null @@ -1,4 +0,0 @@ -

{{page.name}}

-
- {{{page.contents}}} -
\ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/examples/cms/views/partials/footer.html b/node_modules/hapi/node_modules/vision/examples/cms/views/partials/footer.html deleted file mode 100755 index 5f43518..0000000 --- a/node_modules/hapi/node_modules/vision/examples/cms/views/partials/footer.html +++ /dev/null @@ -1 +0,0 @@ -

© @Someone 2013

\ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/examples/cms/views/partials/nav.html b/node_modules/hapi/node_modules/vision/examples/cms/views/partials/nav.html deleted file mode 100755 index b0f1468..0000000 --- a/node_modules/hapi/node_modules/vision/examples/cms/views/partials/nav.html +++ /dev/null @@ -1,21 +0,0 @@ - \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/examples/handlebars/basic.js b/node_modules/hapi/node_modules/vision/examples/handlebars/basic.js deleted file mode 100755 index 13d8d41..0000000 --- a/node_modules/hapi/node_modules/vision/examples/handlebars/basic.js +++ /dev/null @@ -1,35 +0,0 @@ -// Load modules - -var Hapi = require('hapi'); - - -// Declare internals - -var internals = {}; - - -var handler = function (request, reply) { - - reply.view('basic/index', { - title: 'examples/views/handlebars/basic.js | Hapi ' + Hapi.version, - message: 'Hello World!' - }); -}; - - -internals.main = function () { - - var server = new Hapi.Server(); - server.connection({ port: 8000 }); - - server.views({ - engines: { html: require('handlebars') }, - path: __dirname + '/templates' - }); - - server.route({ method: 'GET', path: '/', handler: handler }); - server.start(); -}; - - -internals.main(); diff --git a/node_modules/hapi/node_modules/vision/examples/handlebars/layout.js b/node_modules/hapi/node_modules/vision/examples/handlebars/layout.js deleted file mode 100755 index ab3d621..0000000 --- a/node_modules/hapi/node_modules/vision/examples/handlebars/layout.js +++ /dev/null @@ -1,36 +0,0 @@ -// Load modules - -var Hapi = require('hapi'); - - -// Declare internals - -var internals = {}; - - -var handler = function (request, reply) { - - reply.view('withLayout/index', { - title: 'examples/views/handlebars/layout.js | Hapi ' + Hapi.version, - message: 'Hello World!\n' - }); -}; - - -internals.main = function () { - - var server = new Hapi.Server(); - server.connection({ port: 8000 }); - - server.views({ - engines: { html: require('handlebars') }, - path: __dirname + '/templates', - layout: true - }); - - server.route({ method: 'GET', path: '/', handler: handler }); - server.start(); -}; - - -internals.main(); diff --git a/node_modules/hapi/node_modules/vision/examples/handlebars/partials.js b/node_modules/hapi/node_modules/vision/examples/handlebars/partials.js deleted file mode 100755 index f1ab919..0000000 --- a/node_modules/hapi/node_modules/vision/examples/handlebars/partials.js +++ /dev/null @@ -1,36 +0,0 @@ -// Load modules - -var Hapi = require('hapi'); - - -// Declare internals - -var internals = {}; - - -var handler = function (request, reply) { - - reply.view('withPartials/index', { - title: 'examples/views/handlebars/partials.js | Hapi ' + Hapi.version, - message: 'Hello World!\n' - }); -}; - - -internals.main = function () { - - var server = new Hapi.Server(); - server.connection({ port: 8000 }); - - server.views({ - engines: { html: require('handlebars') }, - path: __dirname + '/templates', - partialsPath: __dirname + '/templates/withPartials' - }); - - server.route({ method: 'GET', path: '/', handler: handler }); - server.start(); -}; - - -internals.main(); diff --git a/node_modules/hapi/node_modules/vision/examples/handlebars/templates/basic/index.html b/node_modules/hapi/node_modules/vision/examples/handlebars/templates/basic/index.html deleted file mode 100755 index 06a1feb..0000000 --- a/node_modules/hapi/node_modules/vision/examples/handlebars/templates/basic/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - {{title}} - - -
-

{{message}}

-
- - diff --git a/node_modules/hapi/node_modules/vision/examples/handlebars/templates/layout.html b/node_modules/hapi/node_modules/vision/examples/handlebars/templates/layout.html deleted file mode 100755 index 21d6170..0000000 --- a/node_modules/hapi/node_modules/vision/examples/handlebars/templates/layout.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - {{title}} - - -

Layout header

- {{{ content }}} -

Layout footer

- - diff --git a/node_modules/hapi/node_modules/vision/examples/handlebars/templates/withLayout/index.html b/node_modules/hapi/node_modules/vision/examples/handlebars/templates/withLayout/index.html deleted file mode 100755 index 8a57a8f..0000000 --- a/node_modules/hapi/node_modules/vision/examples/handlebars/templates/withLayout/index.html +++ /dev/null @@ -1,3 +0,0 @@ -
-

{{message}}

-
\ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/examples/handlebars/templates/withPartials/footer.html b/node_modules/hapi/node_modules/vision/examples/handlebars/templates/withPartials/footer.html deleted file mode 100755 index 102617d..0000000 --- a/node_modules/hapi/node_modules/vision/examples/handlebars/templates/withPartials/footer.html +++ /dev/null @@ -1,3 +0,0 @@ -
-

hapi.js 2013

-
\ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/examples/handlebars/templates/withPartials/header.html b/node_modules/hapi/node_modules/vision/examples/handlebars/templates/withPartials/header.html deleted file mode 100755 index c23da54..0000000 --- a/node_modules/hapi/node_modules/vision/examples/handlebars/templates/withPartials/header.html +++ /dev/null @@ -1,3 +0,0 @@ -
-

Views with Partials

-
diff --git a/node_modules/hapi/node_modules/vision/examples/handlebars/templates/withPartials/index.html b/node_modules/hapi/node_modules/vision/examples/handlebars/templates/withPartials/index.html deleted file mode 100755 index 11d647d..0000000 --- a/node_modules/hapi/node_modules/vision/examples/handlebars/templates/withPartials/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - {{title}} - - - {{> header}} -
-

{{message}}

-
- {{> footer}} - - diff --git a/node_modules/hapi/node_modules/vision/examples/jade/index.js b/node_modules/hapi/node_modules/vision/examples/jade/index.js deleted file mode 100755 index 58de44e..0000000 --- a/node_modules/hapi/node_modules/vision/examples/jade/index.js +++ /dev/null @@ -1,47 +0,0 @@ -// Load modules - -var Hapi = require('hapi'); - - -// Declare internals - -var internals = {}; - - -var rootHandler = function (request, reply) { - - reply.view('index', { - title: 'examples/views/jade/index.js | Hapi ' + Hapi.version, - message: 'Index - Hello World!' - }); -}; - -var aboutHandler = function (request, reply) { - - reply.view('about', { - title: 'examples/views/jade/index.js | Hapi ' + Hapi.version, - message: 'About - Hello World!' - }); -}; - - -internals.main = function () { - - var server = new Hapi.Server(); - server.connection({ port: 8000 }); - - server.views({ - engines: { jade: require('jade') }, - path: __dirname + '/templates', - compileOptions: { - pretty: true - } - }); - - server.route({ method: 'GET', path: '/', handler: rootHandler }); - server.route({ method: 'GET', path: '/about', handler: aboutHandler }); - server.start(); -}; - - -internals.main(); diff --git a/node_modules/hapi/node_modules/vision/examples/jade/templates/about.jade b/node_modules/hapi/node_modules/vision/examples/jade/templates/about.jade deleted file mode 100755 index ac539de..0000000 --- a/node_modules/hapi/node_modules/vision/examples/jade/templates/about.jade +++ /dev/null @@ -1,5 +0,0 @@ -extends layout - -block content - h1= title - p= message diff --git a/node_modules/hapi/node_modules/vision/examples/jade/templates/includes/foot.jade b/node_modules/hapi/node_modules/vision/examples/jade/templates/includes/foot.jade deleted file mode 100755 index 9cb2279..0000000 --- a/node_modules/hapi/node_modules/vision/examples/jade/templates/includes/foot.jade +++ /dev/null @@ -1,2 +0,0 @@ -#footer - p hapi.js 2013 \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/examples/jade/templates/includes/head.jade b/node_modules/hapi/node_modules/vision/examples/jade/templates/includes/head.jade deleted file mode 100755 index defc566..0000000 --- a/node_modules/hapi/node_modules/vision/examples/jade/templates/includes/head.jade +++ /dev/null @@ -1,2 +0,0 @@ -head - script(src='//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js') \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/examples/jade/templates/index.jade b/node_modules/hapi/node_modules/vision/examples/jade/templates/index.jade deleted file mode 100755 index ac539de..0000000 --- a/node_modules/hapi/node_modules/vision/examples/jade/templates/index.jade +++ /dev/null @@ -1,5 +0,0 @@ -extends layout - -block content - h1= title - p= message diff --git a/node_modules/hapi/node_modules/vision/examples/jade/templates/layout.jade b/node_modules/hapi/node_modules/vision/examples/jade/templates/layout.jade deleted file mode 100755 index 9d46b1c..0000000 --- a/node_modules/hapi/node_modules/vision/examples/jade/templates/layout.jade +++ /dev/null @@ -1,5 +0,0 @@ -html - include includes/head - body - block content - include includes/foot \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/examples/mixed/index.js b/node_modules/hapi/node_modules/vision/examples/mixed/index.js deleted file mode 100755 index 925d7bf..0000000 --- a/node_modules/hapi/node_modules/vision/examples/mixed/index.js +++ /dev/null @@ -1,46 +0,0 @@ -// Load modules - -var Hapi = require('hapi'); - - -// Declare internals - -var internals = {}; - -var ctx = { - title: 'examples/views/mixed | Hapi ' + Hapi.version, - message: 'Hello World!' -}; - - -var oneHandler = function (request, reply) { - - reply.view('index.jade', ctx); -}; - -var twoHandler = function (request, reply) { - - reply.view('handlebars.html', ctx); -}; - - -internals.main = function () { - - var server = new Hapi.Server(); - server.connection({ port: 8000 }); - - server.views({ - engines: { - 'html': require('handlebars'), - 'jade': require('jade') - }, - path: __dirname + '/templates' - }); - - server.route({ method: 'GET', path: '/one', handler: oneHandler }); - server.route({ method: 'GET', path: '/two', handler: twoHandler }); - server.start(); -}; - - -internals.main(); diff --git a/node_modules/hapi/node_modules/vision/examples/mixed/templates/handlebars.html b/node_modules/hapi/node_modules/vision/examples/mixed/templates/handlebars.html deleted file mode 100755 index 8db62cf..0000000 --- a/node_modules/hapi/node_modules/vision/examples/mixed/templates/handlebars.html +++ /dev/null @@ -1,7 +0,0 @@ - - {{title}} - -

I am rendered with handlebars!

- Jade Version - - \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/examples/mixed/templates/index.jade b/node_modules/hapi/node_modules/vision/examples/mixed/templates/index.jade deleted file mode 100755 index dcd1c43..0000000 --- a/node_modules/hapi/node_modules/vision/examples/mixed/templates/index.jade +++ /dev/null @@ -1,4 +0,0 @@ -html - body - p "I am rendered with Jade" - a(href="/two") Handlebars Version \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/index.js b/node_modules/hapi/node_modules/vision/index.js deleted file mode 100755 index bb0a047..0000000 --- a/node_modules/hapi/node_modules/vision/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./lib'); diff --git a/node_modules/hapi/node_modules/vision/lib/index.js b/node_modules/hapi/node_modules/vision/lib/index.js deleted file mode 100755 index cb43258..0000000 --- a/node_modules/hapi/node_modules/vision/lib/index.js +++ /dev/null @@ -1,106 +0,0 @@ -// Load modules - -var Fs = require('fs'); -var Path = require('path'); -var Boom = require('boom'); -var Hoek = require('hoek'); -var Joi = require('joi'); -var Items = require('items'); -var Manager = require('./manager'); -// Additional helper modules required in constructor - - -// Declare internals - -var internals = {}; - - -internals.schema = Joi.alternatives([ - Joi.string(), - Joi.object({ - template: Joi.string(), - context: Joi.object(), - options: Joi.object() - }) -]); - - -exports.register = function (server, options, next) { - - server.decorate('server', 'views', function (options) { - - Hoek.assert(options, 'Missing views options'); - this.realm.plugins.vision = this.realm.plugins.vision || {}; - Hoek.assert(!this.realm.plugins.vision.manager, 'Cannot set views manager more than once'); - - if (!options.relativeTo && - this.realm.settings.files.relativeTo) { - - options = Hoek.shallow(options); - options.relativeTo = this.realm.settings.files.relativeTo; - } - - this.realm.plugins.vision.manager = new Manager(options); - }); - - server.decorate('server', 'render', function (template, context, options, callback) { - - callback = (typeof callback === 'function' ? callback : options); - options = (options === callback ? {} : options); - - var vision = (this.realm.plugins.vision || this.root.realm.plugins.vision || {}); - Hoek.assert(vision.manager, 'Missing views manager'); - return vision.manager.render(template, context, options, callback); - }); - - server.handler('view', internals.handler); - - server.decorate('reply', 'view', function (template, context, options) { - - var realm = (this.realm.plugins.vision || this.request.server.realm.plugins.vision || {}); - Hoek.assert(realm.manager, 'Cannot render view without a views manager configured'); - return this.response(realm.manager._response(template, context, options, this.request)); - }); - - return next(); -}; - -exports.register.attributes = { - pkg: require('../package.json') -}; - - -internals.handler = function (route, options) { - - Joi.assert(options, internals.schema, 'Invalid view handler options (' + route.path + ')'); - - if (typeof options === 'string') { - options = { template: options }; - } - - var settings = { // Shallow copy to allow making dynamic changes to context - template: options.template, - context: options.context, - options: options.options - }; - - return function (request, reply) { - - var context = { - params: request.params, - payload: request.payload, - query: request.query, - pre: request.pre - }; - - if (settings.context) { // Shallow copy to avoid cloning unknown objects - var keys = Object.keys(settings.context); - for (var i = 0, il = keys.length; i < il; ++i) { - var key = keys[i]; - context[key] = settings.context[key]; - } - } - - reply.view(settings.template, context, settings.options); - }; -}; diff --git a/node_modules/hapi/node_modules/vision/lib/manager.js b/node_modules/hapi/node_modules/vision/lib/manager.js deleted file mode 100755 index dc3aa29..0000000 --- a/node_modules/hapi/node_modules/vision/lib/manager.js +++ /dev/null @@ -1,504 +0,0 @@ -// Load modules - -var Fs = require('fs'); -var Path = require('path'); -var Boom = require('boom'); -var Hoek = require('hoek'); -var Joi = require('joi'); -var Items = require('items'); -// Additional helper modules required in constructor - - -// Declare internals - -var internals = {}; - - -internals.defaults = { - // defaultExtension: '', - // path: '', - // relativeTo: '', - compileOptions: {}, - runtimeOptions: {}, - layout: false, - layoutKeyword: 'content', - encoding: 'utf8', - isCached: true, - allowAbsolutePaths: false, - allowInsecureAccess: false, - // partialsPath: '', - contentType: 'text/html', - compileMode: 'sync', - context: null -}; - - -internals.schema = {}; - - -internals.schema.viewOverride = Joi.object({ - path: [Joi.array().includes(Joi.string()), Joi.string()], - relativeTo: Joi.string(), - compileOptions: Joi.object(), - runtimeOptions: Joi.object(), - layout: Joi.string().allow(false, true), - layoutKeyword: Joi.string(), - layoutPath: [Joi.array().includes(Joi.string()), Joi.string()], - encoding: Joi.string(), - allowAbsolutePaths: Joi.boolean(), - allowInsecureAccess: Joi.boolean(), - contentType: Joi.string() -}); - - -internals.schema.viewBase = internals.schema.viewOverride.keys({ - partialsPath: [Joi.array().includes(Joi.string()), Joi.string()], - helpersPath: [Joi.array().includes(Joi.string()), Joi.string()], - isCached: Joi.boolean(), - compileMode: Joi.string().valid('sync', 'async'), - defaultExtension: Joi.string() -}); - - -internals.schema.manager = internals.schema.viewBase.keys({ - engines: Joi.object().required(), - context: [Joi.object(), Joi.func()] -}); - - -internals.schema.view = internals.schema.viewBase.keys({ - module: Joi.object({ - compile: Joi.func().required() - }) - .options({ allowUnknown: true }) - .required() -}); - - -exports = module.exports = internals.Manager = function (options) { - - var self = this; - - Joi.assert(options, internals.schema.manager); - - // Save non-defaults values - - var engines = options.engines; - var defaultExtension = options.defaultExtension; - - // Clone options - - var defaults = Hoek.applyToDefaultsWithShallow(internals.defaults, options, ['engines', 'context']); - delete defaults.engines; - delete defaults.defaultExtension; - - // Prepare manager state - - var extensions = Object.keys(engines); - Hoek.assert(extensions.length, 'Views manager requires at least one registered extension handler'); - - this._context = defaults.context; - this._engines = {}; - this._defaultExtension = defaultExtension || (extensions.length === 1 ? extensions[0] : ''); - - // Load engines - - extensions.forEach(function (extension) { - - var config = engines[extension]; - var engine = {}; - - if (config.compile && - typeof config.compile === 'function') { - - engine.module = config; - engine.config = defaults; - } - else { - Joi.assert(config, internals.schema.view); - - engine.module = config.module; - engine.config = Hoek.applyToDefaultsWithShallow(defaults, config, ['module']); - } - - engine.suffix = '.' + extension; - engine.compileFunc = engine.module.compile; - - if (engine.config.compileMode === 'sync') { - engine.compileFunc = function (str, opt, next) { - - var compiled = null; - try { - compiled = engine.module.compile(str, opt); - } - catch (err) { - return next(err); - } - - var renderer = function (context, runtimeOptions, renderNext) { - - var rendered = null; - try { - rendered = compiled(context, runtimeOptions); - } - catch (err) { - return renderNext(err); - } - - return renderNext(null, rendered); - }; - - return next(null, renderer); - }; - } - - if (engine.config.isCached) { - engine.cache = {}; - } - - // Load partials and helpers - - self._loadPartials(engine); - self._loadHelpers(engine); - - // Set engine - - self._engines[extension] = engine; - }); -}; - - -internals.Manager.prototype._loadPartials = function (engine) { - - if (!engine.config.partialsPath || - !engine.module.registerPartial || - typeof engine.module.registerPartial !== 'function') { - - return; - } - - var load = function () { - - var partialsPaths = [].concat(engine.config.partialsPath); - - partialsPaths.forEach(function (partialsPath) { - - var path = internals.path(engine.config.relativeTo, partialsPath); - var files = traverse(path); - files.forEach(function (file) { - - var offset = path.slice(-1) === Path.sep ? 0 : 1; - var name = file.slice(path.length + offset, -engine.suffix.length).replace(/\\/g, '/'); - var src = Fs.readFileSync(file).toString(engine.config.encoding); - engine.module.registerPartial(name, src); - }); - }); - }; - - var traverse = function (path) { - - var files = []; - - Fs.readdirSync(path).forEach(function (file) { - - file = Path.join(path, file); - var stat = Fs.statSync(file); - if (stat.isDirectory()) { - files = files.concat(traverse(file)); - return; - } - - if (Path.basename(file)[0] !== '.' && - Path.extname(file) === engine.suffix) { - - files.push(file); - } - }); - - return files; - }; - - load(); -}; - - -internals.Manager.prototype._loadHelpers = function (engine) { - - if (!engine.config.helpersPath || - !engine.module.registerHelper || - typeof engine.module.registerHelper !== 'function') { - - return; - } - - var helpersPaths = [].concat(engine.config.helpersPath); - - helpersPaths.forEach(function (helpersPath) { - - var path = internals.path(engine.config.relativeTo, helpersPath); - if (!Hoek.isAbsolutePath(path)) { - path = Path.join(process.cwd(), path); - } - - Fs.readdirSync(path).forEach(function (file) { - - file = Path.join(path, file); - var stat = Fs.statSync(file); - if (!stat.isDirectory() && - Path.basename(file)[0] !== '.') { - - try { - var helper = require(file); - if (typeof helper === 'function') { - var offset = path.slice(-1) === Path.sep ? 0 : 1; - var name = file.slice(path.length + offset, -3); - engine.module.registerHelper(name, helper); - } - } - catch (err) { } - } - }); - }); -}; - - -internals.Manager.prototype.render = function (filename, context, options, callback) { - - var self = this; - - options = options || {}; - - if (this._context) { - var base = typeof this._context === 'function' ? this._context() : this._context; - if (context) { - base = Hoek.shallow(base); - var keys = Object.keys(context); - for (var i = 0, il = keys.length; i < il; ++i) { - var key = keys[i]; - base[key] = context[key]; - } - } - - context = base; - } - - context = context || {}; - - var engine = null; - - var fileExtension = Path.extname(filename).slice(1); - var extension = fileExtension || this._defaultExtension; - if (!extension) { - return callback(Boom.badImplementation('Unknown extension and no defaultExtension configured for view template: ' + filename)); - } - - engine = this._engines[extension]; - if (!engine) { - return callback(Boom.badImplementation('No view engine found for file: ' + filename)); - } - - var settings = Hoek.applyToDefaults(engine.config, options); - - this._path(filename + (fileExtension ? '' : engine.suffix), settings, false, function (err, templatePath) { - - if (err) { - return callback(err); - } - - self._compile(templatePath, engine, settings, function (err, compiled) { - - if (err) { - return callback(err); - } - - // No layout - - if (!settings.layout) { - compiled(context, settings.runtimeOptions, function (err, rendered) { - - if (err) { - return callback(Boom.badImplementation(err.message, err)); - } - - return callback(null, rendered, settings); - }); - - return; - } - - // With layout - - if (context.hasOwnProperty(settings.layoutKeyword)) { - return callback(Boom.badImplementation('settings.layoutKeyword conflict', { context: context, keyword: settings.layoutKeyword })); - } - - self._path((settings.layout === true ? 'layout' : settings.layout) + engine.suffix, settings, true, function (err, layoutPath) { - - if (err) { - return callback(err); - } - - self._compile(layoutPath, engine, settings, function (err, layout) { - - if (err) { - return callback(err); - } - - compiled(context, settings.runtimeOptions, function (err, rendered) { - - if (err) { - return callback(Boom.badImplementation(err.message, err)); - } - - context[settings.layoutKeyword] = rendered; - layout(context, settings.runtimeOptions, function (err, rendered) { - - delete context[settings.layoutKeyword]; - - if (err) { - return callback(Boom.badImplementation(err.message, err)); - } - - return callback(null, rendered, settings); - }); - }); - }); - }); - }); - }); -}; - - -internals.Manager.prototype._path = function (template, settings, isLayout, next) { - - // Validate path - - var isAbsolutePath = Hoek.isAbsolutePath(template); - var isInsecurePath = template.match(/\.\.\//g); - - if (!settings.allowAbsolutePaths && - isAbsolutePath) { - - return next(Boom.badImplementation('Absolute paths are not allowed in views')); - } - - if (!settings.allowInsecureAccess && - isInsecurePath) { - - return next(Boom.badImplementation('View paths cannot lookup templates outside root path (path includes one or more \'../\')')); - } - - // Resolve path and extension - - var paths; - if (isAbsolutePath) { - paths = [template]; - } - else { - paths = [].concat((isLayout && settings.layoutPath) || settings.path); - - for (var i = 0, il = paths.length; i < il; ++i) { - paths[i] = internals.path(settings.relativeTo, paths[i], template); - } - } - - Items.serial(paths, function (path, nextFile) { - - Fs.stat(path, function (err, stats) { - - if (!err && - stats.isFile()) { - - return next(null, path); - } - - return nextFile(); - }); - }, - function () { - - return next(Boom.badImplementation('View file not found: ' + template)); - }); -}; - - -internals.path = function (base, path, file) { - - if (path && - Hoek.isAbsolutePath(path)) { - - return Path.join(path, file || ''); - } - - return Path.join(base || '', path || '', file || ''); -}; - - -internals.Manager.prototype._compile = function (template, engine, settings, callback) { - - if (engine.cache && - engine.cache[template]) { - - return callback(null, engine.cache[template]); - } - - settings.compileOptions.filename = template; // Pass the template to Jade via this copy of compileOptions - - // Read file - - Fs.readFile(template, { encoding: settings.encoding }, function (err, data) { - - if (err) { - return callback(Boom.badImplementation('Failed to read view file: ' + template)); - } - - engine.compileFunc(data, settings.compileOptions, function (err, compiled) { - - if (err) { - return callback(Boom.wrap(err)); - } - - if (engine.cache) { - engine.cache[template] = compiled; - } - - return callback(null, compiled); - }); - }); -}; - - -internals.Manager.prototype._response = function (template, context, options, request) { - - Joi.assert(options, internals.schema.viewOverride); - - var source = { - manager: this, - template: template, - context: context, - options: options - }; - - return request.generateResponse(source, { variety: 'view', marshal: internals.marshal }); -}; - - -internals.marshal = function (response, callback) { - - var manager = response.source.manager; - - manager.render(response.source.template, response.source.context, response.source.options, function (err, rendered, config) { - - if (err) { - return callback(err); - } - - if (!response.headers['content-type']) { - response.type(config.contentType); - } - - response.encoding(config.encoding); - - return callback(null, rendered); - }); -}; diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/.npmignore b/node_modules/hapi/node_modules/vision/node_modules/joi/.npmignore deleted file mode 100644 index 2dfb3b9..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/.npmignore +++ /dev/null @@ -1,20 +0,0 @@ -.c9 -.idea -*.iml -npm-debug.log -dump.rdb -node_modules -results.tap -results.xml -npm-shrinkwrap.json -config.json -.DS_Store -*/.DS_Store -*/*/.DS_Store -._* -*/._* -*/*/._* -coverage.* -lib-cov -complexity.md -sandbox.js diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/.travis.yml b/node_modules/hapi/node_modules/vision/node_modules/joi/.travis.yml deleted file mode 100755 index afcae46..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/.travis.yml +++ /dev/null @@ -1,22 +0,0 @@ -# Travis optimizations, see http://docs.travis-ci.com/user/workers/container-based-infrastructure/ -sudo: false -cache: - directories: - - node_modules - -language: node_js - -node_js: - - "0.10" - - "0.11" - -deploy: - provider: npm - email: marsup@gmail.com - api_key: - secure: IuIigctAboFy2AGAcv/jUgRaVEQr23FX8ao+MM5fvmVpRZ/isHNQdJ2y1AAnCu5mCU+FgjNaXw/sB37J3Le5emMKhZMivXMTwAuLIbusEiQI6lzXflE7/+QK59jEcf/e5o6guTCf3CLMKo/yCrROYc/5sBuZuUqX2yDS6acGmZs= - on: - branch: master - tags: true - repo: hapijs/joi - node: "0.10" diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/CONTRIBUTING.md b/node_modules/hapi/node_modules/vision/node_modules/joi/CONTRIBUTING.md deleted file mode 100755 index 713d376..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/CONTRIBUTING.md +++ /dev/null @@ -1,14 +0,0 @@ -# How to contribute -We welcome contributions from the community and are pleased to have them. Please follow this guide when logging issues or making code changes. - -## Logging Issues -All issues should be created using the [new issue form](https://github.com/hapijs/joi/issues/new). Clearly describe the issue including steps to reproduce if there are any. Also, make sure to indicate the earliest version that has the issue being reported. - -## Patching Code -Code changes are welcome and should follow the guidelines below. - -* Fork the repository on GitHub. -* Fix the issue ensuring that your code follows the [style guide](https://github.com/hapijs/contrib/blob/master/Style.md). -* Add tests for your new code ensuring that you have 100% code coverage (we can help you reach 100% but will not merge without it). - * Run `npm test` to generate a report of test coverage -* [Pull requests](http://help.github.com/send-pull-requests/) should be made to the [master branch](https://github.com/hapijs/joi/tree/master). diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/LICENSE b/node_modules/hapi/node_modules/vision/node_modules/joi/LICENSE deleted file mode 100755 index 03afbde..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright (c) 2012-2014, Walmart and other contributors. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * The names of any contributors may not be used to endorse or promote - products derived from this software without specific prior written - permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - * * * - -The complete list of contributors can be found at: https://github.com/hapijs/joi/graphs/contributors \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/README.md b/node_modules/hapi/node_modules/vision/node_modules/joi/README.md deleted file mode 100755 index de221ba..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/README.md +++ /dev/null @@ -1,1240 +0,0 @@ -![joi Logo](https://raw.github.com/hapijs/joi/master/images/joi.png) - -Object schema description language and validator for JavaScript objects. - -[![npm version](https://badge.fury.io/js/joi.svg)](http://badge.fury.io/js/joi) -[![Build Status](https://secure.travis-ci.org/hapijs/joi.svg)](http://travis-ci.org/hapijs/joi) -[![Dependencies Status](https://david-dm.org/hapijs/joi.svg)](https://david-dm.org/hapijs/joi) -[![DevDependencies Status](https://david-dm.org/hapijs/joi/dev-status.svg)](https://david-dm.org/hapijs/joi#info=devDependencies) - -Lead Maintainer: [Nicolas Morel](https://github.com/marsup) - -## Table of Contents - - -- [Example](#example) -- [Usage](#usage) - - [`validate(value, schema, [options], [callback])`](#validatevalue-schema-options-callback) - - [`compile(schema)`](#compileschema) - - [`assert(value, schema, [message])`](#assertvalue-schema-message) - - [`any`](#any) - - [`any.allow(value)`](#anyallowvalue) - - [`any.valid(value)`](#anyvalidvalue) - - [`any.invalid(value)`](#anyinvalidvalue) - - [`any.required()`](#anyrequired) - - [`any.optional()`](#anyoptional) - - [`any.forbidden()`](#anyforbidden) - - [`any.description(desc)`](#anydescriptiondesc) - - [`any.notes(notes)`](#anynotesnotes) - - [`any.tags(tags)`](#anytagstags) - - [`any.meta(meta)`](#anymetameta) - - [`any.example(value)`](#anyexamplevalue) - - [`any.unit(name)`](#anyunitname) - - [`any.options(options)`](#anyoptionsoptions) - - [`any.strict()`](#anystrict) - - [`any.default(value)`](#anydefaultvalue) - - [`any.concat(schema)`](#anyconcatschema) - - [`any.when(ref, options)`](#anywhenref-options) - - [`any.label(name)`](#anylabelname) - - [`any.raw(isRaw)`](#anyrawisraw) - - [`array`](#array) - - [`array.sparse(enabled)`](#arraysparseenabled) - - [`array.includes(type)`](#arrayincludestype) - - [`array.excludes(type)`](#arrayexcludestype) - - [`array.min(limit)`](#arrayminlimit) - - [`array.max(limit)`](#arraymaxlimit) - - [`array.length(limit)`](#arraylengthlimit) - - [`array.unique()`](#arrayunique) - - [`binary`](#binary) - - [`binary.encoding(encoding)`](#binaryencodingencoding) - - [`binary.min(limit)`](#binaryminlimit) - - [`binary.max(limit)`](#binarymaxlimit) - - [`binary.length(limit)`](#binarylengthlimit) - - [`boolean()`](#boolean) - - [`date`](#date) - - [`date.min(date)`](#datemindate) - - [`date.max(date)`](#datemaxdate) - - [`date.format(format)`](#dateformatformat) - - [`date.iso()`](#dateiso) - - [`func`](#func) - - [`number`](#number) - - [`number.min(limit)`](#numberminlimit) - - [`number.max(limit)`](#numbermaxlimit) - - [`number.greater(limit)`](#numbergreaterlimit) - - [`number.less(limit)`](#numberlesslimit) - - [`number.integer()`](#numberinteger) - - [`number.precision(limit)`](#numberprecisionlimit) - - [`object`](#object) - - [`object.keys([schema])`](#objectkeysschema) - - [`object.min(limit)`](#objectminlimit) - - [`object.max(limit)`](#objectmaxlimit) - - [`object.length(limit)`](#objectlengthlimit) - - [`object.pattern(regex, schema)`](#objectpatternregex-schema) - - [`object.and(peers)`](#objectandpeers) - - [`object.nand(peers)`](#objectnandpeers) - - [`object.or(peers)`](#objectorpeers) - - [`object.xor(peers)`](#objectxorpeers) - - [`object.with(key, peers)`](#objectwithkey-peers) - - [`object.without(key, peers)`](#objectwithoutkey-peers) - - [`object.rename(from, to, [options])`](#objectrenamefrom-to-options) - - [`object.assert(ref, schema, [message])`](#objectassertref-schema-message) - - [`object.unknown([allow])`](#objectunknownallow) - - [`object.type(constructor, [name])`](#objecttypeconstructorname) - - [`object.requiredKeys(children)`](#objectrequiredkeyschildren) - - [`object.optionalKeys(children)`](#objectoptionalkeyschildren) - - [`string`](#string) - - [`string.insensitive()`](#stringinsensitive) - - [`string.min(limit, [encoding])`](#stringminlimit-encoding) - - [`string.max(limit, [encoding])`](#stringmaxlimit-encoding) - - [`string.creditCard()`](#stringcreditCard) - - [`string.length(limit, [encoding])`](#stringlengthlimit-encoding) - - [`string.regex(pattern, [name])`](#stringregexpattern-name) - - [`string.alphanum()`](#stringalphanum) - - [`string.token()`](#stringtoken) - - [`string.email()`](#stringemail) - - [`string.guid()`](#stringguid) - - [`string.hostname()`](#stringhostname) - - [`string.lowercase()`](#stringlowercase) - - [`string.uppercase()`](#stringuppercase) - - [`string.trim()`](#stringtrim) - - [`alternatives`](#alternatives) - - [`alternatives.try(schemas)`](#alternativestryschemas) - - [`alternatives.when(ref, options)`](#alternativeswhenref-options) - - [`ref(key, [options])`](#refkey-options) - -# Example - -```javascript -var Joi = require('joi'); - -var schema = Joi.object().keys({ - username: Joi.string().alphanum().min(3).max(30).required(), - password: Joi.string().regex(/[a-zA-Z0-9]{3,30}/), - access_token: [Joi.string(), Joi.number()], - birthyear: Joi.number().integer().min(1900).max(2013), - email: Joi.string().email() -}).with('username', 'birthyear').without('password', 'access_token'); - -Joi.validate({ username: 'abc', birthyear: 1994 }, schema, function (err, value) { }); // err === null -> valid -``` - -The above schema defines the following constraints: -* `username` - * a required string - * must contain only alphanumeric characters - * at least 3 characters long but no more than 30 - * must be accompanied by `birthyear` -* `password` - * an optional string - * must satisfy the custom regex - * cannot appear together with `access_token` -* `access_token` - * an optional, unconstrained string or number -* `birthyear` - * an integer between 1900 and 2013 -* `email` - * a valid email address string - -# Usage - -Usage is a two steps process. First, a schema is constructed using the provided types and constraints: - -```javascript -var schema = { - a: Joi.string() -}; -``` - -Note that **joi** schema objects are immutable which means every additional rule added (e.g. `.min(5)`) will return a -new schema object. - -Then the value is validated against the schema: - -```javascript -Joi.validate({ a: 'a string' }, schema, function (err, value) { }); -``` - -If the value is valid, `null` is returned, otherwise an `Error` object. - -The schema can be a plain JavaScript object where every key is assigned a **joi** type, or it can be a **joi** type directly: - -```javascript -var schema = Joi.string().min(10); -``` - -If the schema is a **joi** type, the `schema.validate(value, callback)` can be called directly on the type. When passing a non-type schema object, -the module converts it internally to an object() type equivalent to: - -```javascript -var schema = Joi.object().keys({ - a: Joi.string() -}); -``` - -When validating a schema: -* Keys are optional by default. -* Strings are utf-8 encoded by default. -* Rules are defined in an additive fashion and evaluated in order after whitelist and blacklist checks. - -### `validate(value, schema, [options], [callback])` - -Validates a value using the given schema and options where: -- `value` - the value being validated. -- `schema` - the validation schema. Can be a **joi** type object or a plain object where every key is assigned a **joi** type object. -- `options` - an optional object with the following optional keys: - - `abortEarly` - when `true`, stops validation on the first error, otherwise returns all the errors found. Defaults to `true`. - - `convert` - when `true`, attempts to cast values to the required types (e.g. a string to a number). Defaults to `true`. - - `allowUnknown` - when `true`, allows object to contain unknown keys which are ignored. Defaults to `false`. - - `skipFunctions` - when `true`, ignores unknown keys with a function value. Defaults to `false`. - - `stripUnknown` - when `true`, unknown keys are deleted (only when value is an object). Defaults to `false`. - - `language` - overrides individual error messages, when `'label'` is set, it overrides the key name in the error message. Defaults to no override (`{}`). - - `presence` - sets the default presence requirements. Supported modes: `'optional'`, `'required'`, and `'forbidden'`. - Defaults to `'optional'`. - - `context` - provides an external data set to be used in [references](#refkey-options). Can only be set as an external option to - `validate()` and not using `any.options()`. -- `callback` - the optional synchronous callback method using the signature `function(err, value)` where: - - `err` - if validation failed, the error reason, otherwise `null`. - - `value` - the validated value with any type conversions and other modifiers applied (the input is left unchanged). `value` can be - incomplete if validation failed and `abortEarly` is `true`. If callback is not provided, then returns an object with error - and value properties. - -```javascript -var schema = { - a: Joi.number() -}; - -var value = { - a: '123' -}; - -Joi.validate(value, schema, function (err, value) { }); -// err -> null -// value.a -> 123 (number, not string) - -// or -var result = Joi.validate(value, schema); -// result.error -> null -// result.value -> { "a" : 123 } -``` - -### `compile(schema)` - -Converts literal schema definition to **joi** schema object (or returns the same back if already a **joi** schema object) where: -- `schema` - the schema definition to compile. - -```javascript -var definition = ['key', 5, { a: true, b: [/^a/, 'boom'] }]; -var schema = Joi.compile(definition); - -// Same as: - -var schema = Joi.alternatives().try([ - Joi.string().valid('key'), - Joi.number().valid(5), - Joi.object().keys({ - a: Joi.boolean().valid(true), - b: Joi.alternatives().try([ - Joi.string().regex(/^a/), - Joi.string().valid('boom') - ]) - }) -]); -``` - -### `assert(value, schema, [message])` - -Validates a value against a schema and throws if validation fails where: -- `value` - the value to validate. -- `schema` - the schema object. -- `message` - optional message sting prefix added in front of the error message. - -```javascript -Joi.assert('x', Joi.number()); -``` - -### `any` - -Generates a schema object that matches any data type. - -```javascript -var any = Joi.any(); -any.validate('a', function (err, value) { }); -``` - -#### `any.allow(value)` - -Whitelists a value where: -- `value` - the allowed value which can be of any type and will be matched against the validated value before applying any other rules. - `value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options). - -```javascript -var schema = { - a: Joi.any().allow('a'), - b: Joi.any().allow('b', 'B'), - c: Joi.any().allow(['c', 'C']) -}; -``` - -#### `any.valid(value)` - -Adds the provided values into the allowed whitelist and marks them as the only valid values allowed where: -- `value` - the allowed value which can be of any type and will be matched against the validated value before applying any other rules. - `value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options). - -```javascript -var schema = { - a: Joi.any().valid('a'), - b: Joi.any().valid('b', 'B'), - c: Joi.any().valid(['c', 'C']) -}; -``` - -#### `any.invalid(value)` - -Blacklists a value where: -- `value` - the forbidden value which can be of any type and will be matched against the validated value before applying any other rules. - `value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options). - -```javascript -var schema = { - a: Joi.any().invalid('a'), - b: Joi.any().invalid('b', 'B'), - c: Joi.any().invalid(['c', 'C']) -}; -``` - -#### `any.required()` - -Marks a key as required which will not allow `undefined` as value. All keys are optional by default. - -```javascript -var schema = Joi.any().required(); -``` - -#### `any.optional()` - -Marks a key as optional which will allow `undefined` as values. Used to annotate the schema for readability as all keys are optional by default. - -```javascript -var schema = Joi.any().optional(); -``` - -#### `any.forbidden()` - -Marks a key as forbidden which will not allow any value except `undefined`. Used to explicitly forbid keys. - -```javascript -var schema = { - a: Joi.any().forbidden() -}; -``` - -#### `any.description(desc)` - -Annotates the key where: -- `desc` - the description string. - -```javascript -var schema = Joi.any().description('this key will match anything you give it'); -``` - -#### `any.notes(notes)` - -Annotates the key where: -- `notes` - the notes string or array of strings. - -```javascript -var schema = Joi.any().notes(['this is special', 'this is important']); -``` - -#### `any.tags(tags)` - -Annotates the key where: -- `tags` - the tag string or array of strings. - -```javascript -var schema = Joi.any().tags(['api', 'user']); -``` - -#### `any.meta(meta)` - -Attaches metadata to the key where: -- `meta` - the meta object to attach. - -```javascript -var schema = Joi.any().meta({ index: true }); -``` - -#### `any.example(value)` - -Annotates the key where: -- `value` - an example value. - -If the example fails to pass validation, the function will throw. - -```javascript -var schema = Joi.string().min(4).example('abcd'); -``` - -#### `any.unit(name)` - -Annotates the key where: -- `name` - the unit name of the value. - -```javascript -var schema = Joi.number().unit('milliseconds'); -``` - -#### `any.options(options)` - -Overrides the global `validate()` options for the current key and any sub-key where: -- `options` - an object with the same optional keys as [`Joi.validate(value, schema, options, callback)`](#joivalidatevalue-schema-options-callback). - -```javascript -var schema = Joi.any().options({ convert: false }); -``` - -#### `any.strict()` - -Sets the `options.convert` options to `false` which prevent type casting for the current key and any child keys. - -```javascript -var schema = Joi.any().strict(); -``` - -#### `any.default(value)` - -Sets a default value if the original value is undefined where: -- `value` - the value. `value` supports [references](#refkey-options). - -Note that if `value` is an object, any changes to the object after `default()` is called will change the reference -and any future assignment. - -```javascript -var schema = { - username: Joi.string().default('new_user') -}; -Joi.validate({}, schema, function (err, value) { }); -// value === { username: "new_user" } -``` - -#### `any.concat(schema)` - -Returns a new type that is the result of adding the rules of one type to another where: -- `schema` - a **joi** type to merge into the current schema. Can only be of the same type as the context type or `any`. - -```javascript -var a = Joi.string().valid('a'); -var b = Joi.string().valid('b'); -var ab = a.concat(b); -``` - -#### `any.when(ref, options)` - -Converts the type into an [`alternatives`](#alternatives) type where the conditions are merged into the type definition where: -- `ref` - the key name or [reference](#refkey-options). -- `options` - an object with: - - `is` - the required condition **joi** type. - - `then` - the alternative schema type if the condition is true. Required if `otherwise` is missing. - - `otherwise` - the alternative schema type if the condition is false. Required if `then` is missing. - -```javascript -var schema = { - a: Joi.any().valid('x').when('b', { is: 5, then: Joi.valid('y'), otherwise: Joi.valid('z') }), - b: Joi.any() -}; -``` - -Alternatively, if you want to specify a specific type such as `string`, `array`, etc, you can do so like this: - -```javascript -var schema = { - a: Joi.valid('a', 'b', 'other'), - other: Joi.string() - .when('a', { is: 'other', then: Joi.required() }), -}; -``` - -#### `any.label(name)` - -Overrides the key name in error messages. -- `name` - the name of the key. - -```javascript -var schema = { - first_name: Joi.string().label('First Name') -}; -``` - -#### `any.raw(isRaw)` - -Outputs the original untouched value instead of the casted value. -- `isRaw` - whether to enable raw mode or not. Defaults to true. - -```javascript -var schema = { - timestamp: Joi.date().format('YYYYMMDD').raw() -}; -``` - -### `array` - -Generates a schema object that matches an array data type. Note that undefined values inside arrays are not allowed by default but can be by using `sparse()`. - -Supports the same methods of the [`any()`](#any) type. - -```javascript -var array = Joi.array().includes(Joi.string().valid('a', 'b')); -array.validate(['a', 'b', 'a'], function (err, value) { }); -``` - -#### `array.sparse(enabled)` - -Allow this array to be sparse. `enabled` can be used with a falsy value to go back to the default behavior. - -```javascript -var schema = Joi.array().sparse(); // undefined values are now allowed -schema = schema.sparse(false); // undefined values are now denied -``` - -#### `array.single(enabled)` - -Allow single values to be checked against rules as if it were provided as an array. - -`enabled` can be used with a falsy value to go back to the default behavior. - -```javascript -var schema = Joi.array().includes(Joi.number()).single(); -schema.validate([4]); // returns `{ error: null, value: [ 4 ] }` -schema.validate(4); // returns `{ error: null, value: [ 4 ] }` -``` - -#### `array.includes(type)` - -List the types allowed for the array values where: -- `type` - a **joi** schema object to validate each array item against. `type` can be an array of values, or multiple values can be passed as individual arguments. - -```javascript -var schema = Joi.array().includes(Joi.string(), Joi.number()); -``` - -#### `array.excludes(type)` - -List the types forbidden for the array values where: -- `type` - a **joi** schema object to validate each array item against. `type` can be an array of values, or multiple values can be passed as individual arguments. - -```javascript -var schema = Joi.array().excludes(Joi.object()); -``` - -#### `array.min(limit)` - -Specifies the minimum number of items in the array where: -- `limit` - the lowest number of array items allowed. - -```javascript -var schema = Joi.array().min(2); -``` - -#### `array.max(limit)` - -Specifies the maximum number of items in the array where: -- `limit` - the highest number of array items allowed. - -```javascript -var schema = Joi.array().max(10); -``` - -#### `array.length(limit)` - -Specifies the exact number of items in the array where: -- `limit` - the number of array items allowed. - -```javascript -var schema = Joi.array().length(5); -``` - -#### `array.unique()` - -Requires the array values to be unique. - -Be aware that a deep equality is performed on elements of the array having a type of `object`, a performance penalty is to be expected for this kind of operation. - -```javascript -var schema = Joi.array().unique(); -``` - -### `boolean` - -Generates a schema object that matches a boolean data type (as well as the strings 'true', 'false', 'yes', and 'no'). Can also be called via `bool()`. - -Supports the same methods of the [`any()`](#any) type. - -```javascript -var boolean = Joi.boolean(); -boolean.validate(true, function (err, value) { }); -``` - -### `binary` - -Generates a schema object that matches a Buffer data type (as well as the strings which will be converted to Buffers). - -Supports the same methods of the [`any()`](#any) type. - -```javascript -var schema = Joi.binary(); -``` - -#### `binary.encoding(encoding)` - -Sets the string encoding format if a string input is converted to a buffer where: -- `encoding` - the encoding scheme. - -```javascript -var schema = Joi.binary().encoding('base64'); -``` - -#### `binary.min(limit)` - -Specifies the minimum length of the buffer where: -- `limit` - the lowest size of the buffer. - -```javascript -var schema = Joi.binary().min(2); -``` - -#### `binary.max(limit)` - -Specifies the maximum length of the buffer where: -- `limit` - the highest size of the buffer. - -```javascript -var schema = Joi.binary().max(10); -``` - -#### `binary.length(limit)` - -Specifies the exact length of the buffer: -- `limit` - the size of buffer allowed. - -```javascript -var schema = Joi.binary().length(5); -``` - -### `date` - -Generates a schema object that matches a date type (as well as a JavaScript date string or number of milliseconds). - -Supports the same methods of the [`any()`](#any) type. - -```javascript -var date = Joi.date(); -date.validate('12-21-2012', function (err, value) { }); -``` - -#### `date.min(date)` - -Specifies the oldest date allowed where: -- `date` - the oldest date allowed. - -```javascript -var schema = Joi.date().min('1-1-1974'); -``` - -Notes: `'now'` can be passed in lieu of `date` so as to always compare relatively to the current date, allowing to explicitly ensure a date is either in the past or in the future. - -```javascript -var schema = Joi.date().min('now'); -``` - -It can also be a reference to another field. - -```javascript -var schema = Joi.object({ - from: Joi.date().required(), - to: Joi.date().min(Joi.ref('from')).required() -}); -``` - -#### `date.max(date)` - -Specifies the latest date allowed where: -- `date` - the latest date allowed. - -```javascript -var schema = Joi.date().max('12-31-2020'); -``` - -Notes: `'now'` can be passed in lieu of `date` so as to always compare relatively to the current date, allowing to explicitly ensure a date is either in the past or in the future. - -```javascript -var schema = Joi.date().max('now'); -``` - -It can also be a reference to another field. - -```javascript -var schema = Joi.object({ - from: Joi.date().max(Joi.ref('to')).required(), - to: Joi.date().required() -}); -``` - -#### `date.format(format)` - -Specifies the allowed date format: -- `format` - string or array of strings that follow the `moment.js` [format](http://momentjs.com/docs/#/parsing/string-format/). - -```javascript -var schema = Joi.date().format('YYYY/MM/DD'); -``` - -#### `date.iso()` - -Requires the string value to be in valid ISO 8601 date format. - -```javascript -var schema = Joi.date().iso(); -``` - -### `func` - -Generates a schema object that matches a function type. - -Supports the same methods of the [`any()`](#any) type. - -```javascript -var func = Joi.func(); -func.validate(function () {}, function (err, value) { }); -``` - -### `number` - -Generates a schema object that matches a number data type (as well as strings that can be converted to numbers). - -`Infinity` and `-Infinity` are invalid by default, you can change that behavior by calling `allow(Infinity, -Infinity)`. - -Supports the same methods of the [`any()`](#any) type. - -```javascript -var number = Joi.number(); -number.validate(5, function (err, value) { }); -``` - -#### `number.min(limit)` - -Specifies the minimum value where: -- `limit` - the minimum value allowed. - -```javascript -var schema = Joi.number().min(2); -``` - -#### `number.max(limit)` - -Specifies the maximum value where: -- `limit` - the maximum value allowed. - -```javascript -var schema = Joi.number().max(10); -``` - -#### `number.greater(limit)` - -Specifies that the value must be greater than `limit`. - -```javascript -var schema = Joi.number().greater(5); -``` - -#### `number.less(limit)` - -Specifies that the value must be less than `limit`. - -```javascript -var schema = Joi.number().less(10); -``` - -#### `number.integer()` - -Requires the number to be an integer (no floating point). - -```javascript -var schema = Joi.number().integer(); -``` - -#### `number.precision(limit)` - -Specifies the maximum number of decimal places where: -- `limit` - the maximum number of decimal places allowed. - -```javascript -var schema = Joi.number().precision(2); -``` - -### `object` - -Generates a schema object that matches an object data type (as well as JSON strings that parsed into objects). Defaults -to allowing any child key. - -Supports the same methods of the [`any()`](#any) type. - -```javascript -var object = Joi.object().keys({ - a: Joi.number().min(1).max(10).integer(), - b: 'some string' -}); - -object.validate({ a: 5 }, function (err, value) { }); -``` - -#### `object.keys([schema])` - -Sets or extends the allowed object keys where: -- `schema` - optional object where each key is assigned a **joi** type object. If `schema` is `{}` no keys allowed. - If `schema` is `null` or `undefined`, any key allowed. If `schema` is an object with keys, the keys are added to any - previously defined keys (but narrows the selection if all keys previously allowed). Defaults to 'undefined' which - allows any child key. - -```javascript -var base = Joi.object().keys({ - a: Joi.number(), - b: Joi.string() -}); -// Validate keys a, b and c. -var extended = base.keys({ - c: Joi.boolean() -}); -``` - -#### `object.min(limit)` - -Specifies the minimum number of keys in the object where: -- `limit` - the lowest number of keys allowed. - -```javascript -var schema = Joi.object().min(2); -``` - -#### `object.max(limit)` - -Specifies the maximum number of keys in the object where: -- `limit` - the highest number of object keys allowed. - -```javascript -var schema = Joi.object().max(10); -``` - -#### `object.length(limit)` - -Specifies the exact number of keys in the object where: -- `limit` - the number of object keys allowed. - -```javascript -var schema = Joi.object().length(5); -``` - -#### `object.pattern(regex, schema)` - -Specify validation rules for unknown keys matching a pattern where: -- `regex` - a regular expression tested against the unknown key names. -- `schema` - the schema object matching keys much validate against. - -```javascrip -var schema = Joi.object({ - a: Joi.string() -}).pattern(/\w\d/, Joi.boolean()); -``` - -#### `object.and(peers)` - -Defines an all-or-nothing relationship between keys where if one of the peers is present, all of them are required as -well where: -- `peers` - the key names of which if one present, all are required. `peers` can be a single string value, an - array of string values, or each peer provided as an argument. - -```javascript -var schema = Joi.object().keys({ - a: Joi.any(), - b: Joi.any() -}).and('a', 'b'); -``` - -#### `object.nand(peers)` - -Defines a relationship between keys where not all peers can be present at the -same time where: -- `peers` - the key names of which if one present, the others may not all be present. `peers` can be a single string value, an - array of string values, or each peer provided as an argument. - -```javascript -var schema = Joi.object().keys({ - a: Joi.any(), - b: Joi.any() -}).nand('a', 'b'); -``` - -#### `object.or(peers)` - -Defines a relationship between keys where one of the peers is required (and more than one is allowed) where: -- `peers` - the key names of which at least one must appear. `peers` can be a single string value, an - array of string values, or each peer provided as an argument. - -```javascript -var schema = Joi.object().keys({ - a: Joi.any(), - b: Joi.any() -}).or('a', 'b'); -``` - -#### `object.xor(peers)` - -Defines an exclusive relationship between a set of keys where one of them is required but not at the same time where: -- `peers` - the exclusive key names that must not appear together but where one of them is required. `peers` can be a single string value, an - array of string values, or each peer provided as an argument. - -```javascript -var schema = Joi.object().keys({ - a: Joi.any(), - b: Joi.any() -}).xor('a', 'b'); -``` - -#### `object.with(key, peers)` - -Requires the presence of other keys whenever the specified key is present where: -- `key` - the reference key. -- `peers` - the required peer key names that must appear together with `key`. `peers` can be a single string value or an array of string values. - -Note that unlike [`object.and()`](#objectandpeers), `with()` creates a dependency only between the `key` and each of the `peers`, not -between the `peers` themselves. - -```javascript -var schema = Joi.object().keys({ - a: Joi.any(), - b: Joi.any() -}).with('a', 'b'); -``` - -#### `object.without(key, peers)` - -Forbids the presence of other keys whenever the specified is present where: -- `key` - the reference key. -- `peers` - the forbidden peer key names that must not appear together with `key`. `peers` can be a single string value or an array of string values. - -```javascript -var schema = Joi.object().keys({ - a: Joi.any(), - b: Joi.any() -}).without('a', ['b']); -``` - -#### `object.rename(from, to, [options])` - -Renames a key to another name (deletes the renamed key) where: -- `from` - the original key name. -- `to` - the new key name. -- `options` - an optional object with the following optional keys: - - `alias` - if `true`, does not delete the old key name, keeping both the new and old keys in place. Defaults to `false`. - - `multiple` - if `true`, allows renaming multiple keys to the same destination where the last rename wins. Defaults to `false`. - - `override` - if `true`, allows renaming a key over an existing key. Defaults to `false`. - -Keys are renamed before any other validation rules are applied. - -```javascript -var object = Joi.object().keys({ - a: Joi.number() -}).rename('b', 'a'); - -object.validate({ b: 5 }, function (err, value) { }); -``` - -#### `object.assert(ref, schema, [message])` - -Verifies an assertion where: -- `ref` - the key name or [reference](#refkey-options). -- `schema` - the validation rules required to satisfy the assertion. If the `schema` includes references, they are resolved against - the object value, not the value of the `ref` target. -- `message` - optional human-readable message used when the assertion fails. Defaults to 'failed to pass the assertion test'. - -```javascript -var schema = Joi.object().keys({ - a: { - b: Joi.string(), - c: Joi.number() - }, - d: { - e: Joi.any() - } -}).assert('d.e', Joi.ref('a.c'), 'equal to a.c'); -``` - -#### `object.unknown([allow])` - -Overrides the handling of unknown keys for the scope of the current object only (does not apply to children) where: -- `allow` - if `false`, unknown keys are not allowed, otherwise unknown keys are ignored. - -```javascript -var schema = Joi.object({ a: Joi.any() }).unknown(); -``` - -#### `object.type(constructor, [name])` - -Requires the object to be an instance of a given constructor where: -- `constructor` - the constructor function that the object must be an instance of. -- `name` - an alternate name to use in validation errors. This is useful when the constructor function does not have a name. - -```javascript -var schema = Joi.object().type(RegExp); -``` - -#### `object.requiredKeys(children)` - -Sets the specified children to required. -- `children` - can be a single string value, an array of string values, or each child provided as an argument. - -```javascript -var schema = Joi.object().keys({ a: { b: Joi.number() }, c: { d: Joi.string() } }); -var requiredSchema = schema.requiredKeys('', 'a.b', 'c', 'c.d'); -``` - -Note that in this example `''` means the current object, `a` is not required but `b` is, as well as `c` and `d`. - -#### `object.optionalKeys(children)` - -Sets the specified children to optional. -- `children` - can be a single string value, an array of string values, or each child provided as an argument. - -```javascript -var schema = Joi.object().keys({ a: { b: Joi.number().required() }, c: { d: Joi.string().required() } }); -var requiredSchema = schema.optionalKeys('a.b', 'c.d'); -``` - -The behavior is exactly the same as `requiredKeys`. - -### `string` - -Generates a schema object that matches a string data type. Note that empty strings are not allowed by default and must be enabled with `allow('')`. - -Supports the same methods of the [`any()`](#any) type. - -```javascript -var schema = Joi.string().min(1).max(10); -schema.validate('12345', function (err, value) { }); -``` - -#### `string.insensitive()` - -Allows the value to match any whitelist of blacklist item in a case insensitive comparison. - -```javascript -var schema = Joi.string().valid('a').insensitive(); -``` - -#### `string.min(limit, [encoding])` - -Specifies the minimum number string characters where: -- `limit` - the minimum number of string characters required. -- `encoding` - is specified, the string length is calculated in bytes using the provided encoding. - -```javascript -var schema = Joi.string().min(2); -``` - -#### `string.max(limit, [encoding])` - -Specifies the maximum number of string characters where: -- `limit` - the maximum number of string characters allowed. -- `encoding` - is specified, the string length is calculated in bytes using the provided encoding. - -```javascript -var schema = Joi.string().max(10); -``` - -#### `string.creditCard()` - -Requires the number to be a credit card number (Using [Lunh -Algorithm](http://en.wikipedia.org/wiki/Luhn_algorithm)). - -```javascript -var schema = Joi.string().creditCard(); -``` - -#### `string.length(limit, [encoding])` - -Specifies the exact string length required where: -- `limit` - the required string length. -- `encoding` - is specified, the string length is calculated in bytes using the provided encoding. - -```javascript -var schema = Joi.string().length(5); -``` - -#### `string.regex(pattern, [name])` - -Defines a regular expression rule where: -- `pattern` - a regular expression object the string value must match against. -- `name` - optional name for patterns (useful with multiple patterns). Defaults to 'required'. - -```javascript -var schema = Joi.string().regex(/^[abc]+$/); -``` - -#### `string.alphanum()` - -Requires the string value to only contain a-z, A-Z, and 0-9. - -```javascript -var schema = Joi.string().alphanum(); -``` - -#### `string.token()` - -Requires the string value to only contain a-z, A-Z, 0-9, and underscore _. - -```javascript -var schema = Joi.string().token(); -``` - -#### `string.email()` - -Requires the string value to be a valid email address. - -```javascript -var schema = Joi.string().email(); -``` - -#### `string.guid()` - -Requires the string value to be a valid GUID. - -```javascript -var schema = Joi.string().guid(); -``` - -#### `string.hostname()` - -Requires the string value to be a valid hostname as per [RFC1123](http://tools.ietf.org/html/rfc1123). - -```javascript -var schema = Joi.string().hostname(); -``` - -#### `string.lowercase()` - -Requires the string value to be all lowercase. If the validation `convert` option is on (enabled by default), the string -will be forced to lowercase. - -```javascript -var schema = Joi.string().lowercase(); -``` - -#### `string.uppercase()` - -Requires the string value to be all uppercase. If the validation `convert` option is on (enabled by default), the string -will be forced to uppercase. - -```javascript -var schema = Joi.string().uppercase(); -``` - -#### `string.trim()` - -Requires the string value to contain no whitespace before or after. If the validation `convert` option is on (enabled by -default), the string will be trimmed. - -```javascript -var schema = Joi.string().trim(); -``` - -### `alternatives` - -Generates a type that will match one of the provided alternative schemas via the [`try()`](#alternativestryschemas) -method. If no schemas are added, the type will not match any value except for `undefined`. - -Supports the same methods of the [`any()`](#any) type. - -Alternatives can be expressed using the shorter `[]` notation. - -```javascript -var alt = Joi.alternatives().try(Joi.number(), Joi.string()); -// Same as [Joi.number(), Joi.string()] -``` - -#### `alternatives.try(schemas)` - -Adds an alternative schema type for attempting to match against the validated value where: -- `schema` - an array of alternative **joi** types. Also supports providing each type as a separate argument. - -```javascript -var alt = Joi.alternatives().try(Joi.number(), Joi.string()); -alt.validate('a', function (err, value) { }); -``` - -#### `alternatives.when(ref, options)` - -Adds a conditional alternative schema type based on another key (not the same as `any.when()`) value where: -- `ref` - the key name or [reference](#refkey-options). -- `options` - an object with: - - `is` - the required condition **joi** type. - - `then` - the alternative schema type to **try** if the condition is true. Required if `otherwise` is missing. - - `otherwise` - the alternative schema type to **try** if the condition is false. Required if `then` is missing. - -```javascript -var schema = { - a: Joi.alternatives().when('b', { is: 5, then: Joi.string(), otherwise: Joi.number() }), - b: Joi.any() -}; -``` - -Note that `when()` only adds additional alternatives to try and does not impact the overall type. Setting -a `required()` rule on a single alternative will not apply to the overall key. For example, -this definition of `a`: - -```javascript -var schema = { - a: Joi.alternatives().when('b', { is: true, then: Joi.required() }), - b: Joi.boolean() -}; -``` - -Does not turn `a` into a required key when `b` is `true`. Instead, it tells the validator to try and match the -value to anything that's not `undefined`. However, since `Joi.alternatives()` by itself allows `undefined`, the rule -does not accomplish turning `a` to a required value. This rule is the same as `Joi.alternatives([Joi.required()])` -when `b` is `true` which will allow any value including `undefined`. - -To accomplish the desired result above use: - -```javascript -var schema = { - a: Joi.when('b', { is: true, then: Joi.required() }), - b: Joi.boolean() -}; -``` - -### `ref(key, [options])` - -Generates a reference to the value of the named key. References are resolved at validation time and in order of dependency -so that if one key validation depends on another, the dependent key is validated second after the reference is validated. -References support the following arguments: -- `key` - the reference target. References cannot point up the object tree, only to sibling keys, but they can point to - their siblings' children (e.g. 'a.b.c') using the `.` separator. If a `key` starts with `$` is signifies a context reference - which is looked up in the `context` option object. -- `options` - optional settings: - - `separator` - overrides the default `.` hierarchy separator. - - `contextPrefix` - overrides the default `$` context prefix signifier. - -Note that references can only be used where explicitly supported such as in `valid()` or `invalid()` rules. If upwards -(parents) references are needed, use [`object.assert()`](#objectassertref-schema-message). - -```javascript -var schema = Joi.object().keys({ - a: Joi.ref('b.c'), - b: { - c: Joi.any() - }, - c: Joi.ref('$x') -}); - -Joi.validate({ a: 5, b: { c: 5 } }, schema, { context: { x: 5 } }, function (err, value) {}); -``` diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/examples/conditionalRequire.js b/node_modules/hapi/node_modules/vision/node_modules/joi/examples/conditionalRequire.js deleted file mode 100644 index 8ed0a6a..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/examples/conditionalRequire.js +++ /dev/null @@ -1,43 +0,0 @@ -// This is an example of a survey to obtain the reputation of Parisians -// It contains examples of how to conditionally require keys based on values of other keys - -var Joi = require("../"); - -// This is a valid value for integer rating 1 - 5 -var intRating = Joi.number().integer().min(1).max(5); - -var schema = Joi.object().keys({ - // Do you know any French people? yes or no (required) - q1: Joi.boolean().required(), - // Do you know any Parisians? yes or no (required if answered yes in q1) - q2: Joi.boolean() - .when('q1', { is: true, then: Joi.required() }), - // How many french in paris do you know? 1-6, 6-10, 11-50 or 50+ (required if answered yes in q2) - q3: Joi.string() - .when('q2', { is: true, then: Joi.valid('1-5', '6-10', '11-50', '50+').required() }), - // Rate 20% of most friendly Parisians, from how many people you know answered in q3, individually on 1-5 rating - q4: Joi.array() - .when('q3', {is: '1-5', then: Joi.array().min(0).max(1).includes(intRating).required() }) - .when('q3', {is: '6-10', then: Joi.array().min(1).max(2).includes(intRating).required() }) - .when('q3', {is: '11-50', then: Joi.array().min(2).max(10).includes(intRating).required() }) - .when('q3', {is: '50+' , then: Joi.array().min(10).includes(intRating).required() }), - // Rate remaining 80% of Parisians, from how many people you know answered in q3, individually on 1-5 rating - q5: Joi.array() - .when('q3', {is: '1-5', then: Joi.array().min(1).max(4).includes(intRating).required() }) - .when('q3', {is: '6-10', then: Joi.array().min(4).max(8).includes(intRating).required() }) - .when('q3', {is: '11-50', then: Joi.array().min(8).max(40).includes(intRating).required() }) - .when('q3', {is: '50+' , then: Joi.array().min(40).includes(intRating).required().required() }), - // Rate the reputation of Parisians in general, 1-5 rating - q6: intRating.required() -}); - -var response = { - q1: true, - q2: true, - q3: '1-5', - q4: [5], - q4: [1], - q6: 2 -}; - -Joi.assert(response, schema); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/examples/customMessage.js b/node_modules/hapi/node_modules/vision/node_modules/joi/examples/customMessage.js deleted file mode 100755 index 38cd28a..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/examples/customMessage.js +++ /dev/null @@ -1,22 +0,0 @@ -var Joi = require('../'); - - -var schema = Joi.object().options({ abortEarly: false }).keys({ - email: Joi.string().email().required().label('User Email'), - password: Joi.string().min(8).required(), - password_confirmation: Joi.any().valid(Joi.ref('password')).required().options({ language: { any: { allowOnly: 'must match password' }, label: 'Password Confirmation' } }).label('This label is not used because language.label takes precedence'), - first_name: Joi.string().required(), - last_name: Joi.string().required(), - company: Joi.string().optional() -}); - - -var data = { - email: 'not_a_valid_email_to_show_custom_label', - password: 'abcd1234', - password_confirmation: 'abc1', - first_name: 'Joe', - last_name: 'Doe' -}; - -Joi.assert(data, schema); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/examples/multipleWhen.js b/node_modules/hapi/node_modules/vision/node_modules/joi/examples/multipleWhen.js deleted file mode 100755 index b13cba9..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/examples/multipleWhen.js +++ /dev/null @@ -1,17 +0,0 @@ -var Joi = require('../'); - - -var schema = { - type: Joi.string().required(), - subtype: Joi.alternatives() - .when('type', {is: 'video', then: Joi.valid('mp4', 'wav')}) - .when('type', {is: 'audio', then: Joi.valid('mp3')}) - .when('type', {is: 'image', then: Joi.valid('jpg', 'png')}) - .when('type', {is: 'pdf' , then: Joi.valid('document')}) -}; - - -Joi.assert({ type: 'video', subtype: 'mp4' }, schema); // Pass -Joi.assert({ type: 'video', subtype: 'wav' }, schema); // Pass -Joi.assert({ type: 'other', subtype: 'something' }, schema); // Fail -Joi.assert({ type: 'audio', subtype: 'mp4' }, schema); // Fail diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/images/joi.png b/node_modules/hapi/node_modules/vision/node_modules/joi/images/joi.png deleted file mode 100755 index d240833802bcd4e4e0becde614466a3f36f09480..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30662 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�bm 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

Hr1>gKd}HOXUrnp$Jk^n( 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 0, 'limit must be a positive integer'); - - return this._test('min', limit, function (value, state, options) { - - if (value.length >= limit) { - return null; - } - - return Errors.create('array.min', { limit: limit }, state, options); - }); -}; - - -internals.Array.prototype.max = function (limit) { - - Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); - - return this._test('max', limit, function (value, state, options) { - - if (value.length <= limit) { - return null; - } - - return Errors.create('array.max', { limit: limit }, state, options); - }); -}; - - -internals.Array.prototype.length = function (limit) { - - Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); - - return this._test('length', limit, function (value, state, options) { - - if (value.length === limit) { - return null; - } - - return Errors.create('array.length', { limit: limit }, state, options); - }); -}; - - -internals.Array.prototype.unique = function () { - - return this._test('unique', undefined, function (value, state, options) { - - var found = { - string: {}, - number: {}, - undefined: {}, - boolean: {}, - object: [], - function: [] - }; - - for (var i = 0, il = value.length; i < il; ++i) { - var item = value[i]; - var type = typeof item; - var records = found[type]; - - // All available types are supported, so it's not possible to reach 100% coverage without ignoring this line. - // I still want to keep the test for future js versions with new types (eg. Symbol). - if (/* $lab:coverage:off$ */ records /* $lab:coverage:on$ */) { - if (Array.isArray(records)) { - for (var r = 0, rl = records.length; r < rl; ++r) { - if (Hoek.deepEqual(records[r], item)) { - return Errors.create('array.unique', { pos: i }, state, options); - } - } - - records.push(item); - } - else { - if (records[item]) { - return Errors.create('array.unique', { pos: i }, state, options); - } - - records[item] = true; - } - } - } - }); -}; - - -internals.Array.prototype.sparse = function (enabled) { - - var obj = this.clone(); - obj._flags.sparse = enabled === undefined ? true : !!enabled; - return obj; -}; - - -internals.Array.prototype.single = function (enabled) { - - var obj = this.clone(); - obj._flags.single = enabled === undefined ? true : !!enabled; - return obj; -} - - -module.exports = new internals.Array(); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/binary.js b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/binary.js deleted file mode 100755 index 83715b8..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/binary.js +++ /dev/null @@ -1,98 +0,0 @@ -// Load modules - -var Any = require('./any'); -var Errors = require('./errors'); -var Hoek = require('hoek'); - - -// Declare internals - -var internals = {}; - - -internals.Binary = function () { - - Any.call(this); - this._type = 'binary'; -}; - -Hoek.inherits(internals.Binary, Any); - - -internals.Binary.prototype._base = function (value, state, options) { - - var result = { - value: value - }; - - if (typeof value === 'string' && - options.convert) { - - try { - var converted = new Buffer(value, this._flags.encoding); - result.value = converted; - } - catch (e) { } - } - - result.errors = Buffer.isBuffer(result.value) ? null : Errors.create('binary.base', null, state, options); - return result; -}; - - -internals.Binary.prototype.encoding = function (encoding) { - - Hoek.assert(Buffer.isEncoding(encoding), 'Invalid encoding:', encoding); - - var obj = this.clone(); - obj._flags.encoding = encoding; - return obj; -}; - - -internals.Binary.prototype.min = function (limit) { - - Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); - - return this._test('min', limit, function (value, state, options) { - - if (value.length >= limit) { - return null; - } - - return Errors.create('binary.min', { limit: limit }, state, options); - }); -}; - - -internals.Binary.prototype.max = function (limit) { - - Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); - - return this._test('max', limit, function (value, state, options) { - - if (value.length <= limit) { - return null; - } - - return Errors.create('binary.max', { limit: limit }, state, options); - }); -}; - - -internals.Binary.prototype.length = function (limit) { - - Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); - - return this._test('length', limit, function (value, state, options) { - - if (value.length === limit) { - return null; - } - - return Errors.create('binary.length', { limit: limit }, state, options); - }); -}; - - -module.exports = new internals.Binary(); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/boolean.js b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/boolean.js deleted file mode 100755 index b182a01..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/boolean.js +++ /dev/null @@ -1,41 +0,0 @@ -// Load modules - -var Any = require('./any'); -var Errors = require('./errors'); -var Hoek = require('hoek'); - - -// Declare internals - -var internals = {}; - - -internals.Boolean = function () { - - Any.call(this); - this._type = 'boolean'; -}; - -Hoek.inherits(internals.Boolean, Any); - - -internals.Boolean.prototype._base = function (value, state, options) { - - var result = { - value: value - }; - - if (typeof value === 'string' && - options.convert) { - - var lower = value.toLowerCase(); - result.value = (lower === 'true' || lower === 'yes' || lower === 'on' ? true - : (lower === 'false' || lower === 'no' || lower === 'off' ? false : value)); - } - - result.errors = (typeof result.value === 'boolean') ? null : Errors.create('boolean.base', null, state, options); - return result; -}; - - -module.exports = new internals.Boolean(); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/cast.js b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/cast.js deleted file mode 100755 index 41fd99b..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/cast.js +++ /dev/null @@ -1,74 +0,0 @@ -// Load modules - -var Hoek = require('hoek'); -var Ref = require('./ref'); -// Type modules are delay-loaded to prevent circular dependencies - - -// Declare internals - -var internals = { - any: null, - date: require('./date'), - string: require('./string'), - number: require('./number'), - boolean: require('./boolean'), - alt: null, - object: null -}; - - -exports.schema = function (config) { - - internals.any = internals.any || new (require('./any'))(); - internals.alt = internals.alt || require('./alternatives'); - internals.object = internals.object || require('./object'); - - if (config && - typeof config === 'object') { - - if (config.isJoi) { - return config; - } - - if (Array.isArray(config)) { - return internals.alt.try(config); - } - - if (config instanceof RegExp) { - return internals.string.regex(config); - } - - if (config instanceof Date) { - return internals.date.valid(config); - } - - return internals.object.keys(config); - } - - if (typeof config === 'string') { - return internals.string.valid(config); - } - - if (typeof config === 'number') { - return internals.number.valid(config); - } - - if (typeof config === 'boolean') { - return internals.boolean.valid(config); - } - - if (Ref.isRef(config)) { - return internals.any.valid(config); - } - - Hoek.assert(config === null, 'Invalid schema content:', config); - - return internals.any.valid(null); -}; - - -exports.ref = function (id) { - - return Ref.isRef(id) ? id : Ref.create(id); -}; \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/date.js b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/date.js deleted file mode 100755 index 1fa8f7b..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/date.js +++ /dev/null @@ -1,168 +0,0 @@ -// Load modules - -var Any = require('./any'); -var Errors = require('./errors'); -var Ref = require('./ref'); -var Hoek = require('hoek'); -var Moment = require('moment'); - - -// Declare internals - -var internals = {}; - -internals.isoDate = /^((\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\d))$/; -internals.invalidDate = new Date(''); -internals.isIsoDate = (function() { - - var isoString = internals.isoDate.toString(); - - return function (date) { - - return date && (date.toString() === isoString); - }; -})(); - -internals.Date = function () { - - Any.call(this); - this._type = 'date'; -}; - -Hoek.inherits(internals.Date, Any); - - -internals.Date.prototype._base = function (value, state, options) { - - var result = { - value: (options.convert && internals.toDate(value, this._flags.format)) || value - }; - - if (result.value instanceof Date && !isNaN(result.value.getTime())) { - result.errors = null; - } - else { - result.errors = Errors.create(internals.isIsoDate(this._flags.format) ? 'date.isoDate' : 'date.base', null, state, options); - } - - return result; -}; - - -internals.toDate = function (value, format) { - - if (value instanceof Date) { - return value; - } - - if (typeof value === 'string' || - Hoek.isInteger(value)) { - - if (typeof value === 'string' && - /^[+-]?\d+$/.test(value)) { - - value = parseInt(value, 10); - } - - var date; - if (format) { - if (internals.isIsoDate(format)) { - date = format.test(value) ? new Date(value) : internals.invalidDate; - } - else { - date = Moment(value, format, true); - date = date.isValid() ? date.toDate() : internals.invalidDate; - } - } - else { - date = new Date(value); - } - - if (!isNaN(date.getTime())) { - return date; - } - } - - return null; -}; - - -internals.compare = function (type, compare) { - - return function (date) { - - var isNow = date === 'now'; - var isRef = Ref.isRef(date); - - if (!isNow && !isRef) { - date = internals.toDate(date); - } - - Hoek.assert(date, 'Invalid date format'); - - return this._test(type, date, function (value, state, options) { - - var compareTo; - if (isNow) { - compareTo = Date.now(); - } - else if (isRef) { - compareTo = internals.toDate(date(state.parent)); - - if (!compareTo) { - return Errors.create('date.ref', { ref: date.key }, state, options); - } - - compareTo = compareTo.getTime(); - } - else { - compareTo = date.getTime(); - } - - if (compare(value.getTime(), compareTo)) { - return null; - } - - return Errors.create('date.' + type, { limit: new Date(compareTo) }, state, options); - }); - }; -}; - - -internals.Date.prototype.min = internals.compare('min', function (value, date) { - - return value >= date; -}); - - -internals.Date.prototype.max = internals.compare('max', function (value, date) { - - return value <= date; -}); - - -internals.Date.prototype.format = function (format) { - - Hoek.assert(typeof format === 'string' || (Array.isArray(format) && format.every(function (f) { - - return typeof f === 'string'; - })), 'Invalid format.'); - - var obj = this.clone(); - obj._flags.format = format; - return obj; -}; - -internals.Date.prototype.iso = function () { - - var obj = this.clone(); - obj._flags.format = internals.isoDate; - return obj; -}; - -internals.Date.prototype._isIsoDate = function (value) { - - return internals.isoDate.test(value); -}; - -module.exports = new internals.Date(); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/errors.js b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/errors.js deleted file mode 100755 index 034642a..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/errors.js +++ /dev/null @@ -1,159 +0,0 @@ -// Load modules - -var Hoek = require('hoek'); -var Language = require('./language'); - - -// Declare internals - -var internals = {}; - - -internals.Err = function (type, context, state, options) { - - this.type = type; - this.context = context || {}; - this.context.key = state.key; - this.path = state.path; - this.options = options; -}; - - -internals.Err.prototype.toString = function () { - - var self = this; - - var localized = this.options.language; - this.context.key = localized.label || this.context.key || localized.root || Language.errors.root; - - var format = Hoek.reach(localized, this.type) || Hoek.reach(Language.errors, this.type); - var hasKey = /\{\{\!?key\}\}/.test(format); - format = (hasKey ? format : '{{!key}} ' + format); - var message = format.replace(/\{\{(\!?)([^}]+)\}\}/g, function ($0, isSecure, name) { - - var value = Hoek.reach(self.context, name); - var normalized = Array.isArray(value) ? value.join(', ') : value.toString(); - return (isSecure ? Hoek.escapeHtml(normalized) : normalized); - }); - - return message; -}; - - -exports.create = function (type, context, state, options) { - - return new internals.Err(type, context, state, options); -}; - - -exports.process = function (errors, object) { - - if (!errors || !errors.length) { - return null; - } - - var details = []; - for (var i = 0, il = errors.length; i < il; ++i) { - var item = errors[i]; - details.push({ - message: item.toString(), - path: internals.getPath(item), - type: item.type, - context: item.context - }); - } - - // Construct error - - var message = ''; - details.forEach(function (error) { - - message += (message ? '. ' : '') + error.message; - }); - - var error = new Error(message); - error.name = 'ValidationError'; - error.details = details; - error._object = object; - error.annotate = internals.annotate; - return error; -}; - - -internals.getPath = function (item) { - - var recursePath = function (it) { - - var reachedItem = Hoek.reach(it, 'context.reason.0'); - if (reachedItem && reachedItem.context) { - return recursePath(reachedItem); - } - - return it.path; - }; - - return recursePath(item) || item.context.key; -}; - - -internals.annotate = function () { - - var obj = Hoek.clone(this._object || {}); - - var lookup = {}; - var el = this.details.length; - for (var e = el - 1; e >= 0; --e) { // Reverse order to process deepest child first - var pos = el - e; - var error = this.details[e]; - var path = error.path.split('.'); - var ref = obj; - for (var i = 0, il = path.length; i < il && ref; ++i) { - var seg = path[i]; - if (i + 1 < il) { - ref = ref[seg]; - } - else { - var value = ref[seg]; - if (value !== undefined) { - delete ref[seg]; - var label = seg + '_$key$_' + pos + '_$end$_'; - ref[label] = value; - lookup[error.path] = label; - } - else if (lookup[error.path]) { - var replacement = lookup[error.path]; - var appended = replacement.replace('_$end$_', ', ' + pos + '_$end$_'); - ref[appended] = ref[replacement]; - lookup[error.path] = appended; - delete ref[replacement]; - } - else { - ref['_$miss$_' + seg + '|' + pos + '_$end$_'] = '__missing__'; - } - } - } - } - - var annotated = JSON.stringify(obj, null, 2); - - annotated = annotated.replace(/_\$key\$_([, \d]+)_\$end\$_\"/g, function ($0, $1) { - - return '" \u001b[31m[' + $1 + ']\u001b[0m'; - }); - - var message = annotated.replace(/\"_\$miss\$_([^\|]+)\|(\d+)_\$end\$_\"\: \"__missing__\"/g, function ($0, $1, $2) { - - return '\u001b[41m"' + $1 + '"\u001b[0m\u001b[31m [' + $2 + ']: -- missing --\u001b[0m'; - }); - - message += '\n\u001b[31m'; - - for (e = 0; e < el; ++e) { - message += '\n[' + (e + 1) + '] ' + this.details[e].message; - } - - message += '\u001b[0m'; - - return message; -}; - diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/function.js b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/function.js deleted file mode 100755 index a11f72c..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/function.js +++ /dev/null @@ -1,31 +0,0 @@ -// Load modules - -var Any = require('./any'); -var Errors = require('./errors'); -var Hoek = require('hoek'); - - -// Declare internals - -var internals = {}; - - -internals.Function = function () { - - Any.call(this); - this._type = 'func'; -}; - -Hoek.inherits(internals.Function, Any); - - -internals.Function.prototype._base = function (value, state, options) { - - return { - value: value, - errors: (typeof value === 'function') ? null : Errors.create('function.base', null, state, options) - }; -}; - - -module.exports = new internals.Function(); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/index.js b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/index.js deleted file mode 100755 index 2db8d5d..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/index.js +++ /dev/null @@ -1,129 +0,0 @@ -// Load modules - -var Hoek = require('hoek'); -var Any = require('./any'); -var Cast = require('./cast'); -var Ref = require('./ref'); - - -// Declare internals - -var internals = { - alternatives: require('./alternatives'), - array: require('./array'), - boolean: require('./boolean'), - binary: require('./binary'), - date: require('./date'), - func: require('./function'), - number: require('./number'), - object: require('./object'), - string: require('./string') -}; - - -internals.root = function () { - - var any = new Any(); - - var root = any.clone(); - root.any = function () { - - return any; - }; - - root.alternatives = root.alt = function () { - - return arguments.length ? internals.alternatives.try.apply(internals.alternatives, arguments) : internals.alternatives; - }; - - root.array = function () { - - return internals.array; - }; - - root.boolean = root.bool = function () { - - return internals.boolean; - }; - - root.binary = function () { - - return internals.binary; - }; - - root.date = function () { - - return internals.date; - }; - - root.func = function () { - - return internals.func; - }; - - root.number = function () { - - return internals.number; - }; - - root.object = function () { - - return arguments.length ? internals.object.keys.apply(internals.object, arguments) : internals.object; - }; - - root.string = function () { - - return internals.string; - }; - - root.ref = function () { - - return Ref.create.apply(null, arguments); - }; - - root.isRef = function (ref) { - - return Ref.isRef(ref); - }; - - root.validate = function (value /*, [schema], [options], callback */) { - - var last = arguments[arguments.length - 1]; - var callback = typeof last === 'function' ? last : null; - - var count = arguments.length - (callback ? 1 : 0); - if (count === 1) { - return any.validate(value, callback); - } - - var options = count === 3 ? arguments[2] : {}; - var schema = Cast.schema(arguments[1]); - - return schema._validateWithOptions(value, options, callback); - }; - - root.describe = function () { - - var schema = arguments.length ? Cast.schema(arguments[0]) : any; - return schema.describe(); - }; - - root.compile = function (schema) { - - return Cast.schema(schema); - }; - - root.assert = function (value, schema, message) { - - message = (message ? message + ' ' : ''); - var error = root.validate(value, schema).error; - if (error) { - throw new Error(message + error.annotate()); - } - }; - - return root; -}; - - -module.exports = internals.root(); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/language.js b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/language.js deleted file mode 100755 index 64246b2..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/language.js +++ /dev/null @@ -1,106 +0,0 @@ -// Load modules - - -// Declare internals - -var internals = {}; - - -exports.errors = { - root: 'value', - any: { - unknown: 'is not allowed', - invalid: 'contains an invalid value', - empty: 'is not allowed to be empty', - required: 'is required', - allowOnly: 'must be one of {{valids}}' - }, - alternatives: { - base: 'not matching any of the allowed alternatives' - }, - array: { - base: 'must be an array', - includes: 'at position {{pos}} does not match any of the allowed types', - includesSingle: 'single value of {{!key}} does not match any of the allowed types', - includesOne: 'at position {{pos}} fails because {{reason}}', - includesOneSingle: 'single value of {{!key}} fails because {{reason}}', - excludes: 'at position {{pos}} contains an excluded value', - excludesSingle: 'single value of {{!key}} contains an excluded value', - min: 'must contain at least {{limit}} items', - max: 'must contain less than or equal to {{limit}} items', - length: 'must contain {{limit}} items', - sparse: 'must not be a sparse array', - unique: 'position {{pos}} contains a duplicate value' - }, - boolean: { - base: 'must be a boolean' - }, - binary: { - base: 'must be a buffer or a string', - min: 'must be at least {{limit}} bytes', - max: 'must be less than or equal to {{limit}} bytes', - length: 'must be {{limit}} bytes' - }, - date: { - base: 'must be a number of milliseconds or valid date string', - min: 'must be larger than or equal to {{limit}}', - max: 'must be less than or equal to {{limit}}', - isoDate: 'must be a valid ISO 8601 date', - ref: 'references {{ref}} which is not a date' - }, - function: { - base: 'must be a Function' - }, - object: { - base: 'must be an object', - min: 'must have at least {{limit}} children', - max: 'must have less than or equal to {{limit}} children', - length: 'must have {{limit}} children', - allowUnknown: 'is not allowed', - with: 'missing required peer {{peer}}', - without: 'conflict with forbidden peer {{peer}}', - missing: 'must contain at least one of {{peers}}', - xor: 'contains a conflict between exclusive peers {{peers}}', - or: 'must contain at least one of {{peers}}', - and: 'contains {{present}} without its required peers {{missing}}', - nand: '{{main}} must not exist simultaneously with {{peers}}', - assert: 'validation failed because {{ref}} failed to {{message}}', - rename: { - multiple: 'cannot rename child {{from}} because multiple renames are disabled and another key was already renamed to {{to}}', - override: 'cannot rename child {{from}} because override is disabled and target {{to}} exists' - }, - type: 'must be an instance of {{type}}' - }, - number: { - base: 'must be a number', - min: 'must be larger than or equal to {{limit}}', - max: 'must be less than or equal to {{limit}}', - less: 'must be less than {{limit}}', - greater: 'must be greater than {{limit}}', - float: 'must be a float or double', - integer: 'must be an integer', - negative: 'must be a negative number', - positive: 'must be a positive number', - precision: 'must have no more than {{limit}} decimal places' - }, - string: { - base: 'must be a string', - min: 'length must be at least {{limit}} characters long', - max: 'length must be less than or equal to {{limit}} characters long', - length: 'length must be {{limit}} characters long', - alphanum: 'must only contain alpha-numeric characters', - token: 'must only contain alpha-numeric and underscore characters', - regex: { - base: 'fails to match the required pattern', - name: 'fails to match the {{name}} pattern' - }, - email: 'must be a valid email', - isoDate: 'must be a valid ISO 8601 date', - guid: 'must be a valid GUID', - hostname: 'must be a valid hostname', - lowercase: 'must only contain lowercase characters', - uppercase: 'must only contain uppercase characters', - trim: 'must not have leading or trailing whitespace', - creditCard: 'must be a credit card' - } -}; diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/number.js b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/number.js deleted file mode 100755 index 0d2f693..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/number.js +++ /dev/null @@ -1,170 +0,0 @@ -// Load modules - -var Any = require('./any'); -var Errors = require('./errors'); -var Hoek = require('hoek'); - - -// Declare internals - -var internals = {}; - - -internals.Number = function () { - - Any.call(this); - this._type = 'number'; - this._invalids.add(Infinity); - this._invalids.add(-Infinity); -}; - -Hoek.inherits(internals.Number, Any); - - -internals.Number.prototype._base = function (value, state, options) { - - var result = { - errors: null, - value: value - }; - - if (typeof value === 'string' && - options.convert) { - - var number = parseFloat(value); - result.value = (isNaN(number) || !isFinite(value)) ? NaN : number; - } - - var isNumber = typeof result.value === 'number' && !isNaN(result.value); - - if (options.convert && 'precision' in this._flags && isNumber) { - // This is conceptually equivalent to using toFixed but it should be much faster - var precision = Math.pow(10, this._flags.precision); - result.value = Math.round(result.value * precision) / precision; - } - - result.errors = isNumber ? null : Errors.create('number.base', null, state, options); - return result; -}; - - -internals.Number.prototype.min = function (limit) { - - Hoek.assert(Hoek.isInteger(limit), 'limit must be an integer'); - - return this._test('min', limit, function (value, state, options) { - - if (value >= limit) { - return null; - } - - return Errors.create('number.min', { limit: limit }, state, options); - }); -}; - - -internals.Number.prototype.max = function (limit) { - - Hoek.assert(Hoek.isInteger(limit), 'limit must be an integer'); - - return this._test('max', limit, function (value, state, options) { - - if (value <= limit) { - return null; - } - - return Errors.create('number.max', { limit: limit }, state, options); - }); -}; - - -internals.Number.prototype.greater = function (limit) { - - Hoek.assert(Hoek.isInteger(limit), 'limit must be an integer'); - - return this._test('greater', limit, function (value, state, options) { - - if (value > limit) { - return null; - } - - return Errors.create('number.greater', { limit: limit }, state, options); - }); -}; - - -internals.Number.prototype.less = function (limit) { - - Hoek.assert(Hoek.isInteger(limit), 'limit must be an integer'); - - return this._test('less', limit, function (value, state, options) { - - if (value < limit) { - return null; - } - - return Errors.create('number.less', { limit: limit }, state, options); - }); -}; - - -internals.Number.prototype.integer = function () { - - return this._test('integer', undefined, function (value, state, options) { - - return Hoek.isInteger(value) ? null : Errors.create('number.integer', null, state, options); - }); -}; - - -internals.Number.prototype.negative = function () { - - return this._test('negative', undefined, function (value, state, options) { - - if (value < 0) { - return null; - } - - return Errors.create('number.negative', null, state, options); - }); -}; - - -internals.Number.prototype.positive = function () { - - return this._test('positive', undefined, function (value, state, options) { - - if (value > 0) { - return null; - } - - return Errors.create('number.positive', null, state, options); - }); -}; - - -internals.precisionRx = /(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/; - - -internals.Number.prototype.precision = function (limit) { - - Hoek.assert(Hoek.isInteger(limit), 'limit must be an integer'); - Hoek.assert(!('precision' in this._flags), 'precision already set'); - - var obj = this._test('precision', limit, function (value, state, options){ - - var places = value.toString().match(internals.precisionRx); - var decimals = Math.max((places[1] ? places[1].length : 0) - (places[2] ? parseInt(places[2], 10) : 0), 0); - if (decimals <= limit) { - return null; - } - - return Errors.create('number.precision', {limit: limit}, state, options); - }); - - obj._flags.precision = limit; - return obj; -}; - - -module.exports = new internals.Number(); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/object.js b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/object.js deleted file mode 100755 index 99acacf..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/object.js +++ /dev/null @@ -1,685 +0,0 @@ -// Load modules - -var Hoek = require('hoek'); -var Topo = require('topo'); -var Any = require('./any'); -var Cast = require('./cast'); -var Errors = require('./errors'); - - -// Declare internals - -var internals = {}; - - -internals.Object = function () { - - Any.call(this); - this._type = 'object'; - this._inner.children = null; - this._inner.renames = []; - this._inner.dependencies = []; - this._inner.patterns = []; -}; - -Hoek.inherits(internals.Object, Any); - - -internals.Object.prototype._base = function (value, state, options) { - - var target = value; - var errors = []; - var finish = function () { - - return { - value: target, - errors: errors.length ? errors : null - }; - }; - - if (typeof value === 'string' && - options.convert) { - - try { - value = JSON.parse(value); - } - catch (err) { } - } - - if (!value || - typeof value !== 'object' || - Array.isArray(value)) { - - errors.push(Errors.create('object.base', null, state, options)); - return finish(); - } - - // Skip if there are no other rules to test - - if (!this._inner.renames.length && - !this._inner.dependencies.length && - !this._inner.children && // null allows any keys - !this._inner.patterns.length) { - - target = value; - return finish(); - } - - // Ensure target is a local copy (parsed) or shallow copy - - if (target === value) { - target = Object.create(Object.getPrototypeOf(value)); - var valueKeys = Object.keys(value); - for (var t = 0, tl = valueKeys.length; t < tl; ++t) { - target[valueKeys[t]] = value[valueKeys[t]]; - } - } - else { - target = value; - } - - // Rename keys - - var renamed = {}; - for (var r = 0, rl = this._inner.renames.length; r < rl; ++r) { - var item = this._inner.renames[r]; - - if (target[item.from] === undefined) { - continue; - } - - if (!item.options.multiple && - renamed[item.to]) { - - errors.push(Errors.create('object.rename.multiple', { from: item.from, to: item.to }, state, options)); - if (options.abortEarly) { - return finish(); - } - } - - if (target.hasOwnProperty(item.to) && - !item.options.override && - !renamed[item.to]) { - - errors.push(Errors.create('object.rename.override', { from: item.from, to: item.to }, state, options)); - if (options.abortEarly) { - return finish(); - } - } - - target[item.to] = target[item.from]; - renamed[item.to] = true; - - if (!item.options.alias) { - delete target[item.from]; - } - } - - // Validate dependencies - - for (var d = 0, dl = this._inner.dependencies.length; d < dl; ++d) { - var dep = this._inner.dependencies[d]; - var err = internals[dep.type](dep.key !== null && value[dep.key], dep.peers, target, { key: dep.key, path: (state.path ? state.path + '.' : '') + dep.key }, options); - if (err) { - errors.push(err); - if (options.abortEarly) { - return finish(); - } - } - } - - // Validate schema - - if (!this._inner.children && // null allows any keys - !this._inner.patterns.length) { - - return finish(); - } - - var unprocessed = Hoek.mapToObject(Object.keys(target)); - var key; - - if (this._inner.children) { - for (var i = 0, il = this._inner.children.length; i < il; ++i) { - var child = this._inner.children[i]; - var key = child.key; - var item = target[key]; - - delete unprocessed[key]; - - var localState = { key: key, path: (state.path ? state.path + '.' : '') + key, parent: target, reference: state.reference }; - var result = child.schema._validate(item, localState, options); - if (result.errors) { - errors = errors.concat(result.errors); - if (options.abortEarly) { - return finish(); - } - } - - if (result.value !== undefined) { - target[key] = result.value; - } - } - } - - // Unknown keys - - var unprocessedKeys = Object.keys(unprocessed); - if (unprocessedKeys.length && - this._inner.patterns.length) { - - for (i = 0, il = unprocessedKeys.length; i < il; ++i) { - var key = unprocessedKeys[i]; - - for (var p = 0, pl = this._inner.patterns.length; p < pl; ++p) { - var pattern = this._inner.patterns[p]; - - if (pattern.regex.test(key)) { - delete unprocessed[key]; - - var item = target[key]; - var localState = { key: key, path: (state.path ? state.path + '.' : '') + key, parent: target, reference: state.reference }; - var result = pattern.rule._validate(item, localState, options); - if (result.errors) { - errors = errors.concat(result.errors); - if (options.abortEarly) { - return finish(); - } - } - - if (result.value !== undefined) { - target[key] = result.value; - } - } - } - } - - unprocessedKeys = Object.keys(unprocessed); - } - - if (unprocessedKeys.length) { - if (options.stripUnknown || - options.skipFunctions) { - - var hasFunctions = false; - for (var k = 0, kl = unprocessedKeys.length; k < kl; ++k) { - key = unprocessedKeys[k]; - - if (options.stripUnknown) { - delete target[key]; - } - else if (typeof target[key] === 'function') { - delete unprocessed[key]; - hasFunctions = true; - } - } - - if (options.stripUnknown) { - return finish(); - } - - if (hasFunctions) { - unprocessedKeys = Object.keys(unprocessed); - } - } - - if (unprocessedKeys.length && - (this._flags.allowUnknown !== undefined ? !this._flags.allowUnknown : !options.allowUnknown)) { - - for (var e = 0, el = unprocessedKeys.length; e < el; ++e) { - errors.push(Errors.create('object.allowUnknown', null, { key: unprocessedKeys[e], path: state.path }, options)); - } - } - } - - return finish(); -}; - - -internals.Object.prototype.keys = function (schema) { - - Hoek.assert(schema === null || schema === undefined || typeof schema === 'object', 'Object schema must be a valid object'); - Hoek.assert(!schema || !schema.isJoi, 'Object schema cannot be a joi schema'); - - var obj = this.clone(); - - if (!schema) { - obj._inner.children = null; - return obj; - } - - var children = Object.keys(schema); - - if (!children.length) { - obj._inner.children = []; - return obj; - } - - var topo = new Topo(); - if (obj._inner.children) { - for (var i = 0, il = obj._inner.children.length; i < il; ++i) { - var child = obj._inner.children[i]; - topo.add(child, { after: child._refs, group: child.key }); - } - } - - for (var c = 0, cl = children.length; c < cl; ++c) { - var key = children[c]; - var child = schema[key]; - var cast = Cast.schema(child); - topo.add({ key: key, schema: cast }, { after: cast._refs, group: key }); - } - - obj._inner.children = topo.nodes; - - return obj; -}; - - -internals.Object.prototype.unknown = function (allow) { - - var obj = this.clone(); - obj._flags.allowUnknown = (allow !== false); - return obj; -}; - - -internals.Object.prototype.length = function (limit) { - - Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); - - return this._test('length', limit, function (value, state, options) { - - if (Object.keys(value).length === limit) { - return null; - } - - return Errors.create('object.length', { limit: limit }, state, options); - }); -}; - - -internals.Object.prototype.min = function (limit) { - - Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); - - return this._test('min', limit, function (value, state, options) { - - if (Object.keys(value).length >= limit) { - return null; - } - - return Errors.create('object.min', { limit: limit }, state, options); - }); -}; - - -internals.Object.prototype.max = function (limit) { - - Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); - - return this._test('max', limit, function (value, state, options) { - - if (Object.keys(value).length <= limit) { - return null; - } - - return Errors.create('object.max', { limit: limit }, state, options); - }); -}; - - -internals.Object.prototype.pattern = function (pattern, schema) { - - Hoek.assert(pattern instanceof RegExp, 'Invalid regular expression'); - Hoek.assert(schema !== undefined, 'Invalid rule'); - - pattern = new RegExp(pattern.source, pattern.ignoreCase ? 'i' : undefined); // Future version should break this and forbid unsupported regex flags - - var obj = this.clone(); - obj._inner.patterns.push({ regex: pattern, rule: Cast.schema(schema) }); - return obj; -}; - - -internals.Object.prototype.with = function (key, peers) { - - return this._dependency('with', key, peers); -}; - - -internals.Object.prototype.without = function (key, peers) { - - return this._dependency('without', key, peers); -}; - - -internals.Object.prototype.xor = function () { - - var peers = Hoek.flatten(Array.prototype.slice.call(arguments)); - return this._dependency('xor', null, peers); -}; - - -internals.Object.prototype.or = function () { - - var peers = Hoek.flatten(Array.prototype.slice.call(arguments)); - return this._dependency('or', null, peers); -}; - - -internals.Object.prototype.and = function () { - - var peers = Hoek.flatten(Array.prototype.slice.call(arguments)); - return this._dependency('and', null, peers); -}; - - -internals.Object.prototype.nand = function () { - - var peers = Hoek.flatten(Array.prototype.slice.call(arguments)); - return this._dependency('nand', null, peers); -}; - - -internals.Object.prototype.requiredKeys = function (children) { - - children = Hoek.flatten(Array.prototype.slice.call(arguments)); - return this.applyFunctionToChildren(children, 'required'); -}; - - -internals.Object.prototype.optionalKeys = function (children) { - - children = Hoek.flatten(Array.prototype.slice.call(arguments)); - return this.applyFunctionToChildren(children, 'optional'); -}; - - -internals.renameDefaults = { - alias: false, // Keep old value in place - multiple: false, // Allow renaming multiple keys into the same target - override: false // Overrides an existing key -}; - - -internals.Object.prototype.rename = function (from, to, options) { - - Hoek.assert(typeof from === 'string', 'Rename missing the from argument'); - Hoek.assert(typeof to === 'string', 'Rename missing the to argument'); - Hoek.assert(to !== from, 'Cannot rename key to same name:', from); - - for (var i = 0, il = this._inner.renames.length; i < il; ++i) { - Hoek.assert(this._inner.renames[i].from !== from, 'Cannot rename the same key multiple times'); - } - - var obj = this.clone(); - - obj._inner.renames.push({ - from: from, - to: to, - options: Hoek.applyToDefaults(internals.renameDefaults, options || {}) - }); - - return obj; -}; - - -internals.groupChildren = function (children) { - - children.sort(); - - var grouped = {}; - - for (var c = 0, lc = children.length; c < lc; c++) { - var child = children[c]; - Hoek.assert(typeof child === 'string', 'children must be strings'); - var group = child.split('.')[0]; - var childGroup = grouped[group] = (grouped[group] || []); - childGroup.push(child.substring(group.length + 1)); - } - - return grouped; -}; - - -internals.Object.prototype.applyFunctionToChildren = function (children, fn, args, root) { - - children = [].concat(children); - Hoek.assert(children.length > 0, 'expected at least one children'); - - var groupedChildren = internals.groupChildren(children); - var obj; - - if ('' in groupedChildren) { - obj = this[fn].apply(this, args); - delete groupedChildren['']; - } - else { - obj = this.clone(); - } - - if (obj._inner.children) { - root = root ? (root + '.') : ''; - - for (var i = 0, il = obj._inner.children.length; i < il; ++i) { - var child = obj._inner.children[i]; - var group = groupedChildren[child.key]; - - if (group) { - obj._inner.children[i] = { - key: child.key, - _refs: child._refs, - schema: child.schema.applyFunctionToChildren(group, fn, args, root + child.key) - }; - - delete groupedChildren[child.key]; - } - } - } - - var remaining = Object.keys(groupedChildren); - Hoek.assert(remaining.length === 0, 'unknown key(s)', remaining.join(', ')); - - return obj; -}; - - -internals.Object.prototype._dependency = function (type, key, peers) { - - peers = [].concat(peers); - for (var i = 0, li = peers.length; i < li; i++) { - Hoek.assert(typeof peers[i] === 'string', type, 'peers must be a string or array of strings'); - } - - var obj = this.clone(); - obj._inner.dependencies.push({ type: type, key: key, peers: peers }); - return obj; -}; - - -internals.with = function (value, peers, parent, state, options) { - - if (value === undefined) { - return null; - } - - for (var i = 0, il = peers.length; i < il; ++i) { - var peer = peers[i]; - if (!parent.hasOwnProperty(peer) || - parent[peer] === undefined) { - - return Errors.create('object.with', { peer: peer }, state, options); - } - } - - return null; -}; - - -internals.without = function (value, peers, parent, state, options) { - - if (value === undefined) { - return null; - } - - for (var i = 0, il = peers.length; i < il; ++i) { - var peer = peers[i]; - if (parent.hasOwnProperty(peer) && - parent[peer] !== undefined) { - - return Errors.create('object.without', { peer: peer }, state, options); - } - } - - return null; -}; - - -internals.xor = function (value, peers, parent, state, options) { - - var present = []; - for (var i = 0, il = peers.length; i < il; ++i) { - var peer = peers[i]; - if (parent.hasOwnProperty(peer) && - parent[peer] !== undefined) { - - present.push(peer); - } - } - - if (present.length === 1) { - return null; - } - - if (present.length === 0) { - return Errors.create('object.missing', { peers: peers }, state, options); - } - - return Errors.create('object.xor', { peers: peers }, state, options); -}; - - -internals.or = function (value, peers, parent, state, options) { - - for (var i = 0, il = peers.length; i < il; ++i) { - var peer = peers[i]; - if (parent.hasOwnProperty(peer) && - parent[peer] !== undefined) { - return null; - } - } - - return Errors.create('object.missing', { peers: peers }, state, options); -}; - - -internals.and = function (value, peers, parent, state, options) { - - var missing = []; - var present = []; - var count = peers.length; - for (var i = 0; i < count; ++i) { - var peer = peers[i]; - if (!parent.hasOwnProperty(peer) || - parent[peer] === undefined) { - - missing.push(peer); - } - else { - present.push(peer); - } - } - - var aon = (missing.length === count || present.length === count); - return !aon ? Errors.create('object.and', { present: present, missing: missing }, state, options) : null; -}; - - -internals.nand = function (value, peers, parent, state, options) { - - var present = []; - for (var i = 0, il = peers.length; i < il; ++i) { - var peer = peers[i]; - if (parent.hasOwnProperty(peer) && - parent[peer] !== undefined) { - - present.push(peer); - } - } - - var values = Hoek.clone(peers); - var main = values.splice(0,1); - var allPresent = (present.length === peers.length); - return allPresent ? Errors.create('object.nand', { main: main, peers: values }, state, options) : null; -}; - - -internals.Object.prototype.describe = function (shallow) { - - var description = Any.prototype.describe.call(this); - - if (this._inner.children && - !shallow) { - - description.children = {}; - for (var i = 0, il = this._inner.children.length; i < il; ++i) { - var child = this._inner.children[i]; - description.children[child.key] = child.schema.describe(); - } - } - - if (this._inner.dependencies.length) { - description.dependencies = Hoek.clone(this._inner.dependencies); - } - - if (this._inner.patterns.length) { - description.patterns = []; - - for (var p = 0, pl = this._inner.patterns.length; p < pl; ++p) { - var pattern = this._inner.patterns[p]; - description.patterns.push({ regex: pattern.regex.toString(), rule: pattern.rule.describe() }); - } - } - - return description; -}; - - -internals.Object.prototype.assert = function (ref, schema, message) { - - ref = Cast.ref(ref); - Hoek.assert(ref.isContext || ref.depth > 1, 'Cannot use assertions for root level references - use direct key rules instead'); - message = message || 'pass the assertion test'; - - var cast = Cast.schema(schema); - - return this._test('assert', { cast: cast, ref: ref }, function (value, state, options) { - - var result = cast._validate(ref(value), null, options, value); - if (!result.errors) { - return null; - } - - return Errors.create('object.assert', { ref: ref.path.join('.'), message: message }, state, options); - }); -}; - - -internals.Object.prototype.type = function (constructor, name) { - - Hoek.assert(typeof constructor === 'function', 'type must be a constructor function'); - name = name || constructor.name; - - return this._test('type', name, function (value, state, options) { - - if (value instanceof constructor) { - return null; - } - - return Errors.create('object.type', { type: name }, state, options); - }); -}; - - -module.exports = new internals.Object(); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/ref.js b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/ref.js deleted file mode 100755 index 7bc1842..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/ref.js +++ /dev/null @@ -1,51 +0,0 @@ -// Load modules - -var Hoek = require('hoek'); - - -// Declare internals - -var internals = {}; - - -exports.create = function (key, options) { - - Hoek.assert(typeof key === 'string', 'Invalid reference key:', key); - - var settings = Hoek.clone(options); // options can be reused and modified - - var ref = function (value, validationOptions) { - - return Hoek.reach(ref.isContext ? validationOptions.context : value, ref.key, settings); - }; - - ref.isContext = (key[0] === ((settings && settings.contextPrefix) || '$')); - ref.key = (ref.isContext ? key.slice(1) : key); - ref.path = ref.key.split((settings && settings.separator) || '.'); - ref.depth = ref.path.length; - ref.root = ref.path[0]; - ref.isJoi = true; - - ref.toString = function () { - - return (ref.isContext ? 'context:' : 'ref:') + ref.key; - }; - - return ref; -}; - - -exports.isRef = function (ref) { - - return typeof ref === 'function' && ref.isJoi; -}; - - -exports.push = function (array, ref) { - - if (exports.isRef(ref) && - !ref.isContext) { - - array.push(ref.root); - } -}; \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/string.js b/node_modules/hapi/node_modules/vision/node_modules/joi/lib/string.js deleted file mode 100755 index 1b22802..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/lib/string.js +++ /dev/null @@ -1,282 +0,0 @@ -// Load modules - -var Net = require('net'); -var Hoek = require('hoek'); -var Isemail = require('isemail'); -var Any = require('./any'); -var JoiDate = require('./date'); -var Errors = require('./errors'); - -// Declare internals - -var internals = {}; - - -internals.String = function () { - - Any.call(this); - this._type = 'string'; - this._invalids.add(''); -}; - -Hoek.inherits(internals.String, Any); - - -internals.String.prototype._base = function (value, state, options) { - - if (typeof value === 'string' && - options.convert) { - - if (this._flags.case) { - value = (this._flags.case === 'upper' ? value.toLocaleUpperCase() : value.toLocaleLowerCase()); - } - - if (this._flags.trim) { - value = value.trim(); - } - } - - return { - value: value, - errors: (typeof value === 'string') ? null : Errors.create('string.base', null, state, options) - }; -}; - - -internals.String.prototype.insensitive = function () { - - var obj = this.clone(); - obj._flags.insensitive = true; - return obj; -}; - - -internals.String.prototype.min = function (limit, encoding) { - - Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); - Hoek.assert(!encoding || Buffer.isEncoding(encoding), 'Invalid encoding:', encoding); - - return this._test('min', limit, function (value, state, options) { - - var length = encoding ? Buffer.byteLength(value, encoding) : value.length; - if (length >= limit) { - return null; - } - - return Errors.create('string.min', { limit: limit }, state, options); - }); -}; - - -internals.String.prototype.max = function (limit, encoding) { - - Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); - Hoek.assert(!encoding || Buffer.isEncoding(encoding), 'Invalid encoding:', encoding); - - return this._test('max', limit, function (value, state, options) { - - var length = encoding ? Buffer.byteLength(value, encoding) : value.length; - if (length <= limit) { - return null; - } - - return Errors.create('string.max', { limit: limit }, state, options); - }); -}; - - -internals.String.prototype.creditCard = function () { - - return this._test('creditCard', undefined, function (value, state, options) { - - var i = value.length; - var sum = 0; - var mul = 1; - var char; - - while (i--) { - char = value.charAt(i) * mul; - sum += char - (char > 9) * 9; - mul ^= 3; - } - - var check = (sum % 10 === 0) && (sum > 0); - return check ? null : Errors.create('string.creditCard', null, state, options); - }); -}; - - -internals.String.prototype.length = function (limit, encoding) { - - Hoek.assert(Hoek.isInteger(limit) && limit >= 0, 'limit must be a positive integer'); - Hoek.assert(!encoding || Buffer.isEncoding(encoding), 'Invalid encoding:', encoding); - - return this._test('length', limit, function (value, state, options) { - - var length = encoding ? Buffer.byteLength(value, encoding) : value.length; - if (length === limit) { - return null; - } - - return Errors.create('string.length', { limit: limit }, state, options); - }); -}; - - -internals.String.prototype.regex = function (pattern, name) { - - Hoek.assert(pattern instanceof RegExp, 'pattern must be a RegExp'); - - pattern = new RegExp(pattern.source, pattern.ignoreCase ? 'i' : undefined); // Future version should break this and forbid unsupported regex flags - - return this._test('regex', pattern, function (value, state, options) { - - if (pattern.test(value)) { - return null; - } - - return Errors.create((name ? 'string.regex.name' : 'string.regex.base'), { name: name }, state, options); - }); -}; - - -internals.String.prototype.alphanum = function () { - - return this._test('alphanum', undefined, function (value, state, options) { - - if (/^[a-zA-Z0-9]+$/.test(value)) { - return null; - } - - return Errors.create('string.alphanum', null, state, options); - }); -}; - - -internals.String.prototype.token = function () { - - return this._test('token', undefined, function (value, state, options) { - - if (/^\w+$/.test(value)) { - return null; - } - - return Errors.create('string.token', null, state, options); - }); -}; - - -internals.String.prototype.email = function () { - - return this._test('email', undefined, function (value, state, options) { - - if (Isemail(value)) { - return null; - } - - return Errors.create('string.email', null, state, options); - }); -}; - - -internals.String.prototype.isoDate = function () { - - return this._test('isoDate', undefined, function (value, state, options) { - - if (JoiDate._isIsoDate(value)) { - return null; - } - - return Errors.create('string.isoDate', null, state, options); - }); -}; - - -internals.String.prototype.guid = function () { - - var regex = /^[A-F0-9]{8}(?:-?[A-F0-9]{4}){3}-?[A-F0-9]{12}$/i; - var regex2 = /^\{[A-F0-9]{8}(?:-?[A-F0-9]{4}){3}-?[A-F0-9]{12}\}$/i; - - return this._test('guid', undefined, function (value, state, options) { - - if (regex.test(value) || regex2.test(value)) { - return null; - } - - return Errors.create('string.guid', null, state, options); - }); -}; - - -internals.String.prototype.hostname = function () { - - var regex = /^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$/; - - return this._test('hostname', undefined, function (value, state, options) { - - if ((value.length <= 255 && regex.test(value)) || - Net.isIPv6(value)) { - - return null; - } - - return Errors.create("string.hostname", null, state, options); - }); -}; - - -internals.String.prototype.lowercase = function () { - - var obj = this._test('lowercase', undefined, function (value, state, options) { - - if (options.convert || - value === value.toLocaleLowerCase()) { - - return null; - } - - return Errors.create('string.lowercase', null, state, options); - }); - - obj._flags.case = 'lower'; - return obj; -}; - - -internals.String.prototype.uppercase = function (options) { - - var obj = this._test('uppercase', undefined, function (value, state, options) { - - if (options.convert || - value === value.toLocaleUpperCase()) { - - return null; - } - - return Errors.create('string.uppercase', null, state, options); - }); - - obj._flags.case = 'upper'; - return obj; -}; - - -internals.String.prototype.trim = function () { - - var obj = this._test('trim', undefined, function (value, state, options) { - - if (options.convert || - value === value.trim()) { - - return null; - } - - return Errors.create('string.trim', null, state, options); - }); - - obj._flags.trim = true; - return obj; -}; - - -module.exports = new internals.String(); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/.npmignore b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/.npmignore deleted file mode 100644 index 5761e0a..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -isemail.sublime-* -node_modules diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/.travis.yml b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/.travis.yml deleted file mode 100644 index 1bc77fb..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/.travis.yml +++ /dev/null @@ -1,8 +0,0 @@ -language: node_js -node_js: - - "0.8" - - "0.10" -notifications: - hipchat: - rooms: - secure: lzNdJmq9QLPpKWKiFE+w1DNUhw+jp1OF1SIMlxSnT++H8M7NLVWchXzPIyoaE4enmy8n2JxMA9FGTaQvOER+G9UswuyOO2nUDjlt/I949SeN9DyVAf4XAwXnKbhXcmGuCho2odO7VeKPmrJXgoxbJYy3Ne0lS7zLU6rEkNJotIg= diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/LICENSE b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/LICENSE deleted file mode 100644 index 67e5251..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/LICENSE +++ /dev/null @@ -1,11 +0,0 @@ -Copyright © 2008-2011, Dominic Sayers -Copyright © 2013, GlobeSherpa -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of Dominic Sayers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/Makefile b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/Makefile deleted file mode 100644 index 86b2d13..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -test: - npm test - -.PHONY: test diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/README.md b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/README.md deleted file mode 100644 index 7e3f979..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/README.md +++ /dev/null @@ -1,92 +0,0 @@ -isemail -======= - -[![Build Status](https://travis-ci.org/globesherpa/node-isemail.png)](https://travis-ci.org/globesherpa/node-isemail) -[![Coverage Status](https://coveralls.io/repos/globesherpa/node-isemail/badge.png?branch=master)](https://coveralls.io/r/globesherpa/node-isemail?branch=master) - -This first version of `isemail` is a port of the PHP `is_email` function by Dominic Sayers. - -Future versions will improve upon the current version, optimizing it for efficient usage and DRYing the code. - -Install -------- - -```sh -$ npm install isemail -``` - -Test ----- - -The tests were pulled from is_email's extensive [test suite][tests] on October 15, 2013. Many thanks to the contributors! - -Run any of the following. - -```sh -$ mocha -$ npm test -$ make test -``` - -_remember to_ `npm install`! - -API ---- - -### isEmail(email, [options], [callback]) - -Determines whether the `email` is valid or not, for various definitions thereof. Optionally accepts an `options` object and a `callback` function. Options may include `errorLevel` and `checkDNS`. The `callback` function will always be called if specified, and the result of the operation supplied as the only parameter to the callback function. If `isEmail` is not asked to check for the existence of the domain (`checkDNS`), it will also synchronously return the result of the operation. - -Use `errorLevel` to specify the type of result for `isEmail`. Passing a `false` literal will result in a true or false boolean indicating whether the email address is sufficiently defined for use in sending an email. Passing a `true` literal will result in a more granular numeric status, with zero being a perfectly valid email address. Passing a number will return `0` if the numeric status is below the `errorLevel` and the numeric status otherwise. - -The `tldWhitelist` option can be either an object lookup table or an array of valid top-level domains. If the email address has a top-level domain that is not in the whitelist, the email will be marked as invalid. - -The `minDomainAtoms` option is an optional positive integer that specifies the minimum number of domain atoms that must be included for the email address to be considered valid. Be careful with the option, as some top-level domains, like `io`, directly support email addresses. - -#### Examples - -```js -$ node -> var isEmail = require('isemail'); -undefined -> var log = console.log.bind(console, 'result'); -undefined -> isEmail('test@iana.org'); -true -> isEmail('test@iana.org', log); -result true -true -> isEmail('test@iana.org', {checkDNS: true}); -undefined -> isEmail('test@iana.org', {checkDNS: true}, log); -undefined -result true -> isEmail('test@iana.org', {errorLevel: true}); -0 -> isEmail('test@iana.org', {errorLevel: true}, log); -result 0 -0 -> isEmail('test@e.com'); -true -> isEmail('test@e.com', {checkDNS: true, errorLevel: true}, log); -undefined -result 6 -> isEmail('test@e.com', {checkDNS: true, errorLevel: 7}, log); -undefined -result 0 -> isEmail('test@e.com', {checkDNS: true, errorLevel: 6}, log); -undefined -result 6 -``` - -TODO -==== - -Add tests for library usage, not just functionality comparisons. - -License -======= - -[BSD License](http://www.opensource.org/licenses/bsd-license.php) - -[tests]: http://isemail.info/_system/is_email/test/?all‎ "is_email test suite" diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/dns-no-mx.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/dns-no-mx.js deleted file mode 100755 index c868304..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/dns-no-mx.js +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/env node - -var dns = require('dns'); - -function check(domain, callback) { - var done = false, count = 3; - - dns.resolveCname(domain, handleRecords); - dns.resolve4(domain, handleRecords); - dns.resolve6(domain, handleRecords); - - function handleRecords(err, records) { - if (done) return; - count--; - if (!err && records && records.length) { - done = true; - return dns.resolveMx(domain, handleMail); - } - if (count === 0) { - done = true; - // ain't got time for node style callbacks - callback(false); - } - } - - function handleMail(err, records) { - if ((!err || err.code === dns.NODATA) && records && records.length) { - return callback(false); - } - callback(true); - } -} - -function spin(max, concurrent) { - if (!(max >= 0)) { - max = 1; - } - if (!(concurrent > 0)) { - concurrent = 4; - } - var active = 0, domain = domains(4, ['com', 'org', 'net']); - (function next() { - active++; - var d = domain(); - check(d, function(nomx) { - active--; - if (nomx) { - console.log(d); - if (!--max) { - process.exit(); - } - } - if (active < concurrent) { - next(); - } - }); - if (active < concurrent) { - next(); - } - })(); -} - -spin(1, 16); - -function domains(length, tops) { - var index = 0, end = Math.pow(26, length) * tops.length; - tops = tops.slice(); - return function next() { - if (index === end) return; - var active = index++, domain = ''; - var main = tops[active % tops.length]; - active = (active / tops.length) | 0; - for (var i = 0; i < length; i++) { - domain = String.fromCharCode(97 + active % 26) + domain; - active = (active / 26) | 0; - } - domain += '.' + main; - return domain; - }; -} diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/index.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/index.js deleted file mode 100644 index d7a780e..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./lib/isemail'); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/lib/isemail.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/lib/isemail.js deleted file mode 100644 index e948bbd..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/lib/isemail.js +++ /dev/null @@ -1,1279 +0,0 @@ -/** - * To validate an email address according to RFCs 5321, 5322 and others - * - * Copyright © 2008-2011, Dominic Sayers - * Test schema documentation Copyright © 2011, Daniel Marschall - * Port for Node.js Copyright © 2013, GlobeSherpa - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - Neither the name of Dominic Sayers nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @author Dominic Sayers - * @author Eli Skeggs - * @copyright 2008-2011 Dominic Sayers - * @copyright 2013-2014 GlobeSherpa - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @link http://www.dominicsayers.com/isemail - * @link https://github.com/globesherpa/isemail - * @version 1.1.1 - Optimization pass, simplify constants, style, dead code. - */ - -// lazy-loaded -var dns, HAS_REQUIRE = typeof require !== 'undefined'; - -// categories -var ISEMAIL_VALID_CATEGORY = 1; -var ISEMAIL_DNSWARN = 7; -var ISEMAIL_RFC5321 = 15; -var ISEMAIL_CFWS = 31; -var ISEMAIL_DEPREC = 63; -var ISEMAIL_RFC5322 = 127; -var ISEMAIL_ERR = 255; - -// diagnoses -// address is valid -var ISEMAIL_VALID = 0; -// address is valid but a DNS check was not successful -var ISEMAIL_DNSWARN_NO_MX_RECORD = 5; -var ISEMAIL_DNSWARN_NO_RECORD = 6; -// address is valid for SMTP but has unusual elements -var ISEMAIL_RFC5321_TLD = 9; -var ISEMAIL_RFC5321_TLDNUMERIC = 10; -var ISEMAIL_RFC5321_QUOTEDSTRING = 11; -var ISEMAIL_RFC5321_ADDRESSLITERAL = 12; -var ISEMAIL_RFC5321_IPV6DEPRECATED = 13; -// address is valid within the message but cannot be used unmodified for the -// envelope -var ISEMAIL_CFWS_COMMENT = 17; -var ISEMAIL_CFWS_FWS = 18; -// address contains deprecated elements but may still be valid in restricted -// contexts -var ISEMAIL_DEPREC_LOCALPART = 33; -var ISEMAIL_DEPREC_FWS = 34; -var ISEMAIL_DEPREC_QTEXT = 35; -var ISEMAIL_DEPREC_QP = 36; -var ISEMAIL_DEPREC_COMMENT = 37; -var ISEMAIL_DEPREC_CTEXT = 38; -var ISEMAIL_DEPREC_CFWS_NEAR_AT = 49; -// the address is only valid according to the broad definition of RFC 5322, but -// otherwise invalid -var ISEMAIL_RFC5322_DOMAIN = 65; -var ISEMAIL_RFC5322_TOOLONG = 66; -var ISEMAIL_RFC5322_LOCAL_TOOLONG = 67; -var ISEMAIL_RFC5322_DOMAIN_TOOLONG = 68; -var ISEMAIL_RFC5322_LABEL_TOOLONG = 69; -var ISEMAIL_RFC5322_DOMAINLITERAL = 70; -var ISEMAIL_RFC5322_DOMLIT_OBSDTEXT = 71; -var ISEMAIL_RFC5322_IPV6_GRPCOUNT = 72; -var ISEMAIL_RFC5322_IPV6_2X2XCOLON = 73; -var ISEMAIL_RFC5322_IPV6_BADCHAR = 74; -var ISEMAIL_RFC5322_IPV6_MAXGRPS = 75; -var ISEMAIL_RFC5322_IPV6_COLONSTRT = 76; -var ISEMAIL_RFC5322_IPV6_COLONEND = 77; -// address is invalid for any purpose -var ISEMAIL_ERR_EXPECTING_DTEXT = 129; -var ISEMAIL_ERR_NOLOCALPART = 130; -var ISEMAIL_ERR_NODOMAIN = 131; -var ISEMAIL_ERR_CONSECUTIVEDOTS = 132; -var ISEMAIL_ERR_ATEXT_AFTER_CFWS = 133; -var ISEMAIL_ERR_ATEXT_AFTER_QS = 134; -var ISEMAIL_ERR_ATEXT_AFTER_DOMLIT = 135; -var ISEMAIL_ERR_EXPECTING_QPAIR = 136; -var ISEMAIL_ERR_EXPECTING_ATEXT = 137; -var ISEMAIL_ERR_EXPECTING_QTEXT = 138; -var ISEMAIL_ERR_EXPECTING_CTEXT = 139; -var ISEMAIL_ERR_BACKSLASHEND = 140; -var ISEMAIL_ERR_DOT_START = 141; -var ISEMAIL_ERR_DOT_END = 142; -var ISEMAIL_ERR_DOMAINHYPHENSTART = 143; -var ISEMAIL_ERR_DOMAINHYPHENEND = 144; -var ISEMAIL_ERR_UNCLOSEDQUOTEDSTR = 145; -var ISEMAIL_ERR_UNCLOSEDCOMMENT = 146; -var ISEMAIL_ERR_UNCLOSEDDOMLIT = 147; -var ISEMAIL_ERR_FWS_CRLF_X2 = 148; -var ISEMAIL_ERR_FWS_CRLF_END = 149; -var ISEMAIL_ERR_CR_NO_LF = 150; -var ISEMAIL_ERR_UNKNOWN_TLD = 160; -var ISEMAIL_ERR_TOOSHORT_DOMAIN = 161; - -// function control -var THRESHOLD = 16; -// email parts -var COMPONENT_LOCALPART = 0; -var COMPONENT_DOMAIN = 1; -var COMPONENT_LITERAL = 2; -var CONTEXT_COMMENT = 3; -var CONTEXT_FWS = 4; -var CONTEXT_QUOTEDSTRING = 5; -var CONTEXT_QUOTEDPAIR = 6; - -// US-ASCII visible characters not valid for atext -// (http://tools.ietf.org/html/rfc5322#section-3.2.3) -var SPECIALS = '()<>[]:;@\\,."'; - -function optimizeLookup(string) { - var body = '', min = 0x100, max = 0, lookup = new Array(min); - for (var i = min - 1; i >= 0; i--) { - lookup[i] = false; - } - for (var i = 0; i < string.length; i++) { - var chr = string.charCodeAt(i); - if (chr < min) { - min = chr; - } - if (chr > max) { - max = chr; - } - lookup[chr] = true; - } - lookup.length = max; - var body = 'var lookup = ' + JSON.stringify(lookup) + ';\n'; - body += 'return function(code) {\n'; - body += ' if (code < ' + min + ' || code > ' + max + ') {\n'; - body += ' return false;\n'; - body += ' }\n'; - body += ' return lookup[code];\n'; - body += '}'; - return (new Function(body))(); -} - -var specialsLookup = optimizeLookup(SPECIALS); - -// matches valid IPv4 addresses from the end of a string -var IPv4_REGEX = - /\b(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/; -var IPv6_REGEX = /^[a-fA-F\d]{0,4}$/; -var IPv6_REGEX_TEST = IPv6_REGEX.test.bind(IPv6_REGEX); - -var hasOwn = Object.prototype.hasOwnProperty; - -/** - * Get the largest number in the array. - * - * Returns -Infinity if the array is empty. - * - * @param {Array.} array The array to scan. - * @return {number} The largest number contained. - */ -function maxValue(array) { - var v = -Infinity, i = 0, n = array.length; - - for (; i < n; i++) { - if (array[i] > v) { - v = array[i]; - } - } - - return v; -} - -/** - * Check that an email address conforms to RFCs 5321, 5322 and others - * - * As of Version 3.0, we are now distinguishing clearly between a Mailbox - * as defined by RFC 5321 and an addr-spec as defined by RFC 5322. Depending - * on the context, either can be regarded as a valid email address. The - * RFC 5321 Mailbox specification is more restrictive (comments, white space - * and obsolete forms are not allowed). - * - * @param {string} email The email address to check. - * @param {boolean} checkDNS If true then will check DNS for MX records. If true - * this isEmail _will_ be asynchronous. - * @param {*} errorLevel Determines the boundary between valid and invalid - * addresses. Status codes above this number will be returned as-is, status - * codes below will be returned as ISEMAIL_VALID. Thus the calling program can - * simply look for ISEMAIL_VALID if it is only interested in whether an - * address is valid or not. The errorLevel will determine how "picky" - * isEmail() is about the address. If omitted or passed as false then - * isEmail() will return true or false rather than an integer error or - * warning. NB Note the difference between errorLevel = false and - * errorLevel = 0. - * @return {*} - */ -function isEmail(email, options, callback) { - if (typeof options === 'function') { - callback = options; - options = {}; - } - options || (options = {}); - - var threshold, diagnose; - if (typeof options.errorLevel === 'number') { - diagnose = true; - threshold = options.errorLevel; - } else { - diagnose = !!options.errorLevel; - threshold = ISEMAIL_VALID; - } - - if (options.tldWhitelist && typeof options.tldWhitelist !== 'object') { - throw new TypeError('expected array or object tldWhitelist'); - } - - if (options.minDomainAtoms && (options.minDomainAtoms !== - ((+options.minDomainAtoms) | 0) || options.minDomainAtoms < 0)) { - throw new TypeError('expected positive integer minDomainAtoms'); - } - - var maxResult = ISEMAIL_VALID; - - function updateResult(value) { - if (value > maxResult) { - maxResult = value; - } - } - - var context = { - now: COMPONENT_LOCALPART, - prev: COMPONENT_LOCALPART, - stack: [COMPONENT_LOCALPART] - }; - - var token = '', prevToken = '', charCode = 0; - var parseData = {local: '', domain: ''}; - var atomList = {local: [''], domain: ['']}; - - var elementCount = 0, elementLength = 0, crlfCount = 0; - var hyphenFlag = false, assertEnd = false; - - for (var i = 0; i < email.length; i++) { - token = email[i]; - - switch (context.now) { - // local-part - case COMPONENT_LOCALPART: - // http://tools.ietf.org/html/rfc5322#section-3.4.1 - // local-part = dot-atom / quoted-string / obs-local-part - // - // dot-atom = [CFWS] dot-atom-text [CFWS] - // - // dot-atom-text = 1*atext *("." 1*atext) - // - // quoted-string = [CFWS] - // DQUOTE *([FWS] qcontent) [FWS] DQUOTE - // [CFWS] - // - // obs-local-part = word *("." word) - // - // word = atom / quoted-string - // - // atom = [CFWS] 1*atext [CFWS] - switch (token) { - // comment - case '(': - if (elementLength === 0) { - // comments are OK at the beginning of an element - updateResult(elementCount === 0 ? ISEMAIL_CFWS_COMMENT : - ISEMAIL_DEPREC_COMMENT); - } else { - updateResult(ISEMAIL_CFWS_COMMENT); - // can't start a comment in an element, should be end - assertEnd = true; - } - context.stack.push(context.now); - context.now = CONTEXT_COMMENT; - break; - // next dot-atom element - case '.': - if (elementLength === 0) { - // another dot, already? - updateResult(elementCount === 0 ? ISEMAIL_ERR_DOT_START : - ISEMAIL_ERR_CONSECUTIVEDOTS); - } else { - // the entire local-part can be a quoted string for RFC 5321 - // if it's just one atom that is quoted then it's an RFC 5322 obsolete - // form - if (assertEnd) { - updateResult(ISEMAIL_DEPREC_LOCALPART); - } - - // CFWS & quoted strings are OK again now we're at the beginning of an - // element (although they are obsolete forms) - assertEnd = false; - elementLength = 0; - elementCount++; - parseData.local += token; - atomList.local[elementCount] = ''; // TODO: push? - } - break; - // quoted string - case '"': - if (elementLength === 0) { - // the entire local-part can be a quoted string for RFC 5321 - // if it's just one atom that is quoted then it's an RFC 5322 obsolete - // form - updateResult(elementCount === 0 ? ISEMAIL_RFC5321_QUOTEDSTRING : - ISEMAIL_DEPREC_LOCALPART); - - parseData.local += token; - atomList.local[elementCount] += token; - elementLength++; - assertEnd = true; // quoted string must be the entire element - context.stack.push(context.now); - context.now = CONTEXT_QUOTEDSTRING; - } else { - updateResult(ISEMAIL_ERR_EXPECTING_ATEXT); - } - break; - // folding white space - case '\r': - if ((++i === email.length) || email[i] !== '\n') { - // fatal error - updateResult(ISEMAIL_ERR_CR_NO_LF); - break; - } - case ' ': - case '\t': - if (elementLength === 0) { - updateResult(elementCount === 0 ? ISEMAIL_CFWS_FWS : - ISEMAIL_DEPREC_FWS); - } else { - // we can't start FWS in the middle of an element, better be end - assertEnd = true; - } - - context.stack.push(context.now); - context.now = CONTEXT_FWS; - prevToken = token; - break; - // @ - case '@': - // at this point we should have a valid local-part - /* istanbul ignore next: logically unreachable */ - if (context.stack.length !== 1) { - throw new Error('unexpected item on context stack'); - } - - if (parseData.local.length === 0) { - // fatal error - updateResult(ISEMAIL_ERR_NOLOCALPART); - } else if (elementLength === 0) { - // fatal error - updateResult(ISEMAIL_ERR_DOT_END); - // http://tools.ietf.org/html/rfc5321#section-4.5.3.1.1 - // the maximum total length of a user name or other local-part is 64 - // octets - } else if (parseData.local.length > 64) { - updateResult(ISEMAIL_RFC5322_LOCAL_TOOLONG); - // http://tools.ietf.org/html/rfc5322#section-3.4.1 - // comments and folding white space - // SHOULD NOT be used around the "@" in the addr-spec - // - // http://tools.ietf.org/html/rfc2119 - // 4. SHOULD NOT this phrase, or the phrase "NOT RECOMMENDED" mean that - // there may exist valid reasons in particular circumstances when the - // particular behavior is acceptable or even useful, but the full - // implications should be understood and the case carefully weighed - // before implementing any behavior described with this label - } else if ((context.prev === CONTEXT_COMMENT) || - (context.prev === CONTEXT_FWS)) { - updateResult(ISEMAIL_DEPREC_CFWS_NEAR_AT); - } - - // clear everything down for the domain parsing - context.now = COMPONENT_DOMAIN; // where we are - context.stack[0] = COMPONENT_DOMAIN; // where we have been - elementCount = 0; - elementLength = 0; - assertEnd = false; // CFWS can only appear at the end of the element - break; - // atext - default: - // http://tools.ietf.org/html/rfc5322#section-3.2.3 - // atext = ALPHA / DIGIT / ; Printable US-ASCII - // "!" / "#" / ; characters not including - // "$" / "%" / ; specials. Used for atoms. - // "&" / "'" / - // "*" / "+" / - // "-" / "/" / - // "=" / "?" / - // "^" / "_" / - // "`" / "{" / - // "|" / "}" / - // "~" - if (assertEnd) { - // we have encountered atext where it is no longer valid - switch (context.prev) { - case CONTEXT_COMMENT: - case CONTEXT_FWS: - updateResult(ISEMAIL_ERR_ATEXT_AFTER_CFWS); - break; - case CONTEXT_QUOTEDSTRING: - updateResult(ISEMAIL_ERR_ATEXT_AFTER_QS); - break; - /* istanbul ignore next: logically unreachable */ - default: - throw new Error('more atext found where none is allowed, ' + - 'but unrecognized prev context: ' + context.prev); - } - } else { - context.prev = context.now; - charCode = token.charCodeAt(0); - - if (charCode < 33 || charCode > 126 || charCode === 10 || - specialsLookup(charCode)) { - // fatal error - updateResult(ISEMAIL_ERR_EXPECTING_ATEXT); - } - - parseData.local += token; - atomList.local[elementCount] += token; - elementLength++; - } - } - break; - case COMPONENT_DOMAIN: - // http://tools.ietf.org/html/rfc5322#section-3.4.1 - // domain = dot-atom / domain-literal / obs-domain - // - // dot-atom = [CFWS] dot-atom-text [CFWS] - // - // dot-atom-text = 1*atext *("." 1*atext) - // - // domain-literal = [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS] - // - // dtext = %d33-90 / ; Printable US-ASCII - // %d94-126 / ; characters not including - // obs-dtext ; "[", "]", or "\" - // - // obs-domain = atom *("." atom) - // - // atom = [CFWS] 1*atext [CFWS] - - // http://tools.ietf.org/html/rfc5321#section-4.1.2 - // Mailbox = Local-part "@" ( Domain / address-literal ) - // - // Domain = sub-domain *("." sub-domain) - // - // address-literal = "[" ( IPv4-address-literal / - // IPv6-address-literal / - // General-address-literal ) "]" - // ; See Section 4.1.3 - - // http://tools.ietf.org/html/rfc5322#section-3.4.1 - // Note: A liberal syntax for the domain portion of addr-spec is - // given here. However, the domain portion contains addressing - // information specified by and used in other protocols (e.g., - // [RFC1034], [RFC1035], [RFC1123], [RFC5321]). It is therefore - // incumbent upon implementations to conform to the syntax of - // addresses for the context in which they are used. - // is_email() author's note: it's not clear how to interpret this in - // the context of a general email address validator. The conclusion I - // have reached is this: "addressing information" must comply with - // RFC 5321 (and in turn RFC 1035), anything that is "semantically - // invisible" must comply only with RFC 5322. - switch (token) { - // comment - case '(': - if (elementLength === 0) { - // comments at the start of the domain are deprecated in the text - // comments at the start of a subdomain are obs-domain - // (http://tools.ietf.org/html/rfc5322#section-3.4.1) - updateResult(elementCount === 0 ? ISEMAIL_DEPREC_CFWS_NEAR_AT : - ISEMAIL_DEPREC_COMMENT); - } else { - updateResult(ISEMAIL_CFWS_COMMENT); - assertEnd = true; // can't start a comment mid-element, better be end - } - - context.stack.push(context.now); - context.now = CONTEXT_COMMENT; - break; - // next dot-atom element - case '.': - if (elementLength === 0) { - // another dot, already? fatal error - updateResult(elementCount === 0 ? ISEMAIL_ERR_DOT_START : - ISEMAIL_ERR_CONSECUTIVEDOTS); - } else if (hyphenFlag) { - // previous subdomain ended in a hyphen - updateResult(ISEMAIL_ERR_DOMAINHYPHENEND); // fatal error - } else if (elementLength > 63) { - // Nowhere in RFC 5321 does it say explicitly that the - // domain part of a Mailbox must be a valid domain according - // to the DNS standards set out in RFC 1035, but this *is* - // implied in several places. For instance, wherever the idea - // of host routing is discussed the RFC says that the domain - // must be looked up in the DNS. This would be nonsense unless - // the domain was designed to be a valid DNS domain. Hence we - // must conclude that the RFC 1035 restriction on label length - // also applies to RFC 5321 domains. - // - // http://tools.ietf.org/html/rfc1035#section-2.3.4 - // labels 63 octets or less - - updateResult(ISEMAIL_RFC5322_LABEL_TOOLONG); - } - - // CFWS is OK again now we're at the beginning of an element (although - // it may be obsolete CFWS) - assertEnd = false; - elementLength = 0; - elementCount++; - atomList.domain[elementCount] = ''; - parseData.domain += token; - - break; - // domain literal - case '[': - if (parseData.domain.length === 0) { - // domain literal must be the only component - assertEnd = true; - elementLength++; - context.stack.push(context.now); - context.now = COMPONENT_LITERAL; - parseData.domain += token; - atomList.domain[elementCount] += token; - parseData.literal = ''; - } else { - // fatal error - updateResult(ISEMAIL_ERR_EXPECTING_ATEXT); - } - break; - // folding white space - case '\r': - if ((++i === email.length) || email[i] !== '\n') { - // fatal error - updateResult(ISEMAIL_ERR_CR_NO_LF); - break; - } - case ' ': - case '\t': - if (elementLength === 0) { - updateResult(elementCount === 0 ? ISEMAIL_DEPREC_CFWS_NEAR_AT : - ISEMAIL_DEPREC_FWS); - } else { - // we can't start FWS in the middle of an element, so this better be - // the end - updateResult(ISEMAIL_CFWS_FWS); - assertEnd = true; - } - - context.stack.push(context.now); - context.now = CONTEXT_FWS; - prevToken = token; - break; - // atext - default: - // RFC 5322 allows any atext... - // http://tools.ietf.org/html/rfc5322#section-3.2.3 - // atext = ALPHA / DIGIT / ; Printable US-ASCII - // "!" / "#" / ; characters not including - // "$" / "%" / ; specials. Used for atoms. - // "&" / "'" / - // "*" / "+" / - // "-" / "/" / - // "=" / "?" / - // "^" / "_" / - // "`" / "{" / - // "|" / "}" / - // "~" - - // But RFC 5321 only allows letter-digit-hyphen to comply with DNS rules - // (RFCs 1034 & 1123) - // http://tools.ietf.org/html/rfc5321#section-4.1.2 - // sub-domain = Let-dig [Ldh-str] - // - // Let-dig = ALPHA / DIGIT - // - // Ldh-str = *( ALPHA / DIGIT / "-" ) Let-dig - // - if (assertEnd) { - // we have encountered atext where it is no longer valid - switch (context.prev) { - case CONTEXT_COMMENT: - case CONTEXT_FWS: - updateResult(ISEMAIL_ERR_ATEXT_AFTER_CFWS); - break; - case COMPONENT_LITERAL: - updateResult(ISEMAIL_ERR_ATEXT_AFTER_DOMLIT); - break; - /* istanbul ignore next: logically unreachable */ - default: - throw new Error('more atext found where none is allowed, ' + - 'but unrecognized prev context: ' + context.prev); - } - } - - charCode = token.charCodeAt(0); - // assume this token isn't a hyphen unless we discover it is - hyphenFlag = false; - - if (charCode < 33 || charCode > 126 || specialsLookup(charCode)) { - // fatal error - updateResult(ISEMAIL_ERR_EXPECTING_ATEXT); - } else if (token === '-') { - if (elementLength === 0) { - // hyphens can't be at the beginning of a subdomain - updateResult(ISEMAIL_ERR_DOMAINHYPHENSTART); // fatal error - } - - hyphenFlag = true; - } else if (!((charCode > 47 && charCode < 58) || - (charCode > 64 && charCode < 91) || - (charCode > 96 && charCode < 123))) { - // not an RFC 5321 subdomain, but still OK by RFC 5322 - updateResult(ISEMAIL_RFC5322_DOMAIN); - } - - parseData.domain += token; - atomList.domain[elementCount] += token; - elementLength++; - } - break; - // domain literal - case COMPONENT_LITERAL: - // http://tools.ietf.org/html/rfc5322#section-3.4.1 - // domain-literal = [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS] - // - // dtext = %d33-90 / ; Printable US-ASCII - // %d94-126 / ; characters not including - // obs-dtext ; "[", "]", or "\" - // - // obs-dtext = obs-NO-WS-CTL / quoted-pair - switch (token) { - // end of domain literal - case ']': - if (maxResult < ISEMAIL_DEPREC) { - // Could be a valid RFC 5321 address literal, so let's check - - // http://tools.ietf.org/html/rfc5321#section-4.1.2 - // address-literal = "[" ( IPv4-address-literal / - // IPv6-address-literal / - // General-address-literal ) "]" - // ; See Section 4.1.3 - // - // http://tools.ietf.org/html/rfc5321#section-4.1.3 - // IPv4-address-literal = Snum 3("." Snum) - // - // IPv6-address-literal = "IPv6:" IPv6-addr - // - // General-address-literal = Standardized-tag ":" 1*dcontent - // - // Standardized-tag = Ldh-str - // ; Standardized-tag MUST be specified in a - // ; Standards-Track RFC and registered with IANA - // - // dcontent = %d33-90 / ; Printable US-ASCII - // %d94-126 ; excl. "[", "\", "]" - // - // Snum = 1*3DIGIT - // ; representing a decimal integer - // ; value in the range 0 through 255 - // - // IPv6-addr = IPv6-full / IPv6-comp / IPv6v4-full / IPv6v4-comp - // - // IPv6-hex = 1*4HEXDIG - // - // IPv6-full = IPv6-hex 7(":" IPv6-hex) - // - // IPv6-comp = [IPv6-hex *5(":" IPv6-hex)] "::" - // [IPv6-hex *5(":" IPv6-hex)] - // ; The "::" represents at least 2 16-bit groups of - // ; zeros. No more than 6 groups in addition to the - // ; "::" may be present. - // - // IPv6v4-full = IPv6-hex 5(":" IPv6-hex) ":" IPv4-address-literal - // - // IPv6v4-comp = [IPv6-hex *3(":" IPv6-hex)] "::" - // [IPv6-hex *3(":" IPv6-hex) ":"] - // IPv4-address-literal - // ; The "::" represents at least 2 16-bit groups of - // ; zeros. No more than 4 groups in addition to the - // ; "::" and IPv4-address-literal may be present. - // - // is_email() author's note: We can't use ip2long() to validate - // IPv4 addresses because it accepts abbreviated addresses - // (xxx.xxx.xxx), expanding the last group to complete the address. - // filter_var() validates IPv6 address inconsistently (up to PHP 5.3.3 - // at least) -- see http://bugs.php.net/bug.php?id=53236 for example - - // TODO: var here? - var maxGroups = 8, matchesIP, index = false; - var addressLiteral = parseData.literal; - - // maybe extract IPv4 part from the end of the address-literal - if (matchesIP = IPv4_REGEX.exec(addressLiteral)) { - if ((index = matchesIP.index) !== 0) { - // convert IPv4 part to IPv6 format for futher testing - addressLiteral = addressLiteral.slice(0, matchesIP.index) + '0:0'; - } - } - - if (index === 0) { - // nothing there except a valid IPv4 address, so... - updateResult(ISEMAIL_RFC5321_ADDRESSLITERAL); - } else if (addressLiteral.slice(0, 5).toLowerCase() !== 'ipv6:') { - updateResult(ISEMAIL_RFC5322_DOMAINLITERAL); - } else { - var match = addressLiteral.substr(5); - matchesIP = match.split(':'); - index = match.indexOf('::'); - - if (!~index) { - // need exactly the right number of groups - if (matchesIP.length !== maxGroups) { - updateResult(ISEMAIL_RFC5322_IPV6_GRPCOUNT); - } - } else if (index !== match.lastIndexOf('::')) { - updateResult(ISEMAIL_RFC5322_IPV6_2X2XCOLON); - } else { - if (index === 0 || index === match.length - 2) { - // RFC 4291 allows :: at the start or end of an address with - // 7 other groups in addition - maxGroups++; - } - - if (matchesIP.length > maxGroups) { - updateResult(ISEMAIL_RFC5322_IPV6_MAXGRPS); - } else if (matchesIP.length === maxGroups) { - // eliding a single "::" - updateResult(ISEMAIL_RFC5321_IPV6DEPRECATED); - } - } - - // IPv6 testing strategy - if (match[0] === ':' && match[1] !== ':') { - updateResult(ISEMAIL_RFC5322_IPV6_COLONSTRT); - } else if (match[match.length - 1] === ':' && - match[match.length - 2] !== ':') { - updateResult(ISEMAIL_RFC5322_IPV6_COLONEND); - } else if (matchesIP.every(IPv6_REGEX_TEST)) { - updateResult(ISEMAIL_RFC5321_ADDRESSLITERAL); - } else { - updateResult(ISEMAIL_RFC5322_IPV6_BADCHAR); - } - } - } else { - updateResult(ISEMAIL_RFC5322_DOMAINLITERAL); - } - - parseData.domain += token; - atomList.domain[elementCount] += token; - elementLength++; - context.prev = context.now; - context.now = context.stack.pop(); - break; - case '\\': - updateResult(ISEMAIL_RFC5322_DOMLIT_OBSDTEXT); - context.stack.push(context.now); - context.now = CONTEXT_QUOTEDPAIR; - break; - // folding white space - case '\r': - if ((++i === email.length) || email[i] !== '\n') { - // fatal error - updateResult(ISEMAIL_ERR_CR_NO_LF); - break; - } - case ' ': - case '\t': - updateResult(ISEMAIL_CFWS_FWS); - - context.stack.push(context.now); - context.now = CONTEXT_FWS; - prevToken = token; - break; - // dtext - default: - // http://tools.ietf.org/html/rfc5322#section-3.4.1 - // dtext = %d33-90 / ; Printable US-ASCII - // %d94-126 / ; characters not including - // obs-dtext ; "[", "]", or "\" - // - // obs-dtext = obs-NO-WS-CTL / quoted-pair - // - // obs-NO-WS-CTL = %d1-8 / ; US-ASCII control - // %d11 / ; characters that do not - // %d12 / ; include the carriage - // %d14-31 / ; return, line feed, and - // %d127 ; white space characters - charCode = token.charCodeAt(0); - - // CR, LF, SP & HTAB have already been parsed above - if (charCode > 127 || charCode === 0 || token === '[') { - // fatal error - updateResult(ISEMAIL_ERR_EXPECTING_DTEXT); - break; - } else if (charCode < 33 || charCode === 127) { - updateResult(ISEMAIL_RFC5322_DOMLIT_OBSDTEXT); - } - - parseData.literal += token; - parseData.domain += token; - atomList.domain[elementCount] += token; - elementLength++; - } - break; - // quoted string - case CONTEXT_QUOTEDSTRING: - // http://tools.ietf.org/html/rfc5322#section-3.2.4 - // quoted-string = [CFWS] - // DQUOTE *([FWS] qcontent) [FWS] DQUOTE - // [CFWS] - // - // qcontent = qtext / quoted-pair - switch (token) { - // quoted pair - case '\\': - context.stack.push(context.now); - context.now = CONTEXT_QUOTEDPAIR; - break; - // folding white space - // inside a quoted string, spaces are allowed as regular characters - // it's only FWS if we include HTAB or CRLF - case '\r': - if ((++i === email.length) || email[i] !== '\n') { - // fatal error - updateResult(ISEMAIL_ERR_CR_NO_LF); - break; - } - case '\t': - // http://tools.ietf.org/html/rfc5322#section-3.2.2 - // Runs of FWS, comment, or CFWS that occur between lexical tokens in - // a structured header field are semantically interpreted as a single - // space character. - - // http://tools.ietf.org/html/rfc5322#section-3.2.4 - // the CRLF in any FWS/CFWS that appears within the quoted-string [is] - // semantically "invisible" and therefore not part of the - // quoted-string - - parseData.local += ' '; - atomList.local[elementCount] += ' '; - elementLength++; - - updateResult(ISEMAIL_CFWS_FWS); - context.stack.push(context.now); - context.now = CONTEXT_FWS; - prevToken = token; - break; - // end of quoted string - case '"': - parseData.local += token; - atomList.local[elementCount] += token; - elementLength++; - context.prev = context.now; - context.now = context.stack.pop(); - break; - // qtext - default: - // http://tools.ietf.org/html/rfc5322#section-3.2.4 - // qtext = %d33 / ; Printable US-ASCII - // %d35-91 / ; characters not including - // %d93-126 / ; "\" or the quote character - // obs-qtext - // - // obs-qtext = obs-NO-WS-CTL - // - // obs-NO-WS-CTL = %d1-8 / ; US-ASCII control - // %d11 / ; characters that do not - // %d12 / ; include the carriage - // %d14-31 / ; return, line feed, and - // %d127 ; white space characters - charCode = token.charCodeAt(0); - - if (charCode > 127 || charCode === 0 || charCode === 10) { - updateResult(ISEMAIL_ERR_EXPECTING_QTEXT); - } else if (charCode < 32 || charCode === 127) { - updateResult(ISEMAIL_DEPREC_QTEXT); - } - - parseData.local += token; - atomList.local[elementCount] += token; - elementLength++; - } - - // http://tools.ietf.org/html/rfc5322#section-3.4.1 - // If the string can be represented as a dot-atom (that is, it contains - // no characters other than atext characters or "." surrounded by atext - // characters), then the dot-atom form SHOULD be used and the quoted- - // string form SHOULD NOT be used. - - break; - // quoted pair - case CONTEXT_QUOTEDPAIR: - // http://tools.ietf.org/html/rfc5322#section-3.2.1 - // quoted-pair = ("\" (VCHAR / WSP)) / obs-qp - // - // VCHAR = %d33-126 ; visible (printing) characters - // WSP = SP / HTAB ; white space - // - // obs-qp = "\" (%d0 / obs-NO-WS-CTL / LF / CR) - // - // obs-NO-WS-CTL = %d1-8 / ; US-ASCII control - // %d11 / ; characters that do not - // %d12 / ; include the carriage - // %d14-31 / ; return, line feed, and - // %d127 ; white space characters - // - // i.e. obs-qp = "\" (%d0-8, %d10-31 / %d127) - charCode = token.charCodeAt(0); - - if (charCode > 127) { - // fatal error - updateResult(ISEMAIL_ERR_EXPECTING_QPAIR); - } else if ((charCode < 31 && charCode !== 9) || charCode === 127) { - // SP & HTAB are allowed - updateResult(ISEMAIL_DEPREC_QP); - } - - // At this point we know where this qpair occurred so - // we could check to see if the character actually - // needed to be quoted at all. - // http://tools.ietf.org/html/rfc5321#section-4.1.2 - // the sending system SHOULD transmit the - // form that uses the minimum quoting possible. - - // TODO: check whether the character needs to be quoted (escaped) - // in this context - - context.prev = context.now; - context.now = context.stack.pop(); // end of qpair - token = '\\' + token; - - switch (context.now) { - case CONTEXT_COMMENT: break; - case CONTEXT_QUOTEDSTRING: - parseData.local += token; - atomList.local[elementCount] += token; - - // the maximum sizes specified by RFC 5321 are octet counts, - // so we must include the backslash - elementLength += 2; - break; - case COMPONENT_LITERAL: - parseData.domain += token; - atomList.domain[elementCount] += token; - - // the maximum sizes specified by RFC 5321 are octet counts, - // so we must include the backslash - elementLength += 2; - break; - /* istanbul ignore next: logically unreachable */ - default: - throw new Error('quoted pair logic invoked in an invalid context: ' + - context.now); - } - break; - // comment - case CONTEXT_COMMENT: - // http://tools.ietf.org/html/rfc5322#section-3.2.2 - // comment = "(" *([FWS] ccontent) [FWS] ")" - // - // ccontent = ctext / quoted-pair / comment - switch (token) { - // nested comment - case '(': - // nested comments are ok - context.stack.push(context.now); - context.now = CONTEXT_COMMENT; - break; - // end of comment - case ')': - context.prev = context.now; - context.now = context.stack.pop(); - - break; - // quoted pair - case '\\': - context.stack.push(context.now); - context.now = CONTEXT_QUOTEDPAIR; - break; - // folding white space - case '\r': - if ((++i === email.length) || email[i] !== '\n') { - // fatal error - updateResult(ISEMAIL_ERR_CR_NO_LF); - break; - } - case ' ': - case '\t': - updateResult(ISEMAIL_CFWS_FWS); - - context.stack.push(context.now); - context.now = CONTEXT_FWS; - prevToken = token; - break; - // ctext - default: - // http://tools.ietf.org/html/rfc5322#section-3.2.3 - // ctext = %d33-39 / ; Printable US-ASCII - // %d42-91 / ; characters not including - // %d93-126 / ; "(", ")", or "\" - // obs-ctext - // - // obs-ctext = obs-NO-WS-CTL - // - // obs-NO-WS-CTL = %d1-8 / ; US-ASCII control - // %d11 / ; characters that do not - // %d12 / ; include the carriage - // %d14-31 / ; return, line feed, and - // %d127 ; white space characters - charCode = token.charCodeAt(0); - - if (charCode > 127 || charCode === 0 || charCode === 10) { - // fatal error - updateResult(ISEMAIL_ERR_EXPECTING_CTEXT); - break; - } else if (charCode < 32 || charCode === 127) { - updateResult(ISEMAIL_DEPREC_CTEXT); - } - } - break; - // folding white space - case CONTEXT_FWS: - // http://tools.ietf.org/html/rfc5322#section-3.2.2 - // FWS = ([*WSP CRLF] 1*WSP) / obs-FWS - // ; Folding white space - - // But note the erratum: - // http://www.rfc-editor.org/errata_search.php?rfc=5322&eid=1908: - // In the obsolete syntax, any amount of folding white space MAY be - // inserted where the obs-FWS rule is allowed. This creates the - // possibility of having two consecutive "folds" in a line, and - // therefore the possibility that a line which makes up a folded header - // field could be composed entirely of white space. - // - // obs-FWS = 1*([CRLF] WSP) - - if (prevToken === '\r') { - if (token === '\r') { - // fatal error - updateResult(ISEMAIL_ERR_FWS_CRLF_X2); - break; - } - - if (++crlfCount > 1) { - // multiple folds = obsolete FWS - updateResult(ISEMAIL_DEPREC_FWS); - } else { - crlfCount = 1; - } - } - - switch (token) { - case '\r': - if ((++i === email.length) || email[i] !== '\n') { - // fatal error - updateResult(ISEMAIL_ERR_CR_NO_LF); - } - break; - case ' ': - case '\t': - break; - default: - if (prevToken === '\r') { - // fatal error - updateResult(ISEMAIL_ERR_FWS_CRLF_END); - } - - crlfCount = 0; - - context.prev = context.now; - context.now = context.stack.pop(); // end of FWS - - i--; // look at this token again in the parent context - } - prevToken = token; - break; - // unexpected context - /* istanbul ignore next: logically unreachable */ - default: - throw new Error('unknown context: ' + context.now); - } // primary state machine - - if (maxResult > ISEMAIL_RFC5322) { - // fatal error, no point continuing - break; - } - } // token loop - - // check for errors - if (maxResult < ISEMAIL_RFC5322) { - // fatal errors - if (context.now === CONTEXT_QUOTEDSTRING) { - updateResult(ISEMAIL_ERR_UNCLOSEDQUOTEDSTR); - } else if (context.now === CONTEXT_QUOTEDPAIR) { - updateResult(ISEMAIL_ERR_BACKSLASHEND); - } else if (context.now === CONTEXT_COMMENT) { - updateResult(ISEMAIL_ERR_UNCLOSEDCOMMENT); - } else if (context.now === COMPONENT_LITERAL) { - updateResult(ISEMAIL_ERR_UNCLOSEDDOMLIT); - } else if (token === '\r') { - updateResult(ISEMAIL_ERR_FWS_CRLF_END); - } else if (parseData.domain.length === 0) { - updateResult(ISEMAIL_ERR_NODOMAIN); - } else if (elementLength === 0) { - updateResult(ISEMAIL_ERR_DOT_END); - } else if (hyphenFlag) { - updateResult(ISEMAIL_ERR_DOMAINHYPHENEND); - - // other errors - } else if (parseData.domain.length > 255) { - // http://tools.ietf.org/html/rfc5321#section-4.5.3.1.2 - // The maximum total length of a domain name or number is 255 octets. - updateResult(ISEMAIL_RFC5322_DOMAIN_TOOLONG); - } else if (parseData.local.length + parseData.domain.length + /* '@' */ 1 > - 254) { - // http://tools.ietf.org/html/rfc5321#section-4.1.2 - // Forward-path = Path - // - // Path = "<" [ A-d-l ":" ] Mailbox ">" - // - // http://tools.ietf.org/html/rfc5321#section-4.5.3.1.3 - // The maximum total length of a reverse-path or forward-path is 256 - // octets (including the punctuation and element separators). - // - // Thus, even without (obsolete) routing information, the Mailbox can - // only be 254 characters long. This is confirmed by this verified - // erratum to RFC 3696: - // - // http://www.rfc-editor.org/errata_search.php?rfc=3696&eid=1690 - // However, there is a restriction in RFC 2821 on the length of an - // address in MAIL and RCPT commands of 254 characters. Since addresses - // that do not fit in those fields are not normally useful, the upper - // limit on address lengths should normally be considered to be 254. - updateResult(ISEMAIL_RFC5322_TOOLONG); - } else if (elementLength > 63) { - // http://tools.ietf.org/html/rfc1035#section-2.3.4 - // labels 63 octets or less - updateResult(ISEMAIL_RFC5322_LABEL_TOOLONG); - } else if (options.minDomainAtoms && atomList.domain.length < - options.minDomainAtoms) { - updateResult(ISEMAIL_ERR_TOOSHORT_DOMAIN); - } else if (options.tldWhitelist) { - var tldAtom = atomList.domain[elementCount], tldValid = false, n; - if (Array.isArray(options.tldWhitelist)) { - for (i = 0, n = options.tldWhitelist.length; i < n; i++) { - if (tldAtom === options.tldWhitelist[i]) { - tldValid = true; - break; - } - } - } else { - tldValid = hasOwn.call(options.tldWhitelist, tldAtom); - } - if (!tldValid) { - updateResult(ISEMAIL_ERR_UNKNOWN_TLD); - } - } - } // check for errors - - var dnsPositive = false; - - if (options.checkDNS && maxResult < ISEMAIL_DNSWARN && HAS_REQUIRE) { - dns || (dns = require('dns')); - // http://tools.ietf.org/html/rfc5321#section-2.3.5 - // Names that can - // be resolved to MX RRs or address (i.e., A or AAAA) RRs (as discussed - // in Section 5) are permitted, as are CNAME RRs whose targets can be - // resolved, in turn, to MX or address RRs. - // - // http://tools.ietf.org/html/rfc5321#section-5.1 - // The lookup first attempts to locate an MX record associated with the - // name. If a CNAME record is found, the resulting name is processed as - // if it were the initial name. ... If an empty list of MXs is returned, - // the address is treated as if it was associated with an implicit MX - // RR, with a preference of 0, pointing to that host. - // - // isEmail() author's note: We will regard the existence of a CNAME to be - // sufficient evidence of the domain's existence. For performance reasons - // we will not repeat the DNS lookup for the CNAME's target, but we will - // raise a warning because we didn't immediately find an MX record. - if (elementCount === 0) { - // checking TLD DNS only works if you explicitly check from the root - parseData.domain += '.'; - } - - var dnsDomain = parseData.domain; - dns.resolveMx(dnsDomain, function(err, records) { - if ((err && err.code !== dns.NODATA) || (!err && !records)) { - updateResult(ISEMAIL_DNSWARN_NO_RECORD); - return finish(); - } - if (records && records.length) { - dnsPositive = true; - return finish(); - } - var done = false, count = 3; - updateResult(ISEMAIL_DNSWARN_NO_MX_RECORD); - dns.resolveCname(dnsDomain, handleRecords); - dns.resolve4(dnsDomain, handleRecords); - dns.resolve6(dnsDomain, handleRecords); - function handleRecords(err, records) { - if (done) return; - count--; - if (!err && records && records.length) { - done = true; - return finish(); - } - if (count === 0) { - // no usable records for the domain can be found - updateResult(ISEMAIL_DNSWARN_NO_RECORD); - done = true; - finish(); - } - } - }); - } else if (options.checkDNS) { - // guarantee asynchronicity - typeof process !== 'undefined' && process && - typeof process.nextTick === 'function' - ? process.nextTick(finish) - : setTimeout(finish, 1); - } else { - return finish(); - } // checkDNS - - function finish() { - if (!dnsPositive && maxResult < ISEMAIL_DNSWARN) { - if (elementCount === 0) { - updateResult(ISEMAIL_RFC5321_TLD); - } else { - var charCode = atomList.domain[elementCount].charCodeAt(0); - if (charCode >= 48 && charCode <= 57) { - updateResult(ISEMAIL_RFC5321_TLDNUMERIC); - } - } - } - - if (maxResult < threshold) { - maxResult = ISEMAIL_VALID; - } - - if (!diagnose) { - maxResult = maxResult < THRESHOLD; - } - - if (typeof callback === 'function') { - callback(maxResult); - } - - return maxResult; - } // finish -} // isEmail - -module.exports = isEmail; diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/package.json b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/package.json deleted file mode 100644 index ba3eac0..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/package.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "isemail", - "version": "1.1.1", - "author": { - "name": "Eli Skeggs", - "email": "skeggse@gmail.com" - }, - "description": "validate an email address according to RFCs 5321, 5322, and others", - "main": "./index", - "scripts": { - "test": "./node_modules/.bin/mocha" - }, - "repository": { - "type": "git", - "url": "https://github.com/globesherpa/node-isemail.git" - }, - "homepage": "https://github.com/globesherpa/node-isemail", - "bugs": { - "url": "https://github.com/globesherpa/node-isemail/issues" - }, - "keywords": [ - "isemail", - "validation", - "check", - "checking", - "verification", - "email", - "address", - "email address" - ], - "devDependencies": { - "mocha": "~1.13.0", - "chai": "~1.9.1" - }, - "licenses": [ - { - "type": "BSD", - "url": "http://www.opensource.org/licenses/bsd-license.php" - } - ], - "engines": { - "node": "*" - }, - "readme": "isemail\n=======\n\n[![Build Status](https://travis-ci.org/globesherpa/node-isemail.png)](https://travis-ci.org/globesherpa/node-isemail)\n[![Coverage Status](https://coveralls.io/repos/globesherpa/node-isemail/badge.png?branch=master)](https://coveralls.io/r/globesherpa/node-isemail?branch=master)\n\nThis first version of `isemail` is a port of the PHP `is_email` function by Dominic Sayers.\n\nFuture versions will improve upon the current version, optimizing it for efficient usage and DRYing the code.\n\nInstall\n-------\n\n```sh\n$ npm install isemail\n```\n\nTest\n----\n\nThe tests were pulled from is_email's extensive [test suite][tests] on October 15, 2013. Many thanks to the contributors!\n\nRun any of the following.\n\n```sh\n$ mocha\n$ npm test\n$ make test\n```\n\n_remember to_ `npm install`!\n\nAPI\n---\n\n### isEmail(email, [options], [callback])\n\nDetermines whether the `email` is valid or not, for various definitions thereof. Optionally accepts an `options` object and a `callback` function. Options may include `errorLevel` and `checkDNS`. The `callback` function will always be called if specified, and the result of the operation supplied as the only parameter to the callback function. If `isEmail` is not asked to check for the existence of the domain (`checkDNS`), it will also synchronously return the result of the operation.\n\nUse `errorLevel` to specify the type of result for `isEmail`. Passing a `false` literal will result in a true or false boolean indicating whether the email address is sufficiently defined for use in sending an email. Passing a `true` literal will result in a more granular numeric status, with zero being a perfectly valid email address. Passing a number will return `0` if the numeric status is below the `errorLevel` and the numeric status otherwise.\n\nThe `tldWhitelist` option can be either an object lookup table or an array of valid top-level domains. If the email address has a top-level domain that is not in the whitelist, the email will be marked as invalid.\n\nThe `minDomainAtoms` option is an optional positive integer that specifies the minimum number of domain atoms that must be included for the email address to be considered valid. Be careful with the option, as some top-level domains, like `io`, directly support email addresses.\n\n#### Examples\n\n```js\n$ node\n> var isEmail = require('isemail');\nundefined\n> var log = console.log.bind(console, 'result');\nundefined\n> isEmail('test@iana.org');\ntrue\n> isEmail('test@iana.org', log);\nresult true\ntrue\n> isEmail('test@iana.org', {checkDNS: true});\nundefined\n> isEmail('test@iana.org', {checkDNS: true}, log);\nundefined\nresult true\n> isEmail('test@iana.org', {errorLevel: true});\n0\n> isEmail('test@iana.org', {errorLevel: true}, log);\nresult 0\n0\n> isEmail('test@e.com');\ntrue\n> isEmail('test@e.com', {checkDNS: true, errorLevel: true}, log);\nundefined\nresult 6\n> isEmail('test@e.com', {checkDNS: true, errorLevel: 7}, log);\nundefined\nresult 0\n> isEmail('test@e.com', {checkDNS: true, errorLevel: 6}, log);\nundefined\nresult 6\n```\n\nTODO\n====\n\nAdd tests for library usage, not just functionality comparisons.\n\nLicense\n=======\n\n[BSD License](http://www.opensource.org/licenses/bsd-license.php)\n\n[tests]: http://isemail.info/_system/is_email/test/?all‎ \"is_email test suite\"\n", - "readmeFilename": "README.md", - "_id": "isemail@1.1.1", - "dist": { - "shasum": "1dc5963b585bcbfc8e794ab5f3dd1c4c7ab93cb8" - }, - "_from": "isemail@1.x.x", - "_resolved": "https://registry.npmjs.org/isemail/-/isemail-1.1.1.tgz" -} diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/test/isemail.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/test/isemail.js deleted file mode 100644 index 3bdfe7a..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/test/isemail.js +++ /dev/null @@ -1,279 +0,0 @@ -var expect = require('chai').expect; - -// diagnoses -var diagnoses = { - ISEMAIL_VALID: 0, - ISEMAIL_DNSWARN_NO_MX_RECORD: 5, - ISEMAIL_DNSWARN_NO_RECORD: 6, - ISEMAIL_RFC5321_TLD: 9, - ISEMAIL_RFC5321_TLDNUMERIC: 10, - ISEMAIL_RFC5321_QUOTEDSTRING: 11, - ISEMAIL_RFC5321_ADDRESSLITERAL: 12, - ISEMAIL_RFC5321_IPV6DEPRECATED: 13, - ISEMAIL_CFWS_COMMENT: 17, - ISEMAIL_CFWS_FWS: 18, - ISEMAIL_DEPREC_LOCALPART: 33, - ISEMAIL_DEPREC_FWS: 34, - ISEMAIL_DEPREC_QTEXT: 35, - ISEMAIL_DEPREC_QP: 36, - ISEMAIL_DEPREC_COMMENT: 37, - ISEMAIL_DEPREC_CTEXT: 38, - ISEMAIL_DEPREC_CFWS_NEAR_AT: 49, - ISEMAIL_RFC5322_DOMAIN: 65, - ISEMAIL_RFC5322_TOOLONG: 66, - ISEMAIL_RFC5322_LOCAL_TOOLONG: 67, - ISEMAIL_RFC5322_DOMAIN_TOOLONG: 68, - ISEMAIL_RFC5322_LABEL_TOOLONG: 69, - ISEMAIL_RFC5322_DOMAINLITERAL: 70, - ISEMAIL_RFC5322_DOMLIT_OBSDTEXT: 71, - ISEMAIL_RFC5322_IPV6_GRPCOUNT: 72, - ISEMAIL_RFC5322_IPV6_2X2XCOLON: 73, - ISEMAIL_RFC5322_IPV6_BADCHAR: 74, - ISEMAIL_RFC5322_IPV6_MAXGRPS: 75, - ISEMAIL_RFC5322_IPV6_COLONSTRT: 76, - ISEMAIL_RFC5322_IPV6_COLONEND: 77, - ISEMAIL_ERR_EXPECTING_DTEXT: 129, - ISEMAIL_ERR_NOLOCALPART: 130, - ISEMAIL_ERR_NODOMAIN: 131, - ISEMAIL_ERR_CONSECUTIVEDOTS: 132, - ISEMAIL_ERR_ATEXT_AFTER_CFWS: 133, - ISEMAIL_ERR_ATEXT_AFTER_QS: 134, - ISEMAIL_ERR_ATEXT_AFTER_DOMLIT: 135, - ISEMAIL_ERR_EXPECTING_QPAIR: 136, - ISEMAIL_ERR_EXPECTING_ATEXT: 137, - ISEMAIL_ERR_EXPECTING_QTEXT: 138, - ISEMAIL_ERR_EXPECTING_CTEXT: 139, - ISEMAIL_ERR_BACKSLASHEND: 140, - ISEMAIL_ERR_DOT_START: 141, - ISEMAIL_ERR_DOT_END: 142, - ISEMAIL_ERR_DOMAINHYPHENSTART: 143, - ISEMAIL_ERR_DOMAINHYPHENEND: 144, - ISEMAIL_ERR_UNCLOSEDQUOTEDSTR: 145, - ISEMAIL_ERR_UNCLOSEDCOMMENT: 146, - ISEMAIL_ERR_UNCLOSEDDOMLIT: 147, - ISEMAIL_ERR_FWS_CRLF_X2: 148, - ISEMAIL_ERR_FWS_CRLF_END: 149, - ISEMAIL_ERR_CR_NO_LF: 150, - ISEMAIL_ERR_UNKNOWN_TLD: 160, - ISEMAIL_ERR_TOOSHORT_TLD: 161 -}; - -// expectations -var expectations = [ - ['', diagnoses.ISEMAIL_ERR_NODOMAIN], - ['test', diagnoses.ISEMAIL_ERR_NODOMAIN], - ['@', diagnoses.ISEMAIL_ERR_NOLOCALPART], - ['test@', diagnoses.ISEMAIL_ERR_NODOMAIN], - ['test@io', diagnoses.ISEMAIL_VALID], - ['@io', diagnoses.ISEMAIL_ERR_NOLOCALPART], - ['@iana.org', diagnoses.ISEMAIL_ERR_NOLOCALPART], - ['test@iana.org', diagnoses.ISEMAIL_VALID], - ['test@nominet.org.uk', diagnoses.ISEMAIL_VALID], - ['test@about.museum', diagnoses.ISEMAIL_VALID], - ['a@iana.org', diagnoses.ISEMAIL_VALID], - ['test@e.com', diagnoses.ISEMAIL_DNSWARN_NO_RECORD], - ['test@iana.a', diagnoses.ISEMAIL_DNSWARN_NO_RECORD], - ['test.test@iana.org', diagnoses.ISEMAIL_VALID], - ['.test@iana.org', diagnoses.ISEMAIL_ERR_DOT_START], - ['test.@iana.org', diagnoses.ISEMAIL_ERR_DOT_END], - ['test..iana.org', diagnoses.ISEMAIL_ERR_CONSECUTIVEDOTS], - ['test_exa-mple.com', diagnoses.ISEMAIL_ERR_NODOMAIN], - ['!#$%&`*+/=?^`{|}~@iana.org', diagnoses.ISEMAIL_VALID], - ['test\\@test@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], - ['123@iana.org', diagnoses.ISEMAIL_VALID], - ['test@123.com', diagnoses.ISEMAIL_VALID], - ['test@iana.123', diagnoses.ISEMAIL_RFC5321_TLDNUMERIC], - ['test@255.255.255.255', diagnoses.ISEMAIL_RFC5321_TLDNUMERIC], - ['abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@iana.org', diagnoses.ISEMAIL_VALID], - ['abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklmn@iana.org', diagnoses.ISEMAIL_RFC5322_LOCAL_TOOLONG], - ['test@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm', diagnoses.ISEMAIL_RFC5322_LABEL_TOOLONG], - ['test@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.com', diagnoses.ISEMAIL_DNSWARN_NO_RECORD], - ['test@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm.com', diagnoses.ISEMAIL_RFC5322_LABEL_TOOLONG], - ['test@mason-dixon.com', diagnoses.ISEMAIL_VALID], - ['test@-iana.org', diagnoses.ISEMAIL_ERR_DOMAINHYPHENSTART], - ['test@iana-.com', diagnoses.ISEMAIL_ERR_DOMAINHYPHENEND], - ['test@aaad.com', diagnoses.ISEMAIL_DNSWARN_NO_MX_RECORD], - ['test@iana.co-uk', diagnoses.ISEMAIL_DNSWARN_NO_RECORD], - ['test@.iana.org', diagnoses.ISEMAIL_ERR_DOT_START], - ['test@iana.org.', diagnoses.ISEMAIL_ERR_DOT_END], - ['test@iana..com', diagnoses.ISEMAIL_ERR_CONSECUTIVEDOTS], - ['a@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.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.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.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.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v', diagnoses.ISEMAIL_DNSWARN_NO_RECORD], - ['abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghi', diagnoses.ISEMAIL_DNSWARN_NO_RECORD], - ['abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghij', diagnoses.ISEMAIL_RFC5322_TOOLONG], - ['a@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.hij', diagnoses.ISEMAIL_RFC5322_TOOLONG], - ['a@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.hijk', diagnoses.ISEMAIL_RFC5322_DOMAIN_TOOLONG], - ['"test"@iana.org', diagnoses.ISEMAIL_RFC5321_QUOTEDSTRING], - ['""@iana.org', diagnoses.ISEMAIL_RFC5321_QUOTEDSTRING], - ['"""@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], - ['"\\a"@iana.org', diagnoses.ISEMAIL_RFC5321_QUOTEDSTRING], - ['"\\""@iana.org', diagnoses.ISEMAIL_RFC5321_QUOTEDSTRING], - ['"\\"@iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDQUOTEDSTR], - ['"\\\\"@iana.org', diagnoses.ISEMAIL_RFC5321_QUOTEDSTRING], - ['test"@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], - ['"test@iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDQUOTEDSTR], - ['"test"test@iana.org', diagnoses.ISEMAIL_ERR_ATEXT_AFTER_QS], - ['test"text"@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], - ['"test""test"@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], - ['"test"."test"@iana.org', diagnoses.ISEMAIL_DEPREC_LOCALPART], - ['"test\\ test"@iana.org', diagnoses.ISEMAIL_RFC5321_QUOTEDSTRING], - ['"test".test@iana.org', diagnoses.ISEMAIL_DEPREC_LOCALPART], - ['"test\0"@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_QTEXT], - ['"test\\\0"@iana.org', diagnoses.ISEMAIL_DEPREC_QP], - ['"test\r\n test"@iana.org', diagnoses.ISEMAIL_CFWS_FWS], - ['"abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz abcdefghj"@iana.org', diagnoses.ISEMAIL_RFC5322_LOCAL_TOOLONG], - ['"abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz abcdefg\\h"@iana.org', diagnoses.ISEMAIL_RFC5322_LOCAL_TOOLONG], - ['test@[255.255.255.255]', diagnoses.ISEMAIL_RFC5321_ADDRESSLITERAL], - ['test@a[255.255.255.255]', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], - ['test@[255.255.255]', diagnoses.ISEMAIL_RFC5322_DOMAINLITERAL], - ['test@[255.255.255.255.255]', diagnoses.ISEMAIL_RFC5322_DOMAINLITERAL], - ['test@[255.255.255.256]', diagnoses.ISEMAIL_RFC5322_DOMAINLITERAL], - ['test@[1111:2222:3333:4444:5555:6666:7777:8888]', diagnoses.ISEMAIL_RFC5322_DOMAINLITERAL], - ['test@[IPv6:1111:2222:3333:4444:5555:6666:7777]', diagnoses.ISEMAIL_RFC5322_IPV6_GRPCOUNT], - ['test@[IPv6:1111:2222:3333:4444:5555:6666:7777:8888]', diagnoses.ISEMAIL_RFC5321_ADDRESSLITERAL], - ['test@[IPv6:1111:2222:3333:4444:5555:6666:7777:8888:9999]', diagnoses.ISEMAIL_RFC5322_IPV6_GRPCOUNT], - ['test@[IPv6:1111:2222:3333:4444:5555:6666:7777:888G]', diagnoses.ISEMAIL_RFC5322_IPV6_BADCHAR], - ['test@[IPv6:1111:2222:3333:4444:5555:6666::8888]', diagnoses.ISEMAIL_RFC5321_IPV6DEPRECATED], - ['test@[IPv6:1111:2222:3333:4444:5555::8888]', diagnoses.ISEMAIL_RFC5321_ADDRESSLITERAL], - ['test@[IPv6:1111:2222:3333:4444:5555:6666::7777:8888]', diagnoses.ISEMAIL_RFC5322_IPV6_MAXGRPS], - ['test@[IPv6::3333:4444:5555:6666:7777:8888]', diagnoses.ISEMAIL_RFC5322_IPV6_COLONSTRT], - ['test@[IPv6:::3333:4444:5555:6666:7777:8888]', diagnoses.ISEMAIL_RFC5321_ADDRESSLITERAL], - ['test@[IPv6:1111::4444:5555::8888]', diagnoses.ISEMAIL_RFC5322_IPV6_2X2XCOLON], - ['test@[IPv6:::]', diagnoses.ISEMAIL_RFC5321_ADDRESSLITERAL], - ['test@[IPv6:1111:2222:3333:4444:5555:255.255.255.255]', diagnoses.ISEMAIL_RFC5322_IPV6_GRPCOUNT], - ['test@[IPv6:1111:2222:3333:4444:5555:6666:255.255.255.255]', diagnoses.ISEMAIL_RFC5321_ADDRESSLITERAL], - ['test@[IPv6:1111:2222:3333:4444:5555:6666:7777:255.255.255.255]', diagnoses.ISEMAIL_RFC5322_IPV6_GRPCOUNT], - ['test@[IPv6:1111:2222:3333:4444::255.255.255.255]', diagnoses.ISEMAIL_RFC5321_ADDRESSLITERAL], - ['test@[IPv6:1111:2222:3333:4444:5555:6666::255.255.255.255]', diagnoses.ISEMAIL_RFC5322_IPV6_MAXGRPS], - ['test@[IPv6:1111:2222:3333:4444:::255.255.255.255]', diagnoses.ISEMAIL_RFC5322_IPV6_2X2XCOLON], - ['test@[IPv6::255.255.255.255]', diagnoses.ISEMAIL_RFC5322_IPV6_COLONSTRT], - [' test @iana.org', diagnoses.ISEMAIL_DEPREC_CFWS_NEAR_AT], - ['test@ iana .com', diagnoses.ISEMAIL_DEPREC_CFWS_NEAR_AT], - ['test . test@iana.org', diagnoses.ISEMAIL_DEPREC_FWS], - ['\r\n test@iana.org', diagnoses.ISEMAIL_CFWS_FWS], - ['\r\n \r\n test@iana.org', diagnoses.ISEMAIL_DEPREC_FWS], - ['(comment)test@iana.org', diagnoses.ISEMAIL_CFWS_COMMENT], - ['((comment)test@iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDCOMMENT], - ['(comment(comment))test@iana.org', diagnoses.ISEMAIL_CFWS_COMMENT], - ['test@(comment)iana.org', diagnoses.ISEMAIL_DEPREC_CFWS_NEAR_AT], - ['test(comment)test@iana.org', diagnoses.ISEMAIL_ERR_ATEXT_AFTER_CFWS], - ['test@(comment)[255.255.255.255]', diagnoses.ISEMAIL_DEPREC_CFWS_NEAR_AT], - ['(comment)abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@iana.org', diagnoses.ISEMAIL_CFWS_COMMENT], - ['test@(comment)abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.com', diagnoses.ISEMAIL_DEPREC_CFWS_NEAR_AT], - ['(comment)test@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghik.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghik.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijk.abcdefghijklmnopqrstuvwxyzabcdefghijk.abcdefghijklmnopqrstu', diagnoses.ISEMAIL_CFWS_COMMENT], - ['test@iana.org\n', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], - ['test@xn--hxajbheg2az3al.xn--jxalpdlp', diagnoses.ISEMAIL_DNSWARN_NO_RECORD], - ['xn--test@iana.org', diagnoses.ISEMAIL_VALID], - ['test@iana.org-', diagnoses.ISEMAIL_ERR_DOMAINHYPHENEND], - ['"test@iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDQUOTEDSTR], - ['(test@iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDCOMMENT], - ['test@(iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDCOMMENT], - ['test@[1.2.3.4', diagnoses.ISEMAIL_ERR_UNCLOSEDDOMLIT], - ['"test\\"@iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDQUOTEDSTR], - ['(comment\\)test@iana.org', diagnoses.ISEMAIL_ERR_UNCLOSEDCOMMENT], - ['test@iana.org(comment\\)', diagnoses.ISEMAIL_ERR_UNCLOSEDCOMMENT], - ['test@iana.org(comment\\', diagnoses.ISEMAIL_ERR_BACKSLASHEND], - ['test@[RFC-5322-domain-literal]', diagnoses.ISEMAIL_RFC5322_DOMAINLITERAL], - ['test@[RFC-5322]-domain-literal]', diagnoses.ISEMAIL_ERR_ATEXT_AFTER_DOMLIT], - ['test@[RFC-5322-[domain-literal]', diagnoses.ISEMAIL_ERR_EXPECTING_DTEXT], - ['test@[RFC-5322-\\\x07-domain-literal]', diagnoses.ISEMAIL_RFC5322_DOMLIT_OBSDTEXT], - ['test@[RFC-5322-\\\t-domain-literal]', diagnoses.ISEMAIL_RFC5322_DOMLIT_OBSDTEXT], - ['test@[RFC-5322-\\]-domain-literal]', diagnoses.ISEMAIL_RFC5322_DOMLIT_OBSDTEXT], - ['test@[RFC-5322-\x7f-domain-literal]', diagnoses.ISEMAIL_RFC5322_DOMLIT_OBSDTEXT], - ['test@[RFC-5322-domain-literal\\]', diagnoses.ISEMAIL_ERR_UNCLOSEDDOMLIT], - ['test@[RFC-5322-domain-literal\\', diagnoses.ISEMAIL_ERR_BACKSLASHEND], - ['test@[RFC 5322 domain literal]', diagnoses.ISEMAIL_RFC5322_DOMAINLITERAL], - ['test@[RFC-5322-domain-literal] (comment)', diagnoses.ISEMAIL_RFC5322_DOMAINLITERAL], - ['\x7f@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], - ['test@\x7f.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], - ['"\x7f"@iana.org', diagnoses.ISEMAIL_DEPREC_QTEXT], - ['"\\\x7f"@iana.org', diagnoses.ISEMAIL_DEPREC_QP], - ['(\x7f)test@iana.org', diagnoses.ISEMAIL_DEPREC_CTEXT], - ['test@iana.org\r', diagnoses.ISEMAIL_ERR_CR_NO_LF], - ['\rtest@iana.org', diagnoses.ISEMAIL_ERR_CR_NO_LF], - ['"\rtest"@iana.org', diagnoses.ISEMAIL_ERR_CR_NO_LF], - ['(\r)test@iana.org', diagnoses.ISEMAIL_ERR_CR_NO_LF], - ['test@iana.org(\r)', diagnoses.ISEMAIL_ERR_CR_NO_LF], - ['\ntest@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], - ['"\n"@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_QTEXT], - ['"\\\n"@iana.org', diagnoses.ISEMAIL_DEPREC_QP], - ['(\n)test@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_CTEXT], - ['\x07@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], - ['test@\x07.org', diagnoses.ISEMAIL_ERR_EXPECTING_ATEXT], - ['"\x07"@iana.org', diagnoses.ISEMAIL_DEPREC_QTEXT], - ['"\\\x07"@iana.org', diagnoses.ISEMAIL_DEPREC_QP], - ['(\x07)test@iana.org', diagnoses.ISEMAIL_DEPREC_CTEXT], - ['\r\ntest@iana.org', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], - ['\r\n \r\ntest@iana.org', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], - [' \r\ntest@iana.org', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], - [' \r\n test@iana.org', diagnoses.ISEMAIL_CFWS_FWS], - [' \r\n \r\ntest@iana.org', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], - [' \r\n\r\ntest@iana.org', diagnoses.ISEMAIL_ERR_FWS_CRLF_X2], - [' \r\n\r\n test@iana.org', diagnoses.ISEMAIL_ERR_FWS_CRLF_X2], - ['test@iana.org\r\n ', diagnoses.ISEMAIL_CFWS_FWS], - ['test@iana.org\r\n \r\n ', diagnoses.ISEMAIL_DEPREC_FWS], - ['test@iana.org\r\n', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], - ['test@iana.org \r', diagnoses.ISEMAIL_ERR_CR_NO_LF], - ['test@iana.org\r\n \r\n', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], - ['test@iana.org \r\n', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], - ['test@iana.org \r\n ', diagnoses.ISEMAIL_CFWS_FWS], - ['test@iana.org \r\n \r\n', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], - ['test@iana.org \r\n\r\n', diagnoses.ISEMAIL_ERR_FWS_CRLF_X2], - ['test@iana.org \r\n\r\n ', diagnoses.ISEMAIL_ERR_FWS_CRLF_X2], - ['test@iana. org', diagnoses.ISEMAIL_DEPREC_FWS], - ['test@[\r', diagnoses.ISEMAIL_ERR_CR_NO_LF], - ['test@[\r\n', diagnoses.ISEMAIL_ERR_FWS_CRLF_END], - [' test@iana.org', diagnoses.ISEMAIL_CFWS_FWS], - ['test@iana.org ', diagnoses.ISEMAIL_CFWS_FWS], - ['test@[IPv6:1::2:]', diagnoses.ISEMAIL_RFC5322_IPV6_COLONEND], - ['"test\\©"@iana.org', diagnoses.ISEMAIL_ERR_EXPECTING_QPAIR], - ['test@iana/icann.org', diagnoses.ISEMAIL_RFC5322_DOMAIN], - ['test.(comment)test@iana.org', diagnoses.ISEMAIL_DEPREC_COMMENT], - ['test@iana.(comment)org', diagnoses.ISEMAIL_DEPREC_COMMENT], - ['test@iana(comment)iana.org', diagnoses.ISEMAIL_ERR_ATEXT_AFTER_CFWS], - ['(comment\r\n comment)test@iana.org', diagnoses.ISEMAIL_CFWS_FWS], - ['test@org', diagnoses.ISEMAIL_RFC5321_TLD], - ['test@example.com', diagnoses.ISEMAIL_DNSWARN_NO_MX_RECORD], - ['test@nic.no', diagnoses.ISEMAIL_DNSWARN_NO_RECORD] -]; - -var tldExpectations = [ - ['shouldbe@invalid', diagnoses.ISEMAIL_ERR_UNKNOWN_TLD], - ['shouldbe@example.com', diagnoses.ISEMAIL_VALID] -]; - -describe('isEmail', function() { - var isEmail = require('..'); - - expectations.forEach(function(obj, i) { - var email = obj[0], result = obj[1]; - it('should handle test ' + (i + 1), function(done) { - isEmail(email, {errorLevel: 0, checkDNS: true}, function(res) { - expect(res).to.equal(result); - done(); - }); - }); - }); - - tldExpectations.forEach(function(obj, i) { - var email = obj[0], result = obj[1]; - it('should handle tld test ' + (i + 1), function() { - var res = isEmail(email, {errorLevel: 0, tldWhitelist: {com: true}}); - expect(res).to.equal(result); - - res = isEmail(email, {errorLevel: 0, tldWhitelist: ['com']}); - expect(res).to.equal(result); - }); - }); - - it('should handle domain atom test 1', function() { - var res = isEmail('shouldbe@invalid', {errorLevel: 0, minDomainAtoms: 2}); - - expect(res).to.equal(diagnoses.ISEMAIL_ERR_TOOSHORT_TLD); - }); - - it('should handle domain atom test 2', function() { - var res = isEmail('valid@example.com', {errorLevel: 0, minDomainAtoms: 2}); - - expect(res).to.equal(diagnoses.ISEMAIL_VALID); - }); -}); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/test/mocha.opts b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/test/mocha.opts deleted file mode 100644 index 84dcd68..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/isemail/test/mocha.opts +++ /dev/null @@ -1,2 +0,0 @@ ---reporter dot ---check-leaks diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/LICENSE b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/LICENSE deleted file mode 100644 index bd17246..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2011-2014 Tim Wood, Iskren Chernev, Moment.js contributors - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/README.md b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/README.md deleted file mode 100644 index 6c25b5e..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/README.md +++ /dev/null @@ -1,39 +0,0 @@ -[![NPM version][npm-version-image]][npm-url] [![NPM downloads][npm-downloads-image]][npm-url] [![MIT License][license-image]][license-url] [![Build Status][travis-image]][travis-url] - -A lightweight JavaScript date library for parsing, validating, manipulating, and formatting dates. - -## [Documentation](http://momentjs.com/docs/) - -## Upgrading to 2.0.0 - -There are a number of small backwards incompatible changes with version 2.0.0. [See the full descriptions here](https://gist.github.com/timrwood/e72f2eef320ed9e37c51#backwards-incompatible-changes) - - * Changed language ordinal method to return the number + ordinal instead of just the ordinal. - - * Changed two digit year parsing cutoff to match strptime. - - * Removed `moment#sod` and `moment#eod` in favor of `moment#startOf` and `moment#endOf`. - - * Removed `moment.humanizeDuration()` in favor of `moment.duration().humanize()`. - - * Removed the lang data objects from the top level namespace. - - * Duplicate `Date` passed to `moment()` instead of referencing it. - -## [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md) - -## [Contributing](https://github.com/moment/moment/blob/develop/CONTRIBUTING.md) - -## License - -Moment.js is freely distributable under the terms of the [MIT license](https://github.com/moment/moment/blob/develop/LICENSE). - -[license-image]: http://img.shields.io/badge/license-MIT-blue.svg?style=flat -[license-url]: LICENSE - -[npm-url]: https://npmjs.org/package/moment -[npm-version-image]: http://img.shields.io/npm/v/moment.svg?style=flat -[npm-downloads-image]: http://img.shields.io/npm/dm/moment.svg?style=flat - -[travis-url]: http://travis-ci.org/moment/moment -[travis-image]: http://img.shields.io/travis/moment/moment/develop.svg?style=flat diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/ender.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/ender.js deleted file mode 100644 index 71462a7..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/ender.js +++ /dev/null @@ -1 +0,0 @@ -$.ender({ moment: require('moment') }) diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/af.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/af.js deleted file mode 100644 index 9c7ad95..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/af.js +++ /dev/null @@ -1,71 +0,0 @@ -// moment.js locale configuration -// locale : afrikaans (af) -// author : Werner Mollentze : https://github.com/wernerm - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('af', { - months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'), - weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'), - weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'), - weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'), - meridiemParse: /vm|nm/i, - isPM : function (input) { - return /^nm$/i.test(input); - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 12) { - return isLower ? 'vm' : 'VM'; - } else { - return isLower ? 'nm' : 'NM'; - } - }, - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay : '[Vandag om] LT', - nextDay : '[Môre om] LT', - nextWeek : 'dddd [om] LT', - lastDay : '[Gister om] LT', - lastWeek : '[Laas] dddd [om] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'oor %s', - past : '%s gelede', - s : '\'n paar sekondes', - m : '\'n minuut', - mm : '%d minute', - h : '\'n uur', - hh : '%d ure', - d : '\'n dag', - dd : '%d dae', - M : '\'n maand', - MM : '%d maande', - y : '\'n jaar', - yy : '%d jaar' - }, - ordinalParse: /\d{1,2}(ste|de)/, - ordinal : function (number) { - return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter - }, - week : { - dow : 1, // Maandag is die eerste dag van die week. - doy : 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ar-ma.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ar-ma.js deleted file mode 100644 index 7add172..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ar-ma.js +++ /dev/null @@ -1,57 +0,0 @@ -// moment.js locale configuration -// locale : Moroccan Arabic (ar-ma) -// author : ElFadili Yassine : https://github.com/ElFadiliY -// author : Abdel Said : https://github.com/abdelsaid - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('ar-ma', { - months : 'يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), - monthsShort : 'يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), - weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay: '[اليوم على الساعة] LT', - nextDay: '[غدا على الساعة] LT', - nextWeek: 'dddd [على الساعة] LT', - lastDay: '[أمس على الساعة] LT', - lastWeek: 'dddd [على الساعة] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'ÙÙŠ %s', - past : 'منذ %s', - s : 'ثوان', - m : 'دقيقة', - mm : '%d دقائق', - h : 'ساعة', - hh : '%d ساعات', - d : 'يوم', - dd : '%d أيام', - M : 'شهر', - MM : '%d أشهر', - y : 'سنة', - yy : '%d سنوات' - }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ar-sa.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ar-sa.js deleted file mode 100644 index 731f97b..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ar-sa.js +++ /dev/null @@ -1,101 +0,0 @@ -// moment.js locale configuration -// locale : Arabic Saudi Arabia (ar-sa) -// author : Suhail Alkowaileet : https://github.com/xsoh - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var symbolMap = { - '1': 'Ù¡', - '2': 'Ù¢', - '3': 'Ù£', - '4': 'Ù¤', - '5': 'Ù¥', - '6': 'Ù¦', - '7': 'Ù§', - '8': 'Ù¨', - '9': 'Ù©', - '0': 'Ù ' - }, numberMap = { - 'Ù¡': '1', - 'Ù¢': '2', - 'Ù£': '3', - 'Ù¤': '4', - 'Ù¥': '5', - 'Ù¦': '6', - 'Ù§': '7', - 'Ù¨': '8', - 'Ù©': '9', - 'Ù ': '0' - }; - - return moment.defineLocale('ar-sa', { - months : 'يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), - monthsShort : 'يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), - weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - meridiemParse: /ص|Ù…/, - isPM : function (input) { - return 'Ù…' === input; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'ص'; - } else { - return 'Ù…'; - } - }, - calendar : { - sameDay: '[اليوم على الساعة] LT', - nextDay: '[غدا على الساعة] LT', - nextWeek: 'dddd [على الساعة] LT', - lastDay: '[أمس على الساعة] LT', - lastWeek: 'dddd [على الساعة] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'ÙÙŠ %s', - past : 'منذ %s', - s : 'ثوان', - m : 'دقيقة', - mm : '%d دقائق', - h : 'ساعة', - hh : '%d ساعات', - d : 'يوم', - dd : '%d أيام', - M : 'شهر', - MM : '%d أشهر', - y : 'سنة', - yy : '%d سنوات' - }, - preparse: function (string) { - return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { - return numberMap[match]; - }).replace(/ØŒ/g, ','); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }).replace(/,/g, 'ØŒ'); - }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ar-tn.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ar-tn.js deleted file mode 100644 index b1ddb4f..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ar-tn.js +++ /dev/null @@ -1,55 +0,0 @@ -// moment.js locale configuration -// locale : Tunisian Arabic (ar-tn) - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('ar-tn', { - months: 'جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), - monthsShort: 'جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), - weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin: 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), - longDateFormat: { - LT: 'HH:mm', - LTS: 'LT:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY LT', - LLLL: 'dddd D MMMM YYYY LT' - }, - calendar: { - sameDay: '[اليوم على الساعة] LT', - nextDay: '[غدا على الساعة] LT', - nextWeek: 'dddd [على الساعة] LT', - lastDay: '[أمس على الساعة] LT', - lastWeek: 'dddd [على الساعة] LT', - sameElse: 'L' - }, - relativeTime: { - future: 'ÙÙŠ %s', - past: 'منذ %s', - s: 'ثوان', - m: 'دقيقة', - mm: '%d دقائق', - h: 'ساعة', - hh: '%d ساعات', - d: 'يوم', - dd: '%d أيام', - M: 'شهر', - MM: '%d أشهر', - y: 'سنة', - yy: '%d سنوات' - }, - week: { - dow: 1, // Monday is the first day of the week. - doy: 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ar.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ar.js deleted file mode 100644 index 828e618..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ar.js +++ /dev/null @@ -1,134 +0,0 @@ -// moment.js locale configuration -// Locale: Arabic (ar) -// Author: Abdel Said: https://github.com/abdelsaid -// Changes in months, weekdays: Ahmed Elkhatib -// Native plural forms: forabi https://github.com/forabi - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var symbolMap = { - '1': 'Ù¡', - '2': 'Ù¢', - '3': 'Ù£', - '4': 'Ù¤', - '5': 'Ù¥', - '6': 'Ù¦', - '7': 'Ù§', - '8': 'Ù¨', - '9': 'Ù©', - '0': 'Ù ' - }, numberMap = { - 'Ù¡': '1', - 'Ù¢': '2', - 'Ù£': '3', - 'Ù¤': '4', - 'Ù¥': '5', - 'Ù¦': '6', - 'Ù§': '7', - 'Ù¨': '8', - 'Ù©': '9', - 'Ù ': '0' - }, pluralForm = function (n) { - return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5; - }, plurals = { - s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'], - m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'], - h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'], - d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'], - M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'], - y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام'] - }, pluralize = function (u) { - return function (number, withoutSuffix, string, isFuture) { - var f = pluralForm(number), - str = plurals[u][pluralForm(number)]; - if (f === 2) { - str = str[withoutSuffix ? 0 : 1]; - } - return str.replace(/%d/i, number); - }; - }, months = [ - 'كانون الثاني يناير', - 'شباط Ùبراير', - 'آذار مارس', - 'نيسان أبريل', - 'أيار مايو', - 'حزيران يونيو', - 'تموز يوليو', - 'آب أغسطس', - 'أيلول سبتمبر', - 'تشرين الأول أكتوبر', - 'تشرين الثاني نوÙمبر', - 'كانون الأول ديسمبر' - ]; - - return moment.defineLocale('ar', { - months : months, - monthsShort : months, - weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - meridiemParse: /ص|Ù…/, - isPM : function (input) { - return 'Ù…' === input; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'ص'; - } else { - return 'Ù…'; - } - }, - calendar : { - sameDay: '[اليوم عند الساعة] LT', - nextDay: '[غدًا عند الساعة] LT', - nextWeek: 'dddd [عند الساعة] LT', - lastDay: '[أمس عند الساعة] LT', - lastWeek: 'dddd [عند الساعة] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'بعد %s', - past : 'منذ %s', - s : pluralize('s'), - m : pluralize('m'), - mm : pluralize('m'), - h : pluralize('h'), - hh : pluralize('h'), - d : pluralize('d'), - dd : pluralize('d'), - M : pluralize('M'), - MM : pluralize('M'), - y : pluralize('y'), - yy : pluralize('y') - }, - preparse: function (string) { - return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { - return numberMap[match]; - }).replace(/ØŒ/g, ','); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }).replace(/,/g, 'ØŒ'); - }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/az.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/az.js deleted file mode 100644 index 7624fee..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/az.js +++ /dev/null @@ -1,107 +0,0 @@ -// moment.js locale configuration -// locale : azerbaijani (az) -// author : topchiyev : https://github.com/topchiyev - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var suffixes = { - 1: '-inci', - 5: '-inci', - 8: '-inci', - 70: '-inci', - 80: '-inci', - - 2: '-nci', - 7: '-nci', - 20: '-nci', - 50: '-nci', - - 3: '-üncü', - 4: '-üncü', - 100: '-üncü', - - 6: '-ncı', - - 9: '-uncu', - 10: '-uncu', - 30: '-uncu', - - 60: '-ıncı', - 90: '-ıncı' - }; - return moment.defineLocale('az', { - months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'), - monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'), - weekdays : 'Bazar_Bazar ertÉ™si_ÇərÅŸÉ™nbÉ™ axÅŸamı_ÇərÅŸÉ™nbÉ™_CümÉ™ axÅŸamı_CümÉ™_ŞənbÉ™'.split('_'), - weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'), - weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay : '[bugün saat] LT', - nextDay : '[sabah saat] LT', - nextWeek : '[gÉ™lÉ™n hÉ™ftÉ™] dddd [saat] LT', - lastDay : '[dünÉ™n] LT', - lastWeek : '[keçən hÉ™ftÉ™] dddd [saat] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s sonra', - past : '%s É™vvÉ™l', - s : 'birneçə saniyyÉ™', - m : 'bir dÉ™qiqÉ™', - mm : '%d dÉ™qiqÉ™', - h : 'bir saat', - hh : '%d saat', - d : 'bir gün', - dd : '%d gün', - M : 'bir ay', - MM : '%d ay', - y : 'bir il', - yy : '%d il' - }, - meridiemParse: /gecÉ™|sÉ™hÉ™r|gündüz|axÅŸam/, - isPM : function (input) { - return /^(gündüz|axÅŸam)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'gecÉ™'; - } else if (hour < 12) { - return 'sÉ™hÉ™r'; - } else if (hour < 17) { - return 'gündüz'; - } else { - return 'axÅŸam'; - } - }, - ordinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/, - ordinal : function (number) { - if (number === 0) { // special case for zero - return number + '-ıncı'; - } - var a = number % 10, - b = number % 100 - a, - c = number >= 100 ? 100 : null; - - return number + (suffixes[a] || suffixes[b] || suffixes[c]); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/be.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/be.js deleted file mode 100644 index d888e21..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/be.js +++ /dev/null @@ -1,154 +0,0 @@ -// moment.js locale configuration -// locale : belarusian (be) -// author : Dmitry Demidov : https://github.com/demidov91 -// author: Praleska: http://praleska.pro/ -// Author : Menelion Elensúle : https://github.com/Oire - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - function plural(word, num) { - var forms = word.split('_'); - return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); - } - - function relativeTimeWithPlural(number, withoutSuffix, key) { - var format = { - 'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін', - 'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін', - 'dd': 'дзень_дні_дзён', - 'MM': 'меÑÑц_меÑÑцы_меÑÑцаў', - 'yy': 'год_гады_гадоў' - }; - if (key === 'm') { - return withoutSuffix ? 'хвіліна' : 'хвіліну'; - } - else if (key === 'h') { - return withoutSuffix ? 'гадзіна' : 'гадзіну'; - } - else { - return number + ' ' + plural(format[key], +number); - } - } - - function monthsCaseReplace(m, format) { - var months = { - 'nominative': 'Ñтудзень_люты_Ñакавік_краÑавік_травень_чÑрвень_ліпень_жнівень_вераÑень_каÑтрычнік_ліÑтапад_Ñнежань'.split('_'), - 'accusative': 'ÑтудзенÑ_лютага_Ñакавіка_краÑавіка_траўнÑ_чÑрвенÑ_ліпенÑ_жніўнÑ_вераÑнÑ_каÑтрычніка_ліÑтапада_ÑнежнÑ'.split('_') - }, - - nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? - 'accusative' : - 'nominative'; - - return months[nounCase][m.month()]; - } - - function weekdaysCaseReplace(m, format) { - var weekdays = { - 'nominative': 'нÑдзелÑ_панÑдзелак_аўторак_Ñерада_чацвер_пÑтніца_Ñубота'.split('_'), - 'accusative': 'нÑдзелю_панÑдзелак_аўторак_Ñераду_чацвер_пÑтніцу_Ñуботу'.split('_') - }, - - nounCase = (/\[ ?[Вв] ?(?:мінулую|наÑтупную)? ?\] ?dddd/).test(format) ? - 'accusative' : - 'nominative'; - - return weekdays[nounCase][m.day()]; - } - - return moment.defineLocale('be', { - months : monthsCaseReplace, - monthsShort : 'Ñтуд_лют_Ñак_краÑ_трав_чÑрв_ліп_жнів_вер_каÑÑ‚_ліÑÑ‚_Ñнеж'.split('_'), - weekdays : weekdaysCaseReplace, - weekdaysShort : 'нд_пн_ат_ÑÑ€_чц_пт_Ñб'.split('_'), - weekdaysMin : 'нд_пн_ат_ÑÑ€_чц_пт_Ñб'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY г.', - LLL : 'D MMMM YYYY г., LT', - LLLL : 'dddd, D MMMM YYYY г., LT' - }, - calendar : { - sameDay: '[Ð¡Ñ‘Ð½Ð½Ñ Ñž] LT', - nextDay: '[Заўтра Ñž] LT', - lastDay: '[Учора Ñž] LT', - nextWeek: function () { - return '[У] dddd [Ñž] LT'; - }, - lastWeek: function () { - switch (this.day()) { - case 0: - case 3: - case 5: - case 6: - return '[У мінулую] dddd [Ñž] LT'; - case 1: - case 2: - case 4: - return '[У мінулы] dddd [Ñž] LT'; - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'праз %s', - past : '%s таму', - s : 'некалькі Ñекунд', - m : relativeTimeWithPlural, - mm : relativeTimeWithPlural, - h : relativeTimeWithPlural, - hh : relativeTimeWithPlural, - d : 'дзень', - dd : relativeTimeWithPlural, - M : 'меÑÑц', - MM : relativeTimeWithPlural, - y : 'год', - yy : relativeTimeWithPlural - }, - meridiemParse: /ночы|раніцы|днÑ|вечара/, - isPM : function (input) { - return /^(днÑ|вечара)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'ночы'; - } else if (hour < 12) { - return 'раніцы'; - } else if (hour < 17) { - return 'днÑ'; - } else { - return 'вечара'; - } - }, - - ordinalParse: /\d{1,2}-(Ñ–|Ñ‹|га)/, - ordinal: function (number, period) { - switch (period) { - case 'M': - case 'd': - case 'DDD': - case 'w': - case 'W': - return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-Ñ–' : number + '-Ñ‹'; - case 'D': - return number + '-га'; - default: - return number; - } - }, - - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/bg.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/bg.js deleted file mode 100644 index 540e17b..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/bg.js +++ /dev/null @@ -1,88 +0,0 @@ -// moment.js locale configuration -// locale : bulgarian (bg) -// author : Krasen Borisov : https://github.com/kraz - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('bg', { - months : 'Ñнуари_февруари_март_април_май_юни_юли_авгуÑÑ‚_Ñептември_октомври_ноември_декември'.split('_'), - monthsShort : 'Ñнр_фев_мар_апр_май_юни_юли_авг_Ñеп_окт_ное_дек'.split('_'), - weekdays : 'неделÑ_понеделник_вторник_ÑÑ€Ñда_четвъртък_петък_Ñъбота'.split('_'), - weekdaysShort : 'нед_пон_вто_ÑÑ€Ñ_чет_пет_Ñъб'.split('_'), - weekdaysMin : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'D.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay : '[Ð”Ð½ÐµÑ Ð²] LT', - nextDay : '[Утре в] LT', - nextWeek : 'dddd [в] LT', - lastDay : '[Вчера в] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - case 6: - return '[Ð’ изминалата] dddd [в] LT'; - case 1: - case 2: - case 4: - case 5: - return '[Ð’ изминалиÑ] dddd [в] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'Ñлед %s', - past : 'преди %s', - s : 'нÑколко Ñекунди', - m : 'минута', - mm : '%d минути', - h : 'чаÑ', - hh : '%d чаÑа', - d : 'ден', - dd : '%d дни', - M : 'меÑец', - MM : '%d меÑеца', - y : 'година', - yy : '%d години' - }, - ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, - ordinal : function (number) { - var lastDigit = number % 10, - last2Digits = number % 100; - if (number === 0) { - return number + '-ев'; - } else if (last2Digits === 0) { - return number + '-ен'; - } else if (last2Digits > 10 && last2Digits < 20) { - return number + '-ти'; - } else if (lastDigit === 1) { - return number + '-ви'; - } else if (lastDigit === 2) { - return number + '-ри'; - } else if (lastDigit === 7 || lastDigit === 8) { - return number + '-ми'; - } else { - return number + '-ти'; - } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/bn.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/bn.js deleted file mode 100644 index 5b4ab51..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/bn.js +++ /dev/null @@ -1,111 +0,0 @@ -// moment.js locale configuration -// locale : Bengali (bn) -// author : Kaushik Gandhi : https://github.com/kaushikgandhi - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var symbolMap = { - '1': '১', - '2': '২', - '3': '৩', - '4': '৪', - '5': '৫', - '6': '৬', - '7': '৭', - '8': '৮', - '9': '৯', - '0': '০' - }, - numberMap = { - '১': '1', - '২': '2', - '৩': '3', - '৪': '4', - '৫': '5', - '৬': '6', - '৭': '7', - '৮': '8', - '৯': '9', - '০': '0' - }; - - return moment.defineLocale('bn', { - months : 'জানà§à§Ÿà¦¾à¦°à§€_ফেবà§à§Ÿà¦¾à¦°à§€_মারà§à¦š_à¦à¦ªà§à¦°à¦¿à¦²_মে_জà§à¦¨_জà§à¦²à¦¾à¦‡_অগাসà§à¦Ÿ_সেপà§à¦Ÿà§‡à¦®à§à¦¬à¦°_অকà§à¦Ÿà§‹à¦¬à¦°_নভেমà§à¦¬à¦°_ডিসেমà§à¦¬à¦°'.split('_'), - monthsShort : 'জানà§_ফেব_মারà§à¦š_à¦à¦ªà¦°_মে_জà§à¦¨_জà§à¦²_অগ_সেপà§à¦Ÿ_অকà§à¦Ÿà§‹_নভ_ডিসেমà§'.split('_'), - weekdays : 'রবিবার_সোমবার_মঙà§à¦—লবার_বà§à¦§à¦¬à¦¾à¦°_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿à¦¬à¦¾à¦°_শà§à¦•à§à¦°à§à¦¬à¦¾à¦°_শনিবার'.split('_'), - weekdaysShort : 'রবি_সোম_মঙà§à¦—ল_বà§à¦§_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿_শà§à¦•à§à¦°à§_শনি'.split('_'), - weekdaysMin : 'রব_সম_মঙà§à¦—_বà§_বà§à¦°à¦¿à¦¹_শà§_শনি'.split('_'), - longDateFormat : { - LT : 'A h:mm সময়', - LTS : 'A h:mm:ss সময়', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, LT', - LLLL : 'dddd, D MMMM YYYY, LT' - }, - calendar : { - sameDay : '[আজ] LT', - nextDay : '[আগামীকাল] LT', - nextWeek : 'dddd, LT', - lastDay : '[গতকাল] LT', - lastWeek : '[গত] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s পরে', - past : '%s আগে', - s : 'কà¦à¦• সেকেনà§à¦¡', - m : 'à¦à¦• মিনিট', - mm : '%d মিনিট', - h : 'à¦à¦• ঘনà§à¦Ÿà¦¾', - hh : '%d ঘনà§à¦Ÿà¦¾', - d : 'à¦à¦• দিন', - dd : '%d দিন', - M : 'à¦à¦• মাস', - MM : '%d মাস', - y : 'à¦à¦• বছর', - yy : '%d বছর' - }, - preparse: function (string) { - return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - meridiemParse: /রাত|শকাল|দà§à¦ªà§à¦°|বিকেল|রাত/, - isPM: function (input) { - return /^(দà§à¦ªà§à¦°|বিকেল|রাত)$/.test(input); - }, - //Bengali is a vast language its spoken - //in different forms in various parts of the world. - //I have just generalized with most common one used - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'রাত'; - } else if (hour < 10) { - return 'শকাল'; - } else if (hour < 17) { - return 'দà§à¦ªà§à¦°'; - } else if (hour < 20) { - return 'বিকেল'; - } else { - return 'রাত'; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/bo.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/bo.js deleted file mode 100644 index b8e7001..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/bo.js +++ /dev/null @@ -1,108 +0,0 @@ -// moment.js locale configuration -// locale : tibetan (bo) -// author : Thupten N. Chakrishar : https://github.com/vajradog - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var symbolMap = { - '1': '༡', - '2': '༢', - '3': '༣', - '4': '༤', - '5': '༥', - '6': '༦', - '7': '༧', - '8': '༨', - '9': '༩', - '0': '༠' - }, - numberMap = { - '༡': '1', - '༢': '2', - '༣': '3', - '༤': '4', - '༥': '5', - '༦': '6', - '༧': '7', - '༨': '8', - '༩': '9', - '༠': '0' - }; - - return moment.defineLocale('bo', { - months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), - monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), - weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'), - weekdaysShort : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), - weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), - longDateFormat : { - LT : 'A h:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, LT', - LLLL : 'dddd, D MMMM YYYY, LT' - }, - calendar : { - sameDay : '[དི་རིང] LT', - nextDay : '[སང་ཉིན] LT', - nextWeek : '[བདུན་ཕྲག་རྗེས་མ], LT', - lastDay : '[à½à¼‹à½¦à½„] LT', - lastWeek : '[བདུན་ཕྲག་མà½à½ à¼‹à½˜] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s ལ་', - past : '%s སྔན་ལ', - s : 'ལམ་སང', - m : 'སà¾à½¢à¼‹à½˜à¼‹à½‚ཅིག', - mm : '%d སà¾à½¢à¼‹à½˜', - h : 'ཆུ་ཚོད་གཅིག', - hh : '%d ཆུ་ཚོད', - d : 'ཉིན་གཅིག', - dd : '%d ཉིན་', - M : 'ཟླ་བ་གཅིག', - MM : '%d ཟླ་བ', - y : 'ལོ་གཅིག', - yy : '%d ལོ' - }, - preparse: function (string) { - return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/, - isPM: function (input) { - return /^(ཉིན་གུང|དགོང་དག|མཚན་མོ)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'མཚན་མོ'; - } else if (hour < 10) { - return 'ཞོགས་ཀས'; - } else if (hour < 17) { - return 'ཉིན་གུང'; - } else if (hour < 20) { - return 'དགོང་དག'; - } else { - return 'མཚན་མོ'; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/br.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/br.js deleted file mode 100644 index 1f8dd61..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/br.js +++ /dev/null @@ -1,109 +0,0 @@ -// moment.js locale configuration -// locale : breton (br) -// author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - function relativeTimeWithMutation(number, withoutSuffix, key) { - var format = { - 'mm': 'munutenn', - 'MM': 'miz', - 'dd': 'devezh' - }; - return number + ' ' + mutation(format[key], number); - } - - function specialMutationForYears(number) { - switch (lastNumber(number)) { - case 1: - case 3: - case 4: - case 5: - case 9: - return number + ' bloaz'; - default: - return number + ' vloaz'; - } - } - - function lastNumber(number) { - if (number > 9) { - return lastNumber(number % 10); - } - return number; - } - - function mutation(text, number) { - if (number === 2) { - return softMutation(text); - } - return text; - } - - function softMutation(text) { - var mutationTable = { - 'm': 'v', - 'b': 'v', - 'd': 'z' - }; - if (mutationTable[text.charAt(0)] === undefined) { - return text; - } - return mutationTable[text.charAt(0)] + text.substring(1); - } - - return moment.defineLocale('br', { - months : 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'), - monthsShort : 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'), - weekdays : 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'), - weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'), - weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'), - longDateFormat : { - LT : 'h[e]mm A', - LTS : 'h[e]mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D [a viz] MMMM YYYY', - LLL : 'D [a viz] MMMM YYYY LT', - LLLL : 'dddd, D [a viz] MMMM YYYY LT' - }, - calendar : { - sameDay : '[Hiziv da] LT', - nextDay : '[Warc\'hoazh da] LT', - nextWeek : 'dddd [da] LT', - lastDay : '[Dec\'h da] LT', - lastWeek : 'dddd [paset da] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'a-benn %s', - past : '%s \'zo', - s : 'un nebeud segondennoù', - m : 'ur vunutenn', - mm : relativeTimeWithMutation, - h : 'un eur', - hh : '%d eur', - d : 'un devezh', - dd : relativeTimeWithMutation, - M : 'ur miz', - MM : relativeTimeWithMutation, - y : 'ur bloaz', - yy : specialMutationForYears - }, - ordinalParse: /\d{1,2}(añ|vet)/, - ordinal : function (number) { - var output = (number === 1) ? 'añ' : 'vet'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/bs.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/bs.js deleted file mode 100644 index c59f46b..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/bs.js +++ /dev/null @@ -1,140 +0,0 @@ -// moment.js locale configuration -// locale : bosnian (bs) -// author : Nedim Cholich : https://github.com/frontyard -// based on (hr) translation by Bojan Marković - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - function translate(number, withoutSuffix, key) { - var result = number + ' '; - switch (key) { - case 'm': - return withoutSuffix ? 'jedna minuta' : 'jedne minute'; - case 'mm': - if (number === 1) { - result += 'minuta'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'minute'; - } else { - result += 'minuta'; - } - return result; - case 'h': - return withoutSuffix ? 'jedan sat' : 'jednog sata'; - case 'hh': - if (number === 1) { - result += 'sat'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'sata'; - } else { - result += 'sati'; - } - return result; - case 'dd': - if (number === 1) { - result += 'dan'; - } else { - result += 'dana'; - } - return result; - case 'MM': - if (number === 1) { - result += 'mjesec'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'mjeseca'; - } else { - result += 'mjeseci'; - } - return result; - case 'yy': - if (number === 1) { - result += 'godina'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'godine'; - } else { - result += 'godina'; - } - return result; - } - } - - return moment.defineLocale('bs', { - months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'), - monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'), - weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota'.split('_'), - weekdaysShort : 'ned._pon._uto._sri._Äet._pet._sub.'.split('_'), - weekdaysMin : 'ne_po_ut_sr_Äe_pe_su'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'DD. MM. YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY LT', - LLLL : 'dddd, D. MMMM YYYY LT' - }, - calendar : { - sameDay : '[danas u] LT', - nextDay : '[sutra u] LT', - - nextWeek : function () { - switch (this.day()) { - case 0: - return '[u] [nedjelju] [u] LT'; - case 3: - return '[u] [srijedu] [u] LT'; - case 6: - return '[u] [subotu] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[u] dddd [u] LT'; - } - }, - lastDay : '[juÄer u] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - return '[proÅ¡lu] dddd [u] LT'; - case 6: - return '[proÅ¡le] [subote] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[proÅ¡li] dddd [u] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'za %s', - past : 'prije %s', - s : 'par sekundi', - m : translate, - mm : translate, - h : translate, - hh : translate, - d : 'dan', - dd : translate, - M : 'mjesec', - MM : translate, - y : 'godinu', - yy : translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ca.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ca.js deleted file mode 100644 index 4f0d3fe..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ca.js +++ /dev/null @@ -1,77 +0,0 @@ -// moment.js locale configuration -// locale : catalan (ca) -// author : Juan G. Hurtado : https://github.com/juanghurtado - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('ca', { - months : 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'), - monthsShort : 'gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.'.split('_'), - weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'), - weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'), - weekdaysMin : 'Dg_Dl_Dt_Dc_Dj_Dv_Ds'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay : function () { - return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - nextDay : function () { - return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - nextWeek : function () { - return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - lastDay : function () { - return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - lastWeek : function () { - return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'en %s', - past : 'fa %s', - s : 'uns segons', - m : 'un minut', - mm : '%d minuts', - h : 'una hora', - hh : '%d hores', - d : 'un dia', - dd : '%d dies', - M : 'un mes', - MM : '%d mesos', - y : 'un any', - yy : '%d anys' - }, - ordinalParse: /\d{1,2}(r|n|t|è|a)/, - ordinal : function (number, period) { - var output = (number === 1) ? 'r' : - (number === 2) ? 'n' : - (number === 3) ? 'r' : - (number === 4) ? 't' : 'è'; - if (period === 'w' || period === 'W') { - output = 'a'; - } - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/cs.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/cs.js deleted file mode 100644 index b61658d..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/cs.js +++ /dev/null @@ -1,157 +0,0 @@ -// moment.js locale configuration -// locale : czech (cs) -// author : petrbela : https://github.com/petrbela - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var months = 'leden_únor_bÅ™ezen_duben_kvÄ›ten_Äerven_Äervenec_srpen_září_říjen_listopad_prosinec'.split('_'), - monthsShort = 'led_úno_bÅ™e_dub_kvÄ›_Ävn_Ävc_srp_zář_říj_lis_pro'.split('_'); - - function plural(n) { - return (n > 1) && (n < 5) && (~~(n / 10) !== 1); - } - - function translate(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - switch (key) { - case 's': // a few seconds / in a few seconds / a few seconds ago - return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami'; - case 'm': // a minute / in a minute / a minute ago - return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou'); - case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'minuty' : 'minut'); - } else { - return result + 'minutami'; - } - break; - case 'h': // an hour / in an hour / an hour ago - return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); - case 'hh': // 9 hours / in 9 hours / 9 hours ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'hodiny' : 'hodin'); - } else { - return result + 'hodinami'; - } - break; - case 'd': // a day / in a day / a day ago - return (withoutSuffix || isFuture) ? 'den' : 'dnem'; - case 'dd': // 9 days / in 9 days / 9 days ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'dny' : 'dní'); - } else { - return result + 'dny'; - } - break; - case 'M': // a month / in a month / a month ago - return (withoutSuffix || isFuture) ? 'mÄ›síc' : 'mÄ›sícem'; - case 'MM': // 9 months / in 9 months / 9 months ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'mÄ›síce' : 'mÄ›síců'); - } else { - return result + 'mÄ›síci'; - } - break; - case 'y': // a year / in a year / a year ago - return (withoutSuffix || isFuture) ? 'rok' : 'rokem'; - case 'yy': // 9 years / in 9 years / 9 years ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'roky' : 'let'); - } else { - return result + 'lety'; - } - break; - } - } - - return moment.defineLocale('cs', { - months : months, - monthsShort : monthsShort, - monthsParse : (function (months, monthsShort) { - var i, _monthsParse = []; - for (i = 0; i < 12; i++) { - // use custom parser to solve problem with July (Äervenec) - _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); - } - return _monthsParse; - }(months, monthsShort)), - weekdays : 'nedÄ›le_pondÄ›lí_úterý_stÅ™eda_Ätvrtek_pátek_sobota'.split('_'), - weekdaysShort : 'ne_po_út_st_Ät_pá_so'.split('_'), - weekdaysMin : 'ne_po_út_st_Ät_pá_so'.split('_'), - longDateFormat : { - LT: 'H:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY LT', - LLLL : 'dddd D. MMMM YYYY LT' - }, - calendar : { - sameDay: '[dnes v] LT', - nextDay: '[zítra v] LT', - nextWeek: function () { - switch (this.day()) { - case 0: - return '[v nedÄ›li v] LT'; - case 1: - case 2: - return '[v] dddd [v] LT'; - case 3: - return '[ve stÅ™edu v] LT'; - case 4: - return '[ve Ätvrtek v] LT'; - case 5: - return '[v pátek v] LT'; - case 6: - return '[v sobotu v] LT'; - } - }, - lastDay: '[vÄera v] LT', - lastWeek: function () { - switch (this.day()) { - case 0: - return '[minulou nedÄ›li v] LT'; - case 1: - case 2: - return '[minulé] dddd [v] LT'; - case 3: - return '[minulou stÅ™edu v] LT'; - case 4: - case 5: - return '[minulý] dddd [v] LT'; - case 6: - return '[minulou sobotu v] LT'; - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'za %s', - past : 'pÅ™ed %s', - s : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate - }, - ordinalParse : /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/cv.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/cv.js deleted file mode 100644 index ea8e314..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/cv.js +++ /dev/null @@ -1,61 +0,0 @@ -// moment.js locale configuration -// locale : chuvash (cv) -// author : Anatoly Mironov : https://github.com/mirontoli - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('cv', { - months : 'кăрлач_нарăÑ_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав'.split('_'), - monthsShort : 'кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш'.split('_'), - weekdays : 'вырÑарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_Ñрнекун_шăматкун'.split('_'), - weekdaysShort : 'выр_тун_ытл_юн_кĕç_Ñрн_шăм'.split('_'), - weekdaysMin : 'вр_тн_Ñ‹Ñ‚_юн_кç_ÑÑ€_шм'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD-MM-YYYY', - LL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]', - LLL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT', - LLLL : 'dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT' - }, - calendar : { - sameDay: '[ПаÑн] LT [Ñехетре]', - nextDay: '[Ыран] LT [Ñехетре]', - lastDay: '[Ĕнер] LT [Ñехетре]', - nextWeek: '[ÇитеÑ] dddd LT [Ñехетре]', - lastWeek: '[Иртнĕ] dddd LT [Ñехетре]', - sameElse: 'L' - }, - relativeTime : { - future : function (output) { - var affix = /Ñехет$/i.exec(output) ? 'рен' : /çул$/i.exec(output) ? 'тан' : 'ран'; - return output + affix; - }, - past : '%s каÑлла', - s : 'пĕр-ик çеккунт', - m : 'пĕр минут', - mm : '%d минут', - h : 'пĕр Ñехет', - hh : '%d Ñехет', - d : 'пĕр кун', - dd : '%d кун', - M : 'пĕр уйăх', - MM : '%d уйăх', - y : 'пĕр çул', - yy : '%d çул' - }, - ordinalParse: /\d{1,2}-мĕш/, - ordinal : '%d-мĕш', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/cy.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/cy.js deleted file mode 100644 index 72b2f91..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/cy.js +++ /dev/null @@ -1,79 +0,0 @@ -// moment.js locale configuration -// locale : Welsh (cy) -// author : Robert Allen - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('cy', { - months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'), - monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'), - weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'), - weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'), - weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'), - // time formats are the same as en-gb - longDateFormat: { - LT: 'HH:mm', - LTS : 'LT:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY LT', - LLLL: 'dddd, D MMMM YYYY LT' - }, - calendar: { - sameDay: '[Heddiw am] LT', - nextDay: '[Yfory am] LT', - nextWeek: 'dddd [am] LT', - lastDay: '[Ddoe am] LT', - lastWeek: 'dddd [diwethaf am] LT', - sameElse: 'L' - }, - relativeTime: { - future: 'mewn %s', - past: '%s yn ôl', - s: 'ychydig eiliadau', - m: 'munud', - mm: '%d munud', - h: 'awr', - hh: '%d awr', - d: 'diwrnod', - dd: '%d diwrnod', - M: 'mis', - MM: '%d mis', - y: 'blwyddyn', - yy: '%d flynedd' - }, - ordinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/, - // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh - ordinal: function (number) { - var b = number, - output = '', - lookup = [ - '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed - 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed - ]; - - if (b > 20) { - if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) { - output = 'fed'; // not 30ain, 70ain or 90ain - } else { - output = 'ain'; - } - } else if (b > 0) { - output = lookup[b]; - } - - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/da.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/da.js deleted file mode 100644 index 686ce00..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/da.js +++ /dev/null @@ -1,58 +0,0 @@ -// moment.js locale configuration -// locale : danish (da) -// author : Ulrik Nielsen : https://github.com/mrbase - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('da', { - months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'), - monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), - weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), - weekdaysShort : 'søn_man_tir_ons_tor_fre_lør'.split('_'), - weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY LT', - LLLL : 'dddd [d.] D. MMMM YYYY LT' - }, - calendar : { - sameDay : '[I dag kl.] LT', - nextDay : '[I morgen kl.] LT', - nextWeek : 'dddd [kl.] LT', - lastDay : '[I gÃ¥r kl.] LT', - lastWeek : '[sidste] dddd [kl] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'om %s', - past : '%s siden', - s : 'fÃ¥ sekunder', - m : 'et minut', - mm : '%d minutter', - h : 'en time', - hh : '%d timer', - d : 'en dag', - dd : '%d dage', - M : 'en mÃ¥ned', - MM : '%d mÃ¥neder', - y : 'et Ã¥r', - yy : '%d Ã¥r' - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/de-at.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/de-at.js deleted file mode 100644 index c982638..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/de-at.js +++ /dev/null @@ -1,74 +0,0 @@ -// moment.js locale configuration -// locale : austrian german (de-at) -// author : lluchs : https://github.com/lluchs -// author: Menelion Elensúle: https://github.com/Oire -// author : Martin Groller : https://github.com/MadMG - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 'm': ['eine Minute', 'einer Minute'], - 'h': ['eine Stunde', 'einer Stunde'], - 'd': ['ein Tag', 'einem Tag'], - 'dd': [number + ' Tage', number + ' Tagen'], - 'M': ['ein Monat', 'einem Monat'], - 'MM': [number + ' Monate', number + ' Monaten'], - 'y': ['ein Jahr', 'einem Jahr'], - 'yy': [number + ' Jahre', number + ' Jahren'] - }; - return withoutSuffix ? format[key][0] : format[key][1]; - } - - return moment.defineLocale('de-at', { - months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), - monthsShort : 'Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), - weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), - weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), - weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), - longDateFormat : { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY LT', - LLLL : 'dddd, D. MMMM YYYY LT' - }, - calendar : { - sameDay: '[Heute um] LT [Uhr]', - sameElse: 'L', - nextDay: '[Morgen um] LT [Uhr]', - nextWeek: 'dddd [um] LT [Uhr]', - lastDay: '[Gestern um] LT [Uhr]', - lastWeek: '[letzten] dddd [um] LT [Uhr]' - }, - relativeTime : { - future : 'in %s', - past : 'vor %s', - s : 'ein paar Sekunden', - m : processRelativeTime, - mm : '%d Minuten', - h : processRelativeTime, - hh : '%d Stunden', - d : processRelativeTime, - dd : processRelativeTime, - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/de.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/de.js deleted file mode 100644 index f6d89a9..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/de.js +++ /dev/null @@ -1,73 +0,0 @@ -// moment.js locale configuration -// locale : german (de) -// author : lluchs : https://github.com/lluchs -// author: Menelion Elensúle: https://github.com/Oire - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 'm': ['eine Minute', 'einer Minute'], - 'h': ['eine Stunde', 'einer Stunde'], - 'd': ['ein Tag', 'einem Tag'], - 'dd': [number + ' Tage', number + ' Tagen'], - 'M': ['ein Monat', 'einem Monat'], - 'MM': [number + ' Monate', number + ' Monaten'], - 'y': ['ein Jahr', 'einem Jahr'], - 'yy': [number + ' Jahre', number + ' Jahren'] - }; - return withoutSuffix ? format[key][0] : format[key][1]; - } - - return moment.defineLocale('de', { - months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), - monthsShort : 'Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), - weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), - weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), - weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), - longDateFormat : { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY LT', - LLLL : 'dddd, D. MMMM YYYY LT' - }, - calendar : { - sameDay: '[Heute um] LT [Uhr]', - sameElse: 'L', - nextDay: '[Morgen um] LT [Uhr]', - nextWeek: 'dddd [um] LT [Uhr]', - lastDay: '[Gestern um] LT [Uhr]', - lastWeek: '[letzten] dddd [um] LT [Uhr]' - }, - relativeTime : { - future : 'in %s', - past : 'vor %s', - s : 'ein paar Sekunden', - m : processRelativeTime, - mm : '%d Minuten', - h : processRelativeTime, - hh : '%d Stunden', - d : processRelativeTime, - dd : processRelativeTime, - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/el.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/el.js deleted file mode 100644 index 6dc769e..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/el.js +++ /dev/null @@ -1,94 +0,0 @@ -// moment.js locale configuration -// locale : modern greek (el) -// author : Aggelos Karalias : https://github.com/mehiel - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('el', { - monthsNominativeEl : 'ΙανουάÏιος_ΦεβÏουάÏιος_ΜάÏτιος_ΑπÏίλιος_Μάιος_ΙοÏνιος_ΙοÏλιος_ΑÏγουστος_ΣεπτέμβÏιος_ΟκτώβÏιος_ÎοέμβÏιος_ΔεκέμβÏιος'.split('_'), - monthsGenitiveEl : 'ΙανουαÏίου_ΦεβÏουαÏίου_ΜαÏτίου_ΑπÏιλίου_ΜαÎου_Ιουνίου_Ιουλίου_ΑυγοÏστου_ΣεπτεμβÏίου_ΟκτωβÏίου_ÎοεμβÏίου_ΔεκεμβÏίου'.split('_'), - months : function (momentToFormat, format) { - if (/D/.test(format.substring(0, format.indexOf('MMMM')))) { // if there is a day number before 'MMMM' - return this._monthsGenitiveEl[momentToFormat.month()]; - } else { - return this._monthsNominativeEl[momentToFormat.month()]; - } - }, - monthsShort : 'Ιαν_Φεβ_ΜαÏ_ΑπÏ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Îοε_Δεκ'.split('_'), - weekdays : 'ΚυÏιακή_ΔευτέÏα_ΤÏίτη_ΤετάÏτη_Πέμπτη_ΠαÏασκευή_Σάββατο'.split('_'), - weekdaysShort : 'ΚυÏ_Δευ_ΤÏι_Τετ_Πεμ_ΠαÏ_Σαβ'.split('_'), - weekdaysMin : 'Κυ_Δε_ΤÏ_Τε_Πε_Πα_Σα'.split('_'), - meridiem : function (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'μμ' : 'ΜΜ'; - } else { - return isLower ? 'πμ' : 'ΠΜ'; - } - }, - isPM : function (input) { - return ((input + '').toLowerCase()[0] === 'μ'); - }, - meridiemParse : /[ΠΜ]\.?Îœ?\.?/i, - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendarEl : { - sameDay : '[ΣήμεÏα {}] LT', - nextDay : '[ΑÏÏιο {}] LT', - nextWeek : 'dddd [{}] LT', - lastDay : '[Χθες {}] LT', - lastWeek : function () { - switch (this.day()) { - case 6: - return '[το Ï€ÏοηγοÏμενο] dddd [{}] LT'; - default: - return '[την Ï€ÏοηγοÏμενη] dddd [{}] LT'; - } - }, - sameElse : 'L' - }, - calendar : function (key, mom) { - var output = this._calendarEl[key], - hours = mom && mom.hours(); - - if (typeof output === 'function') { - output = output.apply(mom); - } - - return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις')); - }, - relativeTime : { - future : 'σε %s', - past : '%s Ï€Ïιν', - s : 'λίγα δευτεÏόλεπτα', - m : 'ένα λεπτό', - mm : '%d λεπτά', - h : 'μία ÏŽÏα', - hh : '%d ÏŽÏες', - d : 'μία μέÏα', - dd : '%d μέÏες', - M : 'ένας μήνας', - MM : '%d μήνες', - y : 'ένας χÏόνος', - yy : '%d χÏόνια' - }, - ordinalParse: /\d{1,2}η/, - ordinal: '%dη', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/en-au.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/en-au.js deleted file mode 100644 index a382b0a..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/en-au.js +++ /dev/null @@ -1,64 +0,0 @@ -// moment.js locale configuration -// locale : australian english (en-au) - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('en-au', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' - }, - 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' - }, - ordinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/en-ca.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/en-ca.js deleted file mode 100644 index 2dec8a6..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/en-ca.js +++ /dev/null @@ -1,61 +0,0 @@ -// moment.js locale configuration -// locale : canadian english (en-ca) -// author : Jonathan Abourbih : https://github.com/jonbca - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('en-ca', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'YYYY-MM-DD', - LL : 'D MMMM, YYYY', - LLL : 'D MMMM, YYYY LT', - LLLL : 'dddd, D MMMM, YYYY LT' - }, - calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' - }, - 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' - }, - ordinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/en-gb.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/en-gb.js deleted file mode 100644 index 4ea2b29..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/en-gb.js +++ /dev/null @@ -1,65 +0,0 @@ -// moment.js locale configuration -// locale : great britain english (en-gb) -// author : Chris Gedrim : https://github.com/chrisgedrim - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('en-gb', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' - }, - 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' - }, - ordinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/eo.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/eo.js deleted file mode 100644 index 9e3d045..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/eo.js +++ /dev/null @@ -1,71 +0,0 @@ -// moment.js locale configuration -// locale : esperanto (eo) -// author : Colin Dean : https://github.com/colindean -// komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko. -// Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni! - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('eo', { - months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aÅ­gusto_septembro_oktobro_novembro_decembro'.split('_'), - monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aÅ­g_sep_okt_nov_dec'.split('_'), - weekdays : 'Dimanĉo_Lundo_Mardo_Merkredo_Ä´aÅ­do_Vendredo_Sabato'.split('_'), - weekdaysShort : 'Dim_Lun_Mard_Merk_Ä´aÅ­_Ven_Sab'.split('_'), - weekdaysMin : 'Di_Lu_Ma_Me_Ä´a_Ve_Sa'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'YYYY-MM-DD', - LL : 'D[-an de] MMMM, YYYY', - LLL : 'D[-an de] MMMM, YYYY LT', - LLLL : 'dddd, [la] D[-an de] MMMM, YYYY LT' - }, - meridiemParse: /[ap]\.t\.m/i, - isPM: function (input) { - return input.charAt(0).toLowerCase() === 'p'; - }, - meridiem : function (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'p.t.m.' : 'P.T.M.'; - } else { - return isLower ? 'a.t.m.' : 'A.T.M.'; - } - }, - calendar : { - sameDay : '[HodiaÅ­ je] LT', - nextDay : '[MorgaÅ­ je] LT', - nextWeek : 'dddd [je] LT', - lastDay : '[HieraÅ­ je] LT', - lastWeek : '[pasinta] dddd [je] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'je %s', - past : 'antaÅ­ %s', - s : 'sekundoj', - m : 'minuto', - mm : '%d minutoj', - h : 'horo', - hh : '%d horoj', - d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo - dd : '%d tagoj', - M : 'monato', - MM : '%d monatoj', - y : 'jaro', - yy : '%d jaroj' - }, - ordinalParse: /\d{1,2}a/, - ordinal : '%da', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/es.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/es.js deleted file mode 100644 index b6e30b1..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/es.js +++ /dev/null @@ -1,77 +0,0 @@ -// moment.js locale configuration -// locale : spanish (es) -// author : Julio Napurí : https://github.com/julionc - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), - monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); - - return moment.defineLocale('es', { - months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), - monthsShort : function (m, format) { - if (/-MMM-/.test(format)) { - return monthsShort[m.month()]; - } else { - return monthsShortDot[m.month()]; - } - }, - weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), - weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), - weekdaysMin : 'Do_Lu_Ma_Mi_Ju_Vi_Sá'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY LT', - LLLL : 'dddd, D [de] MMMM [de] YYYY LT' - }, - calendar : { - sameDay : function () { - return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - nextDay : function () { - return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - nextWeek : function () { - return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - lastDay : function () { - return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - lastWeek : function () { - return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'en %s', - past : 'hace %s', - s : 'unos segundos', - m : 'un minuto', - mm : '%d minutos', - h : 'una hora', - hh : '%d horas', - d : 'un día', - dd : '%d días', - M : 'un mes', - MM : '%d meses', - y : 'un año', - yy : '%d años' - }, - ordinalParse : /\d{1,2}º/, - ordinal : '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/et.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/et.js deleted file mode 100644 index 7dbcee7..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/et.js +++ /dev/null @@ -1,78 +0,0 @@ -// moment.js locale configuration -// locale : estonian (et) -// author : Henry Kehlmann : https://github.com/madhenry -// improvements : Illimar Tambek : https://github.com/ragulka - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'], - 'm' : ['ühe minuti', 'üks minut'], - 'mm': [number + ' minuti', number + ' minutit'], - 'h' : ['ühe tunni', 'tund aega', 'üks tund'], - 'hh': [number + ' tunni', number + ' tundi'], - 'd' : ['ühe päeva', 'üks päev'], - 'M' : ['kuu aja', 'kuu aega', 'üks kuu'], - 'MM': [number + ' kuu', number + ' kuud'], - 'y' : ['ühe aasta', 'aasta', 'üks aasta'], - 'yy': [number + ' aasta', number + ' aastat'] - }; - if (withoutSuffix) { - return format[key][2] ? format[key][2] : format[key][1]; - } - return isFuture ? format[key][0] : format[key][1]; - } - - return moment.defineLocale('et', { - months : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'), - monthsShort : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'), - weekdays : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'), - weekdaysShort : 'P_E_T_K_N_R_L'.split('_'), - weekdaysMin : 'P_E_T_K_N_R_L'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY LT', - LLLL : 'dddd, D. MMMM YYYY LT' - }, - calendar : { - sameDay : '[Täna,] LT', - nextDay : '[Homme,] LT', - nextWeek : '[Järgmine] dddd LT', - lastDay : '[Eile,] LT', - lastWeek : '[Eelmine] dddd LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s pärast', - past : '%s tagasi', - s : processRelativeTime, - m : processRelativeTime, - mm : processRelativeTime, - h : processRelativeTime, - hh : processRelativeTime, - d : processRelativeTime, - dd : '%d päeva', - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/eu.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/eu.js deleted file mode 100644 index c455c46..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/eu.js +++ /dev/null @@ -1,62 +0,0 @@ -// moment.js locale configuration -// locale : euskara (eu) -// author : Eneko Illarramendi : https://github.com/eillarra - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('eu', { - months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'), - monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'), - weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'), - weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'), - weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'YYYY-MM-DD', - LL : 'YYYY[ko] MMMM[ren] D[a]', - LLL : 'YYYY[ko] MMMM[ren] D[a] LT', - LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] LT', - l : 'YYYY-M-D', - ll : 'YYYY[ko] MMM D[a]', - lll : 'YYYY[ko] MMM D[a] LT', - llll : 'ddd, YYYY[ko] MMM D[a] LT' - }, - calendar : { - sameDay : '[gaur] LT[etan]', - nextDay : '[bihar] LT[etan]', - nextWeek : 'dddd LT[etan]', - lastDay : '[atzo] LT[etan]', - lastWeek : '[aurreko] dddd LT[etan]', - sameElse : 'L' - }, - relativeTime : { - future : '%s barru', - past : 'duela %s', - s : 'segundo batzuk', - m : 'minutu bat', - mm : '%d minutu', - h : 'ordu bat', - hh : '%d ordu', - d : 'egun bat', - dd : '%d egun', - M : 'hilabete bat', - MM : '%d hilabete', - y : 'urte bat', - yy : '%d urte' - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fa.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fa.js deleted file mode 100644 index 6d76575..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fa.js +++ /dev/null @@ -1,103 +0,0 @@ -// moment.js locale configuration -// locale : Persian (fa) -// author : Ebrahim Byagowi : https://github.com/ebraminio - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var symbolMap = { - '1': 'Û±', - '2': 'Û²', - '3': 'Û³', - '4': 'Û´', - '5': 'Ûµ', - '6': 'Û¶', - '7': 'Û·', - '8': 'Û¸', - '9': 'Û¹', - '0': 'Û°' - }, numberMap = { - 'Û±': '1', - 'Û²': '2', - 'Û³': '3', - 'Û´': '4', - 'Ûµ': '5', - 'Û¶': '6', - 'Û·': '7', - 'Û¸': '8', - 'Û¹': '9', - 'Û°': '0' - }; - - return moment.defineLocale('fa', { - months : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), - monthsShort : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), - weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), - weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), - weekdaysMin : 'ÛŒ_د_س_Ú†_Ù¾_ج_Ø´'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - meridiemParse: /قبل از ظهر|بعد از ظهر/, - isPM: function (input) { - return /بعد از ظهر/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'قبل از ظهر'; - } else { - return 'بعد از ظهر'; - } - }, - calendar : { - sameDay : '[امروز ساعت] LT', - nextDay : '[Ùردا ساعت] LT', - nextWeek : 'dddd [ساعت] LT', - lastDay : '[دیروز ساعت] LT', - lastWeek : 'dddd [پیش] [ساعت] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'در %s', - past : '%s پیش', - s : 'چندین ثانیه', - m : 'یک دقیقه', - mm : '%d دقیقه', - h : 'یک ساعت', - hh : '%d ساعت', - d : 'یک روز', - dd : '%d روز', - M : 'یک ماه', - MM : '%d ماه', - y : 'یک سال', - yy : '%d سال' - }, - preparse: function (string) { - return string.replace(/[Û°-Û¹]/g, function (match) { - return numberMap[match]; - }).replace(/ØŒ/g, ','); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }).replace(/,/g, 'ØŒ'); - }, - ordinalParse: /\d{1,2}Ù…/, - ordinal : '%dÙ…', - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fi.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fi.js deleted file mode 100644 index f884c3e..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fi.js +++ /dev/null @@ -1,107 +0,0 @@ -// moment.js locale configuration -// locale : finnish (fi) -// author : Tarmo Aidantausta : https://github.com/bleadof - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '), - numbersFuture = [ - 'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden', - numbersPast[7], numbersPast[8], numbersPast[9] - ]; - - function translate(number, withoutSuffix, key, isFuture) { - var result = ''; - switch (key) { - case 's': - return isFuture ? 'muutaman sekunnin' : 'muutama sekunti'; - case 'm': - return isFuture ? 'minuutin' : 'minuutti'; - case 'mm': - result = isFuture ? 'minuutin' : 'minuuttia'; - break; - case 'h': - return isFuture ? 'tunnin' : 'tunti'; - case 'hh': - result = isFuture ? 'tunnin' : 'tuntia'; - break; - case 'd': - return isFuture ? 'päivän' : 'päivä'; - case 'dd': - result = isFuture ? 'päivän' : 'päivää'; - break; - case 'M': - return isFuture ? 'kuukauden' : 'kuukausi'; - case 'MM': - result = isFuture ? 'kuukauden' : 'kuukautta'; - break; - case 'y': - return isFuture ? 'vuoden' : 'vuosi'; - case 'yy': - result = isFuture ? 'vuoden' : 'vuotta'; - break; - } - result = verbalNumber(number, isFuture) + ' ' + result; - return result; - } - - function verbalNumber(number, isFuture) { - return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number; - } - - return moment.defineLocale('fi', { - months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'), - monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'), - weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'), - weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'), - weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'), - longDateFormat : { - LT : 'HH.mm', - LTS : 'HH.mm.ss', - L : 'DD.MM.YYYY', - LL : 'Do MMMM[ta] YYYY', - LLL : 'Do MMMM[ta] YYYY, [klo] LT', - LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] LT', - l : 'D.M.YYYY', - ll : 'Do MMM YYYY', - lll : 'Do MMM YYYY, [klo] LT', - llll : 'ddd, Do MMM YYYY, [klo] LT' - }, - calendar : { - sameDay : '[tänään] [klo] LT', - nextDay : '[huomenna] [klo] LT', - nextWeek : 'dddd [klo] LT', - lastDay : '[eilen] [klo] LT', - lastWeek : '[viime] dddd[na] [klo] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s päästä', - past : '%s sitten', - s : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fo.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fo.js deleted file mode 100644 index 6b940e8..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fo.js +++ /dev/null @@ -1,58 +0,0 @@ -// moment.js locale configuration -// locale : faroese (fo) -// author : Ragnar Johannesen : https://github.com/ragnar123 - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('fo', { - months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'), - monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), - weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'), - weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'), - weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D. MMMM, YYYY LT' - }, - calendar : { - sameDay : '[à dag kl.] LT', - nextDay : '[à morgin kl.] LT', - nextWeek : 'dddd [kl.] LT', - lastDay : '[à gjár kl.] LT', - lastWeek : '[síðstu] dddd [kl] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'um %s', - past : '%s síðani', - s : 'fá sekund', - m : 'ein minutt', - mm : '%d minuttir', - h : 'ein tími', - hh : '%d tímar', - d : 'ein dagur', - dd : '%d dagar', - M : 'ein mánaði', - MM : '%d mánaðir', - y : 'eitt ár', - yy : '%d ár' - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fr-ca.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fr-ca.js deleted file mode 100644 index 6cac1b8..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fr-ca.js +++ /dev/null @@ -1,56 +0,0 @@ -// moment.js locale configuration -// locale : canadian french (fr-ca) -// author : Jonathan Abourbih : https://github.com/jonbca - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('fr-ca', { - months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), - monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), - weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), - weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), - weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'YYYY-MM-DD', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay: '[Aujourd\'hui à] LT', - nextDay: '[Demain à] LT', - nextWeek: 'dddd [à] LT', - lastDay: '[Hier à] LT', - lastWeek: 'dddd [dernier à] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'dans %s', - past : 'il y a %s', - s : 'quelques secondes', - m : 'une minute', - mm : '%d minutes', - h : 'une heure', - hh : '%d heures', - d : 'un jour', - dd : '%d jours', - M : 'un mois', - MM : '%d mois', - y : 'un an', - yy : '%d ans' - }, - ordinalParse: /\d{1,2}(er|)/, - ordinal : function (number) { - return number + (number === 1 ? 'er' : ''); - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fr.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fr.js deleted file mode 100644 index 4a7cbcc..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fr.js +++ /dev/null @@ -1,60 +0,0 @@ -// moment.js locale configuration -// locale : french (fr) -// author : John Fischer : https://github.com/jfroffice - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('fr', { - months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), - monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), - weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), - weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), - weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay: '[Aujourd\'hui à] LT', - nextDay: '[Demain à] LT', - nextWeek: 'dddd [à] LT', - lastDay: '[Hier à] LT', - lastWeek: 'dddd [dernier à] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'dans %s', - past : 'il y a %s', - s : 'quelques secondes', - m : 'une minute', - mm : '%d minutes', - h : 'une heure', - hh : '%d heures', - d : 'un jour', - dd : '%d jours', - M : 'un mois', - MM : '%d mois', - y : 'un an', - yy : '%d ans' - }, - ordinalParse: /\d{1,2}(er|)/, - ordinal : function (number) { - return number + (number === 1 ? 'er' : ''); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fy.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fy.js deleted file mode 100644 index f86c249..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/fy.js +++ /dev/null @@ -1,69 +0,0 @@ -// moment.js locale configuration -// locale : frisian (fy) -// author : Robin van der Vliet : https://github.com/robin0van0der0v - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'), - monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'); - - return moment.defineLocale('fy', { - months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'), - monthsShort : function (m, format) { - if (/-MMM-/.test(format)) { - return monthsShortWithoutDots[m.month()]; - } else { - return monthsShortWithDots[m.month()]; - } - }, - weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'), - weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'), - weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD-MM-YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay: '[hjoed om] LT', - nextDay: '[moarn om] LT', - nextWeek: 'dddd [om] LT', - lastDay: '[juster om] LT', - lastWeek: '[ôfrûne] dddd [om] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'oer %s', - past : '%s lyn', - s : 'in pear sekonden', - m : 'ien minút', - mm : '%d minuten', - h : 'ien oere', - hh : '%d oeren', - d : 'ien dei', - dd : '%d dagen', - M : 'ien moanne', - MM : '%d moannen', - y : 'ien jier', - yy : '%d jierren' - }, - ordinalParse: /\d{1,2}(ste|de)/, - ordinal : function (number) { - return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/gl.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/gl.js deleted file mode 100644 index 5ff9e3f..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/gl.js +++ /dev/null @@ -1,73 +0,0 @@ -// moment.js locale configuration -// locale : galician (gl) -// author : Juan G. Hurtado : https://github.com/juanghurtado - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('gl', { - months : 'Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro'.split('_'), - monthsShort : 'Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.'.split('_'), - weekdays : 'Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado'.split('_'), - weekdaysShort : 'Dom._Lun._Mar._Mér._Xov._Ven._Sáb.'.split('_'), - weekdaysMin : 'Do_Lu_Ma_Mé_Xo_Ve_Sá'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay : function () { - return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; - }, - nextDay : function () { - return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; - }, - nextWeek : function () { - return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; - }, - lastDay : function () { - return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT'; - }, - lastWeek : function () { - return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; - }, - sameElse : 'L' - }, - relativeTime : { - future : function (str) { - if (str === 'uns segundos') { - return 'nuns segundos'; - } - return 'en ' + str; - }, - past : 'hai %s', - s : 'uns segundos', - m : 'un minuto', - mm : '%d minutos', - h : 'unha hora', - hh : '%d horas', - d : 'un día', - dd : '%d días', - M : 'un mes', - MM : '%d meses', - y : 'un ano', - yy : '%d anos' - }, - ordinalParse : /\d{1,2}º/, - ordinal : '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/he.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/he.js deleted file mode 100644 index d2f4b13..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/he.js +++ /dev/null @@ -1,80 +0,0 @@ -// moment.js locale configuration -// locale : Hebrew (he) -// author : Tomer Cohen : https://github.com/tomer -// author : Moshe Simantov : https://github.com/DevelopmentIL -// author : Tal Ater : https://github.com/TalAter - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('he', { - months : 'ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר'.split('_'), - monthsShort : 'ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳'.split('_'), - weekdays : 'ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'), - weekdaysShort : '×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'), - weekdaysMin : '×_ב_×’_ד_×”_ו_ש'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D [ב]MMMM YYYY', - LLL : 'D [ב]MMMM YYYY LT', - LLLL : 'dddd, D [ב]MMMM YYYY LT', - l : 'D/M/YYYY', - ll : 'D MMM YYYY', - lll : 'D MMM YYYY LT', - llll : 'ddd, D MMM YYYY LT' - }, - calendar : { - sameDay : '[×”×™×•× ×‘Ö¾]LT', - nextDay : '[מחר ב־]LT', - nextWeek : 'dddd [בשעה] LT', - lastDay : '[×תמול ב־]LT', - lastWeek : '[ביו×] dddd [×”×חרון בשעה] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'בעוד %s', - past : 'לפני %s', - s : 'מספר שניות', - m : 'דקה', - mm : '%d דקות', - h : 'שעה', - hh : function (number) { - if (number === 2) { - return 'שעתיי×'; - } - return number + ' שעות'; - }, - d : 'יו×', - dd : function (number) { - if (number === 2) { - return 'יומיי×'; - } - return number + ' ימי×'; - }, - M : 'חודש', - MM : function (number) { - if (number === 2) { - return 'חודשיי×'; - } - return number + ' חודשי×'; - }, - y : 'שנה', - yy : function (number) { - if (number === 2) { - return 'שנתיי×'; - } else if (number % 10 === 0 && number !== 10) { - return number + ' שנה'; - } - return number + ' שני×'; - } - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/hi.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/hi.js deleted file mode 100644 index 173c4ee..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/hi.js +++ /dev/null @@ -1,121 +0,0 @@ -// moment.js locale configuration -// locale : hindi (hi) -// author : Mayank Singhal : https://github.com/mayanksinghal - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var symbolMap = { - '1': '१', - '2': '२', - '3': '३', - '4': '४', - '5': '५', - '6': '६', - '7': '७', - '8': '८', - '9': '९', - '0': '०' - }, - numberMap = { - '१': '1', - '२': '2', - '३': '3', - '४': '4', - '५': '5', - '६': '6', - '७': '7', - '८': '8', - '९': '9', - '०': '0' - }; - - return moment.defineLocale('hi', { - months : 'जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°'.split('_'), - monthsShort : 'जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.'.split('_'), - weekdays : 'रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split('_'), - weekdaysShort : 'रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split('_'), - weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split('_'), - longDateFormat : { - LT : 'A h:mm बजे', - LTS : 'A h:mm:ss बजे', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, LT', - LLLL : 'dddd, D MMMM YYYY, LT' - }, - calendar : { - sameDay : '[आज] LT', - nextDay : '[कल] LT', - nextWeek : 'dddd, LT', - lastDay : '[कल] LT', - lastWeek : '[पिछले] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s में', - past : '%s पहले', - s : 'कà¥à¤› ही कà¥à¤·à¤£', - m : 'à¤à¤• मिनट', - mm : '%d मिनट', - h : 'à¤à¤• घंटा', - hh : '%d घंटे', - d : 'à¤à¤• दिन', - dd : '%d दिन', - M : 'à¤à¤• महीने', - MM : '%d महीने', - y : 'à¤à¤• वरà¥à¤·', - yy : '%d वरà¥à¤·' - }, - preparse: function (string) { - return string.replace(/[१२३४५६७८९०]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - // Hindi notation for meridiems are quite fuzzy in practice. While there exists - // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi. - meridiemParse: /रात|सà¥à¤¬à¤¹|दोपहर|शाम/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'रात') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'सà¥à¤¬à¤¹') { - return hour; - } else if (meridiem === 'दोपहर') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'शाम') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'रात'; - } else if (hour < 10) { - return 'सà¥à¤¬à¤¹'; - } else if (hour < 17) { - return 'दोपहर'; - } else if (hour < 20) { - return 'शाम'; - } else { - return 'रात'; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/hr.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/hr.js deleted file mode 100644 index 65264dc..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/hr.js +++ /dev/null @@ -1,141 +0,0 @@ -// moment.js locale configuration -// locale : hrvatski (hr) -// author : Bojan Marković : https://github.com/bmarkovic - -// based on (sl) translation by Robert SedovÅ¡ek - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - function translate(number, withoutSuffix, key) { - var result = number + ' '; - switch (key) { - case 'm': - return withoutSuffix ? 'jedna minuta' : 'jedne minute'; - case 'mm': - if (number === 1) { - result += 'minuta'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'minute'; - } else { - result += 'minuta'; - } - return result; - case 'h': - return withoutSuffix ? 'jedan sat' : 'jednog sata'; - case 'hh': - if (number === 1) { - result += 'sat'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'sata'; - } else { - result += 'sati'; - } - return result; - case 'dd': - if (number === 1) { - result += 'dan'; - } else { - result += 'dana'; - } - return result; - case 'MM': - if (number === 1) { - result += 'mjesec'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'mjeseca'; - } else { - result += 'mjeseci'; - } - return result; - case 'yy': - if (number === 1) { - result += 'godina'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'godine'; - } else { - result += 'godina'; - } - return result; - } - } - - return moment.defineLocale('hr', { - months : 'sjeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_'), - monthsShort : 'sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'), - weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota'.split('_'), - weekdaysShort : 'ned._pon._uto._sri._Äet._pet._sub.'.split('_'), - weekdaysMin : 'ne_po_ut_sr_Äe_pe_su'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'DD. MM. YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY LT', - LLLL : 'dddd, D. MMMM YYYY LT' - }, - calendar : { - sameDay : '[danas u] LT', - nextDay : '[sutra u] LT', - - nextWeek : function () { - switch (this.day()) { - case 0: - return '[u] [nedjelju] [u] LT'; - case 3: - return '[u] [srijedu] [u] LT'; - case 6: - return '[u] [subotu] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[u] dddd [u] LT'; - } - }, - lastDay : '[juÄer u] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - return '[proÅ¡lu] dddd [u] LT'; - case 6: - return '[proÅ¡le] [subote] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[proÅ¡li] dddd [u] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'za %s', - past : 'prije %s', - s : 'par sekundi', - m : translate, - mm : translate, - h : translate, - hh : translate, - d : 'dan', - dd : translate, - M : 'mjesec', - MM : translate, - y : 'godinu', - yy : translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/hu.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/hu.js deleted file mode 100644 index de8cae9..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/hu.js +++ /dev/null @@ -1,111 +0,0 @@ -// moment.js locale configuration -// locale : hungarian (hu) -// author : Adam Brunner : https://github.com/adambrunner - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var weekEndings = 'vasárnap hétfÅ‘n kedden szerdán csütörtökön pénteken szombaton'.split(' '); - - function translate(number, withoutSuffix, key, isFuture) { - var num = number, - suffix; - - switch (key) { - case 's': - return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce'; - case 'm': - return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce'); - case 'mm': - return num + (isFuture || withoutSuffix ? ' perc' : ' perce'); - case 'h': - return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája'); - case 'hh': - return num + (isFuture || withoutSuffix ? ' óra' : ' órája'); - case 'd': - return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja'); - case 'dd': - return num + (isFuture || withoutSuffix ? ' nap' : ' napja'); - case 'M': - return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); - case 'MM': - return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); - case 'y': - return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve'); - case 'yy': - return num + (isFuture || withoutSuffix ? ' év' : ' éve'); - } - - return ''; - } - - function week(isFuture) { - return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]'; - } - - return moment.defineLocale('hu', { - months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'), - monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'), - weekdays : 'vasárnap_hétfÅ‘_kedd_szerda_csütörtök_péntek_szombat'.split('_'), - weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'), - weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'YYYY.MM.DD.', - LL : 'YYYY. MMMM D.', - LLL : 'YYYY. MMMM D., LT', - LLLL : 'YYYY. MMMM D., dddd LT' - }, - meridiemParse: /de|du/i, - isPM: function (input) { - return input.charAt(1).toLowerCase() === 'u'; - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 12) { - return isLower === true ? 'de' : 'DE'; - } else { - return isLower === true ? 'du' : 'DU'; - } - }, - calendar : { - sameDay : '[ma] LT[-kor]', - nextDay : '[holnap] LT[-kor]', - nextWeek : function () { - return week.call(this, true); - }, - lastDay : '[tegnap] LT[-kor]', - lastWeek : function () { - return week.call(this, false); - }, - sameElse : 'L' - }, - relativeTime : { - future : '%s múlva', - past : '%s', - s : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/hy-am.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/hy-am.js deleted file mode 100644 index 6e2de8b..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/hy-am.js +++ /dev/null @@ -1,118 +0,0 @@ -// moment.js locale configuration -// locale : Armenian (hy-am) -// author : Armendarabyan : https://github.com/armendarabyan - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - function monthsCaseReplace(m, format) { - var months = { - 'nominative': 'Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€_Õ´Õ¡Ö€Õ¿_Õ¡ÕºÖ€Õ«Õ¬_Õ´Õ¡ÕµÕ«Õ½_Õ°Õ¸Ö‚Õ¶Õ«Õ½_Õ°Õ¸Ö‚Õ¬Õ«Õ½_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€'.split('_'), - 'accusative': 'Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€Õ«_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€Õ«_Õ´Õ¡Ö€Õ¿Õ«_Õ¡ÕºÖ€Õ«Õ¬Õ«_Õ´Õ¡ÕµÕ«Õ½Õ«_Õ°Õ¸Ö‚Õ¶Õ«Õ½Õ«_Õ°Õ¸Ö‚Õ¬Õ«Õ½Õ«_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½Õ«_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«'.split('_') - }, - - nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? - 'accusative' : - 'nominative'; - - return months[nounCase][m.month()]; - } - - function monthsShortCaseReplace(m, format) { - var monthsShort = 'Õ°Õ¶Õ¾_ÖƒÕ¿Ö€_Õ´Ö€Õ¿_Õ¡ÕºÖ€_Õ´ÕµÕ½_Õ°Õ¶Õ½_Õ°Õ¬Õ½_Ö…Õ£Õ½_Õ½ÕºÕ¿_Õ°Õ¯Õ¿_Õ¶Õ´Õ¢_Õ¤Õ¯Õ¿'.split('_'); - - return monthsShort[m.month()]; - } - - function weekdaysCaseReplace(m, format) { - var weekdays = 'Õ¯Õ«Ö€Õ¡Õ¯Õ«_Õ¥Ö€Õ¯Õ¸Ö‚Õ·Õ¡Õ¢Õ©Õ«_Õ¥Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ¹Õ¸Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ°Õ«Õ¶Õ£Õ·Õ¡Õ¢Õ©Õ«_Õ¸Ö‚Ö€Õ¢Õ¡Õ©_Õ·Õ¡Õ¢Õ¡Õ©'.split('_'); - - return weekdays[m.day()]; - } - - return moment.defineLocale('hy-am', { - months : monthsCaseReplace, - monthsShort : monthsShortCaseReplace, - weekdays : weekdaysCaseReplace, - weekdaysShort : 'Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©'.split('_'), - weekdaysMin : 'Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY Õ©.', - LLL : 'D MMMM YYYY Õ©., LT', - LLLL : 'dddd, D MMMM YYYY Õ©., LT' - }, - calendar : { - sameDay: '[Õ¡ÕµÕ½Ö…Ö€] LT', - nextDay: '[Õ¾Õ¡Õ²Õ¨] LT', - lastDay: '[Õ¥Ö€Õ¥Õ¯] LT', - nextWeek: function () { - return 'dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT'; - }, - lastWeek: function () { - return '[Õ¡Õ¶ÖÕ¡Õ®] dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT'; - }, - sameElse: 'L' - }, - relativeTime : { - future : '%s Õ°Õ¥Õ¿Õ¸', - past : '%s Õ¡Õ¼Õ¡Õ»', - s : 'Õ´Õ« Ö„Õ¡Õ¶Õ« Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶', - m : 'Ö€Õ¸ÕºÕ¥', - mm : '%d Ö€Õ¸ÕºÕ¥', - h : 'ÕªÕ¡Õ´', - hh : '%d ÕªÕ¡Õ´', - d : 'Ö…Ö€', - dd : '%d Ö…Ö€', - M : 'Õ¡Õ´Õ«Õ½', - MM : '%d Õ¡Õ´Õ«Õ½', - y : 'Õ¿Õ¡Ö€Õ«', - yy : '%d Õ¿Õ¡Ö€Õ«' - }, - - meridiemParse: /Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡|Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡|ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶/, - isPM: function (input) { - return /^(ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶)$/.test(input); - }, - meridiem : function (hour) { - if (hour < 4) { - return 'Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡'; - } else if (hour < 12) { - return 'Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡'; - } else if (hour < 17) { - return 'ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡'; - } else { - return 'Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶'; - } - }, - - ordinalParse: /\d{1,2}|\d{1,2}-(Õ«Õ¶|Ö€Õ¤)/, - ordinal: function (number, period) { - switch (period) { - case 'DDD': - case 'w': - case 'W': - case 'DDDo': - if (number === 1) { - return number + '-Õ«Õ¶'; - } - return number + '-Ö€Õ¤'; - default: - return number; - } - }, - - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/id.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/id.js deleted file mode 100644 index fe04849..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/id.js +++ /dev/null @@ -1,81 +0,0 @@ -// moment.js locale configuration -// locale : Bahasa Indonesia (id) -// author : Mohammad Satrio Utomo : https://github.com/tyok -// reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('id', { - months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des'.split('_'), - weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'), - weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'), - weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'), - longDateFormat : { - LT : 'HH.mm', - LTS : 'LT.ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY [pukul] LT', - LLLL : 'dddd, D MMMM YYYY [pukul] LT' - }, - meridiemParse: /pagi|siang|sore|malam/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'pagi') { - return hour; - } else if (meridiem === 'siang') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === 'sore' || meridiem === 'malam') { - return hour + 12; - } - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 11) { - return 'pagi'; - } else if (hours < 15) { - return 'siang'; - } else if (hours < 19) { - return 'sore'; - } else { - return 'malam'; - } - }, - calendar : { - sameDay : '[Hari ini pukul] LT', - nextDay : '[Besok pukul] LT', - nextWeek : 'dddd [pukul] LT', - lastDay : '[Kemarin pukul] LT', - lastWeek : 'dddd [lalu pukul] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'dalam %s', - past : '%s yang lalu', - s : 'beberapa detik', - m : 'semenit', - mm : '%d menit', - h : 'sejam', - hh : '%d jam', - d : 'sehari', - dd : '%d hari', - M : 'sebulan', - MM : '%d bulan', - y : 'setahun', - yy : '%d tahun' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/is.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/is.js deleted file mode 100644 index 21888aa..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/is.js +++ /dev/null @@ -1,126 +0,0 @@ -// moment.js locale configuration -// locale : icelandic (is) -// author : Hinrik Örn Sigurðsson : https://github.com/hinrik - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - function plural(n) { - if (n % 100 === 11) { - return true; - } else if (n % 10 === 1) { - return false; - } - return true; - } - - function translate(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - switch (key) { - case 's': - return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum'; - case 'm': - return withoutSuffix ? 'mínúta' : 'mínútu'; - case 'mm': - if (plural(number)) { - return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum'); - } else if (withoutSuffix) { - return result + 'mínúta'; - } - return result + 'mínútu'; - case 'hh': - if (plural(number)) { - return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum'); - } - return result + 'klukkustund'; - case 'd': - if (withoutSuffix) { - return 'dagur'; - } - return isFuture ? 'dag' : 'degi'; - case 'dd': - if (plural(number)) { - if (withoutSuffix) { - return result + 'dagar'; - } - return result + (isFuture ? 'daga' : 'dögum'); - } else if (withoutSuffix) { - return result + 'dagur'; - } - return result + (isFuture ? 'dag' : 'degi'); - case 'M': - if (withoutSuffix) { - return 'mánuður'; - } - return isFuture ? 'mánuð' : 'mánuði'; - case 'MM': - if (plural(number)) { - if (withoutSuffix) { - return result + 'mánuðir'; - } - return result + (isFuture ? 'mánuði' : 'mánuðum'); - } else if (withoutSuffix) { - return result + 'mánuður'; - } - return result + (isFuture ? 'mánuð' : 'mánuði'); - case 'y': - return withoutSuffix || isFuture ? 'ár' : 'ári'; - case 'yy': - if (plural(number)) { - return result + (withoutSuffix || isFuture ? 'ár' : 'árum'); - } - return result + (withoutSuffix || isFuture ? 'ár' : 'ári'); - } - } - - return moment.defineLocale('is', { - months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'), - monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'), - weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'), - weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'), - weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY [kl.] LT', - LLLL : 'dddd, D. MMMM YYYY [kl.] LT' - }, - calendar : { - sameDay : '[í dag kl.] LT', - nextDay : '[á morgun kl.] LT', - nextWeek : 'dddd [kl.] LT', - lastDay : '[í gær kl.] LT', - lastWeek : '[síðasta] dddd [kl.] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'eftir %s', - past : 'fyrir %s síðan', - s : translate, - m : translate, - mm : translate, - h : 'klukkustund', - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/it.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/it.js deleted file mode 100644 index 9d14714..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/it.js +++ /dev/null @@ -1,68 +0,0 @@ -// moment.js locale configuration -// locale : italian (it) -// author : Lorenzo : https://github.com/aliem -// author: Mattia Larentis: https://github.com/nostalgiaz - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('it', { - months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'), - monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'), - weekdays : 'Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato'.split('_'), - weekdaysShort : 'Dom_Lun_Mar_Mer_Gio_Ven_Sab'.split('_'), - weekdaysMin : 'D_L_Ma_Me_G_V_S'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay: '[Oggi alle] LT', - nextDay: '[Domani alle] LT', - nextWeek: 'dddd [alle] LT', - lastDay: '[Ieri alle] LT', - lastWeek: function () { - switch (this.day()) { - case 0: - return '[la scorsa] dddd [alle] LT'; - default: - return '[lo scorso] dddd [alle] LT'; - } - }, - sameElse: 'L' - }, - relativeTime : { - future : function (s) { - return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s; - }, - past : '%s fa', - s : 'alcuni secondi', - m : 'un minuto', - mm : '%d minuti', - h : 'un\'ora', - hh : '%d ore', - d : 'un giorno', - dd : '%d giorni', - M : 'un mese', - MM : '%d mesi', - y : 'un anno', - yy : '%d anni' - }, - ordinalParse : /\d{1,2}º/, - ordinal: '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ja.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ja.js deleted file mode 100644 index 1feb202..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ja.js +++ /dev/null @@ -1,63 +0,0 @@ -// moment.js locale configuration -// locale : japanese (ja) -// author : LI Long : https://github.com/baryon - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('ja', { - months : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), - monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), - weekdays : '日曜日_月曜日_ç«æ›œæ—¥_水曜日_木曜日_金曜日_土曜日'.split('_'), - weekdaysShort : 'æ—¥_月_ç«_æ°´_木_金_土'.split('_'), - weekdaysMin : 'æ—¥_月_ç«_æ°´_木_金_土'.split('_'), - longDateFormat : { - LT : 'Ah時m分', - LTS : 'LTs秒', - L : 'YYYY/MM/DD', - LL : 'YYYYå¹´M月Dæ—¥', - LLL : 'YYYYå¹´M月Dæ—¥LT', - LLLL : 'YYYYå¹´M月Dæ—¥LT dddd' - }, - meridiemParse: /åˆå‰|åˆå¾Œ/i, - isPM : function (input) { - return input === 'åˆå¾Œ'; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'åˆå‰'; - } else { - return 'åˆå¾Œ'; - } - }, - calendar : { - sameDay : '[今日] LT', - nextDay : '[明日] LT', - nextWeek : '[æ¥é€±]dddd LT', - lastDay : '[昨日] LT', - lastWeek : '[å‰é€±]dddd LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s後', - past : '%så‰', - s : '数秒', - m : '1分', - mm : '%d分', - h : '1時間', - hh : '%d時間', - d : '1æ—¥', - dd : '%dæ—¥', - M : '1ヶ月', - MM : '%dヶ月', - y : '1å¹´', - yy : '%då¹´' - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ka.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ka.js deleted file mode 100644 index b56e18c..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ka.js +++ /dev/null @@ -1,109 +0,0 @@ -// moment.js locale configuration -// locale : Georgian (ka) -// author : Irakli Janiashvili : https://github.com/irakli-janiashvili - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - function monthsCaseReplace(m, format) { - var months = { - 'nominative': 'იáƒáƒœáƒ•áƒáƒ áƒ˜_თებერვáƒáƒšáƒ˜_მáƒáƒ áƒ¢áƒ˜_áƒáƒžáƒ áƒ˜áƒšáƒ˜_მáƒáƒ˜áƒ¡áƒ˜_ივნისი_ივლისი_áƒáƒ’ვისტáƒ_სექტემბერი_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი_ნáƒáƒ”მბერი_დეკემბერი'.split('_'), - 'accusative': 'იáƒáƒœáƒ•áƒáƒ áƒ¡_თებერვáƒáƒšáƒ¡_მáƒáƒ áƒ¢áƒ¡_áƒáƒžáƒ áƒ˜áƒšáƒ˜áƒ¡_მáƒáƒ˜áƒ¡áƒ¡_ივნისს_ივლისს_áƒáƒ’ვისტს_სექტემბერს_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერს_ნáƒáƒ”მბერს_დეკემბერს'.split('_') - }, - - nounCase = (/D[oD] *MMMM?/).test(format) ? - 'accusative' : - 'nominative'; - - return months[nounCase][m.month()]; - } - - function weekdaysCaseReplace(m, format) { - var weekdays = { - 'nominative': 'კვირáƒ_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ი_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი_ხუთშáƒáƒ‘áƒáƒ—ი_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი_შáƒáƒ‘áƒáƒ—ი'.split('_'), - 'accusative': 'კვირáƒáƒ¡_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ს_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ს_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ს_ხუთშáƒáƒ‘áƒáƒ—ს_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვს_შáƒáƒ‘áƒáƒ—ს'.split('_') - }, - - nounCase = (/(წინáƒ|შემდეგ)/).test(format) ? - 'accusative' : - 'nominative'; - - return weekdays[nounCase][m.day()]; - } - - return moment.defineLocale('ka', { - months : monthsCaseReplace, - monthsShort : 'იáƒáƒœ_თებ_მáƒáƒ _áƒáƒžáƒ _მáƒáƒ˜_ივნ_ივლ_áƒáƒ’ვ_სექ_áƒáƒ¥áƒ¢_ნáƒáƒ”_დეკ'.split('_'), - weekdays : weekdaysCaseReplace, - weekdaysShort : 'კვი_áƒáƒ áƒ¨_სáƒáƒ›_áƒáƒ—ხ_ხუთ_პáƒáƒ _შáƒáƒ‘'.split('_'), - weekdaysMin : 'კვ_áƒáƒ _სáƒ_áƒáƒ—_ხუ_პáƒ_შáƒ'.split('_'), - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay : '[დღეს] LT[-ზე]', - nextDay : '[ხვáƒáƒš] LT[-ზე]', - lastDay : '[გუშინ] LT[-ზე]', - nextWeek : '[შემდეგ] dddd LT[-ზე]', - lastWeek : '[წინáƒ] dddd LT-ზე', - sameElse : 'L' - }, - relativeTime : { - future : function (s) { - return (/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|წელი)/).test(s) ? - s.replace(/ი$/, 'ში') : - s + 'ში'; - }, - past : function (s) { - if ((/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|დღე|თვე)/).test(s)) { - return s.replace(/(ი|ე)$/, 'ის წინ'); - } - if ((/წელი/).test(s)) { - return s.replace(/წელი$/, 'წლის წინ'); - } - }, - s : 'რáƒáƒ›áƒ“ენიმე წáƒáƒ›áƒ˜', - m : 'წუთი', - mm : '%d წუთი', - h : 'სáƒáƒáƒ—ი', - hh : '%d სáƒáƒáƒ—ი', - d : 'დღე', - dd : '%d დღე', - M : 'თვე', - MM : '%d თვე', - y : 'წელი', - yy : '%d წელი' - }, - ordinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/, - ordinal : function (number) { - if (number === 0) { - return number; - } - - if (number === 1) { - return number + '-ლი'; - } - - if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) { - return 'მე-' + number; - } - - return number + '-ე'; - }, - week : { - dow : 1, - doy : 7 - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/km.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/km.js deleted file mode 100644 index 8d7b9b8..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/km.js +++ /dev/null @@ -1,56 +0,0 @@ -// moment.js locale configuration -// locale : khmer (km) -// author : Kruy Vanna : https://github.com/kruyvanna - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('km', { - months: 'មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ'.split('_'), - monthsShort: 'មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ'.split('_'), - weekdays: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), - weekdaysShort: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), - weekdaysMin: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), - longDateFormat: { - LT: 'HH:mm', - LTS : 'LT:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY LT', - LLLL: 'dddd, D MMMM YYYY LT' - }, - calendar: { - sameDay: '[ážáŸ’ងៃនៈ ម៉ោង] LT', - nextDay: '[ស្អែក ម៉ោង] LT', - nextWeek: 'dddd [ម៉ោង] LT', - lastDay: '[ម្សិលមិញ ម៉ោង] LT', - lastWeek: 'dddd [សប្ážáž¶áž áŸáž˜áž»áž“] [ម៉ោង] LT', - sameElse: 'L' - }, - relativeTime: { - future: '%sទៀáž', - past: '%sមុន', - s: 'ប៉ុន្មានវិនាទី', - m: 'មួយនាទី', - mm: '%d នាទី', - h: 'មួយម៉ោង', - hh: '%d ម៉ោង', - d: 'មួយážáŸ’ងៃ', - dd: '%d ážáŸ’ងៃ', - M: 'មួយážáŸ‚', - MM: '%d ážáŸ‚', - y: 'មួយឆ្នាំ', - yy: '%d ឆ្នាំ' - }, - week: { - dow: 1, // Monday is the first day of the week. - doy: 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ko.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ko.js deleted file mode 100644 index 8f9396f..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ko.js +++ /dev/null @@ -1,65 +0,0 @@ -// moment.js locale configuration -// locale : korean (ko) -// -// authors -// -// - Kyungwook, Park : https://github.com/kyungw00k -// - Jeeeyul Lee -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('ko', { - months : '1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”'.split('_'), - monthsShort : '1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”'.split('_'), - weekdays : 'ì¼ìš”ì¼_월요ì¼_화요ì¼_수요ì¼_목요ì¼_금요ì¼_토요ì¼'.split('_'), - weekdaysShort : 'ì¼_ì›”_í™”_수_목_금_토'.split('_'), - weekdaysMin : 'ì¼_ì›”_í™”_수_목_금_토'.split('_'), - longDateFormat : { - LT : 'A hì‹œ m분', - LTS : 'A hì‹œ m분 sì´ˆ', - L : 'YYYY.MM.DD', - LL : 'YYYYë…„ MMMM Dì¼', - LLL : 'YYYYë…„ MMMM Dì¼ LT', - LLLL : 'YYYYë…„ MMMM Dì¼ dddd LT' - }, - calendar : { - sameDay : '오늘 LT', - nextDay : 'ë‚´ì¼ LT', - nextWeek : 'dddd LT', - lastDay : 'ì–´ì œ LT', - lastWeek : '지난주 dddd LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s 후', - past : '%s ì „', - s : '몇초', - ss : '%dì´ˆ', - m : 'ì¼ë¶„', - mm : '%d분', - h : '한시간', - hh : '%d시간', - d : '하루', - dd : '%dì¼', - M : '한달', - MM : '%d달', - y : 'ì¼ë…„', - yy : '%dë…„' - }, - ordinalParse : /\d{1,2}ì¼/, - ordinal : '%dì¼', - meridiemParse : /오전|오후/, - isPM : function (token) { - return token === '오후'; - }, - meridiem : function (hour, minute, isUpper) { - return hour < 12 ? '오전' : '오후'; - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/lb.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/lb.js deleted file mode 100644 index 2e84dab..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/lb.js +++ /dev/null @@ -1,139 +0,0 @@ -// moment.js locale configuration -// locale : Luxembourgish (lb) -// author : mweimerskirch : https://github.com/mweimerskirch, David Raison : https://github.com/kwisatz - -// Note: Luxembourgish has a very particular phonological rule ('Eifeler Regel') that causes the -// deletion of the final 'n' in certain contexts. That's what the 'eifelerRegelAppliesToWeekday' -// and 'eifelerRegelAppliesToNumber' methods are meant for - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 'm': ['eng Minutt', 'enger Minutt'], - 'h': ['eng Stonn', 'enger Stonn'], - 'd': ['een Dag', 'engem Dag'], - 'M': ['ee Mount', 'engem Mount'], - 'y': ['ee Joer', 'engem Joer'] - }; - return withoutSuffix ? format[key][0] : format[key][1]; - } - - function processFutureTime(string) { - var number = string.substr(0, string.indexOf(' ')); - if (eifelerRegelAppliesToNumber(number)) { - return 'a ' + string; - } - return 'an ' + string; - } - - function processPastTime(string) { - var number = string.substr(0, string.indexOf(' ')); - if (eifelerRegelAppliesToNumber(number)) { - return 'viru ' + string; - } - return 'virun ' + string; - } - - /** - * Returns true if the word before the given number loses the '-n' ending. - * e.g. 'an 10 Deeg' but 'a 5 Deeg' - * - * @param number {integer} - * @returns {boolean} - */ - function eifelerRegelAppliesToNumber(number) { - number = parseInt(number, 10); - if (isNaN(number)) { - return false; - } - if (number < 0) { - // Negative Number --> always true - return true; - } else if (number < 10) { - // Only 1 digit - if (4 <= number && number <= 7) { - return true; - } - return false; - } else if (number < 100) { - // 2 digits - var lastDigit = number % 10, firstDigit = number / 10; - if (lastDigit === 0) { - return eifelerRegelAppliesToNumber(firstDigit); - } - return eifelerRegelAppliesToNumber(lastDigit); - } else if (number < 10000) { - // 3 or 4 digits --> recursively check first digit - while (number >= 10) { - number = number / 10; - } - return eifelerRegelAppliesToNumber(number); - } else { - // Anything larger than 4 digits: recursively check first n-3 digits - number = number / 1000; - return eifelerRegelAppliesToNumber(number); - } - } - - return moment.defineLocale('lb', { - months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), - monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), - weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'), - weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'), - weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'), - longDateFormat: { - LT: 'H:mm [Auer]', - LTS: 'H:mm:ss [Auer]', - L: 'DD.MM.YYYY', - LL: 'D. MMMM YYYY', - LLL: 'D. MMMM YYYY LT', - LLLL: 'dddd, D. MMMM YYYY LT' - }, - calendar: { - sameDay: '[Haut um] LT', - sameElse: 'L', - nextDay: '[Muer um] LT', - nextWeek: 'dddd [um] LT', - lastDay: '[Gëschter um] LT', - lastWeek: function () { - // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule - switch (this.day()) { - case 2: - case 4: - return '[Leschten] dddd [um] LT'; - default: - return '[Leschte] dddd [um] LT'; - } - } - }, - relativeTime : { - future : processFutureTime, - past : processPastTime, - s : 'e puer Sekonnen', - m : processRelativeTime, - mm : '%d Minutten', - h : processRelativeTime, - hh : '%d Stonnen', - d : processRelativeTime, - dd : '%d Deeg', - M : processRelativeTime, - MM : '%d Méint', - y : processRelativeTime, - yy : '%d Joer' - }, - ordinalParse: /\d{1,2}\./, - ordinal: '%d.', - week: { - dow: 1, // Monday is the first day of the week. - doy: 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/lt.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/lt.js deleted file mode 100644 index 2d87e04..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/lt.js +++ /dev/null @@ -1,120 +0,0 @@ -// moment.js locale configuration -// locale : Lithuanian (lt) -// author : Mindaugas MozÅ«ras : https://github.com/mmozuras - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var units = { - 'm' : 'minutÄ—_minutÄ—s_minutÄ™', - 'mm': 'minutÄ—s_minuÄių_minutes', - 'h' : 'valanda_valandos_valandÄ…', - 'hh': 'valandos_valandų_valandas', - 'd' : 'diena_dienos_dienÄ…', - 'dd': 'dienos_dienų_dienas', - 'M' : 'mÄ—nuo_mÄ—nesio_mÄ—nesį', - 'MM': 'mÄ—nesiai_mÄ—nesių_mÄ—nesius', - 'y' : 'metai_metų_metus', - 'yy': 'metai_metų_metus' - }, - weekDays = 'sekmadienis_pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis'.split('_'); - - function translateSeconds(number, withoutSuffix, key, isFuture) { - if (withoutSuffix) { - return 'kelios sekundÄ—s'; - } else { - return isFuture ? 'kelių sekundžių' : 'kelias sekundes'; - } - } - - function translateSingular(number, withoutSuffix, key, isFuture) { - return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]); - } - - function special(number) { - return number % 10 === 0 || (number > 10 && number < 20); - } - - function forms(key) { - return units[key].split('_'); - } - - function translate(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - if (number === 1) { - return result + translateSingular(number, withoutSuffix, key[0], isFuture); - } else if (withoutSuffix) { - return result + (special(number) ? forms(key)[1] : forms(key)[0]); - } else { - if (isFuture) { - return result + forms(key)[1]; - } else { - return result + (special(number) ? forms(key)[1] : forms(key)[2]); - } - } - } - - function relativeWeekDay(moment, format) { - var nominative = format.indexOf('dddd HH:mm') === -1, - weekDay = weekDays[moment.day()]; - - return nominative ? weekDay : weekDay.substring(0, weekDay.length - 2) + 'į'; - } - - return moment.defineLocale('lt', { - months : 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio'.split('_'), - monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'), - weekdays : relativeWeekDay, - weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Å eÅ¡'.split('_'), - weekdaysMin : 'S_P_A_T_K_Pn_Å '.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'YYYY-MM-DD', - LL : 'YYYY [m.] MMMM D [d.]', - LLL : 'YYYY [m.] MMMM D [d.], LT [val.]', - LLLL : 'YYYY [m.] MMMM D [d.], dddd, LT [val.]', - l : 'YYYY-MM-DD', - ll : 'YYYY [m.] MMMM D [d.]', - lll : 'YYYY [m.] MMMM D [d.], LT [val.]', - llll : 'YYYY [m.] MMMM D [d.], ddd, LT [val.]' - }, - calendar : { - sameDay : '[Å iandien] LT', - nextDay : '[Rytoj] LT', - nextWeek : 'dddd LT', - lastDay : '[Vakar] LT', - lastWeek : '[PraÄ—jusį] dddd LT', - sameElse : 'L' - }, - relativeTime : { - future : 'po %s', - past : 'prieÅ¡ %s', - s : translateSeconds, - m : translateSingular, - mm : translate, - h : translateSingular, - hh : translate, - d : translateSingular, - dd : translate, - M : translateSingular, - MM : translate, - y : translateSingular, - yy : translate - }, - ordinalParse: /\d{1,2}-oji/, - ordinal : function (number) { - return number + '-oji'; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/lv.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/lv.js deleted file mode 100644 index 47a0708..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/lv.js +++ /dev/null @@ -1,79 +0,0 @@ -// moment.js locale configuration -// locale : latvian (lv) -// author : Kristaps Karlsons : https://github.com/skakri - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var units = { - 'mm': 'minÅ«ti_minÅ«tes_minÅ«te_minÅ«tes', - 'hh': 'stundu_stundas_stunda_stundas', - 'dd': 'dienu_dienas_diena_dienas', - 'MM': 'mÄ“nesi_mÄ“neÅ¡us_mÄ“nesis_mÄ“neÅ¡i', - 'yy': 'gadu_gadus_gads_gadi' - }; - - function format(word, number, withoutSuffix) { - var forms = word.split('_'); - if (withoutSuffix) { - return number % 10 === 1 && number !== 11 ? forms[2] : forms[3]; - } else { - return number % 10 === 1 && number !== 11 ? forms[0] : forms[1]; - } - } - - function relativeTimeWithPlural(number, withoutSuffix, key) { - return number + ' ' + format(units[key], number, withoutSuffix); - } - - return moment.defineLocale('lv', { - months : 'janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris'.split('_'), - monthsShort : 'jan_feb_mar_apr_mai_jÅ«n_jÅ«l_aug_sep_okt_nov_dec'.split('_'), - weekdays : 'svÄ“tdiena_pirmdiena_otrdiena_treÅ¡diena_ceturtdiena_piektdiena_sestdiena'.split('_'), - weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'), - weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'YYYY. [gada] D. MMMM', - LLL : 'YYYY. [gada] D. MMMM, LT', - LLLL : 'YYYY. [gada] D. MMMM, dddd, LT' - }, - calendar : { - sameDay : '[Å odien pulksten] LT', - nextDay : '[RÄ«t pulksten] LT', - nextWeek : 'dddd [pulksten] LT', - lastDay : '[Vakar pulksten] LT', - lastWeek : '[PagÄjuÅ¡Ä] dddd [pulksten] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s vÄ“lÄk', - past : '%s agrÄk', - s : 'dažas sekundes', - m : 'minÅ«ti', - mm : relativeTimeWithPlural, - h : 'stundu', - hh : relativeTimeWithPlural, - d : 'dienu', - dd : relativeTimeWithPlural, - M : 'mÄ“nesi', - MM : relativeTimeWithPlural, - y : 'gadu', - yy : relativeTimeWithPlural - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/mk.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/mk.js deleted file mode 100644 index de36631..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/mk.js +++ /dev/null @@ -1,88 +0,0 @@ -// moment.js locale configuration -// locale : macedonian (mk) -// author : Borislav Mickov : https://github.com/B0k0 - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('mk', { - months : 'јануари_февруари_март_април_мај_јуни_јули_авгуÑÑ‚_Ñептември_октомври_ноември_декември'.split('_'), - monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_Ñеп_окт_ное_дек'.split('_'), - weekdays : 'недела_понеделник_вторник_Ñреда_четврток_петок_Ñабота'.split('_'), - weekdaysShort : 'нед_пон_вто_Ñре_чет_пет_Ñаб'.split('_'), - weekdaysMin : 'нe_пo_вт_ÑÑ€_че_пе_Ña'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'D.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay : '[Ð”ÐµÐ½ÐµÑ Ð²Ð¾] LT', - nextDay : '[Утре во] LT', - nextWeek : 'dddd [во] LT', - lastDay : '[Вчера во] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - case 6: - return '[Во изминатата] dddd [во] LT'; - case 1: - case 2: - case 4: - case 5: - return '[Во изминатиот] dddd [во] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'поÑле %s', - past : 'пред %s', - s : 'неколку Ñекунди', - m : 'минута', - mm : '%d минути', - h : 'чаÑ', - hh : '%d чаÑа', - d : 'ден', - dd : '%d дена', - M : 'меÑец', - MM : '%d меÑеци', - y : 'година', - yy : '%d години' - }, - ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, - ordinal : function (number) { - var lastDigit = number % 10, - last2Digits = number % 100; - if (number === 0) { - return number + '-ев'; - } else if (last2Digits === 0) { - return number + '-ен'; - } else if (last2Digits > 10 && last2Digits < 20) { - return number + '-ти'; - } else if (lastDigit === 1) { - return number + '-ви'; - } else if (lastDigit === 2) { - return number + '-ри'; - } else if (lastDigit === 7 || lastDigit === 8) { - return number + '-ми'; - } else { - return number + '-ти'; - } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ml.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ml.js deleted file mode 100644 index eb877bb..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ml.js +++ /dev/null @@ -1,69 +0,0 @@ -// moment.js locale configuration -// locale : malayalam (ml) -// author : Floyd Pink : https://github.com/floydpink - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('ml', { - months : 'ജനàµà´µà´°à´¿_ഫെബàµà´°àµà´µà´°à´¿_മാർചàµà´šàµ_à´à´ªàµà´°à´¿àµ½_മേയàµ_ജൂൺ_ജൂലൈ_à´“à´—à´¸àµà´±àµà´±àµ_സെപàµà´±àµà´±à´‚ബർ_à´’à´•àµà´Ÿàµ‹à´¬àµ¼_നവംബർ_ഡിസംബർ'.split('_'), - monthsShort : 'ജനàµ._ഫെബàµà´°àµ._മാർ._à´à´ªàµà´°à´¿._മേയàµ_ജൂൺ_ജൂലൈ._à´“à´—._സെപàµà´±àµà´±._à´’à´•àµà´Ÿàµ‹._നവം._ഡിസം.'.split('_'), - weekdays : 'ഞായറാഴàµà´š_തിങàµà´•à´³à´¾à´´àµà´š_ചൊവàµà´µà´¾à´´àµà´š_à´¬àµà´§à´¨à´¾à´´àµà´š_à´µàµà´¯à´¾à´´à´¾à´´àµà´š_വെളàµà´³à´¿à´¯à´¾à´´àµà´š_ശനിയാഴàµà´š'.split('_'), - weekdaysShort : 'ഞായർ_തിങàµà´•àµ¾_ചൊവàµà´µ_à´¬àµà´§àµ»_à´µàµà´¯à´¾à´´à´‚_വെളàµà´³à´¿_ശനി'.split('_'), - weekdaysMin : 'à´žà´¾_തി_ചൊ_à´¬àµ_à´µàµà´¯à´¾_വെ_à´¶'.split('_'), - longDateFormat : { - LT : 'A h:mm -à´¨àµ', - LTS : 'A h:mm:ss -à´¨àµ', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, LT', - LLLL : 'dddd, D MMMM YYYY, LT' - }, - calendar : { - sameDay : '[ഇനàµà´¨àµ] LT', - nextDay : '[നാളെ] LT', - nextWeek : 'dddd, LT', - lastDay : '[ഇനàµà´¨à´²àµ†] LT', - lastWeek : '[à´•à´´à´¿à´žàµà´ž] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s à´•à´´à´¿à´žàµà´žàµ', - past : '%s à´®àµàµ»à´ªàµ', - s : 'അൽപ നിമിഷങàµà´™àµ¾', - m : 'ഒരൠമിനിറàµà´±àµ', - mm : '%d മിനിറàµà´±àµ', - h : 'ഒരൠമണികàµà´•àµ‚ർ', - hh : '%d മണികàµà´•àµ‚ർ', - d : 'ഒരൠദിവസം', - dd : '%d ദിവസം', - M : 'ഒരൠമാസം', - MM : '%d മാസം', - y : 'ഒരൠവർഷം', - yy : '%d വർഷം' - }, - meridiemParse: /രാതàµà´°à´¿|രാവിലെ|ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿/i, - isPM : function (input) { - return /^(ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'രാതàµà´°à´¿'; - } else if (hour < 12) { - return 'രാവിലെ'; - } else if (hour < 17) { - return 'ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ'; - } else if (hour < 20) { - return 'വൈകàµà´¨àµà´¨àµ‡à´°à´‚'; - } else { - return 'രാതàµà´°à´¿'; - } - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/mr.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/mr.js deleted file mode 100644 index 93f0eea..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/mr.js +++ /dev/null @@ -1,120 +0,0 @@ -// moment.js locale configuration -// locale : Marathi (mr) -// author : Harshad Kale : https://github.com/kalehv - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var symbolMap = { - '1': '१', - '2': '२', - '3': '३', - '4': '४', - '5': '५', - '6': '६', - '7': '७', - '8': '८', - '9': '९', - '0': '०' - }, - numberMap = { - '१': '1', - '२': '2', - '३': '3', - '४': '4', - '५': '5', - '६': '6', - '७': '7', - '८': '8', - '९': '9', - '०': '0' - }; - - return moment.defineLocale('mr', { - months : 'जानेवारी_फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€_मारà¥à¤š_à¤à¤ªà¥à¤°à¤¿à¤²_मे_जून_जà¥à¤²à¥ˆ_ऑगसà¥à¤Ÿ_सपà¥à¤Ÿà¥‡à¤‚बर_ऑकà¥à¤Ÿà¥‹à¤¬à¤°_नोवà¥à¤¹à¥‡à¤‚बर_डिसेंबर'.split('_'), - monthsShort: 'जाने._फेबà¥à¤°à¥._मारà¥à¤š._à¤à¤ªà¥à¤°à¤¿._मे._जून._जà¥à¤²à¥ˆ._ऑग._सपà¥à¤Ÿà¥‡à¤‚._ऑकà¥à¤Ÿà¥‹._नोवà¥à¤¹à¥‡à¤‚._डिसें.'.split('_'), - weekdays : 'रविवार_सोमवार_मंगळवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split('_'), - weekdaysShort : 'रवि_सोम_मंगळ_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split('_'), - weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split('_'), - longDateFormat : { - LT : 'A h:mm वाजता', - LTS : 'A h:mm:ss वाजता', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, LT', - LLLL : 'dddd, D MMMM YYYY, LT' - }, - calendar : { - sameDay : '[आज] LT', - nextDay : '[उदà¥à¤¯à¤¾] LT', - nextWeek : 'dddd, LT', - lastDay : '[काल] LT', - lastWeek: '[मागील] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s नंतर', - past : '%s पूरà¥à¤µà¥€', - s : 'सेकंद', - m: 'à¤à¤• मिनिट', - mm: '%d मिनिटे', - h : 'à¤à¤• तास', - hh : '%d तास', - d : 'à¤à¤• दिवस', - dd : '%d दिवस', - M : 'à¤à¤• महिना', - MM : '%d महिने', - y : 'à¤à¤• वरà¥à¤·', - yy : '%d वरà¥à¤·à¥‡' - }, - preparse: function (string) { - return string.replace(/[१२३४५६७८९०]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - meridiemParse: /रातà¥à¤°à¥€|सकाळी|दà¥à¤ªà¤¾à¤°à¥€|सायंकाळी/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'रातà¥à¤°à¥€') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'सकाळी') { - return hour; - } else if (meridiem === 'दà¥à¤ªà¤¾à¤°à¥€') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'सायंकाळी') { - return hour + 12; - } - }, - meridiem: function (hour, minute, isLower) - { - if (hour < 4) { - return 'रातà¥à¤°à¥€'; - } else if (hour < 10) { - return 'सकाळी'; - } else if (hour < 17) { - return 'दà¥à¤ªà¤¾à¤°à¥€'; - } else if (hour < 20) { - return 'सायंकाळी'; - } else { - return 'रातà¥à¤°à¥€'; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ms-my.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ms-my.js deleted file mode 100644 index 56d5e91..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ms-my.js +++ /dev/null @@ -1,80 +0,0 @@ -// moment.js locale configuration -// locale : Bahasa Malaysia (ms-MY) -// author : Weldan Jamili : https://github.com/weldan - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('ms-my', { - months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), - monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), - weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), - weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), - weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), - longDateFormat : { - LT : 'HH.mm', - LTS : 'LT.ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY [pukul] LT', - LLLL : 'dddd, D MMMM YYYY [pukul] LT' - }, - meridiemParse: /pagi|tengahari|petang|malam/, - meridiemHour: function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'pagi') { - return hour; - } else if (meridiem === 'tengahari') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === 'petang' || meridiem === 'malam') { - return hour + 12; - } - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 11) { - return 'pagi'; - } else if (hours < 15) { - return 'tengahari'; - } else if (hours < 19) { - return 'petang'; - } else { - return 'malam'; - } - }, - calendar : { - sameDay : '[Hari ini pukul] LT', - nextDay : '[Esok pukul] LT', - nextWeek : 'dddd [pukul] LT', - lastDay : '[Kelmarin pukul] LT', - lastWeek : 'dddd [lepas pukul] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'dalam %s', - past : '%s yang lepas', - s : 'beberapa saat', - m : 'seminit', - mm : '%d minit', - h : 'sejam', - hh : '%d jam', - d : 'sehari', - dd : '%d hari', - M : 'sebulan', - MM : '%d bulan', - y : 'setahun', - yy : '%d tahun' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/my.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/my.js deleted file mode 100644 index 31f5c9e..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/my.js +++ /dev/null @@ -1,89 +0,0 @@ -// moment.js locale configuration -// locale : Burmese (my) -// author : Squar team, mysquar.com - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var symbolMap = { - '1': 'á', - '2': 'á‚', - '3': 'áƒ', - '4': 'á„', - '5': 'á…', - '6': 'á†', - '7': 'á‡', - '8': 'áˆ', - '9': 'á‰', - '0': 'á€' - }, numberMap = { - 'á': '1', - 'á‚': '2', - 'áƒ': '3', - 'á„': '4', - 'á…': '5', - 'á†': '6', - 'á‡': '7', - 'áˆ': '8', - 'á‰': '9', - 'á€': '0' - }; - return moment.defineLocale('my', { - months: 'ဇန်နá€á€«á€›á€®_ဖေဖော်á€á€«á€›á€®_မá€á€º_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုá€á€º_စက်á€á€„်ဘာ_အောက်á€á€­á€¯á€˜á€¬_နိုá€á€„်ဘာ_ဒီဇင်ဘာ'.split('_'), - monthsShort: 'ဇန်_ဖေ_မá€á€º_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'), - weekdays: 'á€á€”င်္ဂနွေ_á€á€”င်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပá€á€±á€¸_သောကြာ_စနေ'.split('_'), - weekdaysShort: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), - weekdaysMin: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), - longDateFormat: { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY LT', - LLLL: 'dddd D MMMM YYYY LT' - }, - calendar: { - sameDay: '[ယနေ.] LT [မှာ]', - nextDay: '[မနက်ဖြန်] LT [မှာ]', - nextWeek: 'dddd LT [မှာ]', - lastDay: '[မနေ.က] LT [မှာ]', - lastWeek: '[ပြီးá€á€²á€·á€žá€±á€¬] dddd LT [မှာ]', - sameElse: 'L' - }, - relativeTime: { - future: 'လာမည့် %s မှာ', - past: 'လွန်á€á€²á€·á€žá€±á€¬ %s က', - s: 'စက္ကန်.အနည်းငယ်', - m: 'á€á€…်မိနစ်', - mm: '%d မိနစ်', - h: 'á€á€…်နာရီ', - hh: '%d နာရီ', - d: 'á€á€…်ရက်', - dd: '%d ရက်', - M: 'á€á€…်လ', - MM: '%d လ', - y: 'á€á€…်နှစ်', - yy: '%d နှစ်' - }, - preparse: function (string) { - return string.replace(/[áá‚áƒá„á…á†á‡áˆá‰á€]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - week: { - dow: 1, // Monday is the first day of the week. - doy: 4 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/nb.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/nb.js deleted file mode 100644 index 4764b50..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/nb.js +++ /dev/null @@ -1,59 +0,0 @@ -// moment.js locale configuration -// locale : norwegian bokmÃ¥l (nb) -// authors : Espen Hovlandsdal : https://github.com/rexxars -// Sigurd Gartmann : https://github.com/sigurdga - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('nb', { - months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), - monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), - weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), - weekdaysShort : 'søn_man_tirs_ons_tors_fre_lør'.split('_'), - weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), - longDateFormat : { - LT : 'H.mm', - LTS : 'LT.ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY [kl.] LT', - LLLL : 'dddd D. MMMM YYYY [kl.] LT' - }, - calendar : { - sameDay: '[i dag kl.] LT', - nextDay: '[i morgen kl.] LT', - nextWeek: 'dddd [kl.] LT', - lastDay: '[i gÃ¥r kl.] LT', - lastWeek: '[forrige] dddd [kl.] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'om %s', - past : 'for %s siden', - s : 'noen sekunder', - m : 'ett minutt', - mm : '%d minutter', - h : 'en time', - hh : '%d timer', - d : 'en dag', - dd : '%d dager', - M : 'en mÃ¥ned', - MM : '%d mÃ¥neder', - y : 'ett Ã¥r', - yy : '%d Ã¥r' - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ne.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ne.js deleted file mode 100644 index eb25ebe..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ne.js +++ /dev/null @@ -1,121 +0,0 @@ -// moment.js locale configuration -// locale : nepali/nepalese -// author : suvash : https://github.com/suvash - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var symbolMap = { - '1': '१', - '2': '२', - '3': '३', - '4': '४', - '5': '५', - '6': '६', - '7': '७', - '8': '८', - '9': '९', - '0': '०' - }, - numberMap = { - '१': '1', - '२': '2', - '३': '3', - '४': '4', - '५': '5', - '६': '6', - '७': '7', - '८': '8', - '९': '9', - '०': '0' - }; - - return moment.defineLocale('ne', { - months : 'जनवरी_फेबà¥à¤°à¥à¤µà¤°à¥€_मारà¥à¤š_अपà¥à¤°à¤¿à¤²_मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ_अगषà¥à¤Ÿ_सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°_अकà¥à¤Ÿà¥‹à¤¬à¤°_नोभेमà¥à¤¬à¤°_डिसेमà¥à¤¬à¤°'.split('_'), - monthsShort : 'जन._फेबà¥à¤°à¥._मारà¥à¤š_अपà¥à¤°à¤¿._मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ._अग._सेपà¥à¤Ÿ._अकà¥à¤Ÿà¥‹._नोभे._डिसे.'.split('_'), - weekdays : 'आइतबार_सोमबार_मङà¥à¤—लबार_बà¥à¤§à¤¬à¤¾à¤°_बिहिबार_शà¥à¤•à¥à¤°à¤¬à¤¾à¤°_शनिबार'.split('_'), - weekdaysShort : 'आइत._सोम._मङà¥à¤—ल._बà¥à¤§._बिहि._शà¥à¤•à¥à¤°._शनि.'.split('_'), - weekdaysMin : 'आइ._सो._मङà¥_बà¥._बि._शà¥._श.'.split('_'), - longDateFormat : { - LT : 'Aको h:mm बजे', - LTS : 'Aको h:mm:ss बजे', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, LT', - LLLL : 'dddd, D MMMM YYYY, LT' - }, - preparse: function (string) { - return string.replace(/[१२३४५६७८९०]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - meridiemParse: /राती|बिहान|दिउà¤à¤¸à¥‹|बेलà¥à¤•à¤¾|साà¤à¤|राती/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'राती') { - return hour < 3 ? hour : hour + 12; - } else if (meridiem === 'बिहान') { - return hour; - } else if (meridiem === 'दिउà¤à¤¸à¥‹') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'बेलà¥à¤•à¤¾' || meridiem === 'साà¤à¤') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 3) { - return 'राती'; - } else if (hour < 10) { - return 'बिहान'; - } else if (hour < 15) { - return 'दिउà¤à¤¸à¥‹'; - } else if (hour < 18) { - return 'बेलà¥à¤•à¤¾'; - } else if (hour < 20) { - return 'साà¤à¤'; - } else { - return 'राती'; - } - }, - calendar : { - sameDay : '[आज] LT', - nextDay : '[भोली] LT', - nextWeek : '[आउà¤à¤¦à¥‹] dddd[,] LT', - lastDay : '[हिजो] LT', - lastWeek : '[गà¤à¤•à¥‹] dddd[,] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%sमा', - past : '%s अगाडी', - s : 'केही समय', - m : 'à¤à¤• मिनेट', - mm : '%d मिनेट', - h : 'à¤à¤• घणà¥à¤Ÿà¤¾', - hh : '%d घणà¥à¤Ÿà¤¾', - d : 'à¤à¤• दिन', - dd : '%d दिन', - M : 'à¤à¤• महिना', - MM : '%d महिना', - y : 'à¤à¤• बरà¥à¤·', - yy : '%d बरà¥à¤·' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/nl.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/nl.js deleted file mode 100644 index 9f4fdfe..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/nl.js +++ /dev/null @@ -1,69 +0,0 @@ -// moment.js locale configuration -// locale : dutch (nl) -// author : Joris Röling : https://github.com/jjupiter - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), - monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); - - return moment.defineLocale('nl', { - months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), - monthsShort : function (m, format) { - if (/-MMM-/.test(format)) { - return monthsShortWithoutDots[m.month()]; - } else { - return monthsShortWithDots[m.month()]; - } - }, - weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), - weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), - weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD-MM-YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay: '[vandaag om] LT', - nextDay: '[morgen om] LT', - nextWeek: 'dddd [om] LT', - lastDay: '[gisteren om] LT', - lastWeek: '[afgelopen] dddd [om] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'over %s', - past : '%s geleden', - s : 'een paar seconden', - m : 'één minuut', - mm : '%d minuten', - h : 'één uur', - hh : '%d uur', - d : 'één dag', - dd : '%d dagen', - M : 'één maand', - MM : '%d maanden', - y : 'één jaar', - yy : '%d jaar' - }, - ordinalParse: /\d{1,2}(ste|de)/, - ordinal : function (number) { - return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/nn.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/nn.js deleted file mode 100644 index d7a8238..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/nn.js +++ /dev/null @@ -1,58 +0,0 @@ -// moment.js locale configuration -// locale : norwegian nynorsk (nn) -// author : https://github.com/mechuwind - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('nn', { - months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), - monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), - weekdays : 'sundag_mÃ¥ndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'), - weekdaysShort : 'sun_mÃ¥n_tys_ons_tor_fre_lau'.split('_'), - weekdaysMin : 'su_mÃ¥_ty_on_to_fr_lø'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay: '[I dag klokka] LT', - nextDay: '[I morgon klokka] LT', - nextWeek: 'dddd [klokka] LT', - lastDay: '[I gÃ¥r klokka] LT', - lastWeek: '[FøregÃ¥ande] dddd [klokka] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'om %s', - past : 'for %s sidan', - s : 'nokre sekund', - m : 'eit minutt', - mm : '%d minutt', - h : 'ein time', - hh : '%d timar', - d : 'ein dag', - dd : '%d dagar', - M : 'ein mÃ¥nad', - MM : '%d mÃ¥nader', - y : 'eit Ã¥r', - yy : '%d Ã¥r' - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/pl.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/pl.js deleted file mode 100644 index 418ca81..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/pl.js +++ /dev/null @@ -1,100 +0,0 @@ -// moment.js locale configuration -// locale : polish (pl) -// author : Rafal Hirsz : https://github.com/evoL - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var monthsNominative = 'styczeÅ„_luty_marzec_kwiecieÅ„_maj_czerwiec_lipiec_sierpieÅ„_wrzesieÅ„_październik_listopad_grudzieÅ„'.split('_'), - monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrzeÅ›nia_października_listopada_grudnia'.split('_'); - - function plural(n) { - return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1); - } - - function translate(number, withoutSuffix, key) { - var result = number + ' '; - switch (key) { - case 'm': - return withoutSuffix ? 'minuta' : 'minutÄ™'; - case 'mm': - return result + (plural(number) ? 'minuty' : 'minut'); - case 'h': - return withoutSuffix ? 'godzina' : 'godzinÄ™'; - case 'hh': - return result + (plural(number) ? 'godziny' : 'godzin'); - case 'MM': - return result + (plural(number) ? 'miesiÄ…ce' : 'miesiÄ™cy'); - case 'yy': - return result + (plural(number) ? 'lata' : 'lat'); - } - } - - return moment.defineLocale('pl', { - months : function (momentToFormat, format) { - if (/D MMMM/.test(format)) { - return monthsSubjective[momentToFormat.month()]; - } else { - return monthsNominative[momentToFormat.month()]; - } - }, - monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'), - weekdays : 'niedziela_poniedziaÅ‚ek_wtorek_Å›roda_czwartek_piÄ…tek_sobota'.split('_'), - weekdaysShort : 'nie_pon_wt_Å›r_czw_pt_sb'.split('_'), - weekdaysMin : 'N_Pn_Wt_Åšr_Cz_Pt_So'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay: '[DziÅ› o] LT', - nextDay: '[Jutro o] LT', - nextWeek: '[W] dddd [o] LT', - lastDay: '[Wczoraj o] LT', - lastWeek: function () { - switch (this.day()) { - case 0: - return '[W zeszÅ‚Ä… niedzielÄ™ o] LT'; - case 3: - return '[W zeszÅ‚Ä… Å›rodÄ™ o] LT'; - case 6: - return '[W zeszÅ‚Ä… sobotÄ™ o] LT'; - default: - return '[W zeszÅ‚y] dddd [o] LT'; - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'za %s', - past : '%s temu', - s : 'kilka sekund', - m : translate, - mm : translate, - h : translate, - hh : translate, - d : '1 dzieÅ„', - dd : '%d dni', - M : 'miesiÄ…c', - MM : translate, - y : 'rok', - yy : translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/pt-br.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/pt-br.js deleted file mode 100644 index 813c2de..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/pt-br.js +++ /dev/null @@ -1,58 +0,0 @@ -// moment.js locale configuration -// locale : brazilian portuguese (pt-br) -// author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('pt-br', { - months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), - monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), - weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'), - weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'), - weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY [às] LT', - LLLL : 'dddd, D [de] MMMM [de] YYYY [às] LT' - }, - calendar : { - sameDay: '[Hoje às] LT', - nextDay: '[Amanhã às] LT', - nextWeek: 'dddd [às] LT', - lastDay: '[Ontem às] LT', - lastWeek: function () { - return (this.day() === 0 || this.day() === 6) ? - '[Último] dddd [às] LT' : // Saturday + Sunday - '[Última] dddd [às] LT'; // Monday - Friday - }, - sameElse: 'L' - }, - relativeTime : { - future : 'em %s', - past : '%s atrás', - s : 'segundos', - m : 'um minuto', - mm : '%d minutos', - h : 'uma hora', - hh : '%d horas', - d : 'um dia', - dd : '%d dias', - M : 'um mês', - MM : '%d meses', - y : 'um ano', - yy : '%d anos' - }, - ordinalParse: /\d{1,2}º/, - ordinal : '%dº' - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/pt.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/pt.js deleted file mode 100644 index 4afd564..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/pt.js +++ /dev/null @@ -1,62 +0,0 @@ -// moment.js locale configuration -// locale : portuguese (pt) -// author : Jefferson : https://github.com/jalex79 - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('pt', { - months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), - monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), - weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'), - weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'), - weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY LT', - LLLL : 'dddd, D [de] MMMM [de] YYYY LT' - }, - calendar : { - sameDay: '[Hoje às] LT', - nextDay: '[Amanhã às] LT', - nextWeek: 'dddd [às] LT', - lastDay: '[Ontem às] LT', - lastWeek: function () { - return (this.day() === 0 || this.day() === 6) ? - '[Último] dddd [às] LT' : // Saturday + Sunday - '[Última] dddd [às] LT'; // Monday - Friday - }, - sameElse: 'L' - }, - relativeTime : { - future : 'em %s', - past : 'há %s', - s : 'segundos', - m : 'um minuto', - mm : '%d minutos', - h : 'uma hora', - hh : '%d horas', - d : 'um dia', - dd : '%d dias', - M : 'um mês', - MM : '%d meses', - y : 'um ano', - yy : '%d anos' - }, - ordinalParse: /\d{1,2}º/, - ordinal : '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ro.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ro.js deleted file mode 100644 index fcc7d07..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ro.js +++ /dev/null @@ -1,73 +0,0 @@ -// moment.js locale configuration -// locale : romanian (ro) -// author : Vlad Gurdiga : https://github.com/gurdiga -// author : Valentin Agachi : https://github.com/avaly - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - function relativeTimeWithPlural(number, withoutSuffix, key) { - var format = { - 'mm': 'minute', - 'hh': 'ore', - 'dd': 'zile', - 'MM': 'luni', - 'yy': 'ani' - }, - separator = ' '; - if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) { - separator = ' de '; - } - - return number + separator + format[key]; - } - - return moment.defineLocale('ro', { - months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'), - monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'), - weekdays : 'duminică_luni_marÈ›i_miercuri_joi_vineri_sâmbătă'.split('_'), - weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'), - weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY H:mm', - LLLL : 'dddd, D MMMM YYYY H:mm' - }, - calendar : { - sameDay: '[azi la] LT', - nextDay: '[mâine la] LT', - nextWeek: 'dddd [la] LT', - lastDay: '[ieri la] LT', - lastWeek: '[fosta] dddd [la] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'peste %s', - past : '%s în urmă', - s : 'câteva secunde', - m : 'un minut', - mm : relativeTimeWithPlural, - h : 'o oră', - hh : relativeTimeWithPlural, - d : 'o zi', - dd : relativeTimeWithPlural, - M : 'o lună', - MM : relativeTimeWithPlural, - y : 'un an', - yy : relativeTimeWithPlural - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ru.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ru.js deleted file mode 100644 index 5adfa9a..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ru.js +++ /dev/null @@ -1,176 +0,0 @@ -// moment.js locale configuration -// locale : russian (ru) -// author : Viktorminator : https://github.com/Viktorminator -// Author : Menelion Elensúle : https://github.com/Oire - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - function plural(word, num) { - var forms = word.split('_'); - return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); - } - - function relativeTimeWithPlural(number, withoutSuffix, key) { - var format = { - 'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут', - 'hh': 'чаÑ_чаÑа_чаÑов', - 'dd': 'день_днÑ_дней', - 'MM': 'меÑÑц_меÑÑца_меÑÑцев', - 'yy': 'год_года_лет' - }; - if (key === 'm') { - return withoutSuffix ? 'минута' : 'минуту'; - } - else { - return number + ' ' + plural(format[key], +number); - } - } - - function monthsCaseReplace(m, format) { - var months = { - 'nominative': 'Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь'.split('_'), - 'accusative': 'ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ'.split('_') - }, - - nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? - 'accusative' : - 'nominative'; - - return months[nounCase][m.month()]; - } - - function monthsShortCaseReplace(m, format) { - var monthsShort = { - 'nominative': 'Ñнв_фев_март_апр_май_июнь_июль_авг_Ñен_окт_ноÑ_дек'.split('_'), - 'accusative': 'Ñнв_фев_мар_апр_маÑ_июнÑ_июлÑ_авг_Ñен_окт_ноÑ_дек'.split('_') - }, - - nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? - 'accusative' : - 'nominative'; - - return monthsShort[nounCase][m.month()]; - } - - function weekdaysCaseReplace(m, format) { - var weekdays = { - 'nominative': 'воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота'.split('_'), - 'accusative': 'воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу'.split('_') - }, - - nounCase = (/\[ ?[Вв] ?(?:прошлую|Ñледующую|Ñту)? ?\] ?dddd/).test(format) ? - 'accusative' : - 'nominative'; - - return weekdays[nounCase][m.day()]; - } - - return moment.defineLocale('ru', { - months : monthsCaseReplace, - monthsShort : monthsShortCaseReplace, - weekdays : weekdaysCaseReplace, - weekdaysShort : 'вÑ_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), - weekdaysMin : 'вÑ_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), - monthsParse : [/^Ñнв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[й|Ñ]/i, /^июн/i, /^июл/i, /^авг/i, /^Ñен/i, /^окт/i, /^ноÑ/i, /^дек/i], - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY г.', - LLL : 'D MMMM YYYY г., LT', - LLLL : 'dddd, D MMMM YYYY г., LT' - }, - calendar : { - sameDay: '[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT', - nextDay: '[Завтра в] LT', - lastDay: '[Вчера в] LT', - nextWeek: function () { - return this.day() === 2 ? '[Во] dddd [в] LT' : '[Ð’] dddd [в] LT'; - }, - lastWeek: function (now) { - if (now.week() !== this.week()) { - switch (this.day()) { - case 0: - return '[Ð’ прошлое] dddd [в] LT'; - case 1: - case 2: - case 4: - return '[Ð’ прошлый] dddd [в] LT'; - case 3: - case 5: - case 6: - return '[Ð’ прошлую] dddd [в] LT'; - } - } else { - if (this.day() === 2) { - return '[Во] dddd [в] LT'; - } else { - return '[Ð’] dddd [в] LT'; - } - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'через %s', - past : '%s назад', - s : 'неÑколько Ñекунд', - m : relativeTimeWithPlural, - mm : relativeTimeWithPlural, - h : 'чаÑ', - hh : relativeTimeWithPlural, - d : 'день', - dd : relativeTimeWithPlural, - M : 'меÑÑц', - MM : relativeTimeWithPlural, - y : 'год', - yy : relativeTimeWithPlural - }, - - meridiemParse: /ночи|утра|днÑ|вечера/i, - isPM : function (input) { - return /^(днÑ|вечера)$/.test(input); - }, - - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'ночи'; - } else if (hour < 12) { - return 'утра'; - } else if (hour < 17) { - return 'днÑ'; - } else { - return 'вечера'; - } - }, - - ordinalParse: /\d{1,2}-(й|го|Ñ)/, - ordinal: function (number, period) { - switch (period) { - case 'M': - case 'd': - case 'DDD': - return number + '-й'; - case 'D': - return number + '-го'; - case 'w': - case 'W': - return number + '-Ñ'; - default: - return number; - } - }, - - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sk.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sk.js deleted file mode 100644 index f9d74c5..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sk.js +++ /dev/null @@ -1,158 +0,0 @@ -// moment.js locale configuration -// locale : slovak (sk) -// author : Martin Minka : https://github.com/k2s -// based on work of petrbela : https://github.com/petrbela - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'), - monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_'); - - function plural(n) { - return (n > 1) && (n < 5); - } - - function translate(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - switch (key) { - case 's': // a few seconds / in a few seconds / a few seconds ago - return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami'; - case 'm': // a minute / in a minute / a minute ago - return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou'); - case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'minúty' : 'minút'); - } else { - return result + 'minútami'; - } - break; - case 'h': // an hour / in an hour / an hour ago - return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); - case 'hh': // 9 hours / in 9 hours / 9 hours ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'hodiny' : 'hodín'); - } else { - return result + 'hodinami'; - } - break; - case 'd': // a day / in a day / a day ago - return (withoutSuffix || isFuture) ? 'deň' : 'dňom'; - case 'dd': // 9 days / in 9 days / 9 days ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'dni' : 'dní'); - } else { - return result + 'dňami'; - } - break; - case 'M': // a month / in a month / a month ago - return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom'; - case 'MM': // 9 months / in 9 months / 9 months ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'mesiace' : 'mesiacov'); - } else { - return result + 'mesiacmi'; - } - break; - case 'y': // a year / in a year / a year ago - return (withoutSuffix || isFuture) ? 'rok' : 'rokom'; - case 'yy': // 9 years / in 9 years / 9 years ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'roky' : 'rokov'); - } else { - return result + 'rokmi'; - } - break; - } - } - - return moment.defineLocale('sk', { - months : months, - monthsShort : monthsShort, - monthsParse : (function (months, monthsShort) { - var i, _monthsParse = []; - for (i = 0; i < 12; i++) { - // use custom parser to solve problem with July (Äervenec) - _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); - } - return _monthsParse; - }(months, monthsShort)), - weekdays : 'nedeľa_pondelok_utorok_streda_Å¡tvrtok_piatok_sobota'.split('_'), - weekdaysShort : 'ne_po_ut_st_Å¡t_pi_so'.split('_'), - weekdaysMin : 'ne_po_ut_st_Å¡t_pi_so'.split('_'), - longDateFormat : { - LT: 'H:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY LT', - LLLL : 'dddd D. MMMM YYYY LT' - }, - calendar : { - sameDay: '[dnes o] LT', - nextDay: '[zajtra o] LT', - nextWeek: function () { - switch (this.day()) { - case 0: - return '[v nedeľu o] LT'; - case 1: - case 2: - return '[v] dddd [o] LT'; - case 3: - return '[v stredu o] LT'; - case 4: - return '[vo Å¡tvrtok o] LT'; - case 5: - return '[v piatok o] LT'; - case 6: - return '[v sobotu o] LT'; - } - }, - lastDay: '[vÄera o] LT', - lastWeek: function () { - switch (this.day()) { - case 0: - return '[minulú nedeľu o] LT'; - case 1: - case 2: - return '[minulý] dddd [o] LT'; - case 3: - return '[minulú stredu o] LT'; - case 4: - case 5: - return '[minulý] dddd [o] LT'; - case 6: - return '[minulú sobotu o] LT'; - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'za %s', - past : 'pred %s', - s : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sl.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sl.js deleted file mode 100644 index 232695f..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sl.js +++ /dev/null @@ -1,146 +0,0 @@ -// moment.js locale configuration -// locale : slovenian (sl) -// author : Robert SedovÅ¡ek : https://github.com/sedovsek - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - function translate(number, withoutSuffix, key) { - var result = number + ' '; - switch (key) { - case 'm': - return withoutSuffix ? 'ena minuta' : 'eno minuto'; - case 'mm': - if (number === 1) { - result += 'minuta'; - } else if (number === 2) { - result += 'minuti'; - } else if (number === 3 || number === 4) { - result += 'minute'; - } else { - result += 'minut'; - } - return result; - case 'h': - return withoutSuffix ? 'ena ura' : 'eno uro'; - case 'hh': - if (number === 1) { - result += 'ura'; - } else if (number === 2) { - result += 'uri'; - } else if (number === 3 || number === 4) { - result += 'ure'; - } else { - result += 'ur'; - } - return result; - case 'dd': - if (number === 1) { - result += 'dan'; - } else { - result += 'dni'; - } - return result; - case 'MM': - if (number === 1) { - result += 'mesec'; - } else if (number === 2) { - result += 'meseca'; - } else if (number === 3 || number === 4) { - result += 'mesece'; - } else { - result += 'mesecev'; - } - return result; - case 'yy': - if (number === 1) { - result += 'leto'; - } else if (number === 2) { - result += 'leti'; - } else if (number === 3 || number === 4) { - result += 'leta'; - } else { - result += 'let'; - } - return result; - } - } - - return moment.defineLocale('sl', { - months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'), - monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'), - weekdays : 'nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota'.split('_'), - weekdaysShort : 'ned._pon._tor._sre._Äet._pet._sob.'.split('_'), - weekdaysMin : 'ne_po_to_sr_Äe_pe_so'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'DD. MM. YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY LT', - LLLL : 'dddd, D. MMMM YYYY LT' - }, - calendar : { - sameDay : '[danes ob] LT', - nextDay : '[jutri ob] LT', - - nextWeek : function () { - switch (this.day()) { - case 0: - return '[v] [nedeljo] [ob] LT'; - case 3: - return '[v] [sredo] [ob] LT'; - case 6: - return '[v] [soboto] [ob] LT'; - case 1: - case 2: - case 4: - case 5: - return '[v] dddd [ob] LT'; - } - }, - lastDay : '[vÄeraj ob] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - case 6: - return '[prejÅ¡nja] dddd [ob] LT'; - case 1: - case 2: - case 4: - case 5: - return '[prejÅ¡nji] dddd [ob] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'Äez %s', - past : '%s nazaj', - s : 'nekaj sekund', - m : translate, - mm : translate, - h : translate, - hh : translate, - d : 'en dan', - dd : translate, - M : 'en mesec', - MM : translate, - y : 'eno leto', - yy : translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sq.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sq.js deleted file mode 100644 index 9a5bc09..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sq.js +++ /dev/null @@ -1,67 +0,0 @@ -// moment.js locale configuration -// locale : Albanian (sq) -// author : Flakërim Ismani : https://github.com/flakerimi -// author: Menelion Elensúle: https://github.com/Oire (tests) -// author : Oerd Cukalla : https://github.com/oerd (fixes) - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('sq', { - months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'), - monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'), - weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'), - weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'), - weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'), - meridiemParse: /PD|MD/, - isPM: function (input) { - return input.charAt(0) === 'M'; - }, - meridiem : function (hours, minutes, isLower) { - return hours < 12 ? 'PD' : 'MD'; - }, - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay : '[Sot në] LT', - nextDay : '[Nesër në] LT', - nextWeek : 'dddd [në] LT', - lastDay : '[Dje në] LT', - lastWeek : 'dddd [e kaluar në] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'në %s', - past : '%s më parë', - s : 'disa sekonda', - m : 'një minutë', - mm : '%d minuta', - h : 'një orë', - hh : '%d orë', - d : 'një ditë', - dd : '%d ditë', - M : 'një muaj', - MM : '%d muaj', - y : 'një vit', - yy : '%d vite' - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sr-cyrl.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sr-cyrl.js deleted file mode 100644 index 57619b6..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sr-cyrl.js +++ /dev/null @@ -1,107 +0,0 @@ -// moment.js locale configuration -// locale : Serbian-cyrillic (sr-cyrl) -// author : Milan JanaÄković : https://github.com/milan-j - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var translator = { - words: { //Different grammatical cases - m: ['један минут', 'једне минуте'], - mm: ['минут', 'минуте', 'минута'], - h: ['један Ñат', 'једног Ñата'], - hh: ['Ñат', 'Ñата', 'Ñати'], - dd: ['дан', 'дана', 'дана'], - MM: ['меÑец', 'меÑеца', 'меÑеци'], - yy: ['година', 'године', 'година'] - }, - correctGrammaticalCase: function (number, wordKey) { - return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); - }, - translate: function (number, withoutSuffix, key) { - var wordKey = translator.words[key]; - if (key.length === 1) { - return withoutSuffix ? wordKey[0] : wordKey[1]; - } else { - return number + ' ' + translator.correctGrammaticalCase(number, wordKey); - } - } - }; - - return moment.defineLocale('sr-cyrl', { - months: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'авгуÑÑ‚', 'Ñептембар', 'октобар', 'новембар', 'децембар'], - monthsShort: ['јан.', 'феб.', 'мар.', 'апр.', 'мај', 'јун', 'јул', 'авг.', 'Ñеп.', 'окт.', 'нов.', 'дец.'], - weekdays: ['недеља', 'понедељак', 'уторак', 'Ñреда', 'четвртак', 'петак', 'Ñубота'], - weekdaysShort: ['нед.', 'пон.', 'уто.', 'Ñре.', 'чет.', 'пет.', 'Ñуб.'], - weekdaysMin: ['не', 'по', 'ут', 'ÑÑ€', 'че', 'пе', 'Ñу'], - longDateFormat: { - LT: 'H:mm', - LTS : 'LT:ss', - L: 'DD. MM. YYYY', - LL: 'D. MMMM YYYY', - LLL: 'D. MMMM YYYY LT', - LLLL: 'dddd, D. MMMM YYYY LT' - }, - calendar: { - sameDay: '[Ð´Ð°Ð½Ð°Ñ Ñƒ] LT', - nextDay: '[Ñутра у] LT', - - nextWeek: function () { - switch (this.day()) { - case 0: - return '[у] [недељу] [у] LT'; - case 3: - return '[у] [Ñреду] [у] LT'; - case 6: - return '[у] [Ñуботу] [у] LT'; - case 1: - case 2: - case 4: - case 5: - return '[у] dddd [у] LT'; - } - }, - lastDay : '[јуче у] LT', - lastWeek : function () { - var lastWeekDays = [ - '[прошле] [недеље] [у] LT', - '[прошлог] [понедељка] [у] LT', - '[прошлог] [уторка] [у] LT', - '[прошле] [Ñреде] [у] LT', - '[прошлог] [четвртка] [у] LT', - '[прошлог] [петка] [у] LT', - '[прошле] [Ñуботе] [у] LT' - ]; - return lastWeekDays[this.day()]; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'за %s', - past : 'пре %s', - s : 'неколико Ñекунди', - m : translator.translate, - mm : translator.translate, - h : translator.translate, - hh : translator.translate, - d : 'дан', - dd : translator.translate, - M : 'меÑец', - MM : translator.translate, - y : 'годину', - yy : translator.translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sr.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sr.js deleted file mode 100644 index 6f14284..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sr.js +++ /dev/null @@ -1,107 +0,0 @@ -// moment.js locale configuration -// locale : Serbian-latin (sr) -// author : Milan JanaÄković : https://github.com/milan-j - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var translator = { - words: { //Different grammatical cases - m: ['jedan minut', 'jedne minute'], - mm: ['minut', 'minute', 'minuta'], - h: ['jedan sat', 'jednog sata'], - hh: ['sat', 'sata', 'sati'], - dd: ['dan', 'dana', 'dana'], - MM: ['mesec', 'meseca', 'meseci'], - yy: ['godina', 'godine', 'godina'] - }, - correctGrammaticalCase: function (number, wordKey) { - return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); - }, - translate: function (number, withoutSuffix, key) { - var wordKey = translator.words[key]; - if (key.length === 1) { - return withoutSuffix ? wordKey[0] : wordKey[1]; - } else { - return number + ' ' + translator.correctGrammaticalCase(number, wordKey); - } - } - }; - - return moment.defineLocale('sr', { - months: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'], - monthsShort: ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun', 'jul', 'avg.', 'sep.', 'okt.', 'nov.', 'dec.'], - weekdays: ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'Äetvrtak', 'petak', 'subota'], - weekdaysShort: ['ned.', 'pon.', 'uto.', 'sre.', 'Äet.', 'pet.', 'sub.'], - weekdaysMin: ['ne', 'po', 'ut', 'sr', 'Äe', 'pe', 'su'], - longDateFormat: { - LT: 'H:mm', - LTS : 'LT:ss', - L: 'DD. MM. YYYY', - LL: 'D. MMMM YYYY', - LLL: 'D. MMMM YYYY LT', - LLLL: 'dddd, D. MMMM YYYY LT' - }, - calendar: { - sameDay: '[danas u] LT', - nextDay: '[sutra u] LT', - - nextWeek: function () { - switch (this.day()) { - case 0: - return '[u] [nedelju] [u] LT'; - case 3: - return '[u] [sredu] [u] LT'; - case 6: - return '[u] [subotu] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[u] dddd [u] LT'; - } - }, - lastDay : '[juÄe u] LT', - lastWeek : function () { - var lastWeekDays = [ - '[proÅ¡le] [nedelje] [u] LT', - '[proÅ¡log] [ponedeljka] [u] LT', - '[proÅ¡log] [utorka] [u] LT', - '[proÅ¡le] [srede] [u] LT', - '[proÅ¡log] [Äetvrtka] [u] LT', - '[proÅ¡log] [petka] [u] LT', - '[proÅ¡le] [subote] [u] LT' - ]; - return lastWeekDays[this.day()]; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'za %s', - past : 'pre %s', - s : 'nekoliko sekundi', - m : translator.translate, - mm : translator.translate, - h : translator.translate, - hh : translator.translate, - d : 'dan', - dd : translator.translate, - M : 'mesec', - MM : translator.translate, - y : 'godinu', - yy : translator.translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sv.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sv.js deleted file mode 100644 index 6e14958..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/sv.js +++ /dev/null @@ -1,65 +0,0 @@ -// moment.js locale configuration -// locale : swedish (sv) -// author : Jens Alm : https://github.com/ulmus - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('sv', { - months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'), - monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), - weekdays : 'söndag_mÃ¥ndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'), - weekdaysShort : 'sön_mÃ¥n_tis_ons_tor_fre_lör'.split('_'), - weekdaysMin : 'sö_mÃ¥_ti_on_to_fr_lö'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'YYYY-MM-DD', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay: '[Idag] LT', - nextDay: '[Imorgon] LT', - lastDay: '[IgÃ¥r] LT', - nextWeek: 'dddd LT', - lastWeek: '[Förra] dddd[en] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'om %s', - past : 'för %s sedan', - s : 'nÃ¥gra sekunder', - m : 'en minut', - mm : '%d minuter', - h : 'en timme', - hh : '%d timmar', - d : 'en dag', - dd : '%d dagar', - M : 'en mÃ¥nad', - MM : '%d mÃ¥nader', - y : 'ett Ã¥r', - yy : '%d Ã¥r' - }, - ordinalParse: /\d{1,2}(e|a)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'e' : - (b === 1) ? 'a' : - (b === 2) ? 'a' : - (b === 3) ? 'e' : 'e'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ta.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ta.js deleted file mode 100644 index 8c86b4b..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/ta.js +++ /dev/null @@ -1,130 +0,0 @@ -// moment.js locale configuration -// locale : tamil (ta) -// author : Arjunkumar Krishnamoorthy : https://github.com/tk120404 - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - /*var symbolMap = { - '1': '௧', - '2': '௨', - '3': '௩', - '4': '௪', - '5': '௫', - '6': '௬', - '7': '௭', - '8': '௮', - '9': '௯', - '0': '௦' - }, - numberMap = { - '௧': '1', - '௨': '2', - '௩': '3', - '௪': '4', - '௫': '5', - '௬': '6', - '௭': '7', - '௮': '8', - '௯': '9', - '௦': '0' - }; */ - - return moment.defineLocale('ta', { - months : 'ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯'.split('_'), - monthsShort : 'ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯'.split('_'), - weekdays : 'ஞாயிறà¯à®±à¯à®•à¯à®•à®¿à®´à®®à¯ˆ_திஙà¯à®•à®Ÿà¯à®•à®¿à®´à®®à¯ˆ_செவà¯à®µà®¾à®¯à¯à®•à®¿à®´à®®à¯ˆ_பà¯à®¤à®©à¯à®•à®¿à®´à®®à¯ˆ_வியாழகà¯à®•à®¿à®´à®®à¯ˆ_வெளà¯à®³à®¿à®•à¯à®•à®¿à®´à®®à¯ˆ_சனிகà¯à®•à®¿à®´à®®à¯ˆ'.split('_'), - weekdaysShort : 'ஞாயிறà¯_திஙà¯à®•à®³à¯_செவà¯à®µà®¾à®¯à¯_பà¯à®¤à®©à¯_வியாழனà¯_வெளà¯à®³à®¿_சனி'.split('_'), - weekdaysMin : 'ஞா_தி_செ_பà¯_வி_வெ_ச'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, LT', - LLLL : 'dddd, D MMMM YYYY, LT' - }, - calendar : { - sameDay : '[இனà¯à®±à¯] LT', - nextDay : '[நாளை] LT', - nextWeek : 'dddd, LT', - lastDay : '[நேறà¯à®±à¯] LT', - lastWeek : '[கடநà¯à®¤ வாரமà¯] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s இலà¯', - past : '%s à®®à¯à®©à¯', - s : 'ஒர௠சில விநாடிகளà¯', - m : 'ஒர௠நிமிடமà¯', - mm : '%d நிமிடஙà¯à®•à®³à¯', - h : 'ஒர௠மணி நேரமà¯', - hh : '%d மணி நேரமà¯', - d : 'ஒர௠நாளà¯', - dd : '%d நாடà¯à®•à®³à¯', - M : 'ஒர௠மாதமà¯', - MM : '%d மாதஙà¯à®•à®³à¯', - y : 'ஒர௠வரà¯à®Ÿà®®à¯', - yy : '%d ஆணà¯à®Ÿà¯à®•à®³à¯' - }, -/* preparse: function (string) { - return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - },*/ - ordinalParse: /\d{1,2}வதà¯/, - ordinal : function (number) { - return number + 'வதà¯'; - }, - - - // refer http://ta.wikipedia.org/s/1er1 - meridiemParse: /யாமமà¯|வைகறை|காலை|நணà¯à®ªà®•à®²à¯|எறà¯à®ªà®¾à®Ÿà¯|மாலை/, - meridiem : function (hour, minute, isLower) { - if (hour < 2) { - return ' யாமமà¯'; - } else if (hour < 6) { - return ' வைகறை'; // வைகறை - } else if (hour < 10) { - return ' காலை'; // காலை - } else if (hour < 14) { - return ' நணà¯à®ªà®•à®²à¯'; // நணà¯à®ªà®•à®²à¯ - } else if (hour < 18) { - return ' எறà¯à®ªà®¾à®Ÿà¯'; // எறà¯à®ªà®¾à®Ÿà¯ - } else if (hour < 22) { - return ' மாலை'; // மாலை - } else { - return ' யாமமà¯'; - } - }, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'யாமமà¯') { - return hour < 2 ? hour : hour + 12; - } else if (meridiem === 'வைகறை' || meridiem === 'காலை') { - return hour; - } else if (meridiem === 'நணà¯à®ªà®•à®²à¯') { - return hour >= 10 ? hour : hour + 12; - } else { - return hour + 12; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/th.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/th.js deleted file mode 100644 index ec9b840..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/th.js +++ /dev/null @@ -1,63 +0,0 @@ -// moment.js locale configuration -// locale : thai (th) -// author : Kridsada Thanabulpong : https://github.com/sirn - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('th', { - months : 'มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม'.split('_'), - monthsShort : 'มà¸à¸£à¸²_à¸à¸¸à¸¡à¸ à¸²_มีนา_เมษา_พฤษภา_มิถุนา_à¸à¸£à¸à¸Žà¸²_สิงหา_à¸à¸±à¸™à¸¢à¸²_ตุลา_พฤศจิà¸à¸²_ธันวา'.split('_'), - weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์'.split('_'), - weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์'.split('_'), // yes, three characters difference - weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'), - longDateFormat : { - LT : 'H นาฬิà¸à¸² m นาที', - LTS : 'LT s วินาที', - L : 'YYYY/MM/DD', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY เวลา LT', - LLLL : 'วันddddที่ D MMMM YYYY เวลา LT' - }, - meridiemParse: /à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง|หลังเที่ยง/, - isPM: function (input) { - return input === 'หลังเที่ยง'; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง'; - } else { - return 'หลังเที่ยง'; - } - }, - calendar : { - sameDay : '[วันนี้ เวลา] LT', - nextDay : '[พรุ่งนี้ เวลา] LT', - nextWeek : 'dddd[หน้า เวลา] LT', - lastDay : '[เมื่อวานนี้ เวลา] LT', - lastWeek : '[วัน]dddd[ที่à¹à¸¥à¹‰à¸§ เวลา] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'อีภ%s', - past : '%sที่à¹à¸¥à¹‰à¸§', - s : 'ไม่à¸à¸µà¹ˆà¸§à¸´à¸™à¸²à¸—ี', - m : '1 นาที', - mm : '%d นาที', - h : '1 ชั่วโมง', - hh : '%d ชั่วโมง', - d : '1 วัน', - dd : '%d วัน', - M : '1 เดือน', - MM : '%d เดือน', - y : '1 ปี', - yy : '%d ปี' - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/tl-ph.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/tl-ph.js deleted file mode 100644 index 40dbb07..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/tl-ph.js +++ /dev/null @@ -1,60 +0,0 @@ -// moment.js locale configuration -// locale : Tagalog/Filipino (tl-ph) -// author : Dan Hagman - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('tl-ph', { - months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'), - monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'), - weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'), - weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'), - weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'MM/D/YYYY', - LL : 'MMMM D, YYYY', - LLL : 'MMMM D, YYYY LT', - LLLL : 'dddd, MMMM DD, YYYY LT' - }, - calendar : { - sameDay: '[Ngayon sa] LT', - nextDay: '[Bukas sa] LT', - nextWeek: 'dddd [sa] LT', - lastDay: '[Kahapon sa] LT', - lastWeek: 'dddd [huling linggo] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'sa loob ng %s', - past : '%s ang nakalipas', - s : 'ilang segundo', - m : 'isang minuto', - mm : '%d minuto', - h : 'isang oras', - hh : '%d oras', - d : 'isang araw', - dd : '%d araw', - M : 'isang buwan', - MM : '%d buwan', - y : 'isang taon', - yy : '%d taon' - }, - ordinalParse: /\d{1,2}/, - ordinal : function (number) { - return number; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/tr.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/tr.js deleted file mode 100644 index cd0a746..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/tr.js +++ /dev/null @@ -1,94 +0,0 @@ -// moment.js locale configuration -// locale : turkish (tr) -// authors : Erhan Gundogan : https://github.com/erhangundogan, -// Burak YiÄŸit Kaya: https://github.com/BYK - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var suffixes = { - 1: '\'inci', - 5: '\'inci', - 8: '\'inci', - 70: '\'inci', - 80: '\'inci', - - 2: '\'nci', - 7: '\'nci', - 20: '\'nci', - 50: '\'nci', - - 3: '\'üncü', - 4: '\'üncü', - 100: '\'üncü', - - 6: '\'ncı', - - 9: '\'uncu', - 10: '\'uncu', - 30: '\'uncu', - - 60: '\'ıncı', - 90: '\'ıncı' - }; - - return moment.defineLocale('tr', { - months : 'Ocak_Åžubat_Mart_Nisan_Mayıs_Haziran_Temmuz_AÄŸustos_Eylül_Ekim_Kasım_Aralık'.split('_'), - monthsShort : 'Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara'.split('_'), - weekdays : 'Pazar_Pazartesi_Salı_ÇarÅŸamba_PerÅŸembe_Cuma_Cumartesi'.split('_'), - weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'), - weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay : '[bugün saat] LT', - nextDay : '[yarın saat] LT', - nextWeek : '[haftaya] dddd [saat] LT', - lastDay : '[dün] LT', - lastWeek : '[geçen hafta] dddd [saat] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s sonra', - past : '%s önce', - s : 'birkaç saniye', - m : 'bir dakika', - mm : '%d dakika', - h : 'bir saat', - hh : '%d saat', - d : 'bir gün', - dd : '%d gün', - M : 'bir ay', - MM : '%d ay', - y : 'bir yıl', - yy : '%d yıl' - }, - ordinalParse: /\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/, - ordinal : function (number) { - if (number === 0) { // special case for zero - return number + '\'ıncı'; - } - var a = number % 10, - b = number % 100 - a, - c = number >= 100 ? 100 : null; - - return number + (suffixes[a] || suffixes[b] || suffixes[c]); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/tzm-latn.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/tzm-latn.js deleted file mode 100644 index 34592b4..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/tzm-latn.js +++ /dev/null @@ -1,56 +0,0 @@ -// moment.js locale configuration -// locale : Morocco Central Atlas TamaziÉ£t in Latin (tzm-latn) -// author : Abdel Said : https://github.com/abdelsaid - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('tzm-latn', { - months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), - monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), - weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), - weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), - weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay: '[asdkh g] LT', - nextDay: '[aska g] LT', - nextWeek: 'dddd [g] LT', - lastDay: '[assant g] LT', - lastWeek: 'dddd [g] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'dadkh s yan %s', - past : 'yan %s', - s : 'imik', - m : 'minuá¸', - mm : '%d minuá¸', - h : 'saÉ›a', - hh : '%d tassaÉ›in', - d : 'ass', - dd : '%d ossan', - M : 'ayowr', - MM : '%d iyyirn', - y : 'asgas', - yy : '%d isgasn' - }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/tzm.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/tzm.js deleted file mode 100644 index 9591521..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/tzm.js +++ /dev/null @@ -1,56 +0,0 @@ -// moment.js locale configuration -// locale : Morocco Central Atlas TamaziÉ£t (tzm) -// author : Abdel Said : https://github.com/abdelsaid - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('tzm', { - months : 'ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”'.split('_'), - monthsShort : 'ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”'.split('_'), - weekdays : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), - weekdaysShort : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), - weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS: 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay: '[ⴰⵙⴷⵅ â´´] LT', - nextDay: '[ⴰⵙⴽⴰ â´´] LT', - nextWeek: 'dddd [â´´] LT', - lastDay: '[ⴰⵚⴰâµâµœ â´´] LT', - lastWeek: 'dddd [â´´] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'â´·â´°â´·âµ… âµ™ ⵢⴰⵠ%s', - past : 'ⵢⴰⵠ%s', - s : 'ⵉⵎⵉⴽ', - m : 'ⵎⵉâµâµ“â´º', - mm : '%d ⵎⵉâµâµ“â´º', - h : 'ⵙⴰⵄⴰ', - hh : '%d ⵜⴰⵙⵙⴰⵄⵉâµ', - d : 'ⴰⵙⵙ', - dd : '%d oⵙⵙⴰâµ', - M : 'â´°âµ¢oⵓⵔ', - MM : '%d ⵉⵢⵢⵉⵔâµ', - y : 'ⴰⵙⴳⴰⵙ', - yy : '%d ⵉⵙⴳⴰⵙâµ' - }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/uk.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/uk.js deleted file mode 100644 index 84e11ce..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/uk.js +++ /dev/null @@ -1,163 +0,0 @@ -// moment.js locale configuration -// locale : ukrainian (uk) -// author : zemlanin : https://github.com/zemlanin -// Author : Menelion Elensúle : https://github.com/Oire - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - function plural(word, num) { - var forms = word.split('_'); - return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); - } - - function relativeTimeWithPlural(number, withoutSuffix, key) { - var format = { - 'mm': 'хвилина_хвилини_хвилин', - 'hh': 'година_години_годин', - 'dd': 'день_дні_днів', - 'MM': 'міÑÑць_міÑÑці_міÑÑців', - 'yy': 'рік_роки_років' - }; - if (key === 'm') { - return withoutSuffix ? 'хвилина' : 'хвилину'; - } - else if (key === 'h') { - return withoutSuffix ? 'година' : 'годину'; - } - else { - return number + ' ' + plural(format[key], +number); - } - } - - function monthsCaseReplace(m, format) { - var months = { - 'nominative': 'Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень'.split('_'), - 'accusative': 'ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ'.split('_') - }, - - nounCase = (/D[oD]? *MMMM?/).test(format) ? - 'accusative' : - 'nominative'; - - return months[nounCase][m.month()]; - } - - function weekdaysCaseReplace(m, format) { - var weekdays = { - 'nominative': 'неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота'.split('_'), - 'accusative': 'неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу'.split('_'), - 'genitive': 'неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи'.split('_') - }, - - nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ? - 'accusative' : - ((/\[?(?:минулої|наÑтупної)? ?\] ?dddd/).test(format) ? - 'genitive' : - 'nominative'); - - return weekdays[nounCase][m.day()]; - } - - function processHoursFunction(str) { - return function () { - return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT'; - }; - } - - return moment.defineLocale('uk', { - months : monthsCaseReplace, - monthsShort : 'Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд'.split('_'), - weekdays : weekdaysCaseReplace, - weekdaysShort : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), - weekdaysMin : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY Ñ€.', - LLL : 'D MMMM YYYY Ñ€., LT', - LLLL : 'dddd, D MMMM YYYY Ñ€., LT' - }, - calendar : { - sameDay: processHoursFunction('[Сьогодні '), - nextDay: processHoursFunction('[Завтра '), - lastDay: processHoursFunction('[Вчора '), - nextWeek: processHoursFunction('[У] dddd ['), - lastWeek: function () { - switch (this.day()) { - case 0: - case 3: - case 5: - case 6: - return processHoursFunction('[Минулої] dddd [').call(this); - case 1: - case 2: - case 4: - return processHoursFunction('[Минулого] dddd [').call(this); - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'за %s', - past : '%s тому', - s : 'декілька Ñекунд', - m : relativeTimeWithPlural, - mm : relativeTimeWithPlural, - h : 'годину', - hh : relativeTimeWithPlural, - d : 'день', - dd : relativeTimeWithPlural, - M : 'міÑÑць', - MM : relativeTimeWithPlural, - y : 'рік', - yy : relativeTimeWithPlural - }, - - // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason - - meridiemParse: /ночі|ранку|днÑ|вечора/, - isPM: function (input) { - return /^(днÑ|вечора)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'ночі'; - } else if (hour < 12) { - return 'ранку'; - } else if (hour < 17) { - return 'днÑ'; - } else { - return 'вечора'; - } - }, - - ordinalParse: /\d{1,2}-(й|го)/, - ordinal: function (number, period) { - switch (period) { - case 'M': - case 'd': - case 'DDD': - case 'w': - case 'W': - return number + '-й'; - case 'D': - return number + '-го'; - default: - return number; - } - }, - - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/uz.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/uz.js deleted file mode 100644 index 139e4de..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/uz.js +++ /dev/null @@ -1,56 +0,0 @@ -// moment.js locale configuration -// locale : uzbek (uz) -// author : Sardor Muminov : https://github.com/muminoff - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('uz', { - months : 'Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь'.split('_'), - monthsShort : 'Ñнв_фев_мар_апр_май_июн_июл_авг_Ñен_окт_ноÑ_дек'.split('_'), - weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'), - weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'), - weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'D MMMM YYYY, dddd LT' - }, - calendar : { - sameDay : '[Бугун Ñоат] LT [да]', - nextDay : '[Эртага] LT [да]', - nextWeek : 'dddd [куни Ñоат] LT [да]', - lastDay : '[Кеча Ñоат] LT [да]', - lastWeek : '[Утган] dddd [куни Ñоат] LT [да]', - sameElse : 'L' - }, - relativeTime : { - future : 'Якин %s ичида', - past : 'Бир неча %s олдин', - s : 'фурÑат', - m : 'бир дакика', - mm : '%d дакика', - h : 'бир Ñоат', - hh : '%d Ñоат', - d : 'бир кун', - dd : '%d кун', - M : 'бир ой', - MM : '%d ой', - y : 'бир йил', - yy : '%d йил' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/vi.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/vi.js deleted file mode 100644 index 15ec7dd..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/vi.js +++ /dev/null @@ -1,64 +0,0 @@ -// moment.js locale configuration -// locale : vietnamese (vi) -// author : Bang Nguyen : https://github.com/bangnk - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('vi', { - months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'), - monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'), - weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tÆ°_thứ năm_thứ sáu_thứ bảy'.split('_'), - weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), - weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM [năm] YYYY', - LLL : 'D MMMM [năm] YYYY LT', - LLLL : 'dddd, D MMMM [năm] YYYY LT', - l : 'DD/M/YYYY', - ll : 'D MMM YYYY', - lll : 'D MMM YYYY LT', - llll : 'ddd, D MMM YYYY LT' - }, - calendar : { - sameDay: '[Hôm nay lúc] LT', - nextDay: '[Ngày mai lúc] LT', - nextWeek: 'dddd [tuần tá»›i lúc] LT', - lastDay: '[Hôm qua lúc] LT', - lastWeek: 'dddd [tuần rồi lúc] LT', - sameElse: 'L' - }, - relativeTime : { - future : '%s tá»›i', - past : '%s trÆ°á»›c', - s : 'vài giây', - m : 'má»™t phút', - mm : '%d phút', - h : 'má»™t giá»', - hh : '%d giá»', - d : 'má»™t ngày', - dd : '%d ngày', - M : 'má»™t tháng', - MM : '%d tháng', - y : 'má»™t năm', - yy : '%d năm' - }, - ordinalParse: /\d{1,2}/, - ordinal : function (number) { - return number; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/zh-cn.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/zh-cn.js deleted file mode 100644 index da83416..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/zh-cn.js +++ /dev/null @@ -1,125 +0,0 @@ -// moment.js locale configuration -// locale : chinese (zh-cn) -// author : suupic : https://github.com/suupic -// author : Zeno Zeng : https://github.com/zenozeng - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('zh-cn', { - months : '一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月'.split('_'), - monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), - weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), - weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'), - weekdaysMin : 'æ—¥_一_二_三_å››_五_å…­'.split('_'), - longDateFormat : { - LT : 'Ah点mm', - LTS : 'Ah点m分s秒', - L : 'YYYY-MM-DD', - LL : 'YYYYå¹´MMMDæ—¥', - LLL : 'YYYYå¹´MMMDæ—¥LT', - LLLL : 'YYYYå¹´MMMDæ—¥ddddLT', - l : 'YYYY-MM-DD', - ll : 'YYYYå¹´MMMDæ—¥', - lll : 'YYYYå¹´MMMDæ—¥LT', - llll : 'YYYYå¹´MMMDæ—¥ddddLT' - }, - meridiemParse: /凌晨|早上|上åˆ|中åˆ|下åˆ|晚上/, - meridiemHour: function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === '凌晨' || meridiem === '早上' || - meridiem === '上åˆ') { - return hour; - } else if (meridiem === '下åˆ' || meridiem === '晚上') { - return hour + 12; - } else { - // '中åˆ' - return hour >= 11 ? hour : hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - var hm = hour * 100 + minute; - if (hm < 600) { - return '凌晨'; - } else if (hm < 900) { - return '早上'; - } else if (hm < 1130) { - return '上åˆ'; - } else if (hm < 1230) { - return '中åˆ'; - } else if (hm < 1800) { - return '下åˆ'; - } else { - return '晚上'; - } - }, - calendar : { - sameDay : function () { - return this.minutes() === 0 ? '[今天]Ah[点整]' : '[今天]LT'; - }, - nextDay : function () { - return this.minutes() === 0 ? '[明天]Ah[点整]' : '[明天]LT'; - }, - lastDay : function () { - return this.minutes() === 0 ? '[昨天]Ah[点整]' : '[昨天]LT'; - }, - nextWeek : function () { - var startOfWeek, prefix; - startOfWeek = moment().startOf('week'); - prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]'; - return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; - }, - lastWeek : function () { - var startOfWeek, prefix; - startOfWeek = moment().startOf('week'); - prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]'; - return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; - }, - sameElse : 'LL' - }, - ordinalParse: /\d{1,2}(æ—¥|月|周)/, - ordinal : function (number, period) { - switch (period) { - case 'd': - case 'D': - case 'DDD': - return number + 'æ—¥'; - case 'M': - return number + '月'; - case 'w': - case 'W': - return number + '周'; - default: - return number; - } - }, - relativeTime : { - future : '%s内', - past : '%så‰', - s : '几秒', - m : '1分钟', - mm : '%d分钟', - h : '1å°æ—¶', - hh : '%då°æ—¶', - d : '1天', - dd : '%d天', - M : '1个月', - MM : '%d个月', - y : '1å¹´', - yy : '%då¹´' - }, - week : { - // GB/T 7408-1994《数æ®å…ƒå’Œäº¤æ¢æ ¼å¼Â·ä¿¡æ¯äº¤æ¢Â·æ—¥æœŸå’Œæ—¶é—´è¡¨ç¤ºæ³•ã€‹ä¸ŽISO 8601:1988等效 - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/zh-tw.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/zh-tw.js deleted file mode 100644 index 75c974d..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/locale/zh-tw.js +++ /dev/null @@ -1,99 +0,0 @@ -// moment.js locale configuration -// locale : traditional chinese (zh-tw) -// author : Ben : https://github.com/ben-lin - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('zh-tw', { - months : '一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月'.split('_'), - monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), - weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), - weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), - weekdaysMin : 'æ—¥_一_二_三_å››_五_å…­'.split('_'), - longDateFormat : { - LT : 'Ah點mm', - LTS : 'Ah點m分s秒', - L : 'YYYYå¹´MMMDæ—¥', - LL : 'YYYYå¹´MMMDæ—¥', - LLL : 'YYYYå¹´MMMDæ—¥LT', - LLLL : 'YYYYå¹´MMMDæ—¥ddddLT', - l : 'YYYYå¹´MMMDæ—¥', - ll : 'YYYYå¹´MMMDæ—¥', - lll : 'YYYYå¹´MMMDæ—¥LT', - llll : 'YYYYå¹´MMMDæ—¥ddddLT' - }, - meridiemParse: /早上|上åˆ|中åˆ|下åˆ|晚上/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === '早上' || meridiem === '上åˆ') { - return hour; - } else if (meridiem === '中åˆ') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === '下åˆ' || meridiem === '晚上') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - var hm = hour * 100 + minute; - if (hm < 900) { - return '早上'; - } else if (hm < 1130) { - return '上åˆ'; - } else if (hm < 1230) { - return '中åˆ'; - } else if (hm < 1800) { - return '下åˆ'; - } else { - return '晚上'; - } - }, - calendar : { - sameDay : '[今天]LT', - nextDay : '[明天]LT', - nextWeek : '[下]ddddLT', - lastDay : '[昨天]LT', - lastWeek : '[上]ddddLT', - sameElse : 'L' - }, - ordinalParse: /\d{1,2}(æ—¥|月|週)/, - ordinal : function (number, period) { - switch (period) { - case 'd' : - case 'D' : - case 'DDD' : - return number + 'æ—¥'; - case 'M' : - return number + '月'; - case 'w' : - case 'W' : - return number + '週'; - default : - return number; - } - }, - relativeTime : { - future : '%så…§', - past : '%så‰', - s : '幾秒', - m : '一分é˜', - mm : '%d分é˜', - h : '一å°æ™‚', - hh : '%då°æ™‚', - d : '一天', - dd : '%d天', - M : '一個月', - MM : '%d個月', - y : '一年', - yy : '%då¹´' - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/locales.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/locales.js deleted file mode 100644 index e93562b..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/locales.js +++ /dev/null @@ -1,7306 +0,0 @@ -// moment.js locale configuration -// locale : afrikaans (af) -// author : Werner Mollentze : https://github.com/wernerm - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('af', { - months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'), - weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'), - weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'), - weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'), - meridiemParse: /vm|nm/i, - isPM : function (input) { - return /^nm$/i.test(input); - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 12) { - return isLower ? 'vm' : 'VM'; - } else { - return isLower ? 'nm' : 'NM'; - } - }, - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay : '[Vandag om] LT', - nextDay : '[Môre om] LT', - nextWeek : 'dddd [om] LT', - lastDay : '[Gister om] LT', - lastWeek : '[Laas] dddd [om] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'oor %s', - past : '%s gelede', - s : '\'n paar sekondes', - m : '\'n minuut', - mm : '%d minute', - h : '\'n uur', - hh : '%d ure', - d : '\'n dag', - dd : '%d dae', - M : '\'n maand', - MM : '%d maande', - y : '\'n jaar', - yy : '%d jaar' - }, - ordinalParse: /\d{1,2}(ste|de)/, - ordinal : function (number) { - return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter - }, - week : { - dow : 1, // Maandag is die eerste dag van die week. - doy : 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar. - } - }); -})); - -// moment.js locale configuration -// locale : Moroccan Arabic (ar-ma) -// author : ElFadili Yassine : https://github.com/ElFadiliY -// author : Abdel Said : https://github.com/abdelsaid - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('ar-ma', { - months : 'يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), - monthsShort : 'يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), - weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay: '[اليوم على الساعة] LT', - nextDay: '[غدا على الساعة] LT', - nextWeek: 'dddd [على الساعة] LT', - lastDay: '[أمس على الساعة] LT', - lastWeek: 'dddd [على الساعة] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'ÙÙŠ %s', - past : 'منذ %s', - s : 'ثوان', - m : 'دقيقة', - mm : '%d دقائق', - h : 'ساعة', - hh : '%d ساعات', - d : 'يوم', - dd : '%d أيام', - M : 'شهر', - MM : '%d أشهر', - y : 'سنة', - yy : '%d سنوات' - }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : Arabic Saudi Arabia (ar-sa) -// author : Suhail Alkowaileet : https://github.com/xsoh - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var symbolMap = { - '1': 'Ù¡', - '2': 'Ù¢', - '3': 'Ù£', - '4': 'Ù¤', - '5': 'Ù¥', - '6': 'Ù¦', - '7': 'Ù§', - '8': 'Ù¨', - '9': 'Ù©', - '0': 'Ù ' - }, numberMap = { - 'Ù¡': '1', - 'Ù¢': '2', - 'Ù£': '3', - 'Ù¤': '4', - 'Ù¥': '5', - 'Ù¦': '6', - 'Ù§': '7', - 'Ù¨': '8', - 'Ù©': '9', - 'Ù ': '0' - }; - - return moment.defineLocale('ar-sa', { - months : 'يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), - monthsShort : 'يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), - weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - meridiemParse: /ص|Ù…/, - isPM : function (input) { - return 'Ù…' === input; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'ص'; - } else { - return 'Ù…'; - } - }, - calendar : { - sameDay: '[اليوم على الساعة] LT', - nextDay: '[غدا على الساعة] LT', - nextWeek: 'dddd [على الساعة] LT', - lastDay: '[أمس على الساعة] LT', - lastWeek: 'dddd [على الساعة] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'ÙÙŠ %s', - past : 'منذ %s', - s : 'ثوان', - m : 'دقيقة', - mm : '%d دقائق', - h : 'ساعة', - hh : '%d ساعات', - d : 'يوم', - dd : '%d أيام', - M : 'شهر', - MM : '%d أشهر', - y : 'سنة', - yy : '%d سنوات' - }, - preparse: function (string) { - return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { - return numberMap[match]; - }).replace(/ØŒ/g, ','); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }).replace(/,/g, 'ØŒ'); - }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : Tunisian Arabic (ar-tn) - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('ar-tn', { - months: 'جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), - monthsShort: 'جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), - weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin: 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), - longDateFormat: { - LT: 'HH:mm', - LTS: 'LT:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY LT', - LLLL: 'dddd D MMMM YYYY LT' - }, - calendar: { - sameDay: '[اليوم على الساعة] LT', - nextDay: '[غدا على الساعة] LT', - nextWeek: 'dddd [على الساعة] LT', - lastDay: '[أمس على الساعة] LT', - lastWeek: 'dddd [على الساعة] LT', - sameElse: 'L' - }, - relativeTime: { - future: 'ÙÙŠ %s', - past: 'منذ %s', - s: 'ثوان', - m: 'دقيقة', - mm: '%d دقائق', - h: 'ساعة', - hh: '%d ساعات', - d: 'يوم', - dd: '%d أيام', - M: 'شهر', - MM: '%d أشهر', - y: 'سنة', - yy: '%d سنوات' - }, - week: { - dow: 1, // Monday is the first day of the week. - doy: 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// Locale: Arabic (ar) -// Author: Abdel Said: https://github.com/abdelsaid -// Changes in months, weekdays: Ahmed Elkhatib -// Native plural forms: forabi https://github.com/forabi - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var symbolMap = { - '1': 'Ù¡', - '2': 'Ù¢', - '3': 'Ù£', - '4': 'Ù¤', - '5': 'Ù¥', - '6': 'Ù¦', - '7': 'Ù§', - '8': 'Ù¨', - '9': 'Ù©', - '0': 'Ù ' - }, numberMap = { - 'Ù¡': '1', - 'Ù¢': '2', - 'Ù£': '3', - 'Ù¤': '4', - 'Ù¥': '5', - 'Ù¦': '6', - 'Ù§': '7', - 'Ù¨': '8', - 'Ù©': '9', - 'Ù ': '0' - }, pluralForm = function (n) { - return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5; - }, plurals = { - s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'], - m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'], - h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'], - d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'], - M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'], - y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام'] - }, pluralize = function (u) { - return function (number, withoutSuffix, string, isFuture) { - var f = pluralForm(number), - str = plurals[u][pluralForm(number)]; - if (f === 2) { - str = str[withoutSuffix ? 0 : 1]; - } - return str.replace(/%d/i, number); - }; - }, months = [ - 'كانون الثاني يناير', - 'شباط Ùبراير', - 'آذار مارس', - 'نيسان أبريل', - 'أيار مايو', - 'حزيران يونيو', - 'تموز يوليو', - 'آب أغسطس', - 'أيلول سبتمبر', - 'تشرين الأول أكتوبر', - 'تشرين الثاني نوÙمبر', - 'كانون الأول ديسمبر' - ]; - - return moment.defineLocale('ar', { - months : months, - monthsShort : months, - weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - meridiemParse: /ص|Ù…/, - isPM : function (input) { - return 'Ù…' === input; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'ص'; - } else { - return 'Ù…'; - } - }, - calendar : { - sameDay: '[اليوم عند الساعة] LT', - nextDay: '[غدًا عند الساعة] LT', - nextWeek: 'dddd [عند الساعة] LT', - lastDay: '[أمس عند الساعة] LT', - lastWeek: 'dddd [عند الساعة] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'بعد %s', - past : 'منذ %s', - s : pluralize('s'), - m : pluralize('m'), - mm : pluralize('m'), - h : pluralize('h'), - hh : pluralize('h'), - d : pluralize('d'), - dd : pluralize('d'), - M : pluralize('M'), - MM : pluralize('M'), - y : pluralize('y'), - yy : pluralize('y') - }, - preparse: function (string) { - return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { - return numberMap[match]; - }).replace(/ØŒ/g, ','); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }).replace(/,/g, 'ØŒ'); - }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : azerbaijani (az) -// author : topchiyev : https://github.com/topchiyev - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var suffixes = { - 1: '-inci', - 5: '-inci', - 8: '-inci', - 70: '-inci', - 80: '-inci', - - 2: '-nci', - 7: '-nci', - 20: '-nci', - 50: '-nci', - - 3: '-üncü', - 4: '-üncü', - 100: '-üncü', - - 6: '-ncı', - - 9: '-uncu', - 10: '-uncu', - 30: '-uncu', - - 60: '-ıncı', - 90: '-ıncı' - }; - return moment.defineLocale('az', { - months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'), - monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'), - weekdays : 'Bazar_Bazar ertÉ™si_ÇərÅŸÉ™nbÉ™ axÅŸamı_ÇərÅŸÉ™nbÉ™_CümÉ™ axÅŸamı_CümÉ™_ŞənbÉ™'.split('_'), - weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'), - weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay : '[bugün saat] LT', - nextDay : '[sabah saat] LT', - nextWeek : '[gÉ™lÉ™n hÉ™ftÉ™] dddd [saat] LT', - lastDay : '[dünÉ™n] LT', - lastWeek : '[keçən hÉ™ftÉ™] dddd [saat] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s sonra', - past : '%s É™vvÉ™l', - s : 'birneçə saniyyÉ™', - m : 'bir dÉ™qiqÉ™', - mm : '%d dÉ™qiqÉ™', - h : 'bir saat', - hh : '%d saat', - d : 'bir gün', - dd : '%d gün', - M : 'bir ay', - MM : '%d ay', - y : 'bir il', - yy : '%d il' - }, - meridiemParse: /gecÉ™|sÉ™hÉ™r|gündüz|axÅŸam/, - isPM : function (input) { - return /^(gündüz|axÅŸam)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'gecÉ™'; - } else if (hour < 12) { - return 'sÉ™hÉ™r'; - } else if (hour < 17) { - return 'gündüz'; - } else { - return 'axÅŸam'; - } - }, - ordinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/, - ordinal : function (number) { - if (number === 0) { // special case for zero - return number + '-ıncı'; - } - var a = number % 10, - b = number % 100 - a, - c = number >= 100 ? 100 : null; - - return number + (suffixes[a] || suffixes[b] || suffixes[c]); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : belarusian (be) -// author : Dmitry Demidov : https://github.com/demidov91 -// author: Praleska: http://praleska.pro/ -// Author : Menelion Elensúle : https://github.com/Oire - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - function plural(word, num) { - var forms = word.split('_'); - return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); - } - - function relativeTimeWithPlural(number, withoutSuffix, key) { - var format = { - 'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін', - 'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін', - 'dd': 'дзень_дні_дзён', - 'MM': 'меÑÑц_меÑÑцы_меÑÑцаў', - 'yy': 'год_гады_гадоў' - }; - if (key === 'm') { - return withoutSuffix ? 'хвіліна' : 'хвіліну'; - } - else if (key === 'h') { - return withoutSuffix ? 'гадзіна' : 'гадзіну'; - } - else { - return number + ' ' + plural(format[key], +number); - } - } - - function monthsCaseReplace(m, format) { - var months = { - 'nominative': 'Ñтудзень_люты_Ñакавік_краÑавік_травень_чÑрвень_ліпень_жнівень_вераÑень_каÑтрычнік_ліÑтапад_Ñнежань'.split('_'), - 'accusative': 'ÑтудзенÑ_лютага_Ñакавіка_краÑавіка_траўнÑ_чÑрвенÑ_ліпенÑ_жніўнÑ_вераÑнÑ_каÑтрычніка_ліÑтапада_ÑнежнÑ'.split('_') - }, - - nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? - 'accusative' : - 'nominative'; - - return months[nounCase][m.month()]; - } - - function weekdaysCaseReplace(m, format) { - var weekdays = { - 'nominative': 'нÑдзелÑ_панÑдзелак_аўторак_Ñерада_чацвер_пÑтніца_Ñубота'.split('_'), - 'accusative': 'нÑдзелю_панÑдзелак_аўторак_Ñераду_чацвер_пÑтніцу_Ñуботу'.split('_') - }, - - nounCase = (/\[ ?[Вв] ?(?:мінулую|наÑтупную)? ?\] ?dddd/).test(format) ? - 'accusative' : - 'nominative'; - - return weekdays[nounCase][m.day()]; - } - - return moment.defineLocale('be', { - months : monthsCaseReplace, - monthsShort : 'Ñтуд_лют_Ñак_краÑ_трав_чÑрв_ліп_жнів_вер_каÑÑ‚_ліÑÑ‚_Ñнеж'.split('_'), - weekdays : weekdaysCaseReplace, - weekdaysShort : 'нд_пн_ат_ÑÑ€_чц_пт_Ñб'.split('_'), - weekdaysMin : 'нд_пн_ат_ÑÑ€_чц_пт_Ñб'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY г.', - LLL : 'D MMMM YYYY г., LT', - LLLL : 'dddd, D MMMM YYYY г., LT' - }, - calendar : { - sameDay: '[Ð¡Ñ‘Ð½Ð½Ñ Ñž] LT', - nextDay: '[Заўтра Ñž] LT', - lastDay: '[Учора Ñž] LT', - nextWeek: function () { - return '[У] dddd [Ñž] LT'; - }, - lastWeek: function () { - switch (this.day()) { - case 0: - case 3: - case 5: - case 6: - return '[У мінулую] dddd [Ñž] LT'; - case 1: - case 2: - case 4: - return '[У мінулы] dddd [Ñž] LT'; - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'праз %s', - past : '%s таму', - s : 'некалькі Ñекунд', - m : relativeTimeWithPlural, - mm : relativeTimeWithPlural, - h : relativeTimeWithPlural, - hh : relativeTimeWithPlural, - d : 'дзень', - dd : relativeTimeWithPlural, - M : 'меÑÑц', - MM : relativeTimeWithPlural, - y : 'год', - yy : relativeTimeWithPlural - }, - meridiemParse: /ночы|раніцы|днÑ|вечара/, - isPM : function (input) { - return /^(днÑ|вечара)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'ночы'; - } else if (hour < 12) { - return 'раніцы'; - } else if (hour < 17) { - return 'днÑ'; - } else { - return 'вечара'; - } - }, - - ordinalParse: /\d{1,2}-(Ñ–|Ñ‹|га)/, - ordinal: function (number, period) { - switch (period) { - case 'M': - case 'd': - case 'DDD': - case 'w': - case 'W': - return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-Ñ–' : number + '-Ñ‹'; - case 'D': - return number + '-га'; - default: - return number; - } - }, - - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : bulgarian (bg) -// author : Krasen Borisov : https://github.com/kraz - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('bg', { - months : 'Ñнуари_февруари_март_април_май_юни_юли_авгуÑÑ‚_Ñептември_октомври_ноември_декември'.split('_'), - monthsShort : 'Ñнр_фев_мар_апр_май_юни_юли_авг_Ñеп_окт_ное_дек'.split('_'), - weekdays : 'неделÑ_понеделник_вторник_ÑÑ€Ñда_четвъртък_петък_Ñъбота'.split('_'), - weekdaysShort : 'нед_пон_вто_ÑÑ€Ñ_чет_пет_Ñъб'.split('_'), - weekdaysMin : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'D.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay : '[Ð”Ð½ÐµÑ Ð²] LT', - nextDay : '[Утре в] LT', - nextWeek : 'dddd [в] LT', - lastDay : '[Вчера в] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - case 6: - return '[Ð’ изминалата] dddd [в] LT'; - case 1: - case 2: - case 4: - case 5: - return '[Ð’ изминалиÑ] dddd [в] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'Ñлед %s', - past : 'преди %s', - s : 'нÑколко Ñекунди', - m : 'минута', - mm : '%d минути', - h : 'чаÑ', - hh : '%d чаÑа', - d : 'ден', - dd : '%d дни', - M : 'меÑец', - MM : '%d меÑеца', - y : 'година', - yy : '%d години' - }, - ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, - ordinal : function (number) { - var lastDigit = number % 10, - last2Digits = number % 100; - if (number === 0) { - return number + '-ев'; - } else if (last2Digits === 0) { - return number + '-ен'; - } else if (last2Digits > 10 && last2Digits < 20) { - return number + '-ти'; - } else if (lastDigit === 1) { - return number + '-ви'; - } else if (lastDigit === 2) { - return number + '-ри'; - } else if (lastDigit === 7 || lastDigit === 8) { - return number + '-ми'; - } else { - return number + '-ти'; - } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : Bengali (bn) -// author : Kaushik Gandhi : https://github.com/kaushikgandhi - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var symbolMap = { - '1': '১', - '2': '২', - '3': '৩', - '4': '৪', - '5': '৫', - '6': '৬', - '7': '৭', - '8': '৮', - '9': '৯', - '0': '০' - }, - numberMap = { - '১': '1', - '২': '2', - '৩': '3', - '৪': '4', - '৫': '5', - '৬': '6', - '৭': '7', - '৮': '8', - '৯': '9', - '০': '0' - }; - - return moment.defineLocale('bn', { - months : 'জানà§à§Ÿà¦¾à¦°à§€_ফেবà§à§Ÿà¦¾à¦°à§€_মারà§à¦š_à¦à¦ªà§à¦°à¦¿à¦²_মে_জà§à¦¨_জà§à¦²à¦¾à¦‡_অগাসà§à¦Ÿ_সেপà§à¦Ÿà§‡à¦®à§à¦¬à¦°_অকà§à¦Ÿà§‹à¦¬à¦°_নভেমà§à¦¬à¦°_ডিসেমà§à¦¬à¦°'.split('_'), - monthsShort : 'জানà§_ফেব_মারà§à¦š_à¦à¦ªà¦°_মে_জà§à¦¨_জà§à¦²_অগ_সেপà§à¦Ÿ_অকà§à¦Ÿà§‹_নভ_ডিসেমà§'.split('_'), - weekdays : 'রবিবার_সোমবার_মঙà§à¦—লবার_বà§à¦§à¦¬à¦¾à¦°_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿à¦¬à¦¾à¦°_শà§à¦•à§à¦°à§à¦¬à¦¾à¦°_শনিবার'.split('_'), - weekdaysShort : 'রবি_সোম_মঙà§à¦—ল_বà§à¦§_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿_শà§à¦•à§à¦°à§_শনি'.split('_'), - weekdaysMin : 'রব_সম_মঙà§à¦—_বà§_বà§à¦°à¦¿à¦¹_শà§_শনি'.split('_'), - longDateFormat : { - LT : 'A h:mm সময়', - LTS : 'A h:mm:ss সময়', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, LT', - LLLL : 'dddd, D MMMM YYYY, LT' - }, - calendar : { - sameDay : '[আজ] LT', - nextDay : '[আগামীকাল] LT', - nextWeek : 'dddd, LT', - lastDay : '[গতকাল] LT', - lastWeek : '[গত] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s পরে', - past : '%s আগে', - s : 'কà¦à¦• সেকেনà§à¦¡', - m : 'à¦à¦• মিনিট', - mm : '%d মিনিট', - h : 'à¦à¦• ঘনà§à¦Ÿà¦¾', - hh : '%d ঘনà§à¦Ÿà¦¾', - d : 'à¦à¦• দিন', - dd : '%d দিন', - M : 'à¦à¦• মাস', - MM : '%d মাস', - y : 'à¦à¦• বছর', - yy : '%d বছর' - }, - preparse: function (string) { - return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - meridiemParse: /রাত|শকাল|দà§à¦ªà§à¦°|বিকেল|রাত/, - isPM: function (input) { - return /^(দà§à¦ªà§à¦°|বিকেল|রাত)$/.test(input); - }, - //Bengali is a vast language its spoken - //in different forms in various parts of the world. - //I have just generalized with most common one used - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'রাত'; - } else if (hour < 10) { - return 'শকাল'; - } else if (hour < 17) { - return 'দà§à¦ªà§à¦°'; - } else if (hour < 20) { - return 'বিকেল'; - } else { - return 'রাত'; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : tibetan (bo) -// author : Thupten N. Chakrishar : https://github.com/vajradog - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var symbolMap = { - '1': '༡', - '2': '༢', - '3': '༣', - '4': '༤', - '5': '༥', - '6': '༦', - '7': '༧', - '8': '༨', - '9': '༩', - '0': '༠' - }, - numberMap = { - '༡': '1', - '༢': '2', - '༣': '3', - '༤': '4', - '༥': '5', - '༦': '6', - '༧': '7', - '༨': '8', - '༩': '9', - '༠': '0' - }; - - return moment.defineLocale('bo', { - months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), - monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), - weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'), - weekdaysShort : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), - weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), - longDateFormat : { - LT : 'A h:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, LT', - LLLL : 'dddd, D MMMM YYYY, LT' - }, - calendar : { - sameDay : '[དི་རིང] LT', - nextDay : '[སང་ཉིན] LT', - nextWeek : '[བདུན་ཕྲག་རྗེས་མ], LT', - lastDay : '[à½à¼‹à½¦à½„] LT', - lastWeek : '[བདུན་ཕྲག་མà½à½ à¼‹à½˜] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s ལ་', - past : '%s སྔན་ལ', - s : 'ལམ་སང', - m : 'སà¾à½¢à¼‹à½˜à¼‹à½‚ཅིག', - mm : '%d སà¾à½¢à¼‹à½˜', - h : 'ཆུ་ཚོད་གཅིག', - hh : '%d ཆུ་ཚོད', - d : 'ཉིན་གཅིག', - dd : '%d ཉིན་', - M : 'ཟླ་བ་གཅིག', - MM : '%d ཟླ་བ', - y : 'ལོ་གཅིག', - yy : '%d ལོ' - }, - preparse: function (string) { - return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/, - isPM: function (input) { - return /^(ཉིན་གུང|དགོང་དག|མཚན་མོ)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'མཚན་མོ'; - } else if (hour < 10) { - return 'ཞོགས་ཀས'; - } else if (hour < 17) { - return 'ཉིན་གུང'; - } else if (hour < 20) { - return 'དགོང་དག'; - } else { - return 'མཚན་མོ'; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : breton (br) -// author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - function relativeTimeWithMutation(number, withoutSuffix, key) { - var format = { - 'mm': 'munutenn', - 'MM': 'miz', - 'dd': 'devezh' - }; - return number + ' ' + mutation(format[key], number); - } - - function specialMutationForYears(number) { - switch (lastNumber(number)) { - case 1: - case 3: - case 4: - case 5: - case 9: - return number + ' bloaz'; - default: - return number + ' vloaz'; - } - } - - function lastNumber(number) { - if (number > 9) { - return lastNumber(number % 10); - } - return number; - } - - function mutation(text, number) { - if (number === 2) { - return softMutation(text); - } - return text; - } - - function softMutation(text) { - var mutationTable = { - 'm': 'v', - 'b': 'v', - 'd': 'z' - }; - if (mutationTable[text.charAt(0)] === undefined) { - return text; - } - return mutationTable[text.charAt(0)] + text.substring(1); - } - - return moment.defineLocale('br', { - months : 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'), - monthsShort : 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'), - weekdays : 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'), - weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'), - weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'), - longDateFormat : { - LT : 'h[e]mm A', - LTS : 'h[e]mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D [a viz] MMMM YYYY', - LLL : 'D [a viz] MMMM YYYY LT', - LLLL : 'dddd, D [a viz] MMMM YYYY LT' - }, - calendar : { - sameDay : '[Hiziv da] LT', - nextDay : '[Warc\'hoazh da] LT', - nextWeek : 'dddd [da] LT', - lastDay : '[Dec\'h da] LT', - lastWeek : 'dddd [paset da] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'a-benn %s', - past : '%s \'zo', - s : 'un nebeud segondennoù', - m : 'ur vunutenn', - mm : relativeTimeWithMutation, - h : 'un eur', - hh : '%d eur', - d : 'un devezh', - dd : relativeTimeWithMutation, - M : 'ur miz', - MM : relativeTimeWithMutation, - y : 'ur bloaz', - yy : specialMutationForYears - }, - ordinalParse: /\d{1,2}(añ|vet)/, - ordinal : function (number) { - var output = (number === 1) ? 'añ' : 'vet'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : bosnian (bs) -// author : Nedim Cholich : https://github.com/frontyard -// based on (hr) translation by Bojan Marković - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - function translate(number, withoutSuffix, key) { - var result = number + ' '; - switch (key) { - case 'm': - return withoutSuffix ? 'jedna minuta' : 'jedne minute'; - case 'mm': - if (number === 1) { - result += 'minuta'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'minute'; - } else { - result += 'minuta'; - } - return result; - case 'h': - return withoutSuffix ? 'jedan sat' : 'jednog sata'; - case 'hh': - if (number === 1) { - result += 'sat'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'sata'; - } else { - result += 'sati'; - } - return result; - case 'dd': - if (number === 1) { - result += 'dan'; - } else { - result += 'dana'; - } - return result; - case 'MM': - if (number === 1) { - result += 'mjesec'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'mjeseca'; - } else { - result += 'mjeseci'; - } - return result; - case 'yy': - if (number === 1) { - result += 'godina'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'godine'; - } else { - result += 'godina'; - } - return result; - } - } - - return moment.defineLocale('bs', { - months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'), - monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'), - weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota'.split('_'), - weekdaysShort : 'ned._pon._uto._sri._Äet._pet._sub.'.split('_'), - weekdaysMin : 'ne_po_ut_sr_Äe_pe_su'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'DD. MM. YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY LT', - LLLL : 'dddd, D. MMMM YYYY LT' - }, - calendar : { - sameDay : '[danas u] LT', - nextDay : '[sutra u] LT', - - nextWeek : function () { - switch (this.day()) { - case 0: - return '[u] [nedjelju] [u] LT'; - case 3: - return '[u] [srijedu] [u] LT'; - case 6: - return '[u] [subotu] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[u] dddd [u] LT'; - } - }, - lastDay : '[juÄer u] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - return '[proÅ¡lu] dddd [u] LT'; - case 6: - return '[proÅ¡le] [subote] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[proÅ¡li] dddd [u] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'za %s', - past : 'prije %s', - s : 'par sekundi', - m : translate, - mm : translate, - h : translate, - hh : translate, - d : 'dan', - dd : translate, - M : 'mjesec', - MM : translate, - y : 'godinu', - yy : translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : catalan (ca) -// author : Juan G. Hurtado : https://github.com/juanghurtado - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('ca', { - months : 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'), - monthsShort : 'gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.'.split('_'), - weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'), - weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'), - weekdaysMin : 'Dg_Dl_Dt_Dc_Dj_Dv_Ds'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay : function () { - return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - nextDay : function () { - return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - nextWeek : function () { - return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - lastDay : function () { - return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - lastWeek : function () { - return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'en %s', - past : 'fa %s', - s : 'uns segons', - m : 'un minut', - mm : '%d minuts', - h : 'una hora', - hh : '%d hores', - d : 'un dia', - dd : '%d dies', - M : 'un mes', - MM : '%d mesos', - y : 'un any', - yy : '%d anys' - }, - ordinalParse: /\d{1,2}(r|n|t|è|a)/, - ordinal : function (number, period) { - var output = (number === 1) ? 'r' : - (number === 2) ? 'n' : - (number === 3) ? 'r' : - (number === 4) ? 't' : 'è'; - if (period === 'w' || period === 'W') { - output = 'a'; - } - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : czech (cs) -// author : petrbela : https://github.com/petrbela - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var months = 'leden_únor_bÅ™ezen_duben_kvÄ›ten_Äerven_Äervenec_srpen_září_říjen_listopad_prosinec'.split('_'), - monthsShort = 'led_úno_bÅ™e_dub_kvÄ›_Ävn_Ävc_srp_zář_říj_lis_pro'.split('_'); - - function plural(n) { - return (n > 1) && (n < 5) && (~~(n / 10) !== 1); - } - - function translate(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - switch (key) { - case 's': // a few seconds / in a few seconds / a few seconds ago - return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami'; - case 'm': // a minute / in a minute / a minute ago - return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou'); - case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'minuty' : 'minut'); - } else { - return result + 'minutami'; - } - break; - case 'h': // an hour / in an hour / an hour ago - return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); - case 'hh': // 9 hours / in 9 hours / 9 hours ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'hodiny' : 'hodin'); - } else { - return result + 'hodinami'; - } - break; - case 'd': // a day / in a day / a day ago - return (withoutSuffix || isFuture) ? 'den' : 'dnem'; - case 'dd': // 9 days / in 9 days / 9 days ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'dny' : 'dní'); - } else { - return result + 'dny'; - } - break; - case 'M': // a month / in a month / a month ago - return (withoutSuffix || isFuture) ? 'mÄ›síc' : 'mÄ›sícem'; - case 'MM': // 9 months / in 9 months / 9 months ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'mÄ›síce' : 'mÄ›síců'); - } else { - return result + 'mÄ›síci'; - } - break; - case 'y': // a year / in a year / a year ago - return (withoutSuffix || isFuture) ? 'rok' : 'rokem'; - case 'yy': // 9 years / in 9 years / 9 years ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'roky' : 'let'); - } else { - return result + 'lety'; - } - break; - } - } - - return moment.defineLocale('cs', { - months : months, - monthsShort : monthsShort, - monthsParse : (function (months, monthsShort) { - var i, _monthsParse = []; - for (i = 0; i < 12; i++) { - // use custom parser to solve problem with July (Äervenec) - _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); - } - return _monthsParse; - }(months, monthsShort)), - weekdays : 'nedÄ›le_pondÄ›lí_úterý_stÅ™eda_Ätvrtek_pátek_sobota'.split('_'), - weekdaysShort : 'ne_po_út_st_Ät_pá_so'.split('_'), - weekdaysMin : 'ne_po_út_st_Ät_pá_so'.split('_'), - longDateFormat : { - LT: 'H:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY LT', - LLLL : 'dddd D. MMMM YYYY LT' - }, - calendar : { - sameDay: '[dnes v] LT', - nextDay: '[zítra v] LT', - nextWeek: function () { - switch (this.day()) { - case 0: - return '[v nedÄ›li v] LT'; - case 1: - case 2: - return '[v] dddd [v] LT'; - case 3: - return '[ve stÅ™edu v] LT'; - case 4: - return '[ve Ätvrtek v] LT'; - case 5: - return '[v pátek v] LT'; - case 6: - return '[v sobotu v] LT'; - } - }, - lastDay: '[vÄera v] LT', - lastWeek: function () { - switch (this.day()) { - case 0: - return '[minulou nedÄ›li v] LT'; - case 1: - case 2: - return '[minulé] dddd [v] LT'; - case 3: - return '[minulou stÅ™edu v] LT'; - case 4: - case 5: - return '[minulý] dddd [v] LT'; - case 6: - return '[minulou sobotu v] LT'; - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'za %s', - past : 'pÅ™ed %s', - s : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate - }, - ordinalParse : /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : chuvash (cv) -// author : Anatoly Mironov : https://github.com/mirontoli - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('cv', { - months : 'кăрлач_нарăÑ_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав'.split('_'), - monthsShort : 'кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш'.split('_'), - weekdays : 'вырÑарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_Ñрнекун_шăматкун'.split('_'), - weekdaysShort : 'выр_тун_ытл_юн_кĕç_Ñрн_шăм'.split('_'), - weekdaysMin : 'вр_тн_Ñ‹Ñ‚_юн_кç_ÑÑ€_шм'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD-MM-YYYY', - LL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]', - LLL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT', - LLLL : 'dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT' - }, - calendar : { - sameDay: '[ПаÑн] LT [Ñехетре]', - nextDay: '[Ыран] LT [Ñехетре]', - lastDay: '[Ĕнер] LT [Ñехетре]', - nextWeek: '[ÇитеÑ] dddd LT [Ñехетре]', - lastWeek: '[Иртнĕ] dddd LT [Ñехетре]', - sameElse: 'L' - }, - relativeTime : { - future : function (output) { - var affix = /Ñехет$/i.exec(output) ? 'рен' : /çул$/i.exec(output) ? 'тан' : 'ран'; - return output + affix; - }, - past : '%s каÑлла', - s : 'пĕр-ик çеккунт', - m : 'пĕр минут', - mm : '%d минут', - h : 'пĕр Ñехет', - hh : '%d Ñехет', - d : 'пĕр кун', - dd : '%d кун', - M : 'пĕр уйăх', - MM : '%d уйăх', - y : 'пĕр çул', - yy : '%d çул' - }, - ordinalParse: /\d{1,2}-мĕш/, - ordinal : '%d-мĕш', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : Welsh (cy) -// author : Robert Allen - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('cy', { - months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'), - monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'), - weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'), - weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'), - weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'), - // time formats are the same as en-gb - longDateFormat: { - LT: 'HH:mm', - LTS : 'LT:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY LT', - LLLL: 'dddd, D MMMM YYYY LT' - }, - calendar: { - sameDay: '[Heddiw am] LT', - nextDay: '[Yfory am] LT', - nextWeek: 'dddd [am] LT', - lastDay: '[Ddoe am] LT', - lastWeek: 'dddd [diwethaf am] LT', - sameElse: 'L' - }, - relativeTime: { - future: 'mewn %s', - past: '%s yn ôl', - s: 'ychydig eiliadau', - m: 'munud', - mm: '%d munud', - h: 'awr', - hh: '%d awr', - d: 'diwrnod', - dd: '%d diwrnod', - M: 'mis', - MM: '%d mis', - y: 'blwyddyn', - yy: '%d flynedd' - }, - ordinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/, - // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh - ordinal: function (number) { - var b = number, - output = '', - lookup = [ - '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed - 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed - ]; - - if (b > 20) { - if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) { - output = 'fed'; // not 30ain, 70ain or 90ain - } else { - output = 'ain'; - } - } else if (b > 0) { - output = lookup[b]; - } - - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : danish (da) -// author : Ulrik Nielsen : https://github.com/mrbase - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('da', { - months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'), - monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), - weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), - weekdaysShort : 'søn_man_tir_ons_tor_fre_lør'.split('_'), - weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY LT', - LLLL : 'dddd [d.] D. MMMM YYYY LT' - }, - calendar : { - sameDay : '[I dag kl.] LT', - nextDay : '[I morgen kl.] LT', - nextWeek : 'dddd [kl.] LT', - lastDay : '[I gÃ¥r kl.] LT', - lastWeek : '[sidste] dddd [kl] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'om %s', - past : '%s siden', - s : 'fÃ¥ sekunder', - m : 'et minut', - mm : '%d minutter', - h : 'en time', - hh : '%d timer', - d : 'en dag', - dd : '%d dage', - M : 'en mÃ¥ned', - MM : '%d mÃ¥neder', - y : 'et Ã¥r', - yy : '%d Ã¥r' - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : austrian german (de-at) -// author : lluchs : https://github.com/lluchs -// author: Menelion Elensúle: https://github.com/Oire -// author : Martin Groller : https://github.com/MadMG - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 'm': ['eine Minute', 'einer Minute'], - 'h': ['eine Stunde', 'einer Stunde'], - 'd': ['ein Tag', 'einem Tag'], - 'dd': [number + ' Tage', number + ' Tagen'], - 'M': ['ein Monat', 'einem Monat'], - 'MM': [number + ' Monate', number + ' Monaten'], - 'y': ['ein Jahr', 'einem Jahr'], - 'yy': [number + ' Jahre', number + ' Jahren'] - }; - return withoutSuffix ? format[key][0] : format[key][1]; - } - - return moment.defineLocale('de-at', { - months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), - monthsShort : 'Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), - weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), - weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), - weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), - longDateFormat : { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY LT', - LLLL : 'dddd, D. MMMM YYYY LT' - }, - calendar : { - sameDay: '[Heute um] LT [Uhr]', - sameElse: 'L', - nextDay: '[Morgen um] LT [Uhr]', - nextWeek: 'dddd [um] LT [Uhr]', - lastDay: '[Gestern um] LT [Uhr]', - lastWeek: '[letzten] dddd [um] LT [Uhr]' - }, - relativeTime : { - future : 'in %s', - past : 'vor %s', - s : 'ein paar Sekunden', - m : processRelativeTime, - mm : '%d Minuten', - h : processRelativeTime, - hh : '%d Stunden', - d : processRelativeTime, - dd : processRelativeTime, - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : german (de) -// author : lluchs : https://github.com/lluchs -// author: Menelion Elensúle: https://github.com/Oire - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 'm': ['eine Minute', 'einer Minute'], - 'h': ['eine Stunde', 'einer Stunde'], - 'd': ['ein Tag', 'einem Tag'], - 'dd': [number + ' Tage', number + ' Tagen'], - 'M': ['ein Monat', 'einem Monat'], - 'MM': [number + ' Monate', number + ' Monaten'], - 'y': ['ein Jahr', 'einem Jahr'], - 'yy': [number + ' Jahre', number + ' Jahren'] - }; - return withoutSuffix ? format[key][0] : format[key][1]; - } - - return moment.defineLocale('de', { - months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), - monthsShort : 'Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), - weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), - weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), - weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), - longDateFormat : { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY LT', - LLLL : 'dddd, D. MMMM YYYY LT' - }, - calendar : { - sameDay: '[Heute um] LT [Uhr]', - sameElse: 'L', - nextDay: '[Morgen um] LT [Uhr]', - nextWeek: 'dddd [um] LT [Uhr]', - lastDay: '[Gestern um] LT [Uhr]', - lastWeek: '[letzten] dddd [um] LT [Uhr]' - }, - relativeTime : { - future : 'in %s', - past : 'vor %s', - s : 'ein paar Sekunden', - m : processRelativeTime, - mm : '%d Minuten', - h : processRelativeTime, - hh : '%d Stunden', - d : processRelativeTime, - dd : processRelativeTime, - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : modern greek (el) -// author : Aggelos Karalias : https://github.com/mehiel - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('el', { - monthsNominativeEl : 'ΙανουάÏιος_ΦεβÏουάÏιος_ΜάÏτιος_ΑπÏίλιος_Μάιος_ΙοÏνιος_ΙοÏλιος_ΑÏγουστος_ΣεπτέμβÏιος_ΟκτώβÏιος_ÎοέμβÏιος_ΔεκέμβÏιος'.split('_'), - monthsGenitiveEl : 'ΙανουαÏίου_ΦεβÏουαÏίου_ΜαÏτίου_ΑπÏιλίου_ΜαÎου_Ιουνίου_Ιουλίου_ΑυγοÏστου_ΣεπτεμβÏίου_ΟκτωβÏίου_ÎοεμβÏίου_ΔεκεμβÏίου'.split('_'), - months : function (momentToFormat, format) { - if (/D/.test(format.substring(0, format.indexOf('MMMM')))) { // if there is a day number before 'MMMM' - return this._monthsGenitiveEl[momentToFormat.month()]; - } else { - return this._monthsNominativeEl[momentToFormat.month()]; - } - }, - monthsShort : 'Ιαν_Φεβ_ΜαÏ_ΑπÏ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Îοε_Δεκ'.split('_'), - weekdays : 'ΚυÏιακή_ΔευτέÏα_ΤÏίτη_ΤετάÏτη_Πέμπτη_ΠαÏασκευή_Σάββατο'.split('_'), - weekdaysShort : 'ΚυÏ_Δευ_ΤÏι_Τετ_Πεμ_ΠαÏ_Σαβ'.split('_'), - weekdaysMin : 'Κυ_Δε_ΤÏ_Τε_Πε_Πα_Σα'.split('_'), - meridiem : function (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'μμ' : 'ΜΜ'; - } else { - return isLower ? 'πμ' : 'ΠΜ'; - } - }, - isPM : function (input) { - return ((input + '').toLowerCase()[0] === 'μ'); - }, - meridiemParse : /[ΠΜ]\.?Îœ?\.?/i, - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendarEl : { - sameDay : '[ΣήμεÏα {}] LT', - nextDay : '[ΑÏÏιο {}] LT', - nextWeek : 'dddd [{}] LT', - lastDay : '[Χθες {}] LT', - lastWeek : function () { - switch (this.day()) { - case 6: - return '[το Ï€ÏοηγοÏμενο] dddd [{}] LT'; - default: - return '[την Ï€ÏοηγοÏμενη] dddd [{}] LT'; - } - }, - sameElse : 'L' - }, - calendar : function (key, mom) { - var output = this._calendarEl[key], - hours = mom && mom.hours(); - - if (typeof output === 'function') { - output = output.apply(mom); - } - - return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις')); - }, - relativeTime : { - future : 'σε %s', - past : '%s Ï€Ïιν', - s : 'λίγα δευτεÏόλεπτα', - m : 'ένα λεπτό', - mm : '%d λεπτά', - h : 'μία ÏŽÏα', - hh : '%d ÏŽÏες', - d : 'μία μέÏα', - dd : '%d μέÏες', - M : 'ένας μήνας', - MM : '%d μήνες', - y : 'ένας χÏόνος', - yy : '%d χÏόνια' - }, - ordinalParse: /\d{1,2}η/, - ordinal: '%dη', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : australian english (en-au) - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('en-au', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' - }, - 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' - }, - ordinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : canadian english (en-ca) -// author : Jonathan Abourbih : https://github.com/jonbca - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('en-ca', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'YYYY-MM-DD', - LL : 'D MMMM, YYYY', - LLL : 'D MMMM, YYYY LT', - LLLL : 'dddd, D MMMM, YYYY LT' - }, - calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' - }, - 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' - }, - ordinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - } - }); -})); - -// moment.js locale configuration -// locale : great britain english (en-gb) -// author : Chris Gedrim : https://github.com/chrisgedrim - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('en-gb', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' - }, - 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' - }, - ordinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : esperanto (eo) -// author : Colin Dean : https://github.com/colindean -// komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko. -// Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni! - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('eo', { - months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aÅ­gusto_septembro_oktobro_novembro_decembro'.split('_'), - monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aÅ­g_sep_okt_nov_dec'.split('_'), - weekdays : 'Dimanĉo_Lundo_Mardo_Merkredo_Ä´aÅ­do_Vendredo_Sabato'.split('_'), - weekdaysShort : 'Dim_Lun_Mard_Merk_Ä´aÅ­_Ven_Sab'.split('_'), - weekdaysMin : 'Di_Lu_Ma_Me_Ä´a_Ve_Sa'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'YYYY-MM-DD', - LL : 'D[-an de] MMMM, YYYY', - LLL : 'D[-an de] MMMM, YYYY LT', - LLLL : 'dddd, [la] D[-an de] MMMM, YYYY LT' - }, - meridiemParse: /[ap]\.t\.m/i, - isPM: function (input) { - return input.charAt(0).toLowerCase() === 'p'; - }, - meridiem : function (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'p.t.m.' : 'P.T.M.'; - } else { - return isLower ? 'a.t.m.' : 'A.T.M.'; - } - }, - calendar : { - sameDay : '[HodiaÅ­ je] LT', - nextDay : '[MorgaÅ­ je] LT', - nextWeek : 'dddd [je] LT', - lastDay : '[HieraÅ­ je] LT', - lastWeek : '[pasinta] dddd [je] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'je %s', - past : 'antaÅ­ %s', - s : 'sekundoj', - m : 'minuto', - mm : '%d minutoj', - h : 'horo', - hh : '%d horoj', - d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo - dd : '%d tagoj', - M : 'monato', - MM : '%d monatoj', - y : 'jaro', - yy : '%d jaroj' - }, - ordinalParse: /\d{1,2}a/, - ordinal : '%da', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : spanish (es) -// author : Julio Napurí : https://github.com/julionc - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), - monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); - - return moment.defineLocale('es', { - months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), - monthsShort : function (m, format) { - if (/-MMM-/.test(format)) { - return monthsShort[m.month()]; - } else { - return monthsShortDot[m.month()]; - } - }, - weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), - weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), - weekdaysMin : 'Do_Lu_Ma_Mi_Ju_Vi_Sá'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY LT', - LLLL : 'dddd, D [de] MMMM [de] YYYY LT' - }, - calendar : { - sameDay : function () { - return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - nextDay : function () { - return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - nextWeek : function () { - return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - lastDay : function () { - return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - lastWeek : function () { - return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'en %s', - past : 'hace %s', - s : 'unos segundos', - m : 'un minuto', - mm : '%d minutos', - h : 'una hora', - hh : '%d horas', - d : 'un día', - dd : '%d días', - M : 'un mes', - MM : '%d meses', - y : 'un año', - yy : '%d años' - }, - ordinalParse : /\d{1,2}º/, - ordinal : '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : estonian (et) -// author : Henry Kehlmann : https://github.com/madhenry -// improvements : Illimar Tambek : https://github.com/ragulka - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'], - 'm' : ['ühe minuti', 'üks minut'], - 'mm': [number + ' minuti', number + ' minutit'], - 'h' : ['ühe tunni', 'tund aega', 'üks tund'], - 'hh': [number + ' tunni', number + ' tundi'], - 'd' : ['ühe päeva', 'üks päev'], - 'M' : ['kuu aja', 'kuu aega', 'üks kuu'], - 'MM': [number + ' kuu', number + ' kuud'], - 'y' : ['ühe aasta', 'aasta', 'üks aasta'], - 'yy': [number + ' aasta', number + ' aastat'] - }; - if (withoutSuffix) { - return format[key][2] ? format[key][2] : format[key][1]; - } - return isFuture ? format[key][0] : format[key][1]; - } - - return moment.defineLocale('et', { - months : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'), - monthsShort : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'), - weekdays : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'), - weekdaysShort : 'P_E_T_K_N_R_L'.split('_'), - weekdaysMin : 'P_E_T_K_N_R_L'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY LT', - LLLL : 'dddd, D. MMMM YYYY LT' - }, - calendar : { - sameDay : '[Täna,] LT', - nextDay : '[Homme,] LT', - nextWeek : '[Järgmine] dddd LT', - lastDay : '[Eile,] LT', - lastWeek : '[Eelmine] dddd LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s pärast', - past : '%s tagasi', - s : processRelativeTime, - m : processRelativeTime, - mm : processRelativeTime, - h : processRelativeTime, - hh : processRelativeTime, - d : processRelativeTime, - dd : '%d päeva', - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : euskara (eu) -// author : Eneko Illarramendi : https://github.com/eillarra - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('eu', { - months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'), - monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'), - weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'), - weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'), - weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'YYYY-MM-DD', - LL : 'YYYY[ko] MMMM[ren] D[a]', - LLL : 'YYYY[ko] MMMM[ren] D[a] LT', - LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] LT', - l : 'YYYY-M-D', - ll : 'YYYY[ko] MMM D[a]', - lll : 'YYYY[ko] MMM D[a] LT', - llll : 'ddd, YYYY[ko] MMM D[a] LT' - }, - calendar : { - sameDay : '[gaur] LT[etan]', - nextDay : '[bihar] LT[etan]', - nextWeek : 'dddd LT[etan]', - lastDay : '[atzo] LT[etan]', - lastWeek : '[aurreko] dddd LT[etan]', - sameElse : 'L' - }, - relativeTime : { - future : '%s barru', - past : 'duela %s', - s : 'segundo batzuk', - m : 'minutu bat', - mm : '%d minutu', - h : 'ordu bat', - hh : '%d ordu', - d : 'egun bat', - dd : '%d egun', - M : 'hilabete bat', - MM : '%d hilabete', - y : 'urte bat', - yy : '%d urte' - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : Persian (fa) -// author : Ebrahim Byagowi : https://github.com/ebraminio - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var symbolMap = { - '1': 'Û±', - '2': 'Û²', - '3': 'Û³', - '4': 'Û´', - '5': 'Ûµ', - '6': 'Û¶', - '7': 'Û·', - '8': 'Û¸', - '9': 'Û¹', - '0': 'Û°' - }, numberMap = { - 'Û±': '1', - 'Û²': '2', - 'Û³': '3', - 'Û´': '4', - 'Ûµ': '5', - 'Û¶': '6', - 'Û·': '7', - 'Û¸': '8', - 'Û¹': '9', - 'Û°': '0' - }; - - return moment.defineLocale('fa', { - months : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), - monthsShort : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), - weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), - weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), - weekdaysMin : 'ÛŒ_د_س_Ú†_Ù¾_ج_Ø´'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - meridiemParse: /قبل از ظهر|بعد از ظهر/, - isPM: function (input) { - return /بعد از ظهر/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'قبل از ظهر'; - } else { - return 'بعد از ظهر'; - } - }, - calendar : { - sameDay : '[امروز ساعت] LT', - nextDay : '[Ùردا ساعت] LT', - nextWeek : 'dddd [ساعت] LT', - lastDay : '[دیروز ساعت] LT', - lastWeek : 'dddd [پیش] [ساعت] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'در %s', - past : '%s پیش', - s : 'چندین ثانیه', - m : 'یک دقیقه', - mm : '%d دقیقه', - h : 'یک ساعت', - hh : '%d ساعت', - d : 'یک روز', - dd : '%d روز', - M : 'یک ماه', - MM : '%d ماه', - y : 'یک سال', - yy : '%d سال' - }, - preparse: function (string) { - return string.replace(/[Û°-Û¹]/g, function (match) { - return numberMap[match]; - }).replace(/ØŒ/g, ','); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }).replace(/,/g, 'ØŒ'); - }, - ordinalParse: /\d{1,2}Ù…/, - ordinal : '%dÙ…', - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : finnish (fi) -// author : Tarmo Aidantausta : https://github.com/bleadof - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '), - numbersFuture = [ - 'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden', - numbersPast[7], numbersPast[8], numbersPast[9] - ]; - - function translate(number, withoutSuffix, key, isFuture) { - var result = ''; - switch (key) { - case 's': - return isFuture ? 'muutaman sekunnin' : 'muutama sekunti'; - case 'm': - return isFuture ? 'minuutin' : 'minuutti'; - case 'mm': - result = isFuture ? 'minuutin' : 'minuuttia'; - break; - case 'h': - return isFuture ? 'tunnin' : 'tunti'; - case 'hh': - result = isFuture ? 'tunnin' : 'tuntia'; - break; - case 'd': - return isFuture ? 'päivän' : 'päivä'; - case 'dd': - result = isFuture ? 'päivän' : 'päivää'; - break; - case 'M': - return isFuture ? 'kuukauden' : 'kuukausi'; - case 'MM': - result = isFuture ? 'kuukauden' : 'kuukautta'; - break; - case 'y': - return isFuture ? 'vuoden' : 'vuosi'; - case 'yy': - result = isFuture ? 'vuoden' : 'vuotta'; - break; - } - result = verbalNumber(number, isFuture) + ' ' + result; - return result; - } - - function verbalNumber(number, isFuture) { - return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number; - } - - return moment.defineLocale('fi', { - months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'), - monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'), - weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'), - weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'), - weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'), - longDateFormat : { - LT : 'HH.mm', - LTS : 'HH.mm.ss', - L : 'DD.MM.YYYY', - LL : 'Do MMMM[ta] YYYY', - LLL : 'Do MMMM[ta] YYYY, [klo] LT', - LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] LT', - l : 'D.M.YYYY', - ll : 'Do MMM YYYY', - lll : 'Do MMM YYYY, [klo] LT', - llll : 'ddd, Do MMM YYYY, [klo] LT' - }, - calendar : { - sameDay : '[tänään] [klo] LT', - nextDay : '[huomenna] [klo] LT', - nextWeek : 'dddd [klo] LT', - lastDay : '[eilen] [klo] LT', - lastWeek : '[viime] dddd[na] [klo] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s päästä', - past : '%s sitten', - s : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : faroese (fo) -// author : Ragnar Johannesen : https://github.com/ragnar123 - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('fo', { - months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'), - monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), - weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'), - weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'), - weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D. MMMM, YYYY LT' - }, - calendar : { - sameDay : '[à dag kl.] LT', - nextDay : '[à morgin kl.] LT', - nextWeek : 'dddd [kl.] LT', - lastDay : '[à gjár kl.] LT', - lastWeek : '[síðstu] dddd [kl] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'um %s', - past : '%s síðani', - s : 'fá sekund', - m : 'ein minutt', - mm : '%d minuttir', - h : 'ein tími', - hh : '%d tímar', - d : 'ein dagur', - dd : '%d dagar', - M : 'ein mánaði', - MM : '%d mánaðir', - y : 'eitt ár', - yy : '%d ár' - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : canadian french (fr-ca) -// author : Jonathan Abourbih : https://github.com/jonbca - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('fr-ca', { - months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), - monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), - weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), - weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), - weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'YYYY-MM-DD', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay: '[Aujourd\'hui à] LT', - nextDay: '[Demain à] LT', - nextWeek: 'dddd [à] LT', - lastDay: '[Hier à] LT', - lastWeek: 'dddd [dernier à] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'dans %s', - past : 'il y a %s', - s : 'quelques secondes', - m : 'une minute', - mm : '%d minutes', - h : 'une heure', - hh : '%d heures', - d : 'un jour', - dd : '%d jours', - M : 'un mois', - MM : '%d mois', - y : 'un an', - yy : '%d ans' - }, - ordinalParse: /\d{1,2}(er|)/, - ordinal : function (number) { - return number + (number === 1 ? 'er' : ''); - } - }); -})); - -// moment.js locale configuration -// locale : french (fr) -// author : John Fischer : https://github.com/jfroffice - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('fr', { - months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), - monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), - weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), - weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), - weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay: '[Aujourd\'hui à] LT', - nextDay: '[Demain à] LT', - nextWeek: 'dddd [à] LT', - lastDay: '[Hier à] LT', - lastWeek: 'dddd [dernier à] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'dans %s', - past : 'il y a %s', - s : 'quelques secondes', - m : 'une minute', - mm : '%d minutes', - h : 'une heure', - hh : '%d heures', - d : 'un jour', - dd : '%d jours', - M : 'un mois', - MM : '%d mois', - y : 'un an', - yy : '%d ans' - }, - ordinalParse: /\d{1,2}(er|)/, - ordinal : function (number) { - return number + (number === 1 ? 'er' : ''); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : frisian (fy) -// author : Robin van der Vliet : https://github.com/robin0van0der0v - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'), - monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'); - - return moment.defineLocale('fy', { - months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'), - monthsShort : function (m, format) { - if (/-MMM-/.test(format)) { - return monthsShortWithoutDots[m.month()]; - } else { - return monthsShortWithDots[m.month()]; - } - }, - weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'), - weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'), - weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD-MM-YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay: '[hjoed om] LT', - nextDay: '[moarn om] LT', - nextWeek: 'dddd [om] LT', - lastDay: '[juster om] LT', - lastWeek: '[ôfrûne] dddd [om] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'oer %s', - past : '%s lyn', - s : 'in pear sekonden', - m : 'ien minút', - mm : '%d minuten', - h : 'ien oere', - hh : '%d oeren', - d : 'ien dei', - dd : '%d dagen', - M : 'ien moanne', - MM : '%d moannen', - y : 'ien jier', - yy : '%d jierren' - }, - ordinalParse: /\d{1,2}(ste|de)/, - ordinal : function (number) { - return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : galician (gl) -// author : Juan G. Hurtado : https://github.com/juanghurtado - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('gl', { - months : 'Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro'.split('_'), - monthsShort : 'Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.'.split('_'), - weekdays : 'Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado'.split('_'), - weekdaysShort : 'Dom._Lun._Mar._Mér._Xov._Ven._Sáb.'.split('_'), - weekdaysMin : 'Do_Lu_Ma_Mé_Xo_Ve_Sá'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay : function () { - return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; - }, - nextDay : function () { - return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; - }, - nextWeek : function () { - return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; - }, - lastDay : function () { - return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT'; - }, - lastWeek : function () { - return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; - }, - sameElse : 'L' - }, - relativeTime : { - future : function (str) { - if (str === 'uns segundos') { - return 'nuns segundos'; - } - return 'en ' + str; - }, - past : 'hai %s', - s : 'uns segundos', - m : 'un minuto', - mm : '%d minutos', - h : 'unha hora', - hh : '%d horas', - d : 'un día', - dd : '%d días', - M : 'un mes', - MM : '%d meses', - y : 'un ano', - yy : '%d anos' - }, - ordinalParse : /\d{1,2}º/, - ordinal : '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : Hebrew (he) -// author : Tomer Cohen : https://github.com/tomer -// author : Moshe Simantov : https://github.com/DevelopmentIL -// author : Tal Ater : https://github.com/TalAter - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('he', { - months : 'ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר'.split('_'), - monthsShort : 'ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳'.split('_'), - weekdays : 'ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'), - weekdaysShort : '×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'), - weekdaysMin : '×_ב_×’_ד_×”_ו_ש'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D [ב]MMMM YYYY', - LLL : 'D [ב]MMMM YYYY LT', - LLLL : 'dddd, D [ב]MMMM YYYY LT', - l : 'D/M/YYYY', - ll : 'D MMM YYYY', - lll : 'D MMM YYYY LT', - llll : 'ddd, D MMM YYYY LT' - }, - calendar : { - sameDay : '[×”×™×•× ×‘Ö¾]LT', - nextDay : '[מחר ב־]LT', - nextWeek : 'dddd [בשעה] LT', - lastDay : '[×תמול ב־]LT', - lastWeek : '[ביו×] dddd [×”×חרון בשעה] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'בעוד %s', - past : 'לפני %s', - s : 'מספר שניות', - m : 'דקה', - mm : '%d דקות', - h : 'שעה', - hh : function (number) { - if (number === 2) { - return 'שעתיי×'; - } - return number + ' שעות'; - }, - d : 'יו×', - dd : function (number) { - if (number === 2) { - return 'יומיי×'; - } - return number + ' ימי×'; - }, - M : 'חודש', - MM : function (number) { - if (number === 2) { - return 'חודשיי×'; - } - return number + ' חודשי×'; - }, - y : 'שנה', - yy : function (number) { - if (number === 2) { - return 'שנתיי×'; - } else if (number % 10 === 0 && number !== 10) { - return number + ' שנה'; - } - return number + ' שני×'; - } - } - }); -})); - -// moment.js locale configuration -// locale : hindi (hi) -// author : Mayank Singhal : https://github.com/mayanksinghal - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var symbolMap = { - '1': '१', - '2': '२', - '3': '३', - '4': '४', - '5': '५', - '6': '६', - '7': '७', - '8': '८', - '9': '९', - '0': '०' - }, - numberMap = { - '१': '1', - '२': '2', - '३': '3', - '४': '4', - '५': '5', - '६': '6', - '७': '7', - '८': '8', - '९': '9', - '०': '0' - }; - - return moment.defineLocale('hi', { - months : 'जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°'.split('_'), - monthsShort : 'जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.'.split('_'), - weekdays : 'रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split('_'), - weekdaysShort : 'रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split('_'), - weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split('_'), - longDateFormat : { - LT : 'A h:mm बजे', - LTS : 'A h:mm:ss बजे', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, LT', - LLLL : 'dddd, D MMMM YYYY, LT' - }, - calendar : { - sameDay : '[आज] LT', - nextDay : '[कल] LT', - nextWeek : 'dddd, LT', - lastDay : '[कल] LT', - lastWeek : '[पिछले] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s में', - past : '%s पहले', - s : 'कà¥à¤› ही कà¥à¤·à¤£', - m : 'à¤à¤• मिनट', - mm : '%d मिनट', - h : 'à¤à¤• घंटा', - hh : '%d घंटे', - d : 'à¤à¤• दिन', - dd : '%d दिन', - M : 'à¤à¤• महीने', - MM : '%d महीने', - y : 'à¤à¤• वरà¥à¤·', - yy : '%d वरà¥à¤·' - }, - preparse: function (string) { - return string.replace(/[१२३४५६७८९०]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - // Hindi notation for meridiems are quite fuzzy in practice. While there exists - // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi. - meridiemParse: /रात|सà¥à¤¬à¤¹|दोपहर|शाम/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'रात') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'सà¥à¤¬à¤¹') { - return hour; - } else if (meridiem === 'दोपहर') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'शाम') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'रात'; - } else if (hour < 10) { - return 'सà¥à¤¬à¤¹'; - } else if (hour < 17) { - return 'दोपहर'; - } else if (hour < 20) { - return 'शाम'; - } else { - return 'रात'; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : hrvatski (hr) -// author : Bojan Marković : https://github.com/bmarkovic - -// based on (sl) translation by Robert SedovÅ¡ek - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - function translate(number, withoutSuffix, key) { - var result = number + ' '; - switch (key) { - case 'm': - return withoutSuffix ? 'jedna minuta' : 'jedne minute'; - case 'mm': - if (number === 1) { - result += 'minuta'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'minute'; - } else { - result += 'minuta'; - } - return result; - case 'h': - return withoutSuffix ? 'jedan sat' : 'jednog sata'; - case 'hh': - if (number === 1) { - result += 'sat'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'sata'; - } else { - result += 'sati'; - } - return result; - case 'dd': - if (number === 1) { - result += 'dan'; - } else { - result += 'dana'; - } - return result; - case 'MM': - if (number === 1) { - result += 'mjesec'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'mjeseca'; - } else { - result += 'mjeseci'; - } - return result; - case 'yy': - if (number === 1) { - result += 'godina'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'godine'; - } else { - result += 'godina'; - } - return result; - } - } - - return moment.defineLocale('hr', { - months : 'sjeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_'), - monthsShort : 'sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'), - weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota'.split('_'), - weekdaysShort : 'ned._pon._uto._sri._Äet._pet._sub.'.split('_'), - weekdaysMin : 'ne_po_ut_sr_Äe_pe_su'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'DD. MM. YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY LT', - LLLL : 'dddd, D. MMMM YYYY LT' - }, - calendar : { - sameDay : '[danas u] LT', - nextDay : '[sutra u] LT', - - nextWeek : function () { - switch (this.day()) { - case 0: - return '[u] [nedjelju] [u] LT'; - case 3: - return '[u] [srijedu] [u] LT'; - case 6: - return '[u] [subotu] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[u] dddd [u] LT'; - } - }, - lastDay : '[juÄer u] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - return '[proÅ¡lu] dddd [u] LT'; - case 6: - return '[proÅ¡le] [subote] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[proÅ¡li] dddd [u] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'za %s', - past : 'prije %s', - s : 'par sekundi', - m : translate, - mm : translate, - h : translate, - hh : translate, - d : 'dan', - dd : translate, - M : 'mjesec', - MM : translate, - y : 'godinu', - yy : translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : hungarian (hu) -// author : Adam Brunner : https://github.com/adambrunner - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var weekEndings = 'vasárnap hétfÅ‘n kedden szerdán csütörtökön pénteken szombaton'.split(' '); - - function translate(number, withoutSuffix, key, isFuture) { - var num = number, - suffix; - - switch (key) { - case 's': - return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce'; - case 'm': - return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce'); - case 'mm': - return num + (isFuture || withoutSuffix ? ' perc' : ' perce'); - case 'h': - return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája'); - case 'hh': - return num + (isFuture || withoutSuffix ? ' óra' : ' órája'); - case 'd': - return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja'); - case 'dd': - return num + (isFuture || withoutSuffix ? ' nap' : ' napja'); - case 'M': - return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); - case 'MM': - return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); - case 'y': - return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve'); - case 'yy': - return num + (isFuture || withoutSuffix ? ' év' : ' éve'); - } - - return ''; - } - - function week(isFuture) { - return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]'; - } - - return moment.defineLocale('hu', { - months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'), - monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'), - weekdays : 'vasárnap_hétfÅ‘_kedd_szerda_csütörtök_péntek_szombat'.split('_'), - weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'), - weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'YYYY.MM.DD.', - LL : 'YYYY. MMMM D.', - LLL : 'YYYY. MMMM D., LT', - LLLL : 'YYYY. MMMM D., dddd LT' - }, - meridiemParse: /de|du/i, - isPM: function (input) { - return input.charAt(1).toLowerCase() === 'u'; - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 12) { - return isLower === true ? 'de' : 'DE'; - } else { - return isLower === true ? 'du' : 'DU'; - } - }, - calendar : { - sameDay : '[ma] LT[-kor]', - nextDay : '[holnap] LT[-kor]', - nextWeek : function () { - return week.call(this, true); - }, - lastDay : '[tegnap] LT[-kor]', - lastWeek : function () { - return week.call(this, false); - }, - sameElse : 'L' - }, - relativeTime : { - future : '%s múlva', - past : '%s', - s : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : Armenian (hy-am) -// author : Armendarabyan : https://github.com/armendarabyan - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - function monthsCaseReplace(m, format) { - var months = { - 'nominative': 'Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€_Õ´Õ¡Ö€Õ¿_Õ¡ÕºÖ€Õ«Õ¬_Õ´Õ¡ÕµÕ«Õ½_Õ°Õ¸Ö‚Õ¶Õ«Õ½_Õ°Õ¸Ö‚Õ¬Õ«Õ½_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€'.split('_'), - 'accusative': 'Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€Õ«_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€Õ«_Õ´Õ¡Ö€Õ¿Õ«_Õ¡ÕºÖ€Õ«Õ¬Õ«_Õ´Õ¡ÕµÕ«Õ½Õ«_Õ°Õ¸Ö‚Õ¶Õ«Õ½Õ«_Õ°Õ¸Ö‚Õ¬Õ«Õ½Õ«_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½Õ«_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«'.split('_') - }, - - nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? - 'accusative' : - 'nominative'; - - return months[nounCase][m.month()]; - } - - function monthsShortCaseReplace(m, format) { - var monthsShort = 'Õ°Õ¶Õ¾_ÖƒÕ¿Ö€_Õ´Ö€Õ¿_Õ¡ÕºÖ€_Õ´ÕµÕ½_Õ°Õ¶Õ½_Õ°Õ¬Õ½_Ö…Õ£Õ½_Õ½ÕºÕ¿_Õ°Õ¯Õ¿_Õ¶Õ´Õ¢_Õ¤Õ¯Õ¿'.split('_'); - - return monthsShort[m.month()]; - } - - function weekdaysCaseReplace(m, format) { - var weekdays = 'Õ¯Õ«Ö€Õ¡Õ¯Õ«_Õ¥Ö€Õ¯Õ¸Ö‚Õ·Õ¡Õ¢Õ©Õ«_Õ¥Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ¹Õ¸Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ°Õ«Õ¶Õ£Õ·Õ¡Õ¢Õ©Õ«_Õ¸Ö‚Ö€Õ¢Õ¡Õ©_Õ·Õ¡Õ¢Õ¡Õ©'.split('_'); - - return weekdays[m.day()]; - } - - return moment.defineLocale('hy-am', { - months : monthsCaseReplace, - monthsShort : monthsShortCaseReplace, - weekdays : weekdaysCaseReplace, - weekdaysShort : 'Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©'.split('_'), - weekdaysMin : 'Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY Õ©.', - LLL : 'D MMMM YYYY Õ©., LT', - LLLL : 'dddd, D MMMM YYYY Õ©., LT' - }, - calendar : { - sameDay: '[Õ¡ÕµÕ½Ö…Ö€] LT', - nextDay: '[Õ¾Õ¡Õ²Õ¨] LT', - lastDay: '[Õ¥Ö€Õ¥Õ¯] LT', - nextWeek: function () { - return 'dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT'; - }, - lastWeek: function () { - return '[Õ¡Õ¶ÖÕ¡Õ®] dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT'; - }, - sameElse: 'L' - }, - relativeTime : { - future : '%s Õ°Õ¥Õ¿Õ¸', - past : '%s Õ¡Õ¼Õ¡Õ»', - s : 'Õ´Õ« Ö„Õ¡Õ¶Õ« Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶', - m : 'Ö€Õ¸ÕºÕ¥', - mm : '%d Ö€Õ¸ÕºÕ¥', - h : 'ÕªÕ¡Õ´', - hh : '%d ÕªÕ¡Õ´', - d : 'Ö…Ö€', - dd : '%d Ö…Ö€', - M : 'Õ¡Õ´Õ«Õ½', - MM : '%d Õ¡Õ´Õ«Õ½', - y : 'Õ¿Õ¡Ö€Õ«', - yy : '%d Õ¿Õ¡Ö€Õ«' - }, - - meridiemParse: /Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡|Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡|ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶/, - isPM: function (input) { - return /^(ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶)$/.test(input); - }, - meridiem : function (hour) { - if (hour < 4) { - return 'Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡'; - } else if (hour < 12) { - return 'Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡'; - } else if (hour < 17) { - return 'ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡'; - } else { - return 'Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶'; - } - }, - - ordinalParse: /\d{1,2}|\d{1,2}-(Õ«Õ¶|Ö€Õ¤)/, - ordinal: function (number, period) { - switch (period) { - case 'DDD': - case 'w': - case 'W': - case 'DDDo': - if (number === 1) { - return number + '-Õ«Õ¶'; - } - return number + '-Ö€Õ¤'; - default: - return number; - } - }, - - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : Bahasa Indonesia (id) -// author : Mohammad Satrio Utomo : https://github.com/tyok -// reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('id', { - months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des'.split('_'), - weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'), - weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'), - weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'), - longDateFormat : { - LT : 'HH.mm', - LTS : 'LT.ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY [pukul] LT', - LLLL : 'dddd, D MMMM YYYY [pukul] LT' - }, - meridiemParse: /pagi|siang|sore|malam/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'pagi') { - return hour; - } else if (meridiem === 'siang') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === 'sore' || meridiem === 'malam') { - return hour + 12; - } - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 11) { - return 'pagi'; - } else if (hours < 15) { - return 'siang'; - } else if (hours < 19) { - return 'sore'; - } else { - return 'malam'; - } - }, - calendar : { - sameDay : '[Hari ini pukul] LT', - nextDay : '[Besok pukul] LT', - nextWeek : 'dddd [pukul] LT', - lastDay : '[Kemarin pukul] LT', - lastWeek : 'dddd [lalu pukul] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'dalam %s', - past : '%s yang lalu', - s : 'beberapa detik', - m : 'semenit', - mm : '%d menit', - h : 'sejam', - hh : '%d jam', - d : 'sehari', - dd : '%d hari', - M : 'sebulan', - MM : '%d bulan', - y : 'setahun', - yy : '%d tahun' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : icelandic (is) -// author : Hinrik Örn Sigurðsson : https://github.com/hinrik - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - function plural(n) { - if (n % 100 === 11) { - return true; - } else if (n % 10 === 1) { - return false; - } - return true; - } - - function translate(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - switch (key) { - case 's': - return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum'; - case 'm': - return withoutSuffix ? 'mínúta' : 'mínútu'; - case 'mm': - if (plural(number)) { - return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum'); - } else if (withoutSuffix) { - return result + 'mínúta'; - } - return result + 'mínútu'; - case 'hh': - if (plural(number)) { - return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum'); - } - return result + 'klukkustund'; - case 'd': - if (withoutSuffix) { - return 'dagur'; - } - return isFuture ? 'dag' : 'degi'; - case 'dd': - if (plural(number)) { - if (withoutSuffix) { - return result + 'dagar'; - } - return result + (isFuture ? 'daga' : 'dögum'); - } else if (withoutSuffix) { - return result + 'dagur'; - } - return result + (isFuture ? 'dag' : 'degi'); - case 'M': - if (withoutSuffix) { - return 'mánuður'; - } - return isFuture ? 'mánuð' : 'mánuði'; - case 'MM': - if (plural(number)) { - if (withoutSuffix) { - return result + 'mánuðir'; - } - return result + (isFuture ? 'mánuði' : 'mánuðum'); - } else if (withoutSuffix) { - return result + 'mánuður'; - } - return result + (isFuture ? 'mánuð' : 'mánuði'); - case 'y': - return withoutSuffix || isFuture ? 'ár' : 'ári'; - case 'yy': - if (plural(number)) { - return result + (withoutSuffix || isFuture ? 'ár' : 'árum'); - } - return result + (withoutSuffix || isFuture ? 'ár' : 'ári'); - } - } - - return moment.defineLocale('is', { - months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'), - monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'), - weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'), - weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'), - weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY [kl.] LT', - LLLL : 'dddd, D. MMMM YYYY [kl.] LT' - }, - calendar : { - sameDay : '[í dag kl.] LT', - nextDay : '[á morgun kl.] LT', - nextWeek : 'dddd [kl.] LT', - lastDay : '[í gær kl.] LT', - lastWeek : '[síðasta] dddd [kl.] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'eftir %s', - past : 'fyrir %s síðan', - s : translate, - m : translate, - mm : translate, - h : 'klukkustund', - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : italian (it) -// author : Lorenzo : https://github.com/aliem -// author: Mattia Larentis: https://github.com/nostalgiaz - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('it', { - months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'), - monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'), - weekdays : 'Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato'.split('_'), - weekdaysShort : 'Dom_Lun_Mar_Mer_Gio_Ven_Sab'.split('_'), - weekdaysMin : 'D_L_Ma_Me_G_V_S'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay: '[Oggi alle] LT', - nextDay: '[Domani alle] LT', - nextWeek: 'dddd [alle] LT', - lastDay: '[Ieri alle] LT', - lastWeek: function () { - switch (this.day()) { - case 0: - return '[la scorsa] dddd [alle] LT'; - default: - return '[lo scorso] dddd [alle] LT'; - } - }, - sameElse: 'L' - }, - relativeTime : { - future : function (s) { - return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s; - }, - past : '%s fa', - s : 'alcuni secondi', - m : 'un minuto', - mm : '%d minuti', - h : 'un\'ora', - hh : '%d ore', - d : 'un giorno', - dd : '%d giorni', - M : 'un mese', - MM : '%d mesi', - y : 'un anno', - yy : '%d anni' - }, - ordinalParse : /\d{1,2}º/, - ordinal: '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : japanese (ja) -// author : LI Long : https://github.com/baryon - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('ja', { - months : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), - monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), - weekdays : '日曜日_月曜日_ç«æ›œæ—¥_水曜日_木曜日_金曜日_土曜日'.split('_'), - weekdaysShort : 'æ—¥_月_ç«_æ°´_木_金_土'.split('_'), - weekdaysMin : 'æ—¥_月_ç«_æ°´_木_金_土'.split('_'), - longDateFormat : { - LT : 'Ah時m分', - LTS : 'LTs秒', - L : 'YYYY/MM/DD', - LL : 'YYYYå¹´M月Dæ—¥', - LLL : 'YYYYå¹´M月Dæ—¥LT', - LLLL : 'YYYYå¹´M月Dæ—¥LT dddd' - }, - meridiemParse: /åˆå‰|åˆå¾Œ/i, - isPM : function (input) { - return input === 'åˆå¾Œ'; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'åˆå‰'; - } else { - return 'åˆå¾Œ'; - } - }, - calendar : { - sameDay : '[今日] LT', - nextDay : '[明日] LT', - nextWeek : '[æ¥é€±]dddd LT', - lastDay : '[昨日] LT', - lastWeek : '[å‰é€±]dddd LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s後', - past : '%så‰', - s : '数秒', - m : '1分', - mm : '%d分', - h : '1時間', - hh : '%d時間', - d : '1æ—¥', - dd : '%dæ—¥', - M : '1ヶ月', - MM : '%dヶ月', - y : '1å¹´', - yy : '%då¹´' - } - }); -})); - -// moment.js locale configuration -// locale : Georgian (ka) -// author : Irakli Janiashvili : https://github.com/irakli-janiashvili - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - function monthsCaseReplace(m, format) { - var months = { - 'nominative': 'იáƒáƒœáƒ•áƒáƒ áƒ˜_თებერვáƒáƒšáƒ˜_მáƒáƒ áƒ¢áƒ˜_áƒáƒžáƒ áƒ˜áƒšáƒ˜_მáƒáƒ˜áƒ¡áƒ˜_ივნისი_ივლისი_áƒáƒ’ვისტáƒ_სექტემბერი_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი_ნáƒáƒ”მბერი_დეკემბერი'.split('_'), - 'accusative': 'იáƒáƒœáƒ•áƒáƒ áƒ¡_თებერვáƒáƒšáƒ¡_მáƒáƒ áƒ¢áƒ¡_áƒáƒžáƒ áƒ˜áƒšáƒ˜áƒ¡_მáƒáƒ˜áƒ¡áƒ¡_ივნისს_ივლისს_áƒáƒ’ვისტს_სექტემბერს_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერს_ნáƒáƒ”მბერს_დეკემბერს'.split('_') - }, - - nounCase = (/D[oD] *MMMM?/).test(format) ? - 'accusative' : - 'nominative'; - - return months[nounCase][m.month()]; - } - - function weekdaysCaseReplace(m, format) { - var weekdays = { - 'nominative': 'კვირáƒ_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ი_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი_ხუთშáƒáƒ‘áƒáƒ—ი_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი_შáƒáƒ‘áƒáƒ—ი'.split('_'), - 'accusative': 'კვირáƒáƒ¡_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ს_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ს_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ს_ხუთშáƒáƒ‘áƒáƒ—ს_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვს_შáƒáƒ‘áƒáƒ—ს'.split('_') - }, - - nounCase = (/(წინáƒ|შემდეგ)/).test(format) ? - 'accusative' : - 'nominative'; - - return weekdays[nounCase][m.day()]; - } - - return moment.defineLocale('ka', { - months : monthsCaseReplace, - monthsShort : 'იáƒáƒœ_თებ_მáƒáƒ _áƒáƒžáƒ _მáƒáƒ˜_ივნ_ივლ_áƒáƒ’ვ_სექ_áƒáƒ¥áƒ¢_ნáƒáƒ”_დეკ'.split('_'), - weekdays : weekdaysCaseReplace, - weekdaysShort : 'კვი_áƒáƒ áƒ¨_სáƒáƒ›_áƒáƒ—ხ_ხუთ_პáƒáƒ _შáƒáƒ‘'.split('_'), - weekdaysMin : 'კვ_áƒáƒ _სáƒ_áƒáƒ—_ხუ_პáƒ_შáƒ'.split('_'), - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay : '[დღეს] LT[-ზე]', - nextDay : '[ხვáƒáƒš] LT[-ზე]', - lastDay : '[გუშინ] LT[-ზე]', - nextWeek : '[შემდეგ] dddd LT[-ზე]', - lastWeek : '[წინáƒ] dddd LT-ზე', - sameElse : 'L' - }, - relativeTime : { - future : function (s) { - return (/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|წელი)/).test(s) ? - s.replace(/ი$/, 'ში') : - s + 'ში'; - }, - past : function (s) { - if ((/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|დღე|თვე)/).test(s)) { - return s.replace(/(ი|ე)$/, 'ის წინ'); - } - if ((/წელი/).test(s)) { - return s.replace(/წელი$/, 'წლის წინ'); - } - }, - s : 'რáƒáƒ›áƒ“ენიმე წáƒáƒ›áƒ˜', - m : 'წუთი', - mm : '%d წუთი', - h : 'სáƒáƒáƒ—ი', - hh : '%d სáƒáƒáƒ—ი', - d : 'დღე', - dd : '%d დღე', - M : 'თვე', - MM : '%d თვე', - y : 'წელი', - yy : '%d წელი' - }, - ordinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/, - ordinal : function (number) { - if (number === 0) { - return number; - } - - if (number === 1) { - return number + '-ლი'; - } - - if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) { - return 'მე-' + number; - } - - return number + '-ე'; - }, - week : { - dow : 1, - doy : 7 - } - }); -})); - -// moment.js locale configuration -// locale : khmer (km) -// author : Kruy Vanna : https://github.com/kruyvanna - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('km', { - months: 'មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ'.split('_'), - monthsShort: 'មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ'.split('_'), - weekdays: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), - weekdaysShort: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), - weekdaysMin: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), - longDateFormat: { - LT: 'HH:mm', - LTS : 'LT:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY LT', - LLLL: 'dddd, D MMMM YYYY LT' - }, - calendar: { - sameDay: '[ážáŸ’ងៃនៈ ម៉ោង] LT', - nextDay: '[ស្អែក ម៉ោង] LT', - nextWeek: 'dddd [ម៉ោង] LT', - lastDay: '[ម្សិលមិញ ម៉ោង] LT', - lastWeek: 'dddd [សប្ážáž¶áž áŸáž˜áž»áž“] [ម៉ោង] LT', - sameElse: 'L' - }, - relativeTime: { - future: '%sទៀáž', - past: '%sមុន', - s: 'ប៉ុន្មានវិនាទី', - m: 'មួយនាទី', - mm: '%d នាទី', - h: 'មួយម៉ោង', - hh: '%d ម៉ោង', - d: 'មួយážáŸ’ងៃ', - dd: '%d ážáŸ’ងៃ', - M: 'មួយážáŸ‚', - MM: '%d ážáŸ‚', - y: 'មួយឆ្នាំ', - yy: '%d ឆ្នាំ' - }, - week: { - dow: 1, // Monday is the first day of the week. - doy: 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : korean (ko) -// -// authors -// -// - Kyungwook, Park : https://github.com/kyungw00k -// - Jeeeyul Lee -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('ko', { - months : '1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”'.split('_'), - monthsShort : '1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”'.split('_'), - weekdays : 'ì¼ìš”ì¼_월요ì¼_화요ì¼_수요ì¼_목요ì¼_금요ì¼_토요ì¼'.split('_'), - weekdaysShort : 'ì¼_ì›”_í™”_수_목_금_토'.split('_'), - weekdaysMin : 'ì¼_ì›”_í™”_수_목_금_토'.split('_'), - longDateFormat : { - LT : 'A hì‹œ m분', - LTS : 'A hì‹œ m분 sì´ˆ', - L : 'YYYY.MM.DD', - LL : 'YYYYë…„ MMMM Dì¼', - LLL : 'YYYYë…„ MMMM Dì¼ LT', - LLLL : 'YYYYë…„ MMMM Dì¼ dddd LT' - }, - calendar : { - sameDay : '오늘 LT', - nextDay : 'ë‚´ì¼ LT', - nextWeek : 'dddd LT', - lastDay : 'ì–´ì œ LT', - lastWeek : '지난주 dddd LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s 후', - past : '%s ì „', - s : '몇초', - ss : '%dì´ˆ', - m : 'ì¼ë¶„', - mm : '%d분', - h : '한시간', - hh : '%d시간', - d : '하루', - dd : '%dì¼', - M : '한달', - MM : '%d달', - y : 'ì¼ë…„', - yy : '%dë…„' - }, - ordinalParse : /\d{1,2}ì¼/, - ordinal : '%dì¼', - meridiemParse : /오전|오후/, - isPM : function (token) { - return token === '오후'; - }, - meridiem : function (hour, minute, isUpper) { - return hour < 12 ? '오전' : '오후'; - } - }); -})); - -// moment.js locale configuration -// locale : Luxembourgish (lb) -// author : mweimerskirch : https://github.com/mweimerskirch, David Raison : https://github.com/kwisatz - -// Note: Luxembourgish has a very particular phonological rule ('Eifeler Regel') that causes the -// deletion of the final 'n' in certain contexts. That's what the 'eifelerRegelAppliesToWeekday' -// and 'eifelerRegelAppliesToNumber' methods are meant for - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 'm': ['eng Minutt', 'enger Minutt'], - 'h': ['eng Stonn', 'enger Stonn'], - 'd': ['een Dag', 'engem Dag'], - 'M': ['ee Mount', 'engem Mount'], - 'y': ['ee Joer', 'engem Joer'] - }; - return withoutSuffix ? format[key][0] : format[key][1]; - } - - function processFutureTime(string) { - var number = string.substr(0, string.indexOf(' ')); - if (eifelerRegelAppliesToNumber(number)) { - return 'a ' + string; - } - return 'an ' + string; - } - - function processPastTime(string) { - var number = string.substr(0, string.indexOf(' ')); - if (eifelerRegelAppliesToNumber(number)) { - return 'viru ' + string; - } - return 'virun ' + string; - } - - /** - * Returns true if the word before the given number loses the '-n' ending. - * e.g. 'an 10 Deeg' but 'a 5 Deeg' - * - * @param number {integer} - * @returns {boolean} - */ - function eifelerRegelAppliesToNumber(number) { - number = parseInt(number, 10); - if (isNaN(number)) { - return false; - } - if (number < 0) { - // Negative Number --> always true - return true; - } else if (number < 10) { - // Only 1 digit - if (4 <= number && number <= 7) { - return true; - } - return false; - } else if (number < 100) { - // 2 digits - var lastDigit = number % 10, firstDigit = number / 10; - if (lastDigit === 0) { - return eifelerRegelAppliesToNumber(firstDigit); - } - return eifelerRegelAppliesToNumber(lastDigit); - } else if (number < 10000) { - // 3 or 4 digits --> recursively check first digit - while (number >= 10) { - number = number / 10; - } - return eifelerRegelAppliesToNumber(number); - } else { - // Anything larger than 4 digits: recursively check first n-3 digits - number = number / 1000; - return eifelerRegelAppliesToNumber(number); - } - } - - return moment.defineLocale('lb', { - months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), - monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), - weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'), - weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'), - weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'), - longDateFormat: { - LT: 'H:mm [Auer]', - LTS: 'H:mm:ss [Auer]', - L: 'DD.MM.YYYY', - LL: 'D. MMMM YYYY', - LLL: 'D. MMMM YYYY LT', - LLLL: 'dddd, D. MMMM YYYY LT' - }, - calendar: { - sameDay: '[Haut um] LT', - sameElse: 'L', - nextDay: '[Muer um] LT', - nextWeek: 'dddd [um] LT', - lastDay: '[Gëschter um] LT', - lastWeek: function () { - // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule - switch (this.day()) { - case 2: - case 4: - return '[Leschten] dddd [um] LT'; - default: - return '[Leschte] dddd [um] LT'; - } - } - }, - relativeTime : { - future : processFutureTime, - past : processPastTime, - s : 'e puer Sekonnen', - m : processRelativeTime, - mm : '%d Minutten', - h : processRelativeTime, - hh : '%d Stonnen', - d : processRelativeTime, - dd : '%d Deeg', - M : processRelativeTime, - MM : '%d Méint', - y : processRelativeTime, - yy : '%d Joer' - }, - ordinalParse: /\d{1,2}\./, - ordinal: '%d.', - week: { - dow: 1, // Monday is the first day of the week. - doy: 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : Lithuanian (lt) -// author : Mindaugas MozÅ«ras : https://github.com/mmozuras - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var units = { - 'm' : 'minutÄ—_minutÄ—s_minutÄ™', - 'mm': 'minutÄ—s_minuÄių_minutes', - 'h' : 'valanda_valandos_valandÄ…', - 'hh': 'valandos_valandų_valandas', - 'd' : 'diena_dienos_dienÄ…', - 'dd': 'dienos_dienų_dienas', - 'M' : 'mÄ—nuo_mÄ—nesio_mÄ—nesį', - 'MM': 'mÄ—nesiai_mÄ—nesių_mÄ—nesius', - 'y' : 'metai_metų_metus', - 'yy': 'metai_metų_metus' - }, - weekDays = 'sekmadienis_pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis'.split('_'); - - function translateSeconds(number, withoutSuffix, key, isFuture) { - if (withoutSuffix) { - return 'kelios sekundÄ—s'; - } else { - return isFuture ? 'kelių sekundžių' : 'kelias sekundes'; - } - } - - function translateSingular(number, withoutSuffix, key, isFuture) { - return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]); - } - - function special(number) { - return number % 10 === 0 || (number > 10 && number < 20); - } - - function forms(key) { - return units[key].split('_'); - } - - function translate(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - if (number === 1) { - return result + translateSingular(number, withoutSuffix, key[0], isFuture); - } else if (withoutSuffix) { - return result + (special(number) ? forms(key)[1] : forms(key)[0]); - } else { - if (isFuture) { - return result + forms(key)[1]; - } else { - return result + (special(number) ? forms(key)[1] : forms(key)[2]); - } - } - } - - function relativeWeekDay(moment, format) { - var nominative = format.indexOf('dddd HH:mm') === -1, - weekDay = weekDays[moment.day()]; - - return nominative ? weekDay : weekDay.substring(0, weekDay.length - 2) + 'į'; - } - - return moment.defineLocale('lt', { - months : 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio'.split('_'), - monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'), - weekdays : relativeWeekDay, - weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Å eÅ¡'.split('_'), - weekdaysMin : 'S_P_A_T_K_Pn_Å '.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'YYYY-MM-DD', - LL : 'YYYY [m.] MMMM D [d.]', - LLL : 'YYYY [m.] MMMM D [d.], LT [val.]', - LLLL : 'YYYY [m.] MMMM D [d.], dddd, LT [val.]', - l : 'YYYY-MM-DD', - ll : 'YYYY [m.] MMMM D [d.]', - lll : 'YYYY [m.] MMMM D [d.], LT [val.]', - llll : 'YYYY [m.] MMMM D [d.], ddd, LT [val.]' - }, - calendar : { - sameDay : '[Å iandien] LT', - nextDay : '[Rytoj] LT', - nextWeek : 'dddd LT', - lastDay : '[Vakar] LT', - lastWeek : '[PraÄ—jusį] dddd LT', - sameElse : 'L' - }, - relativeTime : { - future : 'po %s', - past : 'prieÅ¡ %s', - s : translateSeconds, - m : translateSingular, - mm : translate, - h : translateSingular, - hh : translate, - d : translateSingular, - dd : translate, - M : translateSingular, - MM : translate, - y : translateSingular, - yy : translate - }, - ordinalParse: /\d{1,2}-oji/, - ordinal : function (number) { - return number + '-oji'; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : latvian (lv) -// author : Kristaps Karlsons : https://github.com/skakri - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var units = { - 'mm': 'minÅ«ti_minÅ«tes_minÅ«te_minÅ«tes', - 'hh': 'stundu_stundas_stunda_stundas', - 'dd': 'dienu_dienas_diena_dienas', - 'MM': 'mÄ“nesi_mÄ“neÅ¡us_mÄ“nesis_mÄ“neÅ¡i', - 'yy': 'gadu_gadus_gads_gadi' - }; - - function format(word, number, withoutSuffix) { - var forms = word.split('_'); - if (withoutSuffix) { - return number % 10 === 1 && number !== 11 ? forms[2] : forms[3]; - } else { - return number % 10 === 1 && number !== 11 ? forms[0] : forms[1]; - } - } - - function relativeTimeWithPlural(number, withoutSuffix, key) { - return number + ' ' + format(units[key], number, withoutSuffix); - } - - return moment.defineLocale('lv', { - months : 'janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris'.split('_'), - monthsShort : 'jan_feb_mar_apr_mai_jÅ«n_jÅ«l_aug_sep_okt_nov_dec'.split('_'), - weekdays : 'svÄ“tdiena_pirmdiena_otrdiena_treÅ¡diena_ceturtdiena_piektdiena_sestdiena'.split('_'), - weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'), - weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'YYYY. [gada] D. MMMM', - LLL : 'YYYY. [gada] D. MMMM, LT', - LLLL : 'YYYY. [gada] D. MMMM, dddd, LT' - }, - calendar : { - sameDay : '[Å odien pulksten] LT', - nextDay : '[RÄ«t pulksten] LT', - nextWeek : 'dddd [pulksten] LT', - lastDay : '[Vakar pulksten] LT', - lastWeek : '[PagÄjuÅ¡Ä] dddd [pulksten] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s vÄ“lÄk', - past : '%s agrÄk', - s : 'dažas sekundes', - m : 'minÅ«ti', - mm : relativeTimeWithPlural, - h : 'stundu', - hh : relativeTimeWithPlural, - d : 'dienu', - dd : relativeTimeWithPlural, - M : 'mÄ“nesi', - MM : relativeTimeWithPlural, - y : 'gadu', - yy : relativeTimeWithPlural - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : macedonian (mk) -// author : Borislav Mickov : https://github.com/B0k0 - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('mk', { - months : 'јануари_февруари_март_април_мај_јуни_јули_авгуÑÑ‚_Ñептември_октомври_ноември_декември'.split('_'), - monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_Ñеп_окт_ное_дек'.split('_'), - weekdays : 'недела_понеделник_вторник_Ñреда_четврток_петок_Ñабота'.split('_'), - weekdaysShort : 'нед_пон_вто_Ñре_чет_пет_Ñаб'.split('_'), - weekdaysMin : 'нe_пo_вт_ÑÑ€_че_пе_Ña'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'D.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay : '[Ð”ÐµÐ½ÐµÑ Ð²Ð¾] LT', - nextDay : '[Утре во] LT', - nextWeek : 'dddd [во] LT', - lastDay : '[Вчера во] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - case 6: - return '[Во изминатата] dddd [во] LT'; - case 1: - case 2: - case 4: - case 5: - return '[Во изминатиот] dddd [во] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'поÑле %s', - past : 'пред %s', - s : 'неколку Ñекунди', - m : 'минута', - mm : '%d минути', - h : 'чаÑ', - hh : '%d чаÑа', - d : 'ден', - dd : '%d дена', - M : 'меÑец', - MM : '%d меÑеци', - y : 'година', - yy : '%d години' - }, - ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, - ordinal : function (number) { - var lastDigit = number % 10, - last2Digits = number % 100; - if (number === 0) { - return number + '-ев'; - } else if (last2Digits === 0) { - return number + '-ен'; - } else if (last2Digits > 10 && last2Digits < 20) { - return number + '-ти'; - } else if (lastDigit === 1) { - return number + '-ви'; - } else if (lastDigit === 2) { - return number + '-ри'; - } else if (lastDigit === 7 || lastDigit === 8) { - return number + '-ми'; - } else { - return number + '-ти'; - } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : malayalam (ml) -// author : Floyd Pink : https://github.com/floydpink - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('ml', { - months : 'ജനàµà´µà´°à´¿_ഫെബàµà´°àµà´µà´°à´¿_മാർചàµà´šàµ_à´à´ªàµà´°à´¿àµ½_മേയàµ_ജൂൺ_ജൂലൈ_à´“à´—à´¸àµà´±àµà´±àµ_സെപàµà´±àµà´±à´‚ബർ_à´’à´•àµà´Ÿàµ‹à´¬àµ¼_നവംബർ_ഡിസംബർ'.split('_'), - monthsShort : 'ജനàµ._ഫെബàµà´°àµ._മാർ._à´à´ªàµà´°à´¿._മേയàµ_ജൂൺ_ജൂലൈ._à´“à´—._സെപàµà´±àµà´±._à´’à´•àµà´Ÿàµ‹._നവം._ഡിസം.'.split('_'), - weekdays : 'ഞായറാഴàµà´š_തിങàµà´•à´³à´¾à´´àµà´š_ചൊവàµà´µà´¾à´´àµà´š_à´¬àµà´§à´¨à´¾à´´àµà´š_à´µàµà´¯à´¾à´´à´¾à´´àµà´š_വെളàµà´³à´¿à´¯à´¾à´´àµà´š_ശനിയാഴàµà´š'.split('_'), - weekdaysShort : 'ഞായർ_തിങàµà´•àµ¾_ചൊവàµà´µ_à´¬àµà´§àµ»_à´µàµà´¯à´¾à´´à´‚_വെളàµà´³à´¿_ശനി'.split('_'), - weekdaysMin : 'à´žà´¾_തി_ചൊ_à´¬àµ_à´µàµà´¯à´¾_വെ_à´¶'.split('_'), - longDateFormat : { - LT : 'A h:mm -à´¨àµ', - LTS : 'A h:mm:ss -à´¨àµ', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, LT', - LLLL : 'dddd, D MMMM YYYY, LT' - }, - calendar : { - sameDay : '[ഇനàµà´¨àµ] LT', - nextDay : '[നാളെ] LT', - nextWeek : 'dddd, LT', - lastDay : '[ഇനàµà´¨à´²àµ†] LT', - lastWeek : '[à´•à´´à´¿à´žàµà´ž] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s à´•à´´à´¿à´žàµà´žàµ', - past : '%s à´®àµàµ»à´ªàµ', - s : 'അൽപ നിമിഷങàµà´™àµ¾', - m : 'ഒരൠമിനിറàµà´±àµ', - mm : '%d മിനിറàµà´±àµ', - h : 'ഒരൠമണികàµà´•àµ‚ർ', - hh : '%d മണികàµà´•àµ‚ർ', - d : 'ഒരൠദിവസം', - dd : '%d ദിവസം', - M : 'ഒരൠമാസം', - MM : '%d മാസം', - y : 'ഒരൠവർഷം', - yy : '%d വർഷം' - }, - meridiemParse: /രാതàµà´°à´¿|രാവിലെ|ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿/i, - isPM : function (input) { - return /^(ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'രാതàµà´°à´¿'; - } else if (hour < 12) { - return 'രാവിലെ'; - } else if (hour < 17) { - return 'ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ'; - } else if (hour < 20) { - return 'വൈകàµà´¨àµà´¨àµ‡à´°à´‚'; - } else { - return 'രാതàµà´°à´¿'; - } - } - }); -})); - -// moment.js locale configuration -// locale : Marathi (mr) -// author : Harshad Kale : https://github.com/kalehv - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var symbolMap = { - '1': '१', - '2': '२', - '3': '३', - '4': '४', - '5': '५', - '6': '६', - '7': '७', - '8': '८', - '9': '९', - '0': '०' - }, - numberMap = { - '१': '1', - '२': '2', - '३': '3', - '४': '4', - '५': '5', - '६': '6', - '७': '7', - '८': '8', - '९': '9', - '०': '0' - }; - - return moment.defineLocale('mr', { - months : 'जानेवारी_फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€_मारà¥à¤š_à¤à¤ªà¥à¤°à¤¿à¤²_मे_जून_जà¥à¤²à¥ˆ_ऑगसà¥à¤Ÿ_सपà¥à¤Ÿà¥‡à¤‚बर_ऑकà¥à¤Ÿà¥‹à¤¬à¤°_नोवà¥à¤¹à¥‡à¤‚बर_डिसेंबर'.split('_'), - monthsShort: 'जाने._फेबà¥à¤°à¥._मारà¥à¤š._à¤à¤ªà¥à¤°à¤¿._मे._जून._जà¥à¤²à¥ˆ._ऑग._सपà¥à¤Ÿà¥‡à¤‚._ऑकà¥à¤Ÿà¥‹._नोवà¥à¤¹à¥‡à¤‚._डिसें.'.split('_'), - weekdays : 'रविवार_सोमवार_मंगळवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split('_'), - weekdaysShort : 'रवि_सोम_मंगळ_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split('_'), - weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split('_'), - longDateFormat : { - LT : 'A h:mm वाजता', - LTS : 'A h:mm:ss वाजता', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, LT', - LLLL : 'dddd, D MMMM YYYY, LT' - }, - calendar : { - sameDay : '[आज] LT', - nextDay : '[उदà¥à¤¯à¤¾] LT', - nextWeek : 'dddd, LT', - lastDay : '[काल] LT', - lastWeek: '[मागील] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s नंतर', - past : '%s पूरà¥à¤µà¥€', - s : 'सेकंद', - m: 'à¤à¤• मिनिट', - mm: '%d मिनिटे', - h : 'à¤à¤• तास', - hh : '%d तास', - d : 'à¤à¤• दिवस', - dd : '%d दिवस', - M : 'à¤à¤• महिना', - MM : '%d महिने', - y : 'à¤à¤• वरà¥à¤·', - yy : '%d वरà¥à¤·à¥‡' - }, - preparse: function (string) { - return string.replace(/[१२३४५६७८९०]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - meridiemParse: /रातà¥à¤°à¥€|सकाळी|दà¥à¤ªà¤¾à¤°à¥€|सायंकाळी/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'रातà¥à¤°à¥€') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'सकाळी') { - return hour; - } else if (meridiem === 'दà¥à¤ªà¤¾à¤°à¥€') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'सायंकाळी') { - return hour + 12; - } - }, - meridiem: function (hour, minute, isLower) - { - if (hour < 4) { - return 'रातà¥à¤°à¥€'; - } else if (hour < 10) { - return 'सकाळी'; - } else if (hour < 17) { - return 'दà¥à¤ªà¤¾à¤°à¥€'; - } else if (hour < 20) { - return 'सायंकाळी'; - } else { - return 'रातà¥à¤°à¥€'; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : Bahasa Malaysia (ms-MY) -// author : Weldan Jamili : https://github.com/weldan - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('ms-my', { - months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), - monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), - weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), - weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), - weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), - longDateFormat : { - LT : 'HH.mm', - LTS : 'LT.ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY [pukul] LT', - LLLL : 'dddd, D MMMM YYYY [pukul] LT' - }, - meridiemParse: /pagi|tengahari|petang|malam/, - meridiemHour: function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'pagi') { - return hour; - } else if (meridiem === 'tengahari') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === 'petang' || meridiem === 'malam') { - return hour + 12; - } - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 11) { - return 'pagi'; - } else if (hours < 15) { - return 'tengahari'; - } else if (hours < 19) { - return 'petang'; - } else { - return 'malam'; - } - }, - calendar : { - sameDay : '[Hari ini pukul] LT', - nextDay : '[Esok pukul] LT', - nextWeek : 'dddd [pukul] LT', - lastDay : '[Kelmarin pukul] LT', - lastWeek : 'dddd [lepas pukul] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'dalam %s', - past : '%s yang lepas', - s : 'beberapa saat', - m : 'seminit', - mm : '%d minit', - h : 'sejam', - hh : '%d jam', - d : 'sehari', - dd : '%d hari', - M : 'sebulan', - MM : '%d bulan', - y : 'setahun', - yy : '%d tahun' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : Burmese (my) -// author : Squar team, mysquar.com - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var symbolMap = { - '1': 'á', - '2': 'á‚', - '3': 'áƒ', - '4': 'á„', - '5': 'á…', - '6': 'á†', - '7': 'á‡', - '8': 'áˆ', - '9': 'á‰', - '0': 'á€' - }, numberMap = { - 'á': '1', - 'á‚': '2', - 'áƒ': '3', - 'á„': '4', - 'á…': '5', - 'á†': '6', - 'á‡': '7', - 'áˆ': '8', - 'á‰': '9', - 'á€': '0' - }; - return moment.defineLocale('my', { - months: 'ဇန်နá€á€«á€›á€®_ဖေဖော်á€á€«á€›á€®_မá€á€º_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုá€á€º_စက်á€á€„်ဘာ_အောက်á€á€­á€¯á€˜á€¬_နိုá€á€„်ဘာ_ဒီဇင်ဘာ'.split('_'), - monthsShort: 'ဇန်_ဖေ_မá€á€º_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'), - weekdays: 'á€á€”င်္ဂနွေ_á€á€”င်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပá€á€±á€¸_သောကြာ_စနေ'.split('_'), - weekdaysShort: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), - weekdaysMin: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), - longDateFormat: { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY LT', - LLLL: 'dddd D MMMM YYYY LT' - }, - calendar: { - sameDay: '[ယနေ.] LT [မှာ]', - nextDay: '[မနက်ဖြန်] LT [မှာ]', - nextWeek: 'dddd LT [မှာ]', - lastDay: '[မနေ.က] LT [မှာ]', - lastWeek: '[ပြီးá€á€²á€·á€žá€±á€¬] dddd LT [မှာ]', - sameElse: 'L' - }, - relativeTime: { - future: 'လာမည့် %s မှာ', - past: 'လွန်á€á€²á€·á€žá€±á€¬ %s က', - s: 'စက္ကန်.အနည်းငယ်', - m: 'á€á€…်မိနစ်', - mm: '%d မိနစ်', - h: 'á€á€…်နာရီ', - hh: '%d နာရီ', - d: 'á€á€…်ရက်', - dd: '%d ရက်', - M: 'á€á€…်လ', - MM: '%d လ', - y: 'á€á€…်နှစ်', - yy: '%d နှစ်' - }, - preparse: function (string) { - return string.replace(/[áá‚áƒá„á…á†á‡áˆá‰á€]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - week: { - dow: 1, // Monday is the first day of the week. - doy: 4 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : norwegian bokmÃ¥l (nb) -// authors : Espen Hovlandsdal : https://github.com/rexxars -// Sigurd Gartmann : https://github.com/sigurdga - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('nb', { - months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), - monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), - weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), - weekdaysShort : 'søn_man_tirs_ons_tors_fre_lør'.split('_'), - weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), - longDateFormat : { - LT : 'H.mm', - LTS : 'LT.ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY [kl.] LT', - LLLL : 'dddd D. MMMM YYYY [kl.] LT' - }, - calendar : { - sameDay: '[i dag kl.] LT', - nextDay: '[i morgen kl.] LT', - nextWeek: 'dddd [kl.] LT', - lastDay: '[i gÃ¥r kl.] LT', - lastWeek: '[forrige] dddd [kl.] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'om %s', - past : 'for %s siden', - s : 'noen sekunder', - m : 'ett minutt', - mm : '%d minutter', - h : 'en time', - hh : '%d timer', - d : 'en dag', - dd : '%d dager', - M : 'en mÃ¥ned', - MM : '%d mÃ¥neder', - y : 'ett Ã¥r', - yy : '%d Ã¥r' - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : nepali/nepalese -// author : suvash : https://github.com/suvash - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var symbolMap = { - '1': '१', - '2': '२', - '3': '३', - '4': '४', - '5': '५', - '6': '६', - '7': '७', - '8': '८', - '9': '९', - '0': '०' - }, - numberMap = { - '१': '1', - '२': '2', - '३': '3', - '४': '4', - '५': '5', - '६': '6', - '७': '7', - '८': '8', - '९': '9', - '०': '0' - }; - - return moment.defineLocale('ne', { - months : 'जनवरी_फेबà¥à¤°à¥à¤µà¤°à¥€_मारà¥à¤š_अपà¥à¤°à¤¿à¤²_मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ_अगषà¥à¤Ÿ_सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°_अकà¥à¤Ÿà¥‹à¤¬à¤°_नोभेमà¥à¤¬à¤°_डिसेमà¥à¤¬à¤°'.split('_'), - monthsShort : 'जन._फेबà¥à¤°à¥._मारà¥à¤š_अपà¥à¤°à¤¿._मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ._अग._सेपà¥à¤Ÿ._अकà¥à¤Ÿà¥‹._नोभे._डिसे.'.split('_'), - weekdays : 'आइतबार_सोमबार_मङà¥à¤—लबार_बà¥à¤§à¤¬à¤¾à¤°_बिहिबार_शà¥à¤•à¥à¤°à¤¬à¤¾à¤°_शनिबार'.split('_'), - weekdaysShort : 'आइत._सोम._मङà¥à¤—ल._बà¥à¤§._बिहि._शà¥à¤•à¥à¤°._शनि.'.split('_'), - weekdaysMin : 'आइ._सो._मङà¥_बà¥._बि._शà¥._श.'.split('_'), - longDateFormat : { - LT : 'Aको h:mm बजे', - LTS : 'Aको h:mm:ss बजे', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, LT', - LLLL : 'dddd, D MMMM YYYY, LT' - }, - preparse: function (string) { - return string.replace(/[१२३४५६७८९०]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - meridiemParse: /राती|बिहान|दिउà¤à¤¸à¥‹|बेलà¥à¤•à¤¾|साà¤à¤|राती/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'राती') { - return hour < 3 ? hour : hour + 12; - } else if (meridiem === 'बिहान') { - return hour; - } else if (meridiem === 'दिउà¤à¤¸à¥‹') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'बेलà¥à¤•à¤¾' || meridiem === 'साà¤à¤') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 3) { - return 'राती'; - } else if (hour < 10) { - return 'बिहान'; - } else if (hour < 15) { - return 'दिउà¤à¤¸à¥‹'; - } else if (hour < 18) { - return 'बेलà¥à¤•à¤¾'; - } else if (hour < 20) { - return 'साà¤à¤'; - } else { - return 'राती'; - } - }, - calendar : { - sameDay : '[आज] LT', - nextDay : '[भोली] LT', - nextWeek : '[आउà¤à¤¦à¥‹] dddd[,] LT', - lastDay : '[हिजो] LT', - lastWeek : '[गà¤à¤•à¥‹] dddd[,] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%sमा', - past : '%s अगाडी', - s : 'केही समय', - m : 'à¤à¤• मिनेट', - mm : '%d मिनेट', - h : 'à¤à¤• घणà¥à¤Ÿà¤¾', - hh : '%d घणà¥à¤Ÿà¤¾', - d : 'à¤à¤• दिन', - dd : '%d दिन', - M : 'à¤à¤• महिना', - MM : '%d महिना', - y : 'à¤à¤• बरà¥à¤·', - yy : '%d बरà¥à¤·' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : dutch (nl) -// author : Joris Röling : https://github.com/jjupiter - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), - monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); - - return moment.defineLocale('nl', { - months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), - monthsShort : function (m, format) { - if (/-MMM-/.test(format)) { - return monthsShortWithoutDots[m.month()]; - } else { - return monthsShortWithDots[m.month()]; - } - }, - weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), - weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), - weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD-MM-YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay: '[vandaag om] LT', - nextDay: '[morgen om] LT', - nextWeek: 'dddd [om] LT', - lastDay: '[gisteren om] LT', - lastWeek: '[afgelopen] dddd [om] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'over %s', - past : '%s geleden', - s : 'een paar seconden', - m : 'één minuut', - mm : '%d minuten', - h : 'één uur', - hh : '%d uur', - d : 'één dag', - dd : '%d dagen', - M : 'één maand', - MM : '%d maanden', - y : 'één jaar', - yy : '%d jaar' - }, - ordinalParse: /\d{1,2}(ste|de)/, - ordinal : function (number) { - return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : norwegian nynorsk (nn) -// author : https://github.com/mechuwind - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('nn', { - months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), - monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), - weekdays : 'sundag_mÃ¥ndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'), - weekdaysShort : 'sun_mÃ¥n_tys_ons_tor_fre_lau'.split('_'), - weekdaysMin : 'su_mÃ¥_ty_on_to_fr_lø'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay: '[I dag klokka] LT', - nextDay: '[I morgon klokka] LT', - nextWeek: 'dddd [klokka] LT', - lastDay: '[I gÃ¥r klokka] LT', - lastWeek: '[FøregÃ¥ande] dddd [klokka] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'om %s', - past : 'for %s sidan', - s : 'nokre sekund', - m : 'eit minutt', - mm : '%d minutt', - h : 'ein time', - hh : '%d timar', - d : 'ein dag', - dd : '%d dagar', - M : 'ein mÃ¥nad', - MM : '%d mÃ¥nader', - y : 'eit Ã¥r', - yy : '%d Ã¥r' - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : polish (pl) -// author : Rafal Hirsz : https://github.com/evoL - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var monthsNominative = 'styczeÅ„_luty_marzec_kwiecieÅ„_maj_czerwiec_lipiec_sierpieÅ„_wrzesieÅ„_październik_listopad_grudzieÅ„'.split('_'), - monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrzeÅ›nia_października_listopada_grudnia'.split('_'); - - function plural(n) { - return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1); - } - - function translate(number, withoutSuffix, key) { - var result = number + ' '; - switch (key) { - case 'm': - return withoutSuffix ? 'minuta' : 'minutÄ™'; - case 'mm': - return result + (plural(number) ? 'minuty' : 'minut'); - case 'h': - return withoutSuffix ? 'godzina' : 'godzinÄ™'; - case 'hh': - return result + (plural(number) ? 'godziny' : 'godzin'); - case 'MM': - return result + (plural(number) ? 'miesiÄ…ce' : 'miesiÄ™cy'); - case 'yy': - return result + (plural(number) ? 'lata' : 'lat'); - } - } - - return moment.defineLocale('pl', { - months : function (momentToFormat, format) { - if (/D MMMM/.test(format)) { - return monthsSubjective[momentToFormat.month()]; - } else { - return monthsNominative[momentToFormat.month()]; - } - }, - monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'), - weekdays : 'niedziela_poniedziaÅ‚ek_wtorek_Å›roda_czwartek_piÄ…tek_sobota'.split('_'), - weekdaysShort : 'nie_pon_wt_Å›r_czw_pt_sb'.split('_'), - weekdaysMin : 'N_Pn_Wt_Åšr_Cz_Pt_So'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay: '[DziÅ› o] LT', - nextDay: '[Jutro o] LT', - nextWeek: '[W] dddd [o] LT', - lastDay: '[Wczoraj o] LT', - lastWeek: function () { - switch (this.day()) { - case 0: - return '[W zeszÅ‚Ä… niedzielÄ™ o] LT'; - case 3: - return '[W zeszÅ‚Ä… Å›rodÄ™ o] LT'; - case 6: - return '[W zeszÅ‚Ä… sobotÄ™ o] LT'; - default: - return '[W zeszÅ‚y] dddd [o] LT'; - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'za %s', - past : '%s temu', - s : 'kilka sekund', - m : translate, - mm : translate, - h : translate, - hh : translate, - d : '1 dzieÅ„', - dd : '%d dni', - M : 'miesiÄ…c', - MM : translate, - y : 'rok', - yy : translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : brazilian portuguese (pt-br) -// author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('pt-br', { - months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), - monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), - weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'), - weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'), - weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY [às] LT', - LLLL : 'dddd, D [de] MMMM [de] YYYY [às] LT' - }, - calendar : { - sameDay: '[Hoje às] LT', - nextDay: '[Amanhã às] LT', - nextWeek: 'dddd [às] LT', - lastDay: '[Ontem às] LT', - lastWeek: function () { - return (this.day() === 0 || this.day() === 6) ? - '[Último] dddd [às] LT' : // Saturday + Sunday - '[Última] dddd [às] LT'; // Monday - Friday - }, - sameElse: 'L' - }, - relativeTime : { - future : 'em %s', - past : '%s atrás', - s : 'segundos', - m : 'um minuto', - mm : '%d minutos', - h : 'uma hora', - hh : '%d horas', - d : 'um dia', - dd : '%d dias', - M : 'um mês', - MM : '%d meses', - y : 'um ano', - yy : '%d anos' - }, - ordinalParse: /\d{1,2}º/, - ordinal : '%dº' - }); -})); - -// moment.js locale configuration -// locale : portuguese (pt) -// author : Jefferson : https://github.com/jalex79 - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('pt', { - months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), - monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), - weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'), - weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'), - weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY LT', - LLLL : 'dddd, D [de] MMMM [de] YYYY LT' - }, - calendar : { - sameDay: '[Hoje às] LT', - nextDay: '[Amanhã às] LT', - nextWeek: 'dddd [às] LT', - lastDay: '[Ontem às] LT', - lastWeek: function () { - return (this.day() === 0 || this.day() === 6) ? - '[Último] dddd [às] LT' : // Saturday + Sunday - '[Última] dddd [às] LT'; // Monday - Friday - }, - sameElse: 'L' - }, - relativeTime : { - future : 'em %s', - past : 'há %s', - s : 'segundos', - m : 'um minuto', - mm : '%d minutos', - h : 'uma hora', - hh : '%d horas', - d : 'um dia', - dd : '%d dias', - M : 'um mês', - MM : '%d meses', - y : 'um ano', - yy : '%d anos' - }, - ordinalParse: /\d{1,2}º/, - ordinal : '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : romanian (ro) -// author : Vlad Gurdiga : https://github.com/gurdiga -// author : Valentin Agachi : https://github.com/avaly - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - function relativeTimeWithPlural(number, withoutSuffix, key) { - var format = { - 'mm': 'minute', - 'hh': 'ore', - 'dd': 'zile', - 'MM': 'luni', - 'yy': 'ani' - }, - separator = ' '; - if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) { - separator = ' de '; - } - - return number + separator + format[key]; - } - - return moment.defineLocale('ro', { - months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'), - monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'), - weekdays : 'duminică_luni_marÈ›i_miercuri_joi_vineri_sâmbătă'.split('_'), - weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'), - weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY H:mm', - LLLL : 'dddd, D MMMM YYYY H:mm' - }, - calendar : { - sameDay: '[azi la] LT', - nextDay: '[mâine la] LT', - nextWeek: 'dddd [la] LT', - lastDay: '[ieri la] LT', - lastWeek: '[fosta] dddd [la] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'peste %s', - past : '%s în urmă', - s : 'câteva secunde', - m : 'un minut', - mm : relativeTimeWithPlural, - h : 'o oră', - hh : relativeTimeWithPlural, - d : 'o zi', - dd : relativeTimeWithPlural, - M : 'o lună', - MM : relativeTimeWithPlural, - y : 'un an', - yy : relativeTimeWithPlural - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : russian (ru) -// author : Viktorminator : https://github.com/Viktorminator -// Author : Menelion Elensúle : https://github.com/Oire - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - function plural(word, num) { - var forms = word.split('_'); - return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); - } - - function relativeTimeWithPlural(number, withoutSuffix, key) { - var format = { - 'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут', - 'hh': 'чаÑ_чаÑа_чаÑов', - 'dd': 'день_днÑ_дней', - 'MM': 'меÑÑц_меÑÑца_меÑÑцев', - 'yy': 'год_года_лет' - }; - if (key === 'm') { - return withoutSuffix ? 'минута' : 'минуту'; - } - else { - return number + ' ' + plural(format[key], +number); - } - } - - function monthsCaseReplace(m, format) { - var months = { - 'nominative': 'Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь'.split('_'), - 'accusative': 'ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ'.split('_') - }, - - nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? - 'accusative' : - 'nominative'; - - return months[nounCase][m.month()]; - } - - function monthsShortCaseReplace(m, format) { - var monthsShort = { - 'nominative': 'Ñнв_фев_март_апр_май_июнь_июль_авг_Ñен_окт_ноÑ_дек'.split('_'), - 'accusative': 'Ñнв_фев_мар_апр_маÑ_июнÑ_июлÑ_авг_Ñен_окт_ноÑ_дек'.split('_') - }, - - nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? - 'accusative' : - 'nominative'; - - return monthsShort[nounCase][m.month()]; - } - - function weekdaysCaseReplace(m, format) { - var weekdays = { - 'nominative': 'воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота'.split('_'), - 'accusative': 'воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу'.split('_') - }, - - nounCase = (/\[ ?[Вв] ?(?:прошлую|Ñледующую|Ñту)? ?\] ?dddd/).test(format) ? - 'accusative' : - 'nominative'; - - return weekdays[nounCase][m.day()]; - } - - return moment.defineLocale('ru', { - months : monthsCaseReplace, - monthsShort : monthsShortCaseReplace, - weekdays : weekdaysCaseReplace, - weekdaysShort : 'вÑ_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), - weekdaysMin : 'вÑ_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), - monthsParse : [/^Ñнв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[й|Ñ]/i, /^июн/i, /^июл/i, /^авг/i, /^Ñен/i, /^окт/i, /^ноÑ/i, /^дек/i], - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY г.', - LLL : 'D MMMM YYYY г., LT', - LLLL : 'dddd, D MMMM YYYY г., LT' - }, - calendar : { - sameDay: '[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT', - nextDay: '[Завтра в] LT', - lastDay: '[Вчера в] LT', - nextWeek: function () { - return this.day() === 2 ? '[Во] dddd [в] LT' : '[Ð’] dddd [в] LT'; - }, - lastWeek: function (now) { - if (now.week() !== this.week()) { - switch (this.day()) { - case 0: - return '[Ð’ прошлое] dddd [в] LT'; - case 1: - case 2: - case 4: - return '[Ð’ прошлый] dddd [в] LT'; - case 3: - case 5: - case 6: - return '[Ð’ прошлую] dddd [в] LT'; - } - } else { - if (this.day() === 2) { - return '[Во] dddd [в] LT'; - } else { - return '[Ð’] dddd [в] LT'; - } - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'через %s', - past : '%s назад', - s : 'неÑколько Ñекунд', - m : relativeTimeWithPlural, - mm : relativeTimeWithPlural, - h : 'чаÑ', - hh : relativeTimeWithPlural, - d : 'день', - dd : relativeTimeWithPlural, - M : 'меÑÑц', - MM : relativeTimeWithPlural, - y : 'год', - yy : relativeTimeWithPlural - }, - - meridiemParse: /ночи|утра|днÑ|вечера/i, - isPM : function (input) { - return /^(днÑ|вечера)$/.test(input); - }, - - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'ночи'; - } else if (hour < 12) { - return 'утра'; - } else if (hour < 17) { - return 'днÑ'; - } else { - return 'вечера'; - } - }, - - ordinalParse: /\d{1,2}-(й|го|Ñ)/, - ordinal: function (number, period) { - switch (period) { - case 'M': - case 'd': - case 'DDD': - return number + '-й'; - case 'D': - return number + '-го'; - case 'w': - case 'W': - return number + '-Ñ'; - default: - return number; - } - }, - - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : slovak (sk) -// author : Martin Minka : https://github.com/k2s -// based on work of petrbela : https://github.com/petrbela - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'), - monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_'); - - function plural(n) { - return (n > 1) && (n < 5); - } - - function translate(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - switch (key) { - case 's': // a few seconds / in a few seconds / a few seconds ago - return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami'; - case 'm': // a minute / in a minute / a minute ago - return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou'); - case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'minúty' : 'minút'); - } else { - return result + 'minútami'; - } - break; - case 'h': // an hour / in an hour / an hour ago - return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); - case 'hh': // 9 hours / in 9 hours / 9 hours ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'hodiny' : 'hodín'); - } else { - return result + 'hodinami'; - } - break; - case 'd': // a day / in a day / a day ago - return (withoutSuffix || isFuture) ? 'deň' : 'dňom'; - case 'dd': // 9 days / in 9 days / 9 days ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'dni' : 'dní'); - } else { - return result + 'dňami'; - } - break; - case 'M': // a month / in a month / a month ago - return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom'; - case 'MM': // 9 months / in 9 months / 9 months ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'mesiace' : 'mesiacov'); - } else { - return result + 'mesiacmi'; - } - break; - case 'y': // a year / in a year / a year ago - return (withoutSuffix || isFuture) ? 'rok' : 'rokom'; - case 'yy': // 9 years / in 9 years / 9 years ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'roky' : 'rokov'); - } else { - return result + 'rokmi'; - } - break; - } - } - - return moment.defineLocale('sk', { - months : months, - monthsShort : monthsShort, - monthsParse : (function (months, monthsShort) { - var i, _monthsParse = []; - for (i = 0; i < 12; i++) { - // use custom parser to solve problem with July (Äervenec) - _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); - } - return _monthsParse; - }(months, monthsShort)), - weekdays : 'nedeľa_pondelok_utorok_streda_Å¡tvrtok_piatok_sobota'.split('_'), - weekdaysShort : 'ne_po_ut_st_Å¡t_pi_so'.split('_'), - weekdaysMin : 'ne_po_ut_st_Å¡t_pi_so'.split('_'), - longDateFormat : { - LT: 'H:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY LT', - LLLL : 'dddd D. MMMM YYYY LT' - }, - calendar : { - sameDay: '[dnes o] LT', - nextDay: '[zajtra o] LT', - nextWeek: function () { - switch (this.day()) { - case 0: - return '[v nedeľu o] LT'; - case 1: - case 2: - return '[v] dddd [o] LT'; - case 3: - return '[v stredu o] LT'; - case 4: - return '[vo Å¡tvrtok o] LT'; - case 5: - return '[v piatok o] LT'; - case 6: - return '[v sobotu o] LT'; - } - }, - lastDay: '[vÄera o] LT', - lastWeek: function () { - switch (this.day()) { - case 0: - return '[minulú nedeľu o] LT'; - case 1: - case 2: - return '[minulý] dddd [o] LT'; - case 3: - return '[minulú stredu o] LT'; - case 4: - case 5: - return '[minulý] dddd [o] LT'; - case 6: - return '[minulú sobotu o] LT'; - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'za %s', - past : 'pred %s', - s : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : slovenian (sl) -// author : Robert SedovÅ¡ek : https://github.com/sedovsek - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - function translate(number, withoutSuffix, key) { - var result = number + ' '; - switch (key) { - case 'm': - return withoutSuffix ? 'ena minuta' : 'eno minuto'; - case 'mm': - if (number === 1) { - result += 'minuta'; - } else if (number === 2) { - result += 'minuti'; - } else if (number === 3 || number === 4) { - result += 'minute'; - } else { - result += 'minut'; - } - return result; - case 'h': - return withoutSuffix ? 'ena ura' : 'eno uro'; - case 'hh': - if (number === 1) { - result += 'ura'; - } else if (number === 2) { - result += 'uri'; - } else if (number === 3 || number === 4) { - result += 'ure'; - } else { - result += 'ur'; - } - return result; - case 'dd': - if (number === 1) { - result += 'dan'; - } else { - result += 'dni'; - } - return result; - case 'MM': - if (number === 1) { - result += 'mesec'; - } else if (number === 2) { - result += 'meseca'; - } else if (number === 3 || number === 4) { - result += 'mesece'; - } else { - result += 'mesecev'; - } - return result; - case 'yy': - if (number === 1) { - result += 'leto'; - } else if (number === 2) { - result += 'leti'; - } else if (number === 3 || number === 4) { - result += 'leta'; - } else { - result += 'let'; - } - return result; - } - } - - return moment.defineLocale('sl', { - months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'), - monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'), - weekdays : 'nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota'.split('_'), - weekdaysShort : 'ned._pon._tor._sre._Äet._pet._sob.'.split('_'), - weekdaysMin : 'ne_po_to_sr_Äe_pe_so'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'DD. MM. YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY LT', - LLLL : 'dddd, D. MMMM YYYY LT' - }, - calendar : { - sameDay : '[danes ob] LT', - nextDay : '[jutri ob] LT', - - nextWeek : function () { - switch (this.day()) { - case 0: - return '[v] [nedeljo] [ob] LT'; - case 3: - return '[v] [sredo] [ob] LT'; - case 6: - return '[v] [soboto] [ob] LT'; - case 1: - case 2: - case 4: - case 5: - return '[v] dddd [ob] LT'; - } - }, - lastDay : '[vÄeraj ob] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - case 6: - return '[prejÅ¡nja] dddd [ob] LT'; - case 1: - case 2: - case 4: - case 5: - return '[prejÅ¡nji] dddd [ob] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'Äez %s', - past : '%s nazaj', - s : 'nekaj sekund', - m : translate, - mm : translate, - h : translate, - hh : translate, - d : 'en dan', - dd : translate, - M : 'en mesec', - MM : translate, - y : 'eno leto', - yy : translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : Albanian (sq) -// author : Flakërim Ismani : https://github.com/flakerimi -// author: Menelion Elensúle: https://github.com/Oire (tests) -// author : Oerd Cukalla : https://github.com/oerd (fixes) - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('sq', { - months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'), - monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'), - weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'), - weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'), - weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'), - meridiemParse: /PD|MD/, - isPM: function (input) { - return input.charAt(0) === 'M'; - }, - meridiem : function (hours, minutes, isLower) { - return hours < 12 ? 'PD' : 'MD'; - }, - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay : '[Sot në] LT', - nextDay : '[Nesër në] LT', - nextWeek : 'dddd [në] LT', - lastDay : '[Dje në] LT', - lastWeek : 'dddd [e kaluar në] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'në %s', - past : '%s më parë', - s : 'disa sekonda', - m : 'një minutë', - mm : '%d minuta', - h : 'një orë', - hh : '%d orë', - d : 'një ditë', - dd : '%d ditë', - M : 'një muaj', - MM : '%d muaj', - y : 'një vit', - yy : '%d vite' - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : Serbian-cyrillic (sr-cyrl) -// author : Milan JanaÄković : https://github.com/milan-j - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var translator = { - words: { //Different grammatical cases - m: ['један минут', 'једне минуте'], - mm: ['минут', 'минуте', 'минута'], - h: ['један Ñат', 'једног Ñата'], - hh: ['Ñат', 'Ñата', 'Ñати'], - dd: ['дан', 'дана', 'дана'], - MM: ['меÑец', 'меÑеца', 'меÑеци'], - yy: ['година', 'године', 'година'] - }, - correctGrammaticalCase: function (number, wordKey) { - return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); - }, - translate: function (number, withoutSuffix, key) { - var wordKey = translator.words[key]; - if (key.length === 1) { - return withoutSuffix ? wordKey[0] : wordKey[1]; - } else { - return number + ' ' + translator.correctGrammaticalCase(number, wordKey); - } - } - }; - - return moment.defineLocale('sr-cyrl', { - months: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'авгуÑÑ‚', 'Ñептембар', 'октобар', 'новембар', 'децембар'], - monthsShort: ['јан.', 'феб.', 'мар.', 'апр.', 'мај', 'јун', 'јул', 'авг.', 'Ñеп.', 'окт.', 'нов.', 'дец.'], - weekdays: ['недеља', 'понедељак', 'уторак', 'Ñреда', 'четвртак', 'петак', 'Ñубота'], - weekdaysShort: ['нед.', 'пон.', 'уто.', 'Ñре.', 'чет.', 'пет.', 'Ñуб.'], - weekdaysMin: ['не', 'по', 'ут', 'ÑÑ€', 'че', 'пе', 'Ñу'], - longDateFormat: { - LT: 'H:mm', - LTS : 'LT:ss', - L: 'DD. MM. YYYY', - LL: 'D. MMMM YYYY', - LLL: 'D. MMMM YYYY LT', - LLLL: 'dddd, D. MMMM YYYY LT' - }, - calendar: { - sameDay: '[Ð´Ð°Ð½Ð°Ñ Ñƒ] LT', - nextDay: '[Ñутра у] LT', - - nextWeek: function () { - switch (this.day()) { - case 0: - return '[у] [недељу] [у] LT'; - case 3: - return '[у] [Ñреду] [у] LT'; - case 6: - return '[у] [Ñуботу] [у] LT'; - case 1: - case 2: - case 4: - case 5: - return '[у] dddd [у] LT'; - } - }, - lastDay : '[јуче у] LT', - lastWeek : function () { - var lastWeekDays = [ - '[прошле] [недеље] [у] LT', - '[прошлог] [понедељка] [у] LT', - '[прошлог] [уторка] [у] LT', - '[прошле] [Ñреде] [у] LT', - '[прошлог] [четвртка] [у] LT', - '[прошлог] [петка] [у] LT', - '[прошле] [Ñуботе] [у] LT' - ]; - return lastWeekDays[this.day()]; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'за %s', - past : 'пре %s', - s : 'неколико Ñекунди', - m : translator.translate, - mm : translator.translate, - h : translator.translate, - hh : translator.translate, - d : 'дан', - dd : translator.translate, - M : 'меÑец', - MM : translator.translate, - y : 'годину', - yy : translator.translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : Serbian-latin (sr) -// author : Milan JanaÄković : https://github.com/milan-j - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var translator = { - words: { //Different grammatical cases - m: ['jedan minut', 'jedne minute'], - mm: ['minut', 'minute', 'minuta'], - h: ['jedan sat', 'jednog sata'], - hh: ['sat', 'sata', 'sati'], - dd: ['dan', 'dana', 'dana'], - MM: ['mesec', 'meseca', 'meseci'], - yy: ['godina', 'godine', 'godina'] - }, - correctGrammaticalCase: function (number, wordKey) { - return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); - }, - translate: function (number, withoutSuffix, key) { - var wordKey = translator.words[key]; - if (key.length === 1) { - return withoutSuffix ? wordKey[0] : wordKey[1]; - } else { - return number + ' ' + translator.correctGrammaticalCase(number, wordKey); - } - } - }; - - return moment.defineLocale('sr', { - months: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'], - monthsShort: ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun', 'jul', 'avg.', 'sep.', 'okt.', 'nov.', 'dec.'], - weekdays: ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'Äetvrtak', 'petak', 'subota'], - weekdaysShort: ['ned.', 'pon.', 'uto.', 'sre.', 'Äet.', 'pet.', 'sub.'], - weekdaysMin: ['ne', 'po', 'ut', 'sr', 'Äe', 'pe', 'su'], - longDateFormat: { - LT: 'H:mm', - LTS : 'LT:ss', - L: 'DD. MM. YYYY', - LL: 'D. MMMM YYYY', - LLL: 'D. MMMM YYYY LT', - LLLL: 'dddd, D. MMMM YYYY LT' - }, - calendar: { - sameDay: '[danas u] LT', - nextDay: '[sutra u] LT', - - nextWeek: function () { - switch (this.day()) { - case 0: - return '[u] [nedelju] [u] LT'; - case 3: - return '[u] [sredu] [u] LT'; - case 6: - return '[u] [subotu] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[u] dddd [u] LT'; - } - }, - lastDay : '[juÄe u] LT', - lastWeek : function () { - var lastWeekDays = [ - '[proÅ¡le] [nedelje] [u] LT', - '[proÅ¡log] [ponedeljka] [u] LT', - '[proÅ¡log] [utorka] [u] LT', - '[proÅ¡le] [srede] [u] LT', - '[proÅ¡log] [Äetvrtka] [u] LT', - '[proÅ¡log] [petka] [u] LT', - '[proÅ¡le] [subote] [u] LT' - ]; - return lastWeekDays[this.day()]; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'za %s', - past : 'pre %s', - s : 'nekoliko sekundi', - m : translator.translate, - mm : translator.translate, - h : translator.translate, - hh : translator.translate, - d : 'dan', - dd : translator.translate, - M : 'mesec', - MM : translator.translate, - y : 'godinu', - yy : translator.translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : swedish (sv) -// author : Jens Alm : https://github.com/ulmus - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('sv', { - months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'), - monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), - weekdays : 'söndag_mÃ¥ndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'), - weekdaysShort : 'sön_mÃ¥n_tis_ons_tor_fre_lör'.split('_'), - weekdaysMin : 'sö_mÃ¥_ti_on_to_fr_lö'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'YYYY-MM-DD', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay: '[Idag] LT', - nextDay: '[Imorgon] LT', - lastDay: '[IgÃ¥r] LT', - nextWeek: 'dddd LT', - lastWeek: '[Förra] dddd[en] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'om %s', - past : 'för %s sedan', - s : 'nÃ¥gra sekunder', - m : 'en minut', - mm : '%d minuter', - h : 'en timme', - hh : '%d timmar', - d : 'en dag', - dd : '%d dagar', - M : 'en mÃ¥nad', - MM : '%d mÃ¥nader', - y : 'ett Ã¥r', - yy : '%d Ã¥r' - }, - ordinalParse: /\d{1,2}(e|a)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'e' : - (b === 1) ? 'a' : - (b === 2) ? 'a' : - (b === 3) ? 'e' : 'e'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : tamil (ta) -// author : Arjunkumar Krishnamoorthy : https://github.com/tk120404 - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - /*var symbolMap = { - '1': '௧', - '2': '௨', - '3': '௩', - '4': '௪', - '5': '௫', - '6': '௬', - '7': '௭', - '8': '௮', - '9': '௯', - '0': '௦' - }, - numberMap = { - '௧': '1', - '௨': '2', - '௩': '3', - '௪': '4', - '௫': '5', - '௬': '6', - '௭': '7', - '௮': '8', - '௯': '9', - '௦': '0' - }; */ - - return moment.defineLocale('ta', { - months : 'ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯'.split('_'), - monthsShort : 'ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯'.split('_'), - weekdays : 'ஞாயிறà¯à®±à¯à®•à¯à®•à®¿à®´à®®à¯ˆ_திஙà¯à®•à®Ÿà¯à®•à®¿à®´à®®à¯ˆ_செவà¯à®µà®¾à®¯à¯à®•à®¿à®´à®®à¯ˆ_பà¯à®¤à®©à¯à®•à®¿à®´à®®à¯ˆ_வியாழகà¯à®•à®¿à®´à®®à¯ˆ_வெளà¯à®³à®¿à®•à¯à®•à®¿à®´à®®à¯ˆ_சனிகà¯à®•à®¿à®´à®®à¯ˆ'.split('_'), - weekdaysShort : 'ஞாயிறà¯_திஙà¯à®•à®³à¯_செவà¯à®µà®¾à®¯à¯_பà¯à®¤à®©à¯_வியாழனà¯_வெளà¯à®³à®¿_சனி'.split('_'), - weekdaysMin : 'ஞா_தி_செ_பà¯_வி_வெ_ச'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, LT', - LLLL : 'dddd, D MMMM YYYY, LT' - }, - calendar : { - sameDay : '[இனà¯à®±à¯] LT', - nextDay : '[நாளை] LT', - nextWeek : 'dddd, LT', - lastDay : '[நேறà¯à®±à¯] LT', - lastWeek : '[கடநà¯à®¤ வாரமà¯] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s இலà¯', - past : '%s à®®à¯à®©à¯', - s : 'ஒர௠சில விநாடிகளà¯', - m : 'ஒர௠நிமிடமà¯', - mm : '%d நிமிடஙà¯à®•à®³à¯', - h : 'ஒர௠மணி நேரமà¯', - hh : '%d மணி நேரமà¯', - d : 'ஒர௠நாளà¯', - dd : '%d நாடà¯à®•à®³à¯', - M : 'ஒர௠மாதமà¯', - MM : '%d மாதஙà¯à®•à®³à¯', - y : 'ஒர௠வரà¯à®Ÿà®®à¯', - yy : '%d ஆணà¯à®Ÿà¯à®•à®³à¯' - }, -/* preparse: function (string) { - return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - },*/ - ordinalParse: /\d{1,2}வதà¯/, - ordinal : function (number) { - return number + 'வதà¯'; - }, - - - // refer http://ta.wikipedia.org/s/1er1 - meridiemParse: /யாமமà¯|வைகறை|காலை|நணà¯à®ªà®•à®²à¯|எறà¯à®ªà®¾à®Ÿà¯|மாலை/, - meridiem : function (hour, minute, isLower) { - if (hour < 2) { - return ' யாமமà¯'; - } else if (hour < 6) { - return ' வைகறை'; // வைகறை - } else if (hour < 10) { - return ' காலை'; // காலை - } else if (hour < 14) { - return ' நணà¯à®ªà®•à®²à¯'; // நணà¯à®ªà®•à®²à¯ - } else if (hour < 18) { - return ' எறà¯à®ªà®¾à®Ÿà¯'; // எறà¯à®ªà®¾à®Ÿà¯ - } else if (hour < 22) { - return ' மாலை'; // மாலை - } else { - return ' யாமமà¯'; - } - }, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'யாமமà¯') { - return hour < 2 ? hour : hour + 12; - } else if (meridiem === 'வைகறை' || meridiem === 'காலை') { - return hour; - } else if (meridiem === 'நணà¯à®ªà®•à®²à¯') { - return hour >= 10 ? hour : hour + 12; - } else { - return hour + 12; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : thai (th) -// author : Kridsada Thanabulpong : https://github.com/sirn - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('th', { - months : 'มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม'.split('_'), - monthsShort : 'มà¸à¸£à¸²_à¸à¸¸à¸¡à¸ à¸²_มีนา_เมษา_พฤษภา_มิถุนา_à¸à¸£à¸à¸Žà¸²_สิงหา_à¸à¸±à¸™à¸¢à¸²_ตุลา_พฤศจิà¸à¸²_ธันวา'.split('_'), - weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์'.split('_'), - weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์'.split('_'), // yes, three characters difference - weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'), - longDateFormat : { - LT : 'H นาฬิà¸à¸² m นาที', - LTS : 'LT s วินาที', - L : 'YYYY/MM/DD', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY เวลา LT', - LLLL : 'วันddddที่ D MMMM YYYY เวลา LT' - }, - meridiemParse: /à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง|หลังเที่ยง/, - isPM: function (input) { - return input === 'หลังเที่ยง'; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง'; - } else { - return 'หลังเที่ยง'; - } - }, - calendar : { - sameDay : '[วันนี้ เวลา] LT', - nextDay : '[พรุ่งนี้ เวลา] LT', - nextWeek : 'dddd[หน้า เวลา] LT', - lastDay : '[เมื่อวานนี้ เวลา] LT', - lastWeek : '[วัน]dddd[ที่à¹à¸¥à¹‰à¸§ เวลา] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'อีภ%s', - past : '%sที่à¹à¸¥à¹‰à¸§', - s : 'ไม่à¸à¸µà¹ˆà¸§à¸´à¸™à¸²à¸—ี', - m : '1 นาที', - mm : '%d นาที', - h : '1 ชั่วโมง', - hh : '%d ชั่วโมง', - d : '1 วัน', - dd : '%d วัน', - M : '1 เดือน', - MM : '%d เดือน', - y : '1 ปี', - yy : '%d ปี' - } - }); -})); - -// moment.js locale configuration -// locale : Tagalog/Filipino (tl-ph) -// author : Dan Hagman - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('tl-ph', { - months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'), - monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'), - weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'), - weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'), - weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'MM/D/YYYY', - LL : 'MMMM D, YYYY', - LLL : 'MMMM D, YYYY LT', - LLLL : 'dddd, MMMM DD, YYYY LT' - }, - calendar : { - sameDay: '[Ngayon sa] LT', - nextDay: '[Bukas sa] LT', - nextWeek: 'dddd [sa] LT', - lastDay: '[Kahapon sa] LT', - lastWeek: 'dddd [huling linggo] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'sa loob ng %s', - past : '%s ang nakalipas', - s : 'ilang segundo', - m : 'isang minuto', - mm : '%d minuto', - h : 'isang oras', - hh : '%d oras', - d : 'isang araw', - dd : '%d araw', - M : 'isang buwan', - MM : '%d buwan', - y : 'isang taon', - yy : '%d taon' - }, - ordinalParse: /\d{1,2}/, - ordinal : function (number) { - return number; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : turkish (tr) -// authors : Erhan Gundogan : https://github.com/erhangundogan, -// Burak YiÄŸit Kaya: https://github.com/BYK - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - var suffixes = { - 1: '\'inci', - 5: '\'inci', - 8: '\'inci', - 70: '\'inci', - 80: '\'inci', - - 2: '\'nci', - 7: '\'nci', - 20: '\'nci', - 50: '\'nci', - - 3: '\'üncü', - 4: '\'üncü', - 100: '\'üncü', - - 6: '\'ncı', - - 9: '\'uncu', - 10: '\'uncu', - 30: '\'uncu', - - 60: '\'ıncı', - 90: '\'ıncı' - }; - - return moment.defineLocale('tr', { - months : 'Ocak_Åžubat_Mart_Nisan_Mayıs_Haziran_Temmuz_AÄŸustos_Eylül_Ekim_Kasım_Aralık'.split('_'), - monthsShort : 'Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara'.split('_'), - weekdays : 'Pazar_Pazartesi_Salı_ÇarÅŸamba_PerÅŸembe_Cuma_Cumartesi'.split('_'), - weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'), - weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay : '[bugün saat] LT', - nextDay : '[yarın saat] LT', - nextWeek : '[haftaya] dddd [saat] LT', - lastDay : '[dün] LT', - lastWeek : '[geçen hafta] dddd [saat] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s sonra', - past : '%s önce', - s : 'birkaç saniye', - m : 'bir dakika', - mm : '%d dakika', - h : 'bir saat', - hh : '%d saat', - d : 'bir gün', - dd : '%d gün', - M : 'bir ay', - MM : '%d ay', - y : 'bir yıl', - yy : '%d yıl' - }, - ordinalParse: /\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/, - ordinal : function (number) { - if (number === 0) { // special case for zero - return number + '\'ıncı'; - } - var a = number % 10, - b = number % 100 - a, - c = number >= 100 ? 100 : null; - - return number + (suffixes[a] || suffixes[b] || suffixes[c]); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : Morocco Central Atlas TamaziÉ£t in Latin (tzm-latn) -// author : Abdel Said : https://github.com/abdelsaid - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('tzm-latn', { - months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), - monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), - weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), - weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), - weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay: '[asdkh g] LT', - nextDay: '[aska g] LT', - nextWeek: 'dddd [g] LT', - lastDay: '[assant g] LT', - lastWeek: 'dddd [g] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'dadkh s yan %s', - past : 'yan %s', - s : 'imik', - m : 'minuá¸', - mm : '%d minuá¸', - h : 'saÉ›a', - hh : '%d tassaÉ›in', - d : 'ass', - dd : '%d ossan', - M : 'ayowr', - MM : '%d iyyirn', - y : 'asgas', - yy : '%d isgasn' - }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : Morocco Central Atlas TamaziÉ£t (tzm) -// author : Abdel Said : https://github.com/abdelsaid - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('tzm', { - months : 'ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”'.split('_'), - monthsShort : 'ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”'.split('_'), - weekdays : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), - weekdaysShort : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), - weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS: 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay: '[ⴰⵙⴷⵅ â´´] LT', - nextDay: '[ⴰⵙⴽⴰ â´´] LT', - nextWeek: 'dddd [â´´] LT', - lastDay: '[ⴰⵚⴰâµâµœ â´´] LT', - lastWeek: 'dddd [â´´] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'â´·â´°â´·âµ… âµ™ ⵢⴰⵠ%s', - past : 'ⵢⴰⵠ%s', - s : 'ⵉⵎⵉⴽ', - m : 'ⵎⵉâµâµ“â´º', - mm : '%d ⵎⵉâµâµ“â´º', - h : 'ⵙⴰⵄⴰ', - hh : '%d ⵜⴰⵙⵙⴰⵄⵉâµ', - d : 'ⴰⵙⵙ', - dd : '%d oⵙⵙⴰâµ', - M : 'â´°âµ¢oⵓⵔ', - MM : '%d ⵉⵢⵢⵉⵔâµ', - y : 'ⴰⵙⴳⴰⵙ', - yy : '%d ⵉⵙⴳⴰⵙâµ' - }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : ukrainian (uk) -// author : zemlanin : https://github.com/zemlanin -// Author : Menelion Elensúle : https://github.com/Oire - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - function plural(word, num) { - var forms = word.split('_'); - return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); - } - - function relativeTimeWithPlural(number, withoutSuffix, key) { - var format = { - 'mm': 'хвилина_хвилини_хвилин', - 'hh': 'година_години_годин', - 'dd': 'день_дні_днів', - 'MM': 'міÑÑць_міÑÑці_міÑÑців', - 'yy': 'рік_роки_років' - }; - if (key === 'm') { - return withoutSuffix ? 'хвилина' : 'хвилину'; - } - else if (key === 'h') { - return withoutSuffix ? 'година' : 'годину'; - } - else { - return number + ' ' + plural(format[key], +number); - } - } - - function monthsCaseReplace(m, format) { - var months = { - 'nominative': 'Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень'.split('_'), - 'accusative': 'ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ'.split('_') - }, - - nounCase = (/D[oD]? *MMMM?/).test(format) ? - 'accusative' : - 'nominative'; - - return months[nounCase][m.month()]; - } - - function weekdaysCaseReplace(m, format) { - var weekdays = { - 'nominative': 'неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота'.split('_'), - 'accusative': 'неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу'.split('_'), - 'genitive': 'неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи'.split('_') - }, - - nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ? - 'accusative' : - ((/\[?(?:минулої|наÑтупної)? ?\] ?dddd/).test(format) ? - 'genitive' : - 'nominative'); - - return weekdays[nounCase][m.day()]; - } - - function processHoursFunction(str) { - return function () { - return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT'; - }; - } - - return moment.defineLocale('uk', { - months : monthsCaseReplace, - monthsShort : 'Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд'.split('_'), - weekdays : weekdaysCaseReplace, - weekdaysShort : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), - weekdaysMin : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY Ñ€.', - LLL : 'D MMMM YYYY Ñ€., LT', - LLLL : 'dddd, D MMMM YYYY Ñ€., LT' - }, - calendar : { - sameDay: processHoursFunction('[Сьогодні '), - nextDay: processHoursFunction('[Завтра '), - lastDay: processHoursFunction('[Вчора '), - nextWeek: processHoursFunction('[У] dddd ['), - lastWeek: function () { - switch (this.day()) { - case 0: - case 3: - case 5: - case 6: - return processHoursFunction('[Минулої] dddd [').call(this); - case 1: - case 2: - case 4: - return processHoursFunction('[Минулого] dddd [').call(this); - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'за %s', - past : '%s тому', - s : 'декілька Ñекунд', - m : relativeTimeWithPlural, - mm : relativeTimeWithPlural, - h : 'годину', - hh : relativeTimeWithPlural, - d : 'день', - dd : relativeTimeWithPlural, - M : 'міÑÑць', - MM : relativeTimeWithPlural, - y : 'рік', - yy : relativeTimeWithPlural - }, - - // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason - - meridiemParse: /ночі|ранку|днÑ|вечора/, - isPM: function (input) { - return /^(днÑ|вечора)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'ночі'; - } else if (hour < 12) { - return 'ранку'; - } else if (hour < 17) { - return 'днÑ'; - } else { - return 'вечора'; - } - }, - - ordinalParse: /\d{1,2}-(й|го)/, - ordinal: function (number, period) { - switch (period) { - case 'M': - case 'd': - case 'DDD': - case 'w': - case 'W': - return number + '-й'; - case 'D': - return number + '-го'; - default: - return number; - } - }, - - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : uzbek (uz) -// author : Sardor Muminov : https://github.com/muminoff - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('uz', { - months : 'Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь'.split('_'), - monthsShort : 'Ñнв_фев_мар_апр_май_июн_июл_авг_Ñен_окт_ноÑ_дек'.split('_'), - weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'), - weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'), - weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'D MMMM YYYY, dddd LT' - }, - calendar : { - sameDay : '[Бугун Ñоат] LT [да]', - nextDay : '[Эртага] LT [да]', - nextWeek : 'dddd [куни Ñоат] LT [да]', - lastDay : '[Кеча Ñоат] LT [да]', - lastWeek : '[Утган] dddd [куни Ñоат] LT [да]', - sameElse : 'L' - }, - relativeTime : { - future : 'Якин %s ичида', - past : 'Бир неча %s олдин', - s : 'фурÑат', - m : 'бир дакика', - mm : '%d дакика', - h : 'бир Ñоат', - hh : '%d Ñоат', - d : 'бир кун', - dd : '%d кун', - M : 'бир ой', - MM : '%d ой', - y : 'бир йил', - yy : '%d йил' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : vietnamese (vi) -// author : Bang Nguyen : https://github.com/bangnk - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('vi', { - months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'), - monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'), - weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tÆ°_thứ năm_thứ sáu_thứ bảy'.split('_'), - weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), - weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM [năm] YYYY', - LLL : 'D MMMM [năm] YYYY LT', - LLLL : 'dddd, D MMMM [năm] YYYY LT', - l : 'DD/M/YYYY', - ll : 'D MMM YYYY', - lll : 'D MMM YYYY LT', - llll : 'ddd, D MMM YYYY LT' - }, - calendar : { - sameDay: '[Hôm nay lúc] LT', - nextDay: '[Ngày mai lúc] LT', - nextWeek: 'dddd [tuần tá»›i lúc] LT', - lastDay: '[Hôm qua lúc] LT', - lastWeek: 'dddd [tuần rồi lúc] LT', - sameElse: 'L' - }, - relativeTime : { - future : '%s tá»›i', - past : '%s trÆ°á»›c', - s : 'vài giây', - m : 'má»™t phút', - mm : '%d phút', - h : 'má»™t giá»', - hh : '%d giá»', - d : 'má»™t ngày', - dd : '%d ngày', - M : 'má»™t tháng', - MM : '%d tháng', - y : 'má»™t năm', - yy : '%d năm' - }, - ordinalParse: /\d{1,2}/, - ordinal : function (number) { - return number; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : chinese (zh-cn) -// author : suupic : https://github.com/suupic -// author : Zeno Zeng : https://github.com/zenozeng - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('zh-cn', { - months : '一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月'.split('_'), - monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), - weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), - weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'), - weekdaysMin : 'æ—¥_一_二_三_å››_五_å…­'.split('_'), - longDateFormat : { - LT : 'Ah点mm', - LTS : 'Ah点m分s秒', - L : 'YYYY-MM-DD', - LL : 'YYYYå¹´MMMDæ—¥', - LLL : 'YYYYå¹´MMMDæ—¥LT', - LLLL : 'YYYYå¹´MMMDæ—¥ddddLT', - l : 'YYYY-MM-DD', - ll : 'YYYYå¹´MMMDæ—¥', - lll : 'YYYYå¹´MMMDæ—¥LT', - llll : 'YYYYå¹´MMMDæ—¥ddddLT' - }, - meridiemParse: /凌晨|早上|上åˆ|中åˆ|下åˆ|晚上/, - meridiemHour: function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === '凌晨' || meridiem === '早上' || - meridiem === '上åˆ') { - return hour; - } else if (meridiem === '下åˆ' || meridiem === '晚上') { - return hour + 12; - } else { - // '中åˆ' - return hour >= 11 ? hour : hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - var hm = hour * 100 + minute; - if (hm < 600) { - return '凌晨'; - } else if (hm < 900) { - return '早上'; - } else if (hm < 1130) { - return '上åˆ'; - } else if (hm < 1230) { - return '中åˆ'; - } else if (hm < 1800) { - return '下åˆ'; - } else { - return '晚上'; - } - }, - calendar : { - sameDay : function () { - return this.minutes() === 0 ? '[今天]Ah[点整]' : '[今天]LT'; - }, - nextDay : function () { - return this.minutes() === 0 ? '[明天]Ah[点整]' : '[明天]LT'; - }, - lastDay : function () { - return this.minutes() === 0 ? '[昨天]Ah[点整]' : '[昨天]LT'; - }, - nextWeek : function () { - var startOfWeek, prefix; - startOfWeek = moment().startOf('week'); - prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]'; - return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; - }, - lastWeek : function () { - var startOfWeek, prefix; - startOfWeek = moment().startOf('week'); - prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]'; - return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; - }, - sameElse : 'LL' - }, - ordinalParse: /\d{1,2}(æ—¥|月|周)/, - ordinal : function (number, period) { - switch (period) { - case 'd': - case 'D': - case 'DDD': - return number + 'æ—¥'; - case 'M': - return number + '月'; - case 'w': - case 'W': - return number + '周'; - default: - return number; - } - }, - relativeTime : { - future : '%s内', - past : '%så‰', - s : '几秒', - m : '1分钟', - mm : '%d分钟', - h : '1å°æ—¶', - hh : '%då°æ—¶', - d : '1天', - dd : '%d天', - M : '1个月', - MM : '%d个月', - y : '1å¹´', - yy : '%då¹´' - }, - week : { - // GB/T 7408-1994《数æ®å…ƒå’Œäº¤æ¢æ ¼å¼Â·ä¿¡æ¯äº¤æ¢Â·æ—¥æœŸå’Œæ—¶é—´è¡¨ç¤ºæ³•ã€‹ä¸ŽISO 8601:1988等效 - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - -// moment.js locale configuration -// locale : traditional chinese (zh-tw) -// author : Ben : https://github.com/ben-lin - -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory((typeof global !== 'undefined' ? global : this).moment); // node or other global - } -}(function (moment) { - return moment.defineLocale('zh-tw', { - months : '一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月'.split('_'), - monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), - weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), - weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), - weekdaysMin : 'æ—¥_一_二_三_å››_五_å…­'.split('_'), - longDateFormat : { - LT : 'Ah點mm', - LTS : 'Ah點m分s秒', - L : 'YYYYå¹´MMMDæ—¥', - LL : 'YYYYå¹´MMMDæ—¥', - LLL : 'YYYYå¹´MMMDæ—¥LT', - LLLL : 'YYYYå¹´MMMDæ—¥ddddLT', - l : 'YYYYå¹´MMMDæ—¥', - ll : 'YYYYå¹´MMMDæ—¥', - lll : 'YYYYå¹´MMMDæ—¥LT', - llll : 'YYYYå¹´MMMDæ—¥ddddLT' - }, - meridiemParse: /早上|上åˆ|中åˆ|下åˆ|晚上/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === '早上' || meridiem === '上åˆ') { - return hour; - } else if (meridiem === '中åˆ') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === '下åˆ' || meridiem === '晚上') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - var hm = hour * 100 + minute; - if (hm < 900) { - return '早上'; - } else if (hm < 1130) { - return '上åˆ'; - } else if (hm < 1230) { - return '中åˆ'; - } else if (hm < 1800) { - return '下åˆ'; - } else { - return '晚上'; - } - }, - calendar : { - sameDay : '[今天]LT', - nextDay : '[明天]LT', - nextWeek : '[下]ddddLT', - lastDay : '[昨天]LT', - lastWeek : '[上]ddddLT', - sameElse : 'L' - }, - ordinalParse: /\d{1,2}(æ—¥|月|週)/, - ordinal : function (number, period) { - switch (period) { - case 'd' : - case 'D' : - case 'DDD' : - return number + 'æ—¥'; - case 'M' : - return number + '月'; - case 'w' : - case 'W' : - return number + '週'; - default : - return number; - } - }, - relativeTime : { - future : '%så…§', - past : '%så‰', - s : '幾秒', - m : '一分é˜', - mm : '%d分é˜', - h : '一å°æ™‚', - hh : '%då°æ™‚', - d : '一天', - dd : '%d天', - M : '一個月', - MM : '%d個月', - y : '一年', - yy : '%då¹´' - } - }); -})); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/locales.min.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/locales.min.js deleted file mode 100644 index b35ba6d..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/locales.min.js +++ /dev/null @@ -1,4 +0,0 @@ -!function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(a){return/^nm$/i.test(a)},meridiem:function(a,b,c){return 12>a?c?"vm":"VM":c?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[Môre om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ar-ma",{months:"يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:6,doy:12}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"Ù¡",2:"Ù¢",3:"Ù£",4:"Ù¤",5:"Ù¥",6:"Ù¦",7:"Ù§",8:"Ù¨",9:"Ù©",0:"Ù "},c={"Ù¡":"1","Ù¢":"2","Ù£":"3","Ù¤":"4","Ù¥":"5","Ù¦":"6","Ù§":"7","Ù¨":"8","Ù©":"9","Ù ":"0"};return a.defineLocale("ar-sa",{months:"يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),monthsShort:"يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiemParse:/ص|Ù…/,isPM:function(a){return"Ù…"===a},meridiem:function(a){return 12>a?"ص":"Ù…"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(a){return a.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(a){return c[a]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]}).replace(/,/g,"ØŒ")},week:{dow:6,doy:12}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ar-tn",{months:"جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),monthsShort:"جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"Ù¡",2:"Ù¢",3:"Ù£",4:"Ù¤",5:"Ù¥",6:"Ù¦",7:"Ù§",8:"Ù¨",9:"Ù©",0:"Ù "},c={"Ù¡":"1","Ù¢":"2","Ù£":"3","Ù¤":"4","Ù¥":"5","Ù¦":"6","Ù§":"7","Ù¨":"8","Ù©":"9","Ù ":"0"},d=function(a){return 0===a?0:1===a?1:2===a?2:a%100>=3&&10>=a%100?3:a%100>=11?4:5},e={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},f=function(a){return function(b,c){var f=d(b),g=e[a][d(b)];return 2===f&&(g=g[c?0:1]),g.replace(/%d/i,b)}},g=["كانون الثاني يناير","شباط Ùبراير","آذار مارس","نيسان أبريل","أيار مايو","حزيران يونيو","تموز يوليو","آب أغسطس","أيلول سبتمبر","تشرين الأول أكتوبر","تشرين الثاني نوÙمبر","كانون الأول ديسمبر"];return a.defineLocale("ar",{months:g,monthsShort:g,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiemParse:/ص|Ù…/,isPM:function(a){return"Ù…"===a},meridiem:function(a){return 12>a?"ص":"Ù…"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:f("s"),m:f("m"),mm:f("m"),h:f("h"),hh:f("h"),d:f("d"),dd:f("d"),M:f("M"),MM:f("M"),y:f("y"),yy:f("y")},preparse:function(a){return a.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(a){return c[a]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]}).replace(/,/g,"ØŒ")},week:{dow:6,doy:12}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"-inci",5:"-inci",8:"-inci",70:"-inci",80:"-inci",2:"-nci",7:"-nci",20:"-nci",50:"-nci",3:"-üncü",4:"-üncü",100:"-üncü",6:"-ncı",9:"-uncu",10:"-uncu",30:"-uncu",60:"-ıncı",90:"-ıncı"};return a.defineLocale("az",{months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekdays:"Bazar_Bazar ertÉ™si_ÇərÅŸÉ™nbÉ™ axÅŸamı_ÇərÅŸÉ™nbÉ™_CümÉ™ axÅŸamı_CümÉ™_ŞənbÉ™".split("_"),weekdaysShort:"Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən".split("_"),weekdaysMin:"Bz_BE_ÇA_Çə_CA_Cü_Şə".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[sabah saat] LT",nextWeek:"[gÉ™lÉ™n hÉ™ftÉ™] dddd [saat] LT",lastDay:"[dünÉ™n] LT",lastWeek:"[keçən hÉ™ftÉ™] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s É™vvÉ™l",s:"birneçə saniyyÉ™",m:"bir dÉ™qiqÉ™",mm:"%d dÉ™qiqÉ™",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},meridiemParse:/gecÉ™|sÉ™hÉ™r|gündüz|axÅŸam/,isPM:function(a){return/^(gündüz|axÅŸam)$/.test(a)},meridiem:function(a){return 4>a?"gecÉ™":12>a?"sÉ™hÉ™r":17>a?"gündüz":"axÅŸam"},ordinalParse:/\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,ordinal:function(a){if(0===a)return a+"-ıncı";var c=a%10,d=a%100-c,e=a>=100?100:null;return a+(b[c]||b[d]||b[e])},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:c?"хвіліна_хвіліны_хвілін":"хвіліну_хвіліны_хвілін",hh:c?"гадзіна_гадзіны_гадзін":"гадзіну_гадзіны_гадзін",dd:"дзень_дні_дзён",MM:"меÑÑц_меÑÑцы_меÑÑцаў",yy:"год_гады_гадоў"};return"m"===d?c?"хвіліна":"хвіліну":"h"===d?c?"гадзіна":"гадзіну":a+" "+b(e[d],+a)}function d(a,b){var c={nominative:"Ñтудзень_люты_Ñакавік_краÑавік_травень_чÑрвень_ліпень_жнівень_вераÑень_каÑтрычнік_ліÑтапад_Ñнежань".split("_"),accusative:"ÑтудзенÑ_лютага_Ñакавіка_краÑавіка_траўнÑ_чÑрвенÑ_ліпенÑ_жніўнÑ_вераÑнÑ_каÑтрычніка_ліÑтапада_ÑнежнÑ".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function e(a,b){var c={nominative:"нÑдзелÑ_панÑдзелак_аўторак_Ñерада_чацвер_пÑтніца_Ñубота".split("_"),accusative:"нÑдзелю_панÑдзелак_аўторак_Ñераду_чацвер_пÑтніцу_Ñуботу".split("_")},d=/\[ ?[Вв] ?(?:мінулую|наÑтупную)? ?\] ?dddd/.test(b)?"accusative":"nominative";return c[d][a.day()]}return a.defineLocale("be",{months:d,monthsShort:"Ñтуд_лют_Ñак_краÑ_трав_чÑрв_ліп_жнів_вер_каÑÑ‚_ліÑÑ‚_Ñнеж".split("_"),weekdays:e,weekdaysShort:"нд_пн_ат_ÑÑ€_чц_пт_Ñб".split("_"),weekdaysMin:"нд_пн_ат_ÑÑ€_чц_пт_Ñб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., LT",LLLL:"dddd, D MMMM YYYY г., LT"},calendar:{sameDay:"[Ð¡Ñ‘Ð½Ð½Ñ Ñž] LT",nextDay:"[Заўтра Ñž] LT",lastDay:"[Учора Ñž] LT",nextWeek:function(){return"[У] dddd [Ñž] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[У мінулую] dddd [Ñž] LT";case 1:case 2:case 4:return"[У мінулы] dddd [Ñž] LT"}},sameElse:"L"},relativeTime:{future:"праз %s",past:"%s таму",s:"некалькі Ñекунд",m:c,mm:c,h:c,hh:c,d:"дзень",dd:c,M:"меÑÑц",MM:c,y:"год",yy:c},meridiemParse:/ночы|раніцы|днÑ|вечара/,isPM:function(a){return/^(днÑ|вечара)$/.test(a)},meridiem:function(a){return 4>a?"ночы":12>a?"раніцы":17>a?"днÑ":"вечара"},ordinalParse:/\d{1,2}-(Ñ–|Ñ‹|га)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":case"w":case"W":return a%10!==2&&a%10!==3||a%100===12||a%100===13?a+"-Ñ‹":a+"-Ñ–";case"D":return a+"-га";default:return a}},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("bg",{months:"Ñнуари_февруари_март_април_май_юни_юли_авгуÑÑ‚_Ñептември_октомври_ноември_декември".split("_"),monthsShort:"Ñнр_фев_мар_апр_май_юни_юли_авг_Ñеп_окт_ное_дек".split("_"),weekdays:"неделÑ_понеделник_вторник_ÑÑ€Ñда_четвъртък_петък_Ñъбота".split("_"),weekdaysShort:"нед_пон_вто_ÑÑ€Ñ_чет_пет_Ñъб".split("_"),weekdaysMin:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Ð”Ð½ÐµÑ Ð²] LT",nextDay:"[Утре в] LT",nextWeek:"dddd [в] LT",lastDay:"[Вчера в] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Ð’ изминалата] dddd [в] LT";case 1:case 2:case 4:case 5:return"[Ð’ изминалиÑ] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"Ñлед %s",past:"преди %s",s:"нÑколко Ñекунди",m:"минута",mm:"%d минути",h:"чаÑ",hh:"%d чаÑа",d:"ден",dd:"%d дни",M:"меÑец",MM:"%d меÑеца",y:"година",yy:"%d години"},ordinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(a){var b=a%10,c=a%100;return 0===a?a+"-ев":0===c?a+"-ен":c>10&&20>c?a+"-ти":1===b?a+"-ви":2===b?a+"-ри":7===b||8===b?a+"-ми":a+"-ти"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"১",2:"২",3:"৩",4:"৪",5:"৫",6:"৬",7:"৭",8:"৮",9:"৯",0:"০"},c={"১":"1","২":"2","৩":"3","৪":"4","৫":"5","৬":"6","৭":"7","৮":"8","৯":"9","০":"0"};return a.defineLocale("bn",{months:"জানà§à§Ÿà¦¾à¦°à§€_ফেবà§à§Ÿà¦¾à¦°à§€_মারà§à¦š_à¦à¦ªà§à¦°à¦¿à¦²_মে_জà§à¦¨_জà§à¦²à¦¾à¦‡_অগাসà§à¦Ÿ_সেপà§à¦Ÿà§‡à¦®à§à¦¬à¦°_অকà§à¦Ÿà§‹à¦¬à¦°_নভেমà§à¦¬à¦°_ডিসেমà§à¦¬à¦°".split("_"),monthsShort:"জানà§_ফেব_মারà§à¦š_à¦à¦ªà¦°_মে_জà§à¦¨_জà§à¦²_অগ_সেপà§à¦Ÿ_অকà§à¦Ÿà§‹_নভ_ডিসেমà§".split("_"),weekdays:"রবিবার_সোমবার_মঙà§à¦—লবার_বà§à¦§à¦¬à¦¾à¦°_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿à¦¬à¦¾à¦°_শà§à¦•à§à¦°à§à¦¬à¦¾à¦°_শনিবার".split("_"),weekdaysShort:"রবি_সোম_মঙà§à¦—ল_বà§à¦§_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿_শà§à¦•à§à¦°à§_শনি".split("_"),weekdaysMin:"রব_সম_মঙà§à¦—_বà§_বà§à¦°à¦¿à¦¹_শà§_শনি".split("_"),longDateFormat:{LT:"A h:mm সময়",LTS:"A h:mm:ss সময়",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[আজ] LT",nextDay:"[আগামীকাল] LT",nextWeek:"dddd, LT",lastDay:"[গতকাল] LT",lastWeek:"[গত] dddd, LT",sameElse:"L"},relativeTime:{future:"%s পরে",past:"%s আগে",s:"কà¦à¦• সেকেনà§à¦¡",m:"à¦à¦• মিনিট",mm:"%d মিনিট",h:"à¦à¦• ঘনà§à¦Ÿà¦¾",hh:"%d ঘনà§à¦Ÿà¦¾",d:"à¦à¦• দিন",dd:"%d দিন",M:"à¦à¦• মাস",MM:"%d মাস",y:"à¦à¦• বছর",yy:"%d বছর"},preparse:function(a){return a.replace(/[১২৩৪৫৬৭৮৯০]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/রাত|শকাল|দà§à¦ªà§à¦°|বিকেল|রাত/,isPM:function(a){return/^(দà§à¦ªà§à¦°|বিকেল|রাত)$/.test(a)},meridiem:function(a){return 4>a?"রাত":10>a?"শকাল":17>a?"দà§à¦ªà§à¦°":20>a?"বিকেল":"রাত"},week:{dow:0,doy:6}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"༡",2:"༢",3:"༣",4:"༤",5:"༥",6:"༦",7:"༧",8:"༨",9:"༩",0:"༠"},c={"༡":"1","༢":"2","༣":"3","༤":"4","༥":"5","༦":"6","༧":"7","༨":"8","༩":"9","༠":"0"};return a.defineLocale("bo",{months:"ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ".split("_"),monthsShort:"ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ".split("_"),weekdays:"གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་".split("_"),weekdaysShort:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),weekdaysMin:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),longDateFormat:{LT:"A h:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[དི་རིང] LT",nextDay:"[སང་ཉིན] LT",nextWeek:"[བདུན་ཕྲག་རྗེས་མ], LT",lastDay:"[à½à¼‹à½¦à½„] LT",lastWeek:"[བདུན་ཕྲག་མà½à½ à¼‹à½˜] dddd, LT",sameElse:"L"},relativeTime:{future:"%s ལ་",past:"%s སྔན་ལ",s:"ལམ་སང",m:"སà¾à½¢à¼‹à½˜à¼‹à½‚ཅིག",mm:"%d སà¾à½¢à¼‹à½˜",h:"ཆུ་ཚོད་གཅིག",hh:"%d ཆུ་ཚོད",d:"ཉིན་གཅིག",dd:"%d ཉིན་",M:"ཟླ་བ་གཅིག",MM:"%d ཟླ་བ",y:"ལོ་གཅིག",yy:"%d ལོ"},preparse:function(a){return a.replace(/[༡༢༣༤༥༦༧༨༩༠]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,isPM:function(a){return/^(ཉིན་གུང|དགོང་དག|མཚན་མོ)$/.test(a)},meridiem:function(a){return 4>a?"མཚན་མོ":10>a?"ཞོགས་ཀས":17>a?"ཉིན་གུང":20>a?"དགོང་དག":"མཚན་མོ"},week:{dow:0,doy:6}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d={mm:"munutenn",MM:"miz",dd:"devezh"};return a+" "+e(d[c],a)}function c(a){switch(d(a)){case 1:case 3:case 4:case 5:case 9:return a+" bloaz";default:return a+" vloaz"}}function d(a){return a>9?d(a%10):a}function e(a,b){return 2===b?f(a):a}function f(a){var b={m:"v",b:"v",d:"z"};return void 0===b[a.charAt(0)]?a:b[a.charAt(0)]+a.substring(1)}return a.defineLocale("br",{months:"Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),longDateFormat:{LT:"h[e]mm A",LTS:"h[e]mm:ss A",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY LT",LLLL:"dddd, D [a viz] MMMM YYYY LT"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc'hoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec'h da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s 'zo",s:"un nebeud segondennoù",m:"ur vunutenn",mm:b,h:"un eur",hh:"%d eur",d:"un devezh",dd:b,M:"ur miz",MM:b,y:"ur bloaz",yy:c},ordinalParse:/\d{1,2}(añ|vet)/,ordinal:function(a){var b=1===a?"añ":"vet";return a+b},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d=a+" ";switch(c){case"m":return b?"jedna minuta":"jedne minute";case"mm":return d+=1===a?"minuta":2===a||3===a||4===a?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return d+=1===a?"sat":2===a||3===a||4===a?"sata":"sati";case"dd":return d+=1===a?"dan":"dana";case"MM":return d+=1===a?"mjesec":2===a||3===a||4===a?"mjeseca":"mjeseci";case"yy":return d+=1===a?"godina":2===a||3===a||4===a?"godine":"godina"}}return a.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),weekdays:"nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._Äet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_Äe_pe_su".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[proÅ¡lu] dddd [u] LT";case 6:return"[proÅ¡le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[proÅ¡li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:b,mm:b,h:b,hh:b,d:"dan",dd:b,M:"mjesec",MM:b,y:"godinu",yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ca",{months:"gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),monthsShort:"gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.".split("_"),weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[demà a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"fa %s",s:"uns segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},ordinalParse:/\d{1,2}(r|n|t|è|a)/,ordinal:function(a,b){var c=1===a?"r":2===a?"n":3===a?"r":4===a?"t":"è";return("w"===b||"W"===b)&&(c="a"),a+c},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a){return a>1&&5>a&&1!==~~(a/10)}function c(a,c,d,e){var f=a+" ";switch(d){case"s":return c||e?"pár sekund":"pár sekundami";case"m":return c?"minuta":e?"minutu":"minutou";case"mm":return c||e?f+(b(a)?"minuty":"minut"):f+"minutami";break;case"h":return c?"hodina":e?"hodinu":"hodinou";case"hh":return c||e?f+(b(a)?"hodiny":"hodin"):f+"hodinami";break;case"d":return c||e?"den":"dnem";case"dd":return c||e?f+(b(a)?"dny":"dní"):f+"dny";break;case"M":return c||e?"mÄ›síc":"mÄ›sícem";case"MM":return c||e?f+(b(a)?"mÄ›síce":"mÄ›síců"):f+"mÄ›síci";break;case"y":return c||e?"rok":"rokem";case"yy":return c||e?f+(b(a)?"roky":"let"):f+"lety"}}var d="leden_únor_bÅ™ezen_duben_kvÄ›ten_Äerven_Äervenec_srpen_září_říjen_listopad_prosinec".split("_"),e="led_úno_bÅ™e_dub_kvÄ›_Ävn_Ävc_srp_zář_říj_lis_pro".split("_");return a.defineLocale("cs",{months:d,monthsShort:e,monthsParse:function(a,b){var c,d=[];for(c=0;12>c;c++)d[c]=new RegExp("^"+a[c]+"$|^"+b[c]+"$","i");return d}(d,e),weekdays:"nedÄ›le_pondÄ›lí_úterý_stÅ™eda_Ätvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_Ät_pá_so".split("_"),weekdaysMin:"ne_po_út_st_Ät_pá_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedÄ›li v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve stÅ™edu v] LT";case 4:return"[ve Ätvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[vÄera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou nedÄ›li v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou stÅ™edu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pÅ™ed %s",s:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("cv",{months:"кăрлач_нарăÑ_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав".split("_"),monthsShort:"кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш".split("_"),weekdays:"вырÑарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_Ñрнекун_шăматкун".split("_"),weekdaysShort:"выр_тун_ытл_юн_кĕç_Ñрн_шăм".split("_"),weekdaysMin:"вр_тн_Ñ‹Ñ‚_юн_кç_ÑÑ€_шм".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD-MM-YYYY",LL:"YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]",LLL:"YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT",LLLL:"dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT"},calendar:{sameDay:"[ПаÑн] LT [Ñехетре]",nextDay:"[Ыран] LT [Ñехетре]",lastDay:"[Ĕнер] LT [Ñехетре]",nextWeek:"[ÇитеÑ] dddd LT [Ñехетре]",lastWeek:"[Иртнĕ] dddd LT [Ñехетре]",sameElse:"L"},relativeTime:{future:function(a){var b=/Ñехет$/i.exec(a)?"рен":/çул$/i.exec(a)?"тан":"ран";return a+b},past:"%s каÑлла",s:"пĕр-ик çеккунт",m:"пĕр минут",mm:"%d минут",h:"пĕр Ñехет",hh:"%d Ñехет",d:"пĕр кун",dd:"%d кун",M:"пĕр уйăх",MM:"%d уйăх",y:"пĕр çул",yy:"%d çул"},ordinalParse:/\d{1,2}-мĕш/,ordinal:"%d-мĕш",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("cy",{months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Heddiw am] LT",nextDay:"[Yfory am] LT",nextWeek:"dddd [am] LT",lastDay:"[Ddoe am] LT",lastWeek:"dddd [diwethaf am] LT",sameElse:"L"},relativeTime:{future:"mewn %s",past:"%s yn ôl",s:"ychydig eiliadau",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"},ordinalParse:/\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,ordinal:function(a){var b=a,c="",d=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"];return b>20?c=40===b||50===b||60===b||80===b||100===b?"fed":"ain":b>0&&(c=d[b]),a+c},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd [d.] D. MMMM YYYY LT"},calendar:{sameDay:"[I dag kl.] LT",nextDay:"[I morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[I gÃ¥r kl.] LT",lastWeek:"[sidste] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"fÃ¥ sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en mÃ¥ned",MM:"%d mÃ¥neder",y:"et Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[a+" Tage",a+" Tagen"],M:["ein Monat","einem Monat"],MM:[a+" Monate",a+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[a+" Jahre",a+" Jahren"]};return b?d[c][0]:d[c][1]}return a.defineLocale("de-at",{months:"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT [Uhr]",sameElse:"L",nextDay:"[Morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[Gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:b,mm:"%d Minuten",h:b,hh:"%d Stunden",d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[a+" Tage",a+" Tagen"],M:["ein Monat","einem Monat"],MM:[a+" Monate",a+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[a+" Jahre",a+" Jahren"]};return b?d[c][0]:d[c][1]}return a.defineLocale("de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT [Uhr]",sameElse:"L",nextDay:"[Morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[Gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:b,mm:"%d Minuten",h:b,hh:"%d Stunden",d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("el",{monthsNominativeEl:"ΙανουάÏιος_ΦεβÏουάÏιος_ΜάÏτιος_ΑπÏίλιος_Μάιος_ΙοÏνιος_ΙοÏλιος_ΑÏγουστος_ΣεπτέμβÏιος_ΟκτώβÏιος_ÎοέμβÏιος_ΔεκέμβÏιος".split("_"),monthsGenitiveEl:"ΙανουαÏίου_ΦεβÏουαÏίου_ΜαÏτίου_ΑπÏιλίου_ΜαÎου_Ιουνίου_Ιουλίου_ΑυγοÏστου_ΣεπτεμβÏίου_ΟκτωβÏίου_ÎοεμβÏίου_ΔεκεμβÏίου".split("_"),months:function(a,b){return/D/.test(b.substring(0,b.indexOf("MMMM")))?this._monthsGenitiveEl[a.month()]:this._monthsNominativeEl[a.month()]},monthsShort:"Ιαν_Φεβ_ΜαÏ_ΑπÏ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Îοε_Δεκ".split("_"),weekdays:"ΚυÏιακή_ΔευτέÏα_ΤÏίτη_ΤετάÏτη_Πέμπτη_ΠαÏασκευή_Σάββατο".split("_"),weekdaysShort:"ΚυÏ_Δευ_ΤÏι_Τετ_Πεμ_ΠαÏ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_ΤÏ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(a,b,c){return a>11?c?"μμ":"ΜΜ":c?"πμ":"ΠΜ"},isPM:function(a){return"μ"===(a+"").toLowerCase()[0]},meridiemParse:/[ΠΜ]\.?Îœ?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendarEl:{sameDay:"[ΣήμεÏα {}] LT",nextDay:"[ΑÏÏιο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[το Ï€ÏοηγοÏμενο] dddd [{}] LT";default:return"[την Ï€ÏοηγοÏμενη] dddd [{}] LT"}},sameElse:"L"},calendar:function(a,b){var c=this._calendarEl[a],d=b&&b.hours();return"function"==typeof c&&(c=c.apply(b)),c.replace("{}",d%12===1?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s Ï€Ïιν",s:"λίγα δευτεÏόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ÏŽÏα",hh:"%d ÏŽÏες",d:"μία μέÏα",dd:"%d μέÏες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χÏόνος",yy:"%d χÏόνια"},ordinalParse:/\d{1,2}η/,ordinal:"%dη",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},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"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th"; -return a+c},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"D MMMM, YYYY",LLL:"D MMMM, YYYY LT",LLLL:"dddd, D MMMM, YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},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"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},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"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_aÅ­gusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aÅ­g_sep_okt_nov_dec".split("_"),weekdays:"Dimanĉo_Lundo_Mardo_Merkredo_Ä´aÅ­do_Vendredo_Sabato".split("_"),weekdaysShort:"Dim_Lun_Mard_Merk_Ä´aÅ­_Ven_Sab".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Ä´a_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"D[-an de] MMMM, YYYY",LLL:"D[-an de] MMMM, YYYY LT",LLLL:"dddd, [la] D[-an de] MMMM, YYYY LT"},meridiemParse:/[ap]\.t\.m/i,isPM:function(a){return"p"===a.charAt(0).toLowerCase()},meridiem:function(a,b,c){return a>11?c?"p.t.m.":"P.T.M.":c?"a.t.m.":"A.T.M."},calendar:{sameDay:"[HodiaÅ­ je] LT",nextDay:"[MorgaÅ­ je] LT",nextWeek:"dddd [je] LT",lastDay:"[HieraÅ­ je] LT",lastWeek:"[pasinta] dddd [je] LT",sameElse:"L"},relativeTime:{future:"je %s",past:"antaÅ­ %s",s:"sekundoj",m:"minuto",mm:"%d minutoj",h:"horo",hh:"%d horoj",d:"tago",dd:"%d tagoj",M:"monato",MM:"%d monatoj",y:"jaro",yy:"%d jaroj"},ordinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),c="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");return a.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(a,d){return/-MMM-/.test(d)?c[a.month()]:b[a.month()]},weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c,d){var e={s:["mõne sekundi","mõni sekund","paar sekundit"],m:["ühe minuti","üks minut"],mm:[a+" minuti",a+" minutit"],h:["ühe tunni","tund aega","üks tund"],hh:[a+" tunni",a+" tundi"],d:["ühe päeva","üks päev"],M:["kuu aja","kuu aega","üks kuu"],MM:[a+" kuu",a+" kuud"],y:["ühe aasta","aasta","üks aasta"],yy:[a+" aasta",a+" aastat"]};return b?e[c][2]?e[c][2]:e[c][1]:d?e[c][0]:e[c][1]}return a.defineLocale("et",{months:"jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Täna,] LT",nextDay:"[Homme,] LT",nextWeek:"[Järgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s pärast",past:"%s tagasi",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:"%d päeva",M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] LT",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] LT",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] LT",llll:"ddd, YYYY[ko] MMM D[a] LT"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"Û±",2:"Û²",3:"Û³",4:"Û´",5:"Ûµ",6:"Û¶",7:"Û·",8:"Û¸",9:"Û¹",0:"Û°"},c={"Û±":"1","Û²":"2","Û³":"3","Û´":"4","Ûµ":"5","Û¶":"6","Û·":"7","Û¸":"8","Û¹":"9","Û°":"0"};return a.defineLocale("fa",{months:"ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ÛŒ_د_س_Ú†_Ù¾_ج_Ø´".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},meridiemParse:/قبل از ظهر|بعد از ظهر/,isPM:function(a){return/بعد از ظهر/.test(a)},meridiem:function(a){return 12>a?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[Ùردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چندین ثانیه",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(a){return a.replace(/[Û°-Û¹]/g,function(a){return c[a]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]}).replace(/,/g,"ØŒ")},ordinalParse:/\d{1,2}Ù…/,ordinal:"%dÙ…",week:{dow:6,doy:12}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,d,e){var f="";switch(d){case"s":return e?"muutaman sekunnin":"muutama sekunti";case"m":return e?"minuutin":"minuutti";case"mm":f=e?"minuutin":"minuuttia";break;case"h":return e?"tunnin":"tunti";case"hh":f=e?"tunnin":"tuntia";break;case"d":return e?"päivän":"päivä";case"dd":f=e?"päivän":"päivää";break;case"M":return e?"kuukauden":"kuukausi";case"MM":f=e?"kuukauden":"kuukautta";break;case"y":return e?"vuoden":"vuosi";case"yy":f=e?"vuoden":"vuotta"}return f=c(a,e)+" "+f}function c(a,b){return 10>a?b?e[a]:d[a]:a}var d="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),e=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",d[7],d[8],d[9]];return a.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] LT",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] LT",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] LT",llll:"ddd, Do MMM YYYY, [klo] LT"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("fo",{months:"januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur".split("_"),weekdaysShort:"sun_mán_týs_mik_hós_frí_ley".split("_"),weekdaysMin:"su_má_tý_mi_hó_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D. MMMM, YYYY LT"},calendar:{sameDay:"[à dag kl.] LT",nextDay:"[à morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[à gjár kl.] LT",lastWeek:"[síðstu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s síðani",s:"fá sekund",m:"ein minutt",mm:"%d minuttir",h:"ein tími",hh:"%d tímar",d:"ein dagur",dd:"%d dagar",M:"ein mánaði",MM:"%d mánaðir",y:"eitt ár",yy:"%d ár"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|)/,ordinal:function(a){return a+(1===a?"er":"")}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|)/,ordinal:function(a){return a+(1===a?"er":"")},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b="jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.".split("_"),c="jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_");return a.defineLocale("fy",{months:"jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber".split("_"),monthsShort:function(a,d){return/-MMM-/.test(d)?c[a.month()]:b[a.month()]},weekdays:"snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon".split("_"),weekdaysShort:"si._mo._ti._wo._to._fr._so.".split("_"),weekdaysMin:"Si_Mo_Ti_Wo_To_Fr_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[hjoed om] LT",nextDay:"[moarn om] LT",nextWeek:"dddd [om] LT",lastDay:"[juster om] LT",lastWeek:"[ôfrûne] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oer %s",past:"%s lyn",s:"in pear sekonden",m:"ien minút",mm:"%d minuten",h:"ien oere",hh:"%d oeren",d:"ien dei",dd:"%d dagen",M:"ien moanne",MM:"%d moannen",y:"ien jier",yy:"%d jierren"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("gl",{months:"Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro".split("_"),monthsShort:"Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.".split("_"),weekdays:"Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado".split("_"),weekdaysShort:"Dom._Lun._Mar._Mér._Xov._Ven._Sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mé_Xo_Ve_Sá".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"ás":"á")+"] LT"},nextDay:function(){return"[mañá "+(1!==this.hours()?"ás":"á")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"ás":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"á":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"ás":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(a){return"uns segundos"===a?"nuns segundos":"en "+a},past:"hai %s",s:"uns segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("he",{months:"ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר".split("_"),monthsShort:"ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳".split("_"),weekdays:"ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),weekdaysShort:"×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),weekdaysMin:"×_ב_×’_ד_×”_ו_ש".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY LT",LLLL:"dddd, D [ב]MMMM YYYY LT",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY LT",llll:"ddd, D MMM YYYY LT"},calendar:{sameDay:"[×”×™×•× ×‘Ö¾]LT",nextDay:"[מחר ב־]LT",nextWeek:"dddd [בשעה] LT",lastDay:"[×תמול ב־]LT",lastWeek:"[ביו×] dddd [×”×חרון בשעה] LT",sameElse:"L"},relativeTime:{future:"בעוד %s",past:"לפני %s",s:"מספר שניות",m:"דקה",mm:"%d דקות",h:"שעה",hh:function(a){return 2===a?"שעתיי×":a+" שעות"},d:"יו×",dd:function(a){return 2===a?"יומיי×":a+" ימי×"},M:"חודש",MM:function(a){return 2===a?"חודשיי×":a+" חודשי×"},y:"שנה",yy:function(a){return 2===a?"שנתיי×":a%10===0&&10!==a?a+" שנה":a+" שני×"}}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return a.defineLocale("hi",{months:"जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°".split("_"),monthsShort:"जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.".split("_"),weekdays:"रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि".split("_"),weekdaysMin:"र_सो_मं_बà¥_गà¥_शà¥_श".split("_"),longDateFormat:{LT:"A h:mm बजे",LTS:"A h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कà¥à¤› ही कà¥à¤·à¤£",m:"à¤à¤• मिनट",mm:"%d मिनट",h:"à¤à¤• घंटा",hh:"%d घंटे",d:"à¤à¤• दिन",dd:"%d दिन",M:"à¤à¤• महीने",MM:"%d महीने",y:"à¤à¤• वरà¥à¤·",yy:"%d वरà¥à¤·"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/रात|सà¥à¤¬à¤¹|दोपहर|शाम/,meridiemHour:function(a,b){return 12===a&&(a=0),"रात"===b?4>a?a:a+12:"सà¥à¤¬à¤¹"===b?a:"दोपहर"===b?a>=10?a:a+12:"शाम"===b?a+12:void 0},meridiem:function(a){return 4>a?"रात":10>a?"सà¥à¤¬à¤¹":17>a?"दोपहर":20>a?"शाम":"रात"},week:{dow:0,doy:6}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d=a+" ";switch(c){case"m":return b?"jedna minuta":"jedne minute";case"mm":return d+=1===a?"minuta":2===a||3===a||4===a?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return d+=1===a?"sat":2===a||3===a||4===a?"sata":"sati";case"dd":return d+=1===a?"dan":"dana";case"MM":return d+=1===a?"mjesec":2===a||3===a||4===a?"mjeseca":"mjeseci";case"yy":return d+=1===a?"godina":2===a||3===a||4===a?"godine":"godina"}}return a.defineLocale("hr",{months:"sjeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_"),monthsShort:"sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),weekdays:"nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._Äet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_Äe_pe_su".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[proÅ¡lu] dddd [u] LT";case 6:return"[proÅ¡le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[proÅ¡li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:b,mm:b,h:b,hh:b,d:"dan",dd:b,M:"mjesec",MM:b,y:"godinu",yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c,d){var e=a;switch(c){case"s":return d||b?"néhány másodperc":"néhány másodperce";case"m":return"egy"+(d||b?" perc":" perce");case"mm":return e+(d||b?" perc":" perce");case"h":return"egy"+(d||b?" óra":" órája");case"hh":return e+(d||b?" óra":" órája");case"d":return"egy"+(d||b?" nap":" napja");case"dd":return e+(d||b?" nap":" napja");case"M":return"egy"+(d||b?" hónap":" hónapja");case"MM":return e+(d||b?" hónap":" hónapja");case"y":return"egy"+(d||b?" év":" éve");case"yy":return e+(d||b?" év":" éve")}return""}function c(a){return(a?"":"[múlt] ")+"["+d[this.day()]+"] LT[-kor]"}var d="vasárnap hétfÅ‘n kedden szerdán csütörtökön pénteken szombaton".split(" ");return a.defineLocale("hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfÅ‘_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D., LT",LLLL:"YYYY. MMMM D., dddd LT"},meridiemParse:/de|du/i,isPM:function(a){return"u"===a.charAt(1).toLowerCase()},meridiem:function(a,b,c){return 12>a?c===!0?"de":"DE":c===!0?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return c.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return c.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b){var c={nominative:"Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€_Õ´Õ¡Ö€Õ¿_Õ¡ÕºÖ€Õ«Õ¬_Õ´Õ¡ÕµÕ«Õ½_Õ°Õ¸Ö‚Õ¶Õ«Õ½_Õ°Õ¸Ö‚Õ¬Õ«Õ½_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€".split("_"),accusative:"Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€Õ«_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€Õ«_Õ´Õ¡Ö€Õ¿Õ«_Õ¡ÕºÖ€Õ«Õ¬Õ«_Õ´Õ¡ÕµÕ«Õ½Õ«_Õ°Õ¸Ö‚Õ¶Õ«Õ½Õ«_Õ°Õ¸Ö‚Õ¬Õ«Õ½Õ«_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½Õ«_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function c(a){var b="Õ°Õ¶Õ¾_ÖƒÕ¿Ö€_Õ´Ö€Õ¿_Õ¡ÕºÖ€_Õ´ÕµÕ½_Õ°Õ¶Õ½_Õ°Õ¬Õ½_Ö…Õ£Õ½_Õ½ÕºÕ¿_Õ°Õ¯Õ¿_Õ¶Õ´Õ¢_Õ¤Õ¯Õ¿".split("_");return b[a.month()]}function d(a){var b="Õ¯Õ«Ö€Õ¡Õ¯Õ«_Õ¥Ö€Õ¯Õ¸Ö‚Õ·Õ¡Õ¢Õ©Õ«_Õ¥Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ¹Õ¸Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ°Õ«Õ¶Õ£Õ·Õ¡Õ¢Õ©Õ«_Õ¸Ö‚Ö€Õ¢Õ¡Õ©_Õ·Õ¡Õ¢Õ¡Õ©".split("_");return b[a.day()]}return a.defineLocale("hy-am",{months:b,monthsShort:c,weekdays:d,weekdaysShort:"Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©".split("_"),weekdaysMin:"Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY Õ©.",LLL:"D MMMM YYYY Õ©., LT",LLLL:"dddd, D MMMM YYYY Õ©., LT"},calendar:{sameDay:"[Õ¡ÕµÕ½Ö…Ö€] LT",nextDay:"[Õ¾Õ¡Õ²Õ¨] LT",lastDay:"[Õ¥Ö€Õ¥Õ¯] LT",nextWeek:function(){return"dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT"},lastWeek:function(){return"[Õ¡Õ¶ÖÕ¡Õ®] dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT"},sameElse:"L"},relativeTime:{future:"%s Õ°Õ¥Õ¿Õ¸",past:"%s Õ¡Õ¼Õ¡Õ»",s:"Õ´Õ« Ö„Õ¡Õ¶Õ« Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶",m:"Ö€Õ¸ÕºÕ¥",mm:"%d Ö€Õ¸ÕºÕ¥",h:"ÕªÕ¡Õ´",hh:"%d ÕªÕ¡Õ´",d:"Ö…Ö€",dd:"%d Ö…Ö€",M:"Õ¡Õ´Õ«Õ½",MM:"%d Õ¡Õ´Õ«Õ½",y:"Õ¿Õ¡Ö€Õ«",yy:"%d Õ¿Õ¡Ö€Õ«"},meridiemParse:/Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡|Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡|ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶/,isPM:function(a){return/^(ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶)$/.test(a)},meridiem:function(a){return 4>a?"Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡":12>a?"Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡":17>a?"ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡":"Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶"},ordinalParse:/\d{1,2}|\d{1,2}-(Õ«Õ¶|Ö€Õ¤)/,ordinal:function(a,b){switch(b){case"DDD":case"w":case"W":case"DDDo":return 1===a?a+"-Õ«Õ¶":a+"-Ö€Õ¤";default:return a}},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"LT.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] LT",LLLL:"dddd, D MMMM YYYY [pukul] LT"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(a,b){return 12===a&&(a=0),"pagi"===b?a:"siang"===b?a>=11?a:a+12:"sore"===b||"malam"===b?a+12:void 0},meridiem:function(a){return 11>a?"pagi":15>a?"siang":19>a?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a){return a%100===11?!0:a%10===1?!1:!0}function c(a,c,d,e){var f=a+" ";switch(d){case"s":return c||e?"nokkrar sekúndur":"nokkrum sekúndum";case"m":return c?"mínúta":"mínútu";case"mm":return b(a)?f+(c||e?"mínútur":"mínútum"):c?f+"mínúta":f+"mínútu";case"hh":return b(a)?f+(c||e?"klukkustundir":"klukkustundum"):f+"klukkustund";case"d":return c?"dagur":e?"dag":"degi";case"dd":return b(a)?c?f+"dagar":f+(e?"daga":"dögum"):c?f+"dagur":f+(e?"dag":"degi");case"M":return c?"mánuður":e?"mánuð":"mánuði";case"MM":return b(a)?c?f+"mánuðir":f+(e?"mánuði":"mánuðum"):c?f+"mánuður":f+(e?"mánuð":"mánuði");case"y":return c||e?"ár":"ári";case"yy":return b(a)?f+(c||e?"ár":"árum"):f+(c||e?"ár":"ári")}}return a.defineLocale("is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd, D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:c,m:c,mm:c,h:"klukkustund",hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),weekdaysShort:"Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),weekdaysMin:"D_L_Ma_Me_G_V_S".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(a){return(/^[0-9].+$/.test(a)?"tra":"in")+" "+a},past:"%s fa",s:"alcuni secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_ç«æ›œæ—¥_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"æ—¥_月_ç«_æ°´_木_金_土".split("_"),weekdaysMin:"æ—¥_月_ç«_æ°´_木_金_土".split("_"),longDateFormat:{LT:"Ah時m分",LTS:"LTs秒",L:"YYYY/MM/DD",LL:"YYYYå¹´M月Dæ—¥",LLL:"YYYYå¹´M月Dæ—¥LT",LLLL:"YYYYå¹´M月Dæ—¥LT dddd"},meridiemParse:/åˆå‰|åˆå¾Œ/i,isPM:function(a){return"åˆå¾Œ"===a},meridiem:function(a){return 12>a?"åˆå‰":"åˆå¾Œ"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:"[æ¥é€±]dddd LT",lastDay:"[昨日] LT",lastWeek:"[å‰é€±]dddd LT",sameElse:"L"},relativeTime:{future:"%s後",past:"%så‰",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1æ—¥",dd:"%dæ—¥",M:"1ヶ月",MM:"%dヶ月",y:"1å¹´",yy:"%då¹´"}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b){var c={nominative:"იáƒáƒœáƒ•áƒáƒ áƒ˜_თებერვáƒáƒšáƒ˜_მáƒáƒ áƒ¢áƒ˜_áƒáƒžáƒ áƒ˜áƒšáƒ˜_მáƒáƒ˜áƒ¡áƒ˜_ივნისი_ივლისი_áƒáƒ’ვისტáƒ_სექტემბერი_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი_ნáƒáƒ”მბერი_დეკემბერი".split("_"),accusative:"იáƒáƒœáƒ•áƒáƒ áƒ¡_თებერვáƒáƒšáƒ¡_მáƒáƒ áƒ¢áƒ¡_áƒáƒžáƒ áƒ˜áƒšáƒ˜áƒ¡_მáƒáƒ˜áƒ¡áƒ¡_ივნისს_ივლისს_áƒáƒ’ვისტს_სექტემბერს_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერს_ნáƒáƒ”მბერს_დეკემბერს".split("_")},d=/D[oD] *MMMM?/.test(b)?"accusative":"nominative"; -return c[d][a.month()]}function c(a,b){var c={nominative:"კვირáƒ_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ი_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი_ხუთშáƒáƒ‘áƒáƒ—ი_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი_შáƒáƒ‘áƒáƒ—ი".split("_"),accusative:"კვირáƒáƒ¡_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ს_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ს_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ს_ხუთშáƒáƒ‘áƒáƒ—ს_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვს_შáƒáƒ‘áƒáƒ—ს".split("_")},d=/(წინáƒ|შემდეგ)/.test(b)?"accusative":"nominative";return c[d][a.day()]}return a.defineLocale("ka",{months:b,monthsShort:"იáƒáƒœ_თებ_მáƒáƒ _áƒáƒžáƒ _მáƒáƒ˜_ივნ_ივლ_áƒáƒ’ვ_სექ_áƒáƒ¥áƒ¢_ნáƒáƒ”_დეკ".split("_"),weekdays:c,weekdaysShort:"კვი_áƒáƒ áƒ¨_სáƒáƒ›_áƒáƒ—ხ_ხუთ_პáƒáƒ _შáƒáƒ‘".split("_"),weekdaysMin:"კვ_áƒáƒ _სáƒ_áƒáƒ—_ხუ_პáƒ_შáƒ".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[დღეს] LT[-ზე]",nextDay:"[ხვáƒáƒš] LT[-ზე]",lastDay:"[გუშინ] LT[-ზე]",nextWeek:"[შემდეგ] dddd LT[-ზე]",lastWeek:"[წინáƒ] dddd LT-ზე",sameElse:"L"},relativeTime:{future:function(a){return/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|წელი)/.test(a)?a.replace(/ი$/,"ში"):a+"ში"},past:function(a){return/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|დღე|თვე)/.test(a)?a.replace(/(ი|ე)$/,"ის წინ"):/წელი/.test(a)?a.replace(/წელი$/,"წლის წინ"):void 0},s:"რáƒáƒ›áƒ“ენიმე წáƒáƒ›áƒ˜",m:"წუთი",mm:"%d წუთი",h:"სáƒáƒáƒ—ი",hh:"%d სáƒáƒáƒ—ი",d:"დღე",dd:"%d დღე",M:"თვე",MM:"%d თვე",y:"წელი",yy:"%d წელი"},ordinalParse:/0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/,ordinal:function(a){return 0===a?a:1===a?a+"-ლი":20>a||100>=a&&a%20===0||a%100===0?"მე-"+a:a+"-ე"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("km",{months:"មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ".split("_"),monthsShort:"មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ".split("_"),weekdays:"អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ".split("_"),weekdaysShort:"អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ".split("_"),weekdaysMin:"អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[ážáŸ’ងៃនៈ ម៉ោង] LT",nextDay:"[ស្អែក ម៉ោង] LT",nextWeek:"dddd [ម៉ោង] LT",lastDay:"[ម្សិលមិញ ម៉ោង] LT",lastWeek:"dddd [សប្ážáž¶áž áŸáž˜áž»áž“] [ម៉ោង] LT",sameElse:"L"},relativeTime:{future:"%sទៀáž",past:"%sមុន",s:"ប៉ុន្មានវិនាទី",m:"មួយនាទី",mm:"%d នាទី",h:"មួយម៉ោង",hh:"%d ម៉ោង",d:"មួយážáŸ’ងៃ",dd:"%d ážáŸ’ងៃ",M:"មួយážáŸ‚",MM:"%d ážáŸ‚",y:"មួយឆ្នាំ",yy:"%d ឆ្នាំ"},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ko",{months:"1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"),monthsShort:"1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"),weekdays:"ì¼ìš”ì¼_월요ì¼_화요ì¼_수요ì¼_목요ì¼_금요ì¼_토요ì¼".split("_"),weekdaysShort:"ì¼_ì›”_í™”_수_목_금_토".split("_"),weekdaysMin:"ì¼_ì›”_í™”_수_목_금_토".split("_"),longDateFormat:{LT:"A hì‹œ m분",LTS:"A hì‹œ m분 sì´ˆ",L:"YYYY.MM.DD",LL:"YYYYë…„ MMMM Dì¼",LLL:"YYYYë…„ MMMM Dì¼ LT",LLLL:"YYYYë…„ MMMM Dì¼ dddd LT"},calendar:{sameDay:"오늘 LT",nextDay:"ë‚´ì¼ LT",nextWeek:"dddd LT",lastDay:"ì–´ì œ LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s ì „",s:"몇초",ss:"%dì´ˆ",m:"ì¼ë¶„",mm:"%d분",h:"한시간",hh:"%d시간",d:"하루",dd:"%dì¼",M:"한달",MM:"%d달",y:"ì¼ë…„",yy:"%dë…„"},ordinalParse:/\d{1,2}ì¼/,ordinal:"%dì¼",meridiemParse:/오전|오후/,isPM:function(a){return"오후"===a},meridiem:function(a){return 12>a?"오전":"오후"}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return b?d[c][0]:d[c][1]}function c(a){var b=a.substr(0,a.indexOf(" "));return e(b)?"a "+a:"an "+a}function d(a){var b=a.substr(0,a.indexOf(" "));return e(b)?"viru "+a:"virun "+a}function e(a){if(a=parseInt(a,10),isNaN(a))return!1;if(0>a)return!0;if(10>a)return a>=4&&7>=a?!0:!1;if(100>a){var b=a%10,c=a/10;return e(0===b?c:b)}if(1e4>a){for(;a>=10;)a/=10;return e(a)}return a/=1e3,e(a)}return a.defineLocale("lb",{months:"Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._Mé._Dë._Më._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mé_Dë_Më_Do_Fr_Sa".split("_"),longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gëschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:c,past:d,s:"e puer Sekonnen",m:b,mm:"%d Minutten",h:b,hh:"%d Stonnen",d:b,dd:"%d Deeg",M:b,MM:"%d Méint",y:b,yy:"%d Joer"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c,d){return b?"kelios sekundÄ—s":d?"kelių sekundžių":"kelias sekundes"}function c(a,b,c,d){return b?e(c)[0]:d?e(c)[1]:e(c)[2]}function d(a){return a%10===0||a>10&&20>a}function e(a){return h[a].split("_")}function f(a,b,f,g){var h=a+" ";return 1===a?h+c(a,b,f[0],g):b?h+(d(a)?e(f)[1]:e(f)[0]):g?h+e(f)[1]:h+(d(a)?e(f)[1]:e(f)[2])}function g(a,b){var c=-1===b.indexOf("dddd HH:mm"),d=i[a.day()];return c?d:d.substring(0,d.length-2)+"į"}var h={m:"minutÄ—_minutÄ—s_minutÄ™",mm:"minutÄ—s_minuÄių_minutes",h:"valanda_valandos_valandÄ…",hh:"valandos_valandų_valandas",d:"diena_dienos_dienÄ…",dd:"dienos_dienų_dienas",M:"mÄ—nuo_mÄ—nesio_mÄ—nesį",MM:"mÄ—nesiai_mÄ—nesių_mÄ—nesius",y:"metai_metų_metus",yy:"metai_metų_metus"},i="sekmadienis_pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis".split("_");return a.defineLocale("lt",{months:"sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio".split("_"),monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:g,weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Å eÅ¡".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Å ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], LT [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, LT [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], LT [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, LT [val.]"},calendar:{sameDay:"[Å iandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[PraÄ—jusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieÅ¡ %s",s:b,m:c,mm:f,h:c,hh:f,d:c,dd:f,M:c,MM:f,y:c,yy:f},ordinalParse:/\d{1,2}-oji/,ordinal:function(a){return a+"-oji"},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d=a.split("_");return c?b%10===1&&11!==b?d[2]:d[3]:b%10===1&&11!==b?d[0]:d[1]}function c(a,c,e){return a+" "+b(d[e],a,c)}var d={mm:"minÅ«ti_minÅ«tes_minÅ«te_minÅ«tes",hh:"stundu_stundas_stunda_stundas",dd:"dienu_dienas_diena_dienas",MM:"mÄ“nesi_mÄ“neÅ¡us_mÄ“nesis_mÄ“neÅ¡i",yy:"gadu_gadus_gads_gadi"};return a.defineLocale("lv",{months:"janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jÅ«n_jÅ«l_aug_sep_okt_nov_dec".split("_"),weekdays:"svÄ“tdiena_pirmdiena_otrdiena_treÅ¡diena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, LT",LLLL:"YYYY. [gada] D. MMMM, dddd, LT"},calendar:{sameDay:"[Å odien pulksten] LT",nextDay:"[RÄ«t pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[PagÄjuÅ¡Ä] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"%s vÄ“lÄk",past:"%s agrÄk",s:"dažas sekundes",m:"minÅ«ti",mm:c,h:"stundu",hh:c,d:"dienu",dd:c,M:"mÄ“nesi",MM:c,y:"gadu",yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("mk",{months:"јануари_февруари_март_април_мај_јуни_јули_авгуÑÑ‚_Ñептември_октомври_ноември_декември".split("_"),monthsShort:"јан_фев_мар_апр_мај_јун_јул_авг_Ñеп_окт_ное_дек".split("_"),weekdays:"недела_понеделник_вторник_Ñреда_четврток_петок_Ñабота".split("_"),weekdaysShort:"нед_пон_вто_Ñре_чет_пет_Ñаб".split("_"),weekdaysMin:"нe_пo_вт_ÑÑ€_че_пе_Ña".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Ð”ÐµÐ½ÐµÑ Ð²Ð¾] LT",nextDay:"[Утре во] LT",nextWeek:"dddd [во] LT",lastDay:"[Вчера во] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Во изминатата] dddd [во] LT";case 1:case 2:case 4:case 5:return"[Во изминатиот] dddd [во] LT"}},sameElse:"L"},relativeTime:{future:"поÑле %s",past:"пред %s",s:"неколку Ñекунди",m:"минута",mm:"%d минути",h:"чаÑ",hh:"%d чаÑа",d:"ден",dd:"%d дена",M:"меÑец",MM:"%d меÑеци",y:"година",yy:"%d години"},ordinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(a){var b=a%10,c=a%100;return 0===a?a+"-ев":0===c?a+"-ен":c>10&&20>c?a+"-ти":1===b?a+"-ви":2===b?a+"-ри":7===b||8===b?a+"-ми":a+"-ти"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ml",{months:"ജനàµà´µà´°à´¿_ഫെബàµà´°àµà´µà´°à´¿_മാർചàµà´šàµ_à´à´ªàµà´°à´¿àµ½_മേയàµ_ജൂൺ_ജൂലൈ_à´“à´—à´¸àµà´±àµà´±àµ_സെപàµà´±àµà´±à´‚ബർ_à´’à´•àµà´Ÿàµ‹à´¬àµ¼_നവംബർ_ഡിസംബർ".split("_"),monthsShort:"ജനàµ._ഫെബàµà´°àµ._മാർ._à´à´ªàµà´°à´¿._മേയàµ_ജൂൺ_ജൂലൈ._à´“à´—._സെപàµà´±àµà´±._à´’à´•àµà´Ÿàµ‹._നവം._ഡിസം.".split("_"),weekdays:"ഞായറാഴàµà´š_തിങàµà´•à´³à´¾à´´àµà´š_ചൊവàµà´µà´¾à´´àµà´š_à´¬àµà´§à´¨à´¾à´´àµà´š_à´µàµà´¯à´¾à´´à´¾à´´àµà´š_വെളàµà´³à´¿à´¯à´¾à´´àµà´š_ശനിയാഴàµà´š".split("_"),weekdaysShort:"ഞായർ_തിങàµà´•àµ¾_ചൊവàµà´µ_à´¬àµà´§àµ»_à´µàµà´¯à´¾à´´à´‚_വെളàµà´³à´¿_ശനി".split("_"),weekdaysMin:"à´žà´¾_തി_ചൊ_à´¬àµ_à´µàµà´¯à´¾_വെ_à´¶".split("_"),longDateFormat:{LT:"A h:mm -à´¨àµ",LTS:"A h:mm:ss -à´¨àµ",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[ഇനàµà´¨àµ] LT",nextDay:"[നാളെ] LT",nextWeek:"dddd, LT",lastDay:"[ഇനàµà´¨à´²àµ†] LT",lastWeek:"[à´•à´´à´¿à´žàµà´ž] dddd, LT",sameElse:"L"},relativeTime:{future:"%s à´•à´´à´¿à´žàµà´žàµ",past:"%s à´®àµàµ»à´ªàµ",s:"അൽപ നിമിഷങàµà´™àµ¾",m:"ഒരൠമിനിറàµà´±àµ",mm:"%d മിനിറàµà´±àµ",h:"ഒരൠമണികàµà´•àµ‚ർ",hh:"%d മണികàµà´•àµ‚ർ",d:"ഒരൠദിവസം",dd:"%d ദിവസം",M:"ഒരൠമാസം",MM:"%d മാസം",y:"ഒരൠവർഷം",yy:"%d വർഷം"},meridiemParse:/രാതàµà´°à´¿|രാവിലെ|ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿/i,isPM:function(a){return/^(ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿)$/.test(a)},meridiem:function(a){return 4>a?"രാതàµà´°à´¿":12>a?"രാവിലെ":17>a?"ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ":20>a?"വൈകàµà´¨àµà´¨àµ‡à´°à´‚":"രാതàµà´°à´¿"}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return a.defineLocale("mr",{months:"जानेवारी_फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€_मारà¥à¤š_à¤à¤ªà¥à¤°à¤¿à¤²_मे_जून_जà¥à¤²à¥ˆ_ऑगसà¥à¤Ÿ_सपà¥à¤Ÿà¥‡à¤‚बर_ऑकà¥à¤Ÿà¥‹à¤¬à¤°_नोवà¥à¤¹à¥‡à¤‚बर_डिसेंबर".split("_"),monthsShort:"जाने._फेबà¥à¤°à¥._मारà¥à¤š._à¤à¤ªà¥à¤°à¤¿._मे._जून._जà¥à¤²à¥ˆ._ऑग._सपà¥à¤Ÿà¥‡à¤‚._ऑकà¥à¤Ÿà¥‹._नोवà¥à¤¹à¥‡à¤‚._डिसें.".split("_"),weekdays:"रविवार_सोमवार_मंगळवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगळ_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि".split("_"),weekdaysMin:"र_सो_मं_बà¥_गà¥_शà¥_श".split("_"),longDateFormat:{LT:"A h:mm वाजता",LTS:"A h:mm:ss वाजता",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[आज] LT",nextDay:"[उदà¥à¤¯à¤¾] LT",nextWeek:"dddd, LT",lastDay:"[काल] LT",lastWeek:"[मागील] dddd, LT",sameElse:"L"},relativeTime:{future:"%s नंतर",past:"%s पूरà¥à¤µà¥€",s:"सेकंद",m:"à¤à¤• मिनिट",mm:"%d मिनिटे",h:"à¤à¤• तास",hh:"%d तास",d:"à¤à¤• दिवस",dd:"%d दिवस",M:"à¤à¤• महिना",MM:"%d महिने",y:"à¤à¤• वरà¥à¤·",yy:"%d वरà¥à¤·à¥‡"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/रातà¥à¤°à¥€|सकाळी|दà¥à¤ªà¤¾à¤°à¥€|सायंकाळी/,meridiemHour:function(a,b){return 12===a&&(a=0),"रातà¥à¤°à¥€"===b?4>a?a:a+12:"सकाळी"===b?a:"दà¥à¤ªà¤¾à¤°à¥€"===b?a>=10?a:a+12:"सायंकाळी"===b?a+12:void 0},meridiem:function(a){return 4>a?"रातà¥à¤°à¥€":10>a?"सकाळी":17>a?"दà¥à¤ªà¤¾à¤°à¥€":20>a?"सायंकाळी":"रातà¥à¤°à¥€"},week:{dow:0,doy:6}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"LT.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] LT",LLLL:"dddd, D MMMM YYYY [pukul] LT"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(a,b){return 12===a&&(a=0),"pagi"===b?a:"tengahari"===b?a>=11?a:a+12:"petang"===b||"malam"===b?a+12:void 0},meridiem:function(a){return 11>a?"pagi":15>a?"tengahari":19>a?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"á",2:"á‚",3:"áƒ",4:"á„",5:"á…",6:"á†",7:"á‡",8:"áˆ",9:"á‰",0:"á€"},c={"á":"1","á‚":"2","áƒ":"3","á„":"4","á…":"5","á†":"6","á‡":"7","áˆ":"8","á‰":"9","á€":"0"};return a.defineLocale("my",{months:"ဇန်နá€á€«á€›á€®_ဖေဖော်á€á€«á€›á€®_မá€á€º_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုá€á€º_စက်á€á€„်ဘာ_အောက်á€á€­á€¯á€˜á€¬_နိုá€á€„်ဘာ_ဒီဇင်ဘာ".split("_"),monthsShort:"ဇန်_ဖေ_မá€á€º_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ".split("_"),weekdays:"á€á€”င်္ဂနွေ_á€á€”င်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပá€á€±á€¸_သောကြာ_စနေ".split("_"),weekdaysShort:"နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),weekdaysMin:"နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[ယနေ.] LT [မှာ]",nextDay:"[မနက်ဖြန်] LT [မှာ]",nextWeek:"dddd LT [မှာ]",lastDay:"[မနေ.က] LT [မှာ]",lastWeek:"[ပြီးá€á€²á€·á€žá€±á€¬] dddd LT [မှာ]",sameElse:"L"},relativeTime:{future:"လာမည့် %s မှာ",past:"လွန်á€á€²á€·á€žá€±á€¬ %s က",s:"စက္ကန်.အနည်းငယ်",m:"á€á€…်မိနစ်",mm:"%d မိနစ်",h:"á€á€…်နာရီ",hh:"%d နာရီ",d:"á€á€…်ရက်",dd:"%d ရက်",M:"á€á€…်လ",MM:"%d လ",y:"á€á€…်နှစ်",yy:"%d နှစ်"},preparse:function(a){return a.replace(/[áá‚áƒá„á…á†á‡áˆá‰á€]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tirs_ons_tors_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"H.mm",LTS:"LT.ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i gÃ¥r kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"for %s siden",s:"noen sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en mÃ¥ned",MM:"%d mÃ¥neder",y:"ett Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return a.defineLocale("ne",{months:"जनवरी_फेबà¥à¤°à¥à¤µà¤°à¥€_मारà¥à¤š_अपà¥à¤°à¤¿à¤²_मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ_अगषà¥à¤Ÿ_सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°_अकà¥à¤Ÿà¥‹à¤¬à¤°_नोभेमà¥à¤¬à¤°_डिसेमà¥à¤¬à¤°".split("_"),monthsShort:"जन._फेबà¥à¤°à¥._मारà¥à¤š_अपà¥à¤°à¤¿._मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ._अग._सेपà¥à¤Ÿ._अकà¥à¤Ÿà¥‹._नोभे._डिसे.".split("_"),weekdays:"आइतबार_सोमबार_मङà¥à¤—लबार_बà¥à¤§à¤¬à¤¾à¤°_बिहिबार_शà¥à¤•à¥à¤°à¤¬à¤¾à¤°_शनिबार".split("_"),weekdaysShort:"आइत._सोम._मङà¥à¤—ल._बà¥à¤§._बिहि._शà¥à¤•à¥à¤°._शनि.".split("_"),weekdaysMin:"आइ._सो._मङà¥_बà¥._बि._शà¥._श.".split("_"),longDateFormat:{LT:"Aको h:mm बजे",LTS:"Aको h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/राती|बिहान|दिउà¤à¤¸à¥‹|बेलà¥à¤•à¤¾|साà¤à¤|राती/,meridiemHour:function(a,b){return 12===a&&(a=0),"राती"===b?3>a?a:a+12:"बिहान"===b?a:"दिउà¤à¤¸à¥‹"===b?a>=10?a:a+12:"बेलà¥à¤•à¤¾"===b||"साà¤à¤"===b?a+12:void 0},meridiem:function(a){return 3>a?"राती":10>a?"बिहान":15>a?"दिउà¤à¤¸à¥‹":18>a?"बेलà¥à¤•à¤¾":20>a?"साà¤à¤":"राती"},calendar:{sameDay:"[आज] LT",nextDay:"[भोली] LT",nextWeek:"[आउà¤à¤¦à¥‹] dddd[,] LT",lastDay:"[हिजो] LT",lastWeek:"[गà¤à¤•à¥‹] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%sमा",past:"%s अगाडी",s:"केही समय",m:"à¤à¤• मिनेट",mm:"%d मिनेट",h:"à¤à¤• घणà¥à¤Ÿà¤¾",hh:"%d घणà¥à¤Ÿà¤¾",d:"à¤à¤• दिन",dd:"%d दिन",M:"à¤à¤• महिना",MM:"%d महिना",y:"à¤à¤• बरà¥à¤·",yy:"%d बरà¥à¤·"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),c="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_");return a.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(a,d){return/-MMM-/.test(d)?c[a.month()]:b[a.month()]},weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_mÃ¥ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_mÃ¥n_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_mÃ¥_ty_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I gÃ¥r klokka] LT",lastWeek:"[FøregÃ¥ande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"for %s sidan",s:"nokre sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",M:"ein mÃ¥nad",MM:"%d mÃ¥nader",y:"eit Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a){return 5>a%10&&a%10>1&&~~(a/10)%10!==1}function c(a,c,d){var e=a+" ";switch(d){case"m":return c?"minuta":"minutÄ™";case"mm":return e+(b(a)?"minuty":"minut");case"h":return c?"godzina":"godzinÄ™";case"hh":return e+(b(a)?"godziny":"godzin");case"MM":return e+(b(a)?"miesiÄ…ce":"miesiÄ™cy");case"yy":return e+(b(a)?"lata":"lat")}}var d="styczeÅ„_luty_marzec_kwiecieÅ„_maj_czerwiec_lipiec_sierpieÅ„_wrzesieÅ„_październik_listopad_grudzieÅ„".split("_"),e="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrzeÅ›nia_października_listopada_grudnia".split("_");return a.defineLocale("pl",{months:function(a,b){return/D MMMM/.test(b)?e[a.month()]:d[a.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziaÅ‚ek_wtorek_Å›roda_czwartek_piÄ…tek_sobota".split("_"),weekdaysShort:"nie_pon_wt_Å›r_czw_pt_sb".split("_"),weekdaysMin:"N_Pn_Wt_Åšr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[DziÅ› o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszÅ‚Ä… niedzielÄ™ o] LT";case 3:return"[W zeszÅ‚Ä… Å›rodÄ™ o] LT";case 6:return"[W zeszÅ‚Ä… sobotÄ™ o] LT";default:return"[W zeszÅ‚y] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:c,mm:c,h:c,hh:c,d:"1 dzieÅ„",dd:"%d dni",M:"miesiÄ…c",MM:c,y:"rok",yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("pt-br",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] LT",LLLL:"dddd, D [de] MMMM [de] YYYY [às] LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº"})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("pt",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d={mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"},e=" ";return(a%100>=20||a>=100&&a%100===0)&&(e=" de "),a+e+d[c]}return a.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),weekdays:"duminică_luni_marÈ›i_miercuri_joi_vineri_sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",m:"un minut",mm:b,h:"o oră",hh:b,d:"o zi",dd:b,M:"o lună",MM:b,y:"un an",yy:b},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:c?"минута_минуты_минут":"минуту_минуты_минут",hh:"чаÑ_чаÑа_чаÑов",dd:"день_днÑ_дней",MM:"меÑÑц_меÑÑца_меÑÑцев",yy:"год_года_лет"};return"m"===d?c?"минута":"минуту":a+" "+b(e[d],+a)}function d(a,b){var c={nominative:"Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь".split("_"),accusative:"ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function e(a,b){var c={nominative:"Ñнв_фев_март_апр_май_июнь_июль_авг_Ñен_окт_ноÑ_дек".split("_"),accusative:"Ñнв_фев_мар_апр_маÑ_июнÑ_июлÑ_авг_Ñен_окт_ноÑ_дек".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function f(a,b){var c={nominative:"воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота".split("_"),accusative:"воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу".split("_")},d=/\[ ?[Вв] ?(?:прошлую|Ñледующую|Ñту)? ?\] ?dddd/.test(b)?"accusative":"nominative";return c[d][a.day()]}return a.defineLocale("ru",{months:d,monthsShort:e,weekdays:f,weekdaysShort:"вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),weekdaysMin:"вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),monthsParse:[/^Ñнв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[й|Ñ]/i,/^июн/i,/^июл/i,/^авг/i,/^Ñен/i,/^окт/i,/^ноÑ/i,/^дек/i],longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., LT",LLLL:"dddd, D MMMM YYYY г., LT"},calendar:{sameDay:"[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT",nextDay:"[Завтра в] LT",lastDay:"[Вчера в] LT",nextWeek:function(){return 2===this.day()?"[Во] dddd [в] LT":"[Ð’] dddd [в] LT"},lastWeek:function(a){if(a.week()===this.week())return 2===this.day()?"[Во] dddd [в] LT":"[Ð’] dddd [в] LT";switch(this.day()){case 0:return"[Ð’ прошлое] dddd [в] LT";case 1:case 2:case 4:return"[Ð’ прошлый] dddd [в] LT";case 3:case 5:case 6:return"[Ð’ прошлую] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"неÑколько Ñекунд",m:c,mm:c,h:"чаÑ",hh:c,d:"день",dd:c,M:"меÑÑц",MM:c,y:"год",yy:c},meridiemParse:/ночи|утра|днÑ|вечера/i,isPM:function(a){return/^(днÑ|вечера)$/.test(a)},meridiem:function(a){return 4>a?"ночи":12>a?"утра":17>a?"днÑ":"вечера"},ordinalParse:/\d{1,2}-(й|го|Ñ)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":return a+"-й";case"D":return a+"-го";case"w":case"W":return a+"-Ñ";default:return a}},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a){return a>1&&5>a}function c(a,c,d,e){var f=a+" ";switch(d){case"s":return c||e?"pár sekúnd":"pár sekundami";case"m":return c?"minúta":e?"minútu":"minútou";case"mm":return c||e?f+(b(a)?"minúty":"minút"):f+"minútami";break;case"h":return c?"hodina":e?"hodinu":"hodinou";case"hh":return c||e?f+(b(a)?"hodiny":"hodín"):f+"hodinami";break;case"d":return c||e?"deň":"dňom";case"dd":return c||e?f+(b(a)?"dni":"dní"):f+"dňami";break;case"M":return c||e?"mesiac":"mesiacom";case"MM":return c||e?f+(b(a)?"mesiace":"mesiacov"):f+"mesiacmi";break;case"y":return c||e?"rok":"rokom";case"yy":return c||e?f+(b(a)?"roky":"rokov"):f+"rokmi"}}var d="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),e="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");return a.defineLocale("sk",{months:d,monthsShort:e,monthsParse:function(a,b){var c,d=[];for(c=0;12>c;c++)d[c]=new RegExp("^"+a[c]+"$|^"+b[c]+"$","i");return d}(d,e),weekdays:"nedeľa_pondelok_utorok_streda_Å¡tvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_Å¡t_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_Å¡t_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo Å¡tvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[vÄera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT";case 1:case 2:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 4:case 5:return"[minulý] dddd [o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b,c){var d=a+" ";switch(c){case"m":return b?"ena minuta":"eno minuto";case"mm":return d+=1===a?"minuta":2===a?"minuti":3===a||4===a?"minute":"minut";case"h":return b?"ena ura":"eno uro";case"hh":return d+=1===a?"ura":2===a?"uri":3===a||4===a?"ure":"ur";case"dd":return d+=1===a?"dan":"dni"; -case"MM":return d+=1===a?"mesec":2===a?"meseca":3===a||4===a?"mesece":"mesecev";case"yy":return d+=1===a?"leto":2===a?"leti":3===a||4===a?"leta":"let"}}return a.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),weekdays:"nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._Äet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_Äe_pe_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[vÄeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[prejÅ¡nja] dddd [ob] LT";case 1:case 2:case 4:case 5:return"[prejÅ¡nji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"Äez %s",past:"%s nazaj",s:"nekaj sekund",m:b,mm:b,h:b,hh:b,d:"en dan",dd:b,M:"en mesec",MM:b,y:"eno leto",yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"),weekdays:"E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë".split("_"),weekdaysShort:"Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_Më_E_P_Sh".split("_"),meridiemParse:/PD|MD/,isPM:function(a){return"M"===a.charAt(0)},meridiem:function(a){return 12>a?"PD":"MD"},longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Sot në] LT",nextDay:"[Nesër në] LT",nextWeek:"dddd [në] LT",lastDay:"[Dje në] LT",lastWeek:"dddd [e kaluar në] LT",sameElse:"L"},relativeTime:{future:"në %s",past:"%s më parë",s:"disa sekonda",m:"një minutë",mm:"%d minuta",h:"një orë",hh:"%d orë",d:"një ditë",dd:"%d ditë",M:"një muaj",MM:"%d muaj",y:"një vit",yy:"%d vite"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={words:{m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један Ñат","једног Ñата"],hh:["Ñат","Ñата","Ñати"],dd:["дан","дана","дана"],MM:["меÑец","меÑеца","меÑеци"],yy:["година","године","година"]},correctGrammaticalCase:function(a,b){return 1===a?b[0]:a>=2&&4>=a?b[1]:b[2]},translate:function(a,c,d){var e=b.words[d];return 1===d.length?c?e[0]:e[1]:a+" "+b.correctGrammaticalCase(a,e)}};return a.defineLocale("sr-cyrl",{months:["јануар","фебруар","март","април","мај","јун","јул","авгуÑÑ‚","Ñептембар","октобар","новембар","децембар"],monthsShort:["јан.","феб.","мар.","апр.","мај","јун","јул","авг.","Ñеп.","окт.","нов.","дец."],weekdays:["недеља","понедељак","уторак","Ñреда","четвртак","петак","Ñубота"],weekdaysShort:["нед.","пон.","уто.","Ñре.","чет.","пет.","Ñуб."],weekdaysMin:["не","по","ут","ÑÑ€","че","пе","Ñу"],longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Ð´Ð°Ð½Ð°Ñ Ñƒ] LT",nextDay:"[Ñутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [Ñреду] [у] LT";case 6:return"[у] [Ñуботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){var a=["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [Ñреде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [Ñуботе] [у] LT"];return a[this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико Ñекунди",m:b.translate,mm:b.translate,h:b.translate,hh:b.translate,d:"дан",dd:b.translate,M:"меÑец",MM:b.translate,y:"годину",yy:b.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={words:{m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(a,b){return 1===a?b[0]:a>=2&&4>=a?b[1]:b[2]},translate:function(a,c,d){var e=b.words[d];return 1===d.length?c?e[0]:e[1]:a+" "+b.correctGrammaticalCase(a,e)}};return a.defineLocale("sr",{months:["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar"],monthsShort:["jan.","feb.","mar.","apr.","maj","jun","jul","avg.","sep.","okt.","nov.","dec."],weekdays:["nedelja","ponedeljak","utorak","sreda","Äetvrtak","petak","subota"],weekdaysShort:["ned.","pon.","uto.","sre.","Äet.","pet.","sub."],weekdaysMin:["ne","po","ut","sr","Äe","pe","su"],longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄe u] LT",lastWeek:function(){var a=["[proÅ¡le] [nedelje] [u] LT","[proÅ¡log] [ponedeljka] [u] LT","[proÅ¡log] [utorka] [u] LT","[proÅ¡le] [srede] [u] LT","[proÅ¡log] [Äetvrtka] [u] LT","[proÅ¡log] [petka] [u] LT","[proÅ¡le] [subote] [u] LT"];return a[this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",m:b.translate,mm:b.translate,h:b.translate,hh:b.translate,d:"dan",dd:b.translate,M:"mesec",MM:b.translate,y:"godinu",yy:b.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_mÃ¥ndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mÃ¥n_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_mÃ¥_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[IgÃ¥r] LT",nextWeek:"dddd LT",lastWeek:"[Förra] dddd[en] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"nÃ¥gra sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en mÃ¥nad",MM:"%d mÃ¥nader",y:"ett Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}(e|a)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"e":1===b?"a":2===b?"a":"e";return a+c},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("ta",{months:"ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯".split("_"),monthsShort:"ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯".split("_"),weekdays:"ஞாயிறà¯à®±à¯à®•à¯à®•à®¿à®´à®®à¯ˆ_திஙà¯à®•à®Ÿà¯à®•à®¿à®´à®®à¯ˆ_செவà¯à®µà®¾à®¯à¯à®•à®¿à®´à®®à¯ˆ_பà¯à®¤à®©à¯à®•à®¿à®´à®®à¯ˆ_வியாழகà¯à®•à®¿à®´à®®à¯ˆ_வெளà¯à®³à®¿à®•à¯à®•à®¿à®´à®®à¯ˆ_சனிகà¯à®•à®¿à®´à®®à¯ˆ".split("_"),weekdaysShort:"ஞாயிறà¯_திஙà¯à®•à®³à¯_செவà¯à®µà®¾à®¯à¯_பà¯à®¤à®©à¯_வியாழனà¯_வெளà¯à®³à®¿_சனி".split("_"),weekdaysMin:"ஞா_தி_செ_பà¯_வி_வெ_ச".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[இனà¯à®±à¯] LT",nextDay:"[நாளை] LT",nextWeek:"dddd, LT",lastDay:"[நேறà¯à®±à¯] LT",lastWeek:"[கடநà¯à®¤ வாரமà¯] dddd, LT",sameElse:"L"},relativeTime:{future:"%s இலà¯",past:"%s à®®à¯à®©à¯",s:"ஒர௠சில விநாடிகளà¯",m:"ஒர௠நிமிடமà¯",mm:"%d நிமிடஙà¯à®•à®³à¯",h:"ஒர௠மணி நேரமà¯",hh:"%d மணி நேரமà¯",d:"ஒர௠நாளà¯",dd:"%d நாடà¯à®•à®³à¯",M:"ஒர௠மாதமà¯",MM:"%d மாதஙà¯à®•à®³à¯",y:"ஒர௠வரà¯à®Ÿà®®à¯",yy:"%d ஆணà¯à®Ÿà¯à®•à®³à¯"},ordinalParse:/\d{1,2}வதà¯/,ordinal:function(a){return a+"வதà¯"},meridiemParse:/யாமமà¯|வைகறை|காலை|நணà¯à®ªà®•à®²à¯|எறà¯à®ªà®¾à®Ÿà¯|மாலை/,meridiem:function(a){return 2>a?" யாமமà¯":6>a?" வைகறை":10>a?" காலை":14>a?" நணà¯à®ªà®•à®²à¯":18>a?" எறà¯à®ªà®¾à®Ÿà¯":22>a?" மாலை":" யாமமà¯"},meridiemHour:function(a,b){return 12===a&&(a=0),"யாமமà¯"===b?2>a?a:a+12:"வைகறை"===b||"காலை"===b?a:"நணà¯à®ªà®•à®²à¯"===b&&a>=10?a:a+12},week:{dow:0,doy:6}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("th",{months:"มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม".split("_"),monthsShort:"มà¸à¸£à¸²_à¸à¸¸à¸¡à¸ à¸²_มีนา_เมษา_พฤษภา_มิถุนา_à¸à¸£à¸à¸Žà¸²_สิงหา_à¸à¸±à¸™à¸¢à¸²_ตุลา_พฤศจิà¸à¸²_ธันวา".split("_"),weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),longDateFormat:{LT:"H นาฬิà¸à¸² m นาที",LTS:"LT s วินาที",L:"YYYY/MM/DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา LT",LLLL:"วันddddที่ D MMMM YYYY เวลา LT"},meridiemParse:/à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง|หลังเที่ยง/,isPM:function(a){return"หลังเที่ยง"===a},meridiem:function(a){return 12>a?"à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่à¹à¸¥à¹‰à¸§ เวลา] LT",sameElse:"L"},relativeTime:{future:"อีภ%s",past:"%sที่à¹à¸¥à¹‰à¸§",s:"ไม่à¸à¸µà¹ˆà¸§à¸´à¸™à¸²à¸—ี",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY LT",LLLL:"dddd, MMMM DD, YYYY LT"},calendar:{sameDay:"[Ngayon sa] LT",nextDay:"[Bukas sa] LT",nextWeek:"dddd [sa] LT",lastDay:"[Kahapon sa] LT",lastWeek:"dddd [huling linggo] LT",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},ordinalParse:/\d{1,2}/,ordinal:function(a){return a},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){var b={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"};return a.defineLocale("tr",{months:"Ocak_Åžubat_Mart_Nisan_Mayıs_Haziran_Temmuz_AÄŸustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_ÇarÅŸamba_PerÅŸembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[haftaya] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen hafta] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinalParse:/\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/,ordinal:function(a){if(0===a)return a+"'ıncı";var c=a%10,d=a%100-c,e=a>=100?100:null;return a+(b[c]||b[d]||b[e])},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("tzm-latn",{months:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",m:"minuá¸",mm:"%d minuá¸",h:"saÉ›a",hh:"%d tassaÉ›in",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("tzm",{months:"ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”".split("_"),monthsShort:"ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”".split("_"),weekdays:"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysShort:"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysMin:"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[ⴰⵙⴷⵅ â´´] LT",nextDay:"[ⴰⵙⴽⴰ â´´] LT",nextWeek:"dddd [â´´] LT",lastDay:"[ⴰⵚⴰâµâµœ â´´] LT",lastWeek:"dddd [â´´] LT",sameElse:"L"},relativeTime:{future:"â´·â´°â´·âµ… âµ™ ⵢⴰⵠ%s",past:"ⵢⴰⵠ%s",s:"ⵉⵎⵉⴽ",m:"ⵎⵉâµâµ“â´º",mm:"%d ⵎⵉâµâµ“â´º",h:"ⵙⴰⵄⴰ",hh:"%d ⵜⴰⵙⵙⴰⵄⵉâµ",d:"ⴰⵙⵙ",dd:"%d oⵙⵙⴰâµ",M:"â´°âµ¢oⵓⵔ",MM:"%d ⵉⵢⵢⵉⵔâµ",y:"ⴰⵙⴳⴰⵙ",yy:"%d ⵉⵙⴳⴰⵙâµ"},week:{dow:6,doy:12}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){function b(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:"хвилина_хвилини_хвилин",hh:"година_години_годин",dd:"день_дні_днів",MM:"міÑÑць_міÑÑці_міÑÑців",yy:"рік_роки_років"};return"m"===d?c?"хвилина":"хвилину":"h"===d?c?"година":"годину":a+" "+b(e[d],+a)}function d(a,b){var c={nominative:"Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень".split("_"),accusative:"ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ".split("_")},d=/D[oD]? *MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function e(a,b){var c={nominative:"неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота".split("_"),accusative:"неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу".split("_"),genitive:"неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи".split("_")},d=/(\[[ВвУу]\]) ?dddd/.test(b)?"accusative":/\[?(?:минулої|наÑтупної)? ?\] ?dddd/.test(b)?"genitive":"nominative";return c[d][a.day()]}function f(a){return function(){return a+"о"+(11===this.hours()?"б":"")+"] LT"}}return a.defineLocale("uk",{months:d,monthsShort:"Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд".split("_"),weekdays:e,weekdaysShort:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),weekdaysMin:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY Ñ€.",LLL:"D MMMM YYYY Ñ€., LT",LLLL:"dddd, D MMMM YYYY Ñ€., LT"},calendar:{sameDay:f("[Сьогодні "),nextDay:f("[Завтра "),lastDay:f("[Вчора "),nextWeek:f("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return f("[Минулої] dddd [").call(this);case 1:case 2:case 4:return f("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька Ñекунд",m:c,mm:c,h:"годину",hh:c,d:"день",dd:c,M:"міÑÑць",MM:c,y:"рік",yy:c},meridiemParse:/ночі|ранку|днÑ|вечора/,isPM:function(a){return/^(днÑ|вечора)$/.test(a)},meridiem:function(a){return 4>a?"ночі":12>a?"ранку":17>a?"днÑ":"вечора"},ordinalParse:/\d{1,2}-(й|го)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":case"w":case"W":return a+"-й";case"D":return a+"-го";default:return a}},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("uz",{months:"Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь".split("_"),monthsShort:"Ñнв_фев_мар_апр_май_июн_июл_авг_Ñен_окт_ноÑ_дек".split("_"),weekdays:"Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"),weekdaysShort:"Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"),weekdaysMin:"Як_Ду_Се_Чо_Па_Жу_Ша".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"D MMMM YYYY, dddd LT"},calendar:{sameDay:"[Бугун Ñоат] LT [да]",nextDay:"[Эртага] LT [да]",nextWeek:"dddd [куни Ñоат] LT [да]",lastDay:"[Кеча Ñоат] LT [да]",lastWeek:"[Утган] dddd [куни Ñоат] LT [да]",sameElse:"L"},relativeTime:{future:"Якин %s ичида",past:"Бир неча %s олдин",s:"фурÑат",m:"бир дакика",mm:"%d дакика",h:"бир Ñоат",hh:"%d Ñоат",d:"бир кун",dd:"%d кун",M:"бир ой",MM:"%d ой",y:"бир йил",yy:"%d йил"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("vi",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),weekdays:"chủ nhật_thứ hai_thứ ba_thứ tÆ°_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY LT",LLLL:"dddd, D MMMM [năm] YYYY LT",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY LT",llll:"ddd, D MMM YYYY LT"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tá»›i lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần rồi lúc] LT",sameElse:"L"},relativeTime:{future:"%s tá»›i",past:"%s trÆ°á»›c",s:"vài giây",m:"má»™t phút",mm:"%d phút",h:"má»™t giá»",hh:"%d giá»",d:"má»™t ngày",dd:"%d ngày",M:"má»™t tháng",MM:"%d tháng",y:"má»™t năm",yy:"%d năm"},ordinalParse:/\d{1,2}/,ordinal:function(a){return a},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(("undefined"!=typeof global?global:this).moment)}(function(a){return a.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"æ—¥_一_二_三_å››_五_å…­".split("_"),longDateFormat:{LT:"Ah点mm",LTS:"Ah点m分s秒",L:"YYYY-MM-DD",LL:"YYYYå¹´MMMDæ—¥",LLL:"YYYYå¹´MMMDæ—¥LT",LLLL:"YYYYå¹´MMMDæ—¥ddddLT",l:"YYYY-MM-DD",ll:"YYYYå¹´MMMDæ—¥",lll:"YYYYå¹´MMMDæ—¥LT",llll:"YYYYå¹´MMMDæ—¥ddddLT"},meridiemParse:/凌晨|早上|上åˆ|中åˆ|下åˆ|晚上/,meridiemHour:function(a,b){return 12===a&&(a=0),"凌晨"===b||"早上"===b||"上åˆ"===b?a:"下åˆ"===b||"晚上"===b?a+12:a>=11?a:a+12},meridiem:function(a,b){var c=100*a+b;return 600>c?"凌晨":900>c?"早上":1130>c?"上åˆ":1230>c?"中åˆ":1800>c?"下åˆ":"晚上"},calendar:{sameDay:function(){return 0===this.minutes()?"[今天]Ah[点整]":"[今天]LT"},nextDay:function(){return 0===this.minutes()?"[明天]Ah[点整]":"[明天]LT"},lastDay:function(){return 0===this.minutes()?"[昨天]Ah[点整]":"[昨天]LT"},nextWeek:function(){var b,c;return b=a().startOf("week"),c=this.unix()-b.unix()>=604800?"[下]":"[本]",0===this.minutes()?c+"dddAh点整":c+"dddAh点mm"},lastWeek:function(){var b,c;return b=a().startOf("week"),c=this.unix()=11?a:a+12:"下åˆ"===b||"晚上"===b?a+12:void 0},meridiem:function(a,b){var c=100*a+b;return 900>c?"早上":1130>c?"上åˆ":1230>c?"中åˆ":1800>c?"下åˆ":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},ordinalParse:/\d{1,2}(æ—¥|月|週)/,ordinal:function(a,b){switch(b){case"d":case"D":case"DDD":return a+"æ—¥";case"M":return a+"月";case"w":case"W":return a+"週";default:return a}},relativeTime:{future:"%så…§",past:"%så‰",s:"幾秒",m:"一分é˜",mm:"%d分é˜",h:"一å°æ™‚",hh:"%då°æ™‚",d:"一天",dd:"%d天",M:"一個月",MM:"%d個月",y:"一年",yy:"%då¹´"}})}); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/moment-with-locales.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/moment-with-locales.js deleted file mode 100644 index 202450a..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/moment-with-locales.js +++ /dev/null @@ -1,9792 +0,0 @@ -//! moment.js -//! version : 2.9.0 -//! authors : Tim Wood, Iskren Chernev, Moment.js contributors -//! license : MIT -//! momentjs.com - -(function (undefined) { - /************************************ - Constants - ************************************/ - - var moment, - VERSION = '2.9.0', - // the global-scope this is NOT the global object in Node.js - globalScope = (typeof global !== 'undefined' && (typeof window === 'undefined' || window === global.window)) ? global : this, - oldGlobalMoment, - round = Math.round, - hasOwnProperty = Object.prototype.hasOwnProperty, - i, - - YEAR = 0, - MONTH = 1, - DATE = 2, - HOUR = 3, - MINUTE = 4, - SECOND = 5, - MILLISECOND = 6, - - // internal storage for locale config files - locales = {}, - - // extra moment internal properties (plugins register props here) - momentProperties = [], - - // check for nodeJS - hasModule = (typeof module !== 'undefined' && module && module.exports), - - // ASP.NET json date format regex - aspNetJsonRegex = /^\/?Date\((\-?\d+)/i, - aspNetTimeSpanJsonRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/, - - // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html - // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere - isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/, - - // format tokens - formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|x|X|zz?|ZZ?|.)/g, - localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, - - // parsing token regexes - parseTokenOneOrTwoDigits = /\d\d?/, // 0 - 99 - parseTokenOneToThreeDigits = /\d{1,3}/, // 0 - 999 - parseTokenOneToFourDigits = /\d{1,4}/, // 0 - 9999 - parseTokenOneToSixDigits = /[+\-]?\d{1,6}/, // -999,999 - 999,999 - parseTokenDigits = /\d+/, // nonzero number of digits - parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i, // any word (or two) characters or numbers including two/three word month in arabic. - parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z - parseTokenT = /T/i, // T (ISO separator) - parseTokenOffsetMs = /[\+\-]?\d+/, // 1234567890123 - parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123 - - //strict parsing regexes - parseTokenOneDigit = /\d/, // 0 - 9 - parseTokenTwoDigits = /\d\d/, // 00 - 99 - parseTokenThreeDigits = /\d{3}/, // 000 - 999 - parseTokenFourDigits = /\d{4}/, // 0000 - 9999 - parseTokenSixDigits = /[+-]?\d{6}/, // -999,999 - 999,999 - parseTokenSignedNumber = /[+-]?\d+/, // -inf - inf - - // iso 8601 regex - // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) - isoRegex = /^\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)?)?$/, - - isoFormat = 'YYYY-MM-DDTHH:mm:ssZ', - - isoDates = [ - ['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}/] - ], - - // iso time formats and regexes - isoTimes = [ - ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d+/], - ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/], - ['HH:mm', /(T| )\d\d:\d\d/], - ['HH', /(T| )\d\d/] - ], - - // timezone chunker '+10:00' > ['10', '00'] or '-1530' > ['-', '15', '30'] - parseTimezoneChunker = /([\+\-]|\d\d)/gi, - - // getter and setter names - proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'), - unitMillisecondFactors = { - 'Milliseconds' : 1, - 'Seconds' : 1e3, - 'Minutes' : 6e4, - 'Hours' : 36e5, - 'Days' : 864e5, - 'Months' : 2592e6, - 'Years' : 31536e6 - }, - - unitAliases = { - ms : 'millisecond', - s : 'second', - m : 'minute', - h : 'hour', - d : 'day', - D : 'date', - w : 'week', - W : 'isoWeek', - M : 'month', - Q : 'quarter', - y : 'year', - DDD : 'dayOfYear', - e : 'weekday', - E : 'isoWeekday', - gg: 'weekYear', - GG: 'isoWeekYear' - }, - - camelFunctions = { - dayofyear : 'dayOfYear', - isoweekday : 'isoWeekday', - isoweek : 'isoWeek', - weekyear : 'weekYear', - isoweekyear : 'isoWeekYear' - }, - - // format function strings - formatFunctions = {}, - - // default relative time thresholds - relativeTimeThresholds = { - s: 45, // seconds to minute - m: 45, // minutes to hour - h: 22, // hours to day - d: 26, // days to month - M: 11 // months to year - }, - - // tokens to ordinalize and pad - ordinalizeTokens = 'DDD w W M D d'.split(' '), - paddedTokens = 'M D H h m s w W'.split(' '), - - formatTokenFunctions = { - M : function () { - return this.month() + 1; - }, - MMM : function (format) { - return this.localeData().monthsShort(this, format); - }, - MMMM : function (format) { - return this.localeData().months(this, format); - }, - D : function () { - return this.date(); - }, - DDD : function () { - return this.dayOfYear(); - }, - d : function () { - return this.day(); - }, - dd : function (format) { - return this.localeData().weekdaysMin(this, format); - }, - ddd : function (format) { - return this.localeData().weekdaysShort(this, format); - }, - dddd : function (format) { - return this.localeData().weekdays(this, format); - }, - w : function () { - return this.week(); - }, - W : function () { - return this.isoWeek(); - }, - YY : function () { - return leftZeroFill(this.year() % 100, 2); - }, - YYYY : function () { - return leftZeroFill(this.year(), 4); - }, - YYYYY : function () { - return leftZeroFill(this.year(), 5); - }, - YYYYYY : function () { - var y = this.year(), sign = y >= 0 ? '+' : '-'; - return sign + leftZeroFill(Math.abs(y), 6); - }, - gg : function () { - return leftZeroFill(this.weekYear() % 100, 2); - }, - gggg : function () { - return leftZeroFill(this.weekYear(), 4); - }, - ggggg : function () { - return leftZeroFill(this.weekYear(), 5); - }, - GG : function () { - return leftZeroFill(this.isoWeekYear() % 100, 2); - }, - GGGG : function () { - return leftZeroFill(this.isoWeekYear(), 4); - }, - GGGGG : function () { - return leftZeroFill(this.isoWeekYear(), 5); - }, - e : function () { - return this.weekday(); - }, - E : function () { - return this.isoWeekday(); - }, - a : function () { - return this.localeData().meridiem(this.hours(), this.minutes(), true); - }, - A : function () { - return this.localeData().meridiem(this.hours(), this.minutes(), false); - }, - 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 toInt(this.milliseconds() / 100); - }, - SS : function () { - return leftZeroFill(toInt(this.milliseconds() / 10), 2); - }, - SSS : function () { - return leftZeroFill(this.milliseconds(), 3); - }, - SSSS : function () { - return leftZeroFill(this.milliseconds(), 3); - }, - Z : function () { - var a = this.utcOffset(), - b = '+'; - if (a < 0) { - a = -a; - b = '-'; - } - return b + leftZeroFill(toInt(a / 60), 2) + ':' + leftZeroFill(toInt(a) % 60, 2); - }, - ZZ : function () { - var a = this.utcOffset(), - b = '+'; - if (a < 0) { - a = -a; - b = '-'; - } - return b + leftZeroFill(toInt(a / 60), 2) + leftZeroFill(toInt(a) % 60, 2); - }, - z : function () { - return this.zoneAbbr(); - }, - zz : function () { - return this.zoneName(); - }, - x : function () { - return this.valueOf(); - }, - X : function () { - return this.unix(); - }, - Q : function () { - return this.quarter(); - } - }, - - deprecations = {}, - - lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin'], - - updateInProgress = false; - - // Pick the first defined of two or three arguments. dfl comes from - // default. - function dfl(a, b, c) { - switch (arguments.length) { - case 2: return a != null ? a : b; - case 3: return a != null ? a : b != null ? b : c; - default: throw new Error('Implement me'); - } - } - - function hasOwnProp(a, b) { - return hasOwnProperty.call(a, b); - } - - function defaultParsingFlags() { - // We need to deep clone this object, and es5 standard is not very - // helpful. - return { - empty : false, - unusedTokens : [], - unusedInput : [], - overflow : -2, - charsLeftOver : 0, - nullInput : false, - invalidMonth : null, - invalidFormat : false, - userInvalidated : false, - iso: false - }; - } - - function printMsg(msg) { - if (moment.suppressDeprecationWarnings === false && - typeof console !== 'undefined' && console.warn) { - console.warn('Deprecation warning: ' + msg); - } - } - - function deprecate(msg, fn) { - var firstTime = true; - return extend(function () { - if (firstTime) { - printMsg(msg); - firstTime = false; - } - return fn.apply(this, arguments); - }, fn); - } - - function deprecateSimple(name, msg) { - if (!deprecations[name]) { - printMsg(msg); - deprecations[name] = true; - } - } - - function padToken(func, count) { - return function (a) { - return leftZeroFill(func.call(this, a), count); - }; - } - function ordinalizeToken(func, period) { - return function (a) { - return this.localeData().ordinal(func.call(this, a), period); - }; - } - - function monthDiff(a, b) { - // difference in months - var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), - // b is in (anchor - 1 month, anchor + 1 month) - anchor = a.clone().add(wholeMonthDiff, 'months'), - anchor2, adjust; - - if (b - anchor < 0) { - anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); - // linear across the month - adjust = (b - anchor) / (anchor - anchor2); - } else { - anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); - // linear across the month - adjust = (b - anchor) / (anchor2 - anchor); - } - - return -(wholeMonthDiff + adjust); - } - - while (ordinalizeTokens.length) { - i = ordinalizeTokens.pop(); - formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i); - } - while (paddedTokens.length) { - i = paddedTokens.pop(); - formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2); - } - formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3); - - - function meridiemFixWrap(locale, hour, meridiem) { - var isPm; - - if (meridiem == null) { - // nothing to do - return hour; - } - if (locale.meridiemHour != null) { - return locale.meridiemHour(hour, meridiem); - } else if (locale.isPM != null) { - // Fallback - isPm = locale.isPM(meridiem); - if (isPm && hour < 12) { - hour += 12; - } - if (!isPm && hour === 12) { - hour = 0; - } - return hour; - } else { - // thie is not supposed to happen - return hour; - } - } - - /************************************ - Constructors - ************************************/ - - function Locale() { - } - - // Moment prototype object - function Moment(config, skipOverflow) { - if (skipOverflow !== false) { - checkOverflow(config); - } - copyConfig(this, config); - this._d = new Date(+config._d); - // Prevent infinite loop in case updateOffset creates new moment - // objects. - if (updateInProgress === false) { - updateInProgress = true; - moment.updateOffset(this); - updateInProgress = false; - } - } - - // Duration Constructor - function Duration(duration) { - var normalizedInput = normalizeObjectUnits(duration), - years = normalizedInput.year || 0, - quarters = normalizedInput.quarter || 0, - months = normalizedInput.month || 0, - weeks = normalizedInput.week || 0, - days = normalizedInput.day || 0, - hours = normalizedInput.hour || 0, - minutes = normalizedInput.minute || 0, - seconds = normalizedInput.second || 0, - milliseconds = normalizedInput.millisecond || 0; - - // representation for dateAddRemove - this._milliseconds = +milliseconds + - seconds * 1e3 + // 1000 - minutes * 6e4 + // 1000 * 60 - hours * 36e5; // 1000 * 60 * 60 - // Because of dateAddRemove treats 24 hours as different from a - // day when working around DST, we need to store them separately - this._days = +days + - weeks * 7; - // It is impossible translate months into days without knowing - // which months you are are talking about, so we have to store - // it separately. - this._months = +months + - quarters * 3 + - years * 12; - - this._data = {}; - - this._locale = moment.localeData(); - - this._bubble(); - } - - /************************************ - Helpers - ************************************/ - - - function extend(a, b) { - for (var i in b) { - if (hasOwnProp(b, i)) { - a[i] = b[i]; - } - } - - if (hasOwnProp(b, 'toString')) { - a.toString = b.toString; - } - - if (hasOwnProp(b, 'valueOf')) { - a.valueOf = b.valueOf; - } - - return a; - } - - function copyConfig(to, from) { - var i, prop, val; - - if (typeof from._isAMomentObject !== 'undefined') { - to._isAMomentObject = from._isAMomentObject; - } - if (typeof from._i !== 'undefined') { - to._i = from._i; - } - if (typeof from._f !== 'undefined') { - to._f = from._f; - } - if (typeof from._l !== 'undefined') { - to._l = from._l; - } - if (typeof from._strict !== 'undefined') { - to._strict = from._strict; - } - if (typeof from._tzm !== 'undefined') { - to._tzm = from._tzm; - } - if (typeof from._isUTC !== 'undefined') { - to._isUTC = from._isUTC; - } - if (typeof from._offset !== 'undefined') { - to._offset = from._offset; - } - if (typeof from._pf !== 'undefined') { - to._pf = from._pf; - } - if (typeof from._locale !== 'undefined') { - to._locale = from._locale; - } - - if (momentProperties.length > 0) { - for (i in momentProperties) { - prop = momentProperties[i]; - val = from[prop]; - if (typeof val !== 'undefined') { - to[prop] = val; - } - } - } - - return to; - } - - function absRound(number) { - if (number < 0) { - return Math.ceil(number); - } else { - return Math.floor(number); - } - } - - // left zero fill a number - // see http://jsperf.com/left-zero-filling for performance comparison - function leftZeroFill(number, targetLength, forceSign) { - var output = '' + Math.abs(number), - sign = number >= 0; - - while (output.length < targetLength) { - output = '0' + output; - } - return (sign ? (forceSign ? '+' : '') : '-') + output; - } - - function positiveMomentsDifference(base, other) { - var res = {milliseconds: 0, months: 0}; - - res.months = other.month() - base.month() + - (other.year() - base.year()) * 12; - if (base.clone().add(res.months, 'M').isAfter(other)) { - --res.months; - } - - res.milliseconds = +other - +(base.clone().add(res.months, 'M')); - - return res; - } - - function momentsDifference(base, other) { - var res; - other = makeAs(other, base); - if (base.isBefore(other)) { - res = positiveMomentsDifference(base, other); - } else { - res = positiveMomentsDifference(other, base); - res.milliseconds = -res.milliseconds; - res.months = -res.months; - } - - return res; - } - - // TODO: remove 'name' arg after deprecation is removed - function createAdder(direction, name) { - return function (val, period) { - var dur, tmp; - //invert the arguments, but complain about it - if (period !== null && !isNaN(+period)) { - deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period).'); - tmp = val; val = period; period = tmp; - } - - val = typeof val === 'string' ? +val : val; - dur = moment.duration(val, period); - addOrSubtractDurationFromMoment(this, dur, direction); - return this; - }; - } - - function addOrSubtractDurationFromMoment(mom, duration, isAdding, updateOffset) { - var milliseconds = duration._milliseconds, - days = duration._days, - months = duration._months; - updateOffset = updateOffset == null ? true : updateOffset; - - if (milliseconds) { - mom._d.setTime(+mom._d + milliseconds * isAdding); - } - if (days) { - rawSetter(mom, 'Date', rawGetter(mom, 'Date') + days * isAdding); - } - if (months) { - rawMonthSetter(mom, rawGetter(mom, 'Month') + months * isAdding); - } - if (updateOffset) { - moment.updateOffset(mom, days || months); - } - } - - // check if is an array - function isArray(input) { - return Object.prototype.toString.call(input) === '[object Array]'; - } - - function isDate(input) { - return Object.prototype.toString.call(input) === '[object Date]' || - input instanceof Date; - } - - // compare two arrays, return the number of differences - function compareArrays(array1, array2, dontConvert) { - var len = Math.min(array1.length, array2.length), - lengthDiff = Math.abs(array1.length - array2.length), - diffs = 0, - i; - for (i = 0; i < len; i++) { - if ((dontConvert && array1[i] !== array2[i]) || - (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { - diffs++; - } - } - return diffs + lengthDiff; - } - - function normalizeUnits(units) { - if (units) { - var lowered = units.toLowerCase().replace(/(.)s$/, '$1'); - units = unitAliases[units] || camelFunctions[lowered] || lowered; - } - return units; - } - - function normalizeObjectUnits(inputObject) { - var normalizedInput = {}, - normalizedProp, - prop; - - for (prop in inputObject) { - if (hasOwnProp(inputObject, prop)) { - normalizedProp = normalizeUnits(prop); - if (normalizedProp) { - normalizedInput[normalizedProp] = inputObject[prop]; - } - } - } - - return normalizedInput; - } - - function makeList(field) { - var count, setter; - - if (field.indexOf('week') === 0) { - count = 7; - setter = 'day'; - } - else if (field.indexOf('month') === 0) { - count = 12; - setter = 'month'; - } - else { - return; - } - - moment[field] = function (format, index) { - var i, getter, - method = moment._locale[field], - results = []; - - if (typeof format === 'number') { - index = format; - format = undefined; - } - - getter = function (i) { - var m = moment().utc().set(setter, i); - return method.call(moment._locale, m, format || ''); - }; - - if (index != null) { - return getter(index); - } - else { - for (i = 0; i < count; i++) { - results.push(getter(i)); - } - return results; - } - }; - } - - function toInt(argumentForCoercion) { - var coercedNumber = +argumentForCoercion, - value = 0; - - if (coercedNumber !== 0 && isFinite(coercedNumber)) { - if (coercedNumber >= 0) { - value = Math.floor(coercedNumber); - } else { - value = Math.ceil(coercedNumber); - } - } - - return value; - } - - function daysInMonth(year, month) { - return new Date(Date.UTC(year, month + 1, 0)).getUTCDate(); - } - - function weeksInYear(year, dow, doy) { - return weekOfYear(moment([year, 11, 31 + dow - doy]), dow, doy).week; - } - - function daysInYear(year) { - return isLeapYear(year) ? 366 : 365; - } - - function isLeapYear(year) { - return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; - } - - function checkOverflow(m) { - var overflow; - if (m._a && m._pf.overflow === -2) { - overflow = - m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH : - m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE : - m._a[HOUR] < 0 || m._a[HOUR] > 24 || - (m._a[HOUR] === 24 && (m._a[MINUTE] !== 0 || - m._a[SECOND] !== 0 || - m._a[MILLISECOND] !== 0)) ? HOUR : - m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE : - m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND : - m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND : - -1; - - if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { - overflow = DATE; - } - - m._pf.overflow = overflow; - } - } - - function isValid(m) { - if (m._isValid == null) { - m._isValid = !isNaN(m._d.getTime()) && - m._pf.overflow < 0 && - !m._pf.empty && - !m._pf.invalidMonth && - !m._pf.nullInput && - !m._pf.invalidFormat && - !m._pf.userInvalidated; - - if (m._strict) { - m._isValid = m._isValid && - m._pf.charsLeftOver === 0 && - m._pf.unusedTokens.length === 0 && - m._pf.bigHour === undefined; - } - } - return m._isValid; - } - - function normalizeLocale(key) { - return key ? key.toLowerCase().replace('_', '-') : key; - } - - // pick the locale from the array - // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each - // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root - function chooseLocale(names) { - var i = 0, j, next, locale, split; - - while (i < names.length) { - split = normalizeLocale(names[i]).split('-'); - j = split.length; - next = normalizeLocale(names[i + 1]); - next = next ? next.split('-') : null; - while (j > 0) { - locale = loadLocale(split.slice(0, j).join('-')); - if (locale) { - return locale; - } - if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { - //the next array item is better than a shallower substring of this one - break; - } - j--; - } - i++; - } - return null; - } - - function loadLocale(name) { - var oldLocale = null; - if (!locales[name] && hasModule) { - try { - oldLocale = moment.locale(); - require('./locale/' + name); - // because defineLocale currently also sets the global locale, we want to undo that for lazy loaded locales - moment.locale(oldLocale); - } catch (e) { } - } - return locales[name]; - } - - // Return a moment from input, that is local/utc/utcOffset equivalent to - // model. - function makeAs(input, model) { - var res, diff; - if (model._isUTC) { - res = model.clone(); - diff = (moment.isMoment(input) || isDate(input) ? - +input : +moment(input)) - (+res); - // Use low-level api, because this fn is low-level api. - res._d.setTime(+res._d + diff); - moment.updateOffset(res, false); - return res; - } else { - return moment(input).local(); - } - } - - /************************************ - Locale - ************************************/ - - - extend(Locale.prototype, { - - set : function (config) { - var prop, i; - for (i in config) { - prop = config[i]; - if (typeof prop === 'function') { - this[i] = prop; - } else { - this['_' + i] = prop; - } - } - // Lenient ordinal parsing accepts just a number in addition to - // number + (possibly) stuff coming from _ordinalParseLenient. - this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + /\d{1,2}/.source); - }, - - _months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - months : function (m) { - return this._months[m.month()]; - }, - - _monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - monthsShort : function (m) { - return this._monthsShort[m.month()]; - }, - - monthsParse : function (monthName, format, strict) { - var i, mom, regex; - - if (!this._monthsParse) { - this._monthsParse = []; - this._longMonthsParse = []; - this._shortMonthsParse = []; - } - - for (i = 0; i < 12; i++) { - // make the regex if we don't have it already - mom = moment.utc([2000, i]); - if (strict && !this._longMonthsParse[i]) { - this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); - this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); - } - if (!strict && !this._monthsParse[i]) { - regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); - this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); - } - // test the regex - if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { - return i; - } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { - return i; - } else if (!strict && this._monthsParse[i].test(monthName)) { - return i; - } - } - }, - - _weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdays : function (m) { - return this._weekdays[m.day()]; - }, - - _weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysShort : function (m) { - return this._weekdaysShort[m.day()]; - }, - - _weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), - weekdaysMin : function (m) { - return this._weekdaysMin[m.day()]; - }, - - weekdaysParse : function (weekdayName) { - var i, mom, regex; - - if (!this._weekdaysParse) { - this._weekdaysParse = []; - } - - for (i = 0; i < 7; i++) { - // make the regex if we don't have it already - if (!this._weekdaysParse[i]) { - mom = moment([2000, 1]).day(i); - regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); - this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); - } - // test the regex - if (this._weekdaysParse[i].test(weekdayName)) { - return i; - } - } - }, - - _longDateFormat : { - LTS : 'h:mm:ss A', - 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 (key) { - var output = this._longDateFormat[key]; - if (!output && this._longDateFormat[key.toUpperCase()]) { - output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) { - return val.slice(1); - }); - this._longDateFormat[key] = output; - } - return output; - }, - - isPM : function (input) { - // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays - // Using charAt should be more compatible. - return ((input + '').toLowerCase().charAt(0) === 'p'); - }, - - _meridiemParse : /[ap]\.?m?\.?/i, - meridiem : function (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'pm' : 'PM'; - } else { - return isLower ? '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 (key, mom, now) { - var output = this._calendar[key]; - return typeof output === 'function' ? output.apply(mom, [now]) : output; - }, - - _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 (number, withoutSuffix, string, isFuture) { - var output = this._relativeTime[string]; - return (typeof output === 'function') ? - output(number, withoutSuffix, string, isFuture) : - output.replace(/%d/i, number); - }, - - pastFuture : function (diff, output) { - var format = this._relativeTime[diff > 0 ? 'future' : 'past']; - return typeof format === 'function' ? format(output) : format.replace(/%s/i, output); - }, - - ordinal : function (number) { - return this._ordinal.replace('%d', number); - }, - _ordinal : '%d', - _ordinalParse : /\d{1,2}/, - - preparse : function (string) { - return string; - }, - - postformat : function (string) { - return string; - }, - - week : function (mom) { - return weekOfYear(mom, this._week.dow, this._week.doy).week; - }, - - _week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - }, - - firstDayOfWeek : function () { - return this._week.dow; - }, - - firstDayOfYear : function () { - return this._week.doy; - }, - - _invalidDate: 'Invalid date', - invalidDate: function () { - return this._invalidDate; - } - }); - - /************************************ - Formatting - ************************************/ - - - function removeFormattingTokens(input) { - if (input.match(/\[[\s\S]/)) { - return input.replace(/^\[|\]$/g, ''); - } - return input.replace(/\\/g, ''); - } - - function makeFormatFunction(format) { - var array = format.match(formattingTokens), i, length; - - for (i = 0, length = array.length; i < length; i++) { - if (formatTokenFunctions[array[i]]) { - array[i] = formatTokenFunctions[array[i]]; - } else { - array[i] = removeFormattingTokens(array[i]); - } - } - - return function (mom) { - var output = ''; - for (i = 0; i < length; i++) { - output += array[i] instanceof Function ? array[i].call(mom, format) : array[i]; - } - return output; - }; - } - - // format date using native date object - function formatMoment(m, format) { - if (!m.isValid()) { - return m.localeData().invalidDate(); - } - - format = expandFormat(format, m.localeData()); - - if (!formatFunctions[format]) { - formatFunctions[format] = makeFormatFunction(format); - } - - return formatFunctions[format](m); - } - - function expandFormat(format, locale) { - var i = 5; - - function replaceLongDateFormatTokens(input) { - return locale.longDateFormat(input) || input; - } - - localFormattingTokens.lastIndex = 0; - while (i >= 0 && localFormattingTokens.test(format)) { - format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); - localFormattingTokens.lastIndex = 0; - i -= 1; - } - - return format; - } - - - /************************************ - Parsing - ************************************/ - - - // get the regex to find the next token - function getParseRegexForToken(token, config) { - var a, strict = config._strict; - switch (token) { - case 'Q': - return parseTokenOneDigit; - case 'DDDD': - return parseTokenThreeDigits; - case 'YYYY': - case 'GGGG': - case 'gggg': - return strict ? parseTokenFourDigits : parseTokenOneToFourDigits; - case 'Y': - case 'G': - case 'g': - return parseTokenSignedNumber; - case 'YYYYYY': - case 'YYYYY': - case 'GGGGG': - case 'ggggg': - return strict ? parseTokenSixDigits : parseTokenOneToSixDigits; - case 'S': - if (strict) { - return parseTokenOneDigit; - } - /* falls through */ - case 'SS': - if (strict) { - return parseTokenTwoDigits; - } - /* falls through */ - case 'SSS': - if (strict) { - return parseTokenThreeDigits; - } - /* falls through */ - case 'DDD': - return parseTokenOneToThreeDigits; - case 'MMM': - case 'MMMM': - case 'dd': - case 'ddd': - case 'dddd': - return parseTokenWord; - case 'a': - case 'A': - return config._locale._meridiemParse; - case 'x': - return parseTokenOffsetMs; - case 'X': - return parseTokenTimestampMs; - case 'Z': - case 'ZZ': - return parseTokenTimezone; - case 'T': - return parseTokenT; - case 'SSSS': - return parseTokenDigits; - case 'MM': - case 'DD': - case 'YY': - case 'GG': - case 'gg': - case 'HH': - case 'hh': - case 'mm': - case 'ss': - case 'ww': - case 'WW': - return strict ? parseTokenTwoDigits : parseTokenOneOrTwoDigits; - case 'M': - case 'D': - case 'd': - case 'H': - case 'h': - case 'm': - case 's': - case 'w': - case 'W': - case 'e': - case 'E': - return parseTokenOneOrTwoDigits; - case 'Do': - return strict ? config._locale._ordinalParse : config._locale._ordinalParseLenient; - default : - a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), 'i')); - return a; - } - } - - function utcOffsetFromString(string) { - string = string || ''; - var possibleTzMatches = (string.match(parseTokenTimezone) || []), - tzChunk = possibleTzMatches[possibleTzMatches.length - 1] || [], - parts = (tzChunk + '').match(parseTimezoneChunker) || ['-', 0, 0], - minutes = +(parts[1] * 60) + toInt(parts[2]); - - return parts[0] === '+' ? minutes : -minutes; - } - - // function to convert string input to date - function addTimeToArrayFromToken(token, input, config) { - var a, datePartArray = config._a; - - switch (token) { - // QUARTER - case 'Q': - if (input != null) { - datePartArray[MONTH] = (toInt(input) - 1) * 3; - } - break; - // MONTH - case 'M' : // fall through to MM - case 'MM' : - if (input != null) { - datePartArray[MONTH] = toInt(input) - 1; - } - break; - case 'MMM' : // fall through to MMMM - case 'MMMM' : - a = config._locale.monthsParse(input, token, config._strict); - // if we didn't find a month name, mark the date as invalid. - if (a != null) { - datePartArray[MONTH] = a; - } else { - config._pf.invalidMonth = input; - } - break; - // DAY OF MONTH - case 'D' : // fall through to DD - case 'DD' : - if (input != null) { - datePartArray[DATE] = toInt(input); - } - break; - case 'Do' : - if (input != null) { - datePartArray[DATE] = toInt(parseInt( - input.match(/\d{1,2}/)[0], 10)); - } - break; - // DAY OF YEAR - case 'DDD' : // fall through to DDDD - case 'DDDD' : - if (input != null) { - config._dayOfYear = toInt(input); - } - - break; - // YEAR - case 'YY' : - datePartArray[YEAR] = moment.parseTwoDigitYear(input); - break; - case 'YYYY' : - case 'YYYYY' : - case 'YYYYYY' : - datePartArray[YEAR] = toInt(input); - break; - // AM / PM - case 'a' : // fall through to A - case 'A' : - config._meridiem = input; - // config._isPm = config._locale.isPM(input); - break; - // HOUR - case 'h' : // fall through to hh - case 'hh' : - config._pf.bigHour = true; - /* falls through */ - case 'H' : // fall through to HH - case 'HH' : - datePartArray[HOUR] = toInt(input); - break; - // MINUTE - case 'm' : // fall through to mm - case 'mm' : - datePartArray[MINUTE] = toInt(input); - break; - // SECOND - case 's' : // fall through to ss - case 'ss' : - datePartArray[SECOND] = toInt(input); - break; - // MILLISECOND - case 'S' : - case 'SS' : - case 'SSS' : - case 'SSSS' : - datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000); - break; - // UNIX OFFSET (MILLISECONDS) - case 'x': - config._d = new Date(toInt(input)); - break; - // UNIX TIMESTAMP WITH MS - case 'X': - config._d = new Date(parseFloat(input) * 1000); - break; - // TIMEZONE - case 'Z' : // fall through to ZZ - case 'ZZ' : - config._useUTC = true; - config._tzm = utcOffsetFromString(input); - break; - // WEEKDAY - human - case 'dd': - case 'ddd': - case 'dddd': - a = config._locale.weekdaysParse(input); - // if we didn't get a weekday name, mark the date as invalid - if (a != null) { - config._w = config._w || {}; - config._w['d'] = a; - } else { - config._pf.invalidWeekday = input; - } - break; - // WEEK, WEEK DAY - numeric - case 'w': - case 'ww': - case 'W': - case 'WW': - case 'd': - case 'e': - case 'E': - token = token.substr(0, 1); - /* falls through */ - case 'gggg': - case 'GGGG': - case 'GGGGG': - token = token.substr(0, 2); - if (input) { - config._w = config._w || {}; - config._w[token] = toInt(input); - } - break; - case 'gg': - case 'GG': - config._w = config._w || {}; - config._w[token] = moment.parseTwoDigitYear(input); - } - } - - function dayOfYearFromWeekInfo(config) { - var w, weekYear, week, weekday, dow, doy, temp; - - w = config._w; - if (w.GG != null || w.W != null || w.E != null) { - dow = 1; - doy = 4; - - // TODO: We need to take the current isoWeekYear, but that depends on - // how we interpret now (local, utc, fixed offset). So create - // a now version of current config (take local/utc/offset flags, and - // create now). - weekYear = dfl(w.GG, config._a[YEAR], weekOfYear(moment(), 1, 4).year); - week = dfl(w.W, 1); - weekday = dfl(w.E, 1); - } else { - dow = config._locale._week.dow; - doy = config._locale._week.doy; - - weekYear = dfl(w.gg, config._a[YEAR], weekOfYear(moment(), dow, doy).year); - week = dfl(w.w, 1); - - if (w.d != null) { - // weekday -- low day numbers are considered next week - weekday = w.d; - if (weekday < dow) { - ++week; - } - } else if (w.e != null) { - // local weekday -- counting starts from begining of week - weekday = w.e + dow; - } else { - // default to begining of week - weekday = dow; - } - } - temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow); - - config._a[YEAR] = temp.year; - config._dayOfYear = temp.dayOfYear; - } - - // convert an array to a date. - // the array should mirror the parameters below - // note: all values past the year are optional and will default to the lowest possible value. - // [year, month, day , hour, minute, second, millisecond] - function dateFromConfig(config) { - var i, date, input = [], currentDate, yearToUse; - - if (config._d) { - return; - } - - currentDate = currentDateArray(config); - - //compute day of the year from weeks and weekdays - if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { - dayOfYearFromWeekInfo(config); - } - - //if the day of the year is set, figure out what it is - if (config._dayOfYear) { - yearToUse = dfl(config._a[YEAR], currentDate[YEAR]); - - if (config._dayOfYear > daysInYear(yearToUse)) { - config._pf._overflowDayOfYear = true; - } - - date = makeUTCDate(yearToUse, 0, config._dayOfYear); - config._a[MONTH] = date.getUTCMonth(); - config._a[DATE] = date.getUTCDate(); - } - - // Default to current date. - // * if no year, month, day of month are given, default to today - // * if day of month is given, default month and year - // * if month is given, default only year - // * if year is given, don't default anything - for (i = 0; i < 3 && config._a[i] == null; ++i) { - config._a[i] = input[i] = currentDate[i]; - } - - // Zero out whatever was not defaulted, including time - for (; i < 7; i++) { - config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; - } - - // Check for 24:00:00.000 - if (config._a[HOUR] === 24 && - config._a[MINUTE] === 0 && - config._a[SECOND] === 0 && - config._a[MILLISECOND] === 0) { - config._nextDay = true; - config._a[HOUR] = 0; - } - - config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input); - // Apply timezone offset from input. The actual utcOffset can be changed - // with parseZone. - if (config._tzm != null) { - config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); - } - - if (config._nextDay) { - config._a[HOUR] = 24; - } - } - - function dateFromObject(config) { - var normalizedInput; - - if (config._d) { - return; - } - - normalizedInput = normalizeObjectUnits(config._i); - config._a = [ - normalizedInput.year, - normalizedInput.month, - normalizedInput.day || normalizedInput.date, - normalizedInput.hour, - normalizedInput.minute, - normalizedInput.second, - normalizedInput.millisecond - ]; - - dateFromConfig(config); - } - - function currentDateArray(config) { - var now = new Date(); - if (config._useUTC) { - return [ - now.getUTCFullYear(), - now.getUTCMonth(), - now.getUTCDate() - ]; - } else { - return [now.getFullYear(), now.getMonth(), now.getDate()]; - } - } - - // date from string and format string - function makeDateFromStringAndFormat(config) { - if (config._f === moment.ISO_8601) { - parseISO(config); - return; - } - - config._a = []; - config._pf.empty = true; - - // This array is used to make a Date, either with `new Date` or `Date.UTC` - var string = '' + config._i, - i, parsedInput, tokens, token, skipped, - stringLength = string.length, - totalParsedInputLength = 0; - - tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; - - for (i = 0; i < tokens.length; i++) { - token = tokens[i]; - parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; - if (parsedInput) { - skipped = string.substr(0, string.indexOf(parsedInput)); - if (skipped.length > 0) { - config._pf.unusedInput.push(skipped); - } - string = string.slice(string.indexOf(parsedInput) + parsedInput.length); - totalParsedInputLength += parsedInput.length; - } - // don't parse if it's not a known token - if (formatTokenFunctions[token]) { - if (parsedInput) { - config._pf.empty = false; - } - else { - config._pf.unusedTokens.push(token); - } - addTimeToArrayFromToken(token, parsedInput, config); - } - else if (config._strict && !parsedInput) { - config._pf.unusedTokens.push(token); - } - } - - // add remaining unparsed input length to the string - config._pf.charsLeftOver = stringLength - totalParsedInputLength; - if (string.length > 0) { - config._pf.unusedInput.push(string); - } - - // clear _12h flag if hour is <= 12 - if (config._pf.bigHour === true && config._a[HOUR] <= 12) { - config._pf.bigHour = undefined; - } - // handle meridiem - config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], - config._meridiem); - dateFromConfig(config); - checkOverflow(config); - } - - function unescapeFormat(s) { - return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { - return p1 || p2 || p3 || p4; - }); - } - - // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript - function regexpEscape(s) { - return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); - } - - // date from string and array of format strings - function makeDateFromStringAndArray(config) { - var tempConfig, - bestMoment, - - scoreToBeat, - i, - currentScore; - - if (config._f.length === 0) { - config._pf.invalidFormat = true; - config._d = new Date(NaN); - return; - } - - for (i = 0; i < config._f.length; i++) { - currentScore = 0; - tempConfig = copyConfig({}, config); - if (config._useUTC != null) { - tempConfig._useUTC = config._useUTC; - } - tempConfig._pf = defaultParsingFlags(); - tempConfig._f = config._f[i]; - makeDateFromStringAndFormat(tempConfig); - - if (!isValid(tempConfig)) { - continue; - } - - // if there is any input that was not parsed add a penalty for that format - currentScore += tempConfig._pf.charsLeftOver; - - //or tokens - currentScore += tempConfig._pf.unusedTokens.length * 10; - - tempConfig._pf.score = currentScore; - - if (scoreToBeat == null || currentScore < scoreToBeat) { - scoreToBeat = currentScore; - bestMoment = tempConfig; - } - } - - extend(config, bestMoment || tempConfig); - } - - // date from iso format - function parseISO(config) { - var i, l, - string = config._i, - match = isoRegex.exec(string); - - if (match) { - config._pf.iso = true; - for (i = 0, l = isoDates.length; i < l; i++) { - if (isoDates[i][1].exec(string)) { - // match[5] should be 'T' or undefined - config._f = isoDates[i][0] + (match[6] || ' '); - break; - } - } - for (i = 0, l = isoTimes.length; i < l; i++) { - if (isoTimes[i][1].exec(string)) { - config._f += isoTimes[i][0]; - break; - } - } - if (string.match(parseTokenTimezone)) { - config._f += 'Z'; - } - makeDateFromStringAndFormat(config); - } else { - config._isValid = false; - } - } - - // date from iso format or fallback - function makeDateFromString(config) { - parseISO(config); - if (config._isValid === false) { - delete config._isValid; - moment.createFromInputFallback(config); - } - } - - function map(arr, fn) { - var res = [], i; - for (i = 0; i < arr.length; ++i) { - res.push(fn(arr[i], i)); - } - return res; - } - - function makeDateFromInput(config) { - var input = config._i, matched; - if (input === undefined) { - config._d = new Date(); - } else if (isDate(input)) { - config._d = new Date(+input); - } else if ((matched = aspNetJsonRegex.exec(input)) !== null) { - config._d = new Date(+matched[1]); - } else if (typeof input === 'string') { - makeDateFromString(config); - } else if (isArray(input)) { - config._a = map(input.slice(0), function (obj) { - return parseInt(obj, 10); - }); - dateFromConfig(config); - } else if (typeof(input) === 'object') { - dateFromObject(config); - } else if (typeof(input) === 'number') { - // from milliseconds - config._d = new Date(input); - } else { - moment.createFromInputFallback(config); - } - } - - function makeDate(y, m, d, h, M, s, ms) { - //can't just apply() to create a date: - //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply - var date = new Date(y, m, d, h, M, s, ms); - - //the date constructor doesn't accept years < 1970 - if (y < 1970) { - date.setFullYear(y); - } - return date; - } - - function makeUTCDate(y) { - var date = new Date(Date.UTC.apply(null, arguments)); - if (y < 1970) { - date.setUTCFullYear(y); - } - return date; - } - - function parseWeekday(input, locale) { - if (typeof input === 'string') { - if (!isNaN(input)) { - input = parseInt(input, 10); - } - else { - input = locale.weekdaysParse(input); - if (typeof input !== 'number') { - return null; - } - } - } - return input; - } - - /************************************ - Relative Time - ************************************/ - - - // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize - function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { - return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); - } - - function relativeTime(posNegDuration, withoutSuffix, locale) { - var duration = moment.duration(posNegDuration).abs(), - seconds = round(duration.as('s')), - minutes = round(duration.as('m')), - hours = round(duration.as('h')), - days = round(duration.as('d')), - months = round(duration.as('M')), - years = round(duration.as('y')), - - args = seconds < relativeTimeThresholds.s && ['s', seconds] || - minutes === 1 && ['m'] || - minutes < relativeTimeThresholds.m && ['mm', minutes] || - hours === 1 && ['h'] || - hours < relativeTimeThresholds.h && ['hh', hours] || - days === 1 && ['d'] || - days < relativeTimeThresholds.d && ['dd', days] || - months === 1 && ['M'] || - months < relativeTimeThresholds.M && ['MM', months] || - years === 1 && ['y'] || ['yy', years]; - - args[2] = withoutSuffix; - args[3] = +posNegDuration > 0; - args[4] = locale; - return substituteTimeAgo.apply({}, args); - } - - - /************************************ - Week of Year - ************************************/ - - - // firstDayOfWeek 0 = sun, 6 = sat - // the day of the week that starts the week - // (usually sunday or monday) - // firstDayOfWeekOfYear 0 = sun, 6 = sat - // the first week is the week that contains the first - // of this day of the week - // (eg. ISO weeks use thursday (4)) - function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) { - var end = firstDayOfWeekOfYear - firstDayOfWeek, - daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(), - adjustedMoment; - - - if (daysToDayOfWeek > end) { - daysToDayOfWeek -= 7; - } - - if (daysToDayOfWeek < end - 7) { - daysToDayOfWeek += 7; - } - - adjustedMoment = moment(mom).add(daysToDayOfWeek, 'd'); - return { - week: Math.ceil(adjustedMoment.dayOfYear() / 7), - year: adjustedMoment.year() - }; - } - - //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday - function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) { - var d = makeUTCDate(year, 0, 1).getUTCDay(), daysToAdd, dayOfYear; - - d = d === 0 ? 7 : d; - weekday = weekday != null ? weekday : firstDayOfWeek; - daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0); - dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1; - - return { - year: dayOfYear > 0 ? year : year - 1, - dayOfYear: dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear - }; - } - - /************************************ - Top Level Functions - ************************************/ - - function makeMoment(config) { - var input = config._i, - format = config._f, - res; - - config._locale = config._locale || moment.localeData(config._l); - - if (input === null || (format === undefined && input === '')) { - return moment.invalid({nullInput: true}); - } - - if (typeof input === 'string') { - config._i = input = config._locale.preparse(input); - } - - if (moment.isMoment(input)) { - return new Moment(input, true); - } else if (format) { - if (isArray(format)) { - makeDateFromStringAndArray(config); - } else { - makeDateFromStringAndFormat(config); - } - } else { - makeDateFromInput(config); - } - - res = new Moment(config); - if (res._nextDay) { - // Adding is smart enough around DST - res.add(1, 'd'); - res._nextDay = undefined; - } - - return res; - } - - moment = function (input, format, locale, strict) { - var c; - - if (typeof(locale) === 'boolean') { - strict = locale; - locale = undefined; - } - // object construction must be done this way. - // https://github.com/moment/moment/issues/1423 - c = {}; - c._isAMomentObject = true; - c._i = input; - c._f = format; - c._l = locale; - c._strict = strict; - c._isUTC = false; - c._pf = defaultParsingFlags(); - - return makeMoment(c); - }; - - moment.suppressDeprecationWarnings = false; - - moment.createFromInputFallback = deprecate( - 'moment construction falls back to js Date. This is ' + - 'discouraged and will be removed in upcoming major ' + - 'release. Please refer to ' + - 'https://github.com/moment/moment/issues/1407 for more info.', - function (config) { - config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); - } - ); - - // Pick a moment m from moments so that m[fn](other) is true for all - // other. This relies on the function fn to be transitive. - // - // moments should either be an array of moment objects or an array, whose - // first element is an array of moment objects. - function pickBy(fn, moments) { - var res, i; - if (moments.length === 1 && isArray(moments[0])) { - moments = moments[0]; - } - if (!moments.length) { - return moment(); - } - res = moments[0]; - for (i = 1; i < moments.length; ++i) { - if (moments[i][fn](res)) { - res = moments[i]; - } - } - return res; - } - - moment.min = function () { - var args = [].slice.call(arguments, 0); - - return pickBy('isBefore', args); - }; - - moment.max = function () { - var args = [].slice.call(arguments, 0); - - return pickBy('isAfter', args); - }; - - // creating with utc - moment.utc = function (input, format, locale, strict) { - var c; - - if (typeof(locale) === 'boolean') { - strict = locale; - locale = undefined; - } - // object construction must be done this way. - // https://github.com/moment/moment/issues/1423 - c = {}; - c._isAMomentObject = true; - c._useUTC = true; - c._isUTC = true; - c._l = locale; - c._i = input; - c._f = format; - c._strict = strict; - c._pf = defaultParsingFlags(); - - return makeMoment(c).utc(); - }; - - // creating with unix timestamp (in seconds) - moment.unix = function (input) { - return moment(input * 1000); - }; - - // duration - moment.duration = function (input, key) { - var duration = input, - // matching against regexp is expensive, do it on demand - match = null, - sign, - ret, - parseIso, - diffRes; - - if (moment.isDuration(input)) { - duration = { - ms: input._milliseconds, - d: input._days, - M: input._months - }; - } else if (typeof input === 'number') { - duration = {}; - if (key) { - duration[key] = input; - } else { - duration.milliseconds = input; - } - } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) { - sign = (match[1] === '-') ? -1 : 1; - duration = { - y: 0, - d: toInt(match[DATE]) * sign, - h: toInt(match[HOUR]) * sign, - m: toInt(match[MINUTE]) * sign, - s: toInt(match[SECOND]) * sign, - ms: toInt(match[MILLISECOND]) * sign - }; - } else if (!!(match = isoDurationRegex.exec(input))) { - sign = (match[1] === '-') ? -1 : 1; - parseIso = function (inp) { - // We'd normally use ~~inp for this, but unfortunately it also - // converts floats to ints. - // inp may be undefined, so careful calling replace on it. - var res = inp && parseFloat(inp.replace(',', '.')); - // apply sign while we're at it - return (isNaN(res) ? 0 : res) * sign; - }; - duration = { - y: parseIso(match[2]), - M: parseIso(match[3]), - d: parseIso(match[4]), - h: parseIso(match[5]), - m: parseIso(match[6]), - s: parseIso(match[7]), - w: parseIso(match[8]) - }; - } else if (duration == null) {// checks for null or undefined - duration = {}; - } else if (typeof duration === 'object' && - ('from' in duration || 'to' in duration)) { - diffRes = momentsDifference(moment(duration.from), moment(duration.to)); - - duration = {}; - duration.ms = diffRes.milliseconds; - duration.M = diffRes.months; - } - - ret = new Duration(duration); - - if (moment.isDuration(input) && hasOwnProp(input, '_locale')) { - ret._locale = input._locale; - } - - return ret; - }; - - // version number - moment.version = VERSION; - - // default format - moment.defaultFormat = isoFormat; - - // constant that refers to the ISO standard - moment.ISO_8601 = function () {}; - - // Plugins that add properties should also add the key here (null value), - // so we can properly clone ourselves. - moment.momentProperties = momentProperties; - - // This function will be called whenever a moment is mutated. - // It is intended to keep the offset in sync with the timezone. - moment.updateOffset = function () {}; - - // This function allows you to set a threshold for relative time strings - moment.relativeTimeThreshold = function (threshold, limit) { - if (relativeTimeThresholds[threshold] === undefined) { - return false; - } - if (limit === undefined) { - return relativeTimeThresholds[threshold]; - } - relativeTimeThresholds[threshold] = limit; - return true; - }; - - moment.lang = deprecate( - 'moment.lang is deprecated. Use moment.locale instead.', - function (key, value) { - return moment.locale(key, value); - } - ); - - // This function will load locale and then set the global locale. If - // no arguments are passed in, it will simply return the current global - // locale key. - moment.locale = function (key, values) { - var data; - if (key) { - if (typeof(values) !== 'undefined') { - data = moment.defineLocale(key, values); - } - else { - data = moment.localeData(key); - } - - if (data) { - moment.duration._locale = moment._locale = data; - } - } - - return moment._locale._abbr; - }; - - moment.defineLocale = function (name, values) { - if (values !== null) { - values.abbr = name; - if (!locales[name]) { - locales[name] = new Locale(); - } - locales[name].set(values); - - // backwards compat for now: also set the locale - moment.locale(name); - - return locales[name]; - } else { - // useful for testing - delete locales[name]; - return null; - } - }; - - moment.langData = deprecate( - 'moment.langData is deprecated. Use moment.localeData instead.', - function (key) { - return moment.localeData(key); - } - ); - - // returns locale data - moment.localeData = function (key) { - var locale; - - if (key && key._locale && key._locale._abbr) { - key = key._locale._abbr; - } - - if (!key) { - return moment._locale; - } - - if (!isArray(key)) { - //short-circuit everything else - locale = loadLocale(key); - if (locale) { - return locale; - } - key = [key]; - } - - return chooseLocale(key); - }; - - // compare moment object - moment.isMoment = function (obj) { - return obj instanceof Moment || - (obj != null && hasOwnProp(obj, '_isAMomentObject')); - }; - - // for typechecking Duration objects - moment.isDuration = function (obj) { - return obj instanceof Duration; - }; - - for (i = lists.length - 1; i >= 0; --i) { - makeList(lists[i]); - } - - moment.normalizeUnits = function (units) { - return normalizeUnits(units); - }; - - moment.invalid = function (flags) { - var m = moment.utc(NaN); - if (flags != null) { - extend(m._pf, flags); - } - else { - m._pf.userInvalidated = true; - } - - return m; - }; - - moment.parseZone = function () { - return moment.apply(null, arguments).parseZone(); - }; - - moment.parseTwoDigitYear = function (input) { - return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); - }; - - moment.isDate = isDate; - - /************************************ - Moment Prototype - ************************************/ - - - extend(moment.fn = Moment.prototype, { - - clone : function () { - return moment(this); - }, - - valueOf : function () { - return +this._d - ((this._offset || 0) * 60000); - }, - - unix : function () { - return Math.floor(+this / 1000); - }, - - toString : function () { - return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); - }, - - toDate : function () { - return this._offset ? new Date(+this) : this._d; - }, - - toISOString : function () { - var m = moment(this).utc(); - if (0 < m.year() && m.year() <= 9999) { - if ('function' === typeof Date.prototype.toISOString) { - // native implementation is ~50x faster, use it when we can - return this.toDate().toISOString(); - } else { - return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); - } - } else { - return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); - } - }, - - toArray : function () { - var m = this; - return [ - m.year(), - m.month(), - m.date(), - m.hours(), - m.minutes(), - m.seconds(), - m.milliseconds() - ]; - }, - - isValid : function () { - return isValid(this); - }, - - isDSTShifted : function () { - if (this._a) { - return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0; - } - - return false; - }, - - parsingFlags : function () { - return extend({}, this._pf); - }, - - invalidAt: function () { - return this._pf.overflow; - }, - - utc : function (keepLocalTime) { - return this.utcOffset(0, keepLocalTime); - }, - - local : function (keepLocalTime) { - if (this._isUTC) { - this.utcOffset(0, keepLocalTime); - this._isUTC = false; - - if (keepLocalTime) { - this.subtract(this._dateUtcOffset(), 'm'); - } - } - return this; - }, - - format : function (inputString) { - var output = formatMoment(this, inputString || moment.defaultFormat); - return this.localeData().postformat(output); - }, - - add : createAdder(1, 'add'), - - subtract : createAdder(-1, 'subtract'), - - diff : function (input, units, asFloat) { - var that = makeAs(input, this), - zoneDiff = (that.utcOffset() - this.utcOffset()) * 6e4, - anchor, diff, output, daysAdjust; - - units = normalizeUnits(units); - - if (units === 'year' || units === 'month' || units === 'quarter') { - output = monthDiff(this, that); - if (units === 'quarter') { - output = output / 3; - } else if (units === 'year') { - output = output / 12; - } - } else { - diff = this - that; - output = units === 'second' ? diff / 1e3 : // 1000 - units === 'minute' ? diff / 6e4 : // 1000 * 60 - units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60 - units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst - units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst - diff; - } - return asFloat ? output : absRound(output); - }, - - from : function (time, withoutSuffix) { - return moment.duration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); - }, - - fromNow : function (withoutSuffix) { - return this.from(moment(), withoutSuffix); - }, - - calendar : function (time) { - // We want to compare the start of today, vs this. - // Getting start-of-today depends on whether we're locat/utc/offset - // or not. - var now = time || moment(), - sod = makeAs(now, this).startOf('day'), - diff = this.diff(sod, 'days', true), - format = diff < -6 ? 'sameElse' : - diff < -1 ? 'lastWeek' : - diff < 0 ? 'lastDay' : - diff < 1 ? 'sameDay' : - diff < 2 ? 'nextDay' : - diff < 7 ? 'nextWeek' : 'sameElse'; - return this.format(this.localeData().calendar(format, this, moment(now))); - }, - - isLeapYear : function () { - return isLeapYear(this.year()); - }, - - isDST : function () { - return (this.utcOffset() > this.clone().month(0).utcOffset() || - this.utcOffset() > this.clone().month(5).utcOffset()); - }, - - day : function (input) { - var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); - if (input != null) { - input = parseWeekday(input, this.localeData()); - return this.add(input - day, 'd'); - } else { - return day; - } - }, - - month : makeAccessor('Month', true), - - startOf : function (units) { - units = normalizeUnits(units); - // the following switch intentionally omits break keywords - // to utilize falling through the cases. - switch (units) { - case 'year': - this.month(0); - /* falls through */ - case 'quarter': - case 'month': - this.date(1); - /* falls through */ - case 'week': - case 'isoWeek': - case 'day': - this.hours(0); - /* falls through */ - case 'hour': - this.minutes(0); - /* falls through */ - case 'minute': - this.seconds(0); - /* falls through */ - case 'second': - this.milliseconds(0); - /* falls through */ - } - - // weeks are a special case - if (units === 'week') { - this.weekday(0); - } else if (units === 'isoWeek') { - this.isoWeekday(1); - } - - // quarters are also special - if (units === 'quarter') { - this.month(Math.floor(this.month() / 3) * 3); - } - - return this; - }, - - endOf: function (units) { - units = normalizeUnits(units); - if (units === undefined || units === 'millisecond') { - return this; - } - return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); - }, - - isAfter: function (input, units) { - var inputMs; - units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); - if (units === 'millisecond') { - input = moment.isMoment(input) ? input : moment(input); - return +this > +input; - } else { - inputMs = moment.isMoment(input) ? +input : +moment(input); - return inputMs < +this.clone().startOf(units); - } - }, - - isBefore: function (input, units) { - var inputMs; - units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); - if (units === 'millisecond') { - input = moment.isMoment(input) ? input : moment(input); - return +this < +input; - } else { - inputMs = moment.isMoment(input) ? +input : +moment(input); - return +this.clone().endOf(units) < inputMs; - } - }, - - isBetween: function (from, to, units) { - return this.isAfter(from, units) && this.isBefore(to, units); - }, - - isSame: function (input, units) { - var inputMs; - units = normalizeUnits(units || 'millisecond'); - if (units === 'millisecond') { - input = moment.isMoment(input) ? input : moment(input); - return +this === +input; - } else { - inputMs = +moment(input); - return +(this.clone().startOf(units)) <= inputMs && inputMs <= +(this.clone().endOf(units)); - } - }, - - min: deprecate( - 'moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548', - function (other) { - other = moment.apply(null, arguments); - return other < this ? this : other; - } - ), - - max: deprecate( - 'moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548', - function (other) { - other = moment.apply(null, arguments); - return other > this ? this : other; - } - ), - - zone : deprecate( - 'moment().zone is deprecated, use moment().utcOffset instead. ' + - 'https://github.com/moment/moment/issues/1779', - function (input, keepLocalTime) { - if (input != null) { - if (typeof input !== 'string') { - input = -input; - } - - this.utcOffset(input, keepLocalTime); - - return this; - } else { - return -this.utcOffset(); - } - } - ), - - // keepLocalTime = true means only change the timezone, without - // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> - // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset - // +0200, so we adjust the time as needed, to be valid. - // - // Keeping the time actually adds/subtracts (one hour) - // from the actual represented time. That is why we call updateOffset - // a second time. In case it wants us to change the offset again - // _changeInProgress == true case, then we have to adjust, because - // there is no such time in the given timezone. - utcOffset : function (input, keepLocalTime) { - var offset = this._offset || 0, - localAdjust; - if (input != null) { - if (typeof input === 'string') { - input = utcOffsetFromString(input); - } - if (Math.abs(input) < 16) { - input = input * 60; - } - if (!this._isUTC && keepLocalTime) { - localAdjust = this._dateUtcOffset(); - } - this._offset = input; - this._isUTC = true; - if (localAdjust != null) { - this.add(localAdjust, 'm'); - } - if (offset !== input) { - if (!keepLocalTime || this._changeInProgress) { - addOrSubtractDurationFromMoment(this, - moment.duration(input - offset, 'm'), 1, false); - } else if (!this._changeInProgress) { - this._changeInProgress = true; - moment.updateOffset(this, true); - this._changeInProgress = null; - } - } - - return this; - } else { - return this._isUTC ? offset : this._dateUtcOffset(); - } - }, - - isLocal : function () { - return !this._isUTC; - }, - - isUtcOffset : function () { - return this._isUTC; - }, - - isUtc : function () { - return this._isUTC && this._offset === 0; - }, - - zoneAbbr : function () { - return this._isUTC ? 'UTC' : ''; - }, - - zoneName : function () { - return this._isUTC ? 'Coordinated Universal Time' : ''; - }, - - parseZone : function () { - if (this._tzm) { - this.utcOffset(this._tzm); - } else if (typeof this._i === 'string') { - this.utcOffset(utcOffsetFromString(this._i)); - } - return this; - }, - - hasAlignedHourOffset : function (input) { - if (!input) { - input = 0; - } - else { - input = moment(input).utcOffset(); - } - - return (this.utcOffset() - input) % 60 === 0; - }, - - daysInMonth : function () { - return daysInMonth(this.year(), this.month()); - }, - - dayOfYear : function (input) { - var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1; - return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); - }, - - quarter : function (input) { - return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); - }, - - weekYear : function (input) { - var year = weekOfYear(this, this.localeData()._week.dow, this.localeData()._week.doy).year; - return input == null ? year : this.add((input - year), 'y'); - }, - - isoWeekYear : function (input) { - var year = weekOfYear(this, 1, 4).year; - return input == null ? year : this.add((input - year), 'y'); - }, - - week : function (input) { - var week = this.localeData().week(this); - return input == null ? week : this.add((input - week) * 7, 'd'); - }, - - isoWeek : function (input) { - var week = weekOfYear(this, 1, 4).week; - return input == null ? week : this.add((input - week) * 7, 'd'); - }, - - weekday : function (input) { - var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; - return input == null ? weekday : this.add(input - weekday, 'd'); - }, - - isoWeekday : function (input) { - // behaves the same as moment#day except - // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) - // as a setter, sunday should belong to the previous week. - return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7); - }, - - isoWeeksInYear : function () { - return weeksInYear(this.year(), 1, 4); - }, - - weeksInYear : function () { - var weekInfo = this.localeData()._week; - return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); - }, - - get : function (units) { - units = normalizeUnits(units); - return this[units](); - }, - - set : function (units, value) { - var unit; - if (typeof units === 'object') { - for (unit in units) { - this.set(unit, units[unit]); - } - } - else { - units = normalizeUnits(units); - if (typeof this[units] === 'function') { - this[units](value); - } - } - return this; - }, - - // If passed a locale key, it will set the locale for this - // instance. Otherwise, it will return the locale configuration - // variables for this instance. - locale : function (key) { - var newLocaleData; - - if (key === undefined) { - return this._locale._abbr; - } else { - newLocaleData = moment.localeData(key); - if (newLocaleData != null) { - this._locale = newLocaleData; - } - return this; - } - }, - - lang : deprecate( - 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', - function (key) { - if (key === undefined) { - return this.localeData(); - } else { - return this.locale(key); - } - } - ), - - localeData : function () { - return this._locale; - }, - - _dateUtcOffset : function () { - // On Firefox.24 Date#getTimezoneOffset returns a floating point. - // https://github.com/moment/moment/pull/1871 - return -Math.round(this._d.getTimezoneOffset() / 15) * 15; - } - - }); - - function rawMonthSetter(mom, value) { - var dayOfMonth; - - // TODO: Move this out of here! - if (typeof value === 'string') { - value = mom.localeData().monthsParse(value); - // TODO: Another silent failure? - if (typeof value !== 'number') { - return mom; - } - } - - dayOfMonth = Math.min(mom.date(), - daysInMonth(mom.year(), value)); - mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); - return mom; - } - - function rawGetter(mom, unit) { - return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit](); - } - - function rawSetter(mom, unit, value) { - if (unit === 'Month') { - return rawMonthSetter(mom, value); - } else { - return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); - } - } - - function makeAccessor(unit, keepTime) { - return function (value) { - if (value != null) { - rawSetter(this, unit, value); - moment.updateOffset(this, keepTime); - return this; - } else { - return rawGetter(this, unit); - } - }; - } - - moment.fn.millisecond = moment.fn.milliseconds = makeAccessor('Milliseconds', false); - moment.fn.second = moment.fn.seconds = makeAccessor('Seconds', false); - moment.fn.minute = moment.fn.minutes = makeAccessor('Minutes', false); - // Setting the hour should keep the time, because the user explicitly - // specified which hour he wants. So trying to maintain the same hour (in - // a new timezone) makes sense. Adding/subtracting hours does not follow - // this rule. - moment.fn.hour = moment.fn.hours = makeAccessor('Hours', true); - // moment.fn.month is defined separately - moment.fn.date = makeAccessor('Date', true); - moment.fn.dates = deprecate('dates accessor is deprecated. Use date instead.', makeAccessor('Date', true)); - moment.fn.year = makeAccessor('FullYear', true); - moment.fn.years = deprecate('years accessor is deprecated. Use year instead.', makeAccessor('FullYear', true)); - - // add plural methods - moment.fn.days = moment.fn.day; - moment.fn.months = moment.fn.month; - moment.fn.weeks = moment.fn.week; - moment.fn.isoWeeks = moment.fn.isoWeek; - moment.fn.quarters = moment.fn.quarter; - - // add aliased format methods - moment.fn.toJSON = moment.fn.toISOString; - - // alias isUtc for dev-friendliness - moment.fn.isUTC = moment.fn.isUtc; - - /************************************ - Duration Prototype - ************************************/ - - - function daysToYears (days) { - // 400 years have 146097 days (taking into account leap year rules) - return days * 400 / 146097; - } - - function yearsToDays (years) { - // years * 365 + absRound(years / 4) - - // absRound(years / 100) + absRound(years / 400); - return years * 146097 / 400; - } - - extend(moment.duration.fn = Duration.prototype, { - - _bubble : function () { - var milliseconds = this._milliseconds, - days = this._days, - months = this._months, - data = this._data, - seconds, minutes, hours, years = 0; - - // The following code bubbles up values, see the tests for - // examples of what that means. - data.milliseconds = milliseconds % 1000; - - seconds = absRound(milliseconds / 1000); - data.seconds = seconds % 60; - - minutes = absRound(seconds / 60); - data.minutes = minutes % 60; - - hours = absRound(minutes / 60); - data.hours = hours % 24; - - days += absRound(hours / 24); - - // Accurately convert days to years, assume start from year 0. - years = absRound(daysToYears(days)); - days -= absRound(yearsToDays(years)); - - // 30 days to a month - // TODO (iskren): Use anchor date (like 1st Jan) to compute this. - months += absRound(days / 30); - days %= 30; - - // 12 months -> 1 year - years += absRound(months / 12); - months %= 12; - - data.days = days; - data.months = months; - data.years = years; - }, - - abs : function () { - this._milliseconds = Math.abs(this._milliseconds); - this._days = Math.abs(this._days); - this._months = Math.abs(this._months); - - this._data.milliseconds = Math.abs(this._data.milliseconds); - this._data.seconds = Math.abs(this._data.seconds); - this._data.minutes = Math.abs(this._data.minutes); - this._data.hours = Math.abs(this._data.hours); - this._data.months = Math.abs(this._data.months); - this._data.years = Math.abs(this._data.years); - - return this; - }, - - weeks : function () { - return absRound(this.days() / 7); - }, - - valueOf : function () { - return this._milliseconds + - this._days * 864e5 + - (this._months % 12) * 2592e6 + - toInt(this._months / 12) * 31536e6; - }, - - humanize : function (withSuffix) { - var output = relativeTime(this, !withSuffix, this.localeData()); - - if (withSuffix) { - output = this.localeData().pastFuture(+this, output); - } - - return this.localeData().postformat(output); - }, - - add : function (input, val) { - // supports only 2.0-style add(1, 's') or add(moment) - var dur = moment.duration(input, val); - - this._milliseconds += dur._milliseconds; - this._days += dur._days; - this._months += dur._months; - - this._bubble(); - - return this; - }, - - subtract : function (input, val) { - var dur = moment.duration(input, val); - - this._milliseconds -= dur._milliseconds; - this._days -= dur._days; - this._months -= dur._months; - - this._bubble(); - - return this; - }, - - get : function (units) { - units = normalizeUnits(units); - return this[units.toLowerCase() + 's'](); - }, - - as : function (units) { - var days, months; - units = normalizeUnits(units); - - if (units === 'month' || units === 'year') { - days = this._days + this._milliseconds / 864e5; - months = this._months + daysToYears(days) * 12; - return units === 'month' ? months : months / 12; - } else { - // handle milliseconds separately because of floating point math errors (issue #1867) - days = this._days + Math.round(yearsToDays(this._months / 12)); - switch (units) { - case 'week': return days / 7 + this._milliseconds / 6048e5; - case 'day': return days + this._milliseconds / 864e5; - case 'hour': return days * 24 + this._milliseconds / 36e5; - case 'minute': return days * 24 * 60 + this._milliseconds / 6e4; - case 'second': return days * 24 * 60 * 60 + this._milliseconds / 1000; - // Math.floor prevents floating point math errors here - case 'millisecond': return Math.floor(days * 24 * 60 * 60 * 1000) + this._milliseconds; - default: throw new Error('Unknown unit ' + units); - } - } - }, - - lang : moment.fn.lang, - locale : moment.fn.locale, - - toIsoString : deprecate( - 'toIsoString() is deprecated. Please use toISOString() instead ' + - '(notice the capitals)', - function () { - return this.toISOString(); - } - ), - - toISOString : function () { - // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js - var years = Math.abs(this.years()), - months = Math.abs(this.months()), - days = Math.abs(this.days()), - hours = Math.abs(this.hours()), - minutes = Math.abs(this.minutes()), - seconds = Math.abs(this.seconds() + this.milliseconds() / 1000); - - if (!this.asSeconds()) { - // this is the same as C#'s (Noda) and python (isodate)... - // but not other JS (goog.date) - return 'P0D'; - } - - return (this.asSeconds() < 0 ? '-' : '') + - 'P' + - (years ? years + 'Y' : '') + - (months ? months + 'M' : '') + - (days ? days + 'D' : '') + - ((hours || minutes || seconds) ? 'T' : '') + - (hours ? hours + 'H' : '') + - (minutes ? minutes + 'M' : '') + - (seconds ? seconds + 'S' : ''); - }, - - localeData : function () { - return this._locale; - }, - - toJSON : function () { - return this.toISOString(); - } - }); - - moment.duration.fn.toString = moment.duration.fn.toISOString; - - function makeDurationGetter(name) { - moment.duration.fn[name] = function () { - return this._data[name]; - }; - } - - for (i in unitMillisecondFactors) { - if (hasOwnProp(unitMillisecondFactors, i)) { - makeDurationGetter(i.toLowerCase()); - } - } - - moment.duration.fn.asMilliseconds = function () { - return this.as('ms'); - }; - moment.duration.fn.asSeconds = function () { - return this.as('s'); - }; - moment.duration.fn.asMinutes = function () { - return this.as('m'); - }; - moment.duration.fn.asHours = function () { - return this.as('h'); - }; - moment.duration.fn.asDays = function () { - return this.as('d'); - }; - moment.duration.fn.asWeeks = function () { - return this.as('weeks'); - }; - moment.duration.fn.asMonths = function () { - return this.as('M'); - }; - moment.duration.fn.asYears = function () { - return this.as('y'); - }; - - /************************************ - Default Locale - ************************************/ - - - // Set default locale, other locale will inherit from English. - moment.locale('en', { - ordinalParse: /\d{1,2}(th|st|nd|rd)/, - ordinal : function (number) { - var b = number % 10, - output = (toInt(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - } - }); - - // moment.js locale configuration -// locale : afrikaans (af) -// author : Werner Mollentze : https://github.com/wernerm - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('af', { - months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'), - weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'), - weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'), - weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'), - meridiemParse: /vm|nm/i, - isPM : function (input) { - return /^nm$/i.test(input); - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 12) { - return isLower ? 'vm' : 'VM'; - } else { - return isLower ? 'nm' : 'NM'; - } - }, - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay : '[Vandag om] LT', - nextDay : '[Môre om] LT', - nextWeek : 'dddd [om] LT', - lastDay : '[Gister om] LT', - lastWeek : '[Laas] dddd [om] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'oor %s', - past : '%s gelede', - s : '\'n paar sekondes', - m : '\'n minuut', - mm : '%d minute', - h : '\'n uur', - hh : '%d ure', - d : '\'n dag', - dd : '%d dae', - M : '\'n maand', - MM : '%d maande', - y : '\'n jaar', - yy : '%d jaar' - }, - ordinalParse: /\d{1,2}(ste|de)/, - ordinal : function (number) { - return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter - }, - week : { - dow : 1, // Maandag is die eerste dag van die week. - doy : 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar. - } - }); -})); -// moment.js locale configuration -// locale : Moroccan Arabic (ar-ma) -// author : ElFadili Yassine : https://github.com/ElFadiliY -// author : Abdel Said : https://github.com/abdelsaid - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('ar-ma', { - months : 'يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), - monthsShort : 'يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), - weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay: '[اليوم على الساعة] LT', - nextDay: '[غدا على الساعة] LT', - nextWeek: 'dddd [على الساعة] LT', - lastDay: '[أمس على الساعة] LT', - lastWeek: 'dddd [على الساعة] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'ÙÙŠ %s', - past : 'منذ %s', - s : 'ثوان', - m : 'دقيقة', - mm : '%d دقائق', - h : 'ساعة', - hh : '%d ساعات', - d : 'يوم', - dd : '%d أيام', - M : 'شهر', - MM : '%d أشهر', - y : 'سنة', - yy : '%d سنوات' - }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : Arabic Saudi Arabia (ar-sa) -// author : Suhail Alkowaileet : https://github.com/xsoh - -(function (factory) { - factory(moment); -}(function (moment) { - var symbolMap = { - '1': 'Ù¡', - '2': 'Ù¢', - '3': 'Ù£', - '4': 'Ù¤', - '5': 'Ù¥', - '6': 'Ù¦', - '7': 'Ù§', - '8': 'Ù¨', - '9': 'Ù©', - '0': 'Ù ' - }, numberMap = { - 'Ù¡': '1', - 'Ù¢': '2', - 'Ù£': '3', - 'Ù¤': '4', - 'Ù¥': '5', - 'Ù¦': '6', - 'Ù§': '7', - 'Ù¨': '8', - 'Ù©': '9', - 'Ù ': '0' - }; - - return moment.defineLocale('ar-sa', { - months : 'يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), - monthsShort : 'يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), - weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - meridiemParse: /ص|Ù…/, - isPM : function (input) { - return 'Ù…' === input; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'ص'; - } else { - return 'Ù…'; - } - }, - calendar : { - sameDay: '[اليوم على الساعة] LT', - nextDay: '[غدا على الساعة] LT', - nextWeek: 'dddd [على الساعة] LT', - lastDay: '[أمس على الساعة] LT', - lastWeek: 'dddd [على الساعة] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'ÙÙŠ %s', - past : 'منذ %s', - s : 'ثوان', - m : 'دقيقة', - mm : '%d دقائق', - h : 'ساعة', - hh : '%d ساعات', - d : 'يوم', - dd : '%d أيام', - M : 'شهر', - MM : '%d أشهر', - y : 'سنة', - yy : '%d سنوات' - }, - preparse: function (string) { - return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { - return numberMap[match]; - }).replace(/ØŒ/g, ','); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }).replace(/,/g, 'ØŒ'); - }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : Tunisian Arabic (ar-tn) - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('ar-tn', { - months: 'جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), - monthsShort: 'جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر'.split('_'), - weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin: 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), - longDateFormat: { - LT: 'HH:mm', - LTS: 'LT:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY LT', - LLLL: 'dddd D MMMM YYYY LT' - }, - calendar: { - sameDay: '[اليوم على الساعة] LT', - nextDay: '[غدا على الساعة] LT', - nextWeek: 'dddd [على الساعة] LT', - lastDay: '[أمس على الساعة] LT', - lastWeek: 'dddd [على الساعة] LT', - sameElse: 'L' - }, - relativeTime: { - future: 'ÙÙŠ %s', - past: 'منذ %s', - s: 'ثوان', - m: 'دقيقة', - mm: '%d دقائق', - h: 'ساعة', - hh: '%d ساعات', - d: 'يوم', - dd: '%d أيام', - M: 'شهر', - MM: '%d أشهر', - y: 'سنة', - yy: '%d سنوات' - }, - week: { - dow: 1, // Monday is the first day of the week. - doy: 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// Locale: Arabic (ar) -// Author: Abdel Said: https://github.com/abdelsaid -// Changes in months, weekdays: Ahmed Elkhatib -// Native plural forms: forabi https://github.com/forabi - -(function (factory) { - factory(moment); -}(function (moment) { - var symbolMap = { - '1': 'Ù¡', - '2': 'Ù¢', - '3': 'Ù£', - '4': 'Ù¤', - '5': 'Ù¥', - '6': 'Ù¦', - '7': 'Ù§', - '8': 'Ù¨', - '9': 'Ù©', - '0': 'Ù ' - }, numberMap = { - 'Ù¡': '1', - 'Ù¢': '2', - 'Ù£': '3', - 'Ù¤': '4', - 'Ù¥': '5', - 'Ù¦': '6', - 'Ù§': '7', - 'Ù¨': '8', - 'Ù©': '9', - 'Ù ': '0' - }, pluralForm = function (n) { - return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5; - }, plurals = { - s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'], - m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'], - h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'], - d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'], - M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'], - y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام'] - }, pluralize = function (u) { - return function (number, withoutSuffix, string, isFuture) { - var f = pluralForm(number), - str = plurals[u][pluralForm(number)]; - if (f === 2) { - str = str[withoutSuffix ? 0 : 1]; - } - return str.replace(/%d/i, number); - }; - }, months = [ - 'كانون الثاني يناير', - 'شباط Ùبراير', - 'آذار مارس', - 'نيسان أبريل', - 'أيار مايو', - 'حزيران يونيو', - 'تموز يوليو', - 'آب أغسطس', - 'أيلول سبتمبر', - 'تشرين الأول أكتوبر', - 'تشرين الثاني نوÙمبر', - 'كانون الأول ديسمبر' - ]; - - return moment.defineLocale('ar', { - months : months, - monthsShort : months, - weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'Ø­_Ù†_Ø«_ر_Ø®_ج_س'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - meridiemParse: /ص|Ù…/, - isPM : function (input) { - return 'Ù…' === input; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'ص'; - } else { - return 'Ù…'; - } - }, - calendar : { - sameDay: '[اليوم عند الساعة] LT', - nextDay: '[غدًا عند الساعة] LT', - nextWeek: 'dddd [عند الساعة] LT', - lastDay: '[أمس عند الساعة] LT', - lastWeek: 'dddd [عند الساعة] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'بعد %s', - past : 'منذ %s', - s : pluralize('s'), - m : pluralize('m'), - mm : pluralize('m'), - h : pluralize('h'), - hh : pluralize('h'), - d : pluralize('d'), - dd : pluralize('d'), - M : pluralize('M'), - MM : pluralize('M'), - y : pluralize('y'), - yy : pluralize('y') - }, - preparse: function (string) { - return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { - return numberMap[match]; - }).replace(/ØŒ/g, ','); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }).replace(/,/g, 'ØŒ'); - }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : azerbaijani (az) -// author : topchiyev : https://github.com/topchiyev - -(function (factory) { - factory(moment); -}(function (moment) { - var suffixes = { - 1: '-inci', - 5: '-inci', - 8: '-inci', - 70: '-inci', - 80: '-inci', - - 2: '-nci', - 7: '-nci', - 20: '-nci', - 50: '-nci', - - 3: '-üncü', - 4: '-üncü', - 100: '-üncü', - - 6: '-ncı', - - 9: '-uncu', - 10: '-uncu', - 30: '-uncu', - - 60: '-ıncı', - 90: '-ıncı' - }; - return moment.defineLocale('az', { - months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'), - monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'), - weekdays : 'Bazar_Bazar ertÉ™si_ÇərÅŸÉ™nbÉ™ axÅŸamı_ÇərÅŸÉ™nbÉ™_CümÉ™ axÅŸamı_CümÉ™_ŞənbÉ™'.split('_'), - weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'), - weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay : '[bugün saat] LT', - nextDay : '[sabah saat] LT', - nextWeek : '[gÉ™lÉ™n hÉ™ftÉ™] dddd [saat] LT', - lastDay : '[dünÉ™n] LT', - lastWeek : '[keçən hÉ™ftÉ™] dddd [saat] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s sonra', - past : '%s É™vvÉ™l', - s : 'birneçə saniyyÉ™', - m : 'bir dÉ™qiqÉ™', - mm : '%d dÉ™qiqÉ™', - h : 'bir saat', - hh : '%d saat', - d : 'bir gün', - dd : '%d gün', - M : 'bir ay', - MM : '%d ay', - y : 'bir il', - yy : '%d il' - }, - meridiemParse: /gecÉ™|sÉ™hÉ™r|gündüz|axÅŸam/, - isPM : function (input) { - return /^(gündüz|axÅŸam)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'gecÉ™'; - } else if (hour < 12) { - return 'sÉ™hÉ™r'; - } else if (hour < 17) { - return 'gündüz'; - } else { - return 'axÅŸam'; - } - }, - ordinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/, - ordinal : function (number) { - if (number === 0) { // special case for zero - return number + '-ıncı'; - } - var a = number % 10, - b = number % 100 - a, - c = number >= 100 ? 100 : null; - - return number + (suffixes[a] || suffixes[b] || suffixes[c]); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : belarusian (be) -// author : Dmitry Demidov : https://github.com/demidov91 -// author: Praleska: http://praleska.pro/ -// Author : Menelion Elensúle : https://github.com/Oire - -(function (factory) { - factory(moment); -}(function (moment) { - function plural(word, num) { - var forms = word.split('_'); - return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); - } - - function relativeTimeWithPlural(number, withoutSuffix, key) { - var format = { - 'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін', - 'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін', - 'dd': 'дзень_дні_дзён', - 'MM': 'меÑÑц_меÑÑцы_меÑÑцаў', - 'yy': 'год_гады_гадоў' - }; - if (key === 'm') { - return withoutSuffix ? 'хвіліна' : 'хвіліну'; - } - else if (key === 'h') { - return withoutSuffix ? 'гадзіна' : 'гадзіну'; - } - else { - return number + ' ' + plural(format[key], +number); - } - } - - function monthsCaseReplace(m, format) { - var months = { - 'nominative': 'Ñтудзень_люты_Ñакавік_краÑавік_травень_чÑрвень_ліпень_жнівень_вераÑень_каÑтрычнік_ліÑтапад_Ñнежань'.split('_'), - 'accusative': 'ÑтудзенÑ_лютага_Ñакавіка_краÑавіка_траўнÑ_чÑрвенÑ_ліпенÑ_жніўнÑ_вераÑнÑ_каÑтрычніка_ліÑтапада_ÑнежнÑ'.split('_') - }, - - nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? - 'accusative' : - 'nominative'; - - return months[nounCase][m.month()]; - } - - function weekdaysCaseReplace(m, format) { - var weekdays = { - 'nominative': 'нÑдзелÑ_панÑдзелак_аўторак_Ñерада_чацвер_пÑтніца_Ñубота'.split('_'), - 'accusative': 'нÑдзелю_панÑдзелак_аўторак_Ñераду_чацвер_пÑтніцу_Ñуботу'.split('_') - }, - - nounCase = (/\[ ?[Вв] ?(?:мінулую|наÑтупную)? ?\] ?dddd/).test(format) ? - 'accusative' : - 'nominative'; - - return weekdays[nounCase][m.day()]; - } - - return moment.defineLocale('be', { - months : monthsCaseReplace, - monthsShort : 'Ñтуд_лют_Ñак_краÑ_трав_чÑрв_ліп_жнів_вер_каÑÑ‚_ліÑÑ‚_Ñнеж'.split('_'), - weekdays : weekdaysCaseReplace, - weekdaysShort : 'нд_пн_ат_ÑÑ€_чц_пт_Ñб'.split('_'), - weekdaysMin : 'нд_пн_ат_ÑÑ€_чц_пт_Ñб'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY г.', - LLL : 'D MMMM YYYY г., LT', - LLLL : 'dddd, D MMMM YYYY г., LT' - }, - calendar : { - sameDay: '[Ð¡Ñ‘Ð½Ð½Ñ Ñž] LT', - nextDay: '[Заўтра Ñž] LT', - lastDay: '[Учора Ñž] LT', - nextWeek: function () { - return '[У] dddd [Ñž] LT'; - }, - lastWeek: function () { - switch (this.day()) { - case 0: - case 3: - case 5: - case 6: - return '[У мінулую] dddd [Ñž] LT'; - case 1: - case 2: - case 4: - return '[У мінулы] dddd [Ñž] LT'; - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'праз %s', - past : '%s таму', - s : 'некалькі Ñекунд', - m : relativeTimeWithPlural, - mm : relativeTimeWithPlural, - h : relativeTimeWithPlural, - hh : relativeTimeWithPlural, - d : 'дзень', - dd : relativeTimeWithPlural, - M : 'меÑÑц', - MM : relativeTimeWithPlural, - y : 'год', - yy : relativeTimeWithPlural - }, - meridiemParse: /ночы|раніцы|днÑ|вечара/, - isPM : function (input) { - return /^(днÑ|вечара)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'ночы'; - } else if (hour < 12) { - return 'раніцы'; - } else if (hour < 17) { - return 'днÑ'; - } else { - return 'вечара'; - } - }, - - ordinalParse: /\d{1,2}-(Ñ–|Ñ‹|га)/, - ordinal: function (number, period) { - switch (period) { - case 'M': - case 'd': - case 'DDD': - case 'w': - case 'W': - return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-Ñ–' : number + '-Ñ‹'; - case 'D': - return number + '-га'; - default: - return number; - } - }, - - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : bulgarian (bg) -// author : Krasen Borisov : https://github.com/kraz - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('bg', { - months : 'Ñнуари_февруари_март_април_май_юни_юли_авгуÑÑ‚_Ñептември_октомври_ноември_декември'.split('_'), - monthsShort : 'Ñнр_фев_мар_апр_май_юни_юли_авг_Ñеп_окт_ное_дек'.split('_'), - weekdays : 'неделÑ_понеделник_вторник_ÑÑ€Ñда_четвъртък_петък_Ñъбота'.split('_'), - weekdaysShort : 'нед_пон_вто_ÑÑ€Ñ_чет_пет_Ñъб'.split('_'), - weekdaysMin : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'D.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay : '[Ð”Ð½ÐµÑ Ð²] LT', - nextDay : '[Утре в] LT', - nextWeek : 'dddd [в] LT', - lastDay : '[Вчера в] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - case 6: - return '[Ð’ изминалата] dddd [в] LT'; - case 1: - case 2: - case 4: - case 5: - return '[Ð’ изминалиÑ] dddd [в] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'Ñлед %s', - past : 'преди %s', - s : 'нÑколко Ñекунди', - m : 'минута', - mm : '%d минути', - h : 'чаÑ', - hh : '%d чаÑа', - d : 'ден', - dd : '%d дни', - M : 'меÑец', - MM : '%d меÑеца', - y : 'година', - yy : '%d години' - }, - ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, - ordinal : function (number) { - var lastDigit = number % 10, - last2Digits = number % 100; - if (number === 0) { - return number + '-ев'; - } else if (last2Digits === 0) { - return number + '-ен'; - } else if (last2Digits > 10 && last2Digits < 20) { - return number + '-ти'; - } else if (lastDigit === 1) { - return number + '-ви'; - } else if (lastDigit === 2) { - return number + '-ри'; - } else if (lastDigit === 7 || lastDigit === 8) { - return number + '-ми'; - } else { - return number + '-ти'; - } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : Bengali (bn) -// author : Kaushik Gandhi : https://github.com/kaushikgandhi - -(function (factory) { - factory(moment); -}(function (moment) { - var symbolMap = { - '1': '১', - '2': '২', - '3': '৩', - '4': '৪', - '5': '৫', - '6': '৬', - '7': '৭', - '8': '৮', - '9': '৯', - '0': '০' - }, - numberMap = { - '১': '1', - '২': '2', - '৩': '3', - '৪': '4', - '৫': '5', - '৬': '6', - '৭': '7', - '৮': '8', - '৯': '9', - '০': '0' - }; - - return moment.defineLocale('bn', { - months : 'জানà§à§Ÿà¦¾à¦°à§€_ফেবà§à§Ÿà¦¾à¦°à§€_মারà§à¦š_à¦à¦ªà§à¦°à¦¿à¦²_মে_জà§à¦¨_জà§à¦²à¦¾à¦‡_অগাসà§à¦Ÿ_সেপà§à¦Ÿà§‡à¦®à§à¦¬à¦°_অকà§à¦Ÿà§‹à¦¬à¦°_নভেমà§à¦¬à¦°_ডিসেমà§à¦¬à¦°'.split('_'), - monthsShort : 'জানà§_ফেব_মারà§à¦š_à¦à¦ªà¦°_মে_জà§à¦¨_জà§à¦²_অগ_সেপà§à¦Ÿ_অকà§à¦Ÿà§‹_নভ_ডিসেমà§'.split('_'), - weekdays : 'রবিবার_সোমবার_মঙà§à¦—লবার_বà§à¦§à¦¬à¦¾à¦°_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿à¦¬à¦¾à¦°_শà§à¦•à§à¦°à§à¦¬à¦¾à¦°_শনিবার'.split('_'), - weekdaysShort : 'রবি_সোম_মঙà§à¦—ল_বà§à¦§_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿_শà§à¦•à§à¦°à§_শনি'.split('_'), - weekdaysMin : 'রব_সম_মঙà§à¦—_বà§_বà§à¦°à¦¿à¦¹_শà§_শনি'.split('_'), - longDateFormat : { - LT : 'A h:mm সময়', - LTS : 'A h:mm:ss সময়', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, LT', - LLLL : 'dddd, D MMMM YYYY, LT' - }, - calendar : { - sameDay : '[আজ] LT', - nextDay : '[আগামীকাল] LT', - nextWeek : 'dddd, LT', - lastDay : '[গতকাল] LT', - lastWeek : '[গত] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s পরে', - past : '%s আগে', - s : 'কà¦à¦• সেকেনà§à¦¡', - m : 'à¦à¦• মিনিট', - mm : '%d মিনিট', - h : 'à¦à¦• ঘনà§à¦Ÿà¦¾', - hh : '%d ঘনà§à¦Ÿà¦¾', - d : 'à¦à¦• দিন', - dd : '%d দিন', - M : 'à¦à¦• মাস', - MM : '%d মাস', - y : 'à¦à¦• বছর', - yy : '%d বছর' - }, - preparse: function (string) { - return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - meridiemParse: /রাত|শকাল|দà§à¦ªà§à¦°|বিকেল|রাত/, - isPM: function (input) { - return /^(দà§à¦ªà§à¦°|বিকেল|রাত)$/.test(input); - }, - //Bengali is a vast language its spoken - //in different forms in various parts of the world. - //I have just generalized with most common one used - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'রাত'; - } else if (hour < 10) { - return 'শকাল'; - } else if (hour < 17) { - return 'দà§à¦ªà§à¦°'; - } else if (hour < 20) { - return 'বিকেল'; - } else { - return 'রাত'; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : tibetan (bo) -// author : Thupten N. Chakrishar : https://github.com/vajradog - -(function (factory) { - factory(moment); -}(function (moment) { - var symbolMap = { - '1': '༡', - '2': '༢', - '3': '༣', - '4': '༤', - '5': '༥', - '6': '༦', - '7': '༧', - '8': '༨', - '9': '༩', - '0': '༠' - }, - numberMap = { - '༡': '1', - '༢': '2', - '༣': '3', - '༤': '4', - '༥': '5', - '༦': '6', - '༧': '7', - '༨': '8', - '༩': '9', - '༠': '0' - }; - - return moment.defineLocale('bo', { - months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), - monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), - weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'), - weekdaysShort : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), - weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), - longDateFormat : { - LT : 'A h:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, LT', - LLLL : 'dddd, D MMMM YYYY, LT' - }, - calendar : { - sameDay : '[དི་རིང] LT', - nextDay : '[སང་ཉིན] LT', - nextWeek : '[བདུན་ཕྲག་རྗེས་མ], LT', - lastDay : '[à½à¼‹à½¦à½„] LT', - lastWeek : '[བདུན་ཕྲག་མà½à½ à¼‹à½˜] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s ལ་', - past : '%s སྔན་ལ', - s : 'ལམ་སང', - m : 'སà¾à½¢à¼‹à½˜à¼‹à½‚ཅིག', - mm : '%d སà¾à½¢à¼‹à½˜', - h : 'ཆུ་ཚོད་གཅིག', - hh : '%d ཆུ་ཚོད', - d : 'ཉིན་གཅིག', - dd : '%d ཉིན་', - M : 'ཟླ་བ་གཅིག', - MM : '%d ཟླ་བ', - y : 'ལོ་གཅིག', - yy : '%d ལོ' - }, - preparse: function (string) { - return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/, - isPM: function (input) { - return /^(ཉིན་གུང|དགོང་དག|མཚན་མོ)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'མཚན་མོ'; - } else if (hour < 10) { - return 'ཞོགས་ཀས'; - } else if (hour < 17) { - return 'ཉིན་གུང'; - } else if (hour < 20) { - return 'དགོང་དག'; - } else { - return 'མཚན་མོ'; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : breton (br) -// author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou - -(function (factory) { - factory(moment); -}(function (moment) { - function relativeTimeWithMutation(number, withoutSuffix, key) { - var format = { - 'mm': 'munutenn', - 'MM': 'miz', - 'dd': 'devezh' - }; - return number + ' ' + mutation(format[key], number); - } - - function specialMutationForYears(number) { - switch (lastNumber(number)) { - case 1: - case 3: - case 4: - case 5: - case 9: - return number + ' bloaz'; - default: - return number + ' vloaz'; - } - } - - function lastNumber(number) { - if (number > 9) { - return lastNumber(number % 10); - } - return number; - } - - function mutation(text, number) { - if (number === 2) { - return softMutation(text); - } - return text; - } - - function softMutation(text) { - var mutationTable = { - 'm': 'v', - 'b': 'v', - 'd': 'z' - }; - if (mutationTable[text.charAt(0)] === undefined) { - return text; - } - return mutationTable[text.charAt(0)] + text.substring(1); - } - - return moment.defineLocale('br', { - months : 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'), - monthsShort : 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'), - weekdays : 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'), - weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'), - weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'), - longDateFormat : { - LT : 'h[e]mm A', - LTS : 'h[e]mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D [a viz] MMMM YYYY', - LLL : 'D [a viz] MMMM YYYY LT', - LLLL : 'dddd, D [a viz] MMMM YYYY LT' - }, - calendar : { - sameDay : '[Hiziv da] LT', - nextDay : '[Warc\'hoazh da] LT', - nextWeek : 'dddd [da] LT', - lastDay : '[Dec\'h da] LT', - lastWeek : 'dddd [paset da] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'a-benn %s', - past : '%s \'zo', - s : 'un nebeud segondennoù', - m : 'ur vunutenn', - mm : relativeTimeWithMutation, - h : 'un eur', - hh : '%d eur', - d : 'un devezh', - dd : relativeTimeWithMutation, - M : 'ur miz', - MM : relativeTimeWithMutation, - y : 'ur bloaz', - yy : specialMutationForYears - }, - ordinalParse: /\d{1,2}(añ|vet)/, - ordinal : function (number) { - var output = (number === 1) ? 'añ' : 'vet'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : bosnian (bs) -// author : Nedim Cholich : https://github.com/frontyard -// based on (hr) translation by Bojan Marković - -(function (factory) { - factory(moment); -}(function (moment) { - function translate(number, withoutSuffix, key) { - var result = number + ' '; - switch (key) { - case 'm': - return withoutSuffix ? 'jedna minuta' : 'jedne minute'; - case 'mm': - if (number === 1) { - result += 'minuta'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'minute'; - } else { - result += 'minuta'; - } - return result; - case 'h': - return withoutSuffix ? 'jedan sat' : 'jednog sata'; - case 'hh': - if (number === 1) { - result += 'sat'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'sata'; - } else { - result += 'sati'; - } - return result; - case 'dd': - if (number === 1) { - result += 'dan'; - } else { - result += 'dana'; - } - return result; - case 'MM': - if (number === 1) { - result += 'mjesec'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'mjeseca'; - } else { - result += 'mjeseci'; - } - return result; - case 'yy': - if (number === 1) { - result += 'godina'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'godine'; - } else { - result += 'godina'; - } - return result; - } - } - - return moment.defineLocale('bs', { - months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'), - monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'), - weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota'.split('_'), - weekdaysShort : 'ned._pon._uto._sri._Äet._pet._sub.'.split('_'), - weekdaysMin : 'ne_po_ut_sr_Äe_pe_su'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'DD. MM. YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY LT', - LLLL : 'dddd, D. MMMM YYYY LT' - }, - calendar : { - sameDay : '[danas u] LT', - nextDay : '[sutra u] LT', - - nextWeek : function () { - switch (this.day()) { - case 0: - return '[u] [nedjelju] [u] LT'; - case 3: - return '[u] [srijedu] [u] LT'; - case 6: - return '[u] [subotu] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[u] dddd [u] LT'; - } - }, - lastDay : '[juÄer u] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - return '[proÅ¡lu] dddd [u] LT'; - case 6: - return '[proÅ¡le] [subote] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[proÅ¡li] dddd [u] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'za %s', - past : 'prije %s', - s : 'par sekundi', - m : translate, - mm : translate, - h : translate, - hh : translate, - d : 'dan', - dd : translate, - M : 'mjesec', - MM : translate, - y : 'godinu', - yy : translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : catalan (ca) -// author : Juan G. Hurtado : https://github.com/juanghurtado - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('ca', { - months : 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'), - monthsShort : 'gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.'.split('_'), - weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'), - weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'), - weekdaysMin : 'Dg_Dl_Dt_Dc_Dj_Dv_Ds'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay : function () { - return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - nextDay : function () { - return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - nextWeek : function () { - return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - lastDay : function () { - return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - lastWeek : function () { - return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'en %s', - past : 'fa %s', - s : 'uns segons', - m : 'un minut', - mm : '%d minuts', - h : 'una hora', - hh : '%d hores', - d : 'un dia', - dd : '%d dies', - M : 'un mes', - MM : '%d mesos', - y : 'un any', - yy : '%d anys' - }, - ordinalParse: /\d{1,2}(r|n|t|è|a)/, - ordinal : function (number, period) { - var output = (number === 1) ? 'r' : - (number === 2) ? 'n' : - (number === 3) ? 'r' : - (number === 4) ? 't' : 'è'; - if (period === 'w' || period === 'W') { - output = 'a'; - } - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : czech (cs) -// author : petrbela : https://github.com/petrbela - -(function (factory) { - factory(moment); -}(function (moment) { - var months = 'leden_únor_bÅ™ezen_duben_kvÄ›ten_Äerven_Äervenec_srpen_září_říjen_listopad_prosinec'.split('_'), - monthsShort = 'led_úno_bÅ™e_dub_kvÄ›_Ävn_Ävc_srp_zář_říj_lis_pro'.split('_'); - - function plural(n) { - return (n > 1) && (n < 5) && (~~(n / 10) !== 1); - } - - function translate(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - switch (key) { - case 's': // a few seconds / in a few seconds / a few seconds ago - return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami'; - case 'm': // a minute / in a minute / a minute ago - return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou'); - case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'minuty' : 'minut'); - } else { - return result + 'minutami'; - } - break; - case 'h': // an hour / in an hour / an hour ago - return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); - case 'hh': // 9 hours / in 9 hours / 9 hours ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'hodiny' : 'hodin'); - } else { - return result + 'hodinami'; - } - break; - case 'd': // a day / in a day / a day ago - return (withoutSuffix || isFuture) ? 'den' : 'dnem'; - case 'dd': // 9 days / in 9 days / 9 days ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'dny' : 'dní'); - } else { - return result + 'dny'; - } - break; - case 'M': // a month / in a month / a month ago - return (withoutSuffix || isFuture) ? 'mÄ›síc' : 'mÄ›sícem'; - case 'MM': // 9 months / in 9 months / 9 months ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'mÄ›síce' : 'mÄ›síců'); - } else { - return result + 'mÄ›síci'; - } - break; - case 'y': // a year / in a year / a year ago - return (withoutSuffix || isFuture) ? 'rok' : 'rokem'; - case 'yy': // 9 years / in 9 years / 9 years ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'roky' : 'let'); - } else { - return result + 'lety'; - } - break; - } - } - - return moment.defineLocale('cs', { - months : months, - monthsShort : monthsShort, - monthsParse : (function (months, monthsShort) { - var i, _monthsParse = []; - for (i = 0; i < 12; i++) { - // use custom parser to solve problem with July (Äervenec) - _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); - } - return _monthsParse; - }(months, monthsShort)), - weekdays : 'nedÄ›le_pondÄ›lí_úterý_stÅ™eda_Ätvrtek_pátek_sobota'.split('_'), - weekdaysShort : 'ne_po_út_st_Ät_pá_so'.split('_'), - weekdaysMin : 'ne_po_út_st_Ät_pá_so'.split('_'), - longDateFormat : { - LT: 'H:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY LT', - LLLL : 'dddd D. MMMM YYYY LT' - }, - calendar : { - sameDay: '[dnes v] LT', - nextDay: '[zítra v] LT', - nextWeek: function () { - switch (this.day()) { - case 0: - return '[v nedÄ›li v] LT'; - case 1: - case 2: - return '[v] dddd [v] LT'; - case 3: - return '[ve stÅ™edu v] LT'; - case 4: - return '[ve Ätvrtek v] LT'; - case 5: - return '[v pátek v] LT'; - case 6: - return '[v sobotu v] LT'; - } - }, - lastDay: '[vÄera v] LT', - lastWeek: function () { - switch (this.day()) { - case 0: - return '[minulou nedÄ›li v] LT'; - case 1: - case 2: - return '[minulé] dddd [v] LT'; - case 3: - return '[minulou stÅ™edu v] LT'; - case 4: - case 5: - return '[minulý] dddd [v] LT'; - case 6: - return '[minulou sobotu v] LT'; - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'za %s', - past : 'pÅ™ed %s', - s : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate - }, - ordinalParse : /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : chuvash (cv) -// author : Anatoly Mironov : https://github.com/mirontoli - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('cv', { - months : 'кăрлач_нарăÑ_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав'.split('_'), - monthsShort : 'кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш'.split('_'), - weekdays : 'вырÑарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_Ñрнекун_шăматкун'.split('_'), - weekdaysShort : 'выр_тун_ытл_юн_кĕç_Ñрн_шăм'.split('_'), - weekdaysMin : 'вр_тн_Ñ‹Ñ‚_юн_кç_ÑÑ€_шм'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD-MM-YYYY', - LL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]', - LLL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT', - LLLL : 'dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT' - }, - calendar : { - sameDay: '[ПаÑн] LT [Ñехетре]', - nextDay: '[Ыран] LT [Ñехетре]', - lastDay: '[Ĕнер] LT [Ñехетре]', - nextWeek: '[ÇитеÑ] dddd LT [Ñехетре]', - lastWeek: '[Иртнĕ] dddd LT [Ñехетре]', - sameElse: 'L' - }, - relativeTime : { - future : function (output) { - var affix = /Ñехет$/i.exec(output) ? 'рен' : /çул$/i.exec(output) ? 'тан' : 'ран'; - return output + affix; - }, - past : '%s каÑлла', - s : 'пĕр-ик çеккунт', - m : 'пĕр минут', - mm : '%d минут', - h : 'пĕр Ñехет', - hh : '%d Ñехет', - d : 'пĕр кун', - dd : '%d кун', - M : 'пĕр уйăх', - MM : '%d уйăх', - y : 'пĕр çул', - yy : '%d çул' - }, - ordinalParse: /\d{1,2}-мĕш/, - ordinal : '%d-мĕш', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : Welsh (cy) -// author : Robert Allen - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('cy', { - months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'), - monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'), - weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'), - weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'), - weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'), - // time formats are the same as en-gb - longDateFormat: { - LT: 'HH:mm', - LTS : 'LT:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY LT', - LLLL: 'dddd, D MMMM YYYY LT' - }, - calendar: { - sameDay: '[Heddiw am] LT', - nextDay: '[Yfory am] LT', - nextWeek: 'dddd [am] LT', - lastDay: '[Ddoe am] LT', - lastWeek: 'dddd [diwethaf am] LT', - sameElse: 'L' - }, - relativeTime: { - future: 'mewn %s', - past: '%s yn ôl', - s: 'ychydig eiliadau', - m: 'munud', - mm: '%d munud', - h: 'awr', - hh: '%d awr', - d: 'diwrnod', - dd: '%d diwrnod', - M: 'mis', - MM: '%d mis', - y: 'blwyddyn', - yy: '%d flynedd' - }, - ordinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/, - // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh - ordinal: function (number) { - var b = number, - output = '', - lookup = [ - '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed - 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed - ]; - - if (b > 20) { - if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) { - output = 'fed'; // not 30ain, 70ain or 90ain - } else { - output = 'ain'; - } - } else if (b > 0) { - output = lookup[b]; - } - - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : danish (da) -// author : Ulrik Nielsen : https://github.com/mrbase - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('da', { - months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'), - monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), - weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), - weekdaysShort : 'søn_man_tir_ons_tor_fre_lør'.split('_'), - weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY LT', - LLLL : 'dddd [d.] D. MMMM YYYY LT' - }, - calendar : { - sameDay : '[I dag kl.] LT', - nextDay : '[I morgen kl.] LT', - nextWeek : 'dddd [kl.] LT', - lastDay : '[I gÃ¥r kl.] LT', - lastWeek : '[sidste] dddd [kl] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'om %s', - past : '%s siden', - s : 'fÃ¥ sekunder', - m : 'et minut', - mm : '%d minutter', - h : 'en time', - hh : '%d timer', - d : 'en dag', - dd : '%d dage', - M : 'en mÃ¥ned', - MM : '%d mÃ¥neder', - y : 'et Ã¥r', - yy : '%d Ã¥r' - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : austrian german (de-at) -// author : lluchs : https://github.com/lluchs -// author: Menelion Elensúle: https://github.com/Oire -// author : Martin Groller : https://github.com/MadMG - -(function (factory) { - factory(moment); -}(function (moment) { - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 'm': ['eine Minute', 'einer Minute'], - 'h': ['eine Stunde', 'einer Stunde'], - 'd': ['ein Tag', 'einem Tag'], - 'dd': [number + ' Tage', number + ' Tagen'], - 'M': ['ein Monat', 'einem Monat'], - 'MM': [number + ' Monate', number + ' Monaten'], - 'y': ['ein Jahr', 'einem Jahr'], - 'yy': [number + ' Jahre', number + ' Jahren'] - }; - return withoutSuffix ? format[key][0] : format[key][1]; - } - - return moment.defineLocale('de-at', { - months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), - monthsShort : 'Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), - weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), - weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), - weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), - longDateFormat : { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY LT', - LLLL : 'dddd, D. MMMM YYYY LT' - }, - calendar : { - sameDay: '[Heute um] LT [Uhr]', - sameElse: 'L', - nextDay: '[Morgen um] LT [Uhr]', - nextWeek: 'dddd [um] LT [Uhr]', - lastDay: '[Gestern um] LT [Uhr]', - lastWeek: '[letzten] dddd [um] LT [Uhr]' - }, - relativeTime : { - future : 'in %s', - past : 'vor %s', - s : 'ein paar Sekunden', - m : processRelativeTime, - mm : '%d Minuten', - h : processRelativeTime, - hh : '%d Stunden', - d : processRelativeTime, - dd : processRelativeTime, - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : german (de) -// author : lluchs : https://github.com/lluchs -// author: Menelion Elensúle: https://github.com/Oire - -(function (factory) { - factory(moment); -}(function (moment) { - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 'm': ['eine Minute', 'einer Minute'], - 'h': ['eine Stunde', 'einer Stunde'], - 'd': ['ein Tag', 'einem Tag'], - 'dd': [number + ' Tage', number + ' Tagen'], - 'M': ['ein Monat', 'einem Monat'], - 'MM': [number + ' Monate', number + ' Monaten'], - 'y': ['ein Jahr', 'einem Jahr'], - 'yy': [number + ' Jahre', number + ' Jahren'] - }; - return withoutSuffix ? format[key][0] : format[key][1]; - } - - return moment.defineLocale('de', { - months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), - monthsShort : 'Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), - weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), - weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), - weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), - longDateFormat : { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY LT', - LLLL : 'dddd, D. MMMM YYYY LT' - }, - calendar : { - sameDay: '[Heute um] LT [Uhr]', - sameElse: 'L', - nextDay: '[Morgen um] LT [Uhr]', - nextWeek: 'dddd [um] LT [Uhr]', - lastDay: '[Gestern um] LT [Uhr]', - lastWeek: '[letzten] dddd [um] LT [Uhr]' - }, - relativeTime : { - future : 'in %s', - past : 'vor %s', - s : 'ein paar Sekunden', - m : processRelativeTime, - mm : '%d Minuten', - h : processRelativeTime, - hh : '%d Stunden', - d : processRelativeTime, - dd : processRelativeTime, - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : modern greek (el) -// author : Aggelos Karalias : https://github.com/mehiel - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('el', { - monthsNominativeEl : 'ΙανουάÏιος_ΦεβÏουάÏιος_ΜάÏτιος_ΑπÏίλιος_Μάιος_ΙοÏνιος_ΙοÏλιος_ΑÏγουστος_ΣεπτέμβÏιος_ΟκτώβÏιος_ÎοέμβÏιος_ΔεκέμβÏιος'.split('_'), - monthsGenitiveEl : 'ΙανουαÏίου_ΦεβÏουαÏίου_ΜαÏτίου_ΑπÏιλίου_ΜαÎου_Ιουνίου_Ιουλίου_ΑυγοÏστου_ΣεπτεμβÏίου_ΟκτωβÏίου_ÎοεμβÏίου_ΔεκεμβÏίου'.split('_'), - months : function (momentToFormat, format) { - if (/D/.test(format.substring(0, format.indexOf('MMMM')))) { // if there is a day number before 'MMMM' - return this._monthsGenitiveEl[momentToFormat.month()]; - } else { - return this._monthsNominativeEl[momentToFormat.month()]; - } - }, - monthsShort : 'Ιαν_Φεβ_ΜαÏ_ΑπÏ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Îοε_Δεκ'.split('_'), - weekdays : 'ΚυÏιακή_ΔευτέÏα_ΤÏίτη_ΤετάÏτη_Πέμπτη_ΠαÏασκευή_Σάββατο'.split('_'), - weekdaysShort : 'ΚυÏ_Δευ_ΤÏι_Τετ_Πεμ_ΠαÏ_Σαβ'.split('_'), - weekdaysMin : 'Κυ_Δε_ΤÏ_Τε_Πε_Πα_Σα'.split('_'), - meridiem : function (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'μμ' : 'ΜΜ'; - } else { - return isLower ? 'πμ' : 'ΠΜ'; - } - }, - isPM : function (input) { - return ((input + '').toLowerCase()[0] === 'μ'); - }, - meridiemParse : /[ΠΜ]\.?Îœ?\.?/i, - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendarEl : { - sameDay : '[ΣήμεÏα {}] LT', - nextDay : '[ΑÏÏιο {}] LT', - nextWeek : 'dddd [{}] LT', - lastDay : '[Χθες {}] LT', - lastWeek : function () { - switch (this.day()) { - case 6: - return '[το Ï€ÏοηγοÏμενο] dddd [{}] LT'; - default: - return '[την Ï€ÏοηγοÏμενη] dddd [{}] LT'; - } - }, - sameElse : 'L' - }, - calendar : function (key, mom) { - var output = this._calendarEl[key], - hours = mom && mom.hours(); - - if (typeof output === 'function') { - output = output.apply(mom); - } - - return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις')); - }, - relativeTime : { - future : 'σε %s', - past : '%s Ï€Ïιν', - s : 'λίγα δευτεÏόλεπτα', - m : 'ένα λεπτό', - mm : '%d λεπτά', - h : 'μία ÏŽÏα', - hh : '%d ÏŽÏες', - d : 'μία μέÏα', - dd : '%d μέÏες', - M : 'ένας μήνας', - MM : '%d μήνες', - y : 'ένας χÏόνος', - yy : '%d χÏόνια' - }, - ordinalParse: /\d{1,2}η/, - ordinal: '%dη', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : australian english (en-au) - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('en-au', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' - }, - 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' - }, - ordinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : canadian english (en-ca) -// author : Jonathan Abourbih : https://github.com/jonbca - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('en-ca', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'YYYY-MM-DD', - LL : 'D MMMM, YYYY', - LLL : 'D MMMM, YYYY LT', - LLLL : 'dddd, D MMMM, YYYY LT' - }, - calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' - }, - 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' - }, - ordinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - } - }); -})); -// moment.js locale configuration -// locale : great britain english (en-gb) -// author : Chris Gedrim : https://github.com/chrisgedrim - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('en-gb', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' - }, - 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' - }, - ordinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : esperanto (eo) -// author : Colin Dean : https://github.com/colindean -// komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko. -// Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni! - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('eo', { - months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aÅ­gusto_septembro_oktobro_novembro_decembro'.split('_'), - monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aÅ­g_sep_okt_nov_dec'.split('_'), - weekdays : 'Dimanĉo_Lundo_Mardo_Merkredo_Ä´aÅ­do_Vendredo_Sabato'.split('_'), - weekdaysShort : 'Dim_Lun_Mard_Merk_Ä´aÅ­_Ven_Sab'.split('_'), - weekdaysMin : 'Di_Lu_Ma_Me_Ä´a_Ve_Sa'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'YYYY-MM-DD', - LL : 'D[-an de] MMMM, YYYY', - LLL : 'D[-an de] MMMM, YYYY LT', - LLLL : 'dddd, [la] D[-an de] MMMM, YYYY LT' - }, - meridiemParse: /[ap]\.t\.m/i, - isPM: function (input) { - return input.charAt(0).toLowerCase() === 'p'; - }, - meridiem : function (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'p.t.m.' : 'P.T.M.'; - } else { - return isLower ? 'a.t.m.' : 'A.T.M.'; - } - }, - calendar : { - sameDay : '[HodiaÅ­ je] LT', - nextDay : '[MorgaÅ­ je] LT', - nextWeek : 'dddd [je] LT', - lastDay : '[HieraÅ­ je] LT', - lastWeek : '[pasinta] dddd [je] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'je %s', - past : 'antaÅ­ %s', - s : 'sekundoj', - m : 'minuto', - mm : '%d minutoj', - h : 'horo', - hh : '%d horoj', - d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo - dd : '%d tagoj', - M : 'monato', - MM : '%d monatoj', - y : 'jaro', - yy : '%d jaroj' - }, - ordinalParse: /\d{1,2}a/, - ordinal : '%da', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : spanish (es) -// author : Julio Napurí : https://github.com/julionc - -(function (factory) { - factory(moment); -}(function (moment) { - var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), - monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); - - return moment.defineLocale('es', { - months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), - monthsShort : function (m, format) { - if (/-MMM-/.test(format)) { - return monthsShort[m.month()]; - } else { - return monthsShortDot[m.month()]; - } - }, - weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), - weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), - weekdaysMin : 'Do_Lu_Ma_Mi_Ju_Vi_Sá'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY LT', - LLLL : 'dddd, D [de] MMMM [de] YYYY LT' - }, - calendar : { - sameDay : function () { - return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - nextDay : function () { - return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - nextWeek : function () { - return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - lastDay : function () { - return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - lastWeek : function () { - return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'en %s', - past : 'hace %s', - s : 'unos segundos', - m : 'un minuto', - mm : '%d minutos', - h : 'una hora', - hh : '%d horas', - d : 'un día', - dd : '%d días', - M : 'un mes', - MM : '%d meses', - y : 'un año', - yy : '%d años' - }, - ordinalParse : /\d{1,2}º/, - ordinal : '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : estonian (et) -// author : Henry Kehlmann : https://github.com/madhenry -// improvements : Illimar Tambek : https://github.com/ragulka - -(function (factory) { - factory(moment); -}(function (moment) { - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'], - 'm' : ['ühe minuti', 'üks minut'], - 'mm': [number + ' minuti', number + ' minutit'], - 'h' : ['ühe tunni', 'tund aega', 'üks tund'], - 'hh': [number + ' tunni', number + ' tundi'], - 'd' : ['ühe päeva', 'üks päev'], - 'M' : ['kuu aja', 'kuu aega', 'üks kuu'], - 'MM': [number + ' kuu', number + ' kuud'], - 'y' : ['ühe aasta', 'aasta', 'üks aasta'], - 'yy': [number + ' aasta', number + ' aastat'] - }; - if (withoutSuffix) { - return format[key][2] ? format[key][2] : format[key][1]; - } - return isFuture ? format[key][0] : format[key][1]; - } - - return moment.defineLocale('et', { - months : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'), - monthsShort : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'), - weekdays : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'), - weekdaysShort : 'P_E_T_K_N_R_L'.split('_'), - weekdaysMin : 'P_E_T_K_N_R_L'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY LT', - LLLL : 'dddd, D. MMMM YYYY LT' - }, - calendar : { - sameDay : '[Täna,] LT', - nextDay : '[Homme,] LT', - nextWeek : '[Järgmine] dddd LT', - lastDay : '[Eile,] LT', - lastWeek : '[Eelmine] dddd LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s pärast', - past : '%s tagasi', - s : processRelativeTime, - m : processRelativeTime, - mm : processRelativeTime, - h : processRelativeTime, - hh : processRelativeTime, - d : processRelativeTime, - dd : '%d päeva', - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : euskara (eu) -// author : Eneko Illarramendi : https://github.com/eillarra - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('eu', { - months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'), - monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'), - weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'), - weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'), - weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'YYYY-MM-DD', - LL : 'YYYY[ko] MMMM[ren] D[a]', - LLL : 'YYYY[ko] MMMM[ren] D[a] LT', - LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] LT', - l : 'YYYY-M-D', - ll : 'YYYY[ko] MMM D[a]', - lll : 'YYYY[ko] MMM D[a] LT', - llll : 'ddd, YYYY[ko] MMM D[a] LT' - }, - calendar : { - sameDay : '[gaur] LT[etan]', - nextDay : '[bihar] LT[etan]', - nextWeek : 'dddd LT[etan]', - lastDay : '[atzo] LT[etan]', - lastWeek : '[aurreko] dddd LT[etan]', - sameElse : 'L' - }, - relativeTime : { - future : '%s barru', - past : 'duela %s', - s : 'segundo batzuk', - m : 'minutu bat', - mm : '%d minutu', - h : 'ordu bat', - hh : '%d ordu', - d : 'egun bat', - dd : '%d egun', - M : 'hilabete bat', - MM : '%d hilabete', - y : 'urte bat', - yy : '%d urte' - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : Persian (fa) -// author : Ebrahim Byagowi : https://github.com/ebraminio - -(function (factory) { - factory(moment); -}(function (moment) { - var symbolMap = { - '1': 'Û±', - '2': 'Û²', - '3': 'Û³', - '4': 'Û´', - '5': 'Ûµ', - '6': 'Û¶', - '7': 'Û·', - '8': 'Û¸', - '9': 'Û¹', - '0': 'Û°' - }, numberMap = { - 'Û±': '1', - 'Û²': '2', - 'Û³': '3', - 'Û´': '4', - 'Ûµ': '5', - 'Û¶': '6', - 'Û·': '7', - 'Û¸': '8', - 'Û¹': '9', - 'Û°': '0' - }; - - return moment.defineLocale('fa', { - months : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), - monthsShort : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), - weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), - weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), - weekdaysMin : 'ÛŒ_د_س_Ú†_Ù¾_ج_Ø´'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - meridiemParse: /قبل از ظهر|بعد از ظهر/, - isPM: function (input) { - return /بعد از ظهر/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'قبل از ظهر'; - } else { - return 'بعد از ظهر'; - } - }, - calendar : { - sameDay : '[امروز ساعت] LT', - nextDay : '[Ùردا ساعت] LT', - nextWeek : 'dddd [ساعت] LT', - lastDay : '[دیروز ساعت] LT', - lastWeek : 'dddd [پیش] [ساعت] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'در %s', - past : '%s پیش', - s : 'چندین ثانیه', - m : 'یک دقیقه', - mm : '%d دقیقه', - h : 'یک ساعت', - hh : '%d ساعت', - d : 'یک روز', - dd : '%d روز', - M : 'یک ماه', - MM : '%d ماه', - y : 'یک سال', - yy : '%d سال' - }, - preparse: function (string) { - return string.replace(/[Û°-Û¹]/g, function (match) { - return numberMap[match]; - }).replace(/ØŒ/g, ','); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }).replace(/,/g, 'ØŒ'); - }, - ordinalParse: /\d{1,2}Ù…/, - ordinal : '%dÙ…', - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : finnish (fi) -// author : Tarmo Aidantausta : https://github.com/bleadof - -(function (factory) { - factory(moment); -}(function (moment) { - var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '), - numbersFuture = [ - 'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden', - numbersPast[7], numbersPast[8], numbersPast[9] - ]; - - function translate(number, withoutSuffix, key, isFuture) { - var result = ''; - switch (key) { - case 's': - return isFuture ? 'muutaman sekunnin' : 'muutama sekunti'; - case 'm': - return isFuture ? 'minuutin' : 'minuutti'; - case 'mm': - result = isFuture ? 'minuutin' : 'minuuttia'; - break; - case 'h': - return isFuture ? 'tunnin' : 'tunti'; - case 'hh': - result = isFuture ? 'tunnin' : 'tuntia'; - break; - case 'd': - return isFuture ? 'päivän' : 'päivä'; - case 'dd': - result = isFuture ? 'päivän' : 'päivää'; - break; - case 'M': - return isFuture ? 'kuukauden' : 'kuukausi'; - case 'MM': - result = isFuture ? 'kuukauden' : 'kuukautta'; - break; - case 'y': - return isFuture ? 'vuoden' : 'vuosi'; - case 'yy': - result = isFuture ? 'vuoden' : 'vuotta'; - break; - } - result = verbalNumber(number, isFuture) + ' ' + result; - return result; - } - - function verbalNumber(number, isFuture) { - return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number; - } - - return moment.defineLocale('fi', { - months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'), - monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'), - weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'), - weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'), - weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'), - longDateFormat : { - LT : 'HH.mm', - LTS : 'HH.mm.ss', - L : 'DD.MM.YYYY', - LL : 'Do MMMM[ta] YYYY', - LLL : 'Do MMMM[ta] YYYY, [klo] LT', - LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] LT', - l : 'D.M.YYYY', - ll : 'Do MMM YYYY', - lll : 'Do MMM YYYY, [klo] LT', - llll : 'ddd, Do MMM YYYY, [klo] LT' - }, - calendar : { - sameDay : '[tänään] [klo] LT', - nextDay : '[huomenna] [klo] LT', - nextWeek : 'dddd [klo] LT', - lastDay : '[eilen] [klo] LT', - lastWeek : '[viime] dddd[na] [klo] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s päästä', - past : '%s sitten', - s : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : faroese (fo) -// author : Ragnar Johannesen : https://github.com/ragnar123 - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('fo', { - months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'), - monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), - weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'), - weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'), - weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D. MMMM, YYYY LT' - }, - calendar : { - sameDay : '[à dag kl.] LT', - nextDay : '[à morgin kl.] LT', - nextWeek : 'dddd [kl.] LT', - lastDay : '[à gjár kl.] LT', - lastWeek : '[síðstu] dddd [kl] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'um %s', - past : '%s síðani', - s : 'fá sekund', - m : 'ein minutt', - mm : '%d minuttir', - h : 'ein tími', - hh : '%d tímar', - d : 'ein dagur', - dd : '%d dagar', - M : 'ein mánaði', - MM : '%d mánaðir', - y : 'eitt ár', - yy : '%d ár' - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : canadian french (fr-ca) -// author : Jonathan Abourbih : https://github.com/jonbca - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('fr-ca', { - months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), - monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), - weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), - weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), - weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'YYYY-MM-DD', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay: '[Aujourd\'hui à] LT', - nextDay: '[Demain à] LT', - nextWeek: 'dddd [à] LT', - lastDay: '[Hier à] LT', - lastWeek: 'dddd [dernier à] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'dans %s', - past : 'il y a %s', - s : 'quelques secondes', - m : 'une minute', - mm : '%d minutes', - h : 'une heure', - hh : '%d heures', - d : 'un jour', - dd : '%d jours', - M : 'un mois', - MM : '%d mois', - y : 'un an', - yy : '%d ans' - }, - ordinalParse: /\d{1,2}(er|)/, - ordinal : function (number) { - return number + (number === 1 ? 'er' : ''); - } - }); -})); -// moment.js locale configuration -// locale : french (fr) -// author : John Fischer : https://github.com/jfroffice - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('fr', { - months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), - monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), - weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), - weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), - weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay: '[Aujourd\'hui à] LT', - nextDay: '[Demain à] LT', - nextWeek: 'dddd [à] LT', - lastDay: '[Hier à] LT', - lastWeek: 'dddd [dernier à] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'dans %s', - past : 'il y a %s', - s : 'quelques secondes', - m : 'une minute', - mm : '%d minutes', - h : 'une heure', - hh : '%d heures', - d : 'un jour', - dd : '%d jours', - M : 'un mois', - MM : '%d mois', - y : 'un an', - yy : '%d ans' - }, - ordinalParse: /\d{1,2}(er|)/, - ordinal : function (number) { - return number + (number === 1 ? 'er' : ''); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : frisian (fy) -// author : Robin van der Vliet : https://github.com/robin0van0der0v - -(function (factory) { - factory(moment); -}(function (moment) { - var monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'), - monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'); - - return moment.defineLocale('fy', { - months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'), - monthsShort : function (m, format) { - if (/-MMM-/.test(format)) { - return monthsShortWithoutDots[m.month()]; - } else { - return monthsShortWithDots[m.month()]; - } - }, - weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'), - weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'), - weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD-MM-YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay: '[hjoed om] LT', - nextDay: '[moarn om] LT', - nextWeek: 'dddd [om] LT', - lastDay: '[juster om] LT', - lastWeek: '[ôfrûne] dddd [om] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'oer %s', - past : '%s lyn', - s : 'in pear sekonden', - m : 'ien minút', - mm : '%d minuten', - h : 'ien oere', - hh : '%d oeren', - d : 'ien dei', - dd : '%d dagen', - M : 'ien moanne', - MM : '%d moannen', - y : 'ien jier', - yy : '%d jierren' - }, - ordinalParse: /\d{1,2}(ste|de)/, - ordinal : function (number) { - return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : galician (gl) -// author : Juan G. Hurtado : https://github.com/juanghurtado - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('gl', { - months : 'Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro'.split('_'), - monthsShort : 'Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.'.split('_'), - weekdays : 'Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado'.split('_'), - weekdaysShort : 'Dom._Lun._Mar._Mér._Xov._Ven._Sáb.'.split('_'), - weekdaysMin : 'Do_Lu_Ma_Mé_Xo_Ve_Sá'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay : function () { - return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; - }, - nextDay : function () { - return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; - }, - nextWeek : function () { - return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; - }, - lastDay : function () { - return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT'; - }, - lastWeek : function () { - return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; - }, - sameElse : 'L' - }, - relativeTime : { - future : function (str) { - if (str === 'uns segundos') { - return 'nuns segundos'; - } - return 'en ' + str; - }, - past : 'hai %s', - s : 'uns segundos', - m : 'un minuto', - mm : '%d minutos', - h : 'unha hora', - hh : '%d horas', - d : 'un día', - dd : '%d días', - M : 'un mes', - MM : '%d meses', - y : 'un ano', - yy : '%d anos' - }, - ordinalParse : /\d{1,2}º/, - ordinal : '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : Hebrew (he) -// author : Tomer Cohen : https://github.com/tomer -// author : Moshe Simantov : https://github.com/DevelopmentIL -// author : Tal Ater : https://github.com/TalAter - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('he', { - months : 'ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר'.split('_'), - monthsShort : 'ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳'.split('_'), - weekdays : 'ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'), - weekdaysShort : '×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'), - weekdaysMin : '×_ב_×’_ד_×”_ו_ש'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D [ב]MMMM YYYY', - LLL : 'D [ב]MMMM YYYY LT', - LLLL : 'dddd, D [ב]MMMM YYYY LT', - l : 'D/M/YYYY', - ll : 'D MMM YYYY', - lll : 'D MMM YYYY LT', - llll : 'ddd, D MMM YYYY LT' - }, - calendar : { - sameDay : '[×”×™×•× ×‘Ö¾]LT', - nextDay : '[מחר ב־]LT', - nextWeek : 'dddd [בשעה] LT', - lastDay : '[×תמול ב־]LT', - lastWeek : '[ביו×] dddd [×”×חרון בשעה] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'בעוד %s', - past : 'לפני %s', - s : 'מספר שניות', - m : 'דקה', - mm : '%d דקות', - h : 'שעה', - hh : function (number) { - if (number === 2) { - return 'שעתיי×'; - } - return number + ' שעות'; - }, - d : 'יו×', - dd : function (number) { - if (number === 2) { - return 'יומיי×'; - } - return number + ' ימי×'; - }, - M : 'חודש', - MM : function (number) { - if (number === 2) { - return 'חודשיי×'; - } - return number + ' חודשי×'; - }, - y : 'שנה', - yy : function (number) { - if (number === 2) { - return 'שנתיי×'; - } else if (number % 10 === 0 && number !== 10) { - return number + ' שנה'; - } - return number + ' שני×'; - } - } - }); -})); -// moment.js locale configuration -// locale : hindi (hi) -// author : Mayank Singhal : https://github.com/mayanksinghal - -(function (factory) { - factory(moment); -}(function (moment) { - var symbolMap = { - '1': '१', - '2': '२', - '3': '३', - '4': '४', - '5': '५', - '6': '६', - '7': '७', - '8': '८', - '9': '९', - '0': '०' - }, - numberMap = { - '१': '1', - '२': '2', - '३': '3', - '४': '4', - '५': '5', - '६': '6', - '७': '7', - '८': '8', - '९': '9', - '०': '0' - }; - - return moment.defineLocale('hi', { - months : 'जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°'.split('_'), - monthsShort : 'जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.'.split('_'), - weekdays : 'रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split('_'), - weekdaysShort : 'रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split('_'), - weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split('_'), - longDateFormat : { - LT : 'A h:mm बजे', - LTS : 'A h:mm:ss बजे', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, LT', - LLLL : 'dddd, D MMMM YYYY, LT' - }, - calendar : { - sameDay : '[आज] LT', - nextDay : '[कल] LT', - nextWeek : 'dddd, LT', - lastDay : '[कल] LT', - lastWeek : '[पिछले] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s में', - past : '%s पहले', - s : 'कà¥à¤› ही कà¥à¤·à¤£', - m : 'à¤à¤• मिनट', - mm : '%d मिनट', - h : 'à¤à¤• घंटा', - hh : '%d घंटे', - d : 'à¤à¤• दिन', - dd : '%d दिन', - M : 'à¤à¤• महीने', - MM : '%d महीने', - y : 'à¤à¤• वरà¥à¤·', - yy : '%d वरà¥à¤·' - }, - preparse: function (string) { - return string.replace(/[१२३४५६७८९०]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - // Hindi notation for meridiems are quite fuzzy in practice. While there exists - // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi. - meridiemParse: /रात|सà¥à¤¬à¤¹|दोपहर|शाम/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'रात') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'सà¥à¤¬à¤¹') { - return hour; - } else if (meridiem === 'दोपहर') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'शाम') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'रात'; - } else if (hour < 10) { - return 'सà¥à¤¬à¤¹'; - } else if (hour < 17) { - return 'दोपहर'; - } else if (hour < 20) { - return 'शाम'; - } else { - return 'रात'; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : hrvatski (hr) -// author : Bojan Marković : https://github.com/bmarkovic - -// based on (sl) translation by Robert SedovÅ¡ek - -(function (factory) { - factory(moment); -}(function (moment) { - function translate(number, withoutSuffix, key) { - var result = number + ' '; - switch (key) { - case 'm': - return withoutSuffix ? 'jedna minuta' : 'jedne minute'; - case 'mm': - if (number === 1) { - result += 'minuta'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'minute'; - } else { - result += 'minuta'; - } - return result; - case 'h': - return withoutSuffix ? 'jedan sat' : 'jednog sata'; - case 'hh': - if (number === 1) { - result += 'sat'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'sata'; - } else { - result += 'sati'; - } - return result; - case 'dd': - if (number === 1) { - result += 'dan'; - } else { - result += 'dana'; - } - return result; - case 'MM': - if (number === 1) { - result += 'mjesec'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'mjeseca'; - } else { - result += 'mjeseci'; - } - return result; - case 'yy': - if (number === 1) { - result += 'godina'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'godine'; - } else { - result += 'godina'; - } - return result; - } - } - - return moment.defineLocale('hr', { - months : 'sjeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_'), - monthsShort : 'sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'), - weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota'.split('_'), - weekdaysShort : 'ned._pon._uto._sri._Äet._pet._sub.'.split('_'), - weekdaysMin : 'ne_po_ut_sr_Äe_pe_su'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'DD. MM. YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY LT', - LLLL : 'dddd, D. MMMM YYYY LT' - }, - calendar : { - sameDay : '[danas u] LT', - nextDay : '[sutra u] LT', - - nextWeek : function () { - switch (this.day()) { - case 0: - return '[u] [nedjelju] [u] LT'; - case 3: - return '[u] [srijedu] [u] LT'; - case 6: - return '[u] [subotu] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[u] dddd [u] LT'; - } - }, - lastDay : '[juÄer u] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - return '[proÅ¡lu] dddd [u] LT'; - case 6: - return '[proÅ¡le] [subote] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[proÅ¡li] dddd [u] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'za %s', - past : 'prije %s', - s : 'par sekundi', - m : translate, - mm : translate, - h : translate, - hh : translate, - d : 'dan', - dd : translate, - M : 'mjesec', - MM : translate, - y : 'godinu', - yy : translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : hungarian (hu) -// author : Adam Brunner : https://github.com/adambrunner - -(function (factory) { - factory(moment); -}(function (moment) { - var weekEndings = 'vasárnap hétfÅ‘n kedden szerdán csütörtökön pénteken szombaton'.split(' '); - - function translate(number, withoutSuffix, key, isFuture) { - var num = number, - suffix; - - switch (key) { - case 's': - return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce'; - case 'm': - return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce'); - case 'mm': - return num + (isFuture || withoutSuffix ? ' perc' : ' perce'); - case 'h': - return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája'); - case 'hh': - return num + (isFuture || withoutSuffix ? ' óra' : ' órája'); - case 'd': - return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja'); - case 'dd': - return num + (isFuture || withoutSuffix ? ' nap' : ' napja'); - case 'M': - return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); - case 'MM': - return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); - case 'y': - return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve'); - case 'yy': - return num + (isFuture || withoutSuffix ? ' év' : ' éve'); - } - - return ''; - } - - function week(isFuture) { - return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]'; - } - - return moment.defineLocale('hu', { - months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'), - monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'), - weekdays : 'vasárnap_hétfÅ‘_kedd_szerda_csütörtök_péntek_szombat'.split('_'), - weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'), - weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'YYYY.MM.DD.', - LL : 'YYYY. MMMM D.', - LLL : 'YYYY. MMMM D., LT', - LLLL : 'YYYY. MMMM D., dddd LT' - }, - meridiemParse: /de|du/i, - isPM: function (input) { - return input.charAt(1).toLowerCase() === 'u'; - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 12) { - return isLower === true ? 'de' : 'DE'; - } else { - return isLower === true ? 'du' : 'DU'; - } - }, - calendar : { - sameDay : '[ma] LT[-kor]', - nextDay : '[holnap] LT[-kor]', - nextWeek : function () { - return week.call(this, true); - }, - lastDay : '[tegnap] LT[-kor]', - lastWeek : function () { - return week.call(this, false); - }, - sameElse : 'L' - }, - relativeTime : { - future : '%s múlva', - past : '%s', - s : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : Armenian (hy-am) -// author : Armendarabyan : https://github.com/armendarabyan - -(function (factory) { - factory(moment); -}(function (moment) { - function monthsCaseReplace(m, format) { - var months = { - 'nominative': 'Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€_Õ´Õ¡Ö€Õ¿_Õ¡ÕºÖ€Õ«Õ¬_Õ´Õ¡ÕµÕ«Õ½_Õ°Õ¸Ö‚Õ¶Õ«Õ½_Õ°Õ¸Ö‚Õ¬Õ«Õ½_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€'.split('_'), - 'accusative': 'Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€Õ«_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€Õ«_Õ´Õ¡Ö€Õ¿Õ«_Õ¡ÕºÖ€Õ«Õ¬Õ«_Õ´Õ¡ÕµÕ«Õ½Õ«_Õ°Õ¸Ö‚Õ¶Õ«Õ½Õ«_Õ°Õ¸Ö‚Õ¬Õ«Õ½Õ«_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½Õ«_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«'.split('_') - }, - - nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? - 'accusative' : - 'nominative'; - - return months[nounCase][m.month()]; - } - - function monthsShortCaseReplace(m, format) { - var monthsShort = 'Õ°Õ¶Õ¾_ÖƒÕ¿Ö€_Õ´Ö€Õ¿_Õ¡ÕºÖ€_Õ´ÕµÕ½_Õ°Õ¶Õ½_Õ°Õ¬Õ½_Ö…Õ£Õ½_Õ½ÕºÕ¿_Õ°Õ¯Õ¿_Õ¶Õ´Õ¢_Õ¤Õ¯Õ¿'.split('_'); - - return monthsShort[m.month()]; - } - - function weekdaysCaseReplace(m, format) { - var weekdays = 'Õ¯Õ«Ö€Õ¡Õ¯Õ«_Õ¥Ö€Õ¯Õ¸Ö‚Õ·Õ¡Õ¢Õ©Õ«_Õ¥Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ¹Õ¸Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ°Õ«Õ¶Õ£Õ·Õ¡Õ¢Õ©Õ«_Õ¸Ö‚Ö€Õ¢Õ¡Õ©_Õ·Õ¡Õ¢Õ¡Õ©'.split('_'); - - return weekdays[m.day()]; - } - - return moment.defineLocale('hy-am', { - months : monthsCaseReplace, - monthsShort : monthsShortCaseReplace, - weekdays : weekdaysCaseReplace, - weekdaysShort : 'Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©'.split('_'), - weekdaysMin : 'Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY Õ©.', - LLL : 'D MMMM YYYY Õ©., LT', - LLLL : 'dddd, D MMMM YYYY Õ©., LT' - }, - calendar : { - sameDay: '[Õ¡ÕµÕ½Ö…Ö€] LT', - nextDay: '[Õ¾Õ¡Õ²Õ¨] LT', - lastDay: '[Õ¥Ö€Õ¥Õ¯] LT', - nextWeek: function () { - return 'dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT'; - }, - lastWeek: function () { - return '[Õ¡Õ¶ÖÕ¡Õ®] dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT'; - }, - sameElse: 'L' - }, - relativeTime : { - future : '%s Õ°Õ¥Õ¿Õ¸', - past : '%s Õ¡Õ¼Õ¡Õ»', - s : 'Õ´Õ« Ö„Õ¡Õ¶Õ« Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶', - m : 'Ö€Õ¸ÕºÕ¥', - mm : '%d Ö€Õ¸ÕºÕ¥', - h : 'ÕªÕ¡Õ´', - hh : '%d ÕªÕ¡Õ´', - d : 'Ö…Ö€', - dd : '%d Ö…Ö€', - M : 'Õ¡Õ´Õ«Õ½', - MM : '%d Õ¡Õ´Õ«Õ½', - y : 'Õ¿Õ¡Ö€Õ«', - yy : '%d Õ¿Õ¡Ö€Õ«' - }, - - meridiemParse: /Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡|Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡|ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶/, - isPM: function (input) { - return /^(ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶)$/.test(input); - }, - meridiem : function (hour) { - if (hour < 4) { - return 'Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡'; - } else if (hour < 12) { - return 'Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡'; - } else if (hour < 17) { - return 'ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡'; - } else { - return 'Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶'; - } - }, - - ordinalParse: /\d{1,2}|\d{1,2}-(Õ«Õ¶|Ö€Õ¤)/, - ordinal: function (number, period) { - switch (period) { - case 'DDD': - case 'w': - case 'W': - case 'DDDo': - if (number === 1) { - return number + '-Õ«Õ¶'; - } - return number + '-Ö€Õ¤'; - default: - return number; - } - }, - - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : Bahasa Indonesia (id) -// author : Mohammad Satrio Utomo : https://github.com/tyok -// reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('id', { - months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des'.split('_'), - weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'), - weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'), - weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'), - longDateFormat : { - LT : 'HH.mm', - LTS : 'LT.ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY [pukul] LT', - LLLL : 'dddd, D MMMM YYYY [pukul] LT' - }, - meridiemParse: /pagi|siang|sore|malam/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'pagi') { - return hour; - } else if (meridiem === 'siang') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === 'sore' || meridiem === 'malam') { - return hour + 12; - } - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 11) { - return 'pagi'; - } else if (hours < 15) { - return 'siang'; - } else if (hours < 19) { - return 'sore'; - } else { - return 'malam'; - } - }, - calendar : { - sameDay : '[Hari ini pukul] LT', - nextDay : '[Besok pukul] LT', - nextWeek : 'dddd [pukul] LT', - lastDay : '[Kemarin pukul] LT', - lastWeek : 'dddd [lalu pukul] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'dalam %s', - past : '%s yang lalu', - s : 'beberapa detik', - m : 'semenit', - mm : '%d menit', - h : 'sejam', - hh : '%d jam', - d : 'sehari', - dd : '%d hari', - M : 'sebulan', - MM : '%d bulan', - y : 'setahun', - yy : '%d tahun' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : icelandic (is) -// author : Hinrik Örn Sigurðsson : https://github.com/hinrik - -(function (factory) { - factory(moment); -}(function (moment) { - function plural(n) { - if (n % 100 === 11) { - return true; - } else if (n % 10 === 1) { - return false; - } - return true; - } - - function translate(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - switch (key) { - case 's': - return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum'; - case 'm': - return withoutSuffix ? 'mínúta' : 'mínútu'; - case 'mm': - if (plural(number)) { - return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum'); - } else if (withoutSuffix) { - return result + 'mínúta'; - } - return result + 'mínútu'; - case 'hh': - if (plural(number)) { - return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum'); - } - return result + 'klukkustund'; - case 'd': - if (withoutSuffix) { - return 'dagur'; - } - return isFuture ? 'dag' : 'degi'; - case 'dd': - if (plural(number)) { - if (withoutSuffix) { - return result + 'dagar'; - } - return result + (isFuture ? 'daga' : 'dögum'); - } else if (withoutSuffix) { - return result + 'dagur'; - } - return result + (isFuture ? 'dag' : 'degi'); - case 'M': - if (withoutSuffix) { - return 'mánuður'; - } - return isFuture ? 'mánuð' : 'mánuði'; - case 'MM': - if (plural(number)) { - if (withoutSuffix) { - return result + 'mánuðir'; - } - return result + (isFuture ? 'mánuði' : 'mánuðum'); - } else if (withoutSuffix) { - return result + 'mánuður'; - } - return result + (isFuture ? 'mánuð' : 'mánuði'); - case 'y': - return withoutSuffix || isFuture ? 'ár' : 'ári'; - case 'yy': - if (plural(number)) { - return result + (withoutSuffix || isFuture ? 'ár' : 'árum'); - } - return result + (withoutSuffix || isFuture ? 'ár' : 'ári'); - } - } - - return moment.defineLocale('is', { - months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'), - monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'), - weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'), - weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'), - weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY [kl.] LT', - LLLL : 'dddd, D. MMMM YYYY [kl.] LT' - }, - calendar : { - sameDay : '[í dag kl.] LT', - nextDay : '[á morgun kl.] LT', - nextWeek : 'dddd [kl.] LT', - lastDay : '[í gær kl.] LT', - lastWeek : '[síðasta] dddd [kl.] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'eftir %s', - past : 'fyrir %s síðan', - s : translate, - m : translate, - mm : translate, - h : 'klukkustund', - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : italian (it) -// author : Lorenzo : https://github.com/aliem -// author: Mattia Larentis: https://github.com/nostalgiaz - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('it', { - months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'), - monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'), - weekdays : 'Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato'.split('_'), - weekdaysShort : 'Dom_Lun_Mar_Mer_Gio_Ven_Sab'.split('_'), - weekdaysMin : 'D_L_Ma_Me_G_V_S'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay: '[Oggi alle] LT', - nextDay: '[Domani alle] LT', - nextWeek: 'dddd [alle] LT', - lastDay: '[Ieri alle] LT', - lastWeek: function () { - switch (this.day()) { - case 0: - return '[la scorsa] dddd [alle] LT'; - default: - return '[lo scorso] dddd [alle] LT'; - } - }, - sameElse: 'L' - }, - relativeTime : { - future : function (s) { - return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s; - }, - past : '%s fa', - s : 'alcuni secondi', - m : 'un minuto', - mm : '%d minuti', - h : 'un\'ora', - hh : '%d ore', - d : 'un giorno', - dd : '%d giorni', - M : 'un mese', - MM : '%d mesi', - y : 'un anno', - yy : '%d anni' - }, - ordinalParse : /\d{1,2}º/, - ordinal: '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : japanese (ja) -// author : LI Long : https://github.com/baryon - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('ja', { - months : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), - monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), - weekdays : '日曜日_月曜日_ç«æ›œæ—¥_水曜日_木曜日_金曜日_土曜日'.split('_'), - weekdaysShort : 'æ—¥_月_ç«_æ°´_木_金_土'.split('_'), - weekdaysMin : 'æ—¥_月_ç«_æ°´_木_金_土'.split('_'), - longDateFormat : { - LT : 'Ah時m分', - LTS : 'LTs秒', - L : 'YYYY/MM/DD', - LL : 'YYYYå¹´M月Dæ—¥', - LLL : 'YYYYå¹´M月Dæ—¥LT', - LLLL : 'YYYYå¹´M月Dæ—¥LT dddd' - }, - meridiemParse: /åˆå‰|åˆå¾Œ/i, - isPM : function (input) { - return input === 'åˆå¾Œ'; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'åˆå‰'; - } else { - return 'åˆå¾Œ'; - } - }, - calendar : { - sameDay : '[今日] LT', - nextDay : '[明日] LT', - nextWeek : '[æ¥é€±]dddd LT', - lastDay : '[昨日] LT', - lastWeek : '[å‰é€±]dddd LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s後', - past : '%så‰', - s : '数秒', - m : '1分', - mm : '%d分', - h : '1時間', - hh : '%d時間', - d : '1æ—¥', - dd : '%dæ—¥', - M : '1ヶ月', - MM : '%dヶ月', - y : '1å¹´', - yy : '%då¹´' - } - }); -})); -// moment.js locale configuration -// locale : Georgian (ka) -// author : Irakli Janiashvili : https://github.com/irakli-janiashvili - -(function (factory) { - factory(moment); -}(function (moment) { - function monthsCaseReplace(m, format) { - var months = { - 'nominative': 'იáƒáƒœáƒ•áƒáƒ áƒ˜_თებერვáƒáƒšáƒ˜_მáƒáƒ áƒ¢áƒ˜_áƒáƒžáƒ áƒ˜áƒšáƒ˜_მáƒáƒ˜áƒ¡áƒ˜_ივნისი_ივლისი_áƒáƒ’ვისტáƒ_სექტემბერი_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი_ნáƒáƒ”მბერი_დეკემბერი'.split('_'), - 'accusative': 'იáƒáƒœáƒ•áƒáƒ áƒ¡_თებერვáƒáƒšáƒ¡_მáƒáƒ áƒ¢áƒ¡_áƒáƒžáƒ áƒ˜áƒšáƒ˜áƒ¡_მáƒáƒ˜áƒ¡áƒ¡_ივნისს_ივლისს_áƒáƒ’ვისტს_სექტემბერს_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერს_ნáƒáƒ”მბერს_დეკემბერს'.split('_') - }, - - nounCase = (/D[oD] *MMMM?/).test(format) ? - 'accusative' : - 'nominative'; - - return months[nounCase][m.month()]; - } - - function weekdaysCaseReplace(m, format) { - var weekdays = { - 'nominative': 'კვირáƒ_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ი_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი_ხუთშáƒáƒ‘áƒáƒ—ი_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი_შáƒáƒ‘áƒáƒ—ი'.split('_'), - 'accusative': 'კვირáƒáƒ¡_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ს_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ს_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ს_ხუთშáƒáƒ‘áƒáƒ—ს_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვს_შáƒáƒ‘áƒáƒ—ს'.split('_') - }, - - nounCase = (/(წინáƒ|შემდეგ)/).test(format) ? - 'accusative' : - 'nominative'; - - return weekdays[nounCase][m.day()]; - } - - return moment.defineLocale('ka', { - months : monthsCaseReplace, - monthsShort : 'იáƒáƒœ_თებ_მáƒáƒ _áƒáƒžáƒ _მáƒáƒ˜_ივნ_ივლ_áƒáƒ’ვ_სექ_áƒáƒ¥áƒ¢_ნáƒáƒ”_დეკ'.split('_'), - weekdays : weekdaysCaseReplace, - weekdaysShort : 'კვი_áƒáƒ áƒ¨_სáƒáƒ›_áƒáƒ—ხ_ხუთ_პáƒáƒ _შáƒáƒ‘'.split('_'), - weekdaysMin : 'კვ_áƒáƒ _სáƒ_áƒáƒ—_ხუ_პáƒ_შáƒ'.split('_'), - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay : '[დღეს] LT[-ზე]', - nextDay : '[ხვáƒáƒš] LT[-ზე]', - lastDay : '[გუშინ] LT[-ზე]', - nextWeek : '[შემდეგ] dddd LT[-ზე]', - lastWeek : '[წინáƒ] dddd LT-ზე', - sameElse : 'L' - }, - relativeTime : { - future : function (s) { - return (/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|წელი)/).test(s) ? - s.replace(/ი$/, 'ში') : - s + 'ში'; - }, - past : function (s) { - if ((/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|დღე|თვე)/).test(s)) { - return s.replace(/(ი|ე)$/, 'ის წინ'); - } - if ((/წელი/).test(s)) { - return s.replace(/წელი$/, 'წლის წინ'); - } - }, - s : 'რáƒáƒ›áƒ“ენიმე წáƒáƒ›áƒ˜', - m : 'წუთი', - mm : '%d წუთი', - h : 'სáƒáƒáƒ—ი', - hh : '%d სáƒáƒáƒ—ი', - d : 'დღე', - dd : '%d დღე', - M : 'თვე', - MM : '%d თვე', - y : 'წელი', - yy : '%d წელი' - }, - ordinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/, - ordinal : function (number) { - if (number === 0) { - return number; - } - - if (number === 1) { - return number + '-ლი'; - } - - if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) { - return 'მე-' + number; - } - - return number + '-ე'; - }, - week : { - dow : 1, - doy : 7 - } - }); -})); -// moment.js locale configuration -// locale : khmer (km) -// author : Kruy Vanna : https://github.com/kruyvanna - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('km', { - months: 'មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ'.split('_'), - monthsShort: 'មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ'.split('_'), - weekdays: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), - weekdaysShort: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), - weekdaysMin: 'អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ'.split('_'), - longDateFormat: { - LT: 'HH:mm', - LTS : 'LT:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY LT', - LLLL: 'dddd, D MMMM YYYY LT' - }, - calendar: { - sameDay: '[ážáŸ’ងៃនៈ ម៉ោង] LT', - nextDay: '[ស្អែក ម៉ោង] LT', - nextWeek: 'dddd [ម៉ោង] LT', - lastDay: '[ម្សិលមិញ ម៉ោង] LT', - lastWeek: 'dddd [សប្ážáž¶áž áŸáž˜áž»áž“] [ម៉ោង] LT', - sameElse: 'L' - }, - relativeTime: { - future: '%sទៀáž', - past: '%sមុន', - s: 'ប៉ុន្មានវិនាទី', - m: 'មួយនាទី', - mm: '%d នាទី', - h: 'មួយម៉ោង', - hh: '%d ម៉ោង', - d: 'មួយážáŸ’ងៃ', - dd: '%d ážáŸ’ងៃ', - M: 'មួយážáŸ‚', - MM: '%d ážáŸ‚', - y: 'មួយឆ្នាំ', - yy: '%d ឆ្នាំ' - }, - week: { - dow: 1, // Monday is the first day of the week. - doy: 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : korean (ko) -// -// authors -// -// - Kyungwook, Park : https://github.com/kyungw00k -// - Jeeeyul Lee -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('ko', { - months : '1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”'.split('_'), - monthsShort : '1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”'.split('_'), - weekdays : 'ì¼ìš”ì¼_월요ì¼_화요ì¼_수요ì¼_목요ì¼_금요ì¼_토요ì¼'.split('_'), - weekdaysShort : 'ì¼_ì›”_í™”_수_목_금_토'.split('_'), - weekdaysMin : 'ì¼_ì›”_í™”_수_목_금_토'.split('_'), - longDateFormat : { - LT : 'A hì‹œ m분', - LTS : 'A hì‹œ m분 sì´ˆ', - L : 'YYYY.MM.DD', - LL : 'YYYYë…„ MMMM Dì¼', - LLL : 'YYYYë…„ MMMM Dì¼ LT', - LLLL : 'YYYYë…„ MMMM Dì¼ dddd LT' - }, - calendar : { - sameDay : '오늘 LT', - nextDay : 'ë‚´ì¼ LT', - nextWeek : 'dddd LT', - lastDay : 'ì–´ì œ LT', - lastWeek : '지난주 dddd LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s 후', - past : '%s ì „', - s : '몇초', - ss : '%dì´ˆ', - m : 'ì¼ë¶„', - mm : '%d분', - h : '한시간', - hh : '%d시간', - d : '하루', - dd : '%dì¼', - M : '한달', - MM : '%d달', - y : 'ì¼ë…„', - yy : '%dë…„' - }, - ordinalParse : /\d{1,2}ì¼/, - ordinal : '%dì¼', - meridiemParse : /오전|오후/, - isPM : function (token) { - return token === '오후'; - }, - meridiem : function (hour, minute, isUpper) { - return hour < 12 ? '오전' : '오후'; - } - }); -})); -// moment.js locale configuration -// locale : Luxembourgish (lb) -// author : mweimerskirch : https://github.com/mweimerskirch, David Raison : https://github.com/kwisatz - -// Note: Luxembourgish has a very particular phonological rule ('Eifeler Regel') that causes the -// deletion of the final 'n' in certain contexts. That's what the 'eifelerRegelAppliesToWeekday' -// and 'eifelerRegelAppliesToNumber' methods are meant for - -(function (factory) { - factory(moment); -}(function (moment) { - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 'm': ['eng Minutt', 'enger Minutt'], - 'h': ['eng Stonn', 'enger Stonn'], - 'd': ['een Dag', 'engem Dag'], - 'M': ['ee Mount', 'engem Mount'], - 'y': ['ee Joer', 'engem Joer'] - }; - return withoutSuffix ? format[key][0] : format[key][1]; - } - - function processFutureTime(string) { - var number = string.substr(0, string.indexOf(' ')); - if (eifelerRegelAppliesToNumber(number)) { - return 'a ' + string; - } - return 'an ' + string; - } - - function processPastTime(string) { - var number = string.substr(0, string.indexOf(' ')); - if (eifelerRegelAppliesToNumber(number)) { - return 'viru ' + string; - } - return 'virun ' + string; - } - - /** - * Returns true if the word before the given number loses the '-n' ending. - * e.g. 'an 10 Deeg' but 'a 5 Deeg' - * - * @param number {integer} - * @returns {boolean} - */ - function eifelerRegelAppliesToNumber(number) { - number = parseInt(number, 10); - if (isNaN(number)) { - return false; - } - if (number < 0) { - // Negative Number --> always true - return true; - } else if (number < 10) { - // Only 1 digit - if (4 <= number && number <= 7) { - return true; - } - return false; - } else if (number < 100) { - // 2 digits - var lastDigit = number % 10, firstDigit = number / 10; - if (lastDigit === 0) { - return eifelerRegelAppliesToNumber(firstDigit); - } - return eifelerRegelAppliesToNumber(lastDigit); - } else if (number < 10000) { - // 3 or 4 digits --> recursively check first digit - while (number >= 10) { - number = number / 10; - } - return eifelerRegelAppliesToNumber(number); - } else { - // Anything larger than 4 digits: recursively check first n-3 digits - number = number / 1000; - return eifelerRegelAppliesToNumber(number); - } - } - - return moment.defineLocale('lb', { - months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), - monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), - weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'), - weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'), - weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'), - longDateFormat: { - LT: 'H:mm [Auer]', - LTS: 'H:mm:ss [Auer]', - L: 'DD.MM.YYYY', - LL: 'D. MMMM YYYY', - LLL: 'D. MMMM YYYY LT', - LLLL: 'dddd, D. MMMM YYYY LT' - }, - calendar: { - sameDay: '[Haut um] LT', - sameElse: 'L', - nextDay: '[Muer um] LT', - nextWeek: 'dddd [um] LT', - lastDay: '[Gëschter um] LT', - lastWeek: function () { - // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule - switch (this.day()) { - case 2: - case 4: - return '[Leschten] dddd [um] LT'; - default: - return '[Leschte] dddd [um] LT'; - } - } - }, - relativeTime : { - future : processFutureTime, - past : processPastTime, - s : 'e puer Sekonnen', - m : processRelativeTime, - mm : '%d Minutten', - h : processRelativeTime, - hh : '%d Stonnen', - d : processRelativeTime, - dd : '%d Deeg', - M : processRelativeTime, - MM : '%d Méint', - y : processRelativeTime, - yy : '%d Joer' - }, - ordinalParse: /\d{1,2}\./, - ordinal: '%d.', - week: { - dow: 1, // Monday is the first day of the week. - doy: 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : Lithuanian (lt) -// author : Mindaugas MozÅ«ras : https://github.com/mmozuras - -(function (factory) { - factory(moment); -}(function (moment) { - var units = { - 'm' : 'minutÄ—_minutÄ—s_minutÄ™', - 'mm': 'minutÄ—s_minuÄių_minutes', - 'h' : 'valanda_valandos_valandÄ…', - 'hh': 'valandos_valandų_valandas', - 'd' : 'diena_dienos_dienÄ…', - 'dd': 'dienos_dienų_dienas', - 'M' : 'mÄ—nuo_mÄ—nesio_mÄ—nesį', - 'MM': 'mÄ—nesiai_mÄ—nesių_mÄ—nesius', - 'y' : 'metai_metų_metus', - 'yy': 'metai_metų_metus' - }, - weekDays = 'sekmadienis_pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis'.split('_'); - - function translateSeconds(number, withoutSuffix, key, isFuture) { - if (withoutSuffix) { - return 'kelios sekundÄ—s'; - } else { - return isFuture ? 'kelių sekundžių' : 'kelias sekundes'; - } - } - - function translateSingular(number, withoutSuffix, key, isFuture) { - return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]); - } - - function special(number) { - return number % 10 === 0 || (number > 10 && number < 20); - } - - function forms(key) { - return units[key].split('_'); - } - - function translate(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - if (number === 1) { - return result + translateSingular(number, withoutSuffix, key[0], isFuture); - } else if (withoutSuffix) { - return result + (special(number) ? forms(key)[1] : forms(key)[0]); - } else { - if (isFuture) { - return result + forms(key)[1]; - } else { - return result + (special(number) ? forms(key)[1] : forms(key)[2]); - } - } - } - - function relativeWeekDay(moment, format) { - var nominative = format.indexOf('dddd HH:mm') === -1, - weekDay = weekDays[moment.day()]; - - return nominative ? weekDay : weekDay.substring(0, weekDay.length - 2) + 'į'; - } - - return moment.defineLocale('lt', { - months : 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio'.split('_'), - monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'), - weekdays : relativeWeekDay, - weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Å eÅ¡'.split('_'), - weekdaysMin : 'S_P_A_T_K_Pn_Å '.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'YYYY-MM-DD', - LL : 'YYYY [m.] MMMM D [d.]', - LLL : 'YYYY [m.] MMMM D [d.], LT [val.]', - LLLL : 'YYYY [m.] MMMM D [d.], dddd, LT [val.]', - l : 'YYYY-MM-DD', - ll : 'YYYY [m.] MMMM D [d.]', - lll : 'YYYY [m.] MMMM D [d.], LT [val.]', - llll : 'YYYY [m.] MMMM D [d.], ddd, LT [val.]' - }, - calendar : { - sameDay : '[Å iandien] LT', - nextDay : '[Rytoj] LT', - nextWeek : 'dddd LT', - lastDay : '[Vakar] LT', - lastWeek : '[PraÄ—jusį] dddd LT', - sameElse : 'L' - }, - relativeTime : { - future : 'po %s', - past : 'prieÅ¡ %s', - s : translateSeconds, - m : translateSingular, - mm : translate, - h : translateSingular, - hh : translate, - d : translateSingular, - dd : translate, - M : translateSingular, - MM : translate, - y : translateSingular, - yy : translate - }, - ordinalParse: /\d{1,2}-oji/, - ordinal : function (number) { - return number + '-oji'; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : latvian (lv) -// author : Kristaps Karlsons : https://github.com/skakri - -(function (factory) { - factory(moment); -}(function (moment) { - var units = { - 'mm': 'minÅ«ti_minÅ«tes_minÅ«te_minÅ«tes', - 'hh': 'stundu_stundas_stunda_stundas', - 'dd': 'dienu_dienas_diena_dienas', - 'MM': 'mÄ“nesi_mÄ“neÅ¡us_mÄ“nesis_mÄ“neÅ¡i', - 'yy': 'gadu_gadus_gads_gadi' - }; - - function format(word, number, withoutSuffix) { - var forms = word.split('_'); - if (withoutSuffix) { - return number % 10 === 1 && number !== 11 ? forms[2] : forms[3]; - } else { - return number % 10 === 1 && number !== 11 ? forms[0] : forms[1]; - } - } - - function relativeTimeWithPlural(number, withoutSuffix, key) { - return number + ' ' + format(units[key], number, withoutSuffix); - } - - return moment.defineLocale('lv', { - months : 'janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris'.split('_'), - monthsShort : 'jan_feb_mar_apr_mai_jÅ«n_jÅ«l_aug_sep_okt_nov_dec'.split('_'), - weekdays : 'svÄ“tdiena_pirmdiena_otrdiena_treÅ¡diena_ceturtdiena_piektdiena_sestdiena'.split('_'), - weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'), - weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'YYYY. [gada] D. MMMM', - LLL : 'YYYY. [gada] D. MMMM, LT', - LLLL : 'YYYY. [gada] D. MMMM, dddd, LT' - }, - calendar : { - sameDay : '[Å odien pulksten] LT', - nextDay : '[RÄ«t pulksten] LT', - nextWeek : 'dddd [pulksten] LT', - lastDay : '[Vakar pulksten] LT', - lastWeek : '[PagÄjuÅ¡Ä] dddd [pulksten] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s vÄ“lÄk', - past : '%s agrÄk', - s : 'dažas sekundes', - m : 'minÅ«ti', - mm : relativeTimeWithPlural, - h : 'stundu', - hh : relativeTimeWithPlural, - d : 'dienu', - dd : relativeTimeWithPlural, - M : 'mÄ“nesi', - MM : relativeTimeWithPlural, - y : 'gadu', - yy : relativeTimeWithPlural - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : macedonian (mk) -// author : Borislav Mickov : https://github.com/B0k0 - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('mk', { - months : 'јануари_февруари_март_април_мај_јуни_јули_авгуÑÑ‚_Ñептември_октомври_ноември_декември'.split('_'), - monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_Ñеп_окт_ное_дек'.split('_'), - weekdays : 'недела_понеделник_вторник_Ñреда_четврток_петок_Ñабота'.split('_'), - weekdaysShort : 'нед_пон_вто_Ñре_чет_пет_Ñаб'.split('_'), - weekdaysMin : 'нe_пo_вт_ÑÑ€_че_пе_Ña'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'D.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay : '[Ð”ÐµÐ½ÐµÑ Ð²Ð¾] LT', - nextDay : '[Утре во] LT', - nextWeek : 'dddd [во] LT', - lastDay : '[Вчера во] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - case 6: - return '[Во изминатата] dddd [во] LT'; - case 1: - case 2: - case 4: - case 5: - return '[Во изминатиот] dddd [во] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'поÑле %s', - past : 'пред %s', - s : 'неколку Ñекунди', - m : 'минута', - mm : '%d минути', - h : 'чаÑ', - hh : '%d чаÑа', - d : 'ден', - dd : '%d дена', - M : 'меÑец', - MM : '%d меÑеци', - y : 'година', - yy : '%d години' - }, - ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, - ordinal : function (number) { - var lastDigit = number % 10, - last2Digits = number % 100; - if (number === 0) { - return number + '-ев'; - } else if (last2Digits === 0) { - return number + '-ен'; - } else if (last2Digits > 10 && last2Digits < 20) { - return number + '-ти'; - } else if (lastDigit === 1) { - return number + '-ви'; - } else if (lastDigit === 2) { - return number + '-ри'; - } else if (lastDigit === 7 || lastDigit === 8) { - return number + '-ми'; - } else { - return number + '-ти'; - } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : malayalam (ml) -// author : Floyd Pink : https://github.com/floydpink - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('ml', { - months : 'ജനàµà´µà´°à´¿_ഫെബàµà´°àµà´µà´°à´¿_മാർചàµà´šàµ_à´à´ªàµà´°à´¿àµ½_മേയàµ_ജൂൺ_ജൂലൈ_à´“à´—à´¸àµà´±àµà´±àµ_സെപàµà´±àµà´±à´‚ബർ_à´’à´•àµà´Ÿàµ‹à´¬àµ¼_നവംബർ_ഡിസംബർ'.split('_'), - monthsShort : 'ജനàµ._ഫെബàµà´°àµ._മാർ._à´à´ªàµà´°à´¿._മേയàµ_ജൂൺ_ജൂലൈ._à´“à´—._സെപàµà´±àµà´±._à´’à´•àµà´Ÿàµ‹._നവം._ഡിസം.'.split('_'), - weekdays : 'ഞായറാഴàµà´š_തിങàµà´•à´³à´¾à´´àµà´š_ചൊവàµà´µà´¾à´´àµà´š_à´¬àµà´§à´¨à´¾à´´àµà´š_à´µàµà´¯à´¾à´´à´¾à´´àµà´š_വെളàµà´³à´¿à´¯à´¾à´´àµà´š_ശനിയാഴàµà´š'.split('_'), - weekdaysShort : 'ഞായർ_തിങàµà´•àµ¾_ചൊവàµà´µ_à´¬àµà´§àµ»_à´µàµà´¯à´¾à´´à´‚_വെളàµà´³à´¿_ശനി'.split('_'), - weekdaysMin : 'à´žà´¾_തി_ചൊ_à´¬àµ_à´µàµà´¯à´¾_വെ_à´¶'.split('_'), - longDateFormat : { - LT : 'A h:mm -à´¨àµ', - LTS : 'A h:mm:ss -à´¨àµ', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, LT', - LLLL : 'dddd, D MMMM YYYY, LT' - }, - calendar : { - sameDay : '[ഇനàµà´¨àµ] LT', - nextDay : '[നാളെ] LT', - nextWeek : 'dddd, LT', - lastDay : '[ഇനàµà´¨à´²àµ†] LT', - lastWeek : '[à´•à´´à´¿à´žàµà´ž] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s à´•à´´à´¿à´žàµà´žàµ', - past : '%s à´®àµàµ»à´ªàµ', - s : 'അൽപ നിമിഷങàµà´™àµ¾', - m : 'ഒരൠമിനിറàµà´±àµ', - mm : '%d മിനിറàµà´±àµ', - h : 'ഒരൠമണികàµà´•àµ‚ർ', - hh : '%d മണികàµà´•àµ‚ർ', - d : 'ഒരൠദിവസം', - dd : '%d ദിവസം', - M : 'ഒരൠമാസം', - MM : '%d മാസം', - y : 'ഒരൠവർഷം', - yy : '%d വർഷം' - }, - meridiemParse: /രാതàµà´°à´¿|രാവിലെ|ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿/i, - isPM : function (input) { - return /^(ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'രാതàµà´°à´¿'; - } else if (hour < 12) { - return 'രാവിലെ'; - } else if (hour < 17) { - return 'ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ'; - } else if (hour < 20) { - return 'വൈകàµà´¨àµà´¨àµ‡à´°à´‚'; - } else { - return 'രാതàµà´°à´¿'; - } - } - }); -})); -// moment.js locale configuration -// locale : Marathi (mr) -// author : Harshad Kale : https://github.com/kalehv - -(function (factory) { - factory(moment); -}(function (moment) { - var symbolMap = { - '1': '१', - '2': '२', - '3': '३', - '4': '४', - '5': '५', - '6': '६', - '7': '७', - '8': '८', - '9': '९', - '0': '०' - }, - numberMap = { - '१': '1', - '२': '2', - '३': '3', - '४': '4', - '५': '5', - '६': '6', - '७': '7', - '८': '8', - '९': '9', - '०': '0' - }; - - return moment.defineLocale('mr', { - months : 'जानेवारी_फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€_मारà¥à¤š_à¤à¤ªà¥à¤°à¤¿à¤²_मे_जून_जà¥à¤²à¥ˆ_ऑगसà¥à¤Ÿ_सपà¥à¤Ÿà¥‡à¤‚बर_ऑकà¥à¤Ÿà¥‹à¤¬à¤°_नोवà¥à¤¹à¥‡à¤‚बर_डिसेंबर'.split('_'), - monthsShort: 'जाने._फेबà¥à¤°à¥._मारà¥à¤š._à¤à¤ªà¥à¤°à¤¿._मे._जून._जà¥à¤²à¥ˆ._ऑग._सपà¥à¤Ÿà¥‡à¤‚._ऑकà¥à¤Ÿà¥‹._नोवà¥à¤¹à¥‡à¤‚._डिसें.'.split('_'), - weekdays : 'रविवार_सोमवार_मंगळवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split('_'), - weekdaysShort : 'रवि_सोम_मंगळ_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split('_'), - weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split('_'), - longDateFormat : { - LT : 'A h:mm वाजता', - LTS : 'A h:mm:ss वाजता', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, LT', - LLLL : 'dddd, D MMMM YYYY, LT' - }, - calendar : { - sameDay : '[आज] LT', - nextDay : '[उदà¥à¤¯à¤¾] LT', - nextWeek : 'dddd, LT', - lastDay : '[काल] LT', - lastWeek: '[मागील] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s नंतर', - past : '%s पूरà¥à¤µà¥€', - s : 'सेकंद', - m: 'à¤à¤• मिनिट', - mm: '%d मिनिटे', - h : 'à¤à¤• तास', - hh : '%d तास', - d : 'à¤à¤• दिवस', - dd : '%d दिवस', - M : 'à¤à¤• महिना', - MM : '%d महिने', - y : 'à¤à¤• वरà¥à¤·', - yy : '%d वरà¥à¤·à¥‡' - }, - preparse: function (string) { - return string.replace(/[१२३४५६७८९०]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - meridiemParse: /रातà¥à¤°à¥€|सकाळी|दà¥à¤ªà¤¾à¤°à¥€|सायंकाळी/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'रातà¥à¤°à¥€') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'सकाळी') { - return hour; - } else if (meridiem === 'दà¥à¤ªà¤¾à¤°à¥€') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'सायंकाळी') { - return hour + 12; - } - }, - meridiem: function (hour, minute, isLower) - { - if (hour < 4) { - return 'रातà¥à¤°à¥€'; - } else if (hour < 10) { - return 'सकाळी'; - } else if (hour < 17) { - return 'दà¥à¤ªà¤¾à¤°à¥€'; - } else if (hour < 20) { - return 'सायंकाळी'; - } else { - return 'रातà¥à¤°à¥€'; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : Bahasa Malaysia (ms-MY) -// author : Weldan Jamili : https://github.com/weldan - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('ms-my', { - months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), - monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), - weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), - weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), - weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), - longDateFormat : { - LT : 'HH.mm', - LTS : 'LT.ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY [pukul] LT', - LLLL : 'dddd, D MMMM YYYY [pukul] LT' - }, - meridiemParse: /pagi|tengahari|petang|malam/, - meridiemHour: function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'pagi') { - return hour; - } else if (meridiem === 'tengahari') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === 'petang' || meridiem === 'malam') { - return hour + 12; - } - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 11) { - return 'pagi'; - } else if (hours < 15) { - return 'tengahari'; - } else if (hours < 19) { - return 'petang'; - } else { - return 'malam'; - } - }, - calendar : { - sameDay : '[Hari ini pukul] LT', - nextDay : '[Esok pukul] LT', - nextWeek : 'dddd [pukul] LT', - lastDay : '[Kelmarin pukul] LT', - lastWeek : 'dddd [lepas pukul] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'dalam %s', - past : '%s yang lepas', - s : 'beberapa saat', - m : 'seminit', - mm : '%d minit', - h : 'sejam', - hh : '%d jam', - d : 'sehari', - dd : '%d hari', - M : 'sebulan', - MM : '%d bulan', - y : 'setahun', - yy : '%d tahun' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : Burmese (my) -// author : Squar team, mysquar.com - -(function (factory) { - factory(moment); -}(function (moment) { - var symbolMap = { - '1': 'á', - '2': 'á‚', - '3': 'áƒ', - '4': 'á„', - '5': 'á…', - '6': 'á†', - '7': 'á‡', - '8': 'áˆ', - '9': 'á‰', - '0': 'á€' - }, numberMap = { - 'á': '1', - 'á‚': '2', - 'áƒ': '3', - 'á„': '4', - 'á…': '5', - 'á†': '6', - 'á‡': '7', - 'áˆ': '8', - 'á‰': '9', - 'á€': '0' - }; - return moment.defineLocale('my', { - months: 'ဇန်နá€á€«á€›á€®_ဖေဖော်á€á€«á€›á€®_မá€á€º_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုá€á€º_စက်á€á€„်ဘာ_အောက်á€á€­á€¯á€˜á€¬_နိုá€á€„်ဘာ_ဒီဇင်ဘာ'.split('_'), - monthsShort: 'ဇန်_ဖေ_မá€á€º_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'), - weekdays: 'á€á€”င်္ဂနွေ_á€á€”င်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပá€á€±á€¸_သောကြာ_စနေ'.split('_'), - weekdaysShort: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), - weekdaysMin: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), - longDateFormat: { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY LT', - LLLL: 'dddd D MMMM YYYY LT' - }, - calendar: { - sameDay: '[ယနေ.] LT [မှာ]', - nextDay: '[မနက်ဖြန်] LT [မှာ]', - nextWeek: 'dddd LT [မှာ]', - lastDay: '[မနေ.က] LT [မှာ]', - lastWeek: '[ပြီးá€á€²á€·á€žá€±á€¬] dddd LT [မှာ]', - sameElse: 'L' - }, - relativeTime: { - future: 'လာမည့် %s မှာ', - past: 'လွန်á€á€²á€·á€žá€±á€¬ %s က', - s: 'စက္ကန်.အနည်းငယ်', - m: 'á€á€…်မိနစ်', - mm: '%d မိနစ်', - h: 'á€á€…်နာရီ', - hh: '%d နာရီ', - d: 'á€á€…်ရက်', - dd: '%d ရက်', - M: 'á€á€…်လ', - MM: '%d လ', - y: 'á€á€…်နှစ်', - yy: '%d နှစ်' - }, - preparse: function (string) { - return string.replace(/[áá‚áƒá„á…á†á‡áˆá‰á€]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - week: { - dow: 1, // Monday is the first day of the week. - doy: 4 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : norwegian bokmÃ¥l (nb) -// authors : Espen Hovlandsdal : https://github.com/rexxars -// Sigurd Gartmann : https://github.com/sigurdga - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('nb', { - months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), - monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), - weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), - weekdaysShort : 'søn_man_tirs_ons_tors_fre_lør'.split('_'), - weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), - longDateFormat : { - LT : 'H.mm', - LTS : 'LT.ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY [kl.] LT', - LLLL : 'dddd D. MMMM YYYY [kl.] LT' - }, - calendar : { - sameDay: '[i dag kl.] LT', - nextDay: '[i morgen kl.] LT', - nextWeek: 'dddd [kl.] LT', - lastDay: '[i gÃ¥r kl.] LT', - lastWeek: '[forrige] dddd [kl.] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'om %s', - past : 'for %s siden', - s : 'noen sekunder', - m : 'ett minutt', - mm : '%d minutter', - h : 'en time', - hh : '%d timer', - d : 'en dag', - dd : '%d dager', - M : 'en mÃ¥ned', - MM : '%d mÃ¥neder', - y : 'ett Ã¥r', - yy : '%d Ã¥r' - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : nepali/nepalese -// author : suvash : https://github.com/suvash - -(function (factory) { - factory(moment); -}(function (moment) { - var symbolMap = { - '1': '१', - '2': '२', - '3': '३', - '4': '४', - '5': '५', - '6': '६', - '7': '७', - '8': '८', - '9': '९', - '0': '०' - }, - numberMap = { - '१': '1', - '२': '2', - '३': '3', - '४': '4', - '५': '5', - '६': '6', - '७': '7', - '८': '8', - '९': '9', - '०': '0' - }; - - return moment.defineLocale('ne', { - months : 'जनवरी_फेबà¥à¤°à¥à¤µà¤°à¥€_मारà¥à¤š_अपà¥à¤°à¤¿à¤²_मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ_अगषà¥à¤Ÿ_सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°_अकà¥à¤Ÿà¥‹à¤¬à¤°_नोभेमà¥à¤¬à¤°_डिसेमà¥à¤¬à¤°'.split('_'), - monthsShort : 'जन._फेबà¥à¤°à¥._मारà¥à¤š_अपà¥à¤°à¤¿._मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ._अग._सेपà¥à¤Ÿ._अकà¥à¤Ÿà¥‹._नोभे._डिसे.'.split('_'), - weekdays : 'आइतबार_सोमबार_मङà¥à¤—लबार_बà¥à¤§à¤¬à¤¾à¤°_बिहिबार_शà¥à¤•à¥à¤°à¤¬à¤¾à¤°_शनिबार'.split('_'), - weekdaysShort : 'आइत._सोम._मङà¥à¤—ल._बà¥à¤§._बिहि._शà¥à¤•à¥à¤°._शनि.'.split('_'), - weekdaysMin : 'आइ._सो._मङà¥_बà¥._बि._शà¥._श.'.split('_'), - longDateFormat : { - LT : 'Aको h:mm बजे', - LTS : 'Aको h:mm:ss बजे', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, LT', - LLLL : 'dddd, D MMMM YYYY, LT' - }, - preparse: function (string) { - return string.replace(/[१२३४५६७८९०]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - meridiemParse: /राती|बिहान|दिउà¤à¤¸à¥‹|बेलà¥à¤•à¤¾|साà¤à¤|राती/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'राती') { - return hour < 3 ? hour : hour + 12; - } else if (meridiem === 'बिहान') { - return hour; - } else if (meridiem === 'दिउà¤à¤¸à¥‹') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'बेलà¥à¤•à¤¾' || meridiem === 'साà¤à¤') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 3) { - return 'राती'; - } else if (hour < 10) { - return 'बिहान'; - } else if (hour < 15) { - return 'दिउà¤à¤¸à¥‹'; - } else if (hour < 18) { - return 'बेलà¥à¤•à¤¾'; - } else if (hour < 20) { - return 'साà¤à¤'; - } else { - return 'राती'; - } - }, - calendar : { - sameDay : '[आज] LT', - nextDay : '[भोली] LT', - nextWeek : '[आउà¤à¤¦à¥‹] dddd[,] LT', - lastDay : '[हिजो] LT', - lastWeek : '[गà¤à¤•à¥‹] dddd[,] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%sमा', - past : '%s अगाडी', - s : 'केही समय', - m : 'à¤à¤• मिनेट', - mm : '%d मिनेट', - h : 'à¤à¤• घणà¥à¤Ÿà¤¾', - hh : '%d घणà¥à¤Ÿà¤¾', - d : 'à¤à¤• दिन', - dd : '%d दिन', - M : 'à¤à¤• महिना', - MM : '%d महिना', - y : 'à¤à¤• बरà¥à¤·', - yy : '%d बरà¥à¤·' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : dutch (nl) -// author : Joris Röling : https://github.com/jjupiter - -(function (factory) { - factory(moment); -}(function (moment) { - var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), - monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); - - return moment.defineLocale('nl', { - months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), - monthsShort : function (m, format) { - if (/-MMM-/.test(format)) { - return monthsShortWithoutDots[m.month()]; - } else { - return monthsShortWithDots[m.month()]; - } - }, - weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), - weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), - weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD-MM-YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay: '[vandaag om] LT', - nextDay: '[morgen om] LT', - nextWeek: 'dddd [om] LT', - lastDay: '[gisteren om] LT', - lastWeek: '[afgelopen] dddd [om] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'over %s', - past : '%s geleden', - s : 'een paar seconden', - m : 'één minuut', - mm : '%d minuten', - h : 'één uur', - hh : '%d uur', - d : 'één dag', - dd : '%d dagen', - M : 'één maand', - MM : '%d maanden', - y : 'één jaar', - yy : '%d jaar' - }, - ordinalParse: /\d{1,2}(ste|de)/, - ordinal : function (number) { - return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : norwegian nynorsk (nn) -// author : https://github.com/mechuwind - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('nn', { - months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), - monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), - weekdays : 'sundag_mÃ¥ndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'), - weekdaysShort : 'sun_mÃ¥n_tys_ons_tor_fre_lau'.split('_'), - weekdaysMin : 'su_mÃ¥_ty_on_to_fr_lø'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay: '[I dag klokka] LT', - nextDay: '[I morgon klokka] LT', - nextWeek: 'dddd [klokka] LT', - lastDay: '[I gÃ¥r klokka] LT', - lastWeek: '[FøregÃ¥ande] dddd [klokka] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'om %s', - past : 'for %s sidan', - s : 'nokre sekund', - m : 'eit minutt', - mm : '%d minutt', - h : 'ein time', - hh : '%d timar', - d : 'ein dag', - dd : '%d dagar', - M : 'ein mÃ¥nad', - MM : '%d mÃ¥nader', - y : 'eit Ã¥r', - yy : '%d Ã¥r' - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : polish (pl) -// author : Rafal Hirsz : https://github.com/evoL - -(function (factory) { - factory(moment); -}(function (moment) { - var monthsNominative = 'styczeÅ„_luty_marzec_kwiecieÅ„_maj_czerwiec_lipiec_sierpieÅ„_wrzesieÅ„_październik_listopad_grudzieÅ„'.split('_'), - monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrzeÅ›nia_października_listopada_grudnia'.split('_'); - - function plural(n) { - return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1); - } - - function translate(number, withoutSuffix, key) { - var result = number + ' '; - switch (key) { - case 'm': - return withoutSuffix ? 'minuta' : 'minutÄ™'; - case 'mm': - return result + (plural(number) ? 'minuty' : 'minut'); - case 'h': - return withoutSuffix ? 'godzina' : 'godzinÄ™'; - case 'hh': - return result + (plural(number) ? 'godziny' : 'godzin'); - case 'MM': - return result + (plural(number) ? 'miesiÄ…ce' : 'miesiÄ™cy'); - case 'yy': - return result + (plural(number) ? 'lata' : 'lat'); - } - } - - return moment.defineLocale('pl', { - months : function (momentToFormat, format) { - if (/D MMMM/.test(format)) { - return monthsSubjective[momentToFormat.month()]; - } else { - return monthsNominative[momentToFormat.month()]; - } - }, - monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'), - weekdays : 'niedziela_poniedziaÅ‚ek_wtorek_Å›roda_czwartek_piÄ…tek_sobota'.split('_'), - weekdaysShort : 'nie_pon_wt_Å›r_czw_pt_sb'.split('_'), - weekdaysMin : 'N_Pn_Wt_Åšr_Cz_Pt_So'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay: '[DziÅ› o] LT', - nextDay: '[Jutro o] LT', - nextWeek: '[W] dddd [o] LT', - lastDay: '[Wczoraj o] LT', - lastWeek: function () { - switch (this.day()) { - case 0: - return '[W zeszÅ‚Ä… niedzielÄ™ o] LT'; - case 3: - return '[W zeszÅ‚Ä… Å›rodÄ™ o] LT'; - case 6: - return '[W zeszÅ‚Ä… sobotÄ™ o] LT'; - default: - return '[W zeszÅ‚y] dddd [o] LT'; - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'za %s', - past : '%s temu', - s : 'kilka sekund', - m : translate, - mm : translate, - h : translate, - hh : translate, - d : '1 dzieÅ„', - dd : '%d dni', - M : 'miesiÄ…c', - MM : translate, - y : 'rok', - yy : translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : brazilian portuguese (pt-br) -// author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('pt-br', { - months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), - monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), - weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'), - weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'), - weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY [às] LT', - LLLL : 'dddd, D [de] MMMM [de] YYYY [às] LT' - }, - calendar : { - sameDay: '[Hoje às] LT', - nextDay: '[Amanhã às] LT', - nextWeek: 'dddd [às] LT', - lastDay: '[Ontem às] LT', - lastWeek: function () { - return (this.day() === 0 || this.day() === 6) ? - '[Último] dddd [às] LT' : // Saturday + Sunday - '[Última] dddd [às] LT'; // Monday - Friday - }, - sameElse: 'L' - }, - relativeTime : { - future : 'em %s', - past : '%s atrás', - s : 'segundos', - m : 'um minuto', - mm : '%d minutos', - h : 'uma hora', - hh : '%d horas', - d : 'um dia', - dd : '%d dias', - M : 'um mês', - MM : '%d meses', - y : 'um ano', - yy : '%d anos' - }, - ordinalParse: /\d{1,2}º/, - ordinal : '%dº' - }); -})); -// moment.js locale configuration -// locale : portuguese (pt) -// author : Jefferson : https://github.com/jalex79 - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('pt', { - months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'), - monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), - weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'), - weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'), - weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY LT', - LLLL : 'dddd, D [de] MMMM [de] YYYY LT' - }, - calendar : { - sameDay: '[Hoje às] LT', - nextDay: '[Amanhã às] LT', - nextWeek: 'dddd [às] LT', - lastDay: '[Ontem às] LT', - lastWeek: function () { - return (this.day() === 0 || this.day() === 6) ? - '[Último] dddd [às] LT' : // Saturday + Sunday - '[Última] dddd [às] LT'; // Monday - Friday - }, - sameElse: 'L' - }, - relativeTime : { - future : 'em %s', - past : 'há %s', - s : 'segundos', - m : 'um minuto', - mm : '%d minutos', - h : 'uma hora', - hh : '%d horas', - d : 'um dia', - dd : '%d dias', - M : 'um mês', - MM : '%d meses', - y : 'um ano', - yy : '%d anos' - }, - ordinalParse: /\d{1,2}º/, - ordinal : '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : romanian (ro) -// author : Vlad Gurdiga : https://github.com/gurdiga -// author : Valentin Agachi : https://github.com/avaly - -(function (factory) { - factory(moment); -}(function (moment) { - function relativeTimeWithPlural(number, withoutSuffix, key) { - var format = { - 'mm': 'minute', - 'hh': 'ore', - 'dd': 'zile', - 'MM': 'luni', - 'yy': 'ani' - }, - separator = ' '; - if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) { - separator = ' de '; - } - - return number + separator + format[key]; - } - - return moment.defineLocale('ro', { - months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'), - monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'), - weekdays : 'duminică_luni_marÈ›i_miercuri_joi_vineri_sâmbătă'.split('_'), - weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'), - weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY H:mm', - LLLL : 'dddd, D MMMM YYYY H:mm' - }, - calendar : { - sameDay: '[azi la] LT', - nextDay: '[mâine la] LT', - nextWeek: 'dddd [la] LT', - lastDay: '[ieri la] LT', - lastWeek: '[fosta] dddd [la] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'peste %s', - past : '%s în urmă', - s : 'câteva secunde', - m : 'un minut', - mm : relativeTimeWithPlural, - h : 'o oră', - hh : relativeTimeWithPlural, - d : 'o zi', - dd : relativeTimeWithPlural, - M : 'o lună', - MM : relativeTimeWithPlural, - y : 'un an', - yy : relativeTimeWithPlural - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : russian (ru) -// author : Viktorminator : https://github.com/Viktorminator -// Author : Menelion Elensúle : https://github.com/Oire - -(function (factory) { - factory(moment); -}(function (moment) { - function plural(word, num) { - var forms = word.split('_'); - return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); - } - - function relativeTimeWithPlural(number, withoutSuffix, key) { - var format = { - 'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут', - 'hh': 'чаÑ_чаÑа_чаÑов', - 'dd': 'день_днÑ_дней', - 'MM': 'меÑÑц_меÑÑца_меÑÑцев', - 'yy': 'год_года_лет' - }; - if (key === 'm') { - return withoutSuffix ? 'минута' : 'минуту'; - } - else { - return number + ' ' + plural(format[key], +number); - } - } - - function monthsCaseReplace(m, format) { - var months = { - 'nominative': 'Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь'.split('_'), - 'accusative': 'ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ'.split('_') - }, - - nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? - 'accusative' : - 'nominative'; - - return months[nounCase][m.month()]; - } - - function monthsShortCaseReplace(m, format) { - var monthsShort = { - 'nominative': 'Ñнв_фев_март_апр_май_июнь_июль_авг_Ñен_окт_ноÑ_дек'.split('_'), - 'accusative': 'Ñнв_фев_мар_апр_маÑ_июнÑ_июлÑ_авг_Ñен_окт_ноÑ_дек'.split('_') - }, - - nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ? - 'accusative' : - 'nominative'; - - return monthsShort[nounCase][m.month()]; - } - - function weekdaysCaseReplace(m, format) { - var weekdays = { - 'nominative': 'воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота'.split('_'), - 'accusative': 'воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу'.split('_') - }, - - nounCase = (/\[ ?[Вв] ?(?:прошлую|Ñледующую|Ñту)? ?\] ?dddd/).test(format) ? - 'accusative' : - 'nominative'; - - return weekdays[nounCase][m.day()]; - } - - return moment.defineLocale('ru', { - months : monthsCaseReplace, - monthsShort : monthsShortCaseReplace, - weekdays : weekdaysCaseReplace, - weekdaysShort : 'вÑ_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), - weekdaysMin : 'вÑ_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), - monthsParse : [/^Ñнв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[й|Ñ]/i, /^июн/i, /^июл/i, /^авг/i, /^Ñен/i, /^окт/i, /^ноÑ/i, /^дек/i], - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY г.', - LLL : 'D MMMM YYYY г., LT', - LLLL : 'dddd, D MMMM YYYY г., LT' - }, - calendar : { - sameDay: '[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT', - nextDay: '[Завтра в] LT', - lastDay: '[Вчера в] LT', - nextWeek: function () { - return this.day() === 2 ? '[Во] dddd [в] LT' : '[Ð’] dddd [в] LT'; - }, - lastWeek: function (now) { - if (now.week() !== this.week()) { - switch (this.day()) { - case 0: - return '[Ð’ прошлое] dddd [в] LT'; - case 1: - case 2: - case 4: - return '[Ð’ прошлый] dddd [в] LT'; - case 3: - case 5: - case 6: - return '[Ð’ прошлую] dddd [в] LT'; - } - } else { - if (this.day() === 2) { - return '[Во] dddd [в] LT'; - } else { - return '[Ð’] dddd [в] LT'; - } - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'через %s', - past : '%s назад', - s : 'неÑколько Ñекунд', - m : relativeTimeWithPlural, - mm : relativeTimeWithPlural, - h : 'чаÑ', - hh : relativeTimeWithPlural, - d : 'день', - dd : relativeTimeWithPlural, - M : 'меÑÑц', - MM : relativeTimeWithPlural, - y : 'год', - yy : relativeTimeWithPlural - }, - - meridiemParse: /ночи|утра|днÑ|вечера/i, - isPM : function (input) { - return /^(днÑ|вечера)$/.test(input); - }, - - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'ночи'; - } else if (hour < 12) { - return 'утра'; - } else if (hour < 17) { - return 'днÑ'; - } else { - return 'вечера'; - } - }, - - ordinalParse: /\d{1,2}-(й|го|Ñ)/, - ordinal: function (number, period) { - switch (period) { - case 'M': - case 'd': - case 'DDD': - return number + '-й'; - case 'D': - return number + '-го'; - case 'w': - case 'W': - return number + '-Ñ'; - default: - return number; - } - }, - - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : slovak (sk) -// author : Martin Minka : https://github.com/k2s -// based on work of petrbela : https://github.com/petrbela - -(function (factory) { - factory(moment); -}(function (moment) { - var months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'), - monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_'); - - function plural(n) { - return (n > 1) && (n < 5); - } - - function translate(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - switch (key) { - case 's': // a few seconds / in a few seconds / a few seconds ago - return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami'; - case 'm': // a minute / in a minute / a minute ago - return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou'); - case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'minúty' : 'minút'); - } else { - return result + 'minútami'; - } - break; - case 'h': // an hour / in an hour / an hour ago - return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); - case 'hh': // 9 hours / in 9 hours / 9 hours ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'hodiny' : 'hodín'); - } else { - return result + 'hodinami'; - } - break; - case 'd': // a day / in a day / a day ago - return (withoutSuffix || isFuture) ? 'deň' : 'dňom'; - case 'dd': // 9 days / in 9 days / 9 days ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'dni' : 'dní'); - } else { - return result + 'dňami'; - } - break; - case 'M': // a month / in a month / a month ago - return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom'; - case 'MM': // 9 months / in 9 months / 9 months ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'mesiace' : 'mesiacov'); - } else { - return result + 'mesiacmi'; - } - break; - case 'y': // a year / in a year / a year ago - return (withoutSuffix || isFuture) ? 'rok' : 'rokom'; - case 'yy': // 9 years / in 9 years / 9 years ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'roky' : 'rokov'); - } else { - return result + 'rokmi'; - } - break; - } - } - - return moment.defineLocale('sk', { - months : months, - monthsShort : monthsShort, - monthsParse : (function (months, monthsShort) { - var i, _monthsParse = []; - for (i = 0; i < 12; i++) { - // use custom parser to solve problem with July (Äervenec) - _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); - } - return _monthsParse; - }(months, monthsShort)), - weekdays : 'nedeľa_pondelok_utorok_streda_Å¡tvrtok_piatok_sobota'.split('_'), - weekdaysShort : 'ne_po_ut_st_Å¡t_pi_so'.split('_'), - weekdaysMin : 'ne_po_ut_st_Å¡t_pi_so'.split('_'), - longDateFormat : { - LT: 'H:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY LT', - LLLL : 'dddd D. MMMM YYYY LT' - }, - calendar : { - sameDay: '[dnes o] LT', - nextDay: '[zajtra o] LT', - nextWeek: function () { - switch (this.day()) { - case 0: - return '[v nedeľu o] LT'; - case 1: - case 2: - return '[v] dddd [o] LT'; - case 3: - return '[v stredu o] LT'; - case 4: - return '[vo Å¡tvrtok o] LT'; - case 5: - return '[v piatok o] LT'; - case 6: - return '[v sobotu o] LT'; - } - }, - lastDay: '[vÄera o] LT', - lastWeek: function () { - switch (this.day()) { - case 0: - return '[minulú nedeľu o] LT'; - case 1: - case 2: - return '[minulý] dddd [o] LT'; - case 3: - return '[minulú stredu o] LT'; - case 4: - case 5: - return '[minulý] dddd [o] LT'; - case 6: - return '[minulú sobotu o] LT'; - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'za %s', - past : 'pred %s', - s : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : slovenian (sl) -// author : Robert SedovÅ¡ek : https://github.com/sedovsek - -(function (factory) { - factory(moment); -}(function (moment) { - function translate(number, withoutSuffix, key) { - var result = number + ' '; - switch (key) { - case 'm': - return withoutSuffix ? 'ena minuta' : 'eno minuto'; - case 'mm': - if (number === 1) { - result += 'minuta'; - } else if (number === 2) { - result += 'minuti'; - } else if (number === 3 || number === 4) { - result += 'minute'; - } else { - result += 'minut'; - } - return result; - case 'h': - return withoutSuffix ? 'ena ura' : 'eno uro'; - case 'hh': - if (number === 1) { - result += 'ura'; - } else if (number === 2) { - result += 'uri'; - } else if (number === 3 || number === 4) { - result += 'ure'; - } else { - result += 'ur'; - } - return result; - case 'dd': - if (number === 1) { - result += 'dan'; - } else { - result += 'dni'; - } - return result; - case 'MM': - if (number === 1) { - result += 'mesec'; - } else if (number === 2) { - result += 'meseca'; - } else if (number === 3 || number === 4) { - result += 'mesece'; - } else { - result += 'mesecev'; - } - return result; - case 'yy': - if (number === 1) { - result += 'leto'; - } else if (number === 2) { - result += 'leti'; - } else if (number === 3 || number === 4) { - result += 'leta'; - } else { - result += 'let'; - } - return result; - } - } - - return moment.defineLocale('sl', { - months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'), - monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'), - weekdays : 'nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota'.split('_'), - weekdaysShort : 'ned._pon._tor._sre._Äet._pet._sob.'.split('_'), - weekdaysMin : 'ne_po_to_sr_Äe_pe_so'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'LT:ss', - L : 'DD. MM. YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY LT', - LLLL : 'dddd, D. MMMM YYYY LT' - }, - calendar : { - sameDay : '[danes ob] LT', - nextDay : '[jutri ob] LT', - - nextWeek : function () { - switch (this.day()) { - case 0: - return '[v] [nedeljo] [ob] LT'; - case 3: - return '[v] [sredo] [ob] LT'; - case 6: - return '[v] [soboto] [ob] LT'; - case 1: - case 2: - case 4: - case 5: - return '[v] dddd [ob] LT'; - } - }, - lastDay : '[vÄeraj ob] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - case 6: - return '[prejÅ¡nja] dddd [ob] LT'; - case 1: - case 2: - case 4: - case 5: - return '[prejÅ¡nji] dddd [ob] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'Äez %s', - past : '%s nazaj', - s : 'nekaj sekund', - m : translate, - mm : translate, - h : translate, - hh : translate, - d : 'en dan', - dd : translate, - M : 'en mesec', - MM : translate, - y : 'eno leto', - yy : translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : Albanian (sq) -// author : Flakërim Ismani : https://github.com/flakerimi -// author: Menelion Elensúle: https://github.com/Oire (tests) -// author : Oerd Cukalla : https://github.com/oerd (fixes) - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('sq', { - months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'), - monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'), - weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'), - weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'), - weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'), - meridiemParse: /PD|MD/, - isPM: function (input) { - return input.charAt(0) === 'M'; - }, - meridiem : function (hours, minutes, isLower) { - return hours < 12 ? 'PD' : 'MD'; - }, - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay : '[Sot në] LT', - nextDay : '[Nesër në] LT', - nextWeek : 'dddd [në] LT', - lastDay : '[Dje në] LT', - lastWeek : 'dddd [e kaluar në] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'në %s', - past : '%s më parë', - s : 'disa sekonda', - m : 'një minutë', - mm : '%d minuta', - h : 'një orë', - hh : '%d orë', - d : 'një ditë', - dd : '%d ditë', - M : 'një muaj', - MM : '%d muaj', - y : 'një vit', - yy : '%d vite' - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : Serbian-cyrillic (sr-cyrl) -// author : Milan JanaÄković : https://github.com/milan-j - -(function (factory) { - factory(moment); -}(function (moment) { - var translator = { - words: { //Different grammatical cases - m: ['један минут', 'једне минуте'], - mm: ['минут', 'минуте', 'минута'], - h: ['један Ñат', 'једног Ñата'], - hh: ['Ñат', 'Ñата', 'Ñати'], - dd: ['дан', 'дана', 'дана'], - MM: ['меÑец', 'меÑеца', 'меÑеци'], - yy: ['година', 'године', 'година'] - }, - correctGrammaticalCase: function (number, wordKey) { - return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); - }, - translate: function (number, withoutSuffix, key) { - var wordKey = translator.words[key]; - if (key.length === 1) { - return withoutSuffix ? wordKey[0] : wordKey[1]; - } else { - return number + ' ' + translator.correctGrammaticalCase(number, wordKey); - } - } - }; - - return moment.defineLocale('sr-cyrl', { - months: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'авгуÑÑ‚', 'Ñептембар', 'октобар', 'новембар', 'децембар'], - monthsShort: ['јан.', 'феб.', 'мар.', 'апр.', 'мај', 'јун', 'јул', 'авг.', 'Ñеп.', 'окт.', 'нов.', 'дец.'], - weekdays: ['недеља', 'понедељак', 'уторак', 'Ñреда', 'четвртак', 'петак', 'Ñубота'], - weekdaysShort: ['нед.', 'пон.', 'уто.', 'Ñре.', 'чет.', 'пет.', 'Ñуб.'], - weekdaysMin: ['не', 'по', 'ут', 'ÑÑ€', 'че', 'пе', 'Ñу'], - longDateFormat: { - LT: 'H:mm', - LTS : 'LT:ss', - L: 'DD. MM. YYYY', - LL: 'D. MMMM YYYY', - LLL: 'D. MMMM YYYY LT', - LLLL: 'dddd, D. MMMM YYYY LT' - }, - calendar: { - sameDay: '[Ð´Ð°Ð½Ð°Ñ Ñƒ] LT', - nextDay: '[Ñутра у] LT', - - nextWeek: function () { - switch (this.day()) { - case 0: - return '[у] [недељу] [у] LT'; - case 3: - return '[у] [Ñреду] [у] LT'; - case 6: - return '[у] [Ñуботу] [у] LT'; - case 1: - case 2: - case 4: - case 5: - return '[у] dddd [у] LT'; - } - }, - lastDay : '[јуче у] LT', - lastWeek : function () { - var lastWeekDays = [ - '[прошле] [недеље] [у] LT', - '[прошлог] [понедељка] [у] LT', - '[прошлог] [уторка] [у] LT', - '[прошле] [Ñреде] [у] LT', - '[прошлог] [четвртка] [у] LT', - '[прошлог] [петка] [у] LT', - '[прошле] [Ñуботе] [у] LT' - ]; - return lastWeekDays[this.day()]; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'за %s', - past : 'пре %s', - s : 'неколико Ñекунди', - m : translator.translate, - mm : translator.translate, - h : translator.translate, - hh : translator.translate, - d : 'дан', - dd : translator.translate, - M : 'меÑец', - MM : translator.translate, - y : 'годину', - yy : translator.translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : Serbian-latin (sr) -// author : Milan JanaÄković : https://github.com/milan-j - -(function (factory) { - factory(moment); -}(function (moment) { - var translator = { - words: { //Different grammatical cases - m: ['jedan minut', 'jedne minute'], - mm: ['minut', 'minute', 'minuta'], - h: ['jedan sat', 'jednog sata'], - hh: ['sat', 'sata', 'sati'], - dd: ['dan', 'dana', 'dana'], - MM: ['mesec', 'meseca', 'meseci'], - yy: ['godina', 'godine', 'godina'] - }, - correctGrammaticalCase: function (number, wordKey) { - return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); - }, - translate: function (number, withoutSuffix, key) { - var wordKey = translator.words[key]; - if (key.length === 1) { - return withoutSuffix ? wordKey[0] : wordKey[1]; - } else { - return number + ' ' + translator.correctGrammaticalCase(number, wordKey); - } - } - }; - - return moment.defineLocale('sr', { - months: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'], - monthsShort: ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun', 'jul', 'avg.', 'sep.', 'okt.', 'nov.', 'dec.'], - weekdays: ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'Äetvrtak', 'petak', 'subota'], - weekdaysShort: ['ned.', 'pon.', 'uto.', 'sre.', 'Äet.', 'pet.', 'sub.'], - weekdaysMin: ['ne', 'po', 'ut', 'sr', 'Äe', 'pe', 'su'], - longDateFormat: { - LT: 'H:mm', - LTS : 'LT:ss', - L: 'DD. MM. YYYY', - LL: 'D. MMMM YYYY', - LLL: 'D. MMMM YYYY LT', - LLLL: 'dddd, D. MMMM YYYY LT' - }, - calendar: { - sameDay: '[danas u] LT', - nextDay: '[sutra u] LT', - - nextWeek: function () { - switch (this.day()) { - case 0: - return '[u] [nedelju] [u] LT'; - case 3: - return '[u] [sredu] [u] LT'; - case 6: - return '[u] [subotu] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[u] dddd [u] LT'; - } - }, - lastDay : '[juÄe u] LT', - lastWeek : function () { - var lastWeekDays = [ - '[proÅ¡le] [nedelje] [u] LT', - '[proÅ¡log] [ponedeljka] [u] LT', - '[proÅ¡log] [utorka] [u] LT', - '[proÅ¡le] [srede] [u] LT', - '[proÅ¡log] [Äetvrtka] [u] LT', - '[proÅ¡log] [petka] [u] LT', - '[proÅ¡le] [subote] [u] LT' - ]; - return lastWeekDays[this.day()]; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'za %s', - past : 'pre %s', - s : 'nekoliko sekundi', - m : translator.translate, - mm : translator.translate, - h : translator.translate, - hh : translator.translate, - d : 'dan', - dd : translator.translate, - M : 'mesec', - MM : translator.translate, - y : 'godinu', - yy : translator.translate - }, - ordinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : swedish (sv) -// author : Jens Alm : https://github.com/ulmus - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('sv', { - months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'), - monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), - weekdays : 'söndag_mÃ¥ndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'), - weekdaysShort : 'sön_mÃ¥n_tis_ons_tor_fre_lör'.split('_'), - weekdaysMin : 'sö_mÃ¥_ti_on_to_fr_lö'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'YYYY-MM-DD', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay: '[Idag] LT', - nextDay: '[Imorgon] LT', - lastDay: '[IgÃ¥r] LT', - nextWeek: 'dddd LT', - lastWeek: '[Förra] dddd[en] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'om %s', - past : 'för %s sedan', - s : 'nÃ¥gra sekunder', - m : 'en minut', - mm : '%d minuter', - h : 'en timme', - hh : '%d timmar', - d : 'en dag', - dd : '%d dagar', - M : 'en mÃ¥nad', - MM : '%d mÃ¥nader', - y : 'ett Ã¥r', - yy : '%d Ã¥r' - }, - ordinalParse: /\d{1,2}(e|a)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'e' : - (b === 1) ? 'a' : - (b === 2) ? 'a' : - (b === 3) ? 'e' : 'e'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : tamil (ta) -// author : Arjunkumar Krishnamoorthy : https://github.com/tk120404 - -(function (factory) { - factory(moment); -}(function (moment) { - /*var symbolMap = { - '1': '௧', - '2': '௨', - '3': '௩', - '4': '௪', - '5': '௫', - '6': '௬', - '7': '௭', - '8': '௮', - '9': '௯', - '0': '௦' - }, - numberMap = { - '௧': '1', - '௨': '2', - '௩': '3', - '௪': '4', - '௫': '5', - '௬': '6', - '௭': '7', - '௮': '8', - '௯': '9', - '௦': '0' - }; */ - - return moment.defineLocale('ta', { - months : 'ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯'.split('_'), - monthsShort : 'ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯'.split('_'), - weekdays : 'ஞாயிறà¯à®±à¯à®•à¯à®•à®¿à®´à®®à¯ˆ_திஙà¯à®•à®Ÿà¯à®•à®¿à®´à®®à¯ˆ_செவà¯à®µà®¾à®¯à¯à®•à®¿à®´à®®à¯ˆ_பà¯à®¤à®©à¯à®•à®¿à®´à®®à¯ˆ_வியாழகà¯à®•à®¿à®´à®®à¯ˆ_வெளà¯à®³à®¿à®•à¯à®•à®¿à®´à®®à¯ˆ_சனிகà¯à®•à®¿à®´à®®à¯ˆ'.split('_'), - weekdaysShort : 'ஞாயிறà¯_திஙà¯à®•à®³à¯_செவà¯à®µà®¾à®¯à¯_பà¯à®¤à®©à¯_வியாழனà¯_வெளà¯à®³à®¿_சனி'.split('_'), - weekdaysMin : 'ஞா_தி_செ_பà¯_வி_வெ_ச'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, LT', - LLLL : 'dddd, D MMMM YYYY, LT' - }, - calendar : { - sameDay : '[இனà¯à®±à¯] LT', - nextDay : '[நாளை] LT', - nextWeek : 'dddd, LT', - lastDay : '[நேறà¯à®±à¯] LT', - lastWeek : '[கடநà¯à®¤ வாரமà¯] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s இலà¯', - past : '%s à®®à¯à®©à¯', - s : 'ஒர௠சில விநாடிகளà¯', - m : 'ஒர௠நிமிடமà¯', - mm : '%d நிமிடஙà¯à®•à®³à¯', - h : 'ஒர௠மணி நேரமà¯', - hh : '%d மணி நேரமà¯', - d : 'ஒர௠நாளà¯', - dd : '%d நாடà¯à®•à®³à¯', - M : 'ஒர௠மாதமà¯', - MM : '%d மாதஙà¯à®•à®³à¯', - y : 'ஒர௠வரà¯à®Ÿà®®à¯', - yy : '%d ஆணà¯à®Ÿà¯à®•à®³à¯' - }, -/* preparse: function (string) { - return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - },*/ - ordinalParse: /\d{1,2}வதà¯/, - ordinal : function (number) { - return number + 'வதà¯'; - }, - - - // refer http://ta.wikipedia.org/s/1er1 - meridiemParse: /யாமமà¯|வைகறை|காலை|நணà¯à®ªà®•à®²à¯|எறà¯à®ªà®¾à®Ÿà¯|மாலை/, - meridiem : function (hour, minute, isLower) { - if (hour < 2) { - return ' யாமமà¯'; - } else if (hour < 6) { - return ' வைகறை'; // வைகறை - } else if (hour < 10) { - return ' காலை'; // காலை - } else if (hour < 14) { - return ' நணà¯à®ªà®•à®²à¯'; // நணà¯à®ªà®•à®²à¯ - } else if (hour < 18) { - return ' எறà¯à®ªà®¾à®Ÿà¯'; // எறà¯à®ªà®¾à®Ÿà¯ - } else if (hour < 22) { - return ' மாலை'; // மாலை - } else { - return ' யாமமà¯'; - } - }, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'யாமமà¯') { - return hour < 2 ? hour : hour + 12; - } else if (meridiem === 'வைகறை' || meridiem === 'காலை') { - return hour; - } else if (meridiem === 'நணà¯à®ªà®•à®²à¯') { - return hour >= 10 ? hour : hour + 12; - } else { - return hour + 12; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : thai (th) -// author : Kridsada Thanabulpong : https://github.com/sirn - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('th', { - months : 'มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม'.split('_'), - monthsShort : 'มà¸à¸£à¸²_à¸à¸¸à¸¡à¸ à¸²_มีนา_เมษา_พฤษภา_มิถุนา_à¸à¸£à¸à¸Žà¸²_สิงหา_à¸à¸±à¸™à¸¢à¸²_ตุลา_พฤศจิà¸à¸²_ธันวา'.split('_'), - weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์'.split('_'), - weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์'.split('_'), // yes, three characters difference - weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'), - longDateFormat : { - LT : 'H นาฬิà¸à¸² m นาที', - LTS : 'LT s วินาที', - L : 'YYYY/MM/DD', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY เวลา LT', - LLLL : 'วันddddที่ D MMMM YYYY เวลา LT' - }, - meridiemParse: /à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง|หลังเที่ยง/, - isPM: function (input) { - return input === 'หลังเที่ยง'; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง'; - } else { - return 'หลังเที่ยง'; - } - }, - calendar : { - sameDay : '[วันนี้ เวลา] LT', - nextDay : '[พรุ่งนี้ เวลา] LT', - nextWeek : 'dddd[หน้า เวลา] LT', - lastDay : '[เมื่อวานนี้ เวลา] LT', - lastWeek : '[วัน]dddd[ที่à¹à¸¥à¹‰à¸§ เวลา] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'อีภ%s', - past : '%sที่à¹à¸¥à¹‰à¸§', - s : 'ไม่à¸à¸µà¹ˆà¸§à¸´à¸™à¸²à¸—ี', - m : '1 นาที', - mm : '%d นาที', - h : '1 ชั่วโมง', - hh : '%d ชั่วโมง', - d : '1 วัน', - dd : '%d วัน', - M : '1 เดือน', - MM : '%d เดือน', - y : '1 ปี', - yy : '%d ปี' - } - }); -})); -// moment.js locale configuration -// locale : Tagalog/Filipino (tl-ph) -// author : Dan Hagman - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('tl-ph', { - months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'), - monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'), - weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'), - weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'), - weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'MM/D/YYYY', - LL : 'MMMM D, YYYY', - LLL : 'MMMM D, YYYY LT', - LLLL : 'dddd, MMMM DD, YYYY LT' - }, - calendar : { - sameDay: '[Ngayon sa] LT', - nextDay: '[Bukas sa] LT', - nextWeek: 'dddd [sa] LT', - lastDay: '[Kahapon sa] LT', - lastWeek: 'dddd [huling linggo] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'sa loob ng %s', - past : '%s ang nakalipas', - s : 'ilang segundo', - m : 'isang minuto', - mm : '%d minuto', - h : 'isang oras', - hh : '%d oras', - d : 'isang araw', - dd : '%d araw', - M : 'isang buwan', - MM : '%d buwan', - y : 'isang taon', - yy : '%d taon' - }, - ordinalParse: /\d{1,2}/, - ordinal : function (number) { - return number; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : turkish (tr) -// authors : Erhan Gundogan : https://github.com/erhangundogan, -// Burak YiÄŸit Kaya: https://github.com/BYK - -(function (factory) { - factory(moment); -}(function (moment) { - var suffixes = { - 1: '\'inci', - 5: '\'inci', - 8: '\'inci', - 70: '\'inci', - 80: '\'inci', - - 2: '\'nci', - 7: '\'nci', - 20: '\'nci', - 50: '\'nci', - - 3: '\'üncü', - 4: '\'üncü', - 100: '\'üncü', - - 6: '\'ncı', - - 9: '\'uncu', - 10: '\'uncu', - 30: '\'uncu', - - 60: '\'ıncı', - 90: '\'ıncı' - }; - - return moment.defineLocale('tr', { - months : 'Ocak_Åžubat_Mart_Nisan_Mayıs_Haziran_Temmuz_AÄŸustos_Eylül_Ekim_Kasım_Aralık'.split('_'), - monthsShort : 'Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara'.split('_'), - weekdays : 'Pazar_Pazartesi_Salı_ÇarÅŸamba_PerÅŸembe_Cuma_Cumartesi'.split('_'), - weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'), - weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd, D MMMM YYYY LT' - }, - calendar : { - sameDay : '[bugün saat] LT', - nextDay : '[yarın saat] LT', - nextWeek : '[haftaya] dddd [saat] LT', - lastDay : '[dün] LT', - lastWeek : '[geçen hafta] dddd [saat] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s sonra', - past : '%s önce', - s : 'birkaç saniye', - m : 'bir dakika', - mm : '%d dakika', - h : 'bir saat', - hh : '%d saat', - d : 'bir gün', - dd : '%d gün', - M : 'bir ay', - MM : '%d ay', - y : 'bir yıl', - yy : '%d yıl' - }, - ordinalParse: /\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/, - ordinal : function (number) { - if (number === 0) { // special case for zero - return number + '\'ıncı'; - } - var a = number % 10, - b = number % 100 - a, - c = number >= 100 ? 100 : null; - - return number + (suffixes[a] || suffixes[b] || suffixes[c]); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : Morocco Central Atlas TamaziÉ£t in Latin (tzm-latn) -// author : Abdel Said : https://github.com/abdelsaid - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('tzm-latn', { - months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), - monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), - weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), - weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), - weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay: '[asdkh g] LT', - nextDay: '[aska g] LT', - nextWeek: 'dddd [g] LT', - lastDay: '[assant g] LT', - lastWeek: 'dddd [g] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'dadkh s yan %s', - past : 'yan %s', - s : 'imik', - m : 'minuá¸', - mm : '%d minuá¸', - h : 'saÉ›a', - hh : '%d tassaÉ›in', - d : 'ass', - dd : '%d ossan', - M : 'ayowr', - MM : '%d iyyirn', - y : 'asgas', - yy : '%d isgasn' - }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : Morocco Central Atlas TamaziÉ£t (tzm) -// author : Abdel Said : https://github.com/abdelsaid - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('tzm', { - months : 'ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”'.split('_'), - monthsShort : 'ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”'.split('_'), - weekdays : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), - weekdaysShort : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), - weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS: 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'dddd D MMMM YYYY LT' - }, - calendar : { - sameDay: '[ⴰⵙⴷⵅ â´´] LT', - nextDay: '[ⴰⵙⴽⴰ â´´] LT', - nextWeek: 'dddd [â´´] LT', - lastDay: '[ⴰⵚⴰâµâµœ â´´] LT', - lastWeek: 'dddd [â´´] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'â´·â´°â´·âµ… âµ™ ⵢⴰⵠ%s', - past : 'ⵢⴰⵠ%s', - s : 'ⵉⵎⵉⴽ', - m : 'ⵎⵉâµâµ“â´º', - mm : '%d ⵎⵉâµâµ“â´º', - h : 'ⵙⴰⵄⴰ', - hh : '%d ⵜⴰⵙⵙⴰⵄⵉâµ', - d : 'ⴰⵙⵙ', - dd : '%d oⵙⵙⴰâµ', - M : 'â´°âµ¢oⵓⵔ', - MM : '%d ⵉⵢⵢⵉⵔâµ', - y : 'ⴰⵙⴳⴰⵙ', - yy : '%d ⵉⵙⴳⴰⵙâµ' - }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : ukrainian (uk) -// author : zemlanin : https://github.com/zemlanin -// Author : Menelion Elensúle : https://github.com/Oire - -(function (factory) { - factory(moment); -}(function (moment) { - function plural(word, num) { - var forms = word.split('_'); - return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); - } - - function relativeTimeWithPlural(number, withoutSuffix, key) { - var format = { - 'mm': 'хвилина_хвилини_хвилин', - 'hh': 'година_години_годин', - 'dd': 'день_дні_днів', - 'MM': 'міÑÑць_міÑÑці_міÑÑців', - 'yy': 'рік_роки_років' - }; - if (key === 'm') { - return withoutSuffix ? 'хвилина' : 'хвилину'; - } - else if (key === 'h') { - return withoutSuffix ? 'година' : 'годину'; - } - else { - return number + ' ' + plural(format[key], +number); - } - } - - function monthsCaseReplace(m, format) { - var months = { - 'nominative': 'Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень'.split('_'), - 'accusative': 'ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ'.split('_') - }, - - nounCase = (/D[oD]? *MMMM?/).test(format) ? - 'accusative' : - 'nominative'; - - return months[nounCase][m.month()]; - } - - function weekdaysCaseReplace(m, format) { - var weekdays = { - 'nominative': 'неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота'.split('_'), - 'accusative': 'неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу'.split('_'), - 'genitive': 'неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи'.split('_') - }, - - nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ? - 'accusative' : - ((/\[?(?:минулої|наÑтупної)? ?\] ?dddd/).test(format) ? - 'genitive' : - 'nominative'); - - return weekdays[nounCase][m.day()]; - } - - function processHoursFunction(str) { - return function () { - return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT'; - }; - } - - return moment.defineLocale('uk', { - months : monthsCaseReplace, - monthsShort : 'Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд'.split('_'), - weekdays : weekdaysCaseReplace, - weekdaysShort : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), - weekdaysMin : 'нд_пн_вт_ÑÑ€_чт_пт_Ñб'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY Ñ€.', - LLL : 'D MMMM YYYY Ñ€., LT', - LLLL : 'dddd, D MMMM YYYY Ñ€., LT' - }, - calendar : { - sameDay: processHoursFunction('[Сьогодні '), - nextDay: processHoursFunction('[Завтра '), - lastDay: processHoursFunction('[Вчора '), - nextWeek: processHoursFunction('[У] dddd ['), - lastWeek: function () { - switch (this.day()) { - case 0: - case 3: - case 5: - case 6: - return processHoursFunction('[Минулої] dddd [').call(this); - case 1: - case 2: - case 4: - return processHoursFunction('[Минулого] dddd [').call(this); - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'за %s', - past : '%s тому', - s : 'декілька Ñекунд', - m : relativeTimeWithPlural, - mm : relativeTimeWithPlural, - h : 'годину', - hh : relativeTimeWithPlural, - d : 'день', - dd : relativeTimeWithPlural, - M : 'міÑÑць', - MM : relativeTimeWithPlural, - y : 'рік', - yy : relativeTimeWithPlural - }, - - // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason - - meridiemParse: /ночі|ранку|днÑ|вечора/, - isPM: function (input) { - return /^(днÑ|вечора)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'ночі'; - } else if (hour < 12) { - return 'ранку'; - } else if (hour < 17) { - return 'днÑ'; - } else { - return 'вечора'; - } - }, - - ordinalParse: /\d{1,2}-(й|го)/, - ordinal: function (number, period) { - switch (period) { - case 'M': - case 'd': - case 'DDD': - case 'w': - case 'W': - return number + '-й'; - case 'D': - return number + '-го'; - default: - return number; - } - }, - - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1st is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : uzbek (uz) -// author : Sardor Muminov : https://github.com/muminoff - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('uz', { - months : 'Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь'.split('_'), - monthsShort : 'Ñнв_фев_мар_апр_май_июн_июл_авг_Ñен_окт_ноÑ_дек'.split('_'), - weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'), - weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'), - weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY LT', - LLLL : 'D MMMM YYYY, dddd LT' - }, - calendar : { - sameDay : '[Бугун Ñоат] LT [да]', - nextDay : '[Эртага] LT [да]', - nextWeek : 'dddd [куни Ñоат] LT [да]', - lastDay : '[Кеча Ñоат] LT [да]', - lastWeek : '[Утган] dddd [куни Ñоат] LT [да]', - sameElse : 'L' - }, - relativeTime : { - future : 'Якин %s ичида', - past : 'Бир неча %s олдин', - s : 'фурÑат', - m : 'бир дакика', - mm : '%d дакика', - h : 'бир Ñоат', - hh : '%d Ñоат', - d : 'бир кун', - dd : '%d кун', - M : 'бир ой', - MM : '%d ой', - y : 'бир йил', - yy : '%d йил' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : vietnamese (vi) -// author : Bang Nguyen : https://github.com/bangnk - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('vi', { - months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'), - monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'), - weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tÆ°_thứ năm_thứ sáu_thứ bảy'.split('_'), - weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), - weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'LT:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM [năm] YYYY', - LLL : 'D MMMM [năm] YYYY LT', - LLLL : 'dddd, D MMMM [năm] YYYY LT', - l : 'DD/M/YYYY', - ll : 'D MMM YYYY', - lll : 'D MMM YYYY LT', - llll : 'ddd, D MMM YYYY LT' - }, - calendar : { - sameDay: '[Hôm nay lúc] LT', - nextDay: '[Ngày mai lúc] LT', - nextWeek: 'dddd [tuần tá»›i lúc] LT', - lastDay: '[Hôm qua lúc] LT', - lastWeek: 'dddd [tuần rồi lúc] LT', - sameElse: 'L' - }, - relativeTime : { - future : '%s tá»›i', - past : '%s trÆ°á»›c', - s : 'vài giây', - m : 'má»™t phút', - mm : '%d phút', - h : 'má»™t giá»', - hh : '%d giá»', - d : 'má»™t ngày', - dd : '%d ngày', - M : 'má»™t tháng', - MM : '%d tháng', - y : 'má»™t năm', - yy : '%d năm' - }, - ordinalParse: /\d{1,2}/, - ordinal : function (number) { - return number; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : chinese (zh-cn) -// author : suupic : https://github.com/suupic -// author : Zeno Zeng : https://github.com/zenozeng - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('zh-cn', { - months : '一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月'.split('_'), - monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), - weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), - weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'), - weekdaysMin : 'æ—¥_一_二_三_å››_五_å…­'.split('_'), - longDateFormat : { - LT : 'Ah点mm', - LTS : 'Ah点m分s秒', - L : 'YYYY-MM-DD', - LL : 'YYYYå¹´MMMDæ—¥', - LLL : 'YYYYå¹´MMMDæ—¥LT', - LLLL : 'YYYYå¹´MMMDæ—¥ddddLT', - l : 'YYYY-MM-DD', - ll : 'YYYYå¹´MMMDæ—¥', - lll : 'YYYYå¹´MMMDæ—¥LT', - llll : 'YYYYå¹´MMMDæ—¥ddddLT' - }, - meridiemParse: /凌晨|早上|上åˆ|中åˆ|下åˆ|晚上/, - meridiemHour: function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === '凌晨' || meridiem === '早上' || - meridiem === '上åˆ') { - return hour; - } else if (meridiem === '下åˆ' || meridiem === '晚上') { - return hour + 12; - } else { - // '中åˆ' - return hour >= 11 ? hour : hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - var hm = hour * 100 + minute; - if (hm < 600) { - return '凌晨'; - } else if (hm < 900) { - return '早上'; - } else if (hm < 1130) { - return '上åˆ'; - } else if (hm < 1230) { - return '中åˆ'; - } else if (hm < 1800) { - return '下åˆ'; - } else { - return '晚上'; - } - }, - calendar : { - sameDay : function () { - return this.minutes() === 0 ? '[今天]Ah[点整]' : '[今天]LT'; - }, - nextDay : function () { - return this.minutes() === 0 ? '[明天]Ah[点整]' : '[明天]LT'; - }, - lastDay : function () { - return this.minutes() === 0 ? '[昨天]Ah[点整]' : '[昨天]LT'; - }, - nextWeek : function () { - var startOfWeek, prefix; - startOfWeek = moment().startOf('week'); - prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]'; - return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; - }, - lastWeek : function () { - var startOfWeek, prefix; - startOfWeek = moment().startOf('week'); - prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]'; - return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; - }, - sameElse : 'LL' - }, - ordinalParse: /\d{1,2}(æ—¥|月|周)/, - ordinal : function (number, period) { - switch (period) { - case 'd': - case 'D': - case 'DDD': - return number + 'æ—¥'; - case 'M': - return number + '月'; - case 'w': - case 'W': - return number + '周'; - default: - return number; - } - }, - relativeTime : { - future : '%s内', - past : '%så‰', - s : '几秒', - m : '1分钟', - mm : '%d分钟', - h : '1å°æ—¶', - hh : '%då°æ—¶', - d : '1天', - dd : '%d天', - M : '1个月', - MM : '%d个月', - y : '1å¹´', - yy : '%då¹´' - }, - week : { - // GB/T 7408-1994《数æ®å…ƒå’Œäº¤æ¢æ ¼å¼Â·ä¿¡æ¯äº¤æ¢Â·æ—¥æœŸå’Œæ—¶é—´è¡¨ç¤ºæ³•ã€‹ä¸ŽISO 8601:1988等效 - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); -// moment.js locale configuration -// locale : traditional chinese (zh-tw) -// author : Ben : https://github.com/ben-lin - -(function (factory) { - factory(moment); -}(function (moment) { - return moment.defineLocale('zh-tw', { - months : '一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月'.split('_'), - monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), - weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), - weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), - weekdaysMin : 'æ—¥_一_二_三_å››_五_å…­'.split('_'), - longDateFormat : { - LT : 'Ah點mm', - LTS : 'Ah點m分s秒', - L : 'YYYYå¹´MMMDæ—¥', - LL : 'YYYYå¹´MMMDæ—¥', - LLL : 'YYYYå¹´MMMDæ—¥LT', - LLLL : 'YYYYå¹´MMMDæ—¥ddddLT', - l : 'YYYYå¹´MMMDæ—¥', - ll : 'YYYYå¹´MMMDæ—¥', - lll : 'YYYYå¹´MMMDæ—¥LT', - llll : 'YYYYå¹´MMMDæ—¥ddddLT' - }, - meridiemParse: /早上|上åˆ|中åˆ|下åˆ|晚上/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === '早上' || meridiem === '上åˆ') { - return hour; - } else if (meridiem === '中åˆ') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === '下åˆ' || meridiem === '晚上') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - var hm = hour * 100 + minute; - if (hm < 900) { - return '早上'; - } else if (hm < 1130) { - return '上åˆ'; - } else if (hm < 1230) { - return '中åˆ'; - } else if (hm < 1800) { - return '下åˆ'; - } else { - return '晚上'; - } - }, - calendar : { - sameDay : '[今天]LT', - nextDay : '[明天]LT', - nextWeek : '[下]ddddLT', - lastDay : '[昨天]LT', - lastWeek : '[上]ddddLT', - sameElse : 'L' - }, - ordinalParse: /\d{1,2}(æ—¥|月|週)/, - ordinal : function (number, period) { - switch (period) { - case 'd' : - case 'D' : - case 'DDD' : - return number + 'æ—¥'; - case 'M' : - return number + '月'; - case 'w' : - case 'W' : - return number + '週'; - default : - return number; - } - }, - relativeTime : { - future : '%så…§', - past : '%så‰', - s : '幾秒', - m : '一分é˜', - mm : '%d分é˜', - h : '一å°æ™‚', - hh : '%då°æ™‚', - d : '一天', - dd : '%d天', - M : '一個月', - MM : '%d個月', - y : '一年', - yy : '%då¹´' - } - }); -})); - - moment.locale('en'); - - - /************************************ - Exposing Moment - ************************************/ - - function makeGlobal(shouldDeprecate) { - /*global ender:false */ - if (typeof ender !== 'undefined') { - return; - } - oldGlobalMoment = globalScope.moment; - if (shouldDeprecate) { - globalScope.moment = deprecate( - 'Accessing Moment through the global scope is ' + - 'deprecated, and will be removed in an upcoming ' + - 'release.', - moment); - } else { - globalScope.moment = moment; - } - } - - // CommonJS module is defined - if (hasModule) { - module.exports = moment; - } else if (typeof define === 'function' && define.amd) { - define(function (require, exports, module) { - if (module.config && module.config() && module.config().noGlobal === true) { - // release the global variable - globalScope.moment = oldGlobalMoment; - } - - return moment; - }); - makeGlobal(true); - } else { - makeGlobal(); - } -}).call(this); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/moment-with-locales.min.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/moment-with-locales.min.js deleted file mode 100644 index f604348..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/moment-with-locales.min.js +++ /dev/null @@ -1,10 +0,0 @@ -//! moment.js -//! version : 2.9.0 -//! authors : Tim Wood, Iskren Chernev, Moment.js contributors -//! license : MIT -//! momentjs.com -(function(a){function b(a,b,c){switch(arguments.length){case 2:return null!=a?a:b;case 3:return null!=a?a:null!=b?b:c;default:throw new Error("Implement me")}}function c(a,b){return Bb.call(a,b)}function d(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function e(a){vb.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+a)}function f(a,b){var c=!0;return o(function(){return c&&(e(a),c=!1),b.apply(this,arguments)},b)}function g(a,b){sc[a]||(e(b),sc[a]=!0)}function h(a,b){return function(c){return r(a.call(this,c),b)}}function i(a,b){return function(c){return this.localeData().ordinal(a.call(this,c),b)}}function j(a,b){var c,d,e=12*(b.year()-a.year())+(b.month()-a.month()),f=a.clone().add(e,"months");return 0>b-f?(c=a.clone().add(e-1,"months"),d=(b-f)/(f-c)):(c=a.clone().add(e+1,"months"),d=(b-f)/(c-f)),-(e+d)}function k(a,b,c){var d;return null==c?b:null!=a.meridiemHour?a.meridiemHour(b,c):null!=a.isPM?(d=a.isPM(c),d&&12>b&&(b+=12),d||12!==b||(b=0),b):b}function l(){}function m(a,b){b!==!1&&H(a),p(this,a),this._d=new Date(+a._d),uc===!1&&(uc=!0,vb.updateOffset(this),uc=!1)}function n(a){var b=A(a),c=b.year||0,d=b.quarter||0,e=b.month||0,f=b.week||0,g=b.day||0,h=b.hour||0,i=b.minute||0,j=b.second||0,k=b.millisecond||0;this._milliseconds=+k+1e3*j+6e4*i+36e5*h,this._days=+g+7*f,this._months=+e+3*d+12*c,this._data={},this._locale=vb.localeData(),this._bubble()}function o(a,b){for(var d in b)c(b,d)&&(a[d]=b[d]);return c(b,"toString")&&(a.toString=b.toString),c(b,"valueOf")&&(a.valueOf=b.valueOf),a}function p(a,b){var c,d,e;if("undefined"!=typeof b._isAMomentObject&&(a._isAMomentObject=b._isAMomentObject),"undefined"!=typeof b._i&&(a._i=b._i),"undefined"!=typeof b._f&&(a._f=b._f),"undefined"!=typeof b._l&&(a._l=b._l),"undefined"!=typeof b._strict&&(a._strict=b._strict),"undefined"!=typeof b._tzm&&(a._tzm=b._tzm),"undefined"!=typeof b._isUTC&&(a._isUTC=b._isUTC),"undefined"!=typeof b._offset&&(a._offset=b._offset),"undefined"!=typeof b._pf&&(a._pf=b._pf),"undefined"!=typeof b._locale&&(a._locale=b._locale),Kb.length>0)for(c in Kb)d=Kb[c],e=b[d],"undefined"!=typeof e&&(a[d]=e);return a}function q(a){return 0>a?Math.ceil(a):Math.floor(a)}function r(a,b,c){for(var d=""+Math.abs(a),e=a>=0;d.lengthd;d++)(c&&a[d]!==b[d]||!c&&C(a[d])!==C(b[d]))&&g++;return g+f}function z(a){if(a){var b=a.toLowerCase().replace(/(.)s$/,"$1");a=lc[a]||mc[b]||b}return a}function A(a){var b,d,e={};for(d in a)c(a,d)&&(b=z(d),b&&(e[b]=a[d]));return e}function B(b){var c,d;if(0===b.indexOf("week"))c=7,d="day";else{if(0!==b.indexOf("month"))return;c=12,d="month"}vb[b]=function(e,f){var g,h,i=vb._locale[b],j=[];if("number"==typeof e&&(f=e,e=a),h=function(a){var b=vb().utc().set(d,a);return i.call(vb._locale,b,e||"")},null!=f)return h(f);for(g=0;c>g;g++)j.push(h(g));return j}}function C(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=b>=0?Math.floor(b):Math.ceil(b)),c}function D(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function E(a,b,c){return jb(vb([a,11,31+b-c]),b,c).week}function F(a){return G(a)?366:365}function G(a){return a%4===0&&a%100!==0||a%400===0}function H(a){var b;a._a&&-2===a._pf.overflow&&(b=a._a[Db]<0||a._a[Db]>11?Db:a._a[Eb]<1||a._a[Eb]>D(a._a[Cb],a._a[Db])?Eb:a._a[Fb]<0||a._a[Fb]>24||24===a._a[Fb]&&(0!==a._a[Gb]||0!==a._a[Hb]||0!==a._a[Ib])?Fb:a._a[Gb]<0||a._a[Gb]>59?Gb:a._a[Hb]<0||a._a[Hb]>59?Hb:a._a[Ib]<0||a._a[Ib]>999?Ib:-1,a._pf._overflowDayOfYear&&(Cb>b||b>Eb)&&(b=Eb),a._pf.overflow=b)}function I(b){return null==b._isValid&&(b._isValid=!isNaN(b._d.getTime())&&b._pf.overflow<0&&!b._pf.empty&&!b._pf.invalidMonth&&!b._pf.nullInput&&!b._pf.invalidFormat&&!b._pf.userInvalidated,b._strict&&(b._isValid=b._isValid&&0===b._pf.charsLeftOver&&0===b._pf.unusedTokens.length&&b._pf.bigHour===a)),b._isValid}function J(a){return a?a.toLowerCase().replace("_","-"):a}function K(a){for(var b,c,d,e,f=0;f0;){if(d=L(e.slice(0,b).join("-")))return d;if(c&&c.length>=b&&y(e,c,!0)>=b-1)break;b--}f++}return null}function L(a){var b=null;if(!Jb[a]&&Lb)try{b=vb.locale(),require("./locale/"+a),vb.locale(b)}catch(c){}return Jb[a]}function M(a,b){var c,d;return b._isUTC?(c=b.clone(),d=(vb.isMoment(a)||x(a)?+a:+vb(a))-+c,c._d.setTime(+c._d+d),vb.updateOffset(c,!1),c):vb(a).local()}function N(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function O(a){var b,c,d=a.match(Pb);for(b=0,c=d.length;c>b;b++)d[b]=rc[d[b]]?rc[d[b]]:N(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 P(a,b){return a.isValid()?(b=Q(b,a.localeData()),nc[b]||(nc[b]=O(b)),nc[b](a)):a.localeData().invalidDate()}function Q(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(Qb.lastIndex=0;d>=0&&Qb.test(a);)a=a.replace(Qb,c),Qb.lastIndex=0,d-=1;return a}function R(a,b){var c,d=b._strict;switch(a){case"Q":return _b;case"DDDD":return bc;case"YYYY":case"GGGG":case"gggg":return d?cc:Tb;case"Y":case"G":case"g":return ec;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return d?dc:Ub;case"S":if(d)return _b;case"SS":if(d)return ac;case"SSS":if(d)return bc;case"DDD":return Sb;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Wb;case"a":case"A":return b._locale._meridiemParse;case"x":return Zb;case"X":return $b;case"Z":case"ZZ":return Xb;case"T":return Yb;case"SSSS":return Vb;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return d?ac:Rb;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return Rb;case"Do":return d?b._locale._ordinalParse:b._locale._ordinalParseLenient;default:return c=new RegExp($(Z(a.replace("\\","")),"i"))}}function S(a){a=a||"";var b=a.match(Xb)||[],c=b[b.length-1]||[],d=(c+"").match(jc)||["-",0,0],e=+(60*d[1])+C(d[2]);return"+"===d[0]?e:-e}function T(a,b,c){var d,e=c._a;switch(a){case"Q":null!=b&&(e[Db]=3*(C(b)-1));break;case"M":case"MM":null!=b&&(e[Db]=C(b)-1);break;case"MMM":case"MMMM":d=c._locale.monthsParse(b,a,c._strict),null!=d?e[Db]=d:c._pf.invalidMonth=b;break;case"D":case"DD":null!=b&&(e[Eb]=C(b));break;case"Do":null!=b&&(e[Eb]=C(parseInt(b.match(/\d{1,2}/)[0],10)));break;case"DDD":case"DDDD":null!=b&&(c._dayOfYear=C(b));break;case"YY":e[Cb]=vb.parseTwoDigitYear(b);break;case"YYYY":case"YYYYY":case"YYYYYY":e[Cb]=C(b);break;case"a":case"A":c._meridiem=b;break;case"h":case"hh":c._pf.bigHour=!0;case"H":case"HH":e[Fb]=C(b);break;case"m":case"mm":e[Gb]=C(b);break;case"s":case"ss":e[Hb]=C(b);break;case"S":case"SS":case"SSS":case"SSSS":e[Ib]=C(1e3*("0."+b));break;case"x":c._d=new Date(C(b));break;case"X":c._d=new Date(1e3*parseFloat(b));break;case"Z":case"ZZ":c._useUTC=!0,c._tzm=S(b);break;case"dd":case"ddd":case"dddd":d=c._locale.weekdaysParse(b),null!=d?(c._w=c._w||{},c._w.d=d):c._pf.invalidWeekday=b;break;case"w":case"ww":case"W":case"WW":case"d":case"e":case"E":a=a.substr(0,1);case"gggg":case"GGGG":case"GGGGG":a=a.substr(0,2),b&&(c._w=c._w||{},c._w[a]=C(b));break;case"gg":case"GG":c._w=c._w||{},c._w[a]=vb.parseTwoDigitYear(b)}}function U(a){var c,d,e,f,g,h,i;c=a._w,null!=c.GG||null!=c.W||null!=c.E?(g=1,h=4,d=b(c.GG,a._a[Cb],jb(vb(),1,4).year),e=b(c.W,1),f=b(c.E,1)):(g=a._locale._week.dow,h=a._locale._week.doy,d=b(c.gg,a._a[Cb],jb(vb(),g,h).year),e=b(c.w,1),null!=c.d?(f=c.d,g>f&&++e):f=null!=c.e?c.e+g:g),i=kb(d,e,f,h,g),a._a[Cb]=i.year,a._dayOfYear=i.dayOfYear}function V(a){var c,d,e,f,g=[];if(!a._d){for(e=X(a),a._w&&null==a._a[Eb]&&null==a._a[Db]&&U(a),a._dayOfYear&&(f=b(a._a[Cb],e[Cb]),a._dayOfYear>F(f)&&(a._pf._overflowDayOfYear=!0),d=fb(f,0,a._dayOfYear),a._a[Db]=d.getUTCMonth(),a._a[Eb]=d.getUTCDate()),c=0;3>c&&null==a._a[c];++c)a._a[c]=g[c]=e[c];for(;7>c;c++)a._a[c]=g[c]=null==a._a[c]?2===c?1:0:a._a[c];24===a._a[Fb]&&0===a._a[Gb]&&0===a._a[Hb]&&0===a._a[Ib]&&(a._nextDay=!0,a._a[Fb]=0),a._d=(a._useUTC?fb:eb).apply(null,g),null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()-a._tzm),a._nextDay&&(a._a[Fb]=24)}}function W(a){var b;a._d||(b=A(a._i),a._a=[b.year,b.month,b.day||b.date,b.hour,b.minute,b.second,b.millisecond],V(a))}function X(a){var b=new Date;return a._useUTC?[b.getUTCFullYear(),b.getUTCMonth(),b.getUTCDate()]:[b.getFullYear(),b.getMonth(),b.getDate()]}function Y(b){if(b._f===vb.ISO_8601)return void ab(b);b._a=[],b._pf.empty=!0;var c,d,e,f,g,h=""+b._i,i=h.length,j=0;for(e=Q(b._f,b._locale).match(Pb)||[],c=0;c0&&b._pf.unusedInput.push(g),h=h.slice(h.indexOf(d)+d.length),j+=d.length),rc[f]?(d?b._pf.empty=!1:b._pf.unusedTokens.push(f),T(f,d,b)):b._strict&&!d&&b._pf.unusedTokens.push(f);b._pf.charsLeftOver=i-j,h.length>0&&b._pf.unusedInput.push(h),b._pf.bigHour===!0&&b._a[Fb]<=12&&(b._pf.bigHour=a),b._a[Fb]=k(b._locale,b._a[Fb],b._meridiem),V(b),H(b)}function Z(a){return a.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e})}function $(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function _(a){var b,c,e,f,g;if(0===a._f.length)return a._pf.invalidFormat=!0,void(a._d=new Date(0/0));for(f=0;fg)&&(e=g,c=b));o(a,c||b)}function ab(a){var b,c,d=a._i,e=fc.exec(d);if(e){for(a._pf.iso=!0,b=0,c=hc.length;c>b;b++)if(hc[b][1].exec(d)){a._f=hc[b][0]+(e[6]||" ");break}for(b=0,c=ic.length;c>b;b++)if(ic[b][1].exec(d)){a._f+=ic[b][0];break}d.match(Xb)&&(a._f+="Z"),Y(a)}else a._isValid=!1}function bb(a){ab(a),a._isValid===!1&&(delete a._isValid,vb.createFromInputFallback(a))}function cb(a,b){var c,d=[];for(c=0;ca&&h.setFullYear(a),h}function fb(a){var b=new Date(Date.UTC.apply(null,arguments));return 1970>a&&b.setUTCFullYear(a),b}function gb(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 hb(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function ib(a,b,c){var d=vb.duration(a).abs(),e=Ab(d.as("s")),f=Ab(d.as("m")),g=Ab(d.as("h")),h=Ab(d.as("d")),i=Ab(d.as("M")),j=Ab(d.as("y")),k=e0,k[4]=c,hb.apply({},k)}function jb(a,b,c){var d,e=c-b,f=c-a.day();return f>e&&(f-=7),e-7>f&&(f+=7),d=vb(a).add(f,"d"),{week:Math.ceil(d.dayOfYear()/7),year:d.year()}}function kb(a,b,c,d,e){var f,g,h=fb(a,0,1).getUTCDay();return h=0===h?7:h,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:F(a-1)+g}}function lb(b){var c,d=b._i,e=b._f;return b._locale=b._locale||vb.localeData(b._l),null===d||e===a&&""===d?vb.invalid({nullInput:!0}):("string"==typeof d&&(b._i=d=b._locale.preparse(d)),vb.isMoment(d)?new m(d,!0):(e?w(e)?_(b):Y(b):db(b),c=new m(b),c._nextDay&&(c.add(1,"d"),c._nextDay=a),c))}function mb(a,b){var c,d;if(1===b.length&&w(b[0])&&(b=b[0]),!b.length)return vb();for(c=b[0],d=1;d=0?"+":"-";return b+r(Math.abs(a),6)},gg:function(){return r(this.weekYear()%100,2)},gggg:function(){return r(this.weekYear(),4)},ggggg:function(){return r(this.weekYear(),5)},GG:function(){return r(this.isoWeekYear()%100,2)},GGGG:function(){return r(this.isoWeekYear(),4)},GGGGG:function(){return r(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.localeData().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.localeData().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 C(this.milliseconds()/100)},SS:function(){return r(C(this.milliseconds()/10),2)},SSS:function(){return r(this.milliseconds(),3)},SSSS:function(){return r(this.milliseconds(),3)},Z:function(){var a=this.utcOffset(),b="+";return 0>a&&(a=-a,b="-"),b+r(C(a/60),2)+":"+r(C(a)%60,2)},ZZ:function(){var a=this.utcOffset(),b="+";return 0>a&&(a=-a,b="-"),b+r(C(a/60),2)+r(C(a)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},x:function(){return this.valueOf()},X:function(){return this.unix()},Q:function(){return this.quarter()}},sc={},tc=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"],uc=!1;pc.length;)xb=pc.pop(),rc[xb+"o"]=i(rc[xb],xb);for(;qc.length;)xb=qc.pop(),rc[xb+xb]=h(rc[xb],2);rc.DDDD=h(rc.DDD,3),o(l.prototype,{set:function(a){var b,c;for(c in a)b=a[c],"function"==typeof b?this[c]=b:this["_"+c]=b;this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)},_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,b,c){var d,e,f;for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),d=0;12>d;d++){if(e=vb.utc([2e3,d]),c&&!this._longMonthsParse[d]&&(this._longMonthsParse[d]=new RegExp("^"+this.months(e,"").replace(".","")+"$","i"),this._shortMonthsParse[d]=new RegExp("^"+this.monthsShort(e,"").replace(".","")+"$","i")),c||this._monthsParse[d]||(f="^"+this.months(e,"")+"|^"+this.monthsShort(e,""),this._monthsParse[d]=new RegExp(f.replace(".",""),"i")),c&&"MMMM"===b&&this._longMonthsParse[d].test(a))return d;if(c&&"MMM"===b&&this._shortMonthsParse[d].test(a))return d;if(!c&&this._monthsParse[d].test(a))return d}},_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=vb([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:{LTS:"h:mm:ss A",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,c){var d=this._calendar[a];return"function"==typeof d?d.apply(b,[c]):d},_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",_ordinalParse:/\d{1,2}/,preparse:function(a){return a},postformat:function(a){return a},week:function(a){return jb(a,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},firstDayOfWeek:function(){return this._week.dow},firstDayOfYear:function(){return this._week.doy},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),vb=function(b,c,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._i=b,g._f=c,g._l=e,g._strict=f,g._isUTC=!1,g._pf=d(),lb(g)},vb.suppressDeprecationWarnings=!1,vb.createFromInputFallback=f("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(a){a._d=new Date(a._i+(a._useUTC?" UTC":""))}),vb.min=function(){var a=[].slice.call(arguments,0);return mb("isBefore",a)},vb.max=function(){var a=[].slice.call(arguments,0);return mb("isAfter",a)},vb.utc=function(b,c,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=b,g._f=c,g._strict=f,g._pf=d(),lb(g).utc()},vb.unix=function(a){return vb(1e3*a)},vb.duration=function(a,b){var d,e,f,g,h=a,i=null;return vb.isDuration(a)?h={ms:a._milliseconds,d:a._days,M:a._months}:"number"==typeof a?(h={},b?h[b]=a:h.milliseconds=a):(i=Nb.exec(a))?(d="-"===i[1]?-1:1,h={y:0,d:C(i[Eb])*d,h:C(i[Fb])*d,m:C(i[Gb])*d,s:C(i[Hb])*d,ms:C(i[Ib])*d}):(i=Ob.exec(a))?(d="-"===i[1]?-1:1,f=function(a){var b=a&&parseFloat(a.replace(",","."));return(isNaN(b)?0:b)*d},h={y:f(i[2]),M:f(i[3]),d:f(i[4]),h:f(i[5]),m:f(i[6]),s:f(i[7]),w:f(i[8])}):null==h?h={}:"object"==typeof h&&("from"in h||"to"in h)&&(g=t(vb(h.from),vb(h.to)),h={},h.ms=g.milliseconds,h.M=g.months),e=new n(h),vb.isDuration(a)&&c(a,"_locale")&&(e._locale=a._locale),e},vb.version=yb,vb.defaultFormat=gc,vb.ISO_8601=function(){},vb.momentProperties=Kb,vb.updateOffset=function(){},vb.relativeTimeThreshold=function(b,c){return oc[b]===a?!1:c===a?oc[b]:(oc[b]=c,!0)},vb.lang=f("moment.lang is deprecated. Use moment.locale instead.",function(a,b){return vb.locale(a,b)}),vb.locale=function(a,b){var c;return a&&(c="undefined"!=typeof b?vb.defineLocale(a,b):vb.localeData(a),c&&(vb.duration._locale=vb._locale=c)),vb._locale._abbr},vb.defineLocale=function(a,b){return null!==b?(b.abbr=a,Jb[a]||(Jb[a]=new l),Jb[a].set(b),vb.locale(a),Jb[a]):(delete Jb[a],null)},vb.langData=f("moment.langData is deprecated. Use moment.localeData instead.",function(a){return vb.localeData(a)}),vb.localeData=function(a){var b;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return vb._locale;if(!w(a)){if(b=L(a))return b;a=[a]}return K(a)},vb.isMoment=function(a){return a instanceof m||null!=a&&c(a,"_isAMomentObject")},vb.isDuration=function(a){return a instanceof n};for(xb=tc.length-1;xb>=0;--xb)B(tc[xb]);vb.normalizeUnits=function(a){return z(a)},vb.invalid=function(a){var b=vb.utc(0/0);return null!=a?o(b._pf,a):b._pf.userInvalidated=!0,b},vb.parseZone=function(){return vb.apply(null,arguments).parseZone()},vb.parseTwoDigitYear=function(a){return C(a)+(C(a)>68?1900:2e3)},vb.isDate=x,o(vb.fn=m.prototype,{clone:function(){return vb(this)},valueOf:function(){return+this._d-6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().locale("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=vb(this).utc();return 00:!1},parsingFlags:function(){return o({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(a){return this.utcOffset(0,a)},local:function(a){return this._isUTC&&(this.utcOffset(0,a),this._isUTC=!1,a&&this.subtract(this._dateUtcOffset(),"m")),this},format:function(a){var b=P(this,a||vb.defaultFormat);return this.localeData().postformat(b)},add:u(1,"add"),subtract:u(-1,"subtract"),diff:function(a,b,c){var d,e,f=M(a,this),g=6e4*(f.utcOffset()-this.utcOffset());return b=z(b),"year"===b||"month"===b||"quarter"===b?(e=j(this,f),"quarter"===b?e/=3:"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:q(e)},from:function(a,b){return vb.duration({to:this,from:a}).locale(this.locale()).humanize(!b)},fromNow:function(a){return this.from(vb(),a)},calendar:function(a){var b=a||vb(),c=M(b,this).startOf("day"),d=this.diff(c,"days",!0),e=-6>d?"sameElse":-1>d?"lastWeek":0>d?"lastDay":1>d?"sameDay":2>d?"nextDay":7>d?"nextWeek":"sameElse";return this.format(this.localeData().calendar(e,this,vb(b)))},isLeapYear:function(){return G(this.year())},isDST:function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},day:function(a){var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=gb(a,this.localeData()),this.add(a-b,"d")):b},month:qb("Month",!0),startOf:function(a){switch(a=z(a)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===a?this.weekday(0):"isoWeek"===a&&this.isoWeekday(1),"quarter"===a&&this.month(3*Math.floor(this.month()/3)),this},endOf:function(b){return b=z(b),b===a||"millisecond"===b?this:this.startOf(b).add(1,"isoWeek"===b?"week":b).subtract(1,"ms")},isAfter:function(a,b){var c;return b=z("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=vb.isMoment(a)?a:vb(a),+this>+a):(c=vb.isMoment(a)?+a:+vb(a),c<+this.clone().startOf(b))},isBefore:function(a,b){var c;return b=z("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=vb.isMoment(a)?a:vb(a),+a>+this):(c=vb.isMoment(a)?+a:+vb(a),+this.clone().endOf(b)a?this:a}),max:f("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(a){return a=vb.apply(null,arguments),a>this?this:a}),zone:f("moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779",function(a,b){return null!=a?("string"!=typeof a&&(a=-a),this.utcOffset(a,b),this):-this.utcOffset()}),utcOffset:function(a,b){var c,d=this._offset||0;return null!=a?("string"==typeof a&&(a=S(a)),Math.abs(a)<16&&(a=60*a),!this._isUTC&&b&&(c=this._dateUtcOffset()),this._offset=a,this._isUTC=!0,null!=c&&this.add(c,"m"),d!==a&&(!b||this._changeInProgress?v(this,vb.duration(a-d,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,vb.updateOffset(this,!0),this._changeInProgress=null)),this):this._isUTC?d:this._dateUtcOffset()},isLocal:function(){return!this._isUTC},isUtcOffset:function(){return this._isUTC},isUtc:function(){return this._isUTC&&0===this._offset},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.utcOffset(this._tzm):"string"==typeof this._i&&this.utcOffset(S(this._i)),this},hasAlignedHourOffset:function(a){return a=a?vb(a).utcOffset():0,(this.utcOffset()-a)%60===0},daysInMonth:function(){return D(this.year(),this.month())},dayOfYear:function(a){var b=Ab((vb(this).startOf("day")-vb(this).startOf("year"))/864e5)+1;return null==a?b:this.add(a-b,"d")},quarter:function(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)},weekYear:function(a){var b=jb(this,this.localeData()._week.dow,this.localeData()._week.doy).year;return null==a?b:this.add(a-b,"y")},isoWeekYear:function(a){var b=jb(this,1,4).year;return null==a?b:this.add(a-b,"y")},week:function(a){var b=this.localeData().week(this);return null==a?b:this.add(7*(a-b),"d")},isoWeek:function(a){var b=jb(this,1,4).week;return null==a?b:this.add(7*(a-b),"d")},weekday:function(a){var b=(this.day()+7-this.localeData()._week.dow)%7;return null==a?b:this.add(a-b,"d")},isoWeekday:function(a){return null==a?this.day()||7:this.day(this.day()%7?a:a-7)},isoWeeksInYear:function(){return E(this.year(),1,4)},weeksInYear:function(){var a=this.localeData()._week;return E(this.year(),a.dow,a.doy)},get:function(a){return a=z(a),this[a]()},set:function(a,b){var c;if("object"==typeof a)for(c in a)this.set(c,a[c]);else a=z(a),"function"==typeof this[a]&&this[a](b);return this},locale:function(b){var c;return b===a?this._locale._abbr:(c=vb.localeData(b),null!=c&&(this._locale=c),this)},lang:f("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(b){return b===a?this.localeData():this.locale(b)}),localeData:function(){return this._locale},_dateUtcOffset:function(){return 15*-Math.round(this._d.getTimezoneOffset()/15)}}),vb.fn.millisecond=vb.fn.milliseconds=qb("Milliseconds",!1),vb.fn.second=vb.fn.seconds=qb("Seconds",!1),vb.fn.minute=vb.fn.minutes=qb("Minutes",!1),vb.fn.hour=vb.fn.hours=qb("Hours",!0),vb.fn.date=qb("Date",!0),vb.fn.dates=f("dates accessor is deprecated. Use date instead.",qb("Date",!0)),vb.fn.year=qb("FullYear",!0),vb.fn.years=f("years accessor is deprecated. Use year instead.",qb("FullYear",!0)),vb.fn.days=vb.fn.day,vb.fn.months=vb.fn.month,vb.fn.weeks=vb.fn.week,vb.fn.isoWeeks=vb.fn.isoWeek,vb.fn.quarters=vb.fn.quarter,vb.fn.toJSON=vb.fn.toISOString,vb.fn.isUTC=vb.fn.isUtc,o(vb.duration.fn=n.prototype,{_bubble:function(){var a,b,c,d=this._milliseconds,e=this._days,f=this._months,g=this._data,h=0;g.milliseconds=d%1e3,a=q(d/1e3),g.seconds=a%60,b=q(a/60),g.minutes=b%60,c=q(b/60),g.hours=c%24,e+=q(c/24),h=q(rb(e)),e-=q(sb(h)),f+=q(e/30),e%=30,h+=q(f/12),f%=12,g.days=e,g.months=f,g.years=h},abs:function(){return this._milliseconds=Math.abs(this._milliseconds),this._days=Math.abs(this._days),this._months=Math.abs(this._months),this._data.milliseconds=Math.abs(this._data.milliseconds),this._data.seconds=Math.abs(this._data.seconds),this._data.minutes=Math.abs(this._data.minutes),this._data.hours=Math.abs(this._data.hours),this._data.months=Math.abs(this._data.months),this._data.years=Math.abs(this._data.years),this},weeks:function(){return q(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*C(this._months/12) -},humanize:function(a){var b=ib(this,!a,this.localeData());return a&&(b=this.localeData().pastFuture(+this,b)),this.localeData().postformat(b)},add:function(a,b){var c=vb.duration(a,b);return this._milliseconds+=c._milliseconds,this._days+=c._days,this._months+=c._months,this._bubble(),this},subtract:function(a,b){var c=vb.duration(a,b);return this._milliseconds-=c._milliseconds,this._days-=c._days,this._months-=c._months,this._bubble(),this},get:function(a){return a=z(a),this[a.toLowerCase()+"s"]()},as:function(a){var b,c;if(a=z(a),"month"===a||"year"===a)return b=this._days+this._milliseconds/864e5,c=this._months+12*rb(b),"month"===a?c:c/12;switch(b=this._days+Math.round(sb(this._months/12)),a){case"week":return b/7+this._milliseconds/6048e5;case"day":return b+this._milliseconds/864e5;case"hour":return 24*b+this._milliseconds/36e5;case"minute":return 24*b*60+this._milliseconds/6e4;case"second":return 24*b*60*60+this._milliseconds/1e3;case"millisecond":return Math.floor(24*b*60*60*1e3)+this._milliseconds;default:throw new Error("Unknown unit "+a)}},lang:vb.fn.lang,locale:vb.fn.locale,toIsoString:f("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",function(){return this.toISOString()}),toISOString:function(){var a=Math.abs(this.years()),b=Math.abs(this.months()),c=Math.abs(this.days()),d=Math.abs(this.hours()),e=Math.abs(this.minutes()),f=Math.abs(this.seconds()+this.milliseconds()/1e3);return this.asSeconds()?(this.asSeconds()<0?"-":"")+"P"+(a?a+"Y":"")+(b?b+"M":"")+(c?c+"D":"")+(d||e||f?"T":"")+(d?d+"H":"")+(e?e+"M":"")+(f?f+"S":""):"P0D"},localeData:function(){return this._locale},toJSON:function(){return this.toISOString()}}),vb.duration.fn.toString=vb.duration.fn.toISOString;for(xb in kc)c(kc,xb)&&tb(xb.toLowerCase());vb.duration.fn.asMilliseconds=function(){return this.as("ms")},vb.duration.fn.asSeconds=function(){return this.as("s")},vb.duration.fn.asMinutes=function(){return this.as("m")},vb.duration.fn.asHours=function(){return this.as("h")},vb.duration.fn.asDays=function(){return this.as("d")},vb.duration.fn.asWeeks=function(){return this.as("weeks")},vb.duration.fn.asMonths=function(){return this.as("M")},vb.duration.fn.asYears=function(){return this.as("y")},vb.locale("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var b=a%10,c=1===C(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}),function(a){a(vb)}(function(a){return a.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(a){return/^nm$/i.test(a)},meridiem:function(a,b,c){return 12>a?c?"vm":"VM":c?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[Môre om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("ar-ma",{months:"يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:6,doy:12}})}),function(a){a(vb)}(function(a){var b={1:"Ù¡",2:"Ù¢",3:"Ù£",4:"Ù¤",5:"Ù¥",6:"Ù¦",7:"Ù§",8:"Ù¨",9:"Ù©",0:"Ù "},c={"Ù¡":"1","Ù¢":"2","Ù£":"3","Ù¤":"4","Ù¥":"5","Ù¦":"6","Ù§":"7","Ù¨":"8","Ù©":"9","Ù ":"0"};return a.defineLocale("ar-sa",{months:"يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),monthsShort:"يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiemParse:/ص|Ù…/,isPM:function(a){return"Ù…"===a},meridiem:function(a){return 12>a?"ص":"Ù…"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(a){return a.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(a){return c[a]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]}).replace(/,/g,"ØŒ")},week:{dow:6,doy:12}})}),function(a){a(vb)}(function(a){return a.defineLocale("ar-tn",{months:"جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),monthsShort:"جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){var b={1:"Ù¡",2:"Ù¢",3:"Ù£",4:"Ù¤",5:"Ù¥",6:"Ù¦",7:"Ù§",8:"Ù¨",9:"Ù©",0:"Ù "},c={"Ù¡":"1","Ù¢":"2","Ù£":"3","Ù¤":"4","Ù¥":"5","Ù¦":"6","Ù§":"7","Ù¨":"8","Ù©":"9","Ù ":"0"},d=function(a){return 0===a?0:1===a?1:2===a?2:a%100>=3&&10>=a%100?3:a%100>=11?4:5},e={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},f=function(a){return function(b,c){var f=d(b),g=e[a][d(b)];return 2===f&&(g=g[c?0:1]),g.replace(/%d/i,b)}},g=["كانون الثاني يناير","شباط Ùبراير","آذار مارس","نيسان أبريل","أيار مايو","حزيران يونيو","تموز يوليو","آب أغسطس","أيلول سبتمبر","تشرين الأول أكتوبر","تشرين الثاني نوÙمبر","كانون الأول ديسمبر"];return a.defineLocale("ar",{months:g,monthsShort:g,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiemParse:/ص|Ù…/,isPM:function(a){return"Ù…"===a},meridiem:function(a){return 12>a?"ص":"Ù…"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:f("s"),m:f("m"),mm:f("m"),h:f("h"),hh:f("h"),d:f("d"),dd:f("d"),M:f("M"),MM:f("M"),y:f("y"),yy:f("y")},preparse:function(a){return a.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(a){return c[a]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]}).replace(/,/g,"ØŒ")},week:{dow:6,doy:12}})}),function(a){a(vb)}(function(a){var b={1:"-inci",5:"-inci",8:"-inci",70:"-inci",80:"-inci",2:"-nci",7:"-nci",20:"-nci",50:"-nci",3:"-üncü",4:"-üncü",100:"-üncü",6:"-ncı",9:"-uncu",10:"-uncu",30:"-uncu",60:"-ıncı",90:"-ıncı"};return a.defineLocale("az",{months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekdays:"Bazar_Bazar ertÉ™si_ÇərÅŸÉ™nbÉ™ axÅŸamı_ÇərÅŸÉ™nbÉ™_CümÉ™ axÅŸamı_CümÉ™_ŞənbÉ™".split("_"),weekdaysShort:"Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən".split("_"),weekdaysMin:"Bz_BE_ÇA_Çə_CA_Cü_Şə".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[sabah saat] LT",nextWeek:"[gÉ™lÉ™n hÉ™ftÉ™] dddd [saat] LT",lastDay:"[dünÉ™n] LT",lastWeek:"[keçən hÉ™ftÉ™] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s É™vvÉ™l",s:"birneçə saniyyÉ™",m:"bir dÉ™qiqÉ™",mm:"%d dÉ™qiqÉ™",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},meridiemParse:/gecÉ™|sÉ™hÉ™r|gündüz|axÅŸam/,isPM:function(a){return/^(gündüz|axÅŸam)$/.test(a)},meridiem:function(a){return 4>a?"gecÉ™":12>a?"sÉ™hÉ™r":17>a?"gündüz":"axÅŸam"},ordinalParse:/\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,ordinal:function(a){if(0===a)return a+"-ıncı";var c=a%10,d=a%100-c,e=a>=100?100:null;return a+(b[c]||b[d]||b[e])},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){function b(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:c?"хвіліна_хвіліны_хвілін":"хвіліну_хвіліны_хвілін",hh:c?"гадзіна_гадзіны_гадзін":"гадзіну_гадзіны_гадзін",dd:"дзень_дні_дзён",MM:"меÑÑц_меÑÑцы_меÑÑцаў",yy:"год_гады_гадоў"};return"m"===d?c?"хвіліна":"хвіліну":"h"===d?c?"гадзіна":"гадзіну":a+" "+b(e[d],+a)}function d(a,b){var c={nominative:"Ñтудзень_люты_Ñакавік_краÑавік_травень_чÑрвень_ліпень_жнівень_вераÑень_каÑтрычнік_ліÑтапад_Ñнежань".split("_"),accusative:"ÑтудзенÑ_лютага_Ñакавіка_краÑавіка_траўнÑ_чÑрвенÑ_ліпенÑ_жніўнÑ_вераÑнÑ_каÑтрычніка_ліÑтапада_ÑнежнÑ".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function e(a,b){var c={nominative:"нÑдзелÑ_панÑдзелак_аўторак_Ñерада_чацвер_пÑтніца_Ñубота".split("_"),accusative:"нÑдзелю_панÑдзелак_аўторак_Ñераду_чацвер_пÑтніцу_Ñуботу".split("_")},d=/\[ ?[Вв] ?(?:мінулую|наÑтупную)? ?\] ?dddd/.test(b)?"accusative":"nominative";return c[d][a.day()]}return a.defineLocale("be",{months:d,monthsShort:"Ñтуд_лют_Ñак_краÑ_трав_чÑрв_ліп_жнів_вер_каÑÑ‚_ліÑÑ‚_Ñнеж".split("_"),weekdays:e,weekdaysShort:"нд_пн_ат_ÑÑ€_чц_пт_Ñб".split("_"),weekdaysMin:"нд_пн_ат_ÑÑ€_чц_пт_Ñб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., LT",LLLL:"dddd, D MMMM YYYY г., LT"},calendar:{sameDay:"[Ð¡Ñ‘Ð½Ð½Ñ Ñž] LT",nextDay:"[Заўтра Ñž] LT",lastDay:"[Учора Ñž] LT",nextWeek:function(){return"[У] dddd [Ñž] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[У мінулую] dddd [Ñž] LT";case 1:case 2:case 4:return"[У мінулы] dddd [Ñž] LT"}},sameElse:"L"},relativeTime:{future:"праз %s",past:"%s таму",s:"некалькі Ñекунд",m:c,mm:c,h:c,hh:c,d:"дзень",dd:c,M:"меÑÑц",MM:c,y:"год",yy:c},meridiemParse:/ночы|раніцы|днÑ|вечара/,isPM:function(a){return/^(днÑ|вечара)$/.test(a)},meridiem:function(a){return 4>a?"ночы":12>a?"раніцы":17>a?"днÑ":"вечара"},ordinalParse:/\d{1,2}-(Ñ–|Ñ‹|га)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":case"w":case"W":return a%10!==2&&a%10!==3||a%100===12||a%100===13?a+"-Ñ‹":a+"-Ñ–";case"D":return a+"-га";default:return a}},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("bg",{months:"Ñнуари_февруари_март_април_май_юни_юли_авгуÑÑ‚_Ñептември_октомври_ноември_декември".split("_"),monthsShort:"Ñнр_фев_мар_апр_май_юни_юли_авг_Ñеп_окт_ное_дек".split("_"),weekdays:"неделÑ_понеделник_вторник_ÑÑ€Ñда_четвъртък_петък_Ñъбота".split("_"),weekdaysShort:"нед_пон_вто_ÑÑ€Ñ_чет_пет_Ñъб".split("_"),weekdaysMin:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Ð”Ð½ÐµÑ Ð²] LT",nextDay:"[Утре в] LT",nextWeek:"dddd [в] LT",lastDay:"[Вчера в] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Ð’ изминалата] dddd [в] LT";case 1:case 2:case 4:case 5:return"[Ð’ изминалиÑ] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"Ñлед %s",past:"преди %s",s:"нÑколко Ñекунди",m:"минута",mm:"%d минути",h:"чаÑ",hh:"%d чаÑа",d:"ден",dd:"%d дни",M:"меÑец",MM:"%d меÑеца",y:"година",yy:"%d години"},ordinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(a){var b=a%10,c=a%100;return 0===a?a+"-ев":0===c?a+"-ен":c>10&&20>c?a+"-ти":1===b?a+"-ви":2===b?a+"-ри":7===b||8===b?a+"-ми":a+"-ти"},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){var b={1:"১",2:"২",3:"৩",4:"৪",5:"৫",6:"৬",7:"৭",8:"৮",9:"৯",0:"০"},c={"১":"1","২":"2","৩":"3","৪":"4","৫":"5","৬":"6","৭":"7","৮":"8","৯":"9","০":"0"};return a.defineLocale("bn",{months:"জানà§à§Ÿà¦¾à¦°à§€_ফেবà§à§Ÿà¦¾à¦°à§€_মারà§à¦š_à¦à¦ªà§à¦°à¦¿à¦²_মে_জà§à¦¨_জà§à¦²à¦¾à¦‡_অগাসà§à¦Ÿ_সেপà§à¦Ÿà§‡à¦®à§à¦¬à¦°_অকà§à¦Ÿà§‹à¦¬à¦°_নভেমà§à¦¬à¦°_ডিসেমà§à¦¬à¦°".split("_"),monthsShort:"জানà§_ফেব_মারà§à¦š_à¦à¦ªà¦°_মে_জà§à¦¨_জà§à¦²_অগ_সেপà§à¦Ÿ_অকà§à¦Ÿà§‹_নভ_ডিসেমà§".split("_"),weekdays:"রবিবার_সোমবার_মঙà§à¦—লবার_বà§à¦§à¦¬à¦¾à¦°_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿à¦¬à¦¾à¦°_শà§à¦•à§à¦°à§à¦¬à¦¾à¦°_শনিবার".split("_"),weekdaysShort:"রবি_সোম_মঙà§à¦—ল_বà§à¦§_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿_শà§à¦•à§à¦°à§_শনি".split("_"),weekdaysMin:"রব_সম_মঙà§à¦—_বà§_বà§à¦°à¦¿à¦¹_শà§_শনি".split("_"),longDateFormat:{LT:"A h:mm সময়",LTS:"A h:mm:ss সময়",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[আজ] LT",nextDay:"[আগামীকাল] LT",nextWeek:"dddd, LT",lastDay:"[গতকাল] LT",lastWeek:"[গত] dddd, LT",sameElse:"L"},relativeTime:{future:"%s পরে",past:"%s আগে",s:"কà¦à¦• সেকেনà§à¦¡",m:"à¦à¦• মিনিট",mm:"%d মিনিট",h:"à¦à¦• ঘনà§à¦Ÿà¦¾",hh:"%d ঘনà§à¦Ÿà¦¾",d:"à¦à¦• দিন",dd:"%d দিন",M:"à¦à¦• মাস",MM:"%d মাস",y:"à¦à¦• বছর",yy:"%d বছর"},preparse:function(a){return a.replace(/[১২৩৪৫৬৭৮৯০]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/রাত|শকাল|দà§à¦ªà§à¦°|বিকেল|রাত/,isPM:function(a){return/^(দà§à¦ªà§à¦°|বিকেল|রাত)$/.test(a)},meridiem:function(a){return 4>a?"রাত":10>a?"শকাল":17>a?"দà§à¦ªà§à¦°":20>a?"বিকেল":"রাত"},week:{dow:0,doy:6}})}),function(a){a(vb)}(function(a){var b={1:"༡",2:"༢",3:"༣",4:"༤",5:"༥",6:"༦",7:"༧",8:"༨",9:"༩",0:"༠"},c={"༡":"1","༢":"2","༣":"3","༤":"4","༥":"5","༦":"6","༧":"7","༨":"8","༩":"9","༠":"0"};return a.defineLocale("bo",{months:"ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ".split("_"),monthsShort:"ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ".split("_"),weekdays:"གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་".split("_"),weekdaysShort:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),weekdaysMin:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),longDateFormat:{LT:"A h:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[དི་རིང] LT",nextDay:"[སང་ཉིན] LT",nextWeek:"[བདུན་ཕྲག་རྗེས་མ], LT",lastDay:"[à½à¼‹à½¦à½„] LT",lastWeek:"[བདུན་ཕྲག་མà½à½ à¼‹à½˜] dddd, LT",sameElse:"L"},relativeTime:{future:"%s ལ་",past:"%s སྔན་ལ",s:"ལམ་སང",m:"སà¾à½¢à¼‹à½˜à¼‹à½‚ཅིག",mm:"%d སà¾à½¢à¼‹à½˜",h:"ཆུ་ཚོད་གཅིག",hh:"%d ཆུ་ཚོད",d:"ཉིན་གཅིག",dd:"%d ཉིན་",M:"ཟླ་བ་གཅིག",MM:"%d ཟླ་བ",y:"ལོ་གཅིག",yy:"%d ལོ"},preparse:function(a){return a.replace(/[༡༢༣༤༥༦༧༨༩༠]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,isPM:function(a){return/^(ཉིན་གུང|དགོང་དག|མཚན་མོ)$/.test(a)},meridiem:function(a){return 4>a?"མཚན་མོ":10>a?"ཞོགས་ཀས":17>a?"ཉིན་གུང":20>a?"དགོང་དག":"མཚན་མོ"},week:{dow:0,doy:6}})}),function(a){a(vb)}(function(b){function c(a,b,c){var d={mm:"munutenn",MM:"miz",dd:"devezh"};return a+" "+f(d[c],a)}function d(a){switch(e(a)){case 1:case 3:case 4:case 5:case 9:return a+" bloaz";default:return a+" vloaz"}}function e(a){return a>9?e(a%10):a}function f(a,b){return 2===b?g(a):a}function g(b){var c={m:"v",b:"v",d:"z"};return c[b.charAt(0)]===a?b:c[b.charAt(0)]+b.substring(1)}return b.defineLocale("br",{months:"Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),longDateFormat:{LT:"h[e]mm A",LTS:"h[e]mm:ss A",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY LT",LLLL:"dddd, D [a viz] MMMM YYYY LT"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc'hoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec'h da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s 'zo",s:"un nebeud segondennoù",m:"ur vunutenn",mm:c,h:"un eur",hh:"%d eur",d:"un devezh",dd:c,M:"ur miz",MM:c,y:"ur bloaz",yy:d},ordinalParse:/\d{1,2}(añ|vet)/,ordinal:function(a){var b=1===a?"añ":"vet";return a+b},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d=a+" ";switch(c){case"m":return b?"jedna minuta":"jedne minute";case"mm":return d+=1===a?"minuta":2===a||3===a||4===a?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return d+=1===a?"sat":2===a||3===a||4===a?"sata":"sati";case"dd":return d+=1===a?"dan":"dana";case"MM":return d+=1===a?"mjesec":2===a||3===a||4===a?"mjeseca":"mjeseci";case"yy":return d+=1===a?"godina":2===a||3===a||4===a?"godine":"godina"}}return a.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),weekdays:"nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._Äet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_Äe_pe_su".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[proÅ¡lu] dddd [u] LT";case 6:return"[proÅ¡le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[proÅ¡li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:b,mm:b,h:b,hh:b,d:"dan",dd:b,M:"mjesec",MM:b,y:"godinu",yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("ca",{months:"gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),monthsShort:"gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.".split("_"),weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[demà a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"fa %s",s:"uns segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},ordinalParse:/\d{1,2}(r|n|t|è|a)/,ordinal:function(a,b){var c=1===a?"r":2===a?"n":3===a?"r":4===a?"t":"è";return("w"===b||"W"===b)&&(c="a"),a+c},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a){return a>1&&5>a&&1!==~~(a/10)}function c(a,c,d,e){var f=a+" ";switch(d){case"s":return c||e?"pár sekund":"pár sekundami";case"m":return c?"minuta":e?"minutu":"minutou";case"mm":return c||e?f+(b(a)?"minuty":"minut"):f+"minutami";break;case"h":return c?"hodina":e?"hodinu":"hodinou";case"hh":return c||e?f+(b(a)?"hodiny":"hodin"):f+"hodinami";break;case"d":return c||e?"den":"dnem";case"dd":return c||e?f+(b(a)?"dny":"dní"):f+"dny";break;case"M":return c||e?"mÄ›síc":"mÄ›sícem";case"MM":return c||e?f+(b(a)?"mÄ›síce":"mÄ›síců"):f+"mÄ›síci";break;case"y":return c||e?"rok":"rokem";case"yy":return c||e?f+(b(a)?"roky":"let"):f+"lety"}}var d="leden_únor_bÅ™ezen_duben_kvÄ›ten_Äerven_Äervenec_srpen_září_říjen_listopad_prosinec".split("_"),e="led_úno_bÅ™e_dub_kvÄ›_Ävn_Ävc_srp_zář_říj_lis_pro".split("_");return a.defineLocale("cs",{months:d,monthsShort:e,monthsParse:function(a,b){var c,d=[];for(c=0;12>c;c++)d[c]=new RegExp("^"+a[c]+"$|^"+b[c]+"$","i");return d}(d,e),weekdays:"nedÄ›le_pondÄ›lí_úterý_stÅ™eda_Ätvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_Ät_pá_so".split("_"),weekdaysMin:"ne_po_út_st_Ät_pá_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedÄ›li v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve stÅ™edu v] LT";case 4:return"[ve Ätvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[vÄera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou nedÄ›li v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou stÅ™edu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pÅ™ed %s",s:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("cv",{months:"кăрлач_нарăÑ_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав".split("_"),monthsShort:"кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш".split("_"),weekdays:"вырÑарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_Ñрнекун_шăматкун".split("_"),weekdaysShort:"выр_тун_ытл_юн_кĕç_Ñрн_шăм".split("_"),weekdaysMin:"вр_тн_Ñ‹Ñ‚_юн_кç_ÑÑ€_шм".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD-MM-YYYY",LL:"YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]",LLL:"YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT",LLLL:"dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT"},calendar:{sameDay:"[ПаÑн] LT [Ñехетре]",nextDay:"[Ыран] LT [Ñехетре]",lastDay:"[Ĕнер] LT [Ñехетре]",nextWeek:"[ÇитеÑ] dddd LT [Ñехетре]",lastWeek:"[Иртнĕ] dddd LT [Ñехетре]",sameElse:"L"},relativeTime:{future:function(a){var b=/Ñехет$/i.exec(a)?"рен":/çул$/i.exec(a)?"тан":"ран";return a+b},past:"%s каÑлла",s:"пĕр-ик çеккунт",m:"пĕр минут",mm:"%d минут",h:"пĕр Ñехет",hh:"%d Ñехет",d:"пĕр кун",dd:"%d кун",M:"пĕр уйăх",MM:"%d уйăх",y:"пĕр çул",yy:"%d çул"},ordinalParse:/\d{1,2}-мĕш/,ordinal:"%d-мĕш",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("cy",{months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Heddiw am] LT",nextDay:"[Yfory am] LT",nextWeek:"dddd [am] LT",lastDay:"[Ddoe am] LT",lastWeek:"dddd [diwethaf am] LT",sameElse:"L"},relativeTime:{future:"mewn %s",past:"%s yn ôl",s:"ychydig eiliadau",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"},ordinalParse:/\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,ordinal:function(a){var b=a,c="",d=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"];return b>20?c=40===b||50===b||60===b||80===b||100===b?"fed":"ain":b>0&&(c=d[b]),a+c},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd [d.] D. MMMM YYYY LT"},calendar:{sameDay:"[I dag kl.] LT",nextDay:"[I morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[I gÃ¥r kl.] LT",lastWeek:"[sidste] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"fÃ¥ sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en mÃ¥ned",MM:"%d mÃ¥neder",y:"et Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[a+" Tage",a+" Tagen"],M:["ein Monat","einem Monat"],MM:[a+" Monate",a+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[a+" Jahre",a+" Jahren"]};return b?d[c][0]:d[c][1]}return a.defineLocale("de-at",{months:"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT [Uhr]",sameElse:"L",nextDay:"[Morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[Gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:b,mm:"%d Minuten",h:b,hh:"%d Stunden",d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[a+" Tage",a+" Tagen"],M:["ein Monat","einem Monat"],MM:[a+" Monate",a+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[a+" Jahre",a+" Jahren"]};return b?d[c][0]:d[c][1]}return a.defineLocale("de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT [Uhr]",sameElse:"L",nextDay:"[Morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[Gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:b,mm:"%d Minuten",h:b,hh:"%d Stunden",d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("el",{monthsNominativeEl:"ΙανουάÏιος_ΦεβÏουάÏιος_ΜάÏτιος_ΑπÏίλιος_Μάιος_ΙοÏνιος_ΙοÏλιος_ΑÏγουστος_ΣεπτέμβÏιος_ΟκτώβÏιος_ÎοέμβÏιος_ΔεκέμβÏιος".split("_"),monthsGenitiveEl:"ΙανουαÏίου_ΦεβÏουαÏίου_ΜαÏτίου_ΑπÏιλίου_ΜαÎου_Ιουνίου_Ιουλίου_ΑυγοÏστου_ΣεπτεμβÏίου_ΟκτωβÏίου_ÎοεμβÏίου_ΔεκεμβÏίου".split("_"),months:function(a,b){return/D/.test(b.substring(0,b.indexOf("MMMM")))?this._monthsGenitiveEl[a.month()]:this._monthsNominativeEl[a.month()]},monthsShort:"Ιαν_Φεβ_ΜαÏ_ΑπÏ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Îοε_Δεκ".split("_"),weekdays:"ΚυÏιακή_ΔευτέÏα_ΤÏίτη_ΤετάÏτη_Πέμπτη_ΠαÏασκευή_Σάββατο".split("_"),weekdaysShort:"ΚυÏ_Δευ_ΤÏι_Τετ_Πεμ_ΠαÏ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_ΤÏ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(a,b,c){return a>11?c?"μμ":"ΜΜ":c?"πμ":"ΠΜ"},isPM:function(a){return"μ"===(a+"").toLowerCase()[0]},meridiemParse:/[ΠΜ]\.?Îœ?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendarEl:{sameDay:"[ΣήμεÏα {}] LT",nextDay:"[ΑÏÏιο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[το Ï€ÏοηγοÏμενο] dddd [{}] LT";default:return"[την Ï€ÏοηγοÏμενη] dddd [{}] LT"}},sameElse:"L"},calendar:function(a,b){var c=this._calendarEl[a],d=b&&b.hours();return"function"==typeof c&&(c=c.apply(b)),c.replace("{}",d%12===1?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s Ï€Ïιν",s:"λίγα δευτεÏόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ÏŽÏα",hh:"%d ÏŽÏες",d:"μία μέÏα",dd:"%d μέÏες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χÏόνος",yy:"%d χÏόνια"},ordinalParse:/\d{1,2}η/,ordinal:"%dη",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},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"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"D MMMM, YYYY",LLL:"D MMMM, YYYY LT",LLLL:"dddd, D MMMM, YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},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"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th"; -return a+c}})}),function(a){a(vb)}(function(a){return a.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},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"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_aÅ­gusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aÅ­g_sep_okt_nov_dec".split("_"),weekdays:"Dimanĉo_Lundo_Mardo_Merkredo_Ä´aÅ­do_Vendredo_Sabato".split("_"),weekdaysShort:"Dim_Lun_Mard_Merk_Ä´aÅ­_Ven_Sab".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Ä´a_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"D[-an de] MMMM, YYYY",LLL:"D[-an de] MMMM, YYYY LT",LLLL:"dddd, [la] D[-an de] MMMM, YYYY LT"},meridiemParse:/[ap]\.t\.m/i,isPM:function(a){return"p"===a.charAt(0).toLowerCase()},meridiem:function(a,b,c){return a>11?c?"p.t.m.":"P.T.M.":c?"a.t.m.":"A.T.M."},calendar:{sameDay:"[HodiaÅ­ je] LT",nextDay:"[MorgaÅ­ je] LT",nextWeek:"dddd [je] LT",lastDay:"[HieraÅ­ je] LT",lastWeek:"[pasinta] dddd [je] LT",sameElse:"L"},relativeTime:{future:"je %s",past:"antaÅ­ %s",s:"sekundoj",m:"minuto",mm:"%d minutoj",h:"horo",hh:"%d horoj",d:"tago",dd:"%d tagoj",M:"monato",MM:"%d monatoj",y:"jaro",yy:"%d jaroj"},ordinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){var b="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),c="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");return a.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(a,d){return/-MMM-/.test(d)?c[a.month()]:b[a.month()]},weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c,d){var e={s:["mõne sekundi","mõni sekund","paar sekundit"],m:["ühe minuti","üks minut"],mm:[a+" minuti",a+" minutit"],h:["ühe tunni","tund aega","üks tund"],hh:[a+" tunni",a+" tundi"],d:["ühe päeva","üks päev"],M:["kuu aja","kuu aega","üks kuu"],MM:[a+" kuu",a+" kuud"],y:["ühe aasta","aasta","üks aasta"],yy:[a+" aasta",a+" aastat"]};return b?e[c][2]?e[c][2]:e[c][1]:d?e[c][0]:e[c][1]}return a.defineLocale("et",{months:"jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Täna,] LT",nextDay:"[Homme,] LT",nextWeek:"[Järgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s pärast",past:"%s tagasi",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:"%d päeva",M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] LT",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] LT",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] LT",llll:"ddd, YYYY[ko] MMM D[a] LT"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){var b={1:"Û±",2:"Û²",3:"Û³",4:"Û´",5:"Ûµ",6:"Û¶",7:"Û·",8:"Û¸",9:"Û¹",0:"Û°"},c={"Û±":"1","Û²":"2","Û³":"3","Û´":"4","Ûµ":"5","Û¶":"6","Û·":"7","Û¸":"8","Û¹":"9","Û°":"0"};return a.defineLocale("fa",{months:"ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ÛŒ_د_س_Ú†_Ù¾_ج_Ø´".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},meridiemParse:/قبل از ظهر|بعد از ظهر/,isPM:function(a){return/بعد از ظهر/.test(a)},meridiem:function(a){return 12>a?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[Ùردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چندین ثانیه",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(a){return a.replace(/[Û°-Û¹]/g,function(a){return c[a]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]}).replace(/,/g,"ØŒ")},ordinalParse:/\d{1,2}Ù…/,ordinal:"%dÙ…",week:{dow:6,doy:12}})}),function(a){a(vb)}(function(a){function b(a,b,d,e){var f="";switch(d){case"s":return e?"muutaman sekunnin":"muutama sekunti";case"m":return e?"minuutin":"minuutti";case"mm":f=e?"minuutin":"minuuttia";break;case"h":return e?"tunnin":"tunti";case"hh":f=e?"tunnin":"tuntia";break;case"d":return e?"päivän":"päivä";case"dd":f=e?"päivän":"päivää";break;case"M":return e?"kuukauden":"kuukausi";case"MM":f=e?"kuukauden":"kuukautta";break;case"y":return e?"vuoden":"vuosi";case"yy":f=e?"vuoden":"vuotta"}return f=c(a,e)+" "+f}function c(a,b){return 10>a?b?e[a]:d[a]:a}var d="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),e=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",d[7],d[8],d[9]];return a.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] LT",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] LT",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] LT",llll:"ddd, Do MMM YYYY, [klo] LT"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("fo",{months:"januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur".split("_"),weekdaysShort:"sun_mán_týs_mik_hós_frí_ley".split("_"),weekdaysMin:"su_má_tý_mi_hó_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D. MMMM, YYYY LT"},calendar:{sameDay:"[à dag kl.] LT",nextDay:"[à morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[à gjár kl.] LT",lastWeek:"[síðstu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s síðani",s:"fá sekund",m:"ein minutt",mm:"%d minuttir",h:"ein tími",hh:"%d tímar",d:"ein dagur",dd:"%d dagar",M:"ein mánaði",MM:"%d mánaðir",y:"eitt ár",yy:"%d ár"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|)/,ordinal:function(a){return a+(1===a?"er":"")}})}),function(a){a(vb)}(function(a){return a.defineLocale("fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|)/,ordinal:function(a){return a+(1===a?"er":"")},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){var b="jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.".split("_"),c="jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_");return a.defineLocale("fy",{months:"jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber".split("_"),monthsShort:function(a,d){return/-MMM-/.test(d)?c[a.month()]:b[a.month()]},weekdays:"snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon".split("_"),weekdaysShort:"si._mo._ti._wo._to._fr._so.".split("_"),weekdaysMin:"Si_Mo_Ti_Wo_To_Fr_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[hjoed om] LT",nextDay:"[moarn om] LT",nextWeek:"dddd [om] LT",lastDay:"[juster om] LT",lastWeek:"[ôfrûne] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oer %s",past:"%s lyn",s:"in pear sekonden",m:"ien minút",mm:"%d minuten",h:"ien oere",hh:"%d oeren",d:"ien dei",dd:"%d dagen",M:"ien moanne",MM:"%d moannen",y:"ien jier",yy:"%d jierren"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("gl",{months:"Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro".split("_"),monthsShort:"Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.".split("_"),weekdays:"Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado".split("_"),weekdaysShort:"Dom._Lun._Mar._Mér._Xov._Ven._Sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mé_Xo_Ve_Sá".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"ás":"á")+"] LT"},nextDay:function(){return"[mañá "+(1!==this.hours()?"ás":"á")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"ás":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"á":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"ás":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(a){return"uns segundos"===a?"nuns segundos":"en "+a},past:"hai %s",s:"uns segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("he",{months:"ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר".split("_"),monthsShort:"ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳".split("_"),weekdays:"ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),weekdaysShort:"×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),weekdaysMin:"×_ב_×’_ד_×”_ו_ש".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY LT",LLLL:"dddd, D [ב]MMMM YYYY LT",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY LT",llll:"ddd, D MMM YYYY LT"},calendar:{sameDay:"[×”×™×•× ×‘Ö¾]LT",nextDay:"[מחר ב־]LT",nextWeek:"dddd [בשעה] LT",lastDay:"[×תמול ב־]LT",lastWeek:"[ביו×] dddd [×”×חרון בשעה] LT",sameElse:"L"},relativeTime:{future:"בעוד %s",past:"לפני %s",s:"מספר שניות",m:"דקה",mm:"%d דקות",h:"שעה",hh:function(a){return 2===a?"שעתיי×":a+" שעות"},d:"יו×",dd:function(a){return 2===a?"יומיי×":a+" ימי×"},M:"חודש",MM:function(a){return 2===a?"חודשיי×":a+" חודשי×"},y:"שנה",yy:function(a){return 2===a?"שנתיי×":a%10===0&&10!==a?a+" שנה":a+" שני×"}}})}),function(a){a(vb)}(function(a){var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return a.defineLocale("hi",{months:"जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°".split("_"),monthsShort:"जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.".split("_"),weekdays:"रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि".split("_"),weekdaysMin:"र_सो_मं_बà¥_गà¥_शà¥_श".split("_"),longDateFormat:{LT:"A h:mm बजे",LTS:"A h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कà¥à¤› ही कà¥à¤·à¤£",m:"à¤à¤• मिनट",mm:"%d मिनट",h:"à¤à¤• घंटा",hh:"%d घंटे",d:"à¤à¤• दिन",dd:"%d दिन",M:"à¤à¤• महीने",MM:"%d महीने",y:"à¤à¤• वरà¥à¤·",yy:"%d वरà¥à¤·"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/रात|सà¥à¤¬à¤¹|दोपहर|शाम/,meridiemHour:function(a,b){return 12===a&&(a=0),"रात"===b?4>a?a:a+12:"सà¥à¤¬à¤¹"===b?a:"दोपहर"===b?a>=10?a:a+12:"शाम"===b?a+12:void 0},meridiem:function(a){return 4>a?"रात":10>a?"सà¥à¤¬à¤¹":17>a?"दोपहर":20>a?"शाम":"रात"},week:{dow:0,doy:6}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d=a+" ";switch(c){case"m":return b?"jedna minuta":"jedne minute";case"mm":return d+=1===a?"minuta":2===a||3===a||4===a?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return d+=1===a?"sat":2===a||3===a||4===a?"sata":"sati";case"dd":return d+=1===a?"dan":"dana";case"MM":return d+=1===a?"mjesec":2===a||3===a||4===a?"mjeseca":"mjeseci";case"yy":return d+=1===a?"godina":2===a||3===a||4===a?"godine":"godina"}}return a.defineLocale("hr",{months:"sjeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_"),monthsShort:"sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),weekdays:"nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._Äet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_Äe_pe_su".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[proÅ¡lu] dddd [u] LT";case 6:return"[proÅ¡le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[proÅ¡li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:b,mm:b,h:b,hh:b,d:"dan",dd:b,M:"mjesec",MM:b,y:"godinu",yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){function b(a,b,c,d){var e=a;switch(c){case"s":return d||b?"néhány másodperc":"néhány másodperce";case"m":return"egy"+(d||b?" perc":" perce");case"mm":return e+(d||b?" perc":" perce");case"h":return"egy"+(d||b?" óra":" órája");case"hh":return e+(d||b?" óra":" órája");case"d":return"egy"+(d||b?" nap":" napja");case"dd":return e+(d||b?" nap":" napja");case"M":return"egy"+(d||b?" hónap":" hónapja");case"MM":return e+(d||b?" hónap":" hónapja");case"y":return"egy"+(d||b?" év":" éve");case"yy":return e+(d||b?" év":" éve")}return""}function c(a){return(a?"":"[múlt] ")+"["+d[this.day()]+"] LT[-kor]"}var d="vasárnap hétfÅ‘n kedden szerdán csütörtökön pénteken szombaton".split(" ");return a.defineLocale("hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfÅ‘_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D., LT",LLLL:"YYYY. MMMM D., dddd LT"},meridiemParse:/de|du/i,isPM:function(a){return"u"===a.charAt(1).toLowerCase()},meridiem:function(a,b,c){return 12>a?c===!0?"de":"DE":c===!0?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return c.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return c.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){function b(a,b){var c={nominative:"Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€_Õ´Õ¡Ö€Õ¿_Õ¡ÕºÖ€Õ«Õ¬_Õ´Õ¡ÕµÕ«Õ½_Õ°Õ¸Ö‚Õ¶Õ«Õ½_Õ°Õ¸Ö‚Õ¬Õ«Õ½_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€".split("_"),accusative:"Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€Õ«_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€Õ«_Õ´Õ¡Ö€Õ¿Õ«_Õ¡ÕºÖ€Õ«Õ¬Õ«_Õ´Õ¡ÕµÕ«Õ½Õ«_Õ°Õ¸Ö‚Õ¶Õ«Õ½Õ«_Õ°Õ¸Ö‚Õ¬Õ«Õ½Õ«_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½Õ«_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function c(a){var b="Õ°Õ¶Õ¾_ÖƒÕ¿Ö€_Õ´Ö€Õ¿_Õ¡ÕºÖ€_Õ´ÕµÕ½_Õ°Õ¶Õ½_Õ°Õ¬Õ½_Ö…Õ£Õ½_Õ½ÕºÕ¿_Õ°Õ¯Õ¿_Õ¶Õ´Õ¢_Õ¤Õ¯Õ¿".split("_");return b[a.month()]}function d(a){var b="Õ¯Õ«Ö€Õ¡Õ¯Õ«_Õ¥Ö€Õ¯Õ¸Ö‚Õ·Õ¡Õ¢Õ©Õ«_Õ¥Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ¹Õ¸Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ°Õ«Õ¶Õ£Õ·Õ¡Õ¢Õ©Õ«_Õ¸Ö‚Ö€Õ¢Õ¡Õ©_Õ·Õ¡Õ¢Õ¡Õ©".split("_");return b[a.day()]}return a.defineLocale("hy-am",{months:b,monthsShort:c,weekdays:d,weekdaysShort:"Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©".split("_"),weekdaysMin:"Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY Õ©.",LLL:"D MMMM YYYY Õ©., LT",LLLL:"dddd, D MMMM YYYY Õ©., LT"},calendar:{sameDay:"[Õ¡ÕµÕ½Ö…Ö€] LT",nextDay:"[Õ¾Õ¡Õ²Õ¨] LT",lastDay:"[Õ¥Ö€Õ¥Õ¯] LT",nextWeek:function(){return"dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT"},lastWeek:function(){return"[Õ¡Õ¶ÖÕ¡Õ®] dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT"},sameElse:"L"},relativeTime:{future:"%s Õ°Õ¥Õ¿Õ¸",past:"%s Õ¡Õ¼Õ¡Õ»",s:"Õ´Õ« Ö„Õ¡Õ¶Õ« Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶",m:"Ö€Õ¸ÕºÕ¥",mm:"%d Ö€Õ¸ÕºÕ¥",h:"ÕªÕ¡Õ´",hh:"%d ÕªÕ¡Õ´",d:"Ö…Ö€",dd:"%d Ö…Ö€",M:"Õ¡Õ´Õ«Õ½",MM:"%d Õ¡Õ´Õ«Õ½",y:"Õ¿Õ¡Ö€Õ«",yy:"%d Õ¿Õ¡Ö€Õ«"},meridiemParse:/Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡|Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡|ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶/,isPM:function(a){return/^(ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡|Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶)$/.test(a)},meridiem:function(a){return 4>a?"Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡":12>a?"Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡":17>a?"ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡":"Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶"},ordinalParse:/\d{1,2}|\d{1,2}-(Õ«Õ¶|Ö€Õ¤)/,ordinal:function(a,b){switch(b){case"DDD":case"w":case"W":case"DDDo":return 1===a?a+"-Õ«Õ¶":a+"-Ö€Õ¤";default:return a}},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"LT.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] LT",LLLL:"dddd, D MMMM YYYY [pukul] LT"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(a,b){return 12===a&&(a=0),"pagi"===b?a:"siang"===b?a>=11?a:a+12:"sore"===b||"malam"===b?a+12:void 0},meridiem:function(a){return 11>a?"pagi":15>a?"siang":19>a?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){function b(a){return a%100===11?!0:a%10===1?!1:!0}function c(a,c,d,e){var f=a+" ";switch(d){case"s":return c||e?"nokkrar sekúndur":"nokkrum sekúndum";case"m":return c?"mínúta":"mínútu";case"mm":return b(a)?f+(c||e?"mínútur":"mínútum"):c?f+"mínúta":f+"mínútu";case"hh":return b(a)?f+(c||e?"klukkustundir":"klukkustundum"):f+"klukkustund";case"d":return c?"dagur":e?"dag":"degi";case"dd":return b(a)?c?f+"dagar":f+(e?"daga":"dögum"):c?f+"dagur":f+(e?"dag":"degi");case"M":return c?"mánuður":e?"mánuð":"mánuði";case"MM":return b(a)?c?f+"mánuðir":f+(e?"mánuði":"mánuðum"):c?f+"mánuður":f+(e?"mánuð":"mánuði");case"y":return c||e?"ár":"ári";case"yy":return b(a)?f+(c||e?"ár":"árum"):f+(c||e?"ár":"ári")}}return a.defineLocale("is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd, D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:c,m:c,mm:c,h:"klukkustund",hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),weekdaysShort:"Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),weekdaysMin:"D_L_Ma_Me_G_V_S".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(a){return(/^[0-9].+$/.test(a)?"tra":"in")+" "+a},past:"%s fa",s:"alcuni secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_ç«æ›œæ—¥_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"æ—¥_月_ç«_æ°´_木_金_土".split("_"),weekdaysMin:"æ—¥_月_ç«_æ°´_木_金_土".split("_"),longDateFormat:{LT:"Ah時m分",LTS:"LTs秒",L:"YYYY/MM/DD",LL:"YYYYå¹´M月Dæ—¥",LLL:"YYYYå¹´M月Dæ—¥LT",LLLL:"YYYYå¹´M月Dæ—¥LT dddd"},meridiemParse:/åˆå‰|åˆå¾Œ/i,isPM:function(a){return"åˆå¾Œ"===a},meridiem:function(a){return 12>a?"åˆå‰":"åˆå¾Œ"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:"[æ¥é€±]dddd LT",lastDay:"[昨日] LT",lastWeek:"[å‰é€±]dddd LT",sameElse:"L"},relativeTime:{future:"%s後",past:"%så‰",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1æ—¥",dd:"%dæ—¥",M:"1ヶ月",MM:"%dヶ月",y:"1å¹´",yy:"%då¹´"}})}),function(a){a(vb)}(function(a){function b(a,b){var c={nominative:"იáƒáƒœáƒ•áƒáƒ áƒ˜_თებერვáƒáƒšáƒ˜_მáƒáƒ áƒ¢áƒ˜_áƒáƒžáƒ áƒ˜áƒšáƒ˜_მáƒáƒ˜áƒ¡áƒ˜_ივნისი_ივლისი_áƒáƒ’ვისტáƒ_სექტემბერი_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი_ნáƒáƒ”მბერი_დეკემბერი".split("_"),accusative:"იáƒáƒœáƒ•áƒáƒ áƒ¡_თებერვáƒáƒšáƒ¡_მáƒáƒ áƒ¢áƒ¡_áƒáƒžáƒ áƒ˜áƒšáƒ˜áƒ¡_მáƒáƒ˜áƒ¡áƒ¡_ივნისს_ივლისს_áƒáƒ’ვისტს_სექტემბერს_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერს_ნáƒáƒ”მბერს_დეკემბერს".split("_")},d=/D[oD] *MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function c(a,b){var c={nominative:"კვირáƒ_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ი_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი_ხუთშáƒáƒ‘áƒáƒ—ი_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი_შáƒáƒ‘áƒáƒ—ი".split("_"),accusative:"კვირáƒáƒ¡_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ს_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ს_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ს_ხუთშáƒáƒ‘áƒáƒ—ს_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვს_შáƒáƒ‘áƒáƒ—ს".split("_")},d=/(წინáƒ|შემდეგ)/.test(b)?"accusative":"nominative";return c[d][a.day()]}return a.defineLocale("ka",{months:b,monthsShort:"იáƒáƒœ_თებ_მáƒáƒ _áƒáƒžáƒ _მáƒáƒ˜_ივნ_ივლ_áƒáƒ’ვ_სექ_áƒáƒ¥áƒ¢_ნáƒáƒ”_დეკ".split("_"),weekdays:c,weekdaysShort:"კვი_áƒáƒ áƒ¨_სáƒáƒ›_áƒáƒ—ხ_ხუთ_პáƒáƒ _შáƒáƒ‘".split("_"),weekdaysMin:"კვ_áƒáƒ _სáƒ_áƒáƒ—_ხუ_პáƒ_შáƒ".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[დღეს] LT[-ზე]",nextDay:"[ხვáƒáƒš] LT[-ზე]",lastDay:"[გუშინ] LT[-ზე]",nextWeek:"[შემდეგ] dddd LT[-ზე]",lastWeek:"[წინáƒ] dddd LT-ზე",sameElse:"L"},relativeTime:{future:function(a){return/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|წელი)/.test(a)?a.replace(/ი$/,"ში"):a+"ში"},past:function(a){return/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|დღე|თვე)/.test(a)?a.replace(/(ი|ე)$/,"ის წინ"):/წელი/.test(a)?a.replace(/წელი$/,"წლის წინ"):void 0},s:"რáƒáƒ›áƒ“ენიმე წáƒáƒ›áƒ˜",m:"წუთი",mm:"%d წუთი",h:"სáƒáƒáƒ—ი",hh:"%d სáƒáƒáƒ—ი",d:"დღე",dd:"%d დღე",M:"თვე",MM:"%d თვე",y:"წელი",yy:"%d წელი"},ordinalParse:/0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/,ordinal:function(a){return 0===a?a:1===a?a+"-ლი":20>a||100>=a&&a%20===0||a%100===0?"მე-"+a:a+"-ე"},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("km",{months:"មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ".split("_"),monthsShort:"មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ".split("_"),weekdays:"អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ".split("_"),weekdaysShort:"អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ".split("_"),weekdaysMin:"អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[ážáŸ’ងៃនៈ ម៉ោង] LT",nextDay:"[ស្អែក ម៉ោង] LT",nextWeek:"dddd [ម៉ោង] LT",lastDay:"[ម្សិលមិញ ម៉ោង] LT",lastWeek:"dddd [សប្ážáž¶áž áŸáž˜áž»áž“] [ម៉ោង] LT",sameElse:"L"},relativeTime:{future:"%sទៀáž",past:"%sមុន",s:"ប៉ុន្មានវិនាទី",m:"មួយនាទី",mm:"%d នាទី",h:"មួយម៉ោង",hh:"%d ម៉ោង",d:"មួយážáŸ’ងៃ",dd:"%d ážáŸ’ងៃ",M:"មួយážáŸ‚",MM:"%d ážáŸ‚",y:"មួយឆ្នាំ",yy:"%d ឆ្នាំ"},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("ko",{months:"1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"),monthsShort:"1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"),weekdays:"ì¼ìš”ì¼_월요ì¼_화요ì¼_수요ì¼_목요ì¼_금요ì¼_토요ì¼".split("_"),weekdaysShort:"ì¼_ì›”_í™”_수_목_금_토".split("_"),weekdaysMin:"ì¼_ì›”_í™”_수_목_금_토".split("_"),longDateFormat:{LT:"A hì‹œ m분",LTS:"A hì‹œ m분 sì´ˆ",L:"YYYY.MM.DD",LL:"YYYYë…„ MMMM Dì¼",LLL:"YYYYë…„ MMMM Dì¼ LT",LLLL:"YYYYë…„ MMMM Dì¼ dddd LT"},calendar:{sameDay:"오늘 LT",nextDay:"ë‚´ì¼ LT",nextWeek:"dddd LT",lastDay:"ì–´ì œ LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s ì „",s:"몇초",ss:"%dì´ˆ",m:"ì¼ë¶„",mm:"%d분",h:"한시간",hh:"%d시간",d:"하루",dd:"%dì¼",M:"한달",MM:"%d달",y:"ì¼ë…„",yy:"%dë…„"},ordinalParse:/\d{1,2}ì¼/,ordinal:"%dì¼",meridiemParse:/오전|오후/,isPM:function(a){return"오후"===a},meridiem:function(a){return 12>a?"오전":"오후"}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return b?d[c][0]:d[c][1]}function c(a){var b=a.substr(0,a.indexOf(" "));return e(b)?"a "+a:"an "+a}function d(a){var b=a.substr(0,a.indexOf(" "));return e(b)?"viru "+a:"virun "+a}function e(a){if(a=parseInt(a,10),isNaN(a))return!1;if(0>a)return!0;if(10>a)return a>=4&&7>=a?!0:!1;if(100>a){var b=a%10,c=a/10;return e(0===b?c:b)}if(1e4>a){for(;a>=10;)a/=10;return e(a)}return a/=1e3,e(a)}return a.defineLocale("lb",{months:"Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._Mé._Dë._Më._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mé_Dë_Më_Do_Fr_Sa".split("_"),longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gëschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:c,past:d,s:"e puer Sekonnen",m:b,mm:"%d Minutten",h:b,hh:"%d Stonnen",d:b,dd:"%d Deeg",M:b,MM:"%d Méint",y:b,yy:"%d Joer"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c,d){return b?"kelios sekundÄ—s":d?"kelių sekundžių":"kelias sekundes"}function c(a,b,c,d){return b?e(c)[0]:d?e(c)[1]:e(c)[2] -}function d(a){return a%10===0||a>10&&20>a}function e(a){return h[a].split("_")}function f(a,b,f,g){var h=a+" ";return 1===a?h+c(a,b,f[0],g):b?h+(d(a)?e(f)[1]:e(f)[0]):g?h+e(f)[1]:h+(d(a)?e(f)[1]:e(f)[2])}function g(a,b){var c=-1===b.indexOf("dddd HH:mm"),d=i[a.day()];return c?d:d.substring(0,d.length-2)+"į"}var h={m:"minutÄ—_minutÄ—s_minutÄ™",mm:"minutÄ—s_minuÄių_minutes",h:"valanda_valandos_valandÄ…",hh:"valandos_valandų_valandas",d:"diena_dienos_dienÄ…",dd:"dienos_dienų_dienas",M:"mÄ—nuo_mÄ—nesio_mÄ—nesį",MM:"mÄ—nesiai_mÄ—nesių_mÄ—nesius",y:"metai_metų_metus",yy:"metai_metų_metus"},i="sekmadienis_pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis".split("_");return a.defineLocale("lt",{months:"sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio".split("_"),monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:g,weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Å eÅ¡".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Å ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], LT [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, LT [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], LT [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, LT [val.]"},calendar:{sameDay:"[Å iandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[PraÄ—jusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieÅ¡ %s",s:b,m:c,mm:f,h:c,hh:f,d:c,dd:f,M:c,MM:f,y:c,yy:f},ordinalParse:/\d{1,2}-oji/,ordinal:function(a){return a+"-oji"},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d=a.split("_");return c?b%10===1&&11!==b?d[2]:d[3]:b%10===1&&11!==b?d[0]:d[1]}function c(a,c,e){return a+" "+b(d[e],a,c)}var d={mm:"minÅ«ti_minÅ«tes_minÅ«te_minÅ«tes",hh:"stundu_stundas_stunda_stundas",dd:"dienu_dienas_diena_dienas",MM:"mÄ“nesi_mÄ“neÅ¡us_mÄ“nesis_mÄ“neÅ¡i",yy:"gadu_gadus_gads_gadi"};return a.defineLocale("lv",{months:"janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jÅ«n_jÅ«l_aug_sep_okt_nov_dec".split("_"),weekdays:"svÄ“tdiena_pirmdiena_otrdiena_treÅ¡diena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, LT",LLLL:"YYYY. [gada] D. MMMM, dddd, LT"},calendar:{sameDay:"[Å odien pulksten] LT",nextDay:"[RÄ«t pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[PagÄjuÅ¡Ä] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"%s vÄ“lÄk",past:"%s agrÄk",s:"dažas sekundes",m:"minÅ«ti",mm:c,h:"stundu",hh:c,d:"dienu",dd:c,M:"mÄ“nesi",MM:c,y:"gadu",yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("mk",{months:"јануари_февруари_март_април_мај_јуни_јули_авгуÑÑ‚_Ñептември_октомври_ноември_декември".split("_"),monthsShort:"јан_фев_мар_апр_мај_јун_јул_авг_Ñеп_окт_ное_дек".split("_"),weekdays:"недела_понеделник_вторник_Ñреда_четврток_петок_Ñабота".split("_"),weekdaysShort:"нед_пон_вто_Ñре_чет_пет_Ñаб".split("_"),weekdaysMin:"нe_пo_вт_ÑÑ€_че_пе_Ña".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Ð”ÐµÐ½ÐµÑ Ð²Ð¾] LT",nextDay:"[Утре во] LT",nextWeek:"dddd [во] LT",lastDay:"[Вчера во] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Во изминатата] dddd [во] LT";case 1:case 2:case 4:case 5:return"[Во изминатиот] dddd [во] LT"}},sameElse:"L"},relativeTime:{future:"поÑле %s",past:"пред %s",s:"неколку Ñекунди",m:"минута",mm:"%d минути",h:"чаÑ",hh:"%d чаÑа",d:"ден",dd:"%d дена",M:"меÑец",MM:"%d меÑеци",y:"година",yy:"%d години"},ordinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(a){var b=a%10,c=a%100;return 0===a?a+"-ев":0===c?a+"-ен":c>10&&20>c?a+"-ти":1===b?a+"-ви":2===b?a+"-ри":7===b||8===b?a+"-ми":a+"-ти"},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("ml",{months:"ജനàµà´µà´°à´¿_ഫെബàµà´°àµà´µà´°à´¿_മാർചàµà´šàµ_à´à´ªàµà´°à´¿àµ½_മേയàµ_ജൂൺ_ജൂലൈ_à´“à´—à´¸àµà´±àµà´±àµ_സെപàµà´±àµà´±à´‚ബർ_à´’à´•àµà´Ÿàµ‹à´¬àµ¼_നവംബർ_ഡിസംബർ".split("_"),monthsShort:"ജനàµ._ഫെബàµà´°àµ._മാർ._à´à´ªàµà´°à´¿._മേയàµ_ജൂൺ_ജൂലൈ._à´“à´—._സെപàµà´±àµà´±._à´’à´•àµà´Ÿàµ‹._നവം._ഡിസം.".split("_"),weekdays:"ഞായറാഴàµà´š_തിങàµà´•à´³à´¾à´´àµà´š_ചൊവàµà´µà´¾à´´àµà´š_à´¬àµà´§à´¨à´¾à´´àµà´š_à´µàµà´¯à´¾à´´à´¾à´´àµà´š_വെളàµà´³à´¿à´¯à´¾à´´àµà´š_ശനിയാഴàµà´š".split("_"),weekdaysShort:"ഞായർ_തിങàµà´•àµ¾_ചൊവàµà´µ_à´¬àµà´§àµ»_à´µàµà´¯à´¾à´´à´‚_വെളàµà´³à´¿_ശനി".split("_"),weekdaysMin:"à´žà´¾_തി_ചൊ_à´¬àµ_à´µàµà´¯à´¾_വെ_à´¶".split("_"),longDateFormat:{LT:"A h:mm -à´¨àµ",LTS:"A h:mm:ss -à´¨àµ",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[ഇനàµà´¨àµ] LT",nextDay:"[നാളെ] LT",nextWeek:"dddd, LT",lastDay:"[ഇനàµà´¨à´²àµ†] LT",lastWeek:"[à´•à´´à´¿à´žàµà´ž] dddd, LT",sameElse:"L"},relativeTime:{future:"%s à´•à´´à´¿à´žàµà´žàµ",past:"%s à´®àµàµ»à´ªàµ",s:"അൽപ നിമിഷങàµà´™àµ¾",m:"ഒരൠമിനിറàµà´±àµ",mm:"%d മിനിറàµà´±àµ",h:"ഒരൠമണികàµà´•àµ‚ർ",hh:"%d മണികàµà´•àµ‚ർ",d:"ഒരൠദിവസം",dd:"%d ദിവസം",M:"ഒരൠമാസം",MM:"%d മാസം",y:"ഒരൠവർഷം",yy:"%d വർഷം"},meridiemParse:/രാതàµà´°à´¿|രാവിലെ|ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿/i,isPM:function(a){return/^(ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ|വൈകàµà´¨àµà´¨àµ‡à´°à´‚|രാതàµà´°à´¿)$/.test(a)},meridiem:function(a){return 4>a?"രാതàµà´°à´¿":12>a?"രാവിലെ":17>a?"ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ":20>a?"വൈകàµà´¨àµà´¨àµ‡à´°à´‚":"രാതàµà´°à´¿"}})}),function(a){a(vb)}(function(a){var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return a.defineLocale("mr",{months:"जानेवारी_फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€_मारà¥à¤š_à¤à¤ªà¥à¤°à¤¿à¤²_मे_जून_जà¥à¤²à¥ˆ_ऑगसà¥à¤Ÿ_सपà¥à¤Ÿà¥‡à¤‚बर_ऑकà¥à¤Ÿà¥‹à¤¬à¤°_नोवà¥à¤¹à¥‡à¤‚बर_डिसेंबर".split("_"),monthsShort:"जाने._फेबà¥à¤°à¥._मारà¥à¤š._à¤à¤ªà¥à¤°à¤¿._मे._जून._जà¥à¤²à¥ˆ._ऑग._सपà¥à¤Ÿà¥‡à¤‚._ऑकà¥à¤Ÿà¥‹._नोवà¥à¤¹à¥‡à¤‚._डिसें.".split("_"),weekdays:"रविवार_सोमवार_मंगळवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगळ_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि".split("_"),weekdaysMin:"र_सो_मं_बà¥_गà¥_शà¥_श".split("_"),longDateFormat:{LT:"A h:mm वाजता",LTS:"A h:mm:ss वाजता",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[आज] LT",nextDay:"[उदà¥à¤¯à¤¾] LT",nextWeek:"dddd, LT",lastDay:"[काल] LT",lastWeek:"[मागील] dddd, LT",sameElse:"L"},relativeTime:{future:"%s नंतर",past:"%s पूरà¥à¤µà¥€",s:"सेकंद",m:"à¤à¤• मिनिट",mm:"%d मिनिटे",h:"à¤à¤• तास",hh:"%d तास",d:"à¤à¤• दिवस",dd:"%d दिवस",M:"à¤à¤• महिना",MM:"%d महिने",y:"à¤à¤• वरà¥à¤·",yy:"%d वरà¥à¤·à¥‡"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/रातà¥à¤°à¥€|सकाळी|दà¥à¤ªà¤¾à¤°à¥€|सायंकाळी/,meridiemHour:function(a,b){return 12===a&&(a=0),"रातà¥à¤°à¥€"===b?4>a?a:a+12:"सकाळी"===b?a:"दà¥à¤ªà¤¾à¤°à¥€"===b?a>=10?a:a+12:"सायंकाळी"===b?a+12:void 0},meridiem:function(a){return 4>a?"रातà¥à¤°à¥€":10>a?"सकाळी":17>a?"दà¥à¤ªà¤¾à¤°à¥€":20>a?"सायंकाळी":"रातà¥à¤°à¥€"},week:{dow:0,doy:6}})}),function(a){a(vb)}(function(a){return a.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"LT.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] LT",LLLL:"dddd, D MMMM YYYY [pukul] LT"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(a,b){return 12===a&&(a=0),"pagi"===b?a:"tengahari"===b?a>=11?a:a+12:"petang"===b||"malam"===b?a+12:void 0},meridiem:function(a){return 11>a?"pagi":15>a?"tengahari":19>a?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){var b={1:"á",2:"á‚",3:"áƒ",4:"á„",5:"á…",6:"á†",7:"á‡",8:"áˆ",9:"á‰",0:"á€"},c={"á":"1","á‚":"2","áƒ":"3","á„":"4","á…":"5","á†":"6","á‡":"7","áˆ":"8","á‰":"9","á€":"0"};return a.defineLocale("my",{months:"ဇန်နá€á€«á€›á€®_ဖေဖော်á€á€«á€›á€®_မá€á€º_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုá€á€º_စက်á€á€„်ဘာ_အောက်á€á€­á€¯á€˜á€¬_နိုá€á€„်ဘာ_ဒီဇင်ဘာ".split("_"),monthsShort:"ဇန်_ဖေ_မá€á€º_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ".split("_"),weekdays:"á€á€”င်္ဂနွေ_á€á€”င်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပá€á€±á€¸_သောကြာ_စနေ".split("_"),weekdaysShort:"နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),weekdaysMin:"နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[ယနေ.] LT [မှာ]",nextDay:"[မနက်ဖြန်] LT [မှာ]",nextWeek:"dddd LT [မှာ]",lastDay:"[မနေ.က] LT [မှာ]",lastWeek:"[ပြီးá€á€²á€·á€žá€±á€¬] dddd LT [မှာ]",sameElse:"L"},relativeTime:{future:"လာမည့် %s မှာ",past:"လွန်á€á€²á€·á€žá€±á€¬ %s က",s:"စက္ကန်.အနည်းငယ်",m:"á€á€…်မိနစ်",mm:"%d မိနစ်",h:"á€á€…်နာရီ",hh:"%d နာရီ",d:"á€á€…်ရက်",dd:"%d ရက်",M:"á€á€…်လ",MM:"%d လ",y:"á€á€…်နှစ်",yy:"%d နှစ်"},preparse:function(a){return a.replace(/[áá‚áƒá„á…á†á‡áˆá‰á€]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tirs_ons_tors_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"H.mm",LTS:"LT.ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i gÃ¥r kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"for %s siden",s:"noen sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en mÃ¥ned",MM:"%d mÃ¥neder",y:"ett Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return a.defineLocale("ne",{months:"जनवरी_फेबà¥à¤°à¥à¤µà¤°à¥€_मारà¥à¤š_अपà¥à¤°à¤¿à¤²_मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ_अगषà¥à¤Ÿ_सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°_अकà¥à¤Ÿà¥‹à¤¬à¤°_नोभेमà¥à¤¬à¤°_डिसेमà¥à¤¬à¤°".split("_"),monthsShort:"जन._फेबà¥à¤°à¥._मारà¥à¤š_अपà¥à¤°à¤¿._मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ._अग._सेपà¥à¤Ÿ._अकà¥à¤Ÿà¥‹._नोभे._डिसे.".split("_"),weekdays:"आइतबार_सोमबार_मङà¥à¤—लबार_बà¥à¤§à¤¬à¤¾à¤°_बिहिबार_शà¥à¤•à¥à¤°à¤¬à¤¾à¤°_शनिबार".split("_"),weekdaysShort:"आइत._सोम._मङà¥à¤—ल._बà¥à¤§._बिहि._शà¥à¤•à¥à¤°._शनि.".split("_"),weekdaysMin:"आइ._सो._मङà¥_बà¥._बि._शà¥._श.".split("_"),longDateFormat:{LT:"Aको h:mm बजे",LTS:"Aको h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiemParse:/राती|बिहान|दिउà¤à¤¸à¥‹|बेलà¥à¤•à¤¾|साà¤à¤|राती/,meridiemHour:function(a,b){return 12===a&&(a=0),"राती"===b?3>a?a:a+12:"बिहान"===b?a:"दिउà¤à¤¸à¥‹"===b?a>=10?a:a+12:"बेलà¥à¤•à¤¾"===b||"साà¤à¤"===b?a+12:void 0},meridiem:function(a){return 3>a?"राती":10>a?"बिहान":15>a?"दिउà¤à¤¸à¥‹":18>a?"बेलà¥à¤•à¤¾":20>a?"साà¤à¤":"राती"},calendar:{sameDay:"[आज] LT",nextDay:"[भोली] LT",nextWeek:"[आउà¤à¤¦à¥‹] dddd[,] LT",lastDay:"[हिजो] LT",lastWeek:"[गà¤à¤•à¥‹] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%sमा",past:"%s अगाडी",s:"केही समय",m:"à¤à¤• मिनेट",mm:"%d मिनेट",h:"à¤à¤• घणà¥à¤Ÿà¤¾",hh:"%d घणà¥à¤Ÿà¤¾",d:"à¤à¤• दिन",dd:"%d दिन",M:"à¤à¤• महिना",MM:"%d महिना",y:"à¤à¤• बरà¥à¤·",yy:"%d बरà¥à¤·"},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){var b="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),c="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_");return a.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(a,d){return/-MMM-/.test(d)?c[a.month()]:b[a.month()]},weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_mÃ¥ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_mÃ¥n_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_mÃ¥_ty_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I gÃ¥r klokka] LT",lastWeek:"[FøregÃ¥ande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"for %s sidan",s:"nokre sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",M:"ein mÃ¥nad",MM:"%d mÃ¥nader",y:"eit Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a){return 5>a%10&&a%10>1&&~~(a/10)%10!==1}function c(a,c,d){var e=a+" ";switch(d){case"m":return c?"minuta":"minutÄ™";case"mm":return e+(b(a)?"minuty":"minut");case"h":return c?"godzina":"godzinÄ™";case"hh":return e+(b(a)?"godziny":"godzin");case"MM":return e+(b(a)?"miesiÄ…ce":"miesiÄ™cy");case"yy":return e+(b(a)?"lata":"lat")}}var d="styczeÅ„_luty_marzec_kwiecieÅ„_maj_czerwiec_lipiec_sierpieÅ„_wrzesieÅ„_październik_listopad_grudzieÅ„".split("_"),e="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrzeÅ›nia_października_listopada_grudnia".split("_");return a.defineLocale("pl",{months:function(a,b){return/D MMMM/.test(b)?e[a.month()]:d[a.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziaÅ‚ek_wtorek_Å›roda_czwartek_piÄ…tek_sobota".split("_"),weekdaysShort:"nie_pon_wt_Å›r_czw_pt_sb".split("_"),weekdaysMin:"N_Pn_Wt_Åšr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[DziÅ› o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszÅ‚Ä… niedzielÄ™ o] LT";case 3:return"[W zeszÅ‚Ä… Å›rodÄ™ o] LT";case 6:return"[W zeszÅ‚Ä… sobotÄ™ o] LT";default:return"[W zeszÅ‚y] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:c,mm:c,h:c,hh:c,d:"1 dzieÅ„",dd:"%d dni",M:"miesiÄ…c",MM:c,y:"rok",yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("pt-br",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] LT",LLLL:"dddd, D [de] MMMM [de] YYYY [às] LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº"})}),function(a){a(vb)}(function(a){return a.defineLocale("pt",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d={mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"},e=" ";return(a%100>=20||a>=100&&a%100===0)&&(e=" de "),a+e+d[c]}return a.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),weekdays:"duminică_luni_marÈ›i_miercuri_joi_vineri_sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",m:"un minut",mm:b,h:"o oră",hh:b,d:"o zi",dd:b,M:"o lună",MM:b,y:"un an",yy:b},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){function b(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:c?"минута_минуты_минут":"минуту_минуты_минут",hh:"чаÑ_чаÑа_чаÑов",dd:"день_днÑ_дней",MM:"меÑÑц_меÑÑца_меÑÑцев",yy:"год_года_лет"};return"m"===d?c?"минута":"минуту":a+" "+b(e[d],+a)}function d(a,b){var c={nominative:"Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь".split("_"),accusative:"ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function e(a,b){var c={nominative:"Ñнв_фев_март_апр_май_июнь_июль_авг_Ñен_окт_ноÑ_дек".split("_"),accusative:"Ñнв_фев_мар_апр_маÑ_июнÑ_июлÑ_авг_Ñен_окт_ноÑ_дек".split("_")},d=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function f(a,b){var c={nominative:"воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота".split("_"),accusative:"воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу".split("_")},d=/\[ ?[Вв] ?(?:прошлую|Ñледующую|Ñту)? ?\] ?dddd/.test(b)?"accusative":"nominative";return c[d][a.day()]}return a.defineLocale("ru",{months:d,monthsShort:e,weekdays:f,weekdaysShort:"вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),weekdaysMin:"вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),monthsParse:[/^Ñнв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[й|Ñ]/i,/^июн/i,/^июл/i,/^авг/i,/^Ñен/i,/^окт/i,/^ноÑ/i,/^дек/i],longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., LT",LLLL:"dddd, D MMMM YYYY г., LT"},calendar:{sameDay:"[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT",nextDay:"[Завтра в] LT",lastDay:"[Вчера в] LT",nextWeek:function(){return 2===this.day()?"[Во] dddd [в] LT":"[Ð’] dddd [в] LT"},lastWeek:function(a){if(a.week()===this.week())return 2===this.day()?"[Во] dddd [в] LT":"[Ð’] dddd [в] LT";switch(this.day()){case 0:return"[Ð’ прошлое] dddd [в] LT";case 1:case 2:case 4:return"[Ð’ прошлый] dddd [в] LT";case 3:case 5:case 6:return"[Ð’ прошлую] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"неÑколько Ñекунд",m:c,mm:c,h:"чаÑ",hh:c,d:"день",dd:c,M:"меÑÑц",MM:c,y:"год",yy:c},meridiemParse:/ночи|утра|днÑ|вечера/i,isPM:function(a){return/^(днÑ|вечера)$/.test(a)},meridiem:function(a){return 4>a?"ночи":12>a?"утра":17>a?"днÑ":"вечера"},ordinalParse:/\d{1,2}-(й|го|Ñ)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":return a+"-й";case"D":return a+"-го";case"w":case"W":return a+"-Ñ";default:return a}},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){function b(a){return a>1&&5>a}function c(a,c,d,e){var f=a+" ";switch(d){case"s":return c||e?"pár sekúnd":"pár sekundami";case"m":return c?"minúta":e?"minútu":"minútou";case"mm":return c||e?f+(b(a)?"minúty":"minút"):f+"minútami";break;case"h":return c?"hodina":e?"hodinu":"hodinou";case"hh":return c||e?f+(b(a)?"hodiny":"hodín"):f+"hodinami";break;case"d":return c||e?"deň":"dňom";case"dd":return c||e?f+(b(a)?"dni":"dní"):f+"dňami";break;case"M":return c||e?"mesiac":"mesiacom";case"MM":return c||e?f+(b(a)?"mesiace":"mesiacov"):f+"mesiacmi";break;case"y":return c||e?"rok":"rokom";case"yy":return c||e?f+(b(a)?"roky":"rokov"):f+"rokmi"}}var d="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),e="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");return a.defineLocale("sk",{months:d,monthsShort:e,monthsParse:function(a,b){var c,d=[];for(c=0;12>c;c++)d[c]=new RegExp("^"+a[c]+"$|^"+b[c]+"$","i");return d}(d,e),weekdays:"nedeľa_pondelok_utorok_streda_Å¡tvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_Å¡t_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_Å¡t_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo Å¡tvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[vÄera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT";case 1:case 2:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 4:case 5:return"[minulý] dddd [o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){function b(a,b,c){var d=a+" ";switch(c){case"m":return b?"ena minuta":"eno minuto";case"mm":return d+=1===a?"minuta":2===a?"minuti":3===a||4===a?"minute":"minut";case"h":return b?"ena ura":"eno uro";case"hh":return d+=1===a?"ura":2===a?"uri":3===a||4===a?"ure":"ur";case"dd":return d+=1===a?"dan":"dni";case"MM":return d+=1===a?"mesec":2===a?"meseca":3===a||4===a?"mesece":"mesecev";case"yy":return d+=1===a?"leto":2===a?"leti":3===a||4===a?"leta":"let"}}return a.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),weekdays:"nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._Äet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_Äe_pe_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[vÄeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[prejÅ¡nja] dddd [ob] LT";case 1:case 2:case 4:case 5:return"[prejÅ¡nji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"Äez %s",past:"%s nazaj",s:"nekaj sekund",m:b,mm:b,h:b,hh:b,d:"en dan",dd:b,M:"en mesec",MM:b,y:"eno leto",yy:b},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"),weekdays:"E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë".split("_"),weekdaysShort:"Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_Më_E_P_Sh".split("_"),meridiemParse:/PD|MD/,isPM:function(a){return"M"===a.charAt(0)},meridiem:function(a){return 12>a?"PD":"MD"},longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Sot në] LT",nextDay:"[Nesër në] LT",nextWeek:"dddd [në] LT",lastDay:"[Dje në] LT",lastWeek:"dddd [e kaluar në] LT",sameElse:"L"},relativeTime:{future:"në %s",past:"%s më parë",s:"disa sekonda",m:"një minutë",mm:"%d minuta",h:"një orë",hh:"%d orë",d:"një ditë",dd:"%d ditë",M:"një muaj",MM:"%d muaj",y:"një vit",yy:"%d vite"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){var b={words:{m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један Ñат","једног Ñата"],hh:["Ñат","Ñата","Ñати"],dd:["дан","дана","дана"],MM:["меÑец","меÑеца","меÑеци"],yy:["година","године","година"]},correctGrammaticalCase:function(a,b){return 1===a?b[0]:a>=2&&4>=a?b[1]:b[2]},translate:function(a,c,d){var e=b.words[d];return 1===d.length?c?e[0]:e[1]:a+" "+b.correctGrammaticalCase(a,e)}};return a.defineLocale("sr-cyrl",{months:["јануар","фебруар","март","април","мај","јун","јул","авгуÑÑ‚","Ñептембар","октобар","новембар","децембар"],monthsShort:["јан.","феб.","мар.","апр.","мај","јун","јул","авг.","Ñеп.","окт.","нов.","дец."],weekdays:["недеља","понедељак","уторак","Ñреда","четвртак","петак","Ñубота"],weekdaysShort:["нед.","пон.","уто.","Ñре.","чет.","пет.","Ñуб."],weekdaysMin:["не","по","ут","ÑÑ€","че","пе","Ñу"],longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Ð´Ð°Ð½Ð°Ñ Ñƒ] LT",nextDay:"[Ñутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [Ñреду] [у] LT";case 6:return"[у] [Ñуботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){var a=["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [Ñреде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [Ñуботе] [у] LT"];return a[this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико Ñекунди",m:b.translate,mm:b.translate,h:b.translate,hh:b.translate,d:"дан",dd:b.translate,M:"меÑец",MM:b.translate,y:"годину",yy:b.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){var b={words:{m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(a,b){return 1===a?b[0]:a>=2&&4>=a?b[1]:b[2]},translate:function(a,c,d){var e=b.words[d];return 1===d.length?c?e[0]:e[1]:a+" "+b.correctGrammaticalCase(a,e)}};return a.defineLocale("sr",{months:["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar"],monthsShort:["jan.","feb.","mar.","apr.","maj","jun","jul","avg.","sep.","okt.","nov.","dec."],weekdays:["nedelja","ponedeljak","utorak","sreda","Äetvrtak","petak","subota"],weekdaysShort:["ned.","pon.","uto.","sre.","Äet.","pet.","sub."],weekdaysMin:["ne","po","ut","sr","Äe","pe","su"],longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄe u] LT",lastWeek:function(){var a=["[proÅ¡le] [nedelje] [u] LT","[proÅ¡log] [ponedeljka] [u] LT","[proÅ¡log] [utorka] [u] LT","[proÅ¡le] [srede] [u] LT","[proÅ¡log] [Äetvrtka] [u] LT","[proÅ¡log] [petka] [u] LT","[proÅ¡le] [subote] [u] LT"];return a[this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",m:b.translate,mm:b.translate,h:b.translate,hh:b.translate,d:"dan",dd:b.translate,M:"mesec",MM:b.translate,y:"godinu",yy:b.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_mÃ¥ndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mÃ¥n_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_mÃ¥_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[IgÃ¥r] LT",nextWeek:"dddd LT",lastWeek:"[Förra] dddd[en] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"nÃ¥gra sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en mÃ¥nad",MM:"%d mÃ¥nader",y:"ett Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}(e|a)/,ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"e":1===b?"a":2===b?"a":"e";return a+c},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("ta",{months:"ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯".split("_"),monthsShort:"ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯".split("_"),weekdays:"ஞாயிறà¯à®±à¯à®•à¯à®•à®¿à®´à®®à¯ˆ_திஙà¯à®•à®Ÿà¯à®•à®¿à®´à®®à¯ˆ_செவà¯à®µà®¾à®¯à¯à®•à®¿à®´à®®à¯ˆ_பà¯à®¤à®©à¯à®•à®¿à®´à®®à¯ˆ_வியாழகà¯à®•à®¿à®´à®®à¯ˆ_வெளà¯à®³à®¿à®•à¯à®•à®¿à®´à®®à¯ˆ_சனிகà¯à®•à®¿à®´à®®à¯ˆ".split("_"),weekdaysShort:"ஞாயிறà¯_திஙà¯à®•à®³à¯_செவà¯à®µà®¾à®¯à¯_பà¯à®¤à®©à¯_வியாழனà¯_வெளà¯à®³à®¿_சனி".split("_"),weekdaysMin:"ஞா_தி_செ_பà¯_வி_வெ_ச".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[இனà¯à®±à¯] LT",nextDay:"[நாளை] LT",nextWeek:"dddd, LT",lastDay:"[நேறà¯à®±à¯] LT",lastWeek:"[கடநà¯à®¤ வாரமà¯] dddd, LT",sameElse:"L"},relativeTime:{future:"%s இலà¯",past:"%s à®®à¯à®©à¯",s:"ஒர௠சில விநாடிகளà¯",m:"ஒர௠நிமிடமà¯",mm:"%d நிமிடஙà¯à®•à®³à¯",h:"ஒர௠மணி நேரமà¯",hh:"%d மணி நேரமà¯",d:"ஒர௠நாளà¯",dd:"%d நாடà¯à®•à®³à¯",M:"ஒர௠மாதமà¯",MM:"%d மாதஙà¯à®•à®³à¯",y:"ஒர௠வரà¯à®Ÿà®®à¯",yy:"%d ஆணà¯à®Ÿà¯à®•à®³à¯"},ordinalParse:/\d{1,2}வதà¯/,ordinal:function(a){return a+"வதà¯"},meridiemParse:/யாமமà¯|வைகறை|காலை|நணà¯à®ªà®•à®²à¯|எறà¯à®ªà®¾à®Ÿà¯|மாலை/,meridiem:function(a){return 2>a?" யாமமà¯":6>a?" வைகறை":10>a?" காலை":14>a?" நணà¯à®ªà®•à®²à¯":18>a?" எறà¯à®ªà®¾à®Ÿà¯":22>a?" மாலை":" யாமமà¯"},meridiemHour:function(a,b){return 12===a&&(a=0),"யாமமà¯"===b?2>a?a:a+12:"வைகறை"===b||"காலை"===b?a:"நணà¯à®ªà®•à®²à¯"===b&&a>=10?a:a+12},week:{dow:0,doy:6}})}),function(a){a(vb)}(function(a){return a.defineLocale("th",{months:"มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม".split("_"),monthsShort:"มà¸à¸£à¸²_à¸à¸¸à¸¡à¸ à¸²_มีนา_เมษา_พฤษภา_มิถุนา_à¸à¸£à¸à¸Žà¸²_สิงหา_à¸à¸±à¸™à¸¢à¸²_ตุลา_พฤศจิà¸à¸²_ธันวา".split("_"),weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),longDateFormat:{LT:"H นาฬิà¸à¸² m นาที",LTS:"LT s วินาที",L:"YYYY/MM/DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา LT",LLLL:"วันddddที่ D MMMM YYYY เวลา LT"},meridiemParse:/à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง|หลังเที่ยง/,isPM:function(a){return"หลังเที่ยง"===a -},meridiem:function(a){return 12>a?"à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่à¹à¸¥à¹‰à¸§ เวลา] LT",sameElse:"L"},relativeTime:{future:"อีภ%s",past:"%sที่à¹à¸¥à¹‰à¸§",s:"ไม่à¸à¸µà¹ˆà¸§à¸´à¸™à¸²à¸—ี",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"}})}),function(a){a(vb)}(function(a){return a.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY LT",LLLL:"dddd, MMMM DD, YYYY LT"},calendar:{sameDay:"[Ngayon sa] LT",nextDay:"[Bukas sa] LT",nextWeek:"dddd [sa] LT",lastDay:"[Kahapon sa] LT",lastWeek:"dddd [huling linggo] LT",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},ordinalParse:/\d{1,2}/,ordinal:function(a){return a},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){var b={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"};return a.defineLocale("tr",{months:"Ocak_Åžubat_Mart_Nisan_Mayıs_Haziran_Temmuz_AÄŸustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_ÇarÅŸamba_PerÅŸembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[haftaya] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen hafta] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinalParse:/\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/,ordinal:function(a){if(0===a)return a+"'ıncı";var c=a%10,d=a%100-c,e=a>=100?100:null;return a+(b[c]||b[d]||b[e])},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("tzm-latn",{months:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",m:"minuá¸",mm:"%d minuá¸",h:"saÉ›a",hh:"%d tassaÉ›in",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})}),function(a){a(vb)}(function(a){return a.defineLocale("tzm",{months:"ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”".split("_"),monthsShort:"ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”".split("_"),weekdays:"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysShort:"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysMin:"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[ⴰⵙⴷⵅ â´´] LT",nextDay:"[ⴰⵙⴽⴰ â´´] LT",nextWeek:"dddd [â´´] LT",lastDay:"[ⴰⵚⴰâµâµœ â´´] LT",lastWeek:"dddd [â´´] LT",sameElse:"L"},relativeTime:{future:"â´·â´°â´·âµ… âµ™ ⵢⴰⵠ%s",past:"ⵢⴰⵠ%s",s:"ⵉⵎⵉⴽ",m:"ⵎⵉâµâµ“â´º",mm:"%d ⵎⵉâµâµ“â´º",h:"ⵙⴰⵄⴰ",hh:"%d ⵜⴰⵙⵙⴰⵄⵉâµ",d:"ⴰⵙⵙ",dd:"%d oⵙⵙⴰâµ",M:"â´°âµ¢oⵓⵔ",MM:"%d ⵉⵢⵢⵉⵔâµ",y:"ⴰⵙⴳⴰⵙ",yy:"%d ⵉⵙⴳⴰⵙâµ"},week:{dow:6,doy:12}})}),function(a){a(vb)}(function(a){function b(a,b){var c=a.split("_");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:"хвилина_хвилини_хвилин",hh:"година_години_годин",dd:"день_дні_днів",MM:"міÑÑць_міÑÑці_міÑÑців",yy:"рік_роки_років"};return"m"===d?c?"хвилина":"хвилину":"h"===d?c?"година":"годину":a+" "+b(e[d],+a)}function d(a,b){var c={nominative:"Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень".split("_"),accusative:"ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ".split("_")},d=/D[oD]? *MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function e(a,b){var c={nominative:"неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота".split("_"),accusative:"неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу".split("_"),genitive:"неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи".split("_")},d=/(\[[ВвУу]\]) ?dddd/.test(b)?"accusative":/\[?(?:минулої|наÑтупної)? ?\] ?dddd/.test(b)?"genitive":"nominative";return c[d][a.day()]}function f(a){return function(){return a+"о"+(11===this.hours()?"б":"")+"] LT"}}return a.defineLocale("uk",{months:d,monthsShort:"Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд".split("_"),weekdays:e,weekdaysShort:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),weekdaysMin:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY Ñ€.",LLL:"D MMMM YYYY Ñ€., LT",LLLL:"dddd, D MMMM YYYY Ñ€., LT"},calendar:{sameDay:f("[Сьогодні "),nextDay:f("[Завтра "),lastDay:f("[Вчора "),nextWeek:f("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return f("[Минулої] dddd [").call(this);case 1:case 2:case 4:return f("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька Ñекунд",m:c,mm:c,h:"годину",hh:c,d:"день",dd:c,M:"міÑÑць",MM:c,y:"рік",yy:c},meridiemParse:/ночі|ранку|днÑ|вечора/,isPM:function(a){return/^(днÑ|вечора)$/.test(a)},meridiem:function(a){return 4>a?"ночі":12>a?"ранку":17>a?"днÑ":"вечора"},ordinalParse:/\d{1,2}-(й|го)/,ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":case"w":case"W":return a+"-й";case"D":return a+"-го";default:return a}},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("uz",{months:"Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь".split("_"),monthsShort:"Ñнв_фев_мар_апр_май_июн_июл_авг_Ñен_окт_ноÑ_дек".split("_"),weekdays:"Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"),weekdaysShort:"Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"),weekdaysMin:"Як_Ду_Се_Чо_Па_Жу_Ша".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"D MMMM YYYY, dddd LT"},calendar:{sameDay:"[Бугун Ñоат] LT [да]",nextDay:"[Эртага] LT [да]",nextWeek:"dddd [куни Ñоат] LT [да]",lastDay:"[Кеча Ñоат] LT [да]",lastWeek:"[Утган] dddd [куни Ñоат] LT [да]",sameElse:"L"},relativeTime:{future:"Якин %s ичида",past:"Бир неча %s олдин",s:"фурÑат",m:"бир дакика",mm:"%d дакика",h:"бир Ñоат",hh:"%d Ñоат",d:"бир кун",dd:"%d кун",M:"бир ой",MM:"%d ой",y:"бир йил",yy:"%d йил"},week:{dow:1,doy:7}})}),function(a){a(vb)}(function(a){return a.defineLocale("vi",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),weekdays:"chủ nhật_thứ hai_thứ ba_thứ tÆ°_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY LT",LLLL:"dddd, D MMMM [năm] YYYY LT",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY LT",llll:"ddd, D MMM YYYY LT"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tá»›i lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần rồi lúc] LT",sameElse:"L"},relativeTime:{future:"%s tá»›i",past:"%s trÆ°á»›c",s:"vài giây",m:"má»™t phút",mm:"%d phút",h:"má»™t giá»",hh:"%d giá»",d:"má»™t ngày",dd:"%d ngày",M:"má»™t tháng",MM:"%d tháng",y:"má»™t năm",yy:"%d năm"},ordinalParse:/\d{1,2}/,ordinal:function(a){return a},week:{dow:1,doy:4}})}),function(a){a(vb)}(function(a){return a.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"æ—¥_一_二_三_å››_五_å…­".split("_"),longDateFormat:{LT:"Ah点mm",LTS:"Ah点m分s秒",L:"YYYY-MM-DD",LL:"YYYYå¹´MMMDæ—¥",LLL:"YYYYå¹´MMMDæ—¥LT",LLLL:"YYYYå¹´MMMDæ—¥ddddLT",l:"YYYY-MM-DD",ll:"YYYYå¹´MMMDæ—¥",lll:"YYYYå¹´MMMDæ—¥LT",llll:"YYYYå¹´MMMDæ—¥ddddLT"},meridiemParse:/凌晨|早上|上åˆ|中åˆ|下åˆ|晚上/,meridiemHour:function(a,b){return 12===a&&(a=0),"凌晨"===b||"早上"===b||"上åˆ"===b?a:"下åˆ"===b||"晚上"===b?a+12:a>=11?a:a+12},meridiem:function(a,b){var c=100*a+b;return 600>c?"凌晨":900>c?"早上":1130>c?"上åˆ":1230>c?"中åˆ":1800>c?"下åˆ":"晚上"},calendar:{sameDay:function(){return 0===this.minutes()?"[今天]Ah[点整]":"[今天]LT"},nextDay:function(){return 0===this.minutes()?"[明天]Ah[点整]":"[明天]LT"},lastDay:function(){return 0===this.minutes()?"[昨天]Ah[点整]":"[昨天]LT"},nextWeek:function(){var b,c;return b=a().startOf("week"),c=this.unix()-b.unix()>=604800?"[下]":"[本]",0===this.minutes()?c+"dddAh点整":c+"dddAh点mm"},lastWeek:function(){var b,c;return b=a().startOf("week"),c=this.unix()=11?a:a+12:"下åˆ"===b||"晚上"===b?a+12:void 0},meridiem:function(a,b){var c=100*a+b;return 900>c?"早上":1130>c?"上åˆ":1230>c?"中åˆ":1800>c?"下åˆ":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},ordinalParse:/\d{1,2}(æ—¥|月|週)/,ordinal:function(a,b){switch(b){case"d":case"D":case"DDD":return a+"æ—¥";case"M":return a+"月";case"w":case"W":return a+"週";default:return a}},relativeTime:{future:"%så…§",past:"%så‰",s:"幾秒",m:"一分é˜",mm:"%d分é˜",h:"一å°æ™‚",hh:"%då°æ™‚",d:"一天",dd:"%d天",M:"一個月",MM:"%d個月",y:"一年",yy:"%då¹´"}})}),vb.locale("en"),Lb?module.exports=vb:"function"==typeof define&&define.amd?(define(function(a,b,c){return c.config&&c.config()&&c.config().noGlobal===!0&&(zb.moment=wb),vb}),ub(!0)):ub()}).call(this); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/moment.min.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/moment.min.js deleted file mode 100644 index 024d488..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/min/moment.min.js +++ /dev/null @@ -1,7 +0,0 @@ -//! moment.js -//! version : 2.9.0 -//! authors : Tim Wood, Iskren Chernev, Moment.js contributors -//! license : MIT -//! momentjs.com -(function(a){function b(a,b,c){switch(arguments.length){case 2:return null!=a?a:b;case 3:return null!=a?a:null!=b?b:c;default:throw new Error("Implement me")}}function c(a,b){return Bb.call(a,b)}function d(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function e(a){vb.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+a)}function f(a,b){var c=!0;return o(function(){return c&&(e(a),c=!1),b.apply(this,arguments)},b)}function g(a,b){sc[a]||(e(b),sc[a]=!0)}function h(a,b){return function(c){return r(a.call(this,c),b)}}function i(a,b){return function(c){return this.localeData().ordinal(a.call(this,c),b)}}function j(a,b){var c,d,e=12*(b.year()-a.year())+(b.month()-a.month()),f=a.clone().add(e,"months");return 0>b-f?(c=a.clone().add(e-1,"months"),d=(b-f)/(f-c)):(c=a.clone().add(e+1,"months"),d=(b-f)/(c-f)),-(e+d)}function k(a,b,c){var d;return null==c?b:null!=a.meridiemHour?a.meridiemHour(b,c):null!=a.isPM?(d=a.isPM(c),d&&12>b&&(b+=12),d||12!==b||(b=0),b):b}function l(){}function m(a,b){b!==!1&&H(a),p(this,a),this._d=new Date(+a._d),uc===!1&&(uc=!0,vb.updateOffset(this),uc=!1)}function n(a){var b=A(a),c=b.year||0,d=b.quarter||0,e=b.month||0,f=b.week||0,g=b.day||0,h=b.hour||0,i=b.minute||0,j=b.second||0,k=b.millisecond||0;this._milliseconds=+k+1e3*j+6e4*i+36e5*h,this._days=+g+7*f,this._months=+e+3*d+12*c,this._data={},this._locale=vb.localeData(),this._bubble()}function o(a,b){for(var d in b)c(b,d)&&(a[d]=b[d]);return c(b,"toString")&&(a.toString=b.toString),c(b,"valueOf")&&(a.valueOf=b.valueOf),a}function p(a,b){var c,d,e;if("undefined"!=typeof b._isAMomentObject&&(a._isAMomentObject=b._isAMomentObject),"undefined"!=typeof b._i&&(a._i=b._i),"undefined"!=typeof b._f&&(a._f=b._f),"undefined"!=typeof b._l&&(a._l=b._l),"undefined"!=typeof b._strict&&(a._strict=b._strict),"undefined"!=typeof b._tzm&&(a._tzm=b._tzm),"undefined"!=typeof b._isUTC&&(a._isUTC=b._isUTC),"undefined"!=typeof b._offset&&(a._offset=b._offset),"undefined"!=typeof b._pf&&(a._pf=b._pf),"undefined"!=typeof b._locale&&(a._locale=b._locale),Kb.length>0)for(c in Kb)d=Kb[c],e=b[d],"undefined"!=typeof e&&(a[d]=e);return a}function q(a){return 0>a?Math.ceil(a):Math.floor(a)}function r(a,b,c){for(var d=""+Math.abs(a),e=a>=0;d.lengthd;d++)(c&&a[d]!==b[d]||!c&&C(a[d])!==C(b[d]))&&g++;return g+f}function z(a){if(a){var b=a.toLowerCase().replace(/(.)s$/,"$1");a=lc[a]||mc[b]||b}return a}function A(a){var b,d,e={};for(d in a)c(a,d)&&(b=z(d),b&&(e[b]=a[d]));return e}function B(b){var c,d;if(0===b.indexOf("week"))c=7,d="day";else{if(0!==b.indexOf("month"))return;c=12,d="month"}vb[b]=function(e,f){var g,h,i=vb._locale[b],j=[];if("number"==typeof e&&(f=e,e=a),h=function(a){var b=vb().utc().set(d,a);return i.call(vb._locale,b,e||"")},null!=f)return h(f);for(g=0;c>g;g++)j.push(h(g));return j}}function C(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=b>=0?Math.floor(b):Math.ceil(b)),c}function D(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function E(a,b,c){return jb(vb([a,11,31+b-c]),b,c).week}function F(a){return G(a)?366:365}function G(a){return a%4===0&&a%100!==0||a%400===0}function H(a){var b;a._a&&-2===a._pf.overflow&&(b=a._a[Db]<0||a._a[Db]>11?Db:a._a[Eb]<1||a._a[Eb]>D(a._a[Cb],a._a[Db])?Eb:a._a[Fb]<0||a._a[Fb]>24||24===a._a[Fb]&&(0!==a._a[Gb]||0!==a._a[Hb]||0!==a._a[Ib])?Fb:a._a[Gb]<0||a._a[Gb]>59?Gb:a._a[Hb]<0||a._a[Hb]>59?Hb:a._a[Ib]<0||a._a[Ib]>999?Ib:-1,a._pf._overflowDayOfYear&&(Cb>b||b>Eb)&&(b=Eb),a._pf.overflow=b)}function I(b){return null==b._isValid&&(b._isValid=!isNaN(b._d.getTime())&&b._pf.overflow<0&&!b._pf.empty&&!b._pf.invalidMonth&&!b._pf.nullInput&&!b._pf.invalidFormat&&!b._pf.userInvalidated,b._strict&&(b._isValid=b._isValid&&0===b._pf.charsLeftOver&&0===b._pf.unusedTokens.length&&b._pf.bigHour===a)),b._isValid}function J(a){return a?a.toLowerCase().replace("_","-"):a}function K(a){for(var b,c,d,e,f=0;f0;){if(d=L(e.slice(0,b).join("-")))return d;if(c&&c.length>=b&&y(e,c,!0)>=b-1)break;b--}f++}return null}function L(a){var b=null;if(!Jb[a]&&Lb)try{b=vb.locale(),require("./locale/"+a),vb.locale(b)}catch(c){}return Jb[a]}function M(a,b){var c,d;return b._isUTC?(c=b.clone(),d=(vb.isMoment(a)||x(a)?+a:+vb(a))-+c,c._d.setTime(+c._d+d),vb.updateOffset(c,!1),c):vb(a).local()}function N(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function O(a){var b,c,d=a.match(Pb);for(b=0,c=d.length;c>b;b++)d[b]=rc[d[b]]?rc[d[b]]:N(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 P(a,b){return a.isValid()?(b=Q(b,a.localeData()),nc[b]||(nc[b]=O(b)),nc[b](a)):a.localeData().invalidDate()}function Q(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(Qb.lastIndex=0;d>=0&&Qb.test(a);)a=a.replace(Qb,c),Qb.lastIndex=0,d-=1;return a}function R(a,b){var c,d=b._strict;switch(a){case"Q":return _b;case"DDDD":return bc;case"YYYY":case"GGGG":case"gggg":return d?cc:Tb;case"Y":case"G":case"g":return ec;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return d?dc:Ub;case"S":if(d)return _b;case"SS":if(d)return ac;case"SSS":if(d)return bc;case"DDD":return Sb;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Wb;case"a":case"A":return b._locale._meridiemParse;case"x":return Zb;case"X":return $b;case"Z":case"ZZ":return Xb;case"T":return Yb;case"SSSS":return Vb;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return d?ac:Rb;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return Rb;case"Do":return d?b._locale._ordinalParse:b._locale._ordinalParseLenient;default:return c=new RegExp($(Z(a.replace("\\","")),"i"))}}function S(a){a=a||"";var b=a.match(Xb)||[],c=b[b.length-1]||[],d=(c+"").match(jc)||["-",0,0],e=+(60*d[1])+C(d[2]);return"+"===d[0]?e:-e}function T(a,b,c){var d,e=c._a;switch(a){case"Q":null!=b&&(e[Db]=3*(C(b)-1));break;case"M":case"MM":null!=b&&(e[Db]=C(b)-1);break;case"MMM":case"MMMM":d=c._locale.monthsParse(b,a,c._strict),null!=d?e[Db]=d:c._pf.invalidMonth=b;break;case"D":case"DD":null!=b&&(e[Eb]=C(b));break;case"Do":null!=b&&(e[Eb]=C(parseInt(b.match(/\d{1,2}/)[0],10)));break;case"DDD":case"DDDD":null!=b&&(c._dayOfYear=C(b));break;case"YY":e[Cb]=vb.parseTwoDigitYear(b);break;case"YYYY":case"YYYYY":case"YYYYYY":e[Cb]=C(b);break;case"a":case"A":c._meridiem=b;break;case"h":case"hh":c._pf.bigHour=!0;case"H":case"HH":e[Fb]=C(b);break;case"m":case"mm":e[Gb]=C(b);break;case"s":case"ss":e[Hb]=C(b);break;case"S":case"SS":case"SSS":case"SSSS":e[Ib]=C(1e3*("0."+b));break;case"x":c._d=new Date(C(b));break;case"X":c._d=new Date(1e3*parseFloat(b));break;case"Z":case"ZZ":c._useUTC=!0,c._tzm=S(b);break;case"dd":case"ddd":case"dddd":d=c._locale.weekdaysParse(b),null!=d?(c._w=c._w||{},c._w.d=d):c._pf.invalidWeekday=b;break;case"w":case"ww":case"W":case"WW":case"d":case"e":case"E":a=a.substr(0,1);case"gggg":case"GGGG":case"GGGGG":a=a.substr(0,2),b&&(c._w=c._w||{},c._w[a]=C(b));break;case"gg":case"GG":c._w=c._w||{},c._w[a]=vb.parseTwoDigitYear(b)}}function U(a){var c,d,e,f,g,h,i;c=a._w,null!=c.GG||null!=c.W||null!=c.E?(g=1,h=4,d=b(c.GG,a._a[Cb],jb(vb(),1,4).year),e=b(c.W,1),f=b(c.E,1)):(g=a._locale._week.dow,h=a._locale._week.doy,d=b(c.gg,a._a[Cb],jb(vb(),g,h).year),e=b(c.w,1),null!=c.d?(f=c.d,g>f&&++e):f=null!=c.e?c.e+g:g),i=kb(d,e,f,h,g),a._a[Cb]=i.year,a._dayOfYear=i.dayOfYear}function V(a){var c,d,e,f,g=[];if(!a._d){for(e=X(a),a._w&&null==a._a[Eb]&&null==a._a[Db]&&U(a),a._dayOfYear&&(f=b(a._a[Cb],e[Cb]),a._dayOfYear>F(f)&&(a._pf._overflowDayOfYear=!0),d=fb(f,0,a._dayOfYear),a._a[Db]=d.getUTCMonth(),a._a[Eb]=d.getUTCDate()),c=0;3>c&&null==a._a[c];++c)a._a[c]=g[c]=e[c];for(;7>c;c++)a._a[c]=g[c]=null==a._a[c]?2===c?1:0:a._a[c];24===a._a[Fb]&&0===a._a[Gb]&&0===a._a[Hb]&&0===a._a[Ib]&&(a._nextDay=!0,a._a[Fb]=0),a._d=(a._useUTC?fb:eb).apply(null,g),null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()-a._tzm),a._nextDay&&(a._a[Fb]=24)}}function W(a){var b;a._d||(b=A(a._i),a._a=[b.year,b.month,b.day||b.date,b.hour,b.minute,b.second,b.millisecond],V(a))}function X(a){var b=new Date;return a._useUTC?[b.getUTCFullYear(),b.getUTCMonth(),b.getUTCDate()]:[b.getFullYear(),b.getMonth(),b.getDate()]}function Y(b){if(b._f===vb.ISO_8601)return void ab(b);b._a=[],b._pf.empty=!0;var c,d,e,f,g,h=""+b._i,i=h.length,j=0;for(e=Q(b._f,b._locale).match(Pb)||[],c=0;c0&&b._pf.unusedInput.push(g),h=h.slice(h.indexOf(d)+d.length),j+=d.length),rc[f]?(d?b._pf.empty=!1:b._pf.unusedTokens.push(f),T(f,d,b)):b._strict&&!d&&b._pf.unusedTokens.push(f);b._pf.charsLeftOver=i-j,h.length>0&&b._pf.unusedInput.push(h),b._pf.bigHour===!0&&b._a[Fb]<=12&&(b._pf.bigHour=a),b._a[Fb]=k(b._locale,b._a[Fb],b._meridiem),V(b),H(b)}function Z(a){return a.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e})}function $(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function _(a){var b,c,e,f,g;if(0===a._f.length)return a._pf.invalidFormat=!0,void(a._d=new Date(0/0));for(f=0;fg)&&(e=g,c=b));o(a,c||b)}function ab(a){var b,c,d=a._i,e=fc.exec(d);if(e){for(a._pf.iso=!0,b=0,c=hc.length;c>b;b++)if(hc[b][1].exec(d)){a._f=hc[b][0]+(e[6]||" ");break}for(b=0,c=ic.length;c>b;b++)if(ic[b][1].exec(d)){a._f+=ic[b][0];break}d.match(Xb)&&(a._f+="Z"),Y(a)}else a._isValid=!1}function bb(a){ab(a),a._isValid===!1&&(delete a._isValid,vb.createFromInputFallback(a))}function cb(a,b){var c,d=[];for(c=0;ca&&h.setFullYear(a),h}function fb(a){var b=new Date(Date.UTC.apply(null,arguments));return 1970>a&&b.setUTCFullYear(a),b}function gb(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 hb(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function ib(a,b,c){var d=vb.duration(a).abs(),e=Ab(d.as("s")),f=Ab(d.as("m")),g=Ab(d.as("h")),h=Ab(d.as("d")),i=Ab(d.as("M")),j=Ab(d.as("y")),k=e0,k[4]=c,hb.apply({},k)}function jb(a,b,c){var d,e=c-b,f=c-a.day();return f>e&&(f-=7),e-7>f&&(f+=7),d=vb(a).add(f,"d"),{week:Math.ceil(d.dayOfYear()/7),year:d.year()}}function kb(a,b,c,d,e){var f,g,h=fb(a,0,1).getUTCDay();return h=0===h?7:h,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:F(a-1)+g}}function lb(b){var c,d=b._i,e=b._f;return b._locale=b._locale||vb.localeData(b._l),null===d||e===a&&""===d?vb.invalid({nullInput:!0}):("string"==typeof d&&(b._i=d=b._locale.preparse(d)),vb.isMoment(d)?new m(d,!0):(e?w(e)?_(b):Y(b):db(b),c=new m(b),c._nextDay&&(c.add(1,"d"),c._nextDay=a),c))}function mb(a,b){var c,d;if(1===b.length&&w(b[0])&&(b=b[0]),!b.length)return vb();for(c=b[0],d=1;d=0?"+":"-";return b+r(Math.abs(a),6)},gg:function(){return r(this.weekYear()%100,2)},gggg:function(){return r(this.weekYear(),4)},ggggg:function(){return r(this.weekYear(),5)},GG:function(){return r(this.isoWeekYear()%100,2)},GGGG:function(){return r(this.isoWeekYear(),4)},GGGGG:function(){return r(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.localeData().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.localeData().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 C(this.milliseconds()/100)},SS:function(){return r(C(this.milliseconds()/10),2)},SSS:function(){return r(this.milliseconds(),3)},SSSS:function(){return r(this.milliseconds(),3)},Z:function(){var a=this.utcOffset(),b="+";return 0>a&&(a=-a,b="-"),b+r(C(a/60),2)+":"+r(C(a)%60,2)},ZZ:function(){var a=this.utcOffset(),b="+";return 0>a&&(a=-a,b="-"),b+r(C(a/60),2)+r(C(a)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},x:function(){return this.valueOf()},X:function(){return this.unix()},Q:function(){return this.quarter()}},sc={},tc=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"],uc=!1;pc.length;)xb=pc.pop(),rc[xb+"o"]=i(rc[xb],xb);for(;qc.length;)xb=qc.pop(),rc[xb+xb]=h(rc[xb],2);rc.DDDD=h(rc.DDD,3),o(l.prototype,{set:function(a){var b,c;for(c in a)b=a[c],"function"==typeof b?this[c]=b:this["_"+c]=b;this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)},_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,b,c){var d,e,f;for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),d=0;12>d;d++){if(e=vb.utc([2e3,d]),c&&!this._longMonthsParse[d]&&(this._longMonthsParse[d]=new RegExp("^"+this.months(e,"").replace(".","")+"$","i"),this._shortMonthsParse[d]=new RegExp("^"+this.monthsShort(e,"").replace(".","")+"$","i")),c||this._monthsParse[d]||(f="^"+this.months(e,"")+"|^"+this.monthsShort(e,""),this._monthsParse[d]=new RegExp(f.replace(".",""),"i")),c&&"MMMM"===b&&this._longMonthsParse[d].test(a))return d;if(c&&"MMM"===b&&this._shortMonthsParse[d].test(a))return d;if(!c&&this._monthsParse[d].test(a))return d}},_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=vb([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:{LTS:"h:mm:ss A",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,c){var d=this._calendar[a];return"function"==typeof d?d.apply(b,[c]):d},_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",_ordinalParse:/\d{1,2}/,preparse:function(a){return a},postformat:function(a){return a},week:function(a){return jb(a,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},firstDayOfWeek:function(){return this._week.dow},firstDayOfYear:function(){return this._week.doy},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),vb=function(b,c,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._i=b,g._f=c,g._l=e,g._strict=f,g._isUTC=!1,g._pf=d(),lb(g)},vb.suppressDeprecationWarnings=!1,vb.createFromInputFallback=f("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(a){a._d=new Date(a._i+(a._useUTC?" UTC":""))}),vb.min=function(){var a=[].slice.call(arguments,0);return mb("isBefore",a)},vb.max=function(){var a=[].slice.call(arguments,0);return mb("isAfter",a)},vb.utc=function(b,c,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=b,g._f=c,g._strict=f,g._pf=d(),lb(g).utc()},vb.unix=function(a){return vb(1e3*a)},vb.duration=function(a,b){var d,e,f,g,h=a,i=null;return vb.isDuration(a)?h={ms:a._milliseconds,d:a._days,M:a._months}:"number"==typeof a?(h={},b?h[b]=a:h.milliseconds=a):(i=Nb.exec(a))?(d="-"===i[1]?-1:1,h={y:0,d:C(i[Eb])*d,h:C(i[Fb])*d,m:C(i[Gb])*d,s:C(i[Hb])*d,ms:C(i[Ib])*d}):(i=Ob.exec(a))?(d="-"===i[1]?-1:1,f=function(a){var b=a&&parseFloat(a.replace(",","."));return(isNaN(b)?0:b)*d},h={y:f(i[2]),M:f(i[3]),d:f(i[4]),h:f(i[5]),m:f(i[6]),s:f(i[7]),w:f(i[8])}):null==h?h={}:"object"==typeof h&&("from"in h||"to"in h)&&(g=t(vb(h.from),vb(h.to)),h={},h.ms=g.milliseconds,h.M=g.months),e=new n(h),vb.isDuration(a)&&c(a,"_locale")&&(e._locale=a._locale),e},vb.version=yb,vb.defaultFormat=gc,vb.ISO_8601=function(){},vb.momentProperties=Kb,vb.updateOffset=function(){},vb.relativeTimeThreshold=function(b,c){return oc[b]===a?!1:c===a?oc[b]:(oc[b]=c,!0)},vb.lang=f("moment.lang is deprecated. Use moment.locale instead.",function(a,b){return vb.locale(a,b)}),vb.locale=function(a,b){var c;return a&&(c="undefined"!=typeof b?vb.defineLocale(a,b):vb.localeData(a),c&&(vb.duration._locale=vb._locale=c)),vb._locale._abbr},vb.defineLocale=function(a,b){return null!==b?(b.abbr=a,Jb[a]||(Jb[a]=new l),Jb[a].set(b),vb.locale(a),Jb[a]):(delete Jb[a],null)},vb.langData=f("moment.langData is deprecated. Use moment.localeData instead.",function(a){return vb.localeData(a)}),vb.localeData=function(a){var b;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return vb._locale;if(!w(a)){if(b=L(a))return b;a=[a]}return K(a)},vb.isMoment=function(a){return a instanceof m||null!=a&&c(a,"_isAMomentObject")},vb.isDuration=function(a){return a instanceof n};for(xb=tc.length-1;xb>=0;--xb)B(tc[xb]);vb.normalizeUnits=function(a){return z(a)},vb.invalid=function(a){var b=vb.utc(0/0);return null!=a?o(b._pf,a):b._pf.userInvalidated=!0,b},vb.parseZone=function(){return vb.apply(null,arguments).parseZone()},vb.parseTwoDigitYear=function(a){return C(a)+(C(a)>68?1900:2e3)},vb.isDate=x,o(vb.fn=m.prototype,{clone:function(){return vb(this)},valueOf:function(){return+this._d-6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().locale("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=vb(this).utc();return 00:!1},parsingFlags:function(){return o({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(a){return this.utcOffset(0,a)},local:function(a){return this._isUTC&&(this.utcOffset(0,a),this._isUTC=!1,a&&this.subtract(this._dateUtcOffset(),"m")),this},format:function(a){var b=P(this,a||vb.defaultFormat);return this.localeData().postformat(b)},add:u(1,"add"),subtract:u(-1,"subtract"),diff:function(a,b,c){var d,e,f=M(a,this),g=6e4*(f.utcOffset()-this.utcOffset());return b=z(b),"year"===b||"month"===b||"quarter"===b?(e=j(this,f),"quarter"===b?e/=3:"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:q(e)},from:function(a,b){return vb.duration({to:this,from:a}).locale(this.locale()).humanize(!b)},fromNow:function(a){return this.from(vb(),a)},calendar:function(a){var b=a||vb(),c=M(b,this).startOf("day"),d=this.diff(c,"days",!0),e=-6>d?"sameElse":-1>d?"lastWeek":0>d?"lastDay":1>d?"sameDay":2>d?"nextDay":7>d?"nextWeek":"sameElse";return this.format(this.localeData().calendar(e,this,vb(b)))},isLeapYear:function(){return G(this.year())},isDST:function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},day:function(a){var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=gb(a,this.localeData()),this.add(a-b,"d")):b},month:qb("Month",!0),startOf:function(a){switch(a=z(a)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===a?this.weekday(0):"isoWeek"===a&&this.isoWeekday(1),"quarter"===a&&this.month(3*Math.floor(this.month()/3)),this},endOf:function(b){return b=z(b),b===a||"millisecond"===b?this:this.startOf(b).add(1,"isoWeek"===b?"week":b).subtract(1,"ms")},isAfter:function(a,b){var c;return b=z("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=vb.isMoment(a)?a:vb(a),+this>+a):(c=vb.isMoment(a)?+a:+vb(a),c<+this.clone().startOf(b))},isBefore:function(a,b){var c;return b=z("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=vb.isMoment(a)?a:vb(a),+a>+this):(c=vb.isMoment(a)?+a:+vb(a),+this.clone().endOf(b)a?this:a}),max:f("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(a){return a=vb.apply(null,arguments),a>this?this:a}),zone:f("moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779",function(a,b){return null!=a?("string"!=typeof a&&(a=-a),this.utcOffset(a,b),this):-this.utcOffset()}),utcOffset:function(a,b){var c,d=this._offset||0;return null!=a?("string"==typeof a&&(a=S(a)),Math.abs(a)<16&&(a=60*a),!this._isUTC&&b&&(c=this._dateUtcOffset()),this._offset=a,this._isUTC=!0,null!=c&&this.add(c,"m"),d!==a&&(!b||this._changeInProgress?v(this,vb.duration(a-d,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,vb.updateOffset(this,!0),this._changeInProgress=null)),this):this._isUTC?d:this._dateUtcOffset()},isLocal:function(){return!this._isUTC},isUtcOffset:function(){return this._isUTC},isUtc:function(){return this._isUTC&&0===this._offset},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.utcOffset(this._tzm):"string"==typeof this._i&&this.utcOffset(S(this._i)),this},hasAlignedHourOffset:function(a){return a=a?vb(a).utcOffset():0,(this.utcOffset()-a)%60===0},daysInMonth:function(){return D(this.year(),this.month())},dayOfYear:function(a){var b=Ab((vb(this).startOf("day")-vb(this).startOf("year"))/864e5)+1;return null==a?b:this.add(a-b,"d")},quarter:function(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)},weekYear:function(a){var b=jb(this,this.localeData()._week.dow,this.localeData()._week.doy).year;return null==a?b:this.add(a-b,"y")},isoWeekYear:function(a){var b=jb(this,1,4).year;return null==a?b:this.add(a-b,"y")},week:function(a){var b=this.localeData().week(this);return null==a?b:this.add(7*(a-b),"d")},isoWeek:function(a){var b=jb(this,1,4).week;return null==a?b:this.add(7*(a-b),"d")},weekday:function(a){var b=(this.day()+7-this.localeData()._week.dow)%7;return null==a?b:this.add(a-b,"d")},isoWeekday:function(a){return null==a?this.day()||7:this.day(this.day()%7?a:a-7)},isoWeeksInYear:function(){return E(this.year(),1,4)},weeksInYear:function(){var a=this.localeData()._week;return E(this.year(),a.dow,a.doy)},get:function(a){return a=z(a),this[a]()},set:function(a,b){var c;if("object"==typeof a)for(c in a)this.set(c,a[c]);else a=z(a),"function"==typeof this[a]&&this[a](b);return this},locale:function(b){var c;return b===a?this._locale._abbr:(c=vb.localeData(b),null!=c&&(this._locale=c),this)},lang:f("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(b){return b===a?this.localeData():this.locale(b)}),localeData:function(){return this._locale},_dateUtcOffset:function(){return 15*-Math.round(this._d.getTimezoneOffset()/15)}}),vb.fn.millisecond=vb.fn.milliseconds=qb("Milliseconds",!1),vb.fn.second=vb.fn.seconds=qb("Seconds",!1),vb.fn.minute=vb.fn.minutes=qb("Minutes",!1),vb.fn.hour=vb.fn.hours=qb("Hours",!0),vb.fn.date=qb("Date",!0),vb.fn.dates=f("dates accessor is deprecated. Use date instead.",qb("Date",!0)),vb.fn.year=qb("FullYear",!0),vb.fn.years=f("years accessor is deprecated. Use year instead.",qb("FullYear",!0)),vb.fn.days=vb.fn.day,vb.fn.months=vb.fn.month,vb.fn.weeks=vb.fn.week,vb.fn.isoWeeks=vb.fn.isoWeek,vb.fn.quarters=vb.fn.quarter,vb.fn.toJSON=vb.fn.toISOString,vb.fn.isUTC=vb.fn.isUtc,o(vb.duration.fn=n.prototype,{_bubble:function(){var a,b,c,d=this._milliseconds,e=this._days,f=this._months,g=this._data,h=0;g.milliseconds=d%1e3,a=q(d/1e3),g.seconds=a%60,b=q(a/60),g.minutes=b%60,c=q(b/60),g.hours=c%24,e+=q(c/24),h=q(rb(e)),e-=q(sb(h)),f+=q(e/30),e%=30,h+=q(f/12),f%=12,g.days=e,g.months=f,g.years=h},abs:function(){return this._milliseconds=Math.abs(this._milliseconds),this._days=Math.abs(this._days),this._months=Math.abs(this._months),this._data.milliseconds=Math.abs(this._data.milliseconds),this._data.seconds=Math.abs(this._data.seconds),this._data.minutes=Math.abs(this._data.minutes),this._data.hours=Math.abs(this._data.hours),this._data.months=Math.abs(this._data.months),this._data.years=Math.abs(this._data.years),this},weeks:function(){return q(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*C(this._months/12) -},humanize:function(a){var b=ib(this,!a,this.localeData());return a&&(b=this.localeData().pastFuture(+this,b)),this.localeData().postformat(b)},add:function(a,b){var c=vb.duration(a,b);return this._milliseconds+=c._milliseconds,this._days+=c._days,this._months+=c._months,this._bubble(),this},subtract:function(a,b){var c=vb.duration(a,b);return this._milliseconds-=c._milliseconds,this._days-=c._days,this._months-=c._months,this._bubble(),this},get:function(a){return a=z(a),this[a.toLowerCase()+"s"]()},as:function(a){var b,c;if(a=z(a),"month"===a||"year"===a)return b=this._days+this._milliseconds/864e5,c=this._months+12*rb(b),"month"===a?c:c/12;switch(b=this._days+Math.round(sb(this._months/12)),a){case"week":return b/7+this._milliseconds/6048e5;case"day":return b+this._milliseconds/864e5;case"hour":return 24*b+this._milliseconds/36e5;case"minute":return 24*b*60+this._milliseconds/6e4;case"second":return 24*b*60*60+this._milliseconds/1e3;case"millisecond":return Math.floor(24*b*60*60*1e3)+this._milliseconds;default:throw new Error("Unknown unit "+a)}},lang:vb.fn.lang,locale:vb.fn.locale,toIsoString:f("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",function(){return this.toISOString()}),toISOString:function(){var a=Math.abs(this.years()),b=Math.abs(this.months()),c=Math.abs(this.days()),d=Math.abs(this.hours()),e=Math.abs(this.minutes()),f=Math.abs(this.seconds()+this.milliseconds()/1e3);return this.asSeconds()?(this.asSeconds()<0?"-":"")+"P"+(a?a+"Y":"")+(b?b+"M":"")+(c?c+"D":"")+(d||e||f?"T":"")+(d?d+"H":"")+(e?e+"M":"")+(f?f+"S":""):"P0D"},localeData:function(){return this._locale},toJSON:function(){return this.toISOString()}}),vb.duration.fn.toString=vb.duration.fn.toISOString;for(xb in kc)c(kc,xb)&&tb(xb.toLowerCase());vb.duration.fn.asMilliseconds=function(){return this.as("ms")},vb.duration.fn.asSeconds=function(){return this.as("s")},vb.duration.fn.asMinutes=function(){return this.as("m")},vb.duration.fn.asHours=function(){return this.as("h")},vb.duration.fn.asDays=function(){return this.as("d")},vb.duration.fn.asWeeks=function(){return this.as("weeks")},vb.duration.fn.asMonths=function(){return this.as("M")},vb.duration.fn.asYears=function(){return this.as("y")},vb.locale("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var b=a%10,c=1===C(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}),Lb?module.exports=vb:"function"==typeof define&&define.amd?(define(function(a,b,c){return c.config&&c.config()&&c.config().noGlobal===!0&&(zb.moment=wb),vb}),ub(!0)):ub()}).call(this); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/moment.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/moment.js deleted file mode 100644 index c635ec0..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/moment.js +++ /dev/null @@ -1,3043 +0,0 @@ -//! moment.js -//! version : 2.9.0 -//! authors : Tim Wood, Iskren Chernev, Moment.js contributors -//! license : MIT -//! momentjs.com - -(function (undefined) { - /************************************ - Constants - ************************************/ - - var moment, - VERSION = '2.9.0', - // the global-scope this is NOT the global object in Node.js - globalScope = (typeof global !== 'undefined' && (typeof window === 'undefined' || window === global.window)) ? global : this, - oldGlobalMoment, - round = Math.round, - hasOwnProperty = Object.prototype.hasOwnProperty, - i, - - YEAR = 0, - MONTH = 1, - DATE = 2, - HOUR = 3, - MINUTE = 4, - SECOND = 5, - MILLISECOND = 6, - - // internal storage for locale config files - locales = {}, - - // extra moment internal properties (plugins register props here) - momentProperties = [], - - // check for nodeJS - hasModule = (typeof module !== 'undefined' && module && module.exports), - - // ASP.NET json date format regex - aspNetJsonRegex = /^\/?Date\((\-?\d+)/i, - aspNetTimeSpanJsonRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/, - - // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html - // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere - isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/, - - // format tokens - formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|x|X|zz?|ZZ?|.)/g, - localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, - - // parsing token regexes - parseTokenOneOrTwoDigits = /\d\d?/, // 0 - 99 - parseTokenOneToThreeDigits = /\d{1,3}/, // 0 - 999 - parseTokenOneToFourDigits = /\d{1,4}/, // 0 - 9999 - parseTokenOneToSixDigits = /[+\-]?\d{1,6}/, // -999,999 - 999,999 - parseTokenDigits = /\d+/, // nonzero number of digits - parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i, // any word (or two) characters or numbers including two/three word month in arabic. - parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z - parseTokenT = /T/i, // T (ISO separator) - parseTokenOffsetMs = /[\+\-]?\d+/, // 1234567890123 - parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123 - - //strict parsing regexes - parseTokenOneDigit = /\d/, // 0 - 9 - parseTokenTwoDigits = /\d\d/, // 00 - 99 - parseTokenThreeDigits = /\d{3}/, // 000 - 999 - parseTokenFourDigits = /\d{4}/, // 0000 - 9999 - parseTokenSixDigits = /[+-]?\d{6}/, // -999,999 - 999,999 - parseTokenSignedNumber = /[+-]?\d+/, // -inf - inf - - // iso 8601 regex - // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) - isoRegex = /^\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)?)?$/, - - isoFormat = 'YYYY-MM-DDTHH:mm:ssZ', - - isoDates = [ - ['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}/] - ], - - // iso time formats and regexes - isoTimes = [ - ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d+/], - ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/], - ['HH:mm', /(T| )\d\d:\d\d/], - ['HH', /(T| )\d\d/] - ], - - // timezone chunker '+10:00' > ['10', '00'] or '-1530' > ['-', '15', '30'] - parseTimezoneChunker = /([\+\-]|\d\d)/gi, - - // getter and setter names - proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'), - unitMillisecondFactors = { - 'Milliseconds' : 1, - 'Seconds' : 1e3, - 'Minutes' : 6e4, - 'Hours' : 36e5, - 'Days' : 864e5, - 'Months' : 2592e6, - 'Years' : 31536e6 - }, - - unitAliases = { - ms : 'millisecond', - s : 'second', - m : 'minute', - h : 'hour', - d : 'day', - D : 'date', - w : 'week', - W : 'isoWeek', - M : 'month', - Q : 'quarter', - y : 'year', - DDD : 'dayOfYear', - e : 'weekday', - E : 'isoWeekday', - gg: 'weekYear', - GG: 'isoWeekYear' - }, - - camelFunctions = { - dayofyear : 'dayOfYear', - isoweekday : 'isoWeekday', - isoweek : 'isoWeek', - weekyear : 'weekYear', - isoweekyear : 'isoWeekYear' - }, - - // format function strings - formatFunctions = {}, - - // default relative time thresholds - relativeTimeThresholds = { - s: 45, // seconds to minute - m: 45, // minutes to hour - h: 22, // hours to day - d: 26, // days to month - M: 11 // months to year - }, - - // tokens to ordinalize and pad - ordinalizeTokens = 'DDD w W M D d'.split(' '), - paddedTokens = 'M D H h m s w W'.split(' '), - - formatTokenFunctions = { - M : function () { - return this.month() + 1; - }, - MMM : function (format) { - return this.localeData().monthsShort(this, format); - }, - MMMM : function (format) { - return this.localeData().months(this, format); - }, - D : function () { - return this.date(); - }, - DDD : function () { - return this.dayOfYear(); - }, - d : function () { - return this.day(); - }, - dd : function (format) { - return this.localeData().weekdaysMin(this, format); - }, - ddd : function (format) { - return this.localeData().weekdaysShort(this, format); - }, - dddd : function (format) { - return this.localeData().weekdays(this, format); - }, - w : function () { - return this.week(); - }, - W : function () { - return this.isoWeek(); - }, - YY : function () { - return leftZeroFill(this.year() % 100, 2); - }, - YYYY : function () { - return leftZeroFill(this.year(), 4); - }, - YYYYY : function () { - return leftZeroFill(this.year(), 5); - }, - YYYYYY : function () { - var y = this.year(), sign = y >= 0 ? '+' : '-'; - return sign + leftZeroFill(Math.abs(y), 6); - }, - gg : function () { - return leftZeroFill(this.weekYear() % 100, 2); - }, - gggg : function () { - return leftZeroFill(this.weekYear(), 4); - }, - ggggg : function () { - return leftZeroFill(this.weekYear(), 5); - }, - GG : function () { - return leftZeroFill(this.isoWeekYear() % 100, 2); - }, - GGGG : function () { - return leftZeroFill(this.isoWeekYear(), 4); - }, - GGGGG : function () { - return leftZeroFill(this.isoWeekYear(), 5); - }, - e : function () { - return this.weekday(); - }, - E : function () { - return this.isoWeekday(); - }, - a : function () { - return this.localeData().meridiem(this.hours(), this.minutes(), true); - }, - A : function () { - return this.localeData().meridiem(this.hours(), this.minutes(), false); - }, - 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 toInt(this.milliseconds() / 100); - }, - SS : function () { - return leftZeroFill(toInt(this.milliseconds() / 10), 2); - }, - SSS : function () { - return leftZeroFill(this.milliseconds(), 3); - }, - SSSS : function () { - return leftZeroFill(this.milliseconds(), 3); - }, - Z : function () { - var a = this.utcOffset(), - b = '+'; - if (a < 0) { - a = -a; - b = '-'; - } - return b + leftZeroFill(toInt(a / 60), 2) + ':' + leftZeroFill(toInt(a) % 60, 2); - }, - ZZ : function () { - var a = this.utcOffset(), - b = '+'; - if (a < 0) { - a = -a; - b = '-'; - } - return b + leftZeroFill(toInt(a / 60), 2) + leftZeroFill(toInt(a) % 60, 2); - }, - z : function () { - return this.zoneAbbr(); - }, - zz : function () { - return this.zoneName(); - }, - x : function () { - return this.valueOf(); - }, - X : function () { - return this.unix(); - }, - Q : function () { - return this.quarter(); - } - }, - - deprecations = {}, - - lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin'], - - updateInProgress = false; - - // Pick the first defined of two or three arguments. dfl comes from - // default. - function dfl(a, b, c) { - switch (arguments.length) { - case 2: return a != null ? a : b; - case 3: return a != null ? a : b != null ? b : c; - default: throw new Error('Implement me'); - } - } - - function hasOwnProp(a, b) { - return hasOwnProperty.call(a, b); - } - - function defaultParsingFlags() { - // We need to deep clone this object, and es5 standard is not very - // helpful. - return { - empty : false, - unusedTokens : [], - unusedInput : [], - overflow : -2, - charsLeftOver : 0, - nullInput : false, - invalidMonth : null, - invalidFormat : false, - userInvalidated : false, - iso: false - }; - } - - function printMsg(msg) { - if (moment.suppressDeprecationWarnings === false && - typeof console !== 'undefined' && console.warn) { - console.warn('Deprecation warning: ' + msg); - } - } - - function deprecate(msg, fn) { - var firstTime = true; - return extend(function () { - if (firstTime) { - printMsg(msg); - firstTime = false; - } - return fn.apply(this, arguments); - }, fn); - } - - function deprecateSimple(name, msg) { - if (!deprecations[name]) { - printMsg(msg); - deprecations[name] = true; - } - } - - function padToken(func, count) { - return function (a) { - return leftZeroFill(func.call(this, a), count); - }; - } - function ordinalizeToken(func, period) { - return function (a) { - return this.localeData().ordinal(func.call(this, a), period); - }; - } - - function monthDiff(a, b) { - // difference in months - var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), - // b is in (anchor - 1 month, anchor + 1 month) - anchor = a.clone().add(wholeMonthDiff, 'months'), - anchor2, adjust; - - if (b - anchor < 0) { - anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); - // linear across the month - adjust = (b - anchor) / (anchor - anchor2); - } else { - anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); - // linear across the month - adjust = (b - anchor) / (anchor2 - anchor); - } - - return -(wholeMonthDiff + adjust); - } - - while (ordinalizeTokens.length) { - i = ordinalizeTokens.pop(); - formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i); - } - while (paddedTokens.length) { - i = paddedTokens.pop(); - formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2); - } - formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3); - - - function meridiemFixWrap(locale, hour, meridiem) { - var isPm; - - if (meridiem == null) { - // nothing to do - return hour; - } - if (locale.meridiemHour != null) { - return locale.meridiemHour(hour, meridiem); - } else if (locale.isPM != null) { - // Fallback - isPm = locale.isPM(meridiem); - if (isPm && hour < 12) { - hour += 12; - } - if (!isPm && hour === 12) { - hour = 0; - } - return hour; - } else { - // thie is not supposed to happen - return hour; - } - } - - /************************************ - Constructors - ************************************/ - - function Locale() { - } - - // Moment prototype object - function Moment(config, skipOverflow) { - if (skipOverflow !== false) { - checkOverflow(config); - } - copyConfig(this, config); - this._d = new Date(+config._d); - // Prevent infinite loop in case updateOffset creates new moment - // objects. - if (updateInProgress === false) { - updateInProgress = true; - moment.updateOffset(this); - updateInProgress = false; - } - } - - // Duration Constructor - function Duration(duration) { - var normalizedInput = normalizeObjectUnits(duration), - years = normalizedInput.year || 0, - quarters = normalizedInput.quarter || 0, - months = normalizedInput.month || 0, - weeks = normalizedInput.week || 0, - days = normalizedInput.day || 0, - hours = normalizedInput.hour || 0, - minutes = normalizedInput.minute || 0, - seconds = normalizedInput.second || 0, - milliseconds = normalizedInput.millisecond || 0; - - // representation for dateAddRemove - this._milliseconds = +milliseconds + - seconds * 1e3 + // 1000 - minutes * 6e4 + // 1000 * 60 - hours * 36e5; // 1000 * 60 * 60 - // Because of dateAddRemove treats 24 hours as different from a - // day when working around DST, we need to store them separately - this._days = +days + - weeks * 7; - // It is impossible translate months into days without knowing - // which months you are are talking about, so we have to store - // it separately. - this._months = +months + - quarters * 3 + - years * 12; - - this._data = {}; - - this._locale = moment.localeData(); - - this._bubble(); - } - - /************************************ - Helpers - ************************************/ - - - function extend(a, b) { - for (var i in b) { - if (hasOwnProp(b, i)) { - a[i] = b[i]; - } - } - - if (hasOwnProp(b, 'toString')) { - a.toString = b.toString; - } - - if (hasOwnProp(b, 'valueOf')) { - a.valueOf = b.valueOf; - } - - return a; - } - - function copyConfig(to, from) { - var i, prop, val; - - if (typeof from._isAMomentObject !== 'undefined') { - to._isAMomentObject = from._isAMomentObject; - } - if (typeof from._i !== 'undefined') { - to._i = from._i; - } - if (typeof from._f !== 'undefined') { - to._f = from._f; - } - if (typeof from._l !== 'undefined') { - to._l = from._l; - } - if (typeof from._strict !== 'undefined') { - to._strict = from._strict; - } - if (typeof from._tzm !== 'undefined') { - to._tzm = from._tzm; - } - if (typeof from._isUTC !== 'undefined') { - to._isUTC = from._isUTC; - } - if (typeof from._offset !== 'undefined') { - to._offset = from._offset; - } - if (typeof from._pf !== 'undefined') { - to._pf = from._pf; - } - if (typeof from._locale !== 'undefined') { - to._locale = from._locale; - } - - if (momentProperties.length > 0) { - for (i in momentProperties) { - prop = momentProperties[i]; - val = from[prop]; - if (typeof val !== 'undefined') { - to[prop] = val; - } - } - } - - return to; - } - - function absRound(number) { - if (number < 0) { - return Math.ceil(number); - } else { - return Math.floor(number); - } - } - - // left zero fill a number - // see http://jsperf.com/left-zero-filling for performance comparison - function leftZeroFill(number, targetLength, forceSign) { - var output = '' + Math.abs(number), - sign = number >= 0; - - while (output.length < targetLength) { - output = '0' + output; - } - return (sign ? (forceSign ? '+' : '') : '-') + output; - } - - function positiveMomentsDifference(base, other) { - var res = {milliseconds: 0, months: 0}; - - res.months = other.month() - base.month() + - (other.year() - base.year()) * 12; - if (base.clone().add(res.months, 'M').isAfter(other)) { - --res.months; - } - - res.milliseconds = +other - +(base.clone().add(res.months, 'M')); - - return res; - } - - function momentsDifference(base, other) { - var res; - other = makeAs(other, base); - if (base.isBefore(other)) { - res = positiveMomentsDifference(base, other); - } else { - res = positiveMomentsDifference(other, base); - res.milliseconds = -res.milliseconds; - res.months = -res.months; - } - - return res; - } - - // TODO: remove 'name' arg after deprecation is removed - function createAdder(direction, name) { - return function (val, period) { - var dur, tmp; - //invert the arguments, but complain about it - if (period !== null && !isNaN(+period)) { - deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period).'); - tmp = val; val = period; period = tmp; - } - - val = typeof val === 'string' ? +val : val; - dur = moment.duration(val, period); - addOrSubtractDurationFromMoment(this, dur, direction); - return this; - }; - } - - function addOrSubtractDurationFromMoment(mom, duration, isAdding, updateOffset) { - var milliseconds = duration._milliseconds, - days = duration._days, - months = duration._months; - updateOffset = updateOffset == null ? true : updateOffset; - - if (milliseconds) { - mom._d.setTime(+mom._d + milliseconds * isAdding); - } - if (days) { - rawSetter(mom, 'Date', rawGetter(mom, 'Date') + days * isAdding); - } - if (months) { - rawMonthSetter(mom, rawGetter(mom, 'Month') + months * isAdding); - } - if (updateOffset) { - moment.updateOffset(mom, days || months); - } - } - - // check if is an array - function isArray(input) { - return Object.prototype.toString.call(input) === '[object Array]'; - } - - function isDate(input) { - return Object.prototype.toString.call(input) === '[object Date]' || - input instanceof Date; - } - - // compare two arrays, return the number of differences - function compareArrays(array1, array2, dontConvert) { - var len = Math.min(array1.length, array2.length), - lengthDiff = Math.abs(array1.length - array2.length), - diffs = 0, - i; - for (i = 0; i < len; i++) { - if ((dontConvert && array1[i] !== array2[i]) || - (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { - diffs++; - } - } - return diffs + lengthDiff; - } - - function normalizeUnits(units) { - if (units) { - var lowered = units.toLowerCase().replace(/(.)s$/, '$1'); - units = unitAliases[units] || camelFunctions[lowered] || lowered; - } - return units; - } - - function normalizeObjectUnits(inputObject) { - var normalizedInput = {}, - normalizedProp, - prop; - - for (prop in inputObject) { - if (hasOwnProp(inputObject, prop)) { - normalizedProp = normalizeUnits(prop); - if (normalizedProp) { - normalizedInput[normalizedProp] = inputObject[prop]; - } - } - } - - return normalizedInput; - } - - function makeList(field) { - var count, setter; - - if (field.indexOf('week') === 0) { - count = 7; - setter = 'day'; - } - else if (field.indexOf('month') === 0) { - count = 12; - setter = 'month'; - } - else { - return; - } - - moment[field] = function (format, index) { - var i, getter, - method = moment._locale[field], - results = []; - - if (typeof format === 'number') { - index = format; - format = undefined; - } - - getter = function (i) { - var m = moment().utc().set(setter, i); - return method.call(moment._locale, m, format || ''); - }; - - if (index != null) { - return getter(index); - } - else { - for (i = 0; i < count; i++) { - results.push(getter(i)); - } - return results; - } - }; - } - - function toInt(argumentForCoercion) { - var coercedNumber = +argumentForCoercion, - value = 0; - - if (coercedNumber !== 0 && isFinite(coercedNumber)) { - if (coercedNumber >= 0) { - value = Math.floor(coercedNumber); - } else { - value = Math.ceil(coercedNumber); - } - } - - return value; - } - - function daysInMonth(year, month) { - return new Date(Date.UTC(year, month + 1, 0)).getUTCDate(); - } - - function weeksInYear(year, dow, doy) { - return weekOfYear(moment([year, 11, 31 + dow - doy]), dow, doy).week; - } - - function daysInYear(year) { - return isLeapYear(year) ? 366 : 365; - } - - function isLeapYear(year) { - return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; - } - - function checkOverflow(m) { - var overflow; - if (m._a && m._pf.overflow === -2) { - overflow = - m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH : - m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE : - m._a[HOUR] < 0 || m._a[HOUR] > 24 || - (m._a[HOUR] === 24 && (m._a[MINUTE] !== 0 || - m._a[SECOND] !== 0 || - m._a[MILLISECOND] !== 0)) ? HOUR : - m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE : - m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND : - m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND : - -1; - - if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { - overflow = DATE; - } - - m._pf.overflow = overflow; - } - } - - function isValid(m) { - if (m._isValid == null) { - m._isValid = !isNaN(m._d.getTime()) && - m._pf.overflow < 0 && - !m._pf.empty && - !m._pf.invalidMonth && - !m._pf.nullInput && - !m._pf.invalidFormat && - !m._pf.userInvalidated; - - if (m._strict) { - m._isValid = m._isValid && - m._pf.charsLeftOver === 0 && - m._pf.unusedTokens.length === 0 && - m._pf.bigHour === undefined; - } - } - return m._isValid; - } - - function normalizeLocale(key) { - return key ? key.toLowerCase().replace('_', '-') : key; - } - - // pick the locale from the array - // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each - // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root - function chooseLocale(names) { - var i = 0, j, next, locale, split; - - while (i < names.length) { - split = normalizeLocale(names[i]).split('-'); - j = split.length; - next = normalizeLocale(names[i + 1]); - next = next ? next.split('-') : null; - while (j > 0) { - locale = loadLocale(split.slice(0, j).join('-')); - if (locale) { - return locale; - } - if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { - //the next array item is better than a shallower substring of this one - break; - } - j--; - } - i++; - } - return null; - } - - function loadLocale(name) { - var oldLocale = null; - if (!locales[name] && hasModule) { - try { - oldLocale = moment.locale(); - require('./locale/' + name); - // because defineLocale currently also sets the global locale, we want to undo that for lazy loaded locales - moment.locale(oldLocale); - } catch (e) { } - } - return locales[name]; - } - - // Return a moment from input, that is local/utc/utcOffset equivalent to - // model. - function makeAs(input, model) { - var res, diff; - if (model._isUTC) { - res = model.clone(); - diff = (moment.isMoment(input) || isDate(input) ? - +input : +moment(input)) - (+res); - // Use low-level api, because this fn is low-level api. - res._d.setTime(+res._d + diff); - moment.updateOffset(res, false); - return res; - } else { - return moment(input).local(); - } - } - - /************************************ - Locale - ************************************/ - - - extend(Locale.prototype, { - - set : function (config) { - var prop, i; - for (i in config) { - prop = config[i]; - if (typeof prop === 'function') { - this[i] = prop; - } else { - this['_' + i] = prop; - } - } - // Lenient ordinal parsing accepts just a number in addition to - // number + (possibly) stuff coming from _ordinalParseLenient. - this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + /\d{1,2}/.source); - }, - - _months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - months : function (m) { - return this._months[m.month()]; - }, - - _monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - monthsShort : function (m) { - return this._monthsShort[m.month()]; - }, - - monthsParse : function (monthName, format, strict) { - var i, mom, regex; - - if (!this._monthsParse) { - this._monthsParse = []; - this._longMonthsParse = []; - this._shortMonthsParse = []; - } - - for (i = 0; i < 12; i++) { - // make the regex if we don't have it already - mom = moment.utc([2000, i]); - if (strict && !this._longMonthsParse[i]) { - this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); - this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); - } - if (!strict && !this._monthsParse[i]) { - regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); - this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); - } - // test the regex - if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { - return i; - } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { - return i; - } else if (!strict && this._monthsParse[i].test(monthName)) { - return i; - } - } - }, - - _weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdays : function (m) { - return this._weekdays[m.day()]; - }, - - _weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysShort : function (m) { - return this._weekdaysShort[m.day()]; - }, - - _weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), - weekdaysMin : function (m) { - return this._weekdaysMin[m.day()]; - }, - - weekdaysParse : function (weekdayName) { - var i, mom, regex; - - if (!this._weekdaysParse) { - this._weekdaysParse = []; - } - - for (i = 0; i < 7; i++) { - // make the regex if we don't have it already - if (!this._weekdaysParse[i]) { - mom = moment([2000, 1]).day(i); - regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); - this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); - } - // test the regex - if (this._weekdaysParse[i].test(weekdayName)) { - return i; - } - } - }, - - _longDateFormat : { - LTS : 'h:mm:ss A', - 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 (key) { - var output = this._longDateFormat[key]; - if (!output && this._longDateFormat[key.toUpperCase()]) { - output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) { - return val.slice(1); - }); - this._longDateFormat[key] = output; - } - return output; - }, - - isPM : function (input) { - // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays - // Using charAt should be more compatible. - return ((input + '').toLowerCase().charAt(0) === 'p'); - }, - - _meridiemParse : /[ap]\.?m?\.?/i, - meridiem : function (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'pm' : 'PM'; - } else { - return isLower ? '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 (key, mom, now) { - var output = this._calendar[key]; - return typeof output === 'function' ? output.apply(mom, [now]) : output; - }, - - _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 (number, withoutSuffix, string, isFuture) { - var output = this._relativeTime[string]; - return (typeof output === 'function') ? - output(number, withoutSuffix, string, isFuture) : - output.replace(/%d/i, number); - }, - - pastFuture : function (diff, output) { - var format = this._relativeTime[diff > 0 ? 'future' : 'past']; - return typeof format === 'function' ? format(output) : format.replace(/%s/i, output); - }, - - ordinal : function (number) { - return this._ordinal.replace('%d', number); - }, - _ordinal : '%d', - _ordinalParse : /\d{1,2}/, - - preparse : function (string) { - return string; - }, - - postformat : function (string) { - return string; - }, - - week : function (mom) { - return weekOfYear(mom, this._week.dow, this._week.doy).week; - }, - - _week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - }, - - firstDayOfWeek : function () { - return this._week.dow; - }, - - firstDayOfYear : function () { - return this._week.doy; - }, - - _invalidDate: 'Invalid date', - invalidDate: function () { - return this._invalidDate; - } - }); - - /************************************ - Formatting - ************************************/ - - - function removeFormattingTokens(input) { - if (input.match(/\[[\s\S]/)) { - return input.replace(/^\[|\]$/g, ''); - } - return input.replace(/\\/g, ''); - } - - function makeFormatFunction(format) { - var array = format.match(formattingTokens), i, length; - - for (i = 0, length = array.length; i < length; i++) { - if (formatTokenFunctions[array[i]]) { - array[i] = formatTokenFunctions[array[i]]; - } else { - array[i] = removeFormattingTokens(array[i]); - } - } - - return function (mom) { - var output = ''; - for (i = 0; i < length; i++) { - output += array[i] instanceof Function ? array[i].call(mom, format) : array[i]; - } - return output; - }; - } - - // format date using native date object - function formatMoment(m, format) { - if (!m.isValid()) { - return m.localeData().invalidDate(); - } - - format = expandFormat(format, m.localeData()); - - if (!formatFunctions[format]) { - formatFunctions[format] = makeFormatFunction(format); - } - - return formatFunctions[format](m); - } - - function expandFormat(format, locale) { - var i = 5; - - function replaceLongDateFormatTokens(input) { - return locale.longDateFormat(input) || input; - } - - localFormattingTokens.lastIndex = 0; - while (i >= 0 && localFormattingTokens.test(format)) { - format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); - localFormattingTokens.lastIndex = 0; - i -= 1; - } - - return format; - } - - - /************************************ - Parsing - ************************************/ - - - // get the regex to find the next token - function getParseRegexForToken(token, config) { - var a, strict = config._strict; - switch (token) { - case 'Q': - return parseTokenOneDigit; - case 'DDDD': - return parseTokenThreeDigits; - case 'YYYY': - case 'GGGG': - case 'gggg': - return strict ? parseTokenFourDigits : parseTokenOneToFourDigits; - case 'Y': - case 'G': - case 'g': - return parseTokenSignedNumber; - case 'YYYYYY': - case 'YYYYY': - case 'GGGGG': - case 'ggggg': - return strict ? parseTokenSixDigits : parseTokenOneToSixDigits; - case 'S': - if (strict) { - return parseTokenOneDigit; - } - /* falls through */ - case 'SS': - if (strict) { - return parseTokenTwoDigits; - } - /* falls through */ - case 'SSS': - if (strict) { - return parseTokenThreeDigits; - } - /* falls through */ - case 'DDD': - return parseTokenOneToThreeDigits; - case 'MMM': - case 'MMMM': - case 'dd': - case 'ddd': - case 'dddd': - return parseTokenWord; - case 'a': - case 'A': - return config._locale._meridiemParse; - case 'x': - return parseTokenOffsetMs; - case 'X': - return parseTokenTimestampMs; - case 'Z': - case 'ZZ': - return parseTokenTimezone; - case 'T': - return parseTokenT; - case 'SSSS': - return parseTokenDigits; - case 'MM': - case 'DD': - case 'YY': - case 'GG': - case 'gg': - case 'HH': - case 'hh': - case 'mm': - case 'ss': - case 'ww': - case 'WW': - return strict ? parseTokenTwoDigits : parseTokenOneOrTwoDigits; - case 'M': - case 'D': - case 'd': - case 'H': - case 'h': - case 'm': - case 's': - case 'w': - case 'W': - case 'e': - case 'E': - return parseTokenOneOrTwoDigits; - case 'Do': - return strict ? config._locale._ordinalParse : config._locale._ordinalParseLenient; - default : - a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), 'i')); - return a; - } - } - - function utcOffsetFromString(string) { - string = string || ''; - var possibleTzMatches = (string.match(parseTokenTimezone) || []), - tzChunk = possibleTzMatches[possibleTzMatches.length - 1] || [], - parts = (tzChunk + '').match(parseTimezoneChunker) || ['-', 0, 0], - minutes = +(parts[1] * 60) + toInt(parts[2]); - - return parts[0] === '+' ? minutes : -minutes; - } - - // function to convert string input to date - function addTimeToArrayFromToken(token, input, config) { - var a, datePartArray = config._a; - - switch (token) { - // QUARTER - case 'Q': - if (input != null) { - datePartArray[MONTH] = (toInt(input) - 1) * 3; - } - break; - // MONTH - case 'M' : // fall through to MM - case 'MM' : - if (input != null) { - datePartArray[MONTH] = toInt(input) - 1; - } - break; - case 'MMM' : // fall through to MMMM - case 'MMMM' : - a = config._locale.monthsParse(input, token, config._strict); - // if we didn't find a month name, mark the date as invalid. - if (a != null) { - datePartArray[MONTH] = a; - } else { - config._pf.invalidMonth = input; - } - break; - // DAY OF MONTH - case 'D' : // fall through to DD - case 'DD' : - if (input != null) { - datePartArray[DATE] = toInt(input); - } - break; - case 'Do' : - if (input != null) { - datePartArray[DATE] = toInt(parseInt( - input.match(/\d{1,2}/)[0], 10)); - } - break; - // DAY OF YEAR - case 'DDD' : // fall through to DDDD - case 'DDDD' : - if (input != null) { - config._dayOfYear = toInt(input); - } - - break; - // YEAR - case 'YY' : - datePartArray[YEAR] = moment.parseTwoDigitYear(input); - break; - case 'YYYY' : - case 'YYYYY' : - case 'YYYYYY' : - datePartArray[YEAR] = toInt(input); - break; - // AM / PM - case 'a' : // fall through to A - case 'A' : - config._meridiem = input; - // config._isPm = config._locale.isPM(input); - break; - // HOUR - case 'h' : // fall through to hh - case 'hh' : - config._pf.bigHour = true; - /* falls through */ - case 'H' : // fall through to HH - case 'HH' : - datePartArray[HOUR] = toInt(input); - break; - // MINUTE - case 'm' : // fall through to mm - case 'mm' : - datePartArray[MINUTE] = toInt(input); - break; - // SECOND - case 's' : // fall through to ss - case 'ss' : - datePartArray[SECOND] = toInt(input); - break; - // MILLISECOND - case 'S' : - case 'SS' : - case 'SSS' : - case 'SSSS' : - datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000); - break; - // UNIX OFFSET (MILLISECONDS) - case 'x': - config._d = new Date(toInt(input)); - break; - // UNIX TIMESTAMP WITH MS - case 'X': - config._d = new Date(parseFloat(input) * 1000); - break; - // TIMEZONE - case 'Z' : // fall through to ZZ - case 'ZZ' : - config._useUTC = true; - config._tzm = utcOffsetFromString(input); - break; - // WEEKDAY - human - case 'dd': - case 'ddd': - case 'dddd': - a = config._locale.weekdaysParse(input); - // if we didn't get a weekday name, mark the date as invalid - if (a != null) { - config._w = config._w || {}; - config._w['d'] = a; - } else { - config._pf.invalidWeekday = input; - } - break; - // WEEK, WEEK DAY - numeric - case 'w': - case 'ww': - case 'W': - case 'WW': - case 'd': - case 'e': - case 'E': - token = token.substr(0, 1); - /* falls through */ - case 'gggg': - case 'GGGG': - case 'GGGGG': - token = token.substr(0, 2); - if (input) { - config._w = config._w || {}; - config._w[token] = toInt(input); - } - break; - case 'gg': - case 'GG': - config._w = config._w || {}; - config._w[token] = moment.parseTwoDigitYear(input); - } - } - - function dayOfYearFromWeekInfo(config) { - var w, weekYear, week, weekday, dow, doy, temp; - - w = config._w; - if (w.GG != null || w.W != null || w.E != null) { - dow = 1; - doy = 4; - - // TODO: We need to take the current isoWeekYear, but that depends on - // how we interpret now (local, utc, fixed offset). So create - // a now version of current config (take local/utc/offset flags, and - // create now). - weekYear = dfl(w.GG, config._a[YEAR], weekOfYear(moment(), 1, 4).year); - week = dfl(w.W, 1); - weekday = dfl(w.E, 1); - } else { - dow = config._locale._week.dow; - doy = config._locale._week.doy; - - weekYear = dfl(w.gg, config._a[YEAR], weekOfYear(moment(), dow, doy).year); - week = dfl(w.w, 1); - - if (w.d != null) { - // weekday -- low day numbers are considered next week - weekday = w.d; - if (weekday < dow) { - ++week; - } - } else if (w.e != null) { - // local weekday -- counting starts from begining of week - weekday = w.e + dow; - } else { - // default to begining of week - weekday = dow; - } - } - temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow); - - config._a[YEAR] = temp.year; - config._dayOfYear = temp.dayOfYear; - } - - // convert an array to a date. - // the array should mirror the parameters below - // note: all values past the year are optional and will default to the lowest possible value. - // [year, month, day , hour, minute, second, millisecond] - function dateFromConfig(config) { - var i, date, input = [], currentDate, yearToUse; - - if (config._d) { - return; - } - - currentDate = currentDateArray(config); - - //compute day of the year from weeks and weekdays - if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { - dayOfYearFromWeekInfo(config); - } - - //if the day of the year is set, figure out what it is - if (config._dayOfYear) { - yearToUse = dfl(config._a[YEAR], currentDate[YEAR]); - - if (config._dayOfYear > daysInYear(yearToUse)) { - config._pf._overflowDayOfYear = true; - } - - date = makeUTCDate(yearToUse, 0, config._dayOfYear); - config._a[MONTH] = date.getUTCMonth(); - config._a[DATE] = date.getUTCDate(); - } - - // Default to current date. - // * if no year, month, day of month are given, default to today - // * if day of month is given, default month and year - // * if month is given, default only year - // * if year is given, don't default anything - for (i = 0; i < 3 && config._a[i] == null; ++i) { - config._a[i] = input[i] = currentDate[i]; - } - - // Zero out whatever was not defaulted, including time - for (; i < 7; i++) { - config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; - } - - // Check for 24:00:00.000 - if (config._a[HOUR] === 24 && - config._a[MINUTE] === 0 && - config._a[SECOND] === 0 && - config._a[MILLISECOND] === 0) { - config._nextDay = true; - config._a[HOUR] = 0; - } - - config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input); - // Apply timezone offset from input. The actual utcOffset can be changed - // with parseZone. - if (config._tzm != null) { - config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); - } - - if (config._nextDay) { - config._a[HOUR] = 24; - } - } - - function dateFromObject(config) { - var normalizedInput; - - if (config._d) { - return; - } - - normalizedInput = normalizeObjectUnits(config._i); - config._a = [ - normalizedInput.year, - normalizedInput.month, - normalizedInput.day || normalizedInput.date, - normalizedInput.hour, - normalizedInput.minute, - normalizedInput.second, - normalizedInput.millisecond - ]; - - dateFromConfig(config); - } - - function currentDateArray(config) { - var now = new Date(); - if (config._useUTC) { - return [ - now.getUTCFullYear(), - now.getUTCMonth(), - now.getUTCDate() - ]; - } else { - return [now.getFullYear(), now.getMonth(), now.getDate()]; - } - } - - // date from string and format string - function makeDateFromStringAndFormat(config) { - if (config._f === moment.ISO_8601) { - parseISO(config); - return; - } - - config._a = []; - config._pf.empty = true; - - // This array is used to make a Date, either with `new Date` or `Date.UTC` - var string = '' + config._i, - i, parsedInput, tokens, token, skipped, - stringLength = string.length, - totalParsedInputLength = 0; - - tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; - - for (i = 0; i < tokens.length; i++) { - token = tokens[i]; - parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; - if (parsedInput) { - skipped = string.substr(0, string.indexOf(parsedInput)); - if (skipped.length > 0) { - config._pf.unusedInput.push(skipped); - } - string = string.slice(string.indexOf(parsedInput) + parsedInput.length); - totalParsedInputLength += parsedInput.length; - } - // don't parse if it's not a known token - if (formatTokenFunctions[token]) { - if (parsedInput) { - config._pf.empty = false; - } - else { - config._pf.unusedTokens.push(token); - } - addTimeToArrayFromToken(token, parsedInput, config); - } - else if (config._strict && !parsedInput) { - config._pf.unusedTokens.push(token); - } - } - - // add remaining unparsed input length to the string - config._pf.charsLeftOver = stringLength - totalParsedInputLength; - if (string.length > 0) { - config._pf.unusedInput.push(string); - } - - // clear _12h flag if hour is <= 12 - if (config._pf.bigHour === true && config._a[HOUR] <= 12) { - config._pf.bigHour = undefined; - } - // handle meridiem - config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], - config._meridiem); - dateFromConfig(config); - checkOverflow(config); - } - - function unescapeFormat(s) { - return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { - return p1 || p2 || p3 || p4; - }); - } - - // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript - function regexpEscape(s) { - return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); - } - - // date from string and array of format strings - function makeDateFromStringAndArray(config) { - var tempConfig, - bestMoment, - - scoreToBeat, - i, - currentScore; - - if (config._f.length === 0) { - config._pf.invalidFormat = true; - config._d = new Date(NaN); - return; - } - - for (i = 0; i < config._f.length; i++) { - currentScore = 0; - tempConfig = copyConfig({}, config); - if (config._useUTC != null) { - tempConfig._useUTC = config._useUTC; - } - tempConfig._pf = defaultParsingFlags(); - tempConfig._f = config._f[i]; - makeDateFromStringAndFormat(tempConfig); - - if (!isValid(tempConfig)) { - continue; - } - - // if there is any input that was not parsed add a penalty for that format - currentScore += tempConfig._pf.charsLeftOver; - - //or tokens - currentScore += tempConfig._pf.unusedTokens.length * 10; - - tempConfig._pf.score = currentScore; - - if (scoreToBeat == null || currentScore < scoreToBeat) { - scoreToBeat = currentScore; - bestMoment = tempConfig; - } - } - - extend(config, bestMoment || tempConfig); - } - - // date from iso format - function parseISO(config) { - var i, l, - string = config._i, - match = isoRegex.exec(string); - - if (match) { - config._pf.iso = true; - for (i = 0, l = isoDates.length; i < l; i++) { - if (isoDates[i][1].exec(string)) { - // match[5] should be 'T' or undefined - config._f = isoDates[i][0] + (match[6] || ' '); - break; - } - } - for (i = 0, l = isoTimes.length; i < l; i++) { - if (isoTimes[i][1].exec(string)) { - config._f += isoTimes[i][0]; - break; - } - } - if (string.match(parseTokenTimezone)) { - config._f += 'Z'; - } - makeDateFromStringAndFormat(config); - } else { - config._isValid = false; - } - } - - // date from iso format or fallback - function makeDateFromString(config) { - parseISO(config); - if (config._isValid === false) { - delete config._isValid; - moment.createFromInputFallback(config); - } - } - - function map(arr, fn) { - var res = [], i; - for (i = 0; i < arr.length; ++i) { - res.push(fn(arr[i], i)); - } - return res; - } - - function makeDateFromInput(config) { - var input = config._i, matched; - if (input === undefined) { - config._d = new Date(); - } else if (isDate(input)) { - config._d = new Date(+input); - } else if ((matched = aspNetJsonRegex.exec(input)) !== null) { - config._d = new Date(+matched[1]); - } else if (typeof input === 'string') { - makeDateFromString(config); - } else if (isArray(input)) { - config._a = map(input.slice(0), function (obj) { - return parseInt(obj, 10); - }); - dateFromConfig(config); - } else if (typeof(input) === 'object') { - dateFromObject(config); - } else if (typeof(input) === 'number') { - // from milliseconds - config._d = new Date(input); - } else { - moment.createFromInputFallback(config); - } - } - - function makeDate(y, m, d, h, M, s, ms) { - //can't just apply() to create a date: - //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply - var date = new Date(y, m, d, h, M, s, ms); - - //the date constructor doesn't accept years < 1970 - if (y < 1970) { - date.setFullYear(y); - } - return date; - } - - function makeUTCDate(y) { - var date = new Date(Date.UTC.apply(null, arguments)); - if (y < 1970) { - date.setUTCFullYear(y); - } - return date; - } - - function parseWeekday(input, locale) { - if (typeof input === 'string') { - if (!isNaN(input)) { - input = parseInt(input, 10); - } - else { - input = locale.weekdaysParse(input); - if (typeof input !== 'number') { - return null; - } - } - } - return input; - } - - /************************************ - Relative Time - ************************************/ - - - // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize - function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { - return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); - } - - function relativeTime(posNegDuration, withoutSuffix, locale) { - var duration = moment.duration(posNegDuration).abs(), - seconds = round(duration.as('s')), - minutes = round(duration.as('m')), - hours = round(duration.as('h')), - days = round(duration.as('d')), - months = round(duration.as('M')), - years = round(duration.as('y')), - - args = seconds < relativeTimeThresholds.s && ['s', seconds] || - minutes === 1 && ['m'] || - minutes < relativeTimeThresholds.m && ['mm', minutes] || - hours === 1 && ['h'] || - hours < relativeTimeThresholds.h && ['hh', hours] || - days === 1 && ['d'] || - days < relativeTimeThresholds.d && ['dd', days] || - months === 1 && ['M'] || - months < relativeTimeThresholds.M && ['MM', months] || - years === 1 && ['y'] || ['yy', years]; - - args[2] = withoutSuffix; - args[3] = +posNegDuration > 0; - args[4] = locale; - return substituteTimeAgo.apply({}, args); - } - - - /************************************ - Week of Year - ************************************/ - - - // firstDayOfWeek 0 = sun, 6 = sat - // the day of the week that starts the week - // (usually sunday or monday) - // firstDayOfWeekOfYear 0 = sun, 6 = sat - // the first week is the week that contains the first - // of this day of the week - // (eg. ISO weeks use thursday (4)) - function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) { - var end = firstDayOfWeekOfYear - firstDayOfWeek, - daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(), - adjustedMoment; - - - if (daysToDayOfWeek > end) { - daysToDayOfWeek -= 7; - } - - if (daysToDayOfWeek < end - 7) { - daysToDayOfWeek += 7; - } - - adjustedMoment = moment(mom).add(daysToDayOfWeek, 'd'); - return { - week: Math.ceil(adjustedMoment.dayOfYear() / 7), - year: adjustedMoment.year() - }; - } - - //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday - function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) { - var d = makeUTCDate(year, 0, 1).getUTCDay(), daysToAdd, dayOfYear; - - d = d === 0 ? 7 : d; - weekday = weekday != null ? weekday : firstDayOfWeek; - daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0); - dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1; - - return { - year: dayOfYear > 0 ? year : year - 1, - dayOfYear: dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear - }; - } - - /************************************ - Top Level Functions - ************************************/ - - function makeMoment(config) { - var input = config._i, - format = config._f, - res; - - config._locale = config._locale || moment.localeData(config._l); - - if (input === null || (format === undefined && input === '')) { - return moment.invalid({nullInput: true}); - } - - if (typeof input === 'string') { - config._i = input = config._locale.preparse(input); - } - - if (moment.isMoment(input)) { - return new Moment(input, true); - } else if (format) { - if (isArray(format)) { - makeDateFromStringAndArray(config); - } else { - makeDateFromStringAndFormat(config); - } - } else { - makeDateFromInput(config); - } - - res = new Moment(config); - if (res._nextDay) { - // Adding is smart enough around DST - res.add(1, 'd'); - res._nextDay = undefined; - } - - return res; - } - - moment = function (input, format, locale, strict) { - var c; - - if (typeof(locale) === 'boolean') { - strict = locale; - locale = undefined; - } - // object construction must be done this way. - // https://github.com/moment/moment/issues/1423 - c = {}; - c._isAMomentObject = true; - c._i = input; - c._f = format; - c._l = locale; - c._strict = strict; - c._isUTC = false; - c._pf = defaultParsingFlags(); - - return makeMoment(c); - }; - - moment.suppressDeprecationWarnings = false; - - moment.createFromInputFallback = deprecate( - 'moment construction falls back to js Date. This is ' + - 'discouraged and will be removed in upcoming major ' + - 'release. Please refer to ' + - 'https://github.com/moment/moment/issues/1407 for more info.', - function (config) { - config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); - } - ); - - // Pick a moment m from moments so that m[fn](other) is true for all - // other. This relies on the function fn to be transitive. - // - // moments should either be an array of moment objects or an array, whose - // first element is an array of moment objects. - function pickBy(fn, moments) { - var res, i; - if (moments.length === 1 && isArray(moments[0])) { - moments = moments[0]; - } - if (!moments.length) { - return moment(); - } - res = moments[0]; - for (i = 1; i < moments.length; ++i) { - if (moments[i][fn](res)) { - res = moments[i]; - } - } - return res; - } - - moment.min = function () { - var args = [].slice.call(arguments, 0); - - return pickBy('isBefore', args); - }; - - moment.max = function () { - var args = [].slice.call(arguments, 0); - - return pickBy('isAfter', args); - }; - - // creating with utc - moment.utc = function (input, format, locale, strict) { - var c; - - if (typeof(locale) === 'boolean') { - strict = locale; - locale = undefined; - } - // object construction must be done this way. - // https://github.com/moment/moment/issues/1423 - c = {}; - c._isAMomentObject = true; - c._useUTC = true; - c._isUTC = true; - c._l = locale; - c._i = input; - c._f = format; - c._strict = strict; - c._pf = defaultParsingFlags(); - - return makeMoment(c).utc(); - }; - - // creating with unix timestamp (in seconds) - moment.unix = function (input) { - return moment(input * 1000); - }; - - // duration - moment.duration = function (input, key) { - var duration = input, - // matching against regexp is expensive, do it on demand - match = null, - sign, - ret, - parseIso, - diffRes; - - if (moment.isDuration(input)) { - duration = { - ms: input._milliseconds, - d: input._days, - M: input._months - }; - } else if (typeof input === 'number') { - duration = {}; - if (key) { - duration[key] = input; - } else { - duration.milliseconds = input; - } - } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) { - sign = (match[1] === '-') ? -1 : 1; - duration = { - y: 0, - d: toInt(match[DATE]) * sign, - h: toInt(match[HOUR]) * sign, - m: toInt(match[MINUTE]) * sign, - s: toInt(match[SECOND]) * sign, - ms: toInt(match[MILLISECOND]) * sign - }; - } else if (!!(match = isoDurationRegex.exec(input))) { - sign = (match[1] === '-') ? -1 : 1; - parseIso = function (inp) { - // We'd normally use ~~inp for this, but unfortunately it also - // converts floats to ints. - // inp may be undefined, so careful calling replace on it. - var res = inp && parseFloat(inp.replace(',', '.')); - // apply sign while we're at it - return (isNaN(res) ? 0 : res) * sign; - }; - duration = { - y: parseIso(match[2]), - M: parseIso(match[3]), - d: parseIso(match[4]), - h: parseIso(match[5]), - m: parseIso(match[6]), - s: parseIso(match[7]), - w: parseIso(match[8]) - }; - } else if (duration == null) {// checks for null or undefined - duration = {}; - } else if (typeof duration === 'object' && - ('from' in duration || 'to' in duration)) { - diffRes = momentsDifference(moment(duration.from), moment(duration.to)); - - duration = {}; - duration.ms = diffRes.milliseconds; - duration.M = diffRes.months; - } - - ret = new Duration(duration); - - if (moment.isDuration(input) && hasOwnProp(input, '_locale')) { - ret._locale = input._locale; - } - - return ret; - }; - - // version number - moment.version = VERSION; - - // default format - moment.defaultFormat = isoFormat; - - // constant that refers to the ISO standard - moment.ISO_8601 = function () {}; - - // Plugins that add properties should also add the key here (null value), - // so we can properly clone ourselves. - moment.momentProperties = momentProperties; - - // This function will be called whenever a moment is mutated. - // It is intended to keep the offset in sync with the timezone. - moment.updateOffset = function () {}; - - // This function allows you to set a threshold for relative time strings - moment.relativeTimeThreshold = function (threshold, limit) { - if (relativeTimeThresholds[threshold] === undefined) { - return false; - } - if (limit === undefined) { - return relativeTimeThresholds[threshold]; - } - relativeTimeThresholds[threshold] = limit; - return true; - }; - - moment.lang = deprecate( - 'moment.lang is deprecated. Use moment.locale instead.', - function (key, value) { - return moment.locale(key, value); - } - ); - - // This function will load locale and then set the global locale. If - // no arguments are passed in, it will simply return the current global - // locale key. - moment.locale = function (key, values) { - var data; - if (key) { - if (typeof(values) !== 'undefined') { - data = moment.defineLocale(key, values); - } - else { - data = moment.localeData(key); - } - - if (data) { - moment.duration._locale = moment._locale = data; - } - } - - return moment._locale._abbr; - }; - - moment.defineLocale = function (name, values) { - if (values !== null) { - values.abbr = name; - if (!locales[name]) { - locales[name] = new Locale(); - } - locales[name].set(values); - - // backwards compat for now: also set the locale - moment.locale(name); - - return locales[name]; - } else { - // useful for testing - delete locales[name]; - return null; - } - }; - - moment.langData = deprecate( - 'moment.langData is deprecated. Use moment.localeData instead.', - function (key) { - return moment.localeData(key); - } - ); - - // returns locale data - moment.localeData = function (key) { - var locale; - - if (key && key._locale && key._locale._abbr) { - key = key._locale._abbr; - } - - if (!key) { - return moment._locale; - } - - if (!isArray(key)) { - //short-circuit everything else - locale = loadLocale(key); - if (locale) { - return locale; - } - key = [key]; - } - - return chooseLocale(key); - }; - - // compare moment object - moment.isMoment = function (obj) { - return obj instanceof Moment || - (obj != null && hasOwnProp(obj, '_isAMomentObject')); - }; - - // for typechecking Duration objects - moment.isDuration = function (obj) { - return obj instanceof Duration; - }; - - for (i = lists.length - 1; i >= 0; --i) { - makeList(lists[i]); - } - - moment.normalizeUnits = function (units) { - return normalizeUnits(units); - }; - - moment.invalid = function (flags) { - var m = moment.utc(NaN); - if (flags != null) { - extend(m._pf, flags); - } - else { - m._pf.userInvalidated = true; - } - - return m; - }; - - moment.parseZone = function () { - return moment.apply(null, arguments).parseZone(); - }; - - moment.parseTwoDigitYear = function (input) { - return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); - }; - - moment.isDate = isDate; - - /************************************ - Moment Prototype - ************************************/ - - - extend(moment.fn = Moment.prototype, { - - clone : function () { - return moment(this); - }, - - valueOf : function () { - return +this._d - ((this._offset || 0) * 60000); - }, - - unix : function () { - return Math.floor(+this / 1000); - }, - - toString : function () { - return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); - }, - - toDate : function () { - return this._offset ? new Date(+this) : this._d; - }, - - toISOString : function () { - var m = moment(this).utc(); - if (0 < m.year() && m.year() <= 9999) { - if ('function' === typeof Date.prototype.toISOString) { - // native implementation is ~50x faster, use it when we can - return this.toDate().toISOString(); - } else { - return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); - } - } else { - return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); - } - }, - - toArray : function () { - var m = this; - return [ - m.year(), - m.month(), - m.date(), - m.hours(), - m.minutes(), - m.seconds(), - m.milliseconds() - ]; - }, - - isValid : function () { - return isValid(this); - }, - - isDSTShifted : function () { - if (this._a) { - return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0; - } - - return false; - }, - - parsingFlags : function () { - return extend({}, this._pf); - }, - - invalidAt: function () { - return this._pf.overflow; - }, - - utc : function (keepLocalTime) { - return this.utcOffset(0, keepLocalTime); - }, - - local : function (keepLocalTime) { - if (this._isUTC) { - this.utcOffset(0, keepLocalTime); - this._isUTC = false; - - if (keepLocalTime) { - this.subtract(this._dateUtcOffset(), 'm'); - } - } - return this; - }, - - format : function (inputString) { - var output = formatMoment(this, inputString || moment.defaultFormat); - return this.localeData().postformat(output); - }, - - add : createAdder(1, 'add'), - - subtract : createAdder(-1, 'subtract'), - - diff : function (input, units, asFloat) { - var that = makeAs(input, this), - zoneDiff = (that.utcOffset() - this.utcOffset()) * 6e4, - anchor, diff, output, daysAdjust; - - units = normalizeUnits(units); - - if (units === 'year' || units === 'month' || units === 'quarter') { - output = monthDiff(this, that); - if (units === 'quarter') { - output = output / 3; - } else if (units === 'year') { - output = output / 12; - } - } else { - diff = this - that; - output = units === 'second' ? diff / 1e3 : // 1000 - units === 'minute' ? diff / 6e4 : // 1000 * 60 - units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60 - units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst - units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst - diff; - } - return asFloat ? output : absRound(output); - }, - - from : function (time, withoutSuffix) { - return moment.duration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); - }, - - fromNow : function (withoutSuffix) { - return this.from(moment(), withoutSuffix); - }, - - calendar : function (time) { - // We want to compare the start of today, vs this. - // Getting start-of-today depends on whether we're locat/utc/offset - // or not. - var now = time || moment(), - sod = makeAs(now, this).startOf('day'), - diff = this.diff(sod, 'days', true), - format = diff < -6 ? 'sameElse' : - diff < -1 ? 'lastWeek' : - diff < 0 ? 'lastDay' : - diff < 1 ? 'sameDay' : - diff < 2 ? 'nextDay' : - diff < 7 ? 'nextWeek' : 'sameElse'; - return this.format(this.localeData().calendar(format, this, moment(now))); - }, - - isLeapYear : function () { - return isLeapYear(this.year()); - }, - - isDST : function () { - return (this.utcOffset() > this.clone().month(0).utcOffset() || - this.utcOffset() > this.clone().month(5).utcOffset()); - }, - - day : function (input) { - var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); - if (input != null) { - input = parseWeekday(input, this.localeData()); - return this.add(input - day, 'd'); - } else { - return day; - } - }, - - month : makeAccessor('Month', true), - - startOf : function (units) { - units = normalizeUnits(units); - // the following switch intentionally omits break keywords - // to utilize falling through the cases. - switch (units) { - case 'year': - this.month(0); - /* falls through */ - case 'quarter': - case 'month': - this.date(1); - /* falls through */ - case 'week': - case 'isoWeek': - case 'day': - this.hours(0); - /* falls through */ - case 'hour': - this.minutes(0); - /* falls through */ - case 'minute': - this.seconds(0); - /* falls through */ - case 'second': - this.milliseconds(0); - /* falls through */ - } - - // weeks are a special case - if (units === 'week') { - this.weekday(0); - } else if (units === 'isoWeek') { - this.isoWeekday(1); - } - - // quarters are also special - if (units === 'quarter') { - this.month(Math.floor(this.month() / 3) * 3); - } - - return this; - }, - - endOf: function (units) { - units = normalizeUnits(units); - if (units === undefined || units === 'millisecond') { - return this; - } - return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); - }, - - isAfter: function (input, units) { - var inputMs; - units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); - if (units === 'millisecond') { - input = moment.isMoment(input) ? input : moment(input); - return +this > +input; - } else { - inputMs = moment.isMoment(input) ? +input : +moment(input); - return inputMs < +this.clone().startOf(units); - } - }, - - isBefore: function (input, units) { - var inputMs; - units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); - if (units === 'millisecond') { - input = moment.isMoment(input) ? input : moment(input); - return +this < +input; - } else { - inputMs = moment.isMoment(input) ? +input : +moment(input); - return +this.clone().endOf(units) < inputMs; - } - }, - - isBetween: function (from, to, units) { - return this.isAfter(from, units) && this.isBefore(to, units); - }, - - isSame: function (input, units) { - var inputMs; - units = normalizeUnits(units || 'millisecond'); - if (units === 'millisecond') { - input = moment.isMoment(input) ? input : moment(input); - return +this === +input; - } else { - inputMs = +moment(input); - return +(this.clone().startOf(units)) <= inputMs && inputMs <= +(this.clone().endOf(units)); - } - }, - - min: deprecate( - 'moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548', - function (other) { - other = moment.apply(null, arguments); - return other < this ? this : other; - } - ), - - max: deprecate( - 'moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548', - function (other) { - other = moment.apply(null, arguments); - return other > this ? this : other; - } - ), - - zone : deprecate( - 'moment().zone is deprecated, use moment().utcOffset instead. ' + - 'https://github.com/moment/moment/issues/1779', - function (input, keepLocalTime) { - if (input != null) { - if (typeof input !== 'string') { - input = -input; - } - - this.utcOffset(input, keepLocalTime); - - return this; - } else { - return -this.utcOffset(); - } - } - ), - - // keepLocalTime = true means only change the timezone, without - // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> - // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset - // +0200, so we adjust the time as needed, to be valid. - // - // Keeping the time actually adds/subtracts (one hour) - // from the actual represented time. That is why we call updateOffset - // a second time. In case it wants us to change the offset again - // _changeInProgress == true case, then we have to adjust, because - // there is no such time in the given timezone. - utcOffset : function (input, keepLocalTime) { - var offset = this._offset || 0, - localAdjust; - if (input != null) { - if (typeof input === 'string') { - input = utcOffsetFromString(input); - } - if (Math.abs(input) < 16) { - input = input * 60; - } - if (!this._isUTC && keepLocalTime) { - localAdjust = this._dateUtcOffset(); - } - this._offset = input; - this._isUTC = true; - if (localAdjust != null) { - this.add(localAdjust, 'm'); - } - if (offset !== input) { - if (!keepLocalTime || this._changeInProgress) { - addOrSubtractDurationFromMoment(this, - moment.duration(input - offset, 'm'), 1, false); - } else if (!this._changeInProgress) { - this._changeInProgress = true; - moment.updateOffset(this, true); - this._changeInProgress = null; - } - } - - return this; - } else { - return this._isUTC ? offset : this._dateUtcOffset(); - } - }, - - isLocal : function () { - return !this._isUTC; - }, - - isUtcOffset : function () { - return this._isUTC; - }, - - isUtc : function () { - return this._isUTC && this._offset === 0; - }, - - zoneAbbr : function () { - return this._isUTC ? 'UTC' : ''; - }, - - zoneName : function () { - return this._isUTC ? 'Coordinated Universal Time' : ''; - }, - - parseZone : function () { - if (this._tzm) { - this.utcOffset(this._tzm); - } else if (typeof this._i === 'string') { - this.utcOffset(utcOffsetFromString(this._i)); - } - return this; - }, - - hasAlignedHourOffset : function (input) { - if (!input) { - input = 0; - } - else { - input = moment(input).utcOffset(); - } - - return (this.utcOffset() - input) % 60 === 0; - }, - - daysInMonth : function () { - return daysInMonth(this.year(), this.month()); - }, - - dayOfYear : function (input) { - var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1; - return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); - }, - - quarter : function (input) { - return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); - }, - - weekYear : function (input) { - var year = weekOfYear(this, this.localeData()._week.dow, this.localeData()._week.doy).year; - return input == null ? year : this.add((input - year), 'y'); - }, - - isoWeekYear : function (input) { - var year = weekOfYear(this, 1, 4).year; - return input == null ? year : this.add((input - year), 'y'); - }, - - week : function (input) { - var week = this.localeData().week(this); - return input == null ? week : this.add((input - week) * 7, 'd'); - }, - - isoWeek : function (input) { - var week = weekOfYear(this, 1, 4).week; - return input == null ? week : this.add((input - week) * 7, 'd'); - }, - - weekday : function (input) { - var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; - return input == null ? weekday : this.add(input - weekday, 'd'); - }, - - isoWeekday : function (input) { - // behaves the same as moment#day except - // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) - // as a setter, sunday should belong to the previous week. - return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7); - }, - - isoWeeksInYear : function () { - return weeksInYear(this.year(), 1, 4); - }, - - weeksInYear : function () { - var weekInfo = this.localeData()._week; - return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); - }, - - get : function (units) { - units = normalizeUnits(units); - return this[units](); - }, - - set : function (units, value) { - var unit; - if (typeof units === 'object') { - for (unit in units) { - this.set(unit, units[unit]); - } - } - else { - units = normalizeUnits(units); - if (typeof this[units] === 'function') { - this[units](value); - } - } - return this; - }, - - // If passed a locale key, it will set the locale for this - // instance. Otherwise, it will return the locale configuration - // variables for this instance. - locale : function (key) { - var newLocaleData; - - if (key === undefined) { - return this._locale._abbr; - } else { - newLocaleData = moment.localeData(key); - if (newLocaleData != null) { - this._locale = newLocaleData; - } - return this; - } - }, - - lang : deprecate( - 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', - function (key) { - if (key === undefined) { - return this.localeData(); - } else { - return this.locale(key); - } - } - ), - - localeData : function () { - return this._locale; - }, - - _dateUtcOffset : function () { - // On Firefox.24 Date#getTimezoneOffset returns a floating point. - // https://github.com/moment/moment/pull/1871 - return -Math.round(this._d.getTimezoneOffset() / 15) * 15; - } - - }); - - function rawMonthSetter(mom, value) { - var dayOfMonth; - - // TODO: Move this out of here! - if (typeof value === 'string') { - value = mom.localeData().monthsParse(value); - // TODO: Another silent failure? - if (typeof value !== 'number') { - return mom; - } - } - - dayOfMonth = Math.min(mom.date(), - daysInMonth(mom.year(), value)); - mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); - return mom; - } - - function rawGetter(mom, unit) { - return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit](); - } - - function rawSetter(mom, unit, value) { - if (unit === 'Month') { - return rawMonthSetter(mom, value); - } else { - return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); - } - } - - function makeAccessor(unit, keepTime) { - return function (value) { - if (value != null) { - rawSetter(this, unit, value); - moment.updateOffset(this, keepTime); - return this; - } else { - return rawGetter(this, unit); - } - }; - } - - moment.fn.millisecond = moment.fn.milliseconds = makeAccessor('Milliseconds', false); - moment.fn.second = moment.fn.seconds = makeAccessor('Seconds', false); - moment.fn.minute = moment.fn.minutes = makeAccessor('Minutes', false); - // Setting the hour should keep the time, because the user explicitly - // specified which hour he wants. So trying to maintain the same hour (in - // a new timezone) makes sense. Adding/subtracting hours does not follow - // this rule. - moment.fn.hour = moment.fn.hours = makeAccessor('Hours', true); - // moment.fn.month is defined separately - moment.fn.date = makeAccessor('Date', true); - moment.fn.dates = deprecate('dates accessor is deprecated. Use date instead.', makeAccessor('Date', true)); - moment.fn.year = makeAccessor('FullYear', true); - moment.fn.years = deprecate('years accessor is deprecated. Use year instead.', makeAccessor('FullYear', true)); - - // add plural methods - moment.fn.days = moment.fn.day; - moment.fn.months = moment.fn.month; - moment.fn.weeks = moment.fn.week; - moment.fn.isoWeeks = moment.fn.isoWeek; - moment.fn.quarters = moment.fn.quarter; - - // add aliased format methods - moment.fn.toJSON = moment.fn.toISOString; - - // alias isUtc for dev-friendliness - moment.fn.isUTC = moment.fn.isUtc; - - /************************************ - Duration Prototype - ************************************/ - - - function daysToYears (days) { - // 400 years have 146097 days (taking into account leap year rules) - return days * 400 / 146097; - } - - function yearsToDays (years) { - // years * 365 + absRound(years / 4) - - // absRound(years / 100) + absRound(years / 400); - return years * 146097 / 400; - } - - extend(moment.duration.fn = Duration.prototype, { - - _bubble : function () { - var milliseconds = this._milliseconds, - days = this._days, - months = this._months, - data = this._data, - seconds, minutes, hours, years = 0; - - // The following code bubbles up values, see the tests for - // examples of what that means. - data.milliseconds = milliseconds % 1000; - - seconds = absRound(milliseconds / 1000); - data.seconds = seconds % 60; - - minutes = absRound(seconds / 60); - data.minutes = minutes % 60; - - hours = absRound(minutes / 60); - data.hours = hours % 24; - - days += absRound(hours / 24); - - // Accurately convert days to years, assume start from year 0. - years = absRound(daysToYears(days)); - days -= absRound(yearsToDays(years)); - - // 30 days to a month - // TODO (iskren): Use anchor date (like 1st Jan) to compute this. - months += absRound(days / 30); - days %= 30; - - // 12 months -> 1 year - years += absRound(months / 12); - months %= 12; - - data.days = days; - data.months = months; - data.years = years; - }, - - abs : function () { - this._milliseconds = Math.abs(this._milliseconds); - this._days = Math.abs(this._days); - this._months = Math.abs(this._months); - - this._data.milliseconds = Math.abs(this._data.milliseconds); - this._data.seconds = Math.abs(this._data.seconds); - this._data.minutes = Math.abs(this._data.minutes); - this._data.hours = Math.abs(this._data.hours); - this._data.months = Math.abs(this._data.months); - this._data.years = Math.abs(this._data.years); - - return this; - }, - - weeks : function () { - return absRound(this.days() / 7); - }, - - valueOf : function () { - return this._milliseconds + - this._days * 864e5 + - (this._months % 12) * 2592e6 + - toInt(this._months / 12) * 31536e6; - }, - - humanize : function (withSuffix) { - var output = relativeTime(this, !withSuffix, this.localeData()); - - if (withSuffix) { - output = this.localeData().pastFuture(+this, output); - } - - return this.localeData().postformat(output); - }, - - add : function (input, val) { - // supports only 2.0-style add(1, 's') or add(moment) - var dur = moment.duration(input, val); - - this._milliseconds += dur._milliseconds; - this._days += dur._days; - this._months += dur._months; - - this._bubble(); - - return this; - }, - - subtract : function (input, val) { - var dur = moment.duration(input, val); - - this._milliseconds -= dur._milliseconds; - this._days -= dur._days; - this._months -= dur._months; - - this._bubble(); - - return this; - }, - - get : function (units) { - units = normalizeUnits(units); - return this[units.toLowerCase() + 's'](); - }, - - as : function (units) { - var days, months; - units = normalizeUnits(units); - - if (units === 'month' || units === 'year') { - days = this._days + this._milliseconds / 864e5; - months = this._months + daysToYears(days) * 12; - return units === 'month' ? months : months / 12; - } else { - // handle milliseconds separately because of floating point math errors (issue #1867) - days = this._days + Math.round(yearsToDays(this._months / 12)); - switch (units) { - case 'week': return days / 7 + this._milliseconds / 6048e5; - case 'day': return days + this._milliseconds / 864e5; - case 'hour': return days * 24 + this._milliseconds / 36e5; - case 'minute': return days * 24 * 60 + this._milliseconds / 6e4; - case 'second': return days * 24 * 60 * 60 + this._milliseconds / 1000; - // Math.floor prevents floating point math errors here - case 'millisecond': return Math.floor(days * 24 * 60 * 60 * 1000) + this._milliseconds; - default: throw new Error('Unknown unit ' + units); - } - } - }, - - lang : moment.fn.lang, - locale : moment.fn.locale, - - toIsoString : deprecate( - 'toIsoString() is deprecated. Please use toISOString() instead ' + - '(notice the capitals)', - function () { - return this.toISOString(); - } - ), - - toISOString : function () { - // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js - var years = Math.abs(this.years()), - months = Math.abs(this.months()), - days = Math.abs(this.days()), - hours = Math.abs(this.hours()), - minutes = Math.abs(this.minutes()), - seconds = Math.abs(this.seconds() + this.milliseconds() / 1000); - - if (!this.asSeconds()) { - // this is the same as C#'s (Noda) and python (isodate)... - // but not other JS (goog.date) - return 'P0D'; - } - - return (this.asSeconds() < 0 ? '-' : '') + - 'P' + - (years ? years + 'Y' : '') + - (months ? months + 'M' : '') + - (days ? days + 'D' : '') + - ((hours || minutes || seconds) ? 'T' : '') + - (hours ? hours + 'H' : '') + - (minutes ? minutes + 'M' : '') + - (seconds ? seconds + 'S' : ''); - }, - - localeData : function () { - return this._locale; - }, - - toJSON : function () { - return this.toISOString(); - } - }); - - moment.duration.fn.toString = moment.duration.fn.toISOString; - - function makeDurationGetter(name) { - moment.duration.fn[name] = function () { - return this._data[name]; - }; - } - - for (i in unitMillisecondFactors) { - if (hasOwnProp(unitMillisecondFactors, i)) { - makeDurationGetter(i.toLowerCase()); - } - } - - moment.duration.fn.asMilliseconds = function () { - return this.as('ms'); - }; - moment.duration.fn.asSeconds = function () { - return this.as('s'); - }; - moment.duration.fn.asMinutes = function () { - return this.as('m'); - }; - moment.duration.fn.asHours = function () { - return this.as('h'); - }; - moment.duration.fn.asDays = function () { - return this.as('d'); - }; - moment.duration.fn.asWeeks = function () { - return this.as('weeks'); - }; - moment.duration.fn.asMonths = function () { - return this.as('M'); - }; - moment.duration.fn.asYears = function () { - return this.as('y'); - }; - - /************************************ - Default Locale - ************************************/ - - - // Set default locale, other locale will inherit from English. - moment.locale('en', { - ordinalParse: /\d{1,2}(th|st|nd|rd)/, - ordinal : function (number) { - var b = number % 10, - output = (toInt(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - } - }); - - /* EMBED_LOCALES */ - - /************************************ - Exposing Moment - ************************************/ - - function makeGlobal(shouldDeprecate) { - /*global ender:false */ - if (typeof ender !== 'undefined') { - return; - } - oldGlobalMoment = globalScope.moment; - if (shouldDeprecate) { - globalScope.moment = deprecate( - 'Accessing Moment through the global scope is ' + - 'deprecated, and will be removed in an upcoming ' + - 'release.', - moment); - } else { - globalScope.moment = moment; - } - } - - // CommonJS module is defined - if (hasModule) { - module.exports = moment; - } else if (typeof define === 'function' && define.amd) { - define(function (require, exports, module) { - if (module.config && module.config() && module.config().noGlobal === true) { - // release the global variable - globalScope.moment = oldGlobalMoment; - } - - return moment; - }); - makeGlobal(true); - } else { - makeGlobal(); - } -}).call(this); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/package.js b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/package.js deleted file mode 100644 index aba8d50..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/package.js +++ /dev/null @@ -1,11 +0,0 @@ -var profile = { - resourceTags: { - ignore: function(filename, mid){ - // only include moment/moment - return mid != "moment/moment"; - }, - amd: function(filename, mid){ - return /\.js$/.test(filename); - } - } -}; diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/package.json b/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/package.json deleted file mode 100644 index 8b47326..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/node_modules/moment/package.json +++ /dev/null @@ -1,121 +0,0 @@ -{ - "name": "moment", - "version": "2.9.0", - "description": "Parse, validate, manipulate, and display dates", - "homepage": "http://momentjs.com", - "author": { - "name": "Iskren Ivov Chernev", - "email": "iskren.chernev@gmail.com", - "url": "https://github.com/ichernev" - }, - "contributors": [ - { - "name": "Tim Wood", - "email": "washwithcare@gmail.com", - "url": "http://timwoodcreates.com/" - }, - { - "name": "Rocky Meza", - "url": "http://rockymeza.com" - }, - { - "name": "Matt Johnson", - "email": "mj1856@hotmail.com", - "url": "http://codeofmatt.com" - }, - { - "name": "Isaac Cambron", - "email": "isaac@isaaccambron.com", - "url": "http://isaaccambron.com" - }, - { - "name": "Andre Polykanine", - "email": "andre@oire.org", - "url": "https://github.com/oire" - } - ], - "keywords": [ - "moment", - "date", - "time", - "parse", - "format", - "validate", - "i18n", - "l10n", - "ender" - ], - "main": "./moment.js", - "engines": { - "node": "*" - }, - "repository": { - "type": "git", - "url": "https://github.com/moment/moment.git" - }, - "bugs": { - "url": "https://github.com/moment/moment/issues" - }, - "licenses": [ - { - "type": "MIT" - } - ], - "devDependencies": { - "uglify-js": "latest", - "grunt": "latest", - "nodeunit": "latest", - "benchmark": "latest", - "grunt-contrib-clean": "latest", - "grunt-contrib-jshint": "latest", - "grunt-contrib-nodeunit": "latest", - "grunt-contrib-concat": "latest", - "grunt-contrib-uglify": "latest", - "grunt-contrib-watch": "latest", - "grunt-env": "latest", - "grunt-jscs": "latest", - "grunt-karma": "latest", - "grunt-nuget": "latest", - "grunt-benchmark": "latest", - "grunt-string-replace": "latest", - "grunt-exec": "latest", - "load-grunt-tasks": "latest", - "karma": "latest", - "karma-chrome-launcher": "latest", - "karma-firefox-launcher": "latest", - "karma-nodeunit": "latest", - "karma-sauce-launcher": "latest", - "spacejam": "latest" - }, - "scripts": { - "test": "grunt test:node" - }, - "ender": "./ender.js", - "dojoBuild": "package.js", - "jspm": { - "files": [ - "moment.js", - "locale" - ], - "map": { - "moment": "./moment" - }, - "buildConfig": { - "uglify": true - } - }, - "spm": { - "main": "moment.js", - "output": [ - "locale/*.js" - ] - }, - "readme": "[![NPM version][npm-version-image]][npm-url] [![NPM downloads][npm-downloads-image]][npm-url] [![MIT License][license-image]][license-url] [![Build Status][travis-image]][travis-url]\n\nA lightweight JavaScript date library for parsing, validating, manipulating, and formatting dates.\n\n## [Documentation](http://momentjs.com/docs/)\n\n## Upgrading to 2.0.0\n\nThere are a number of small backwards incompatible changes with version 2.0.0. [See the full descriptions here](https://gist.github.com/timrwood/e72f2eef320ed9e37c51#backwards-incompatible-changes)\n\n * Changed language ordinal method to return the number + ordinal instead of just the ordinal.\n\n * Changed two digit year parsing cutoff to match strptime.\n\n * Removed `moment#sod` and `moment#eod` in favor of `moment#startOf` and `moment#endOf`.\n\n * Removed `moment.humanizeDuration()` in favor of `moment.duration().humanize()`.\n\n * Removed the lang data objects from the top level namespace.\n\n * Duplicate `Date` passed to `moment()` instead of referencing it.\n\n## [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md)\n\n## [Contributing](https://github.com/moment/moment/blob/develop/CONTRIBUTING.md)\n\n## License\n\nMoment.js is freely distributable under the terms of the [MIT license](https://github.com/moment/moment/blob/develop/LICENSE).\n\n[license-image]: http://img.shields.io/badge/license-MIT-blue.svg?style=flat\n[license-url]: LICENSE\n\n[npm-url]: https://npmjs.org/package/moment\n[npm-version-image]: http://img.shields.io/npm/v/moment.svg?style=flat\n[npm-downloads-image]: http://img.shields.io/npm/dm/moment.svg?style=flat\n\n[travis-url]: http://travis-ci.org/moment/moment\n[travis-image]: http://img.shields.io/travis/moment/moment/develop.svg?style=flat\n", - "readmeFilename": "README.md", - "_id": "moment@2.9.0", - "dist": { - "shasum": "77ec1175fa294f42627f10c8e6de6302c036f6d5" - }, - "_from": "moment@2.x.x", - "_resolved": "https://registry.npmjs.org/moment/-/moment-2.9.0.tgz" -} diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/package.json b/node_modules/hapi/node_modules/vision/node_modules/joi/package.json deleted file mode 100644 index 1bbd4b4..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/package.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "joi", - "description": "Object schema validation", - "version": "5.1.0", - "repository": { - "type": "git", - "url": "git://github.com/hapijs/joi" - }, - "main": "index", - "keywords": [ - "schema", - "validation" - ], - "engines": { - "node": ">=0.10.30" - }, - "dependencies": { - "hoek": "^2.2.x", - "topo": "1.x.x", - "isemail": "1.x.x", - "moment": "2.x.x" - }, - "devDependencies": { - "code": "1.x.x", - "lab": "5.x.x" - }, - "scripts": { - "test": "lab -t 100 -a code", - "test-cov-html": "lab -r html -o coverage.html -a code" - }, - "licenses": [ - { - "type": "BSD", - "url": "http://github.com/hapijs/joi/raw/master/LICENSE" - } - ], - "readme": "![joi Logo](https://raw.github.com/hapijs/joi/master/images/joi.png)\n\nObject schema description language and validator for JavaScript objects.\n\n[![npm version](https://badge.fury.io/js/joi.svg)](http://badge.fury.io/js/joi)\n[![Build Status](https://secure.travis-ci.org/hapijs/joi.svg)](http://travis-ci.org/hapijs/joi)\n[![Dependencies Status](https://david-dm.org/hapijs/joi.svg)](https://david-dm.org/hapijs/joi)\n[![DevDependencies Status](https://david-dm.org/hapijs/joi/dev-status.svg)](https://david-dm.org/hapijs/joi#info=devDependencies)\n\nLead Maintainer: [Nicolas Morel](https://github.com/marsup)\n\n## Table of Contents\n\n\n- [Example](#example)\n- [Usage](#usage)\n - [`validate(value, schema, [options], [callback])`](#validatevalue-schema-options-callback)\n - [`compile(schema)`](#compileschema)\n - [`assert(value, schema, [message])`](#assertvalue-schema-message)\n - [`any`](#any)\n - [`any.allow(value)`](#anyallowvalue)\n - [`any.valid(value)`](#anyvalidvalue)\n - [`any.invalid(value)`](#anyinvalidvalue)\n - [`any.required()`](#anyrequired)\n - [`any.optional()`](#anyoptional)\n - [`any.forbidden()`](#anyforbidden)\n - [`any.description(desc)`](#anydescriptiondesc)\n - [`any.notes(notes)`](#anynotesnotes)\n - [`any.tags(tags)`](#anytagstags)\n - [`any.meta(meta)`](#anymetameta)\n - [`any.example(value)`](#anyexamplevalue)\n - [`any.unit(name)`](#anyunitname)\n - [`any.options(options)`](#anyoptionsoptions)\n - [`any.strict()`](#anystrict)\n - [`any.default(value)`](#anydefaultvalue)\n - [`any.concat(schema)`](#anyconcatschema)\n - [`any.when(ref, options)`](#anywhenref-options)\n - [`any.label(name)`](#anylabelname)\n - [`any.raw(isRaw)`](#anyrawisraw)\n - [`array`](#array)\n - [`array.sparse(enabled)`](#arraysparseenabled)\n - [`array.includes(type)`](#arrayincludestype)\n - [`array.excludes(type)`](#arrayexcludestype)\n - [`array.min(limit)`](#arrayminlimit)\n - [`array.max(limit)`](#arraymaxlimit)\n - [`array.length(limit)`](#arraylengthlimit)\n - [`array.unique()`](#arrayunique)\n - [`binary`](#binary)\n - [`binary.encoding(encoding)`](#binaryencodingencoding)\n - [`binary.min(limit)`](#binaryminlimit)\n - [`binary.max(limit)`](#binarymaxlimit)\n - [`binary.length(limit)`](#binarylengthlimit)\n - [`boolean()`](#boolean)\n - [`date`](#date)\n - [`date.min(date)`](#datemindate)\n - [`date.max(date)`](#datemaxdate)\n - [`date.format(format)`](#dateformatformat)\n - [`date.iso()`](#dateiso)\n - [`func`](#func)\n - [`number`](#number)\n - [`number.min(limit)`](#numberminlimit)\n - [`number.max(limit)`](#numbermaxlimit)\n - [`number.greater(limit)`](#numbergreaterlimit)\n - [`number.less(limit)`](#numberlesslimit)\n - [`number.integer()`](#numberinteger)\n - [`number.precision(limit)`](#numberprecisionlimit)\n - [`object`](#object)\n - [`object.keys([schema])`](#objectkeysschema)\n - [`object.min(limit)`](#objectminlimit)\n - [`object.max(limit)`](#objectmaxlimit)\n - [`object.length(limit)`](#objectlengthlimit)\n - [`object.pattern(regex, schema)`](#objectpatternregex-schema)\n - [`object.and(peers)`](#objectandpeers)\n - [`object.nand(peers)`](#objectnandpeers)\n - [`object.or(peers)`](#objectorpeers)\n - [`object.xor(peers)`](#objectxorpeers)\n - [`object.with(key, peers)`](#objectwithkey-peers)\n - [`object.without(key, peers)`](#objectwithoutkey-peers)\n - [`object.rename(from, to, [options])`](#objectrenamefrom-to-options)\n - [`object.assert(ref, schema, [message])`](#objectassertref-schema-message)\n - [`object.unknown([allow])`](#objectunknownallow)\n - [`object.type(constructor, [name])`](#objecttypeconstructorname)\n - [`object.requiredKeys(children)`](#objectrequiredkeyschildren)\n - [`object.optionalKeys(children)`](#objectoptionalkeyschildren)\n - [`string`](#string)\n - [`string.insensitive()`](#stringinsensitive)\n - [`string.min(limit, [encoding])`](#stringminlimit-encoding)\n - [`string.max(limit, [encoding])`](#stringmaxlimit-encoding)\n - [`string.creditCard()`](#stringcreditCard)\n - [`string.length(limit, [encoding])`](#stringlengthlimit-encoding)\n - [`string.regex(pattern, [name])`](#stringregexpattern-name)\n - [`string.alphanum()`](#stringalphanum)\n - [`string.token()`](#stringtoken)\n - [`string.email()`](#stringemail)\n - [`string.guid()`](#stringguid)\n - [`string.hostname()`](#stringhostname)\n - [`string.lowercase()`](#stringlowercase)\n - [`string.uppercase()`](#stringuppercase)\n - [`string.trim()`](#stringtrim)\n - [`alternatives`](#alternatives)\n - [`alternatives.try(schemas)`](#alternativestryschemas)\n - [`alternatives.when(ref, options)`](#alternativeswhenref-options)\n - [`ref(key, [options])`](#refkey-options)\n\n# Example\n\n```javascript\nvar Joi = require('joi');\n\nvar schema = Joi.object().keys({\n username: Joi.string().alphanum().min(3).max(30).required(),\n password: Joi.string().regex(/[a-zA-Z0-9]{3,30}/),\n access_token: [Joi.string(), Joi.number()],\n birthyear: Joi.number().integer().min(1900).max(2013),\n email: Joi.string().email()\n}).with('username', 'birthyear').without('password', 'access_token');\n\nJoi.validate({ username: 'abc', birthyear: 1994 }, schema, function (err, value) { }); // err === null -> valid\n```\n\nThe above schema defines the following constraints:\n* `username`\n * a required string\n * must contain only alphanumeric characters\n * at least 3 characters long but no more than 30\n * must be accompanied by `birthyear`\n* `password`\n * an optional string\n * must satisfy the custom regex\n * cannot appear together with `access_token`\n* `access_token`\n * an optional, unconstrained string or number\n* `birthyear`\n * an integer between 1900 and 2013\n* `email`\n * a valid email address string\n\n# Usage\n\nUsage is a two steps process. First, a schema is constructed using the provided types and constraints:\n\n```javascript\nvar schema = {\n a: Joi.string()\n};\n```\n\nNote that **joi** schema objects are immutable which means every additional rule added (e.g. `.min(5)`) will return a\nnew schema object.\n\nThen the value is validated against the schema:\n\n```javascript\nJoi.validate({ a: 'a string' }, schema, function (err, value) { });\n```\n\nIf the value is valid, `null` is returned, otherwise an `Error` object.\n\nThe schema can be a plain JavaScript object where every key is assigned a **joi** type, or it can be a **joi** type directly:\n\n```javascript\nvar schema = Joi.string().min(10);\n```\n\nIf the schema is a **joi** type, the `schema.validate(value, callback)` can be called directly on the type. When passing a non-type schema object,\nthe module converts it internally to an object() type equivalent to:\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.string()\n});\n```\n\nWhen validating a schema:\n* Keys are optional by default.\n* Strings are utf-8 encoded by default.\n* Rules are defined in an additive fashion and evaluated in order after whitelist and blacklist checks.\n\n### `validate(value, schema, [options], [callback])`\n\nValidates a value using the given schema and options where:\n- `value` - the value being validated.\n- `schema` - the validation schema. Can be a **joi** type object or a plain object where every key is assigned a **joi** type object.\n- `options` - an optional object with the following optional keys:\n - `abortEarly` - when `true`, stops validation on the first error, otherwise returns all the errors found. Defaults to `true`.\n - `convert` - when `true`, attempts to cast values to the required types (e.g. a string to a number). Defaults to `true`.\n - `allowUnknown` - when `true`, allows object to contain unknown keys which are ignored. Defaults to `false`.\n - `skipFunctions` - when `true`, ignores unknown keys with a function value. Defaults to `false`.\n - `stripUnknown` - when `true`, unknown keys are deleted (only when value is an object). Defaults to `false`.\n - `language` - overrides individual error messages, when `'label'` is set, it overrides the key name in the error message. Defaults to no override (`{}`).\n - `presence` - sets the default presence requirements. Supported modes: `'optional'`, `'required'`, and `'forbidden'`.\n Defaults to `'optional'`.\n - `context` - provides an external data set to be used in [references](#refkey-options). Can only be set as an external option to\n `validate()` and not using `any.options()`.\n- `callback` - the optional synchronous callback method using the signature `function(err, value)` where:\n - `err` - if validation failed, the error reason, otherwise `null`.\n - `value` - the validated value with any type conversions and other modifiers applied (the input is left unchanged). `value` can be\n incomplete if validation failed and `abortEarly` is `true`. If callback is not provided, then returns an object with error\n and value properties.\n\n```javascript\nvar schema = {\n a: Joi.number()\n};\n\nvar value = {\n a: '123'\n};\n\nJoi.validate(value, schema, function (err, value) { });\n// err -> null\n// value.a -> 123 (number, not string)\n\n// or\nvar result = Joi.validate(value, schema);\n// result.error -> null\n// result.value -> { \"a\" : 123 }\n```\n\n### `compile(schema)`\n\nConverts literal schema definition to **joi** schema object (or returns the same back if already a **joi** schema object) where:\n- `schema` - the schema definition to compile.\n\n```javascript\nvar definition = ['key', 5, { a: true, b: [/^a/, 'boom'] }];\nvar schema = Joi.compile(definition);\n\n// Same as:\n\nvar schema = Joi.alternatives().try([\n Joi.string().valid('key'),\n Joi.number().valid(5),\n Joi.object().keys({\n a: Joi.boolean().valid(true),\n b: Joi.alternatives().try([\n Joi.string().regex(/^a/),\n Joi.string().valid('boom')\n ])\n })\n]);\n```\n\n### `assert(value, schema, [message])`\n\nValidates a value against a schema and throws if validation fails where:\n- `value` - the value to validate.\n- `schema` - the schema object.\n- `message` - optional message sting prefix added in front of the error message.\n\n```javascript\nJoi.assert('x', Joi.number());\n```\n\n### `any`\n\nGenerates a schema object that matches any data type.\n\n```javascript\nvar any = Joi.any();\nany.validate('a', function (err, value) { });\n```\n\n#### `any.allow(value)`\n\nWhitelists a value where:\n- `value` - the allowed value which can be of any type and will be matched against the validated value before applying any other rules.\n `value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options).\n\n```javascript\nvar schema = {\n a: Joi.any().allow('a'),\n b: Joi.any().allow('b', 'B'),\n c: Joi.any().allow(['c', 'C'])\n};\n```\n\n#### `any.valid(value)`\n\nAdds the provided values into the allowed whitelist and marks them as the only valid values allowed where:\n- `value` - the allowed value which can be of any type and will be matched against the validated value before applying any other rules.\n `value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options).\n\n```javascript\nvar schema = {\n a: Joi.any().valid('a'),\n b: Joi.any().valid('b', 'B'),\n c: Joi.any().valid(['c', 'C'])\n};\n```\n\n#### `any.invalid(value)`\n\nBlacklists a value where:\n- `value` - the forbidden value which can be of any type and will be matched against the validated value before applying any other rules.\n `value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options).\n\n```javascript\nvar schema = {\n a: Joi.any().invalid('a'),\n b: Joi.any().invalid('b', 'B'),\n c: Joi.any().invalid(['c', 'C'])\n};\n```\n\n#### `any.required()`\n\nMarks a key as required which will not allow `undefined` as value. All keys are optional by default.\n\n```javascript\nvar schema = Joi.any().required();\n```\n\n#### `any.optional()`\n\nMarks a key as optional which will allow `undefined` as values. Used to annotate the schema for readability as all keys are optional by default.\n\n```javascript\nvar schema = Joi.any().optional();\n```\n\n#### `any.forbidden()`\n\nMarks a key as forbidden which will not allow any value except `undefined`. Used to explicitly forbid keys.\n\n```javascript\nvar schema = {\n a: Joi.any().forbidden()\n};\n```\n\n#### `any.description(desc)`\n\nAnnotates the key where:\n- `desc` - the description string.\n\n```javascript\nvar schema = Joi.any().description('this key will match anything you give it');\n```\n\n#### `any.notes(notes)`\n\nAnnotates the key where:\n- `notes` - the notes string or array of strings.\n\n```javascript\nvar schema = Joi.any().notes(['this is special', 'this is important']);\n```\n\n#### `any.tags(tags)`\n\nAnnotates the key where:\n- `tags` - the tag string or array of strings.\n\n```javascript\nvar schema = Joi.any().tags(['api', 'user']);\n```\n\n#### `any.meta(meta)`\n\nAttaches metadata to the key where:\n- `meta` - the meta object to attach.\n\n```javascript\nvar schema = Joi.any().meta({ index: true });\n```\n\n#### `any.example(value)`\n\nAnnotates the key where:\n- `value` - an example value.\n\nIf the example fails to pass validation, the function will throw.\n\n```javascript\nvar schema = Joi.string().min(4).example('abcd');\n```\n\n#### `any.unit(name)`\n\nAnnotates the key where:\n- `name` - the unit name of the value.\n\n```javascript\nvar schema = Joi.number().unit('milliseconds');\n```\n\n#### `any.options(options)`\n\nOverrides the global `validate()` options for the current key and any sub-key where:\n- `options` - an object with the same optional keys as [`Joi.validate(value, schema, options, callback)`](#joivalidatevalue-schema-options-callback).\n\n```javascript\nvar schema = Joi.any().options({ convert: false });\n```\n\n#### `any.strict()`\n\nSets the `options.convert` options to `false` which prevent type casting for the current key and any child keys.\n\n```javascript\nvar schema = Joi.any().strict();\n```\n\n#### `any.default(value)`\n\nSets a default value if the original value is undefined where:\n- `value` - the value. `value` supports [references](#refkey-options).\n\nNote that if `value` is an object, any changes to the object after `default()` is called will change the reference\nand any future assignment.\n\n```javascript\nvar schema = {\n username: Joi.string().default('new_user')\n};\nJoi.validate({}, schema, function (err, value) { });\n// value === { username: \"new_user\" }\n```\n\n#### `any.concat(schema)`\n\nReturns a new type that is the result of adding the rules of one type to another where:\n- `schema` - a **joi** type to merge into the current schema. Can only be of the same type as the context type or `any`.\n\n```javascript\nvar a = Joi.string().valid('a');\nvar b = Joi.string().valid('b');\nvar ab = a.concat(b);\n```\n\n#### `any.when(ref, options)`\n\nConverts the type into an [`alternatives`](#alternatives) type where the conditions are merged into the type definition where:\n- `ref` - the key name or [reference](#refkey-options).\n- `options` - an object with:\n - `is` - the required condition **joi** type.\n - `then` - the alternative schema type if the condition is true. Required if `otherwise` is missing.\n - `otherwise` - the alternative schema type if the condition is false. Required if `then` is missing.\n\n```javascript\nvar schema = {\n a: Joi.any().valid('x').when('b', { is: 5, then: Joi.valid('y'), otherwise: Joi.valid('z') }),\n b: Joi.any()\n};\n```\n\nAlternatively, if you want to specify a specific type such as `string`, `array`, etc, you can do so like this:\n\n```javascript\nvar schema = {\n a: Joi.valid('a', 'b', 'other'),\n other: Joi.string()\n .when('a', { is: 'other', then: Joi.required() }),\n};\n```\n\n#### `any.label(name)`\n\nOverrides the key name in error messages.\n- `name` - the name of the key.\n\n```javascript\nvar schema = {\n first_name: Joi.string().label('First Name')\n};\n```\n\n#### `any.raw(isRaw)`\n\nOutputs the original untouched value instead of the casted value.\n- `isRaw` - whether to enable raw mode or not. Defaults to true.\n\n```javascript\nvar schema = {\n timestamp: Joi.date().format('YYYYMMDD').raw()\n};\n```\n\n### `array`\n\nGenerates a schema object that matches an array data type. Note that undefined values inside arrays are not allowed by default but can be by using `sparse()`.\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar array = Joi.array().includes(Joi.string().valid('a', 'b'));\narray.validate(['a', 'b', 'a'], function (err, value) { });\n```\n\n#### `array.sparse(enabled)`\n\nAllow this array to be sparse. `enabled` can be used with a falsy value to go back to the default behavior.\n\n```javascript\nvar schema = Joi.array().sparse(); // undefined values are now allowed\nschema = schema.sparse(false); // undefined values are now denied\n```\n\n#### `array.single(enabled)`\n\nAllow single values to be checked against rules as if it were provided as an array.\n\n`enabled` can be used with a falsy value to go back to the default behavior.\n\n```javascript\nvar schema = Joi.array().includes(Joi.number()).single();\nschema.validate([4]); // returns `{ error: null, value: [ 4 ] }`\nschema.validate(4); // returns `{ error: null, value: [ 4 ] }`\n```\n\n#### `array.includes(type)`\n\nList the types allowed for the array values where:\n- `type` - a **joi** schema object to validate each array item against. `type` can be an array of values, or multiple values can be passed as individual arguments.\n\n```javascript\nvar schema = Joi.array().includes(Joi.string(), Joi.number());\n```\n\n#### `array.excludes(type)`\n\nList the types forbidden for the array values where:\n- `type` - a **joi** schema object to validate each array item against. `type` can be an array of values, or multiple values can be passed as individual arguments.\n\n```javascript\nvar schema = Joi.array().excludes(Joi.object());\n```\n\n#### `array.min(limit)`\n\nSpecifies the minimum number of items in the array where:\n- `limit` - the lowest number of array items allowed.\n\n```javascript\nvar schema = Joi.array().min(2);\n```\n\n#### `array.max(limit)`\n\nSpecifies the maximum number of items in the array where:\n- `limit` - the highest number of array items allowed.\n\n```javascript\nvar schema = Joi.array().max(10);\n```\n\n#### `array.length(limit)`\n\nSpecifies the exact number of items in the array where:\n- `limit` - the number of array items allowed.\n\n```javascript\nvar schema = Joi.array().length(5);\n```\n\n#### `array.unique()`\n\nRequires the array values to be unique.\n\nBe aware that a deep equality is performed on elements of the array having a type of `object`, a performance penalty is to be expected for this kind of operation.\n\n```javascript\nvar schema = Joi.array().unique();\n```\n\n### `boolean`\n\nGenerates a schema object that matches a boolean data type (as well as the strings 'true', 'false', 'yes', and 'no'). Can also be called via `bool()`.\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar boolean = Joi.boolean();\nboolean.validate(true, function (err, value) { });\n```\n\n### `binary`\n\nGenerates a schema object that matches a Buffer data type (as well as the strings which will be converted to Buffers).\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar schema = Joi.binary();\n```\n\n#### `binary.encoding(encoding)`\n\nSets the string encoding format if a string input is converted to a buffer where:\n- `encoding` - the encoding scheme.\n\n```javascript\nvar schema = Joi.binary().encoding('base64');\n```\n\n#### `binary.min(limit)`\n\nSpecifies the minimum length of the buffer where:\n- `limit` - the lowest size of the buffer.\n\n```javascript\nvar schema = Joi.binary().min(2);\n```\n\n#### `binary.max(limit)`\n\nSpecifies the maximum length of the buffer where:\n- `limit` - the highest size of the buffer.\n\n```javascript\nvar schema = Joi.binary().max(10);\n```\n\n#### `binary.length(limit)`\n\nSpecifies the exact length of the buffer:\n- `limit` - the size of buffer allowed.\n\n```javascript\nvar schema = Joi.binary().length(5);\n```\n\n### `date`\n\nGenerates a schema object that matches a date type (as well as a JavaScript date string or number of milliseconds).\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar date = Joi.date();\ndate.validate('12-21-2012', function (err, value) { });\n```\n\n#### `date.min(date)`\n\nSpecifies the oldest date allowed where:\n- `date` - the oldest date allowed.\n\n```javascript\nvar schema = Joi.date().min('1-1-1974');\n```\n\nNotes: `'now'` can be passed in lieu of `date` so as to always compare relatively to the current date, allowing to explicitly ensure a date is either in the past or in the future.\n\n```javascript\nvar schema = Joi.date().min('now');\n```\n\nIt can also be a reference to another field.\n\n```javascript\nvar schema = Joi.object({\n from: Joi.date().required(),\n to: Joi.date().min(Joi.ref('from')).required()\n});\n```\n\n#### `date.max(date)`\n\nSpecifies the latest date allowed where:\n- `date` - the latest date allowed.\n\n```javascript\nvar schema = Joi.date().max('12-31-2020');\n```\n\nNotes: `'now'` can be passed in lieu of `date` so as to always compare relatively to the current date, allowing to explicitly ensure a date is either in the past or in the future.\n\n```javascript\nvar schema = Joi.date().max('now');\n```\n\nIt can also be a reference to another field.\n\n```javascript\nvar schema = Joi.object({\n from: Joi.date().max(Joi.ref('to')).required(),\n to: Joi.date().required()\n});\n```\n\n#### `date.format(format)`\n\nSpecifies the allowed date format:\n- `format` - string or array of strings that follow the `moment.js` [format](http://momentjs.com/docs/#/parsing/string-format/).\n\n```javascript\nvar schema = Joi.date().format('YYYY/MM/DD');\n```\n\n#### `date.iso()`\n\nRequires the string value to be in valid ISO 8601 date format.\n\n```javascript\nvar schema = Joi.date().iso();\n```\n\n### `func`\n\nGenerates a schema object that matches a function type.\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar func = Joi.func();\nfunc.validate(function () {}, function (err, value) { });\n```\n\n### `number`\n\nGenerates a schema object that matches a number data type (as well as strings that can be converted to numbers).\n\n`Infinity` and `-Infinity` are invalid by default, you can change that behavior by calling `allow(Infinity, -Infinity)`.\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar number = Joi.number();\nnumber.validate(5, function (err, value) { });\n```\n\n#### `number.min(limit)`\n\nSpecifies the minimum value where:\n- `limit` - the minimum value allowed.\n\n```javascript\nvar schema = Joi.number().min(2);\n```\n\n#### `number.max(limit)`\n\nSpecifies the maximum value where:\n- `limit` - the maximum value allowed.\n\n```javascript\nvar schema = Joi.number().max(10);\n```\n\n#### `number.greater(limit)`\n\nSpecifies that the value must be greater than `limit`.\n\n```javascript\nvar schema = Joi.number().greater(5);\n```\n\n#### `number.less(limit)`\n\nSpecifies that the value must be less than `limit`.\n\n```javascript\nvar schema = Joi.number().less(10);\n```\n\n#### `number.integer()`\n\nRequires the number to be an integer (no floating point).\n\n```javascript\nvar schema = Joi.number().integer();\n```\n\n#### `number.precision(limit)`\n\nSpecifies the maximum number of decimal places where:\n- `limit` - the maximum number of decimal places allowed.\n\n```javascript\nvar schema = Joi.number().precision(2);\n```\n\n### `object`\n\nGenerates a schema object that matches an object data type (as well as JSON strings that parsed into objects). Defaults\nto allowing any child key.\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar object = Joi.object().keys({\n a: Joi.number().min(1).max(10).integer(),\n b: 'some string'\n});\n\nobject.validate({ a: 5 }, function (err, value) { });\n```\n\n#### `object.keys([schema])`\n\nSets or extends the allowed object keys where:\n- `schema` - optional object where each key is assigned a **joi** type object. If `schema` is `{}` no keys allowed.\n If `schema` is `null` or `undefined`, any key allowed. If `schema` is an object with keys, the keys are added to any\n previously defined keys (but narrows the selection if all keys previously allowed). Defaults to 'undefined' which\n allows any child key.\n\n```javascript\nvar base = Joi.object().keys({\n a: Joi.number(),\n b: Joi.string()\n});\n// Validate keys a, b and c.\nvar extended = base.keys({\n c: Joi.boolean()\n});\n```\n\n#### `object.min(limit)`\n\nSpecifies the minimum number of keys in the object where:\n- `limit` - the lowest number of keys allowed.\n\n```javascript\nvar schema = Joi.object().min(2);\n```\n\n#### `object.max(limit)`\n\nSpecifies the maximum number of keys in the object where:\n- `limit` - the highest number of object keys allowed.\n\n```javascript\nvar schema = Joi.object().max(10);\n```\n\n#### `object.length(limit)`\n\nSpecifies the exact number of keys in the object where:\n- `limit` - the number of object keys allowed.\n\n```javascript\nvar schema = Joi.object().length(5);\n```\n\n#### `object.pattern(regex, schema)`\n\nSpecify validation rules for unknown keys matching a pattern where:\n- `regex` - a regular expression tested against the unknown key names.\n- `schema` - the schema object matching keys much validate against.\n\n```javascrip\nvar schema = Joi.object({\n a: Joi.string()\n}).pattern(/\\w\\d/, Joi.boolean());\n```\n\n#### `object.and(peers)`\n\nDefines an all-or-nothing relationship between keys where if one of the peers is present, all of them are required as\nwell where:\n- `peers` - the key names of which if one present, all are required. `peers` can be a single string value, an\n array of string values, or each peer provided as an argument.\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.any(),\n b: Joi.any()\n}).and('a', 'b');\n```\n\n#### `object.nand(peers)`\n\nDefines a relationship between keys where not all peers can be present at the\nsame time where:\n- `peers` - the key names of which if one present, the others may not all be present. `peers` can be a single string value, an\n array of string values, or each peer provided as an argument.\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.any(),\n b: Joi.any()\n}).nand('a', 'b');\n```\n\n#### `object.or(peers)`\n\nDefines a relationship between keys where one of the peers is required (and more than one is allowed) where:\n- `peers` - the key names of which at least one must appear. `peers` can be a single string value, an\n array of string values, or each peer provided as an argument.\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.any(),\n b: Joi.any()\n}).or('a', 'b');\n```\n\n#### `object.xor(peers)`\n\nDefines an exclusive relationship between a set of keys where one of them is required but not at the same time where:\n- `peers` - the exclusive key names that must not appear together but where one of them is required. `peers` can be a single string value, an\n array of string values, or each peer provided as an argument.\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.any(),\n b: Joi.any()\n}).xor('a', 'b');\n```\n\n#### `object.with(key, peers)`\n\nRequires the presence of other keys whenever the specified key is present where:\n- `key` - the reference key.\n- `peers` - the required peer key names that must appear together with `key`. `peers` can be a single string value or an array of string values.\n\nNote that unlike [`object.and()`](#objectandpeers), `with()` creates a dependency only between the `key` and each of the `peers`, not\nbetween the `peers` themselves.\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.any(),\n b: Joi.any()\n}).with('a', 'b');\n```\n\n#### `object.without(key, peers)`\n\nForbids the presence of other keys whenever the specified is present where:\n- `key` - the reference key.\n- `peers` - the forbidden peer key names that must not appear together with `key`. `peers` can be a single string value or an array of string values.\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.any(),\n b: Joi.any()\n}).without('a', ['b']);\n```\n\n#### `object.rename(from, to, [options])`\n\nRenames a key to another name (deletes the renamed key) where:\n- `from` - the original key name.\n- `to` - the new key name.\n- `options` - an optional object with the following optional keys:\n - `alias` - if `true`, does not delete the old key name, keeping both the new and old keys in place. Defaults to `false`.\n - `multiple` - if `true`, allows renaming multiple keys to the same destination where the last rename wins. Defaults to `false`.\n - `override` - if `true`, allows renaming a key over an existing key. Defaults to `false`.\n\nKeys are renamed before any other validation rules are applied.\n\n```javascript\nvar object = Joi.object().keys({\n a: Joi.number()\n}).rename('b', 'a');\n\nobject.validate({ b: 5 }, function (err, value) { });\n```\n\n#### `object.assert(ref, schema, [message])`\n\nVerifies an assertion where:\n- `ref` - the key name or [reference](#refkey-options).\n- `schema` - the validation rules required to satisfy the assertion. If the `schema` includes references, they are resolved against\n the object value, not the value of the `ref` target.\n- `message` - optional human-readable message used when the assertion fails. Defaults to 'failed to pass the assertion test'.\n\n```javascript\nvar schema = Joi.object().keys({\n a: {\n b: Joi.string(),\n c: Joi.number()\n },\n d: {\n e: Joi.any()\n }\n}).assert('d.e', Joi.ref('a.c'), 'equal to a.c');\n```\n\n#### `object.unknown([allow])`\n\nOverrides the handling of unknown keys for the scope of the current object only (does not apply to children) where:\n- `allow` - if `false`, unknown keys are not allowed, otherwise unknown keys are ignored.\n\n```javascript\nvar schema = Joi.object({ a: Joi.any() }).unknown();\n```\n\n#### `object.type(constructor, [name])`\n\nRequires the object to be an instance of a given constructor where:\n- `constructor` - the constructor function that the object must be an instance of.\n- `name` - an alternate name to use in validation errors. This is useful when the constructor function does not have a name.\n\n```javascript\nvar schema = Joi.object().type(RegExp);\n```\n\n#### `object.requiredKeys(children)`\n\nSets the specified children to required.\n- `children` - can be a single string value, an array of string values, or each child provided as an argument.\n\n```javascript\nvar schema = Joi.object().keys({ a: { b: Joi.number() }, c: { d: Joi.string() } });\nvar requiredSchema = schema.requiredKeys('', 'a.b', 'c', 'c.d');\n```\n\nNote that in this example `''` means the current object, `a` is not required but `b` is, as well as `c` and `d`.\n\n#### `object.optionalKeys(children)`\n\nSets the specified children to optional.\n- `children` - can be a single string value, an array of string values, or each child provided as an argument.\n\n```javascript\nvar schema = Joi.object().keys({ a: { b: Joi.number().required() }, c: { d: Joi.string().required() } });\nvar requiredSchema = schema.optionalKeys('a.b', 'c.d');\n```\n\nThe behavior is exactly the same as `requiredKeys`.\n\n### `string`\n\nGenerates a schema object that matches a string data type. Note that empty strings are not allowed by default and must be enabled with `allow('')`.\n\nSupports the same methods of the [`any()`](#any) type.\n\n```javascript\nvar schema = Joi.string().min(1).max(10);\nschema.validate('12345', function (err, value) { });\n```\n\n#### `string.insensitive()`\n\nAllows the value to match any whitelist of blacklist item in a case insensitive comparison.\n\n```javascript\nvar schema = Joi.string().valid('a').insensitive();\n```\n\n#### `string.min(limit, [encoding])`\n\nSpecifies the minimum number string characters where:\n- `limit` - the minimum number of string characters required.\n- `encoding` - is specified, the string length is calculated in bytes using the provided encoding.\n\n```javascript\nvar schema = Joi.string().min(2);\n```\n\n#### `string.max(limit, [encoding])`\n\nSpecifies the maximum number of string characters where:\n- `limit` - the maximum number of string characters allowed.\n- `encoding` - is specified, the string length is calculated in bytes using the provided encoding.\n\n```javascript\nvar schema = Joi.string().max(10);\n```\n\n#### `string.creditCard()`\n\nRequires the number to be a credit card number (Using [Lunh\nAlgorithm](http://en.wikipedia.org/wiki/Luhn_algorithm)).\n\n```javascript\nvar schema = Joi.string().creditCard();\n```\n\n#### `string.length(limit, [encoding])`\n\nSpecifies the exact string length required where:\n- `limit` - the required string length.\n- `encoding` - is specified, the string length is calculated in bytes using the provided encoding.\n\n```javascript\nvar schema = Joi.string().length(5);\n```\n\n#### `string.regex(pattern, [name])`\n\nDefines a regular expression rule where:\n- `pattern` - a regular expression object the string value must match against.\n- `name` - optional name for patterns (useful with multiple patterns). Defaults to 'required'.\n\n```javascript\nvar schema = Joi.string().regex(/^[abc]+$/);\n```\n\n#### `string.alphanum()`\n\nRequires the string value to only contain a-z, A-Z, and 0-9.\n\n```javascript\nvar schema = Joi.string().alphanum();\n```\n\n#### `string.token()`\n\nRequires the string value to only contain a-z, A-Z, 0-9, and underscore _.\n\n```javascript\nvar schema = Joi.string().token();\n```\n\n#### `string.email()`\n\nRequires the string value to be a valid email address.\n\n```javascript\nvar schema = Joi.string().email();\n```\n\n#### `string.guid()`\n\nRequires the string value to be a valid GUID.\n\n```javascript\nvar schema = Joi.string().guid();\n```\n\n#### `string.hostname()`\n\nRequires the string value to be a valid hostname as per [RFC1123](http://tools.ietf.org/html/rfc1123).\n\n```javascript\nvar schema = Joi.string().hostname();\n```\n\n#### `string.lowercase()`\n\nRequires the string value to be all lowercase. If the validation `convert` option is on (enabled by default), the string\nwill be forced to lowercase.\n\n```javascript\nvar schema = Joi.string().lowercase();\n```\n\n#### `string.uppercase()`\n\nRequires the string value to be all uppercase. If the validation `convert` option is on (enabled by default), the string\nwill be forced to uppercase.\n\n```javascript\nvar schema = Joi.string().uppercase();\n```\n\n#### `string.trim()`\n\nRequires the string value to contain no whitespace before or after. If the validation `convert` option is on (enabled by\ndefault), the string will be trimmed.\n\n```javascript\nvar schema = Joi.string().trim();\n```\n\n### `alternatives`\n\nGenerates a type that will match one of the provided alternative schemas via the [`try()`](#alternativestryschemas)\nmethod. If no schemas are added, the type will not match any value except for `undefined`.\n\nSupports the same methods of the [`any()`](#any) type.\n\nAlternatives can be expressed using the shorter `[]` notation.\n\n```javascript\nvar alt = Joi.alternatives().try(Joi.number(), Joi.string());\n// Same as [Joi.number(), Joi.string()]\n```\n\n#### `alternatives.try(schemas)`\n\nAdds an alternative schema type for attempting to match against the validated value where:\n- `schema` - an array of alternative **joi** types. Also supports providing each type as a separate argument.\n\n```javascript\nvar alt = Joi.alternatives().try(Joi.number(), Joi.string());\nalt.validate('a', function (err, value) { });\n```\n\n#### `alternatives.when(ref, options)`\n\nAdds a conditional alternative schema type based on another key (not the same as `any.when()`) value where:\n- `ref` - the key name or [reference](#refkey-options).\n- `options` - an object with:\n - `is` - the required condition **joi** type.\n - `then` - the alternative schema type to **try** if the condition is true. Required if `otherwise` is missing.\n - `otherwise` - the alternative schema type to **try** if the condition is false. Required if `then` is missing.\n\n```javascript\nvar schema = {\n a: Joi.alternatives().when('b', { is: 5, then: Joi.string(), otherwise: Joi.number() }),\n b: Joi.any()\n};\n```\n\nNote that `when()` only adds additional alternatives to try and does not impact the overall type. Setting\na `required()` rule on a single alternative will not apply to the overall key. For example,\nthis definition of `a`:\n\n```javascript\nvar schema = {\n a: Joi.alternatives().when('b', { is: true, then: Joi.required() }),\n b: Joi.boolean()\n};\n```\n\nDoes not turn `a` into a required key when `b` is `true`. Instead, it tells the validator to try and match the\nvalue to anything that's not `undefined`. However, since `Joi.alternatives()` by itself allows `undefined`, the rule\ndoes not accomplish turning `a` to a required value. This rule is the same as `Joi.alternatives([Joi.required()])`\nwhen `b` is `true` which will allow any value including `undefined`.\n\nTo accomplish the desired result above use:\n\n```javascript\nvar schema = {\n a: Joi.when('b', { is: true, then: Joi.required() }),\n b: Joi.boolean()\n};\n```\n\n### `ref(key, [options])`\n\nGenerates a reference to the value of the named key. References are resolved at validation time and in order of dependency\nso that if one key validation depends on another, the dependent key is validated second after the reference is validated.\nReferences support the following arguments:\n- `key` - the reference target. References cannot point up the object tree, only to sibling keys, but they can point to\n their siblings' children (e.g. 'a.b.c') using the `.` separator. If a `key` starts with `$` is signifies a context reference\n which is looked up in the `context` option object.\n- `options` - optional settings:\n - `separator` - overrides the default `.` hierarchy separator.\n - `contextPrefix` - overrides the default `$` context prefix signifier.\n\nNote that references can only be used where explicitly supported such as in `valid()` or `invalid()` rules. If upwards\n(parents) references are needed, use [`object.assert()`](#objectassertref-schema-message).\n\n```javascript\nvar schema = Joi.object().keys({\n a: Joi.ref('b.c'),\n b: {\n c: Joi.any()\n },\n c: Joi.ref('$x')\n});\n\nJoi.validate({ a: 5, b: { c: 5 } }, schema, { context: { x: 5 } }, function (err, value) {});\n```\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/hapijs/joi/issues" - }, - "_id": "joi@5.1.0", - "_from": "joi@5.x.x" -} diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/test/alternatives.js b/node_modules/hapi/node_modules/vision/node_modules/joi/test/alternatives.js deleted file mode 100755 index e82ca88..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/test/alternatives.js +++ /dev/null @@ -1,454 +0,0 @@ -// Load modules - -var Lab = require('lab'); -var Code = require('code'); -var Joi = require('..'); -var Helper = require('./helper'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var before = lab.before; -var after = lab.after; -var describe = lab.describe; -var it = lab.it; -var expect = Code.expect; - - -describe('alternatives', function () { - - it('fails when no alternatives are provided', function (done) { - - Joi.alternatives().validate('a', function (err, value) { - - expect(err).to.exist(); - expect(err.message).to.equal('value not matching any of the allowed alternatives'); - done(); - }); - }); - - it('allows undefined when no alternatives are provided', function (done) { - - Joi.alternatives().validate(undefined, function (err, value) { - - expect(err).to.not.exist(); - done(); - }); - }); - - it('applies modifiers when higher priority converts', function (done) { - - var schema = Joi.object({ - a: [ - Joi.number(), - Joi.string() - ] - }); - - schema.validate({ a: '5' }, function (err, value) { - - expect(err).to.not.exist(); - expect(value.a).to.equal(5); - done(); - }); - }); - - it('applies modifiers when lower priority valid is a match', function (done) { - - var schema = Joi.object({ - a: [ - Joi.number(), - Joi.valid('5') - ] - }); - - schema.validate({ a: '5' }, function (err, value) { - - expect(err).to.not.exist(); - expect(value.a).to.equal(5); - done(); - }); - }); - - it('does not apply modifier if alternative fails', function (done) { - - var schema = Joi.object({ - a: [ - Joi.object({ c: Joi.any(), d: Joi.number() }).rename('b', 'c'), - { b: Joi.any(), d: Joi.string() } - ] - }); - - var input = { a: { b: 'any', d: 'string' } }; - schema.validate(input, function (err, value) { - - expect(err).to.not.exist(); - expect(value.a.b).to.equal('any'); - done(); - }); - }); - - describe('#try', function () { - - it('throws when missing alternatives', function (done) { - - expect(function () { - - Joi.alternatives().try(); - }).to.throw('Cannot add other alternatives without at least one schema'); - done(); - }); - }); - - describe('#when', function () { - - it('throws on invalid ref (not string)', function (done) { - - expect(function () { - - Joi.alternatives().when(5, { is: 6, then: Joi.number() }); - }).to.throw('Invalid reference: 5'); - done(); - }); - - it('validates conditional alternatives', function (done) { - - var schema = { - a: Joi.alternatives().when('b', { is: 5, then: 'x', otherwise: 'y' }) - .try('z'), - b: Joi.any() - }; - - Helper.validate(schema, [ - [{ a: 'x', b: 5 }, true], - [{ a: 'x', b: 6 }, false], - [{ a: 'y', b: 5 }, false], - [{ a: 'y', b: 6 }, true], - [{ a: 'z', b: 5 }, true], - [{ a: 'z', b: 6 }, true] - ], done); - }); - - it('validates conditional alternatives (empty key)', function (done) { - - var schema = { - a: Joi.alternatives().when('', { is: 5, then: 'x', otherwise: 'y' }) - .try('z'), - '': Joi.any() - }; - - Helper.validate(schema, [ - [{ a: 'x', '': 5 }, true], - [{ a: 'x', '': 6 }, false], - [{ a: 'y', '': 5 }, false], - [{ a: 'y', '': 6 }, true], - [{ a: 'z', '': 5 }, true], - [{ a: 'z', '': 6 }, true] - ], done); - }); - - it('validates only then', function (done) { - - var schema = { - a: Joi.alternatives().when(Joi.ref('b'), { is: 5, then: 'x' }) - .try('z'), - b: Joi.any() - }; - - Helper.validate(schema, [ - [{ a: 'x', b: 5 }, true], - [{ a: 'x', b: 6 }, false], - [{ a: 'y', b: 5 }, false], - [{ a: 'y', b: 6 }, false], - [{ a: 'z', b: 5 }, true], - [{ a: 'z', b: 6 }, true] - ], done); - }); - - it('validates only otherwise', function (done) { - - var schema = { - a: Joi.alternatives().when('b', { is: 5, otherwise: 'y' }) - .try('z'), - b: Joi.any() - }; - - Helper.validate(schema, [ - [{ a: 'x', b: 5 }, false], - [{ a: 'x', b: 6 }, false], - [{ a: 'y', b: 5 }, false], - [{ a: 'y', b: 6 }, true], - [{ a: 'z', b: 5 }, true], - [{ a: 'z', b: 6 }, true] - ], done); - }); - - it('validates when is has ref', function (done) { - - var schema = { - a: Joi.alternatives().when('b', { is: Joi.ref('c'), then: 'x' }), - b: Joi.any(), - c: Joi.number() - }; - - Helper.validate(schema, [ - [{ a: 'x', b: 5, c: '5' }, true], - [{ a: 'x', b: 5, c: '1' }, false], - [{ a: 'x', b: '5', c: '5' }, false], - [{ a: 'y', b: 5, c: 5 }, false], - [{ a: 'y' }, false] - ], done); - }); - - it('validates when then has ref', function (done) { - - var schema = { - a: Joi.alternatives().when('b', { is: 5, then: Joi.ref('c') }), - b: Joi.any(), - c: Joi.number() - }; - - Helper.validate(schema, [ - [{ a: 'x', b: 5, c: '1' }, false], - [{ a: 1, b: 5, c: '1' }, true], - [{ a: '1', b: 5, c: '1' }, false] - ], done); - }); - - it('validates when otherwise has ref', function (done) { - - var schema = { - a: Joi.alternatives().when('b', { is: 6, otherwise: Joi.ref('c') }), - b: Joi.any(), - c: Joi.number() - }; - - Helper.validate(schema, [ - [{ a: 'x', b: 5, c: '1' }, false], - [{ a: 1, b: 5, c: '1' }, true], - [{ a: '1', b: 5, c: '1' }, false] - ], done); - }); - - it('validates when empty value', function (done) { - - var schema = { - a: Joi.alternatives().when('b', { is: true, then: Joi.required() }), - b: Joi.boolean().default(false) - }; - - Helper.validate(schema, [ - [{ b: false }, true], - [{ b: true }, true] // true because required() only applies to the one alternative - ], done); - }); - }); - - describe('#describe', function () { - - it('describes when', function (done) { - - var schema = { - a: Joi.alternatives().when('b', { is: 5, then: 'x', otherwise: 'y' }) - .try('z'), - b: Joi.any() - }; - - var outcome = { - type: 'object', - children: { - b: { - type: 'any' - }, - a: { - type: 'alternatives', - alternatives: [ - { - ref: 'ref:b', - is: { - type: 'number', - flags: { - allowOnly: true - }, - valids: [5], - invalids: [Infinity, -Infinity] - }, - then: { - type: 'string', - flags: { - allowOnly: true - }, - valids: ['x'], - invalids: [''] - }, - otherwise: { - type: 'string', - flags: { - allowOnly: true - }, - valids: ['y'], - invalids: [''] - } - }, - { - type: 'string', - flags: { - allowOnly: true - }, - valids: ['z'], - invalids: [''] - } - ] - } - } - }; - - expect(Joi.describe(schema)).to.deep.equal(outcome); - done(); - }); - - it('describes when (only then)', function (done) { - - var schema = { - a: Joi.alternatives().when('b', { is: 5, then: 'x' }) - .try('z'), - b: Joi.any() - }; - - var outcome = { - type: 'object', - children: { - b: { - type: 'any' - }, - a: { - type: 'alternatives', - alternatives: [ - { - ref: 'ref:b', - is: { - type: 'number', - flags: { - allowOnly: true - }, - valids: [5], - invalids: [Infinity, -Infinity] - }, - then: { - type: 'string', - flags: { - allowOnly: true - }, - valids: ['x'], - invalids: [''] - } - }, - { - type: 'string', - flags: { - allowOnly: true - }, - valids: ['z'], - invalids: [''] - } - ] - } - } - }; - - expect(Joi.describe(schema)).to.deep.equal(outcome); - done(); - }); - - it('describes when (only otherwise)', function (done) { - - var schema = { - a: Joi.alternatives().when('b', { is: 5, otherwise: 'y' }) - .try('z'), - b: Joi.any() - }; - - var outcome = { - type: 'object', - children: { - b: { - type: 'any' - }, - a: { - type: 'alternatives', - alternatives: [ - { - ref: 'ref:b', - is: { - type: 'number', - flags: { - allowOnly: true - }, - valids: [5], - invalids: [Infinity, -Infinity] - }, - otherwise: { - type: 'string', - flags: { - allowOnly: true - }, - valids: ['y'], - invalids: [''] - } - }, - { - type: 'string', - flags: { - allowOnly: true - }, - valids: ['z'], - invalids: [''] - } - ] - } - } - }; - - expect(Joi.describe(schema)).to.deep.equal(outcome); - done(); - }); - - it('describes inherited fields (from any)', function (done) { - - var schema = Joi.alternatives() - .try('a') - .description('d') - .example('a') - .meta('b') - .meta('c') - .notes('f') - .tags('g'); - - var outcome = { - type: 'alternatives', - description: 'd', - notes: ['f'], - tags: ['g'], - meta: ['b', 'c'], - examples: ['a'], - alternatives: [{ - type: 'string', - flags: { - allowOnly: true - }, - valids: ['a'], - invalids: [''] - }] - }; - - expect(Joi.describe(schema)).to.deep.equal(outcome); - done(); - }); - }); -}); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/test/any.js b/node_modules/hapi/node_modules/vision/node_modules/joi/test/any.js deleted file mode 100755 index 3a89bf6..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/test/any.js +++ /dev/null @@ -1,960 +0,0 @@ -// Load modules - -var Lab = require('lab'); -var Code = require('code'); -var Joi = require('../lib'); -var Helper = require('./helper'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var before = lab.before; -var after = lab.after; -var describe = lab.describe; -var it = lab.it; -var expect = Code.expect; - - -describe('any', function () { - - describe('#equal', function () { - - it('validates valid values', function (done) { - - Helper.validate(Joi.equal(4), [ - [4, true], - [5, false] - ], done); - }); - }); - - describe('#not', function () { - - it('validates invalid values', function (done) { - - Helper.validate(Joi.not(5), [ - [4, true], - [5, false] - ], done); - }); - }); - - describe('#exist', function () { - - it('validates required values', function (done) { - - Helper.validate(Joi.exist(), [ - [4, true], - [undefined, false] - ], done); - }); - }); - - describe('#strict', function () { - - it('validates without converting', function (done) { - - var schema = Joi.object({ - array: Joi.array().includes(Joi.string().min(5), Joi.number().min(3)) - }).strict(); - - Helper.validate(schema, [ - [{ array: ['12345'] }, true], - [{ array: ['1'] }, false], - [{ array: [3] }, true], - [{ array: ['12345', 3] }, true] - ], done); - }); - }); - - describe('#options', function () { - - it('adds to existing options', function (done) { - - var schema = Joi.object({ b: Joi.number().strict().options({ convert: true }) }); - var input = { b: '2' }; - schema.validate(input, function (err, value) { - - expect(err).to.not.exist(); - expect(value.b).to.equal(2); - done(); - }); - }); - }); - - describe('#label', function () { - - it('adds to existing options', function (done) { - - var schema = Joi.object({ b: Joi.string().email().label('Custom label') }); - var input = { b: 'not_a_valid_email' }; - schema.validate(input, function (err, value) { - - expect(err).to.exist(); - expect(err.details[0].message).to.equal('Custom label must be a valid email'); - done(); - }); - }); - - it('throws when label is missing', function (done) { - - expect(function () { - - Joi.label(); - }).to.throw('Label name must be a non-empty string'); - done(); - }); - - it('can describe a label', function (done) { - - var schema = Joi.object().label('lbl').describe(); - expect(schema).to.deep.equal({ type: 'object', label: 'lbl' }); - done(); - }); - }); - - describe('#strict', function () { - - it('adds to existing options', function (done) { - - var schema = Joi.object({ b: Joi.number().options({ convert: true }).strict() }); - var input = { b: '2' }; - schema.validate(input, function (err, value) { - - expect(err).to.exist(); - expect(value.b).to.equal('2'); - done(); - }); - }); - }); - - describe('#raw', function () { - - it('gives the raw input', function (done) { - - var tests = [ - [Joi.array(), '[1,2,3]'], - [Joi.binary(), 'abc'], - [Joi.boolean(), 'false'], - [Joi.date().format('YYYYMMDD'), '19700101'], - [Joi.number(), '12'], - [Joi.object(), '{ "a": 1 }'], - [Joi.any().strict(), 'abc'] - ]; - - tests.forEach(function (test) { - - var baseSchema = test[0]; - var input = test[1]; - var schemas = [ - baseSchema.raw(), - baseSchema.raw(true), - baseSchema.options({ raw: true }) - ]; - - schemas.forEach(function (schema) { - - schema.raw().validate(input, function (err, value) { - - expect(err).to.not.exist(); - expect(value).to.equal(input); - }); - }); - }); - - done(); - }); - }); - - describe('#default', function () { - - it('sets the value', function (done) { - - var schema = Joi.object({ foo: Joi.string().default('test') }); - var input = {}; - - schema.validate(input, function (err, value) { - - expect(err).to.not.exist(); - expect(value.foo).to.equal('test'); - done(); - }); - }); - - it('should not overide a value when value is given', function (done) { - - var schema = Joi.object({ foo: Joi.string().default('bar') }); - var input = { foo: 'test' }; - - schema.validate(input, function (err, value) { - - expect(err).to.not.exist(); - expect(value.foo).to.equal('test'); - done(); - }); - }); - - it('sets value based on condition (outer)', function (done) { - - var schema = Joi.object({ - a: Joi.boolean(), - b: Joi.boolean().default(false).when('a', { is: true, then: Joi.required(), otherwise: Joi.forbidden() }) - }); - - schema.validate({ a: false }, function (err, value) { - - expect(err).to.not.exist(); - expect(value.b).to.equal(false); - done(); - }); - }); - - it('sets value based on condition (inner)', function (done) { - - var schema = Joi.object({ - a: Joi.boolean(), - b: Joi.boolean().when('a', { is: true, then: Joi.default(false), otherwise: Joi.forbidden() }) - }); - - schema.validate({ a: true }, function (err, value) { - - expect(err).to.not.exist(); - expect(value.b).to.equal(false); - done(); - }); - }); - }); - - describe('#optional', function () { - - it('validates optional with default required', function (done) { - - var schema = Joi.object({ - a: Joi.any(), - b: Joi.any(), - c: { - d: Joi.any() - } - }).options({ presence: 'required' }); - - Helper.validate(schema, [ - [{ a: 5 }, false], - [{ a: 5, b: 6 }, false], - [{ a: 5, b: 6, c: {} }, false], - [{ a: 5, b: 6, c: { d: 7 } }, true], - [{}, false], - [{ b: 5 }, false] - ], done); - }); - }); - - describe('#forbidden', function () { - - it('validates forbidden', function (done) { - - var schema = { - a: Joi.number(), - b: Joi.forbidden() - }; - - Helper.validate(schema, [ - [{ a: 5 }, true], - [{ a: 5, b: 6 }, false], - [{ a: 'a' }, false], - [{}, true], - [{ b: undefined }, true], - [{ b: null }, false] - ], done); - }); - }); - - describe('#description', function () { - - it('sets the description', function (done) { - - var b = Joi.description('my description'); - expect(b._description).to.equal('my description'); - done(); - }); - - it('throws when description is missing', function (done) { - - expect(function () { - - Joi.description(); - }).to.throw('Description must be a non-empty string'); - done(); - }); - }); - - describe('#notes', function () { - - it('sets the notes', function (done) { - - var b = Joi.notes(['a']).notes('my notes'); - expect(b._notes).to.deep.equal(['a', 'my notes']); - done(); - }); - - it('throws when notes are missing', function (done) { - - expect(function () { - - Joi.notes(); - }).to.throw('Notes must be a non-empty string or array'); - done(); - }); - - it('throws when notes are invalid', function (done) { - - expect(function () { - - Joi.notes(5); - }).to.throw('Notes must be a non-empty string or array'); - done(); - }); - }); - - describe('#tags', function () { - - it('sets the tags', function (done) { - - var b = Joi.tags(['tag1', 'tag2']).tags('tag3'); - expect(b._tags).to.include('tag1'); - expect(b._tags).to.include('tag2'); - expect(b._tags).to.include('tag3'); - done(); - }); - - it('throws when tags are missing', function (done) { - - expect(function () { - - Joi.tags(); - }).to.throw('Tags must be a non-empty string or array'); - done(); - }); - - it('throws when tags are invalid', function (done) { - - expect(function () { - - Joi.tags(5); - }).to.throw('Tags must be a non-empty string or array'); - done(); - }); - }); - - describe('#meta', function () { - - it('sets the meta', function (done) { - - var meta = { prop: 'val', prop2: 3 }; - var b = Joi.meta(meta); - expect(b.describe().meta).to.deep.equal([meta]); - - b = b.meta({ other: true }); - expect(b.describe().meta).to.deep.equal([meta, { - other: true - }]); - - done(); - }); - - it('throws when meta is missing', function (done) { - - expect(function () { - - Joi.meta(); - }).to.throw('Meta cannot be undefined'); - done(); - }); - }); - - describe('#example', function () { - - it('sets an example', function (done) { - - var schema = Joi.valid(5, 6, 7).example(5); - expect(schema._examples).to.include(5); - expect(schema.describe().examples).to.deep.equal([5]); - done(); - }); - - it('throws when tags are missing', function (done) { - - expect(function () { - - Joi.example(); - }).to.throw('Missing example'); - done(); - }); - - it('throws when example fails own rules', function (done) { - - expect(function () { - - var schema = Joi.valid(5, 6, 7).example(4); - }).to.throw('Bad example: value must be one of 5, 6, 7'); - done(); - }); - }); - - describe('#unit', function () { - - it('sets the unit', function (done) { - - var b = Joi.unit('milliseconds'); - expect(b._unit).to.equal('milliseconds'); - expect(b.describe().unit).to.equal('milliseconds'); - done(); - }); - - it('throws when unit is missing', function (done) { - - expect(function () { - - Joi.unit(); - }).to.throw('Unit name must be a non-empty string'); - done(); - }); - }); - - describe('#_validate', function () { - - it('checks value after conversion', function (done) { - - var schema = Joi.number().invalid(2); - Joi.validate('2', schema, { abortEarly: false }, function (err, value) { - - expect(err).to.exist(); - done(); - }); - }); - }); - - describe('#concat', function () { - - it('throws when schema is not any', function (done) { - - expect(function () { - - Joi.string().concat(Joi.number()); - }).to.throw('Cannot merge with another type: number'); - done(); - }); - - it('throws when schema is missing', function (done) { - - expect(function () { - - Joi.string().concat(); - }).to.throw('Invalid schema object'); - done(); - }); - - it('throws when schema is invalid', function (done) { - - expect(function () { - - Joi.string().concat(1); - }).to.throw('Invalid schema object'); - done(); - }); - - it('merges two schemas (settings)', function (done) { - - var a = Joi.number().options({ convert: true }); - var b = Joi.options({ convert: false }); - - Helper.validate(a, [ - [1, true], ['1', true] - ]); - - Helper.validate(a.concat(b), [ - [1, true], ['1', false] - ], done); - }); - - it('merges two schemas (valid)', function (done) { - - var a = Joi.string().valid('a'); - var b = Joi.string().valid('b'); - - Helper.validate(a, [ - ['a', true], - ['b', false] - ]); - - Helper.validate(b, [ - ['b', true], - ['a', false] - ]); - - Helper.validate(a.concat(b), [ - ['a', true], - ['b', true] - ], done); - }); - - it('merges two schemas (invalid)', function (done) { - - var a = Joi.string().invalid('a'); - var b = Joi.invalid('b'); - - Helper.validate(a, [ - ['b', true], ['a', false] - ]); - - Helper.validate(b, [ - ['a', true], ['b', false] - ]); - - Helper.validate(a.concat(b), [ - ['a', false], ['b', false] - ], done); - }); - - it('merges two schemas (valid/invalid)', function (done) { - - var a = Joi.string().valid('a').invalid('b'); - var b = Joi.string().valid('b').invalid('a'); - - Helper.validate(a, [ - ['a', true], - ['b', false] - ]); - - Helper.validate(b, [ - ['b', true], - ['a', false] - ]); - - Helper.validate(a.concat(b), [ - ['a', false], - ['b', true] - ], done); - }); - - it('merges two schemas (tests)', function (done) { - - var a = Joi.number().min(5); - var b = Joi.number().max(10); - - Helper.validate(a, [ - [4, false], [11, true] - ]); - - Helper.validate(b, [ - [6, true], [11, false] - ]); - - Helper.validate(a.concat(b), [ - [4, false], [6, true], [11, false] - ], done); - }); - - it('merges two schemas (flags)', function (done) { - - var a = Joi.string().valid('a'); - var b = Joi.string().insensitive(); - - Helper.validate(a, [ - ['a', true], ['A', false], ['b', false] - ]); - - Helper.validate(a.concat(b), [ - ['a', true], ['A', true], ['b', false] - ], done); - }); - - it('overrides and append information', function (done) { - - var a = Joi.description('a').unit('a').tags('a').example('a'); - var b = Joi.description('b').unit('b').tags('b').example('b'); - - var desc = a.concat(b).describe(); - expect(desc).to.deep.equal({ - type: 'any', - description: 'b', - tags: ['a', 'b'], - examples: ['a', 'b'], - unit: 'b' - }); - done(); - }); - - it('merges two objects (any key + specific key)', function (done) { - - var a = Joi.object(); - var b = Joi.object({ b: 1 }); - - Helper.validate(a, [ - [{ b: 1 }, true], [{ b: 2 }, true] - ]); - - Helper.validate(b, [ - [{ b: 1 }, true], [{ b: 2 }, false] - ]); - - Helper.validate(a.concat(b), [ - [{ b: 1 }, true], [{ b: 2 }, false] - ]); - - Helper.validate(b.concat(a), [ - [{ b: 1 }, true], [{ b: 2 }, false] - ], done); - }); - - it('merges two objects (no key + any key)', function (done) { - - var a = Joi.object({}); - var b = Joi.object(); - - Helper.validate(a, [ - [{}, true], [{ b: 2 }, false] - ]); - - Helper.validate(b, [ - [{}, true], [{ b: 2 }, true] - ]); - - Helper.validate(a.concat(b), [ - [{}, true], [{ b: 2 }, false] - ]); - - Helper.validate(b.concat(a), [ - [{}, true], [{ b: 2 }, false] - ], done); - }); - - it('merges two objects (key + key)', function (done) { - - var a = Joi.object({ a: 1 }); - var b = Joi.object({ b: 2 }); - - Helper.validate(a, [ - [{ a: 1 }, true], [{ b: 2 }, false] - ]); - - Helper.validate(b, [ - [{ a: 1 }, false], [{ b: 2 }, true] - ]); - - Helper.validate(a.concat(b), [ - [{ a: 1 }, true], [{ b: 2 }, true] - ]); - - Helper.validate(b.concat(a), [ - [{ a: 1 }, true], [{ b: 2 }, true] - ], done); - }); - - it('merges two objects (renames)', function (done) { - - var a = Joi.object({ a: 1 }).rename('c', 'a'); - var b = Joi.object({ b: 2 }).rename('d', 'b'); - - a.concat(b).validate({ c: 1, d: 2 }, function (err, value) { - - expect(err).to.not.exist(); - expect(value).to.deep.equal({ a: 1, b: 2 }); - done(); - }); - }); - - it('merges two objects (deps)', function (done) { - - var a = Joi.object({ a: 1 }); - var b = Joi.object({ b: 2 }).and('b', 'a'); - - a.concat(b).validate({ a: 1, b: 2 }, function (err, value) { - - expect(err).to.not.exist(); - done(); - }); - }); - - it('merges two alternatives with references', function (done) { - - var schema = { - a: { c: Joi.number() }, - b: Joi.alternatives(Joi.ref('a.c')).concat(Joi.alternatives(Joi.ref('c'))), - c: Joi.number() - }; - - Helper.validate(schema, [ - [{ a: {} }, true], - [{ a: { c: '5' }, b: 5 }, true], - [{ a: { c: '5' }, b: 6, c: '6' }, true], - [{ a: { c: '5' }, b: 7, c: '6' }, false] - ], done); - }); - - it('merges meta properly', function (done) { - - var metaA = { a: 1 }; - var metaB = { b: 1 }; - var a = Joi.any().meta(metaA); - var b = Joi.any().meta(metaB); - var c = Joi.any(); - var d = Joi.any(); - - expect(a.concat(b)._meta).to.deep.equal([{ a: 1 }, { b: 1 }]); - expect(a.concat(c)._meta).to.deep.equal([metaA]); - expect(b.concat(c)._meta).to.deep.equal([metaB]); - expect(c.concat(d)._meta).to.deep.equal([]); - - done(); - }); - }); - - describe('#when', function () { - - it('throws when options are invalid', function (done) { - - expect(function () { - - Joi.when('a'); - }).to.throw('Invalid options'); - done(); - }); - - it('forks type into alternatives', function (done) { - - var schema = { - a: Joi.any(), - b: Joi.string().valid('x').when('a', { is: 5, then: Joi.valid('y'), otherwise: Joi.valid('z') }) - }; - - Helper.validate(schema, [ - [{ a: 5, b: 'x' }, true], - [{ a: 5, b: 'y' }, true], - [{ a: 5, b: 'z' }, false], - [{ a: 1, b: 'x' }, true], - [{ a: 1, b: 'y' }, false], - [{ a: 1, b: 'z' }, true], - [{ a: 5, b: 'a' }, false], - [{ b: 'a' }, false] - ], done); - }); - - it('forks type into alternatives (only then)', function (done) { - - var schema = { - a: Joi.any(), - b: Joi.string().valid('x').when('a', { is: 5, then: Joi.valid('y') }) - }; - - Helper.validate(schema, [ - [{ a: 5, b: 'x' }, true], - [{ a: 5, b: 'y' }, true], - [{ a: 5, b: 'z' }, false], - [{ a: 1, b: 'x' }, true], - [{ a: 1, b: 'y' }, false], - [{ a: 1, b: 'z' }, false], - [{ a: 5, b: 'a' }, false], - [{ b: 'a' }, false] - ], done); - }); - - it('forks type into alternatives (only otherwise)', function (done) { - - var schema = { - a: Joi.any(), - b: Joi.string().valid('x').when('a', { is: 5, otherwise: Joi.valid('z') }) - }; - - Helper.validate(schema, [ - [{ a: 5, b: 'x' }, true], - [{ a: 5, b: 'y' }, false], - [{ a: 5, b: 'z' }, false], - [{ a: 1, b: 'x' }, true], - [{ a: 1, b: 'y' }, false], - [{ a: 1, b: 'z' }, true], - [{ a: 5, b: 'a' }, false], - [{ b: 'a' }, false] - ], done); - }); - - it('makes peer required', function (done) { - - var schema = { - a: Joi.when('b', { is: 5, then: Joi.required() }), - b: Joi.any() - }; - - Helper.validate(schema, [ - [{ b: 5 }, false], - [{ b: 6 }, true], - [{ a: 'b' }, true], - [{ b: 5, a: 'x' }, true] - ], done) - }); - }); - - describe('#requiredKeys', function () { - - it('should set keys as required', function (done) { - - var schema = Joi.object({ a: 0, b: 0, c: { d: 0, e: { f: 0 } }, g: { h: 0 } }) - .requiredKeys('a', 'b', 'c.d', 'c.e.f', 'g'); - Helper.validate(schema, [ - [{}, false], - [{ a: 0 }, false], - [{ a: 0, b: 0 }, false], - [{ a: 0, b: 0, g: {} }, true], - [{ a: 0, b: 0, c: {}, g: {} }, false], - [{ a: 0, b: 0, c: { d: 0 }, g: {} }, true], - [{ a: 0, b: 0, c: { d: 0, e: {} }, g: {} }, false], - [{ a: 0, b: 0, c: { d: 0, e: { f: 0 } }, g: {} }, true] - ], done); - }); - - it('should work on types other than objects', function (done) { - - var schemas = [Joi.array(), Joi.binary(), Joi.boolean(), Joi.date(), Joi.func(), Joi.number(), Joi.string()]; - schemas.forEach(function (schema) { - - expect(function () { - - schema.applyFunctionToChildren([''], 'required'); - }).to.not.throw(); - - expect(function () { - - schema.applyFunctionToChildren(['', 'a'], 'required'); - }).to.throw(); - - expect(function () { - - schema.applyFunctionToChildren(['a'], 'required'); - }).to.throw(); - }); - - done(); - }); - - it('should throw on unknown key', function (done) { - - expect(function() { - Joi.object({ a: 0, b: 0 }).requiredKeys('a', 'c', 'b', 'd', 'd.e.f'); - }).to.throw(Error, 'unknown key(s) c, d'); - expect(function() { - Joi.object({ a: 0, b: 0 }).requiredKeys('a', 'b', 'a.c.d'); - }).to.throw(Error, 'unknown key(s) a.c.d'); - done(); - }); - - it('should throw on empty object', function (done) { - - expect(function() { - Joi.object().requiredKeys('a', 'c', 'b', 'd'); - }).to.throw(Error, 'unknown key(s) a, b, c, d'); - done(); - }); - - it('should not modify original object', function (done) { - - var schema = Joi.object({ a: 0 }); - var requiredSchema = schema.requiredKeys('a'); - schema.validate({}, function (err) { - - expect(err).to.not.exist(); - - requiredSchema.validate({}, function (err) { - - expect(err).to.exist(); - done(); - }); - }); - }); - }); - - describe('#optionalKeys', function () { - - it('should set keys as optional', function (done) { - - var schema = Joi.object({ a: Joi.number().required(), b: Joi.number().required() }).optionalKeys('a', 'b'); - Helper.validate(schema, [ - [{}, true], - [{ a: 0 }, true], - [{ a: 0, b: 0 }, true] - ], done); - }); - }); - - describe('Set', function () { - - describe('#add', function () { - - it('throws when adding a non ref function', function (done) { - - expect(function () { - - Joi.valid(function () { }); - }).to.throw('Value cannot be an object or function'); - done(); - }); - - it('throws when adding an object function', function (done) { - - expect(function () { - - Joi.valid({}); - }).to.throw('Value cannot be an object or function'); - done(); - }); - }); - - describe('#has', function () { - - it('compares date to null', function (done) { - - var any = Joi.any().clone(); - any._valids.add(null); - expect(any._valids.has(new Date())).to.equal(false); - done(); - }); - - it('compares buffer to null', function (done) { - - var any = Joi.any().clone(); - any._valids.add(null); - expect(any._valids.has(new Buffer(''))).to.equal(false); - done(); - }); - }); - - describe('#values', function () { - - it('returns array', function (done) { - - var a = Joi.any().valid('x').invalid('y'); - var b = a.invalid('x'); - expect(a._valids.values().length).to.equal(1); - expect(b._valids.values().length).to.equal(0); - expect(a._invalids.values().length).to.equal(1); - expect(b._invalids.values().length).to.equal(2); - done(); - }); - }); - - describe('#toString', function () { - - it('includes undefined', function (done) { - - var b = Joi.any().allow(undefined); - expect(b._valids.toString(true)).to.equal('undefined'); - done(); - }); - }); - }); -}); - diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/test/array.js b/node_modules/hapi/node_modules/vision/node_modules/joi/test/array.js deleted file mode 100755 index 7c1d549..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/test/array.js +++ /dev/null @@ -1,593 +0,0 @@ -// Load modules - -var Lab = require('lab'); -var Code = require('code'); -var Joi = require('../lib'); -var Helper = require('./helper'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var before = lab.before; -var after = lab.after; -var describe = lab.describe; -var it = lab.it; -var expect = Code.expect; - - -describe('array', function () { - - it('converts a string to an array', function (done) { - - Joi.array().validate('[1,2,3]', function (err, value) { - - expect(err).to.not.exist(); - expect(value.length).to.equal(3); - done(); - }); - }); - - it('errors on non-array string', function (done) { - - Joi.array().validate('{ "something": false }', function (err, value) { - - expect(err).to.exist(); - expect(err.message).to.equal('value must be an array'); - done(); - }); - }); - - it('errors on number', function (done) { - - Joi.array().validate(3, function (err, value) { - - expect(err).to.exist(); - expect(value).to.equal(3); - done(); - }); - }); - - it('converts a non-array string with number type', function (done) { - - Joi.array().validate('3', function (err, value) { - - expect(err).to.exist(); - expect(value).to.equal('3'); - done(); - }); - }); - - it('errors on a non-array string', function (done) { - - Joi.array().validate('asdf', function (err, value) { - - expect(err).to.exist(); - expect(value).to.equal('asdf'); - done(); - }); - }); - - describe('#includes', function () { - - it('converts members', function (done) { - - var schema = Joi.array().includes(Joi.number()); - var input = ['1', '2', '3']; - schema.validate(input, function (err, value) { - - expect(err).to.not.exist(); - expect(value).to.deep.equal([1, 2, 3]); - done(); - }); - }); - - it('allows zero size', function (done) { - - var schema = Joi.object({ - test: Joi.array().includes(Joi.object({ - foo: Joi.string().required() - })) - }); - var input = { test: [] }; - - schema.validate(input, function (err, value) { - - expect(err).to.not.exist(); - done(); - }); - }); - - it('returns the first error when only one inclusion', function (done) { - - var schema = Joi.object({ - test: Joi.array().includes(Joi.object({ - foo: Joi.string().required() - })) - }); - var input = { test: [{ foo: 'a' }, { bar: 2 }] }; - - schema.validate(input, function (err, value) { - - expect(err.message).to.equal('test at position 1 fails because foo is required'); - done(); - }); - }); - - it('validates multiple types added in two calls', function (done) { - - var schema = Joi.array() - .includes(Joi.number()) - .includes(Joi.string()); - - Helper.validate(schema, [ - [[1, 2, 3], true], - [[50, 100, 1000], true], - [[1, 'a', 5, 10], true], - [['joi', 'everydaylowprices', 5000], true] - ], done); - }); - }); - - describe('#min', function () { - - it('validates array size', function (done) { - - var schema = Joi.array().min(2); - Helper.validate(schema, [ - [[1, 2], true], - [[1], false] - ], done); - }); - - it('throws when limit is not a number', function (done) { - - expect(function () { - - Joi.array().min('a'); - }).to.throw('limit must be a positive integer'); - done(); - }); - - it('throws when limit is not an integer', function (done) { - - expect(function () { - - Joi.array().min(1.2); - }).to.throw('limit must be a positive integer'); - done(); - }); - }); - - describe('#max', function () { - - it('validates array size', function (done) { - - var schema = Joi.array().max(1); - Helper.validate(schema, [ - [[1, 2], false], - [[1], true] - ], done); - }); - - it('throws when limit is not a number', function (done) { - - expect(function () { - - Joi.array().max('a'); - }).to.throw('limit must be a positive integer'); - done(); - }); - - it('throws when limit is not an integer', function (done) { - - expect(function () { - - Joi.array().max(1.2); - }).to.throw('limit must be a positive integer'); - done(); - }); - }); - - describe('#length', function () { - - it('validates array size', function (done) { - - var schema = Joi.array().length(2); - Helper.validate(schema, [ - [[1, 2], true], - [[1], false] - ], done); - }); - - it('throws when limit is not a number', function (done) { - - expect(function () { - - Joi.array().length('a'); - }).to.throw('limit must be a positive integer'); - done(); - }); - - it('throws when limit is not an integer', function (done) { - - expect(function () { - - Joi.array().length(1.2); - }).to.throw('limit must be a positive integer'); - done(); - }); - }); - - describe('#validate', function () { - - it('should, by default, allow undefined, allow empty array', function (done) { - - Helper.validate(Joi.array(), [ - [undefined, true], - [[], true] - ], done); - }); - - it('should, when .required(), deny undefined', function (done) { - - Helper.validate(Joi.array().required(), [ - [undefined, false] - ], done); - }); - - it('allows empty arrays', function (done) { - - Helper.validate(Joi.array(), [ - [undefined, true], - [[], true] - ], done); - }); - - it('excludes values when excludes is called', function (done) { - - Helper.validate(Joi.array().excludes(Joi.string()), [ - [['2', '1'], false], - [['1'], false], - [[2], true] - ], done); - }); - - it('allows types to be excluded', function (done) { - - var schema = Joi.array().excludes(Joi.number()); - - var n = [1, 2, 'hippo']; - schema.validate(n, function (err, value) { - - expect(err).to.exist(); - - var m = ['x', 'y', 'z']; - schema.validate(m, function (err2, value) { - - expect(err2).to.not.exist(); - done(); - }); - }); - }); - - it('validates array of Numbers', function (done) { - - Helper.validate(Joi.array().includes(Joi.number()), [ - [[1, 2, 3], true], - [[50, 100, 1000], true], - [['a', 1, 2], false], - [['1', '2', 4], true] - ], done); - }); - - it('validates array of mixed Numbers & Strings', function (done) { - - Helper.validate(Joi.array().includes(Joi.number(), Joi.string()), [ - [[1, 2, 3], true], - [[50, 100, 1000], true], - [[1, 'a', 5, 10], true], - [['joi', 'everydaylowprices', 5000], true] - ], done); - }); - - it('validates array of objects with schema', function (done) { - - Helper.validate(Joi.array().includes(Joi.object({ h1: Joi.number().required() })), [ - [[{ h1: 1 }, { h1: 2 }, { h1: 3 }], true], - [[{ h2: 1, h3: 'somestring' }, { h1: 2 }, { h1: 3 }], false], - [[1, 2, [1]], false] - ], done); - }); - - it('errors on array of unallowed mixed types (Array)', function (done) { - - Helper.validate(Joi.array().includes(Joi.number()), [ - [[1, 2, 3], true], - [[1, 2, [1]], false] - ], done); - }); - - it('errors on invalid number rule using includes', function (done) { - - var schema = Joi.object({ - arr: Joi.array().includes(Joi.number().integer()) - }); - - var input = { arr: [1, 2, 2.1] }; - schema.validate(input, function (err, value) { - - expect(err).to.exist(); - expect(err.message).to.equal('arr at position 2 fails because 2 must be an integer'); - done(); - }); - }); - - it('validates an array within an object', function (done) { - - var schema = Joi.object({ - array: Joi.array().includes(Joi.string().min(5), Joi.number().min(3)) - }).options({ convert: false }); - - Helper.validate(schema, [ - [{ array: ['12345'] }, true], - [{ array: ['1'] }, false], - [{ array: [3] }, true], - [{ array: ['12345', 3] }, true] - ], done); - }); - - it('should not change original value', function (done) { - - var schema = Joi.array().includes(Joi.number()).unique(); - var input = ['1', '2']; - - schema.validate(input, function (err, value) { - - expect(err).to.not.exist(); - expect(value).to.deep.equal([1, 2]); - expect(input).to.deep.equal(['1', '2']); - done(); - }); - }); - - describe('#describe', function () { - - it('returns an empty description when no rules are applied', function (done) { - - var schema = Joi.array(); - var desc = schema.describe(); - expect(desc).to.deep.equal({ - type: 'array', - flags: { sparse: false } - }); - done(); - }); - - it('returns an updated description when sparse rule is applied', function (done) { - - var schema = Joi.array().sparse(); - var desc = schema.describe(); - expect(desc).to.deep.equal({ - type: 'array', - flags: { sparse: true } - }); - done(); - }); - - it('returns an includes array only if includes are specified', function (done) { - - var schema = Joi.array().includes().max(5); - var desc = schema.describe(); - expect(desc.includes).to.not.exist(); - done(); - }); - - it('returns a recursively defined array of includes when specified', function (done) { - - var schema = Joi.array().includes(Joi.number(), Joi.string()).excludes(Joi.boolean()); - var desc = schema.describe(); - expect(desc.includes).to.have.length(2); - expect(desc.excludes).to.have.length(1); - expect(desc).to.deep.equal({ - type: 'array', - flags: { sparse: false }, - includes: [{ type: 'number', invalids: [Infinity, -Infinity] }, { type: 'string', invalids: [''] }], - excludes: [{ type: 'boolean' }] - }); - - done(); - }); - }); - }); - - describe('#unique', function() { - - it('errors if duplicate numbers, strings, objects, binaries, functions, dates and booleans', function(done) { - var buffer = new Buffer('hello world'); - var func = function() {}; - var now = new Date(); - var schema = Joi.array().sparse().unique(); - - Helper.validate(schema, [ - [[2, 2], false], - [[02, 2], false], - [[0x2, 2], false], - [['duplicate', 'duplicate'], false], - [[{ a: 'b' }, { a: 'b' }], false], - [[buffer, buffer], false], - [[func, func], false], - [[now, now], false], - [[true, true], false], - [[undefined, undefined], false] - ], done); - }); - - it('ignores duplicates if they are of different types', function(done) { - var schema = Joi.array().unique(); - - Helper.validate(schema, [ - [[2, '2'], true] - ], done); - }); - - it('validates without duplicates', function(done) { - var buffer = new Buffer('hello world'); - var buffer2 = new Buffer('Hello world'); - var func = function() {}; - var func2 = function() {}; - var now = new Date(); - var now2 = new Date(+now + 100); - var schema = Joi.array().unique(); - - Helper.validate(schema, [ - [[1, 2], true], - [['s1', 's2'], true], - [[{ a: 'b' }, { a: 'c' }], true], - [[buffer, buffer2], true], - [[func, func2], true], - [[now, now2], true], - [[true, false], true] - ], done); - }); - }); - - describe('#sparse', function () { - - it('errors on undefined value', function (done) { - - var schema = Joi.array().includes(Joi.number()); - - Helper.validate(schema, [ - [[undefined], false], - [[2, undefined], false] - ], done); - }); - - it('validates on undefined value with sparse', function (done) { - - var schema = Joi.array().includes(Joi.number()).sparse(); - - Helper.validate(schema, [ - [[undefined], true], - [[2, undefined], true] - ], done); - }); - - it('switches the sparse flag', function (done) { - - var schema = Joi.array().sparse(); - var desc = schema.describe(); - expect(desc).to.deep.equal({ - type: 'array', - flags: { sparse: true } - }); - done(); - }); - - it('switches the sparse flag with explicit value', function (done) { - - var schema = Joi.array().sparse(true); - var desc = schema.describe(); - expect(desc).to.deep.equal({ - type: 'array', - flags: { sparse: true } - }); - done(); - }); - - it('switches the sparse flag back', function (done) { - - var schema = Joi.array().sparse().sparse(false); - var desc = schema.describe(); - expect(desc).to.deep.equal({ - type: 'array', - flags: { sparse: false } - }); - done(); - }); - }); - - describe('#single', function() { - - it('should allow a single element', function(done) { - - var schema = Joi.array().includes(Joi.number()).excludes(Joi.boolean()).single(); - - Helper.validate(schema, [ - [[1, 2, 3], true], - [1, true], - [['a'], false, null, 'value at position 0 fails because value must be a number'], - ['a', false, null, 'single value of value fails because value must be a number'], - [true, false, null, 'single value of value contains an excluded value'] - ], done); - }); - - it('should allow a single element with multiple types', function(done) { - - var schema = Joi.array().includes(Joi.number(), Joi.string()).single(); - - Helper.validate(schema, [ - [[1, 2, 3], true], - [1, true], - [[1, 'a'], true], - ['a', true], - [true, false, null, 'single value of value does not match any of the allowed types'] - ], done); - }); - - it('should allow nested arrays', function(done) { - - var schema = Joi.array().includes(Joi.array().includes(Joi.number())).single(); - - Helper.validate(schema, [ - [[[1],[2],[3]], true], - [[1, 2, 3], true], - [[['a']], false, null, 'value at position 0 fails because value at position 0 fails because value must be a number'], - [['a'], false, null, 'value at position 0 fails because value must be an array'], - ['a', false, null, 'single value of value fails because value must be an array'], - [1, false, null, 'single value of value fails because value must be an array'], - [true, false, null, 'single value of value fails because value must be an array'] - ], done); - }); - - it('should allow nested arrays with multiple types', function (done) { - - var schema = Joi.array().includes(Joi.array().includes(Joi.number(), Joi.boolean())).single(); - - Helper.validate(schema, [ - [[[1, true]], true], - [[1, true], true], - [[[1, 'a']], false, null, 'value at position 0 fails because value at position 1 does not match any of the allowed types'], - [[1, 'a'], false, null, 'value at position 0 fails because value must be an array'] - ], done); - }); - - it('switches the single flag with explicit value', function (done) { - - var schema = Joi.array().single(true); - var desc = schema.describe(); - expect(desc).to.deep.equal({ - type: 'array', - flags: { sparse: false, single: true } - }); - done(); - }); - - it('switches the single flag back', function (done) { - - var schema = Joi.array().single().single(false); - var desc = schema.describe(); - expect(desc).to.deep.equal({ - type: 'array', - flags: { sparse: false, single: false } - }); - done(); - }); - }); -}); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/test/binary.js b/node_modules/hapi/node_modules/vision/node_modules/joi/test/binary.js deleted file mode 100755 index 7a89a4c..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/test/binary.js +++ /dev/null @@ -1,194 +0,0 @@ -// Load modules - -var Lab = require('lab'); -var Code = require('code'); -var Joi = require('../lib'); -var Helper = require('./helper'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var before = lab.before; -var after = lab.after; -var describe = lab.describe; -var it = lab.it; -var expect = Code.expect; - - -describe('binary', function () { - - it('converts a string to a buffer', function (done) { - - Joi.binary().validate('test', function (err, value) { - - expect(err).to.not.exist(); - expect(value instanceof Buffer).to.equal(true); - expect(value.length).to.equal(4); - expect(value.toString('utf8')).to.equal('test'); - done(); - }); - }); - - it('validates allowed buffer content', function (done) { - - var hello = new Buffer('hello'); - var schema = Joi.binary().valid(hello); - - Helper.validate(schema, [ - ['hello', true], - [hello, true], - [new Buffer('hello'), true], - ['goodbye', false], - [new Buffer('goodbye'), false], - [new Buffer('HELLO'), false] - ], done); - }); - - describe('#validate', function () { - - it('returns an error when a non-buffer or non-string is used', function (done) { - - Joi.binary().validate(5, function (err, value) { - - expect(err).to.exist(); - expect(err.message).to.equal('value must be a buffer or a string'); - done(); - }); - }); - - it('accepts a buffer object', function (done) { - - var schema = { - buffer: Joi.binary - }; - - Joi.binary().validate(new Buffer('hello world'), function (err, value) { - - expect(err).to.not.exist(); - expect(value.toString('utf8')).to.equal('hello world'); - done(); - }); - }); - }); - - describe('#encoding', function () { - - it('applies encoding', function (done) { - - var schema = Joi.binary().encoding('base64'); - var input = new Buffer('abcdef'); - schema.validate(input.toString('base64'), function (err, value) { - - expect(err).to.not.exist(); - expect(value instanceof Buffer).to.equal(true); - expect(value.toString()).to.equal('abcdef'); - done(); - }); - }); - - it('throws when encoding is invalid', function (done) { - - expect(function () { - - Joi.binary().encoding('base6'); - }).to.throw('Invalid encoding: base6'); - done(); - }); - }); - - describe('#min', function () { - - it('validates buffer size', function (done) { - - var schema = Joi.binary().min(5); - Helper.validate(schema, [ - [new Buffer('testing'), true], - [new Buffer('test'), false] - ], done); - }); - - it('throws when min is not a number', function (done) { - - expect(function () { - - Joi.binary().min('a'); - }).to.throw('limit must be a positive integer'); - done(); - }); - - it('throws when min is not an integer', function (done) { - - expect(function () { - - Joi.binary().min(1.2); - }).to.throw('limit must be a positive integer'); - done(); - }); - }); - - describe('#max', function () { - - it('validates buffer size', function (done) { - - var schema = Joi.binary().max(5); - Helper.validate(schema, [ - [new Buffer('testing'), false], - [new Buffer('test'), true] - ], done); - }); - - it('throws when max is not a number', function (done) { - - expect(function () { - - Joi.binary().max('a'); - }).to.throw('limit must be a positive integer'); - done(); - }); - - it('throws when max is not an integer', function (done) { - - expect(function () { - - Joi.binary().max(1.2); - }).to.throw('limit must be a positive integer'); - done(); - }); - }); - - describe('#length', function () { - - it('validates buffer size', function (done) { - - var schema = Joi.binary().length(4); - Helper.validate(schema, [ - [new Buffer('test'), true], - [new Buffer('testing'), false] - ], done); - }); - - it('throws when length is not a number', function (done) { - - expect(function () { - - Joi.binary().length('a'); - }).to.throw('limit must be a positive integer'); - done(); - }); - - it('throws when length is not an integer', function (done) { - - expect(function () { - - Joi.binary().length(1.2); - }).to.throw('limit must be a positive integer'); - done(); - }); - }); -}); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/test/boolean.js b/node_modules/hapi/node_modules/vision/node_modules/joi/test/boolean.js deleted file mode 100755 index 5be2e97..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/test/boolean.js +++ /dev/null @@ -1,132 +0,0 @@ -// Load modules - -var Lab = require('lab'); -var Code = require('code'); -var Joi = require('../lib'); -var Helper = require('./helper'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var before = lab.before; -var after = lab.after; -var describe = lab.describe; -var it = lab.it; -var expect = Code.expect; - - -describe('boolean', function () { - - it('converts a string to a boolean', function (done) { - - Joi.boolean().validate('true', function (err, value) { - - expect(err).to.not.exist(); - expect(value).to.equal(true); - done(); - }); - }); - - it('errors on a number', function (done) { - - Joi.boolean().validate(1, function (err, value) { - - expect(err).to.exist(); - expect(value).to.equal(1); - done(); - }); - }); - - describe('#validate', function () { - - it('converts string values and validates', function (done) { - - var rule = Joi.boolean(); - Helper.validate(rule, [ - ['1234', false], - [false, true], - [true, true], - [null, false], - ['on', true], - ['off', true], - ['true', true], - ['false', true], - ['yes', true], - ['no', true] - ], done); - }); - - it('should handle work with required', function (done) { - - var rule = Joi.boolean().required(); - Helper.validate(rule, [ - ['1234', false], - ['true', true], - [false, true], - [true, true], - [null, false] - ], done); - }); - - it('should handle work with allow', function (done) { - - var rule = Joi.boolean().allow(false); - Helper.validate(rule, [ - ['1234', false], - [false, true], - [null, false] - ], done); - }); - - it('should handle work with invalid', function (done) { - - var rule = Joi.boolean().invalid(false); - Helper.validate(rule, [ - ['1234', false], - [false, false], - [true, true], - [null, false] - ], done); - }); - - it('should handle work with invalid and null allowed', function (done) { - - var rule = Joi.boolean().invalid(false).allow(null); - Helper.validate(rule, [ - ['1234', false], - [false, false], - [true, true], - [null, true] - ], done); - }); - - it('should handle work with allow and invalid', function (done) { - - var rule = Joi.boolean().invalid(true).allow(false); - Helper.validate(rule, [ - ['1234', false], - [false, true], - [true, false], - [null, false] - ], done); - }); - - it('should handle work with allow, invalid, and null allowed', function (done) { - - var rule = Joi.boolean().invalid(true).allow(false).allow(null); - Helper.validate(rule, [ - ['1234', false], - [false, true], - [true, false], - [null, true] - ], done); - }); - }); -}); - diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/test/date.js b/node_modules/hapi/node_modules/vision/node_modules/joi/test/date.js deleted file mode 100755 index 6eb9d21..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/test/date.js +++ /dev/null @@ -1,291 +0,0 @@ -// Load modules - -var Lab = require('lab'); -var Code = require('code'); -var Joi = require('../lib'); -var Helper = require('./helper'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var before = lab.before; -var after = lab.after; -var describe = lab.describe; -var it = lab.it; -var expect = Code.expect; - - -describe('date', function () { - - it('fails on boolean', function (done) { - - var schema = Joi.date(); - Helper.validate(schema, [ - [true, false], - [false, false] - ], done); - }); - - it('matches specific date', function (done) { - - var now = Date.now(); - Joi.date().valid(new Date(now)).validate(new Date(now), function (err, value) { - - expect(err).to.not.exist(); - done(); - }); - }); - - it('errors on invalid input and convert disabled', function (done) { - - Joi.date().options({ convert: false }).validate('1-1-2013 UTC', function (err, value) { - - expect(err).to.exist(); - expect(err.message).to.equal('value must be a number of milliseconds or valid date string'); - done(); - }); - }); - - it('validates date', function (done) { - - Joi.date().validate(new Date(), function (err, value) { - - expect(err).to.not.exist(); - done(); - }); - }); - - it('validates millisecond date as a string', function (done) { - - var now = new Date(); - var mili = now.getTime(); - - Joi.date().validate(mili.toString(), function (err, value) { - - expect(err).to.not.exist(); - expect(value).to.deep.equal(now); - done(); - }); - }); - - describe('#validate', function () { - - describe('min', function () { - - it('validates min', function (done) { - - Helper.validate(Joi.date().min('1-1-2000 UTC'), [ - ['1-1-2001 UTC', true], - ['1-1-2000 UTC', true], - [0, false], - ["0", false], - ["-1", false], - ['1-1-1999 UTC', false] - ], done); - }); - - it('accepts "now" as the min date', function(done) { - - var future = new Date(Date.now() + 1000000); - - Joi.date().min('now').validate(future, function (err, value) { - - expect(err).to.not.exist(); - expect(value).to.deep.equal(future); - done(); - }); - }); - - it('errors if .min("now") is used with a past date', function(done) { - - var past = new Date(Date.now() - 1000000); - - Joi.date().min('now').validate(past, function (err, value) { - - expect(err).to.exist(); - done(); - }); - }); - - it('accepts references as min date', function(done) { - - var schema = Joi.object({ a: Joi.date(), b: Joi.date().min(Joi.ref('a')) }); - var now = Date.now(); - - Helper.validate(schema, [ - [{ a: now, b: now }, true], - [{ a: now, b: now + 1e3 }, true], - [{ a: now, b: now - 1e3 }, false] - ], done); - }); - - it('errors if reference is not a date', function(done) { - - var schema = Joi.object({ a: Joi.string(), b: Joi.date().min(Joi.ref('a')) }); - - Helper.validate(schema, [ - [{ a: 'abc', b: new Date() }, false, null, 'b references a which is not a date'], - [{ a: '123', b: new Date() }, true], - [{ a: (Date.now() + 1e3).toString(), b: new Date() }, false, null, /^b must be larger than or equal to/] - ], done); - }); - }); - - describe('max', function () { - - it('validates max', function (done) { - - Helper.validate(Joi.date().max('1-1-1970 UTC'), [ - ['1-1-1971 UTC', false], - ['1-1-1970 UTC', true], - [0, true], - [1, false], - ["0", true], - ["-1", true], - ['1-1-2014 UTC', false] - ], done); - }); - - it('accepts "now" as the max date', function(done) { - - var past = new Date(Date.now() - 1000000); - - Joi.date().max('now').validate(past, function (err, value) { - - expect(err).to.not.exist(); - expect(value).to.deep.equal(past); - done(); - }); - }); - - it('errors if .max("now") is used with a future date', function(done) { - - var future = new Date(Date.now() + 1000000); - - Joi.date().max('now').validate(future, function (err, value) { - - expect(err).to.exist(); - done(); - }); - }); - - it('accepts references as max date', function(done) { - - var schema = Joi.object({ a: Joi.date(), b: Joi.date().max(Joi.ref('a')) }); - var now = Date.now(); - - Helper.validate(schema, [ - [{ a: now, b: now }, true], - [{ a: now, b: now + 1e3 }, false], - [{ a: now, b: now - 1e3 }, true] - ], done); - }); - - it('errors if reference is not a date', function(done) { - - var schema = Joi.object({ a: Joi.string(), b: Joi.date().max(Joi.ref('a')) }); - - Helper.validate(schema, [ - [{ a: 'abc', b: new Date() }, false, null, 'b references a which is not a date'], - [{ a: '100000000000000', b: new Date() }, true], - [{ a: (Date.now() - 1e3).toString(), b: new Date() }, false, null, /^b must be less than or equal to/] - ], done); - }); - }); - - it('validates only valid dates', function (done) { - - Helper.validate(Joi.date(), [ - ['1-1-2013 UTC', true], - ['not a valid date', false], - [new Date('not a valid date'), false] - ], done); - }); - - describe('#iso', function() { - - it('validates isoDate', function (done) { - - Helper.validate(Joi.date().iso(), [ - ['2013-06-07T14:21:46.295Z', true], - ['2013-06-07T14:21:46.295Z0', false], - ['2013-06-07T14:21:46.295+07:00', true], - ['2013-06-07T14:21:46.295+07:000', false], - ['2013-06-07T14:21:46.295-07:00', true], - ['2013-06-07T14:21:46Z', true], - ['2013-06-07T14:21:46Z0', false], - ['2013-06-07T14:21:46+07:00', true], - ['2013-06-07T14:21:46-07:00', true], - ['2013-06-07T14:21Z', true], - ['2013-06-07T14:21+07:00', true], - ['2013-06-07T14:21+07:000', false], - ['2013-06-07T14:21-07:00', true], - ['2013-06-07T14:21Z+7:00', false], - ['2013-06-07', true], - ['2013-06-07T', false], - ['2013-06-07T14:21', false], - ['1-1-2013', false] - ], done); - }); - - it('validates isoDate with a friendly error message', function (done) { - - var schema = { item: Joi.date().iso() }; - Joi.compile(schema).validate({ item: 'something' }, function (err, value) { - - expect(err.message).to.contain('must be a valid ISO 8601 date'); - done(); - }); - }); - - it('validates isoDate after clone', function (done) { - - var schema = { item: Joi.date().iso().clone() }; - Joi.compile(schema).validate({ item: '2013-06-07T14:21:46.295Z' }, function (err, value) { - - expect(err).to.not.exist(); - done(); - }); - }); - }); - - describe('#format', function () { - - it('validates custom format', function (done) { - - Helper.validate(Joi.date().format('DD#YYYY$MM'), [ - ['07#2013$06', true], - ['2013-06-07', false] - ], done); - }); - - it('validates several custom formats', function (done) { - - Helper.validate(Joi.date().format(['DD#YYYY$MM', 'YY|DD|MM']), [ - ['13|07|06', true], - ['2013-06-07', false] - ], done); - }); - - it('fails with bad formats', function (done) { - - expect(function () { - - Joi.date().format(true); - }).to.throw('Invalid format.'); - - expect(function () { - - Joi.date().format(['YYYYMMDD', true]); - }).to.throw('Invalid format.'); - done(); - }); - }); - }); -}); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/test/errors.js b/node_modules/hapi/node_modules/vision/node_modules/joi/test/errors.js deleted file mode 100755 index 3b343ed..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/test/errors.js +++ /dev/null @@ -1,270 +0,0 @@ -// Load modules - -var Lab = require('lab'); -var Code = require('code'); -var Joi = require('../lib'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var before = lab.before; -var after = lab.after; -var describe = lab.describe; -var it = lab.it; -var expect = Code.expect; - - -describe('errors', function () { - - it('supports custom errors when validating types', function (done) { - - var schema = Joi.object({ - email: Joi.string().email(), - date: Joi.date(), - alphanum: Joi.string().alphanum(), - min: Joi.string().min(3), - max: Joi.string().max(3), - required: Joi.string().required(), - xor: Joi.string(), - renamed: Joi.string().valid('456'), - notEmpty: Joi.string().required() - }).rename('renamed', 'required').without('required', 'xor').without('xor', 'required'); - - var input = { - email: 'invalid-email', - date: 'invalid-date', - alphanum: '\b\n\f\r\t', - min: 'ab', - max: 'abcd', - required: 'hello', - xor: '123', - renamed: '456', - notEmpty: '' - }; - - var lang = { - any: { - empty: '3' - }, - date: { - base: '18' - }, - string: { - base: '13', - min: '14', - max: '15', - alphanum: '16', - email: '19' - }, - object: { - without: '7', - rename: { - override: '11' - } - } - }; - - Joi.validate(input, schema, { abortEarly: false, language: lang }, function (err, value) { - - expect(err).to.exist(); - expect(err.name).to.equal('ValidationError'); - expect(err.message).to.equal('value 11. required 7. xor 7. email 19. date 18. alphanum 16. min 14. max 15. notEmpty 3'); - done(); - }); - }); - - it('does not prefix with key when language uses context.key', function (done) { - - Joi.valid('sad').options({ language: { any: { allowOnly: 'my hero {{key}} is not {{valids}}' } } }).validate(5, function (err, value) { - - expect(err.message).to.equal('my hero value is not sad'); - done(); - }); - }); - - it('escapes unsafe keys', function (done) { - - var schema = { - 'a()': Joi.number() - }; - - Joi.validate({ 'a()': 'x' }, schema, function (err, value) { - - expect(err.message).to.equal('a() must be a number'); - - Joi.validate({ 'b()': 'x' }, schema, function (err, value) { - - expect(err.message).to.equal('b() is not allowed'); - done(); - }); - }); - }); - - it('returns error type in validation error', function (done) { - - var input = { - notNumber: '', - notString: true, - notBoolean: 9 - }; - - var schema = { - notNumber: Joi.number().required(), - notString: Joi.string().required(), - notBoolean: Joi.boolean().required() - } - - Joi.validate(input, schema, { abortEarly: false }, function (err, value) { - - expect(err).to.exist(); - expect(err.details).to.have.length(3); - expect(err.details[0].type).to.equal('number.base'); - expect(err.details[1].type).to.equal('string.base'); - expect(err.details[2].type).to.equal('boolean.base'); - done(); - }); - }); - - it('returns a full path to an error value on an array (includes)', function (done) { - - var schema = Joi.array().includes(Joi.array().includes({ x: Joi.number() })); - var input = [ - [{ x: 1 }], - [{ x: 1 }, { x: 'a' }] - ]; - - schema.validate(input, function (err, value) { - - expect(err).to.exist(); - expect(err.details[0].path).to.equal('1.1.x'); - done(); - }); - }); - - it('returns a full path to an error value on an array (excludes)', function (done) { - - var schema = Joi.array().includes(Joi.array().excludes({ x: Joi.string() })); - var input = [ - [{ x: 1 }], - [{ x: 1 }, { x: 'a' }] - ]; - - schema.validate(input, function (err, value) { - - expect(err).to.exist(); - expect(err.details[0].path).to.equal('1.1'); - done(); - }); - }); - - it('returns a full path to an error value on an object', function (done) { - - var schema = { - x: Joi.array().includes({ x: Joi.number() }) - }; - - var input = { - x: [{ x: 1 }, { x: 'a' }] - }; - - Joi.validate(input, schema, function (err, value) { - - expect(err).to.exist(); - expect(err.details[0].path).to.equal('x.1.x'); - done(); - }); - }); - - it('overrides root key language', function (done) { - - Joi.string().options({ language: { root: 'blah' } }).validate(4, function (err, value) { - - expect(err.message).to.equal('blah must be a string'); - done(); - }); - }); - - it('overrides label key language', function (done) { - - Joi.string().options({ language: { root: 'blah', label: 'bleh' } }).validate(4, function (err, value) { - - expect(err.message).to.equal('bleh must be a string'); - done(); - }); - }); - - it('provides context with the error', function (done) { - - Joi.object({ length: Joi.number().min(3).required() }).validate({ length: 1 }, function (err) { - - expect(err.details).to.deep.equal([{ - message: 'length must be larger than or equal to 3', - path: 'length', - type: 'number.min', - context: { - limit: 3, - key: 'length' - } - }]); - done(); - }); - }); - - describe('#annotate', function () { - - it('annotates error', function (done) { - - var object = { - a: 'm', - y: { - b: { - c: 10 - } - } - }; - - var schema = { - a: Joi.string().valid('a', 'b', 'c', 'd'), - y: Joi.object({ - u: Joi.string().valid(['e', 'f', 'g', 'h']).required(), - b: Joi.string().valid('i', 'j').allow(false), - d: Joi.object({ - x: Joi.string().valid('k', 'l').required(), - c: Joi.number() - }) - }) - }; - - Joi.validate(object, schema, { abortEarly: false }, function (err, value) { - - expect(err).to.exist(); - expect(err.annotate()).to.equal('{\n \"y\": {\n \"b\" \u001b[31m[1]\u001b[0m: {\n \"c\": 10\n },\n \u001b[41m\"u\"\u001b[0m\u001b[31m [2]: -- missing --\u001b[0m\n },\n \"a\" \u001b[31m[3]\u001b[0m: \"m\"\n}\n\u001b[31m\n[1] a must be one of a, b, c, d\n[2] u is required\n[3] b must be a string\u001b[0m'); - done(); - }); - }); - - it('displays alternatives fail as a single line', function (done) { - - var schema = { - x: [ - Joi.string(), - Joi.number(), - Joi.date() - ] - }; - - Joi.validate({ x: true }, schema, function (err, value) { - - expect(err).to.exist(); - expect(err.annotate()).to.equal('{\n \"x\" \u001b[31m[1, 2, 3]\u001b[0m: true\n}\n\u001b[31m\n[1] x must be a string\n[2] x must be a number\n[3] x must be a number of milliseconds or valid date string\u001b[0m'); - done(); - }); - }); - }); -}); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/test/function.js b/node_modules/hapi/node_modules/vision/node_modules/joi/test/function.js deleted file mode 100755 index f98d57d..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/test/function.js +++ /dev/null @@ -1,34 +0,0 @@ -// Load modules - -var Lab = require('lab'); -var Code = require('code'); -var Joi = require('../lib'); -var Helper = require('./helper'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var before = lab.before; -var after = lab.after; -var describe = lab.describe; -var it = lab.it; -var expect = Code.expect; - - -describe('func', function () { - - it('should validate a function', function (done) { - - Helper.validate(Joi.func().required(), [ - [function () { }, true], - ['', false] - ], done); - }); -}); - diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/test/helper.js b/node_modules/hapi/node_modules/vision/node_modules/joi/test/helper.js deleted file mode 100755 index 50c12ba..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/test/helper.js +++ /dev/null @@ -1,70 +0,0 @@ -// Load modules - -var Lab = require('lab'); -var Code = require('code'); -var Joi = require('../'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var before = lab.before; -var after = lab.after; -var describe = lab.describe; -var it = lab.it; -var expect = Code.expect; - - -exports.validate = function (schema, config, callback) { - - return exports.validateOptions(schema, config, null, callback); -} - - -exports.validateOptions = function (schema, config, options, callback) { - - var compiled = Joi.compile(schema); - for (var i = 0, il = config.length; i < il; ++i) { - - var item = config[i]; - var result = Joi.validate(item[0], compiled, item[2] || options); - - var err = result.error; - var value = result.value; - - if (err !== null && item[1]) { - console.log(err); - } - - if (err === null && !item[1]) { - console.log(item[0]); - } - - expect(err === null).to.equal(item[1]); - - if (item.length >= 4) { - var comparator = item[3]; - if (item[1]) { - expect(value).to.deep.equal(comparator); - } - else { - if (comparator instanceof RegExp) { - expect(err.message).to.match(comparator); - } - else { - expect(err.message).to.deep.equal(comparator); - } - } - } - } - - if (callback) { - callback(); - } -}; - diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/test/index.js b/node_modules/hapi/node_modules/vision/node_modules/joi/test/index.js deleted file mode 100755 index 9a05886..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/test/index.js +++ /dev/null @@ -1,1472 +0,0 @@ -// Load modules - -var Lab = require('lab'); -var Code = require('code'); -var Path = require('path'); -var Joi = require('../lib'); -var Helper = require('./helper'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var before = lab.before; -var after = lab.after; -var describe = lab.describe; -var it = lab.it; -var expect = Code.expect; - - -describe('Joi', function () { - - it('validates object', function (done) { - - var schema = Joi.object({ - a: Joi.number().min(0).max(3), - b: Joi.string().valid('a', 'b', 'c'), - c: Joi.string().email().optional() - }).without('a', 'none'); - - var obj = { - a: 1, - b: 'a', - c: 'joe@example.com' - }; - - schema.validate(obj, function (err, value) { - - expect(err).to.not.exist(); - done(); - }); - }); - - it('keeps schema immutable', function (done) { - - var a = Joi.string(); - var b = a.valid('b'); - - Helper.validate(a, [ - ['a', true], - ['b', true], - [5, false] - ], function () { - - Helper.validate(b, [ - ['a', false], - ['b', true], - [5, false] - ], done); - }); - - }); - - it('validates null', function (done) { - - Joi.string().validate(null, function (err, value) { - - expect(err).to.exist(); - expect(err.annotate()).to.equal('{\n \u001b[41m\"value\"\u001b[0m\u001b[31m [1]: -- missing --\u001b[0m\n}\n\u001b[31m\n[1] value must be a string\u001b[0m'); - done(); - }); - }); - - it('validates null schema', function (done) { - - Helper.validate(null, [ - ['a', false], - [null, true] - ], done); - }); - - it('validates number literal', function (done) { - - Helper.validate(5, [ - [6, false], - [5, true] - ], done); - }); - - it('validates string literal', function (done) { - - Helper.validate('5', [ - ['6', false], - ['5', true] - ], done); - }); - - it('validates boolean literal', function (done) { - - Helper.validate(true, [ - [false, false], - [true, true] - ], done); - }); - - it('validates date literal', function (done) { - - var now = Date.now(); - Helper.validate(new Date(now), [ - [new Date(now), true], - [now, true], - [now * 2, false] - ], done); - }); - - it('validates complex literal', function (done) { - - var schema = ['key', 5, { a: true, b: [/^a/, 'boom'] }]; - Helper.validate(schema, [ - ['key', true], - [5, true], - ['other', false], - [6, false], - [{ c: 5 }, false], - [{}, true], - [{ b: 'abc' }, true], - [{ a: true, b: 'boom' }, true], - [{ a: 5, b: 'a' }, false] - ], done); - }); - - it('validates a compiled complex literal', function (done) { - - var schema = Joi.compile(['key', 5, { a: true, b: [/^a/, 'boom'] }]); - Helper.validate(schema, [ - ['key', true], - [5, true], - ['other', false], - [6, false], - [{ c: 5 }, false], - [{}, true], - [{ b: 'abc' }, true], - [{ a: true, b: 'boom' }, true], - [{ a: 5, b: 'a' }, false] - ], done); - }); - - it('validates regex directly', function (done) { - - Joi.compile(/^5$/).validate('5', function (err, value) { - - expect(err).to.not.exist(); - Joi.compile(/.{2}/).validate('6', function (err, value) { - - expect(err).to.exist(); - done(); - }); - }); - }); - - it('validated with', function (done) { - - var schema = Joi.object({ - txt: Joi.string(), - upc: Joi.string() - }).with('txt', 'upc'); - - Joi.validate({ txt: 'a' }, schema, { abortEarly: false }, function (err, value) { - - expect(err.message).to.equal('txt missing required peer upc'); - - Helper.validate(schema, [ - [{ upc: 'test' }, true], - [{ txt: 'test' }, false], - [{ txt: 'test', upc: null }, false], - [{ txt: 'test', upc: '' }, false], - [{ txt: 'test', upc: undefined }, false], - [{ txt: 'test', upc: 'test' }, true] - ], done); - }); - }); - - it('validated without', function (done) { - - var schema = Joi.object({ - txt: Joi.string(), - upc: Joi.string() - }).without('txt', 'upc'); - - Joi.validate({ txt: 'a', upc: 'b' }, schema, { abortEarly: false }, function (err, value) { - - expect(err.message).to.equal('txt conflict with forbidden peer upc'); - - Helper.validate(schema, [ - [{ upc: 'test' }, true], - [{ txt: 'test' }, true], - [{ txt: 'test', upc: null }, false], - [{ txt: 'test', upc: '' }, false], - [{ txt: 'test', upc: undefined }, true], - [{ txt: 'test', upc: 'test' }, false] - ], done); - }); - }); - - it('validates xor', function (done) { - - var schema = Joi.object({ - txt: Joi.string(), - upc: Joi.string() - }).xor('txt', 'upc'); - - Joi.validate({}, schema, { abortEarly: false }, function (err, value) { - - expect(err.message).to.equal('value must contain at least one of txt, upc'); - - Helper.validate(schema, [ - [{ upc: null }, false], - [{ upc: 'test' }, true], - [{ txt: null }, false], - [{ txt: 'test' }, true], - [{ txt: 'test', upc: null }, false], - [{ txt: 'test', upc: '' }, false], - [{ txt: '', upc: 'test' }, false], - [{ txt: null, upc: 'test' }, false], - [{ txt: undefined, upc: 'test' }, true], - [{ txt: 'test', upc: undefined }, true], - [{ txt: 'test', upc: '' }, false], - [{ txt: 'test', upc: null }, false], - [{ txt: '', upc: undefined }, false], - [{ txt: '', upc: '' }, false], - [{ txt: 'test', upc: 'test' }, false] - ], done); - }); - }); - - it('validates multiple peers xor', function (done) { - - var schema = Joi.object({ - txt: Joi.string(), - upc: Joi.string(), - code: Joi.string() - }).xor('txt', 'upc', 'code'); - - Helper.validate(schema, [ - [{ upc: 'test' }, true], - [{ txt: 'test' }, true], - [{}, false] - ], done); - }); - - it('validates xor with number types', function (done) { - - var schema = Joi.object({ - code: Joi.number(), - upc: Joi.number() - }).xor('code', 'upc'); - - Helper.validate(schema, [ - [{ upc: 123 }, true], - [{ code: 456 }, true], - [{ code: 456, upc: 123 }, false], - [{}, false] - ], done); - }); - - it('validates xor when empty value of peer allowed', function (done) { - - var schema = Joi.object({ - code: Joi.string(), - upc: Joi.string().allow('') - }).xor('code', 'upc'); - - Helper.validate(schema, [ - [{ upc: '' }, true], - [{ upc: '123' }, true], - [{ code: '456' }, true], - [{ code: '456', upc: '' }, false], - [{}, false] - ], done); - }); - - it('validates or', function (done) { - - var schema = Joi.object({ - txt: Joi.string(), - upc: Joi.string().allow(null, ''), - code: Joi.number() - }).or('txt', 'upc', 'code'); - - Joi.validate({}, schema, { abortEarly: false }, function (err, value) { - - expect(err.message).to.equal('value must contain at least one of txt, upc, code'); - - Helper.validate(schema, [ - [{ upc: null }, true], - [{ upc: 'test' }, true], - [{ txt: null }, false], - [{ txt: 'test' }, true], - [{ code: null }, false], - [{ code: 123 }, true], - [{ txt: 'test', upc: null }, true], - [{ txt: 'test', upc: '' }, true], - [{ txt: '', upc: 'test' }, false], - [{ txt: null, upc: 'test' }, false], - [{ txt: undefined, upc: 'test' }, true], - [{ txt: 'test', upc: undefined }, true], - [{ txt: 'test', upc: '' }, true], - [{ txt: 'test', upc: null }, true], - [{ txt: '', upc: undefined }, false], - [{ txt: '', upc: undefined, code: 999 }, false], - [{ txt: '', upc: undefined, code: undefined }, false], - [{ txt: '', upc: '' }, false], - [{ txt: 'test', upc: 'test' }, true], - [{ txt: 'test', upc: 'test', code: 322 }, true] - ], done); - }); - }); - - it('validates and', function (done) { - - var schema = Joi.object({ - txt: Joi.string(), - upc: Joi.string().allow(null, ''), - code: Joi.number() - }).and('txt', 'upc', 'code'); - - Joi.validate({ txt: 'x' }, schema, { abortEarly: false }, function (err, value) { - - expect(err.message).to.equal('value contains txt without its required peers upc, code'); - - Helper.validate(schema, [ - [{}, true], - [{ upc: null }, false], - [{ upc: 'test' }, false], - [{ txt: null }, false], - [{ txt: 'test' }, false], - [{ code: null }, false], - [{ code: 123 }, false], - [{ txt: 'test', upc: null }, false], - [{ txt: 'test', upc: '' }, false], - [{ txt: '', upc: 'test' }, false], - [{ txt: null, upc: 'test' }, false], - [{ txt: undefined, upc: 'test' }, false], - [{ txt: 'test', upc: undefined }, false], - [{ txt: 'test', upc: '' }, false], - [{ txt: 'test', upc: null }, false], - [{ txt: '', upc: undefined }, false], - [{ txt: '', upc: undefined, code: 999 }, false], - [{ txt: '', upc: undefined, code: undefined }, false], - [{ txt: '', upc: '' }, false], - [{ txt: 'test', upc: 'test' }, false], - [{ txt: 'test', upc: 'test', code: 322 }, true], - [{ txt: 'test', upc: null, code: 322 }, true] - ], done); - }); - }); - - it('validates nand()', function (done) { - - var schema = Joi.object({ - txt: Joi.string(), - upc: Joi.string().allow(null, ''), - code: Joi.number() - }).nand('txt', 'upc', 'code'); - - Joi.validate({ txt: 'x', upc: 'y', code: 123 }, schema, { abortEarly: false }, function (err, value) { - - expect(err.message).to.equal('value txt must not exist simultaneously with upc, code'); - - Helper.validate(schema, [ - [{}, true], - [{ upc: null }, true], - [{ upc: 'test' }, true], - [{ txt: 'test' }, true], - [{ code: 123 }, true], - [{ txt: 'test', upc: null }, true], - [{ txt: 'test', upc: '' }, true], - [{ txt: undefined, upc: 'test' }, true], - [{ txt: 'test', upc: undefined }, true], - [{ txt: 'test', upc: '' }, true], - [{ txt: 'test', upc: null }, true], - [{ txt: 'test', upc: undefined, code: 999 }, true], - [{ txt: 'test', upc: 'test' }, true], - [{ txt: 'test', upc: 'test', code: 322 }, false], - [{ txt: 'test', upc: null, code: 322 }, false] - ], done); - }); - }); - - it('validates an array of valid types', function (done) { - - var schema = Joi.object({ - auth: [ - Joi.object({ - mode: Joi.string().valid('required', 'optional', 'try').allow(null) - }).allow(null), - Joi.string(), - Joi.boolean() - ] - }); - - schema.validate({ auth: { mode: 'none' } }, function (err, value) { - - expect(err).to.exist(); - expect(err.message).to.equal('mode must be one of required, optional, try, null. auth must be a string. auth must be a boolean'); - - Helper.validate(schema, [ - [{ auth: { mode: 'try' } }, true], - [{ something: undefined }, false], - [{ auth: { something: undefined } }, false], - [{ auth: null }, true], - [{ auth: undefined }, true], - [{}, true], - [{ auth: true }, true], - [{ auth: 123 }, false] - ], done); - }); - }); - - it('validates alternatives', function (done) { - - var schema = Joi.object({ - auth: Joi.alternatives( - Joi.object({ - mode: Joi.string().valid('required', 'optional', 'try').allow(null) - }).allow(null), - Joi.string(), - Joi.boolean() - ) - }); - - schema.validate({ auth: { mode: 'none' } }, function (err, value) { - - expect(err).to.exist(); - expect(err.message).to.equal('mode must be one of required, optional, try, null. auth must be a string. auth must be a boolean'); - - Helper.validate(schema, [ - [{ auth: { mode: 'try' } }, true], - [{ something: undefined }, false], - [{ auth: { something: undefined } }, false], - [{ auth: null }, true], - [{ auth: undefined }, true], - [{}, true], - [{ auth: true }, true], - [{ auth: 123 }, false] - ], done); - }); - }); - - it('validates required alternatives', function (done) { - - var schema = { - a: Joi.alternatives( - Joi.string().required(), - Joi.boolean().required() - ) - }; - - Helper.validate(schema, [ - [{ a: null }, false], - [{ a: undefined }, true], - [{}, true], - [{ a: true }, true], - [{ a: 'true' }, true], - [{ a: 123 }, false], - [{ a: { c: 1 } }, false], - [{ b: undefined }, false] - ], done); - }); - - it('validates required [] alternatives', function (done) { - - var schema = { - a: [ - Joi.string().required(), - Joi.boolean().required() - ] - }; - - Helper.validate(schema, [ - [{ a: null }, false], - [{ a: undefined }, true], - [{}, true], - [{ a: true }, true], - [{ a: 'true' }, true], - [{ a: 123 }, false], - [{ a: { c: 1 } }, false], - [{ b: undefined }, false] - ], done); - }); - - it('validates an array of string with valid', function (done) { - - var schema = { - brand: Joi.array().includes(Joi.string().valid('amex', 'visa')) - }; - - Helper.validate(schema, [ - [{ brand: ['amex'] }, true], - [{ brand: ['visa', 'mc'] }, false] - ], done); - }); - - it('validates pre and post convert value', function (done) { - - var schema = Joi.number().valid(5); - - Helper.validate(schema, [ - [5, true], - ['5', true] - ], done); - }); - - it('does not change object when validation fails', function (done) { - - var schema = Joi.object({ - a: Joi.number().valid(2) - }); - - var obj = { - a: '5' - }; - - schema.validate(obj, function (err, value) { - - expect(err).to.exist(); - expect(value.a).to.equal('5'); - done(); - }); - }); - - it('does not set optional keys when missing', function (done) { - - var schema = Joi.object({ - a: Joi.number() - }); - - var obj = {}; - - schema.validate(obj, function (err, value) { - - expect(err).to.not.exist(); - expect(value.hasOwnProperty('a')).to.equal(false); - done(); - }); - }); - - it('invalidates pre and post convert value', function (done) { - - var schema = Joi.number().invalid(5); - - Helper.validate(schema, [ - [5, false], - ['5', false] - ], done); - }); - - it('invalidates missing peers', function (done) { - - var schema = Joi.object({ - username: Joi.string(), - password: Joi.string() - }).with('username', 'password').without('password', 'access_token'); - - schema.validate({ username: 'bob' }, function (err, value) { - - expect(err).to.exist(); - done(); - }); - }); - - it('validates config where the root item is a joi type', function (done) { - - Joi.boolean().allow(null).validate(true, function (err, value) { - - expect(err).to.be.null(); - Joi.object().validate({ auth: { mode: 'try' } }, function (err, value) { - - expect(err).to.be.null(); - - Joi.object().validate(true, function (err, value) { - - expect(err.message).to.contain('value must be an object'); - - Joi.string().validate(true, function (err, value) { - - expect(err.message).to.contain('value must be a string'); - - Joi.string().email().validate('test@test.com', function (err, value) { - - expect(err).to.be.null(); - Joi.object({ param: Joi.string().required() }).validate({ param: 'item' }, function (err, value) { - - expect(err).to.be.null(); - done(); - }); - }); - }); - }); - }); - }); - }); - - it('converts string to number', function (done) { - - var schema = Joi.object({ - a: Joi.number() - }); - - var input = { a: '5' }; - schema.validate(input, function (err, value) { - - expect(err).to.be.null(); - expect(value.a).to.equal(5); - expect(input.a).to.equal('5'); - done(); - }); - }); - - it('allows unknown keys in objects if no schema was given', function (done) { - - Joi.object().validate({ foo: 'bar' }, function (err, value) { - - expect(err).to.not.exist(); - done(); - }); - }); - - it('fails on unknown keys in objects if a schema was given', function (done) { - - Joi.object({}).validate({ foo: 'bar' }, function (err, value) { - - expect(err).to.exist(); - expect(err.message).to.equal('foo is not allowed'); - - Joi.compile({}).validate({ foo: 'bar' }, function (err, value) { - - expect(err).to.exist(); - expect(err.message).to.equal('foo is not allowed'); - - Joi.compile({ other: Joi.number() }).validate({ foo: 'bar' }, function (err, value) { - - expect(err).to.exist(); - expect(err.message).to.equal('foo is not allowed'); - - done(); - }); - }); - }); - }); - - it('validates an unknown option', function (done) { - - var config = { - auth: Joi.object({ - mode: Joi.string().valid('required', 'optional', 'try').allow(null) - }).allow(null) - }; - - Joi.compile(config).validate({ auth: { unknown: true } }, function (err, value) { - - expect(err).to.not.be.null(); - expect(err.message).to.contain('unknown is not allowed'); - - Joi.compile(config).validate({ something: false }, function (err, value) { - - expect(err).to.not.be.null(); - expect(err.message).to.contain('something is not allowed'); - - done(); - }); - }); - }); - - it('validates required key with multiple options', function (done) { - - var config = { - module: Joi.alternatives([ - Joi.object({ - compile: Joi.func().required(), - execute: Joi.func() - }), - Joi.string() - ]).required() - }; - - Joi.compile(config).validate({}, function (err, value) { - - expect(err).to.exist(); - expect(err.message).to.contain('module is required'); - - Joi.compile(config).validate({ module: 'test' }, function (err, value) { - - expect(err).to.be.null(); - - Joi.compile(config).validate({ module: {} }, function (err, value) { - - expect(err).to.not.be.null(); - expect(err.message).to.contain('compile is required'); - expect(err.message).to.contain('module must be a string'); - - Joi.compile(config).validate({ module: { compile: function () { } } }, function (err, value) { - - expect(err).to.be.null(); - done(); - }); - }); - }); - }); - }); - - it('validates key with required alternatives', function (done) { - - var config = { - module: Joi.alt().try( - Joi.object({ - compile: Joi.func().required(), - execute: Joi.func() - }).required(), - Joi.string().required() - ) - }; - - Joi.compile(config).validate({}, function (err, value) { - - expect(err).to.not.exist(); - done(); - }); - }); - - it('validates required key with alternatives', function (done) { - - var config = { - module: Joi.alt().try( - Joi.object({ - compile: Joi.func().required(), - execute: Joi.func() - }), - Joi.string() - ).required() - }; - - Joi.compile(config).validate({}, function (err, value) { - - expect(err).to.exist(); - expect(err.message).to.contain('module is required'); - done(); - }); - }); - - it('does not require optional numbers', function (done) { - - var config = { - position: Joi.number(), - suggestion: Joi.string() - }; - - Joi.compile(config).validate({ suggestion: 'something' }, function (err, value) { - - expect(err).to.be.null(); - - Joi.compile(config).validate({ position: 1 }, function (err, value) { - - expect(err).to.be.null(); - done(); - }) - }); - }); - - it('does not require optional objects', function (done) { - - var config = { - position: Joi.number(), - suggestion: Joi.object() - }; - - Joi.compile(config).validate({ suggestion: {} }, function (err, value) { - - expect(err).to.be.null(); - - Joi.compile(config).validate({ position: 1 }, function (err, value) { - - expect(err).to.be.null(); - done(); - }); - }); - }); - - it('validates object successfully when config has an array of types', function (done) { - - var schema = { - f: [Joi.number(), Joi.boolean()], - g: [Joi.string(), Joi.object()] - }; - - var obj = { - f: true, - g: 'test' - }; - - Joi.compile(schema).validate(obj, function (err, value) { - - expect(err).to.not.exist(); - done(); - }); - }); - - it('validates object successfully when config allows for optional key and key is missing', function (done) { - - var schema = { - h: Joi.number(), - i: Joi.string(), - j: Joi.object() - }; - - var obj = { - h: 12, - i: 'test' - }; - - Joi.compile(schema).validate(obj, function (err, value) { - - expect(err).to.not.exist(); - done(); - }); - }); - - it('fails validation', function (done) { - - var schema = { - a: Joi.number().min(0).max(3), - b: Joi.string().valid('a', 'b', 'c'), - c: Joi.string().email().optional() - }; - - var obj = { - a: 10, - b: 'a', - c: 'joe@example.com' - }; - - Joi.compile(schema).validate(obj, function (err, value) { - - expect(err).to.exist(); - done(); - }); - }); - - it('fails validation when the wrong types are supplied', function (done) { - - var schema = { - a: Joi.number().min(0).max(3), - b: Joi.string().valid('a', 'b', 'c'), - c: Joi.string().email().optional() - }; - - var obj = { - a: 'a', - b: 'a', - c: 'joe@example.com' - }; - - Joi.compile(schema).validate(obj, function (err, value) { - - expect(err).to.exist(); - done(); - }); - }); - - it('fails validation when missing a required parameter', function (done) { - - var obj = { - c: 10 - }; - - Joi.compile({ a: Joi.string().required() }).validate(obj, function (err, value) { - - expect(err).to.exist(); - done(); - }); - }); - - it('fails validation when missing a required parameter within an object config', function (done) { - - var obj = { - a: {} - }; - - Joi.compile({ a: Joi.object({ b: Joi.string().required() }) }).validate(obj, function (err, value) { - - expect(err).to.exist(); - done(); - }); - }); - - it('fails validation when parameter is required to be an object but is given as string', function (done) { - - var obj = { - a: 'a string' - }; - - Joi.compile({ a: Joi.object({ b: Joi.string().required() }) }).validate(obj, function (err, value) { - - expect(err).to.exist(); - done(); - }); - }); - - it('validates when parameter is required to be an object and is given correctly as a json string', function (done) { - - var schema = { - a: Joi.object({ - b: Joi.string().required() - }) - }; - - var input = { - a: '{"b":"string"}' - }; - - Joi.validate(input, schema, function (err, value) { - - expect(err).to.not.exist(); - expect(input.a).to.equal('{"b":"string"}'); - expect(value.a.b).to.equal('string'); - done(); - }); - }); - - it('fails validation when parameter is required to be an object but is given as a json string that is incorrect (number instead of string)', function (done) { - - var obj = { - a: '{"b":2}' - }; - - Joi.object({ a: Joi.object({ b: Joi.string().required() }) }).validate(obj, function (err, value) { - - expect(err).to.exist(); - done(); - }); - }); - - it('fails validation when parameter is required to be an Array but is given as string', function (done) { - - var obj = { - a: "an array" - }; - - Joi.object({ a: Joi.array() }).validate(obj, function (err, value) { - - expect(err).to.exist(); - done(); - }); - }); - - it('validates when parameter is required to be an Array and is given correctly as a json string', function (done) { - - var obj = { - a: '[1,2]' - }; - - Joi.object({ a: Joi.array() }).validate(obj, function (err, value) { - - expect(err).to.be.null(); - done(); - }); - }); - - it('fails validation when parameter is required to be an Array but is given as a json that is incorrect (object instead of array)', function (done) { - - var obj = { - a: '{"b":2}' - }; - - Joi.object({ a: Joi.object({ b: Joi.string().required() }) }).validate(obj, function (err, value) { - - expect(err).to.exist(); - done(); - }); - }); - - it('fails validation when config is an array and fails', function (done) { - - var schema = { - d: [Joi.string(), Joi.boolean()], - e: [Joi.number(), Joi.object()] - }; - - var obj = { - d: 10, - e: 'a' - }; - - Joi.compile(schema).validate(obj, function (err, value) { - - expect(err).to.exist(); - done(); - }); - }); - - it('fails validation when config is an array and fails with extra keys', function (done) { - - var schema = { - d: [Joi.string(), Joi.boolean()], - e: [Joi.number(), Joi.object()] - }; - - var obj = { - a: 10, - b: 'a' - }; - - Joi.compile(schema).validate(obj, function (err, value) { - - expect(err).to.exist(); - done(); - }); - }); - - it('fails validation with extra keys', function (done) { - - var schema = { - a: Joi.number(), - }; - - var obj = { - a: 1, - b: 'a', - }; - - Joi.compile(schema).validate(obj, function (err, value) { - - expect(err).to.exist(); - done(); - }); - }); - - it('validates missing optional key with string condition', function (done) { - - var schema = { - key: Joi.string().alphanum(false).min(8) - }; - - Joi.compile(schema).validate({}, function (err, value) { - - expect(err).to.not.exist(); - done(); - }); - }); - - it('validates with extra keys and remove them when stripUnknown is set', function (done) { - - var schema = { - a: Joi.number().min(0).max(3), - b: Joi.string().valid('a', 'b', 'c'), - c: Joi.string().email().optional() - }; - - var obj = { - a: 1, - b: 'a', - d: 'c' - }; - - Joi.validate(obj, schema, { stripUnknown: true, allowUnknown: true }, function (err, value) { - - expect(err).to.be.null(); - expect(value).to.deep.equal({ a: 1, b: 'a' }); - done(); - }); - }); - - it('fails to validate with incorrect property when asked to strip unkown keys without aborting early', function (done) { - - var schema = { - a: Joi.number().min(0).max(3), - b: Joi.string().valid('a', 'b', 'c'), - c: Joi.string().email().optional() - }; - - var obj = { - a: 1, - b: 'f', - d: 'c' - }; - - Joi.validate(obj, schema, { stripUnknown: true, abortEarly: false }, function (err, value) { - - expect(err).to.exist(); - done(); - }); - }); - - it('should pass validation with extra keys when allowUnknown is set', function (done) { - - var schema = { - a: Joi.number().min(0).max(3), - b: Joi.string().valid('a', 'b', 'c'), - c: Joi.string().email().optional() - }; - - var obj = { - a: 1, - b: 'a', - d: 'c' - }; - - Joi.validate(obj, schema, { allowUnknown: true }, function (err, value) { - - expect(err).to.be.null(); - expect(value).to.deep.equal({ a: 1, b: 'a', d: 'c' }); - done(); - }); - }); - - it('should pass validation with extra keys set', function (done) { - - var localConfig = Joi.object({ - a: Joi.number().min(0).max(3), - b: Joi.string().valid('a', 'b', 'c'), - }).options({ allowUnknown: true }); - - var obj = { - a: 1, - b: 'a', - d: 'c' - }; - - localConfig.validate(obj, function (err, value) { - - expect(err).to.be.null(); - expect(value).to.deep.equal({ a: 1, b: 'a', d: 'c' }); - - localConfig.validate(value, function (err, value) { - - expect(err).to.be.null(); - expect(value).to.deep.equal({ a: 1, b: 'a', d: 'c' }); - done(); - }); - }); - }); - - - it('should pass validation with extra keys and remove them when skipExtraKeys is set locally', function (done) { - - var localConfig = Joi.object({ - a: Joi.number().min(0).max(3), - b: Joi.string().valid('a', 'b', 'c') - }).options({ stripUnknown: true, allowUnknown: true }); - - var obj = { - a: 1, - b: 'a', - d: 'c' - }; - - localConfig.validate(obj, function (err, value) { - - expect(err).to.be.null(); - expect(value).to.deep.equal({ a: 1, b: 'a' }); - - localConfig.validate(value, function (err, value) { - - expect(err).to.be.null(); - expect(value).to.deep.equal({ a: 1, b: 'a' }); - done(); - }); - }); - }); - - it('should work when the skipFunctions setting is enabled', function (done) { - - var schema = Joi.object({ username: Joi.string() }).options({ skipFunctions: true }); - var input = { username: 'test', func: function () { } }; - Joi.validate(input, schema, function (err, value) { - - expect(err).to.not.exist(); - done(); - }); - }); - - it('should work when the skipFunctions setting is disabled', function (done) { - - var schema = { username: Joi.string() }; - var input = { username: 'test', func: function () { } }; - - Joi.validate(input, schema, { skipFunctions: false }, function (err, value) { - - expect(err).to.exist(); - expect(err.message).to.contain('func is not allowed'); - done(); - }); - }); - - it('should not convert values when convert is false', function (done) { - - var schema = { - arr: Joi.array().includes(Joi.string()) - }; - - var input = { arr: 'foo' }; - Joi.validate(input, schema, { convert: false }, function (err, value) { - - expect(err).to.exist(); - done(); - }); - }); - - it('full errors when abortEarly is false', function (done) { - - var schema = { - a: Joi.string(), - b: Joi.string() - }; - - var input = { a: 1, b: 2 }; - - Joi.validate(input, schema, function (errOne, value) { - - Joi.validate(input, schema, { abortEarly: false }, function (errFull, value) { - - expect(errOne).to.exist(); - expect(errFull).to.exist(); - expect(errFull.details.length).to.be.greaterThan(errOne.details.length); - done(); - }); - }); - }); - - it('validates using the root any object', function (done) { - - var any = Joi; - any.validate('abc', function (err, value) { - - expect(err).to.not.exist(); - done(); - }); - }); - - it('validates using the root any object (no callback)', function (done) { - - var any = Joi; - var result = any.validate('abc'); - expect(result.error).to.not.exist(); - expect(result.value).to.equal('abc'); - done(); - }); - - it('accepts no options', function (done) { - - Joi.validate('test', Joi.string(), function (err, value) { - - expect(err).to.not.exist(); - done(); - }); - }); - - it('accepts no options (no callback)', function (done) { - - var result = Joi.validate('test', Joi.string()); - expect(result.error).to.not.exist(); - expect(result.value).to.equal('test'); - done(); - }); - - it('accepts options', function (done) { - - Joi.validate('5', Joi.number(), { convert: false }, function (err, value) { - - expect(err).to.exist(); - done(); - }); - }); - - it('accepts options (no callback)', function (done) { - - var result = Joi.validate('5', Joi.number(), { convert: false }); - expect(result.error).to.exist(); - done(); - }); - - it('accepts null options', function (done) { - - Joi.validate('test', Joi.string(), null, function (err, value) { - - expect(err).to.not.exist(); - done(); - }); - }); - - it('accepts undefined options', function (done) { - - Joi.validate('test', Joi.string(), undefined, function (err, value) { - - expect(err).to.not.exist(); - done(); - }); - }); - - describe('#describe', function () { - - var schema = Joi.object({ - sub: { - email: Joi.string().email(), - date: Joi.date(), - child: Joi.object({ - alphanum: Joi.string().alphanum() - }), - }, - min: [Joi.number(), Joi.string().min(3)], - max: Joi.string().max(3), - required: Joi.string().required(), - xor: Joi.string(), - renamed: Joi.string().valid('456'), - notEmpty: Joi.string().required().description('a').notes('b').tags('c') - }).rename('renamed', 'required').without('required', 'xor').without('xor', 'required'); - - var result = { - type: 'object', - children: { - sub: { - type: 'object', - children: { - email: { - type: 'string', - invalids: [''], - rules: [{ name: 'email' }] - }, - date: { - type: 'date' - }, - child: { - type: 'object', - children: { - alphanum: { - type: 'string', - invalids: [''], - rules: [{ name: 'alphanum' }] - } - } - } - } - }, - min: { - type: 'alternatives', - alternatives: [ - { - type: 'number', - invalids: [Infinity, -Infinity] - }, - { - type: 'string', - invalids: [''], - rules: [{ name: 'min', arg: 3 }] - } - ] - }, - max: { - type: 'string', - invalids: [''], - rules: [{ name: 'max', arg: 3 }] - }, - required: { - type: 'string', - flags: { - presence: 'required' - }, - invalids: [ ''] - }, - xor: { - type: 'string', - invalids: [''] - }, - renamed: { - type: 'string', - flags: { - allowOnly: true - }, - valids: ['456'], - invalids: [''] - }, - notEmpty: { - type: 'string', - flags: { - presence: 'required' - }, - description: 'a', - notes: ['b'], - tags: ['c'], - invalids: [''] - } - }, - dependencies: [ - { - type: 'without', - key: 'required', - peers: ['xor'] - }, - { - type: 'without', - key: 'xor', - peers: ['required'] - } - ] - }; - - it('describes schema (direct)', function (done) { - - var description = schema.describe(); - expect(description).to.deep.equal(result); - done(); - }); - - it('describes schema (root)', function (done) { - - var description = Joi.describe(schema); - expect(description).to.deep.equal(result); - done(); - }); - - it('describes schema (any)', function (done) { - - var any = Joi; - var description = any.describe(); - expect(description).to.deep.equal({ - type: 'any' - }); - done(); - }); - - it('describes schema without invalids', function (done) { - - var description = Joi.allow(null).describe(); - expect(description.invalids).to.not.exist(); - done(); - }) - }); - - describe('#assert', function () { - - it('throws on invalid value', function (done) { - - expect(function () { - - Joi.assert('x', Joi.number()); - }).to.throw('"x"\n\u001b[31m\n[1] value must be a number\u001b[0m'); - done(); - }); - - it('does not throw on valid value', function (done) { - - expect(function () { - - Joi.assert('4', Joi.number()); - }).to.not.throw(); - done(); - }); - - it('throws on invalid value with message', function (done) { - - expect(function () { - - Joi.assert('x', Joi.number(), 'the reason is'); - }).to.throw('the reason is "x"\n\u001b[31m\n[1] value must be a number\u001b[0m'); - done(); - }); - }); -}); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/test/number.js b/node_modules/hapi/node_modules/vision/node_modules/joi/test/number.js deleted file mode 100755 index 84d05b1..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/test/number.js +++ /dev/null @@ -1,589 +0,0 @@ -// Load modules - -var Lab = require('lab'); -var Code = require('code'); -var Joi = require('../lib'); -var Helper = require('./helper'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var before = lab.before; -var after = lab.after; -var describe = lab.describe; -var it = lab.it; -var expect = Code.expect; - - -describe('number', function () { - - it('fails on boolean', function (done) { - - var schema = Joi.number(); - Helper.validate(schema, [ - [true, false], - [false, false] - ], done); - }); - - describe('#validate', function () { - - it('should, by default, allow undefined', function (done) { - - Helper.validate(Joi.number(), [ - [undefined, true] - ], done); - }); - - it('should, when .required(), deny undefined', function (done) { - - Helper.validate(Joi.number().required(), [ - [undefined, false] - ], done); - }); - - it('should return false for denied value', function (done) { - - var text = Joi.number().invalid(50); - text.validate(50, function (err, value) { - - expect(err).to.exist(); - done(); - }); - }); - - it('should validate integer', function (done) { - - var t = Joi.number().integer(); - Helper.validate(t, [ - [100, true], - [0, true], - [null, false], - [1.02, false], - [0.01, false] - ], done); - }); - - it('should return false for Infinity', function(done) { - - var t = Joi.number(); - Helper.validate(t, [ - [Infinity, false], - [-Infinity, false] - ], done); - }); - - it('should return true for allowed Infinity', function(done) { - - var t = Joi.number().allow(Infinity, -Infinity); - Helper.validate(t, [ - [Infinity, true], - [-Infinity, true] - ], done); - }); - - it('can accept string numbers', function (done) { - - var t = Joi.number(); - Helper.validate(t, [ - ['1', true], - ['100', true], - ['1e3', true], - ['1 some text', false], - ['\t\r', false], - [' ', false], - [' 2', true], - ['\t\r43', true], - ['43 ', true], - ['', false] - ], done); - }); - - it('required validates correctly', function (done) { - - var t = Joi.number().required(); - Helper.validate(t, [ - [NaN, false], - ['100', true] - ], done); - }); - - it('converts an object string to a number', function (done) { - - var config = { a: Joi.number() }; - var obj = { a: '123' }; - - Joi.compile(config).validate(obj, function (err, value) { - - expect(err).to.not.exist(); - expect(value.a).to.equal(123); - done(); - }); - }); - - it('converts a string to a number', function (done) { - - Joi.number().validate('1', function (err, value) { - - expect(err).to.not.exist(); - expect(value).to.equal(1); - done(); - }); - }); - - it('errors on null', function (done) { - - Joi.number().validate(null, function (err, value) { - - expect(err).to.exist(); - expect(value).to.equal(null); - done(); - }); - }); - - it('should handle combination of min and max', function (done) { - - var rule = Joi.number().min(8).max(10); - Helper.validate(rule, [ - [1, false], - [11, false], - [8, true], - [9, true], - [null, false] - ], done); - }); - - it('should handle combination of min, max, and null allowed', function (done) { - - var rule = Joi.number().min(8).max(10).allow(null); - Helper.validate(rule, [ - [1, false], - [11, false], - [8, true], - [9, true], - [null, true] - ], done); - }); - - it('should handle combination of min and positive', function (done) { - - var rule = Joi.number().min(-3).positive(); - Helper.validate(rule, [ - [1, true], - [-2, false], - [8, true], - [null, false] - ], done); - }); - - it('should handle combination of max and positive', function (done) { - - var rule = Joi.number().max(5).positive(); - Helper.validate(rule, [ - [4, true], - [-2, false], - [8, false], - [null, false] - ], done); - }); - - it('should handle combination of min and negative', function (done) { - - var rule = Joi.number().min(-3).negative(); - Helper.validate(rule, [ - [4, false], - [-2, true], - [-4, false], - [null, false] - ], done); - }); - - it('should handle combination of negative and positive', function (done) { - - var rule = Joi.number().negative().positive(); - Helper.validate(rule, [ - [4, false], - [-2, false], - [0, false], - [null, false] - ], done); - }); - - it('should handle combination of negative and allow', function (done) { - - var rule = Joi.number().negative().allow(1); - Helper.validate(rule, [ - [1, true], - [-10, true], - [8, false], - [0, false], - [null, false] - ], done); - }); - - it('should handle combination of positive and allow', function (done) { - - var rule = Joi.number().positive().allow(-1); - Helper.validate(rule, [ - [1, true], - [-1, true], - [8, true], - [-10, false], - [null, false] - ], done); - }); - - it('should handle combination of positive, allow, and null allowed', function (done) { - - var rule = Joi.number().positive().allow(-1).allow(null); - Helper.validate(rule, [ - [1, true], - [-1, true], - [8, true], - [-10, false], - [null, true] - ], done); - }); - - it('should handle combination of negative, allow, and null allowed', function (done) { - - var rule = Joi.number().negative().allow(1).allow(null); - Helper.validate(rule, [ - [1, true], - [-10, true], - [8, false], - [0, false], - [null, true] - ], done); - }); - - it('should handle combination of positive, allow, null allowed, and invalid', function (done) { - - var rule = Joi.number().positive().allow(-1).allow(null).invalid(1); - Helper.validate(rule, [ - [1, false], - [-1, true], - [8, true], - [-10, false], - [null, true] - ], done); - }); - - it('should handle combination of negative, allow, null allowed, and invalid', function (done) { - - var rule = Joi.number().negative().allow(1).allow(null).invalid(-5); - Helper.validate(rule, [ - [1, true], - [-10, true], - [-5, false], - [8, false], - [0, false], - [null, true] - ], done); - }); - - it('should handle combination of min, max, and allow', function (done) { - - var rule = Joi.number().min(8).max(10).allow(1); - Helper.validate(rule, [ - [1, true], - [11, false], - [8, true], - [9, true], - [null, false] - ], done); - }); - - it('should handle combination of min, max, allow, and null allowed', function (done) { - - var rule = Joi.number().min(8).max(10).allow(1).allow(null); - Helper.validate(rule, [ - [1, true], - [11, false], - [8, true], - [9, true], - [null, true] - ], done); - }); - - it('should handle combination of min, max, allow, and invalid', function (done) { - - var rule = Joi.number().min(8).max(10).allow(1).invalid(9); - Helper.validate(rule, [ - [1, true], - [11, false], - [8, true], - [9, false], - [null, false] - ], done); - }); - - it('should handle combination of min, max, allow, invalid, and null allowed', function (done) { - - var rule = Joi.number().min(8).max(10).allow(1).invalid(9).allow(null); - Helper.validate(rule, [ - [1, true], - [11, false], - [8, true], - [9, false], - [null, true] - ], done); - }); - - it('should handle combination of min, max, and integer', function (done) { - - var rule = Joi.number().min(8).max(10).integer(); - Helper.validate(rule, [ - [1, false], - [11, false], - [8, true], - [9, true], - [9.1, false], - [null, false] - ], done); - }); - - it('should handle combination of min, max, integer, and allow', function (done) { - - var rule = Joi.number().min(8).max(10).integer().allow(9.1); - Helper.validate(rule, [ - [1, false], - [11, false], - [8, true], - [9, true], - [9.1, true], - [9.2, false], - [null, false] - ], done); - }); - - it('should handle combination of min, max, integer, allow, and invalid', function (done) { - - var rule = Joi.number().min(8).max(10).integer().allow(9.1).invalid(8); - Helper.validate(rule, [ - [1, false], - [11, false], - [8, false], - [9, true], - [9.1, true], - [9.2, false], - [null, false] - ], done); - }); - - it('should handle combination of min, max, integer, allow, invalid, and null allowed', function (done) { - - var rule = Joi.number().min(8).max(10).integer().allow(9.1).invalid(8).allow(null); - Helper.validate(rule, [ - [1, false], - [11, false], - [8, false], - [9, true], - [9.1, true], - [9.2, false], - [null, true] - ], done); - }); - - it('should handle limiting the number of decimal places', function (done) { - - var rule = Joi.number().precision(1).options({ convert: false }); - Helper.validate(rule, [ - [1, true], - [9.1, true], - [9.21, false], - [9.9999, false], - [9.999e99, true], - [9.9e-99, false], - [9.9e3, true], - [null, false] - ], done); - }); - - it('should handle combination of min, max, integer, allow, invalid, null allowed and precision', function (done) { - - var rule = Joi.number().min(8).max(10).integer().allow(9.1).invalid(8).allow(null).precision(1).options({ convert: false }); - Helper.validate(rule, [ - [1, false], - [11, false], - [8, false], - [9, true], - [9.1, true], - [9.11, false], - [9.2, false], - [9.22, false], - [null, true] - ], done); - }); - - it('should handle combination of greater and less', function (done) { - - var rule = Joi.number().greater(5).less(10); - Helper.validate(rule, [ - [0, false], - [11, false], - [5, false], - [10, false], - [8, true], - [5.01, true], - [9.99, true], - [null, false] - ], done); - }); - - it('should handle combination of greater, less, and integer', function (done) { - - var rule = Joi.number().integer().greater(5).less(10); - Helper.validate(rule, [ - [0, false], - [11, false], - [5, false], - [10, false], - [6, true], - [9, true], - [5.01, false], - [9.99, false] - ], done); - }); - - it('should handle combination of greater, less, and null allowed', function (done) { - - var rule = Joi.number().greater(5).less(10).allow(null); - Helper.validate(rule, [ - [0, false], - [11, false], - [5, false], - [10, false], - [8, true], - [5.01, true], - [9.99, true], - [null, true] - ], done); - }); - - it('should handle combination of greater, less, invalid, and allow', function (done) { - - var rule = Joi.number().greater(5).less(10).invalid(6).allow(-3); - Helper.validate(rule, [ - [0, false], - [11, false], - [5, false], - [10, false], - [6, false], - [8, true], - [5.01, true], - [9.99, true], - [-3, true], - [null, false] - ], done); - }); - }); - - it('should instantiate separate copies on invocation', function (done) { - - var result1 = Joi.number().min(5); - var result2 = Joi.number().max(5); - - expect(Object.keys(result1)).to.not.equal(Object.keys(result2)); - done(); - }); - - it('should show resulting object with #valueOf', function (done) { - - var result = Joi.number().min(5); - expect(result.valueOf()).to.exist(); - done(); - }); - - describe('error message', function () { - - it('should display correctly for int type', function (done) { - - var t = Joi.number().integer(); - Joi.compile(t).validate('1.1', function (err, value) { - - expect(err.message).to.contain('integer'); - done(); - }); - }); - }); - - describe('#min', function () { - - it('throws when limit is not a number', function (done) { - - expect(function () { - - Joi.number().min('a'); - }).to.throw('limit must be an integer'); - done(); - }); - - it('supports 64bit numbers', function (done) { - - var schema = Joi.number().min(1394035612500); - var input = 1394035612552 - - schema.validate(input, function (err, value) { - - expect(err).to.not.exist(); - expect(value).to.equal(input); - done(); - }); - }); - }); - - describe('#max', function () { - - it('throws when limit is not a number', function (done) { - - expect(function () { - - Joi.number().max('a'); - }).to.throw('limit must be an integer'); - done(); - }); - }); - - describe('#precision', function (done) { - - it('converts numbers', function (done) { - - var rule = Joi.number().precision(4); - Helper.validate(rule, [ - [1.5, true, null, 1.5], - [0.12345, true, null, 0.1235], - [123456, true, null, 123456], - [123456.123456, true, null, 123456.1235], - ["123456.123456", true, null, 123456.1235], - ["abc", false], - [NaN, false] - ], done); - }); - }); - - describe('#describe', function () { - - it('should describe a minimum of 0', function (done) { - - var schema = Joi.number().min(0); - expect(schema.describe()).to.deep.equal({ - "type": "number", - "invalids": [Infinity, -Infinity], - "rules": [ - { - "name": "min", - "arg": 0 - } - ] - }); - done(); - }); - }); -}); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/test/object.js b/node_modules/hapi/node_modules/vision/node_modules/joi/test/object.js deleted file mode 100755 index 021401b..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/test/object.js +++ /dev/null @@ -1,1058 +0,0 @@ -// Load modules - -var Lab = require('lab'); -var Code = require('code'); -var Joi = require('../lib'); -var Helper = require('./helper'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var before = lab.before; -var after = lab.after; -var describe = lab.describe; -var it = lab.it; -var expect = Code.expect; - - -describe('object', function () { - - it('converts a json string to an object', function (done) { - - Joi.object().validate('{"hi":true}', function (err, value) { - - expect(err).to.not.exist(); - expect(value.hi).to.equal(true); - done(); - }); - }); - - it('errors on non-object string', function (done) { - - Joi.object().validate('a string', function (err, value) { - - expect(err).to.exist(); - expect(value).to.equal('a string'); - done(); - }); - }); - - it('validates an object', function (done) { - - var schema = Joi.object().required(); - Helper.validate(schema, [ - [{}, true], - [{ hi: true }, true], - ['', false] - ], done); - }); - - it('return object reference when no rules specified', function (done) { - - var schema = Joi.object({ - a: Joi.object() - }); - - var item = { x: 5 }; - schema.validate({ a: item }, function (err, value) { - - expect(value.a).to.equal(item); - done(); - }); - }); - - it('retains ignored values', function (done) { - - var schema = Joi.object(); - schema.validate({ a: 5 }, function (err, value) { - - expect(value.a).to.equal(5); - done(); - }); - }); - - it('retains skipped values', function (done) { - - var schema = Joi.object({ b: 5 }).unknown(true); - schema.validate({ b: '5', a: 5 }, function (err, value) { - - expect(value.a).to.equal(5); - expect(value.b).to.equal(5); - done(); - }); - }); - - it('allows any key when schema is undefined', function (done) { - - Joi.object().validate({ a: 4 }, function (err, value) { - - expect(err).to.not.exist(); - - Joi.object(undefined).validate({ a: 4 }, function (err, value) { - - expect(err).to.not.exist(); - done(); - }); - }); - }); - - it('allows any key when schema is null', function (done) { - - Joi.object(null).validate({ a: 4 }, function (err, value) { - - expect(err).to.not.exist(); - done(); - }); - }); - - it('throws on invalid object schema', function (done) { - - expect(function () { - - Joi.object(4); - }).to.throw('Object schema must be a valid object'); - done(); - }); - - it('throws on joi object schema', function (done) { - - expect(function () { - - Joi.object(Joi.object()); - }).to.throw('Object schema cannot be a joi schema'); - done(); - }); - - it('skips conversion when value is undefined', function (done) { - - Joi.object({ a: Joi.object() }).validate(undefined, function (err, value) { - - expect(err).to.not.exist(); - expect(value).to.not.exist(); - done(); - }); - }); - - it('errors on array', function (done) { - - Joi.object().validate([1, 2, 3], function (err, value) { - - expect(err).to.exist(); - done(); - }); - }); - - it('should prevent extra keys from existing by default', function (done) { - - var schema = Joi.object({ item: Joi.string().required() }).required(); - Helper.validate(schema, [ - [{ item: 'something' }, true], - [{ item: 'something', item2: 'something else' }, false], - ['', false] - ], done); - }); - - it('should validate count when min is set', function (done) { - - var schema = Joi.object().min(3); - Helper.validate(schema, [ - [{ item: 'something' }, false], - [{ item: 'something', item2: 'something else' }, false], - [{ item: 'something', item2: 'something else', item3: 'something something else' }, true], - ['', false] - ], done); - }); - - it('should validate count when max is set', function (done) { - - var schema = Joi.object().max(2); - Helper.validate(schema, [ - [{ item: 'something' }, true], - [{ item: 'something', item2: 'something else' }, true], - [{ item: 'something', item2: 'something else', item3: 'something something else' }, false], - ['', false] - ], done); - }); - - it('should validate count when min and max is set', function (done) { - - var schema = Joi.object().max(3).min(2); - Helper.validate(schema, [ - [{ item: 'something' }, false], - [{ item: 'something', item2: 'something else' }, true], - [{ item: 'something', item2: 'something else', item3: 'something something else' }, true], - [{ item: 'something', item2: 'something else', item3: 'something something else', item4: 'item4' }, false], - ['', false] - ], done); - }); - - it('should validate count when length is set', function (done) { - - var schema = Joi.object().length(2); - Helper.validate(schema, [ - [{ item: 'something' }, false], - [{ item: 'something', item2: 'something else' }, true], - [{ item: 'something', item2: 'something else', item3: 'something something else' }, false], - ['', false] - ], done); - }); - - it('should validate constructor when type is set', function (done) { - - var schema = Joi.object().type(RegExp); - Helper.validate(schema, [ - [{ item: 'something' }, false], - ['', false], - [new Date(), false], - [/abcd/, true], - [new RegExp(), true] - ], done); - }); - - it('should traverse an object and validate all properties in the top level', function (done) { - - var schema = Joi.object({ - num: Joi.number() - }); - - Helper.validate(schema, [ - [{ num: 1 }, true], - [{ num: [1, 2, 3] }, false] - ], done); - }); - - it('should traverse an object and child objects and validate all properties', function (done) { - - var schema = Joi.object({ - num: Joi.number(), - obj: Joi.object({ - item: Joi.string() - }) - }); - - Helper.validate(schema, [ - [{ num: 1 }, true], - [{ num: [1, 2, 3] }, false], - [{ num: 1, obj: { item: 'something' } }, true], - [{ num: 1, obj: { item: 123 } }, false] - ], done); - }); - - it('should traverse an object several levels', function (done) { - - var schema = Joi.object({ - obj: Joi.object({ - obj: Joi.object({ - obj: Joi.object({ - item: Joi.boolean() - }) - }) - }) - }); - - Helper.validate(schema, [ - [{ num: 1 }, false], - [{ obj: {} }, true], - [{ obj: { obj: {} } }, true], - [{ obj: { obj: { obj: {} } } }, true], - [{ obj: { obj: { obj: { item: true } } } }, true], - [{ obj: { obj: { obj: { item: 10 } } } }, false] - ], done); - }); - - it('should traverse an object several levels with required levels', function (done) { - - var schema = Joi.object({ - obj: Joi.object({ - obj: Joi.object({ - obj: Joi.object({ - item: Joi.boolean() - }) - }).required() - }) - }); - - Helper.validate(schema, [ - [null, false], - [undefined, true], - [{}, true], - [{ obj: {} }, false], - [{ obj: { obj: {} } }, true], - [{ obj: { obj: { obj: {} } } }, true], - [{ obj: { obj: { obj: { item: true } } } }, true], - [{ obj: { obj: { obj: { item: 10 } } } }, false] - ], done); - }); - - it('should traverse an object several levels with required levels (without Joi.obj())', function (done) { - - var schema = { - obj: { - obj: { - obj: { - item: Joi.boolean().required() - } - } - } - }; - - Helper.validate(schema, [ - [null, false], - [undefined, true], - [{}, true], - [{ obj: {} }, true], - [{ obj: { obj: {} } }, true], - [{ obj: { obj: { obj: {} } } }, false], - [{ obj: { obj: { obj: { item: true } } } }, true], - [{ obj: { obj: { obj: { item: 10 } } } }, false] - ], done); - }); - - it('errors on unknown keys when functions allows', function (done) { - - var schema = Joi.object({ a: Joi.number() }).options({ skipFunctions: true }); - var obj = { a: 5, b: 'value' }; - schema.validate(obj, function (err, value) { - - expect(err).to.exist(); - done(); - }); - }); - - it('validates both valid() and with()', function (done) { - - var schema = Joi.object({ - first: Joi.valid('value'), - second: Joi.any() - }).with('first', 'second'); - - Helper.validate(schema, [ - [{ first: 'value' }, false] - ], done); - }); - - describe('#keys', function () { - - it('allows any key', function (done) { - - var a = Joi.object({ a: 4 }); - var b = a.keys(); - a.validate({ b: 3 }, function (err, value) { - - expect(err).to.exist(); - b.validate({ b: 3 }, function (err, value) { - - expect(err).to.not.exist(); - done(); - }); - }); - }); - - it('forbids all keys', function (done) { - - var a = Joi.object(); - var b = a.keys({}); - a.validate({ b: 3 }, function (err, value) { - - expect(err).to.not.exist(); - b.validate({ b: 3 }, function (err, value) { - - expect(err).to.exist(); - done(); - }); - }); - }); - - it('adds to existing keys', function (done) { - - var a = Joi.object({ a: 1 }); - var b = a.keys({ b: 2 }); - a.validate({ a: 1, b: 2 }, function (err, value) { - - expect(err).to.exist(); - b.validate({ a: 1, b: 2 }, function (err, value) { - - expect(err).to.not.exist(); - done(); - }); - }); - }); - }); - - describe('#unknown', function () { - - it('allows local unknown without applying to children', function (done) { - - var schema = Joi.object({ - a: { - b: Joi.number() - } - }).unknown(); - - Helper.validate(schema, [ - [{ a: { b: 5 } }, true], - [{ a: { b: 'x' } }, false], - [{ a: { b: 5 }, c: 'ignore' }, true], - [{ a: { b: 5, c: 'ignore' } }, false] - ], done); - }); - - it('forbids local unknown without applying to children', function (done) { - - var schema = Joi.object({ - a: Joi.object({ - b: Joi.number() - }).unknown() - }).options({ allowUnknown: false }); - - Helper.validate(schema, [ - [{ a: { b: 5 } }, true], - [{ a: { b: 'x' } }, false], - [{ a: { b: 5 }, c: 'ignore' }, false], - [{ a: { b: 5, c: 'ignore' } }, true] - ], done); - }); - }); - - describe('#rename', function () { - - it('allows renaming multiple times with multiple enabled', function (done) { - - var schema = Joi.object({ - test: Joi.string() - }).rename('test1', 'test').rename('test2', 'test', { multiple: true }); - - Joi.compile(schema).validate({ test1: 'a', test2: 'b' }, function (err, value) { - - expect(err).to.not.exist(); - done(); - }); - }); - - it('errors renaming multiple times with multiple disabled', function (done) { - - var schema = Joi.object({ - test: Joi.string() - }).rename('test1', 'test').rename('test2', 'test'); - - Joi.compile(schema).validate({ test1: 'a', test2: 'b' }, function (err, value) { - - expect(err.message).to.equal('value cannot rename child test2 because multiple renames are disabled and another key was already renamed to test'); - done(); - }); - }); - - it('errors multiple times when abortEarly is false', function (done) { - - Joi.object().rename('a', 'b').rename('c', 'b').rename('d', 'b').options({ abortEarly: false }).validate({ a: 1, c: 1, d: 1 }, function (err, value) { - - expect(err).to.exist(); - expect(err.message).to.equal('value cannot rename child c because multiple renames are disabled and another key was already renamed to b. value cannot rename child d because multiple renames are disabled and another key was already renamed to b'); - done(); - }); - }); - - it('aliases a key', function (done) { - - var schema = Joi.object({ - a: Joi.number(), - b: Joi.number() - }).rename('a', 'b', { alias: true }); - - var obj = { a: 10 }; - - Joi.compile(schema).validate(obj, function (err, value) { - - expect(err).to.not.exist(); - expect(value.a).to.equal(10); - expect(value.b).to.equal(10); - done(); - }); - }); - - it('with override disabled should not allow overwriting existing value', function (done) { - - var schema = Joi.object({ - test1: Joi.string() - }).rename('test', 'test1'); - - schema.validate({ test: 'b', test1: 'a' }, function (err, value) { - - expect(err.message).to.equal('value cannot rename child test because override is disabled and target test1 exists'); - done(); - }); - }); - - it('with override enabled should allow overwriting existing value', function (done) { - - var schema = Joi.object({ - test1: Joi.string() - }).rename('test', 'test1', { override: true }); - - schema.validate({ test: 'b', test1: 'a' }, function (err, value) { - - expect(err).to.not.exist(); - done(); - }); - }); - - it('renames when data is nested in an array via includes', function (done) { - - var schema = { - arr: Joi.array().includes(Joi.object({ - one: Joi.string(), - two: Joi.string() - }).rename('uno', 'one').rename('dos', 'two')) - }; - - var data = { arr: [{ uno: '1', dos: '2' }] }; - Joi.object(schema).validate(data, function (err, value) { - - expect(err).to.not.exist(); - expect(value.arr[0].one).to.equal('1'); - expect(value.arr[0].two).to.equal('2'); - done(); - }); - }); - - it('applies rename and validation in the correct order regardless of key order', function (done) { - - var schema1 = Joi.object({ - a: Joi.number() - }).rename('b', 'a'); - - var input1 = { b: '5' }; - - schema1.validate(input1, function (err1, value1) { - - expect(err1).to.not.exist(); - expect(value1.b).to.not.exist(); - expect(value1.a).to.equal(5); - - var schema2 = Joi.object({ a: Joi.number(), b: Joi.any() }).rename('b', 'a'); - var input2 = { b: '5' }; - - schema2.validate(input2, function (err2, value2) { - - expect(err2).to.not.exist(); - expect(value2.b).to.not.exist(); - expect(value2.a).to.equal(5); - - done(); - }); - }); - }); - - it('sets the default value after key is renamed', function (done) { - - var schema = Joi.object({ - foo2: Joi.string().default('test') - }).rename('foo', 'foo2'); - - var input = {}; - - Joi.validate(input, schema, function (err, value) { - - expect(err).to.not.exist(); - expect(value.foo2).to.equal('test'); - - done(); - }); - }); - - it('should be able to rename keys that are empty strings', function (done) { - - var schema = Joi.object().rename('', 'notEmpty'); - var input = { - '': 'something' - }; - - schema.validate(input, function (err, value) { - - expect(err).to.not.exist(); - expect(value['']).to.not.exist(); - expect(value.notEmpty).to.equal('something'); - done(); - }); - }); - - it('should not create new keys when they key in question does not exist', function (done) { - - var schema = Joi.object().rename('b', '_b'); - - var input = { - a: 'something' - }; - - schema.validate(input, function (err, value) { - - expect(err).to.not.exist(); - expect(Object.keys(value)).to.include('a'); - expect(value.a).to.equal('something'); - done(); - }); - }); - }); - - describe('#describe', function () { - - it('return empty description when no schema defined', function (done) { - - var schema = Joi.object(); - var desc = schema.describe(); - expect(desc).to.deep.equal({ - type: 'object' - }); - done(); - }); - - it('respects the shallow parameter', function (done) { - - var schema = Joi.object({ - name: Joi.string(), - child: Joi.object({ - name: Joi.string() - }) - }); - - expect(Object.keys(schema.describe(true))).to.not.include('children'); - expect(Object.keys(schema.describe())).to.include('children'); - - done(); - }); - - it('describes patterns', function (done) { - - var schema = Joi.object({ - a: Joi.string() - }).pattern(/\w\d/i, Joi.boolean()); - - expect(schema.describe()).to.deep.equal({ - type: 'object', - children: { - a: { - type: 'string', - invalids: [''] - } - }, - patterns: [ - { - regex: '/\\w\\d/i', - rule: { - type: 'boolean' - } - } - ] - }); - - done(); - }); - }); - - describe('#length', function () { - - it('throws when length is not a number', function (done) { - - expect(function () { - - Joi.object().length('a'); - }).to.throw('limit must be a positive integer'); - done(); - }); - }); - - describe('#min', function () { - - it('throws when limit is not a number', function (done) { - - expect(function () { - - Joi.object().min('a'); - }).to.throw('limit must be a positive integer'); - done(); - }); - }); - - describe('#max', function () { - - it('throws when limit is not a number', function (done) { - - expect(function () { - - Joi.object().max('a'); - }).to.throw('limit must be a positive integer'); - done(); - }); - }); - - describe('#pattern', function () { - - it('validates unknown keys using a pattern', function (done) { - - var schema = Joi.object({ - a: Joi.number() - }).pattern(/\d+/, Joi.boolean()).pattern(/\w\w+/, 'x'); - - Joi.validate({ bb: 'y', 5: 'x' }, schema, { abortEarly: false }, function (err, value) { - - expect(err).to.exist(); - expect(err.message).to.equal('5 must be a boolean. bb must be one of x'); - - Helper.validate(schema, [ - [{ a: 5 }, true], - [{ a: 'x' }, false], - [{ b: 'x' }, false], - [{ bb: 'x' }, true], - [{ 5: 'x' }, false], - [{ 5: false }, true], - [{ 5: undefined }, true] - ], done) - }); - }); - - it('validates unknown keys using a pattern (nested)', function (done) { - - var schema = { - x: Joi.object({ - a: Joi.number() - }).pattern(/\d+/, Joi.boolean()).pattern(/\w\w+/, 'x') - }; - - Joi.validate({ x: { bb: 'y', 5: 'x' } }, schema, { abortEarly: false }, function (err, value) { - - expect(err).to.exist(); - expect(err.message).to.equal('5 must be a boolean. bb must be one of x'); - done(); - }); - }); - - it('errors when using a pattern on empty schema with unknown(false) and pattern mismatch', function (done) { - - var schema = Joi.object().pattern(/\d/, Joi.number()).unknown(false); - - Joi.validate({ a: 5 }, schema, { abortEarly: false }, function (err, value) { - - expect(err).to.exist(); - expect(err.message).to.equal('a is not allowed'); - done(); - }); - }); - - it('removes global flag from patterns', function (done) { - - var schema = Joi.object().pattern(/a/g, Joi.number()); - - Joi.validate({ a1: 5, a2: 6 }, schema, function (err, value) { - - expect(err).to.not.exist(); - done(); - }); - }); - }); - - describe('#with', function () { - - it('should throw an error when a parameter is not a string', function (done) { - - try { - Joi.object().with({}); - var error = false; - } - catch (e) { - error = true; - } - expect(error).to.equal(true); - - try { - Joi.object().with(123); - error = false; - } - catch (e) { - error = true; - } - expect(error).to.equal(true); - done(); - }); - - it('should validate correctly when key is an empty string', function (done) { - - var schema = Joi.object().with('', 'b'); - Helper.validate(schema, [ - [{ c: 'hi', d: 'there' }, true], - ]); - done(); - }); - }); - - describe('#without', function () { - - it('should throw an error when a parameter is not a string', function (done) { - - try { - Joi.object().without({}); - var error = false; - } - catch (e) { - error = true; - } - expect(error).to.equal(true); - - try { - Joi.object().without(123); - error = false; - } - catch (e) { - error = true; - } - expect(error).to.equal(true); - - - done(); - }); - - it('should validate correctly when key is an empty string', function (done) { - - var schema = Joi.object().without('', 'b'); - Helper.validate(schema, [ - [{ a: 'hi', b: 'there' }, true] - ]); - done(); - }); - }); - - describe('#xor', function () { - - it('should throw an error when a parameter is not a string', function (done) { - - try { - Joi.object().xor({}); - var error = false; - } - catch (e) { - error = true; - } - expect(error).to.equal(true); - - try { - Joi.object().xor(123); - error = false; - } - catch (e) { - error = true; - } - expect(error).to.equal(true); - done(); - }); - }); - - describe('#or', function () { - - it('should throw an error when a parameter is not a string', function (done) { - - try { - Joi.object().or({}); - var error = false; - } - catch (e) { - error = true; - } - expect(error).to.equal(true); - - try { - Joi.object().or(123); - error = false; - } - catch (e) { - error = true; - } - expect(error).to.equal(true); - done(); - }); - - it('errors multiple levels deep', function (done) { - - Joi.object({ - a: { - b: Joi.object().or('x', 'y') - } - }).validate({ a: { b: { c: 1 } } }, function (err, value) { - - expect(err).to.exist(); - expect(err.message).to.equal('value must contain at least one of x, y'); - done(); - }); - }); - }); - - describe('#assert', function () { - - it('validates upwards reference', function (done) { - - var schema = Joi.object({ - a: { - b: Joi.string(), - c: Joi.number() - }, - d: { - e: Joi.any() - } - }).assert(Joi.ref('d/e', { separator: '/' }), Joi.ref('a.c'), 'equal to a.c'); - - schema.validate({ a: { b: 'x', c: 5 }, d: { e: 6 } }, function (err, value) { - - expect(err).to.exist(); - expect(err.message).to.equal('value validation failed because d.e failed to equal to a.c'); - - Helper.validate(schema, [ - [{ a: { b: 'x', c: 5 }, d: { e: 5 } }, true] - ], done); - }); - }); - - it('validates upwards reference with implicit context', function (done) { - - var schema = Joi.object({ - a: { - b: Joi.string(), - c: Joi.number() - }, - d: { - e: Joi.any() - } - }).assert('d.e', Joi.ref('a.c'), 'equal to a.c'); - - schema.validate({ a: { b: 'x', c: 5 }, d: { e: 6 } }, function (err, value) { - - expect(err).to.exist(); - expect(err.message).to.equal('value validation failed because d.e failed to equal to a.c'); - - Helper.validate(schema, [ - [{ a: { b: 'x', c: 5 }, d: { e: 5 } }, true] - ], done); - }); - }); - - it('throws when context is at root level', function (done) { - - expect(function () { - - var schema = Joi.object({ - a: { - b: Joi.string(), - c: Joi.number() - }, - d: { - e: Joi.any() - } - }).assert('a', Joi.ref('d.e'), 'equal to d.e'); - }).to.throw('Cannot use assertions for root level references - use direct key rules instead'); - done(); - }); - - it('allows root level context ref', function (done) { - - expect(function () { - - var schema = Joi.object({ - a: { - b: Joi.string(), - c: Joi.number() - }, - d: { - e: Joi.any() - } - }).assert('$a', Joi.ref('d.e'), 'equal to d.e'); - }).to.not.throw(); - done(); - }); - - it('provides a default message for failed assertions', function (done) { - - var schema = Joi.object({ - a: { - b: Joi.string(), - c: Joi.number() - }, - d: { - e: Joi.any() - } - }).assert('d.e', Joi.boolean()); - - schema.validate({ - d: { - e:[] - } - }, function (err) { - - expect(err).to.exist(); - expect(err.message).to.equal('value validation failed because d.e failed to pass the assertion test'); - done(); - }); - }); - }); - - describe('#type', function () { - - it('uses constructor name for default type name', function (done) { - - function Foo () {} - - var schema = Joi.object().type(Foo); - schema.validate({}, function (err) { - - expect(err).to.exist(); - expect(err.message).to.equal('value must be an instance of Foo'); - done(); - }); - }); - - it('uses custom type name if supplied', function (done) { - - var Foo = function () {}; - - var schema = Joi.object().type(Foo, 'Bar'); - schema.validate({}, function (err) { - - expect(err).to.exist(); - expect(err.message).to.equal('value must be an instance of Bar'); - done(); - }); - }); - - it('overrides constructor name with custom name', function (done) { - - function Foo () {} - - var schema = Joi.object().type(Foo, 'Bar'); - schema.validate({}, function (err) { - - expect(err).to.exist(); - expect(err.message).to.equal('value must be an instance of Bar'); - done(); - }); - }); - - it('throws when constructor is not a function', function (done) { - - expect(function () { - - var schema = Joi.object().type(''); - }).to.throw('type must be a constructor function'); - done(); - }); - - it('uses the constructor name in the schema description', function (done) { - - var description = Joi.object().type(RegExp).describe(); - - expect(description.rules).to.deep.include({ name: 'type', arg: 'RegExp' }); - done(); - }); - }); -}); diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/test/ref.js b/node_modules/hapi/node_modules/vision/node_modules/joi/test/ref.js deleted file mode 100755 index 3cc1ae8..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/test/ref.js +++ /dev/null @@ -1,389 +0,0 @@ -// Load modules - -var Lab = require('lab'); -var Code = require('code'); -var Joi = require('../lib'); -var Helper = require('./helper'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var before = lab.before; -var after = lab.after; -var describe = lab.describe; -var it = lab.it; -var expect = Code.expect; - - -describe('ref', function () { - - it('uses ref as a valid value', function (done) { - - var schema = Joi.object({ - a: Joi.ref('b'), - b: Joi.any() - }); - - schema.validate({ a: 5, b: 6 }, function (err, value) { - - expect(err).to.exist(); - expect(err.message).to.equal('a must be one of ref:b'); - - Helper.validate(schema, [ - [{ a: 5 }, false], - [{ b: 5 }, true], - [{ a: 5, b: 5 }, true], - [{ a: '5', b: '5' }, true] - ], done); - }); - }); - - it('uses ref as a valid value (empty key)', function (done) { - - var schema = Joi.object({ - a: Joi.ref(''), - '': Joi.any() - }); - - schema.validate({ a: 5, '': 6 }, function (err, value) { - - expect(err).to.exist(); - expect(err.message).to.equal('a must be one of ref:'); - - Helper.validate(schema, [ - [{ a: 5 }, false], - [{ '': 5 }, true], - [{ a: 5, '': 5 }, true], - [{ a: '5', '': '5' }, true] - ], done); - }); - }); - - it('uses ref with nested keys as a valid value', function (done) { - - var schema = Joi.object({ - a: Joi.ref('b.c'), - b: { - c: Joi.any() - } - }); - - schema.validate({ a: 5, b: { c: 6 } }, function (err, value) { - - expect(err).to.exist(); - expect(err.message).to.equal('a must be one of ref:b.c'); - - Helper.validate(schema, [ - [{ a: 5 }, false], - [{ b: { c: 5 } }, true], - [{ a: 5, b: 5 }, false], - [{ a: '5', b: { c: '5' } }, true] - ], done); - }); - }); - - it('uses ref with combined nested keys in sub child', function (done) { - - var ref = Joi.ref('b.c'); - expect(ref.root).to.equal('b'); - - var schema = Joi.object({ - a: ref, - b: { - c: Joi.any() - } - }); - - var input = { a: 5, b: { c: 5 } }; - schema.validate(input, function (err, value) { - - expect(err).to.not.exist(); - - var parent = Joi.object({ - e: schema - }); - - parent.validate({ e: input }, function (err, value) { - - expect(err).to.not.exist(); - done(); - }); - }); - }); - - it('uses ref reach options', function (done) { - - var ref = Joi.ref('b/c', { separator: '/' }); - expect(ref.root).to.equal('b'); - - var schema = Joi.object({ - a: ref, - b: { - c: Joi.any() - } - }); - - schema.validate({ a: 5, b: { c: 5 } }, function (err, value) { - - expect(err).to.not.exist(); - done(); - }); - }); - - it('ignores the order in which keys are defined', function (done) { - - var ab = Joi.object({ - a: { - c: Joi.number() - }, - b: Joi.ref('a.c') - }); - - ab.validate({ a: { c: '5' }, b: 5 }, function (err, value) { - - expect(err).to.not.exist(); - - var ba = Joi.object({ - b: Joi.ref('a.c'), - a: { - c: Joi.number() - } - }); - - ba.validate({ a: { c: '5' }, b: 5 }, function (err, value) { - - expect(err).to.not.exist(); - done(); - }); - }); - }); - - it('uses ref as default value', function (done) { - - var schema = Joi.object({ - a: Joi.default(Joi.ref('b')), - b: Joi.any() - }); - - schema.validate({ b: 6 }, function (err, value) { - - expect(err).to.not.exist(); - expect(value).to.deep.equal({ a: 6, b: 6 }); - done(); - }); - }); - - it('uses ref as default value regardless of order', function (done) { - - var ab = Joi.object({ - a: Joi.default(Joi.ref('b')), - b: Joi.number() - }); - - ab.validate({ b: '6' }, function (err, value) { - - expect(err).to.not.exist(); - expect(value).to.deep.equal({ a: 6, b: 6 }); - - var ba = Joi.object({ - b: Joi.number(), - a: Joi.default(Joi.ref('b')) - }); - - ba.validate({ b: '6' }, function (err, value) { - - expect(err).to.not.exist(); - expect(value).to.deep.equal({ a: 6, b: 6 }); - done(); - }); - }); - }); - - it('ignores the order in which keys are defined with alternatives', function (done) { - - var a = { c: Joi.number() }; - var b = [Joi.ref('a.c'), Joi.ref('c')]; - var c = Joi.number(); - - Helper.validate({ a: a, b: b, c: c }, [ - [{ a: {} }, true], - [{ a: { c: '5' }, b: 5 }, true], - [{ a: { c: '5' }, b: 6, c: '6' }, true], - [{ a: { c: '5' }, b: 7, c: '6' }, false] - ]); - - Helper.validate({ b: b, a: a, c: c }, [ - [{ a: {} }, true], - [{ a: { c: '5' }, b: 5 }, true], - [{ a: { c: '5' }, b: 6, c: '6' }, true], - [{ a: { c: '5' }, b: 7, c: '6' }, false] - ]); - - Helper.validate({ b: b, c: c, a: a }, [ - [{ a: {} }, true], - [{ a: { c: '5' }, b: 5 }, true], - [{ a: { c: '5' }, b: 6, c: '6' }, true], - [{ a: { c: '5' }, b: 7, c: '6' }, false] - ]); - - Helper.validate({ a: a, c: c, b: b }, [ - [{ a: {} }, true], - [{ a: { c: '5' }, b: 5 }, true], - [{ a: { c: '5' }, b: 6, c: '6' }, true], - [{ a: { c: '5' }, b: 7, c: '6' }, false] - ]); - - Helper.validate({ c: c, a: a, b: b }, [ - [{ a: {} }, true], - [{ a: { c: '5' }, b: 5 }, true], - [{ a: { c: '5' }, b: 6, c: '6' }, true], - [{ a: { c: '5' }, b: 7, c: '6' }, false] - ]); - - Helper.validate({ c: c, b: b, a: a }, [ - [{ a: {} }, true], - [{ a: { c: '5' }, b: 5 }, true], - [{ a: { c: '5' }, b: 6, c: '6' }, true], - [{ a: { c: '5' }, b: 7, c: '6' }, false] - ], done); - }); - - it('uses context as default value', function (done) { - - var schema = Joi.object({ - a: Joi.default(Joi.ref('$x')), - b: Joi.any() - }); - - Joi.validate({ b: 6 }, schema, { context: { x: 22 } }, function (err, value) { - - expect(err).to.not.exist(); - expect(value).to.deep.equal({ a: 22, b: 6 }); - done(); - }); - }); - - it('uses context as default value with custom prefix', function (done) { - - var schema = Joi.object({ - a: Joi.default(Joi.ref('%x', { contextPrefix: '%' })), - b: Joi.any() - }); - - Joi.validate({ b: 6 }, schema, { context: { x: 22 } }, function (err, value) { - - expect(err).to.not.exist(); - expect(value).to.deep.equal({ a: 22, b: 6 }); - done(); - }); - }); - - it('uses context as a valid value', function (done) { - - var schema = Joi.object({ - a: Joi.ref('$x'), - b: Joi.any() - }); - - Joi.validate({ a: 5, b: 6 }, schema, { context: { x: 22 } }, function (err, value) { - - expect(err).to.exist(); - expect(err.message).to.equal('a must be one of context:x'); - - Helper.validateOptions(schema, [ - [{ a: 5 }, false], - [{ a: 22 }, true], - [{ b: 5 }, true], - [{ a: 22, b: 5 }, true], - [{ a: '22', b: '5' }, false] - ], { context: { x: 22 } }, done); - }); - }); - - it('uses context in when condition', function (done) { - - var schema = { - a: Joi.boolean().when('$x', { is: Joi.exist(), otherwise: Joi.forbidden() }) - }; - - Helper.validate(schema, [ - [{}, true], - [{ a: 'x' }, false], - [{ a: true }, false], - [{}, true, { context: {} }], - [{ a: 'x' }, false, { context: {} }], - [{ a: true }, false, { context: {} }], - [{}, true, { context: { x: 1 } }], - [{ a: 'x' }, false, { context: { x: 1 } }], - [{ a: true }, true, { context: { x: 1 } }] - ], done); - }); - - it('uses nested context in when condition', function (done) { - - var schema = { - a: Joi.boolean().when('$x.y', { is: Joi.exist(), otherwise: Joi.forbidden() }) - }; - - Helper.validate(schema, [ - [{}, true], - [{ a: 'x' }, false], - [{ a: true }, false], - [{}, true, { context: {} }], - [{ a: 'x' }, false, { context: {} }], - [{ a: true }, false, { context: {} }], - [{}, true, { context: { x: 1 } }], - [{ a: 'x' }, false, { context: { x: 1 } }], - [{ a: true }, false, { context: { x: 1 } }], - [{}, true, { context: { x: {} } }], - [{ a: 'x' }, false, { context: { x: {} } }], - [{ a: true }, false, { context: { x: {} } }], - [{}, true, { context: { x: { y: 1 } } }], - [{ a: 'x' }, false, { context: { x: { y: 1 } } }], - [{ a: true }, true, { context: { x: { y: 1 } } }] - ], done); - }); - - it('describes schema with ref', function (done) { - - var desc = Joi.compile(Joi.ref('a.b')).describe(); - expect(Joi.isRef(desc.valids[0])).to.be.true(); - done(); - }); - - describe('#create', function () { - - it('throws when key is missing', function (done) { - - expect(function () { - - Joi.ref(5); - }).to.throw('Invalid reference key: 5'); - done(); - }); - - it('finds root with default separator', function (done) { - - expect(Joi.ref('a.b.c').root).to.equal('a'); - done(); - }); - - it('finds root with default separator and options', function (done) { - - expect(Joi.ref('a.b.c', {}).root).to.equal('a'); - done(); - }); - - it('finds root with custom separator', function (done) { - - expect(Joi.ref('a+b+c', { separator: '+' }).root).to.equal('a'); - done(); - }); - }); -}); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/node_modules/joi/test/string.js b/node_modules/hapi/node_modules/vision/node_modules/joi/test/string.js deleted file mode 100755 index c9c61c0..0000000 --- a/node_modules/hapi/node_modules/vision/node_modules/joi/test/string.js +++ /dev/null @@ -1,1797 +0,0 @@ -// Load modules - -var Lab = require('lab'); -var Code = require('code'); -var Joi = require('../lib'); -var Helper = require('./helper'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var before = lab.before; -var after = lab.after; -var describe = lab.describe; -var it = lab.it; -var expect = Code.expect; - - -describe('string', function () { - - it('fails on boolean', function (done) { - - var schema = Joi.string(); - Helper.validate(schema, [ - [true, false], - [false, false] - ], done); - }); - - describe('#valid', function () { - - it('should throw error on input not matching type', function (done) { - - expect(function () { - - Joi.string().valid({}); - }).to.throw(); - done(); - }); - - it('should not throw on input matching type', function (done) { - - expect(function () { - - Joi.string().valid('joi'); - }).to.not.throw(); - done(); - }); - - it('validates case sensitive values', function (done) { - - Helper.validate(Joi.string().valid('a', 'b'), [ - ['a', true], - ['b', true], - ['A', false], - ['B', false] - ], done); - }); - - it('validates case insensitive values', function (done) { - - Helper.validate(Joi.string().valid('a', 'b').insensitive(), [ - ['a', true], - ['b', true], - ['A', true], - ['B', true], - [4, false] - ], done); - }); - - it('validates case insensitive values with non-strings', function (done) { - - Helper.validate(Joi.string().valid('a', 'b', 5).insensitive(), [ - ['a', true], - ['b', true], - ['A', true], - ['B', true], - [4, false], - [5, true] - ], done); - }); - }); - - describe('#invalid', function () { - - it('should throw error on input not matching type', function (done) { - - expect(function () { - - Joi.string().invalid({}); - }).to.throw(); - done(); - }); - - it('should not throw on input matching type', function (done) { - - expect(function () { - - Joi.string().invalid('joi'); - }).to.not.throw(); - done(); - }); - - it('invalidates case sensitive values', function (done) { - - Helper.validate(Joi.string().invalid('a', 'b'), [ - ['a', false], - ['b', false], - ['A', true], - ['B', true] - ], done); - }); - - it('invalidates case insensitive values', function (done) { - - Helper.validate(Joi.string().invalid('a', 'b').insensitive(), [ - ['a', false], - ['b', false], - ['A', false], - ['B', false] - ], done); - }); - }); - - describe('#min', function () { - - it('throws when limit is not a number', function (done) { - - expect(function () { - - Joi.string().min('a'); - }).to.throw('limit must be a positive integer'); - done(); - }); - - it('throws when limit is not an integer', function (done) { - - expect(function () { - - Joi.string().min(1.2); - }).to.throw('limit must be a positive integer'); - done(); - }); - - it('enforces a limit using byte count', function (done) { - - var schema = Joi.string().min(2, 'utf8'); - Helper.validate(schema, [ - ['\u00bd', true], - ['a', false] - ], done); - }); - }); - - describe('#max', function () { - - it('throws when limit is not a number', function (done) { - - expect(function () { - - Joi.string().max('a'); - }).to.throw('limit must be a positive integer'); - done(); - }); - - it('throws when limit is not an integer', function (done) { - - expect(function () { - - Joi.string().max(1.2); - }).to.throw('limit must be a positive integer'); - done(); - }); - - it('enforces a limit using byte count', function (done) { - - var schema = Joi.string().max(1, 'utf8'); - Helper.validate(schema, [ - ['\u00bd', false], - ['a', true] - ], done); - }); - }); - - describe('#creditCard', function () { - - it('should validate credit card', function (done) { - - var t = Joi.string().creditCard(); - t.validate('4111111111111112', function (err, value) { - - expect(err.message).to.equal('value must be a credit card'); - - Helper.validate(t, [ - ['378734493671000', true], // american express - ['371449635398431', true], // american express - ['378282246310005', true], // american express - ['341111111111111', true], // american express - ['5610591081018250', true], // australian bank - ['5019717010103742', true], // dankort pbs - ['38520000023237', true], // diners club - ['30569309025904', true], // diners club - ['6011000990139424', true], // discover - ['6011111111111117', true], // discover - ['6011601160116611', true], // discover - ['3566002020360505', true], // jbc - ['3530111333300000', true], // jbc - ['5105105105105100', true], // mastercard - ['5555555555554444', true], // mastercard - ['5431111111111111', true], // mastercard - ['6331101999990016', true], // switch/solo paymentech - ['4222222222222', true], // visa - ['4012888888881881', true], // visa - ['4111111111111111', true], // visa - ['4111111111111112', false], - [null, false], - ], done); - }); - }); - }); - - describe('#length', function () { - - it('throws when limit is not a number', function (done) { - - expect(function () { - - Joi.string().length('a'); - }).to.throw('limit must be a positive integer'); - done(); - }); - - it('throws when limit is not an integer', function (done) { - - expect(function () { - - Joi.string().length(1.2); - }).to.throw('limit must be a positive integer'); - done(); - }); - - it('enforces a limit using byte count', function (done) { - - var schema = Joi.string().length(2, 'utf8'); - Helper.validate(schema, [ - ['\u00bd', true], - ['a', false] - ], done); - }); - }); - - describe('#hostname', function () { - - it('validates hostnames', function (done) { - - var schema = Joi.string().hostname(); - Helper.validate(schema, [ - ['www.example.com', true], - ['domain.local', true], - ['3domain.local', true], - ['hostname', true], - ['host:name', false], - ['-', false], - ['2387628', true], - ['01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789', false], - ['::1', true], - ['0:0:0:0:0:0:0:1', true], - ['0:?:0:0:0:0:0:1', false] - ], done); - }); - }); - - describe('#lowercase', function () { - - it('only allows strings that are entirely lowercase', function (done) { - - var schema = Joi.string().lowercase(); - Helper.validateOptions(schema, [ - ['this is all lowercase', true], - ['5', true], - ['lower\tcase', true], - ['Uppercase', false], - ['MixEd cAsE', false], - [1, false] - ], { convert: false }, done); - }); - - it('coerce string to lowercase before validation', function (done) { - - var schema = Joi.string().lowercase(); - schema.validate('UPPER TO LOWER', function (err, value) { - - expect(err).to.not.exist(); - expect(value).to.equal('upper to lower'); - done(); - }); - }); - - it('should work in combination with a trim', function (done) { - - var schema = Joi.string().lowercase().trim(); - Helper.validate(schema, [ - [' abc', true], - [' ABC', true], - ['ABC', true], - [1, false] - ], done); - }); - }); - - describe('#uppercase', function () { - - it('only allow strings that are entirely uppercase', function (done) { - - var schema = Joi.string().uppercase(); - Helper.validateOptions(schema, [ - ['THIS IS ALL UPPERCASE', true], - ['5', true], - ['UPPER\nCASE', true], - ['lOWERCASE', false], - ['MixEd cAsE', false], - [1, false] - ], { convert: false }, done); - }); - - it('coerce string to uppercase before validation', function (done) { - - var schema = Joi.string().uppercase(); - schema.validate('lower to upper', function (err, value) { - - expect(err).to.not.exist(); - expect(value).to.equal('LOWER TO UPPER'); - done(); - }); - }); - - it('works in combination with a forced trim', function (done) { - - var schema = Joi.string().uppercase().trim(); - Helper.validate(schema, [ - [' abc', true], - [' ABC', true], - ['ABC', true], - [1, false] - ], done); - }); - }); - - describe('#trim', function () { - - it('only allow strings that have no leading or trailing whitespace', function (done) { - - var schema = Joi.string().trim(); - Helper.validateOptions(schema, [ - [' something', false], - ['something ', false], - ['something\n', false], - ['some thing', true], - ['something', true] - ], { convert: false }, done); - }); - - it('removes leading and trailing whitespace before validation', function (done) { - - var schema = Joi.string().trim(); - schema.validate(' trim this ', function (err, value) { - - expect(err).to.not.exist(); - expect(value).to.equal('trim this'); - done(); - }); - }); - - it('removes leading and trailing whitespace before validation', function (done) { - - var schema = Joi.string().trim().allow(''); - schema.validate(' ', function (err, value) { - - expect(err).to.not.exist(); - expect(value).to.equal(''); - done(); - }); - }); - - it('should work in combination with min', function (done) { - - var schema = Joi.string().min(4).trim(); - Helper.validate(schema, [ - [' a ', false], - ['abc ', false], - ['abcd ', true] - ], done); - }); - - it('should work in combination with max', function (done) { - - var schema = Joi.string().max(4).trim(); - Helper.validate(schema, [ - [' abcde ', false], - ['abc ', true], - ['abcd ', true] - ], done); - }); - - it('should work in combination with length', function (done) { - - var schema = Joi.string().length(4).trim(); - Helper.validate(schema, [ - [' ab ', false], - ['abc ', false], - ['abcd ', true] - ], done); - }); - - it('should work in combination with a case change', function (done) { - - var schema = Joi.string().trim().lowercase(); - Helper.validate(schema, [ - [' abc', true], - [' ABC', true], - ['ABC', true] - ], done); - }); - }); - - describe('#regex', function () { - - it('should not include a pattern name by default', function (done) { - - var schema = Joi.string().regex(/[a-z]+/).regex(/[0-9]+/); - schema.validate('abcd', function (err, value) { - - expect(err.message).to.contain('required pattern'); - done(); - }); - }); - - it('should include a pattern name if specified', function (done) { - - var schema = Joi.string().regex(/[a-z]+/, 'letters').regex(/[0-9]+/, 'numbers'); - schema.validate('abcd', function (err, value) { - - expect(err.message).to.contain('numbers pattern'); - done(); - }); - }); - }); - - describe('#validate', function () { - - it('should, by default, allow undefined, deny empty string', function (done) { - - Helper.validate(Joi.string(), [ - [undefined, true], - ['', false] - ], done); - }); - - it('should, when .required(), deny undefined, deny empty string', function (done) { - - Helper.validate(Joi.string().required(), [ - [undefined, false], - ['', false] - ], done); - }); - - it('should, when .required(), print a friend error message for an empty string', function (done) { - - var schema = Joi.string().required(); - Joi.compile(schema).validate('', function (err, value) { - - expect(err.message).to.contain('be empty'); - done(); - }); - }); - - it('should, when .required(), validate non-empty strings', function (done) { - - var schema = Joi.string().required(); - Helper.validate(schema, [ - ['test', true], - ['0', true], - [null, false] - ], done); - }); - - it('validates invalid values', function (done) { - - var schema = Joi.string().invalid('a', 'b', 'c'); - Helper.validate(schema, [ - ['x', true], - ['a', false], - ['c', false] - ], done); - }); - - it('should invalidate invalid values', function (done) { - - var schema = Joi.string().valid('a', 'b', 'c'); - Helper.validate(schema, [ - ['x', false], - ['a', true], - ['c', true] - ], done); - }); - - it('validates array arguments correctly', function (done) { - - var schema = Joi.string().valid(['a', 'b', 'c']); - Helper.validate(schema, [ - ['x', false], - ['a', true], - ['c', true] - ], done); - }); - - it('validates minimum length when min is used', function (done) { - - var schema = Joi.string().min(3); - Helper.validate(schema, [ - ['test', true], - ['0', false], - [null, false] - ], done); - }); - - it('validates minimum length when min is 0', function (done) { - - var schema = Joi.string().min(0).required(); - Helper.validate(schema, [ - ['0', true], - [null, false], - [undefined, false] - ], done); - }); - - it('should return false with minimum length and a null value passed in', function (done) { - - var schema = Joi.string().min(3); - Helper.validate(schema, [ - [null, false] - ], done); - }); - - it('null allowed overrides min length requirement', function (done) { - - var schema = Joi.string().min(3).allow(null); - Helper.validate(schema, [ - [null, true] - ], done); - }); - - it('validates maximum length when max is used', function (done) { - - var schema = Joi.string().max(3); - Helper.validate(schema, [ - ['test', false], - ['0', true], - [null, false] - ], done); - }); - - it('should return true with max and not required when value is undefined', function (done) { - - var schema = Joi.string().max(3); - Helper.validate(schema, [ - [undefined, true] - ], done); - }); - - it('validates length requirements', function (done) { - - var schema = Joi.string().length(3); - Helper.validate(schema, [ - ['test', false], - ['0', false], - [null, false], - ['abc', true] - ], done); - }); - - it('validates regex', function (done) { - - var schema = Joi.string().regex(/^[0-9][-][a-z]+$/); - Helper.validate(schema, [ - ['van', false], - ['0-www', true] - ], done); - }); - - it('validates regex (ignoring global flag)', function (done) { - - var schema = Joi.string().regex(/a/g); - Helper.validate(schema, [ - ['ab', true], - ['ac', true] - ], done); - }); - - it('validates token', function (done) { - - var schema = Joi.string().token(); - Helper.validate(schema, [ - ['w0rld_of_w4lm4rtl4bs', true], - ['w0rld of_w4lm4rtl4bs', false], - ['abcd#f?h1j orly?', false] - ], done); - }); - - it('validates alphanum', function (done) { - - var schema = Joi.string().alphanum(); - Helper.validate(schema, [ - ['w0rld of w4lm4rtl4bs', false], - ['w0rldofw4lm4rtl4bs', true], - ['abcd#f?h1j orly?', false] - ], done); - }); - - it('validates email', function (done) { - - var schema = Joi.string().email(); - Helper.validate(schema, [ - ['joe@example.com', true], - ['"joe"@example.com', true], - ['@iaminvalid.com', false], - ['joe@[IPv6:2a00:1450:4001:c02::1b]', true], - ['12345678901234567890123456789012345678901234567890123456789012345@walmartlabs.com', false], - ['123456789012345678901234567890123456789012345678901234567890@12345678901234567890123456789012345678901234567890123456789.12345678901234567890123456789012345678901234567890123456789.12345678901234567890123456789012345678901234567890123456789.12345.toolong.com', false] - ], done); - }); - - it('validates email with a friendly error message', function (done) { - - var schema = { item: Joi.string().email() }; - Joi.compile(schema).validate({ item: 'something' }, function (err, value) { - - expect(err.message).to.contain('must be a valid email'); - done(); - }); - }); - - it('should return false for denied value', function (done) { - - var text = Joi.string().invalid('joi'); - text.validate('joi', function (err, value) { - - expect(err).to.exist(); - done(); - }); - }); - - it('should return true for allowed value', function (done) { - - var text = Joi.string().allow('hapi'); - text.validate('result', function (err, value) { - - expect(err).to.not.exist(); - done(); - }); - }); - - it('validates with one validator (min)', function (done) { - - var text = Joi.string().min(3); - text.validate('joi', function (err, value) { - - expect(err).to.not.exist(); - done(); - }); - }); - - it('validates with two validators (min, required)', function (done) { - - var text = Joi.string().min(3).required(); - text.validate('joi', function (err, value) { - - expect(err).to.not.exist(); - - text.validate('', function (err, value) { - - expect(err).to.exist(); - done(); - }); - }); - }); - - it('validates null with allow(null)', function (done) { - - Helper.validate(Joi.string().allow(null), [ - [null, true] - ], done); - }); - - it('validates "" (empty string) with allow(\'\')', function (done) { - - Helper.validate(Joi.string().allow(''), [ - ['', true], - ['', true] - ], done); - }); - - it('validates combination of required and min', function (done) { - - var rule = Joi.string().required().min(3); - Helper.validate(rule, [ - ['x', false], - ['123', true], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of required and max', function (done) { - - var rule = Joi.string().required().max(3); - Helper.validate(rule, [ - ['x', true], - ['123', true], - ['1234', false], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of allow(\'\') and min', function (done) { - - var rule = Joi.string().allow('').min(3); - Helper.validate(rule, [ - ['x', false], - ['123', true], - ['1234', true], - ['', true], - [null, false] - ], done); - }); - - it('validates combination of allow(\'\') and max', function (done) { - - var rule = Joi.string().allow('').max(3); - Helper.validate(rule, [ - ['x', true], - ['123', true], - ['1234', false], - ['', true], - [null, false] - ], done); - }); - - it('validates combination of null allowed and max', function (done) { - var rule = Joi.string().allow(null).max(3); - Helper.validate(rule, [ - ['x', true], - ['123', true], - ['1234', false], - ['', false], - [null, true] - ], done); - }); - - it('validates combination of min and max', function (done) { - - var rule = Joi.string().min(2).max(3); - Helper.validate(rule, [ - ['x', false], - ['123', true], - ['1234', false], - ['12', true], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of min, max, and allow(\'\')', function (done) { - - var rule = Joi.string().min(2).max(3).allow(''); - Helper.validate(rule, [ - ['x', false], - ['123', true], - ['1234', false], - ['12', true], - ['', true], - [null, false] - ], done); - }); - - it('validates combination of min, max, and required', function (done) { - - var rule = Joi.string().min(2).max(3).required(); - Helper.validate(rule, [ - ['x', false], - ['123', true], - ['1234', false], - ['12', true], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of min, max, and regex', function (done) { - - var rule = Joi.string().min(2).max(3).regex(/^a/); - Helper.validate(rule, [ - ['x', false], - ['123', false], - ['1234', false], - ['12', false], - ['ab', true], - ['abc', true], - ['abcd', false], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of min, max, regex, and allow(\'\')', function (done) { - - var rule = Joi.string().min(2).max(3).regex(/^a/).allow(''); - Helper.validate(rule, [ - ['x', false], - ['123', false], - ['1234', false], - ['12', false], - ['ab', true], - ['abc', true], - ['abcd', false], - ['', true], - [null, false] - ], done); - }); - - it('validates combination of min, max, regex, and required', function (done) { - - var rule = Joi.string().min(2).max(3).regex(/^a/).required(); - Helper.validate(rule, [ - ['x', false], - ['123', false], - ['1234', false], - ['12', false], - ['ab', true], - ['abc', true], - ['abcd', false], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of min, max, and alphanum', function (done) { - - var rule = Joi.string().min(2).max(3).alphanum(); - Helper.validate(rule, [ - ['x', false], - ['123', true], - ['1234', false], - ['12', true], - ['ab', true], - ['abc', true], - ['abcd', false], - ['*ab', false], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of min, max, alphanum, and allow(\'\')', function (done) { - - var rule = Joi.string().min(2).max(3).alphanum().allow(''); - Helper.validate(rule, [ - ['x', false], - ['123', true], - ['1234', false], - ['12', true], - ['ab', true], - ['abc', true], - ['abcd', false], - ['*ab', false], - ['', true], - [null, false] - ], done); - }); - - it('validates combination of min, max, alphanum, and required', function (done) { - - var rule = Joi.string().min(2).max(3).alphanum().required(); - Helper.validate(rule, [ - ['x', false], - ['123', true], - ['1234', false], - ['12', true], - ['ab', true], - ['abc', true], - ['abcd', false], - ['*ab', false], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of min, max, alphanum, and regex', function (done) { - - var rule = Joi.string().min(2).max(3).alphanum().regex(/^a/); - Helper.validate(rule, [ - ['x', false], - ['123', false], - ['1234', false], - ['12', false], - ['ab', true], - ['abc', true], - ['a2c', true], - ['abcd', false], - ['*ab', false], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of min, max, alphanum, required, and regex', function (done) { - - var rule = Joi.string().min(2).max(3).alphanum().required().regex(/^a/); - Helper.validate(rule, [ - ['x', false], - ['123', false], - ['1234', false], - ['12', false], - ['ab', true], - ['abc', true], - ['a2c', true], - ['abcd', false], - ['*ab', false], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of min, max, alphanum, allow(\'\'), and regex', function (done) { - - var rule = Joi.string().min(2).max(3).alphanum().allow('').regex(/^a/); - Helper.validate(rule, [ - ['x', false], - ['123', false], - ['1234', false], - ['12', false], - ['ab', true], - ['abc', true], - ['a2c', true], - ['abcd', false], - ['*ab', false], - ['', true], - [null, false] - ], done); - }); - - it('validates combination of email and min', function (done) { - - var rule = Joi.string().email().min(8); - Helper.validate(rule, [ - ['x@x.com', false], - ['123@x.com', true], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of email, min, and max', function (done) { - - var rule = Joi.string().email().min(8).max(10); - Helper.validate(rule, [ - ['x@x.com', false], - ['123@x.com', true], - ['1234@x.com', true], - ['12345@x.com', false], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of email, min, max, and invalid', function (done) { - - var rule = Joi.string().email().min(8).max(10).invalid('123@x.com'); - Helper.validate(rule, [ - ['x@x.com', false], - ['123@x.com', false], - ['1234@x.com', true], - ['12345@x.com', false], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of email, min, max, and allow', function (done) { - - var rule = Joi.string().email().min(8).max(10).allow('x@x.com'); - Helper.validate(rule, [ - ['x@x.com', true], - ['123@x.com', true], - ['1234@x.com', true], - ['12345@x.com', false], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of email, min, max, allow, and invalid', function (done) { - - var rule = Joi.string().email().min(8).max(10).allow('x@x.com').invalid('123@x.com'); - Helper.validate(rule, [ - ['x@x.com', true], - ['123@x.com', false], - ['1234@x.com', true], - ['12345@x.com', false], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of email, min, max, allow, invalid, and allow(\'\')', function (done) { - - var rule = Joi.string().email().min(8).max(10).allow('x@x.com').invalid('123@x.com').allow(''); - Helper.validate(rule, [ - ['x@x.com', true], - ['123@x.com', false], - ['1234@x.com', true], - ['12345@x.com', false], - ['', true], - [null, false] - ], done); - }); - - it('validates combination of email, min, max, allow, and allow(\'\')', function (done) { - - var rule = Joi.string().email().min(8).max(10).allow('x@x.com').allow(''); - Helper.validate(rule, [ - ['x@x.com', true], - ['123@x.com', true], - ['1234@x.com', true], - ['12345@x.com', false], - ['', true], - [null, false] - ], done); - }); - - it('validates combination of email, min, max, allow, invalid, and regex', function (done) { - - var rule = Joi.string().email().min(8).max(10).allow('x@x.com').invalid('123@x.com').regex(/^1/); - Helper.validate(rule, [ - ['x@x.com', true], - ['123@x.com', false], - ['1234@x.com', true], - ['12345@x.com', false], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of email, min, max, allow, invalid, regex, and allow(\'\')', function (done) { - - var rule = Joi.string().email().min(8).max(10).allow('x@x.com').invalid('123@x.com').regex(/^1/).allow(''); - Helper.validate(rule, [ - ['x@x.com', true], - ['123@x.com', false], - ['1234@x.com', true], - ['12345@x.com', false], - ['', true], - [null, false] - ], done); - }); - - it('validates combination of email, min, max, and allow(\'\')', function (done) { - - var rule = Joi.string().email().min(8).max(10).allow(''); - Helper.validate(rule, [ - ['x@x.com', false], - ['123@x.com', true], - ['1234@x.com', true], - ['12345@x.com', false], - ['', true], - [null, false] - ], done); - }); - - it('validates combination of email, min, max, and regex', function (done) { - - var rule = Joi.string().email().min(8).max(10).regex(/^1234/); - Helper.validate(rule, [ - ['x@x.com', false], - ['123@x.com', false], - ['1234@x.com', true], - ['12345@x.com', false], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of email, min, max, regex, and allow(\'\')', function (done) { - - var rule = Joi.string().email().min(8).max(10).regex(/^1234/).allow(''); - Helper.validate(rule, [ - ['x@x.com', false], - ['123@x.com', false], - ['1234@x.com', true], - ['12345@x.com', false], - ['', true], - [null, false] - ], done); - }); - - it('validates combination of email, min, max, regex, and required', function (done) { - - var rule = Joi.string().email().min(8).max(10).regex(/^1234/).required(); - Helper.validate(rule, [ - ['x@x.com', false], - ['123@x.com', false], - ['1234@x.com', true], - ['12345@x.com', false], - ['', false], - [null, false] - ], done); - }); - - it('validates isoDate', function (done) { - - Helper.validate(Joi.string().isoDate(), [ - ['2013-06-07T14:21:46.295Z', true], - ['2013-06-07T14:21:46.295Z0', false], - ['2013-06-07T14:21:46.295+07:00', true], - ['2013-06-07T14:21:46.295+07:000', false], - ['2013-06-07T14:21:46.295-07:00', true], - ['2013-06-07T14:21:46Z', true], - ['2013-06-07T14:21:46Z0', false], - ['2013-06-07T14:21:46+07:00', true], - ['2013-06-07T14:21:46-07:00', true], - ['2013-06-07T14:21Z', true], - ['2013-06-07T14:21+07:00', true], - ['2013-06-07T14:21+07:000', false], - ['2013-06-07T14:21-07:00', true], - ['2013-06-07T14:21Z+7:00', false], - ['2013-06-07', true], - ['2013-06-07T', false], - ['2013-06-07T14:21', false], - ['1-1-2013', false] - ], done); - }); - - it('validates isoDate with a friendly error message', function (done) { - - var schema = { item: Joi.string().isoDate() }; - Joi.compile(schema).validate({ item: 'something' }, function (err, value) { - - expect(err.message).to.contain('must be a valid ISO 8601 date'); - done(); - }); - }); - - it('validates combination of isoDate and min', function (done) { - - var rule = Joi.string().isoDate().min(23); - Helper.validate(rule, [ - ['2013-06-07T14:21:46.295Z', true], - ['2013-06-07T14:21:46.295Z0', false], - ['2013-06-07T14:21:46.295+07:00', true], - ['2013-06-07T14:21:46.295+07:000', false], - ['2013-06-07T14:21:46.295-07:00', true], - ['2013-06-07T14:21:46Z', false], - ['2013-06-07T14:21:46Z0', false], - ['2013-06-07T14:21:46+07:00', true], - ['2013-06-07T14:21:46-07:00', true], - ['2013-06-07T14:21Z', false], - ['2013-06-07T14:21+07:00', false], - ['2013-06-07T14:21+07:000', false], - ['2013-06-07T14:21-07:00', false], - ['2013-06-07T14:21Z+7:00', false], - ['2013-06-07', false], - ['2013-06-07T', false], - ['2013-06-07T14:21', false], - ['1-1-2013', false], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of isoDate, min and max', function (done) { - - var rule = Joi.string().isoDate().min(17).max(23); - Helper.validate(rule, [ - ['2013-06-07T14:21:46.295Z', false], - ['2013-06-07T14:21:46.295Z0', false], - ['2013-06-07T14:21:46.295+07:00', false], - ['2013-06-07T14:21:46.295+07:000', false], - ['2013-06-07T14:21:46.295-07:00', false], - ['2013-06-07T14:21:46Z', true], - ['2013-06-07T14:21:46Z0', false], - ['2013-06-07T14:21:46+07:00', false], - ['2013-06-07T14:21:46-07:00', false], - ['2013-06-07T14:21Z', true], - ['2013-06-07T14:21+07:00', true], - ['2013-06-07T14:21+07:000', false], - ['2013-06-07T14:21-07:00', true], - ['2013-06-07T14:21Z+7:00', false], - ['2013-06-07', false], - ['2013-06-07T', false], - ['2013-06-07T14:21', false], - ['1-1-2013', false], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of isoDate, min, max and invalid', function (done) { - - var rule = Joi.string().isoDate().min(17).max(23).invalid('2013-06-07T14:21+07:00'); - Helper.validate(rule, [ - ['2013-06-07T14:21:46.295Z', false], - ['2013-06-07T14:21:46.295Z0', false], - ['2013-06-07T14:21:46.295+07:00', false], - ['2013-06-07T14:21:46.295+07:000', false], - ['2013-06-07T14:21:46.295-07:00', false], - ['2013-06-07T14:21:46Z', true], - ['2013-06-07T14:21:46Z0', false], - ['2013-06-07T14:21:46+07:00', false], - ['2013-06-07T14:21:46-07:00', false], - ['2013-06-07T14:21Z', true], - ['2013-06-07T14:21+07:00', false], - ['2013-06-07T14:21+07:000', false], - ['2013-06-07T14:21-07:00', true], - ['2013-06-07T14:21Z+7:00', false], - ['2013-06-07', false], - ['2013-06-07T', false], - ['2013-06-07T14:21', false], - ['1-1-2013', false], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of isoDate, min, max and allow', function (done) { - - var rule = Joi.string().isoDate().min(17).max(23).allow('2013-06-07T14:21:46.295+07:00'); - Helper.validate(rule, [ - ['2013-06-07T14:21:46.295Z', false], - ['2013-06-07T14:21:46.295Z0', false], - ['2013-06-07T14:21:46.295+07:00', true], - ['2013-06-07T14:21:46.295+07:000', false], - ['2013-06-07T14:21:46.295-07:00', false], - ['2013-06-07T14:21:46Z', true], - ['2013-06-07T14:21:46Z0', false], - ['2013-06-07T14:21:46+07:00', false], - ['2013-06-07T14:21:46-07:00', false], - ['2013-06-07T14:21Z', true], - ['2013-06-07T14:21+07:00', true], - ['2013-06-07T14:21+07:000', false], - ['2013-06-07T14:21-07:00', true], - ['2013-06-07T14:21Z+7:00', false], - ['2013-06-07', false], - ['2013-06-07T', false], - ['2013-06-07T14:21', false], - ['1-1-2013', false], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of isoDate, min, max, allow and invalid', function (done) { - - var rule = Joi.string().isoDate().min(17).max(23).allow('2013-06-07T14:21:46.295+07:00').invalid('2013-06-07T14:21+07:00'); - Helper.validate(rule, [ - ['2013-06-07T14:21:46.295Z', false], - ['2013-06-07T14:21:46.295Z0', false], - ['2013-06-07T14:21:46.295+07:00', true], - ['2013-06-07T14:21:46.295+07:000', false], - ['2013-06-07T14:21:46.295-07:00', false], - ['2013-06-07T14:21:46Z', true], - ['2013-06-07T14:21:46Z0', false], - ['2013-06-07T14:21:46+07:00', false], - ['2013-06-07T14:21:46-07:00', false], - ['2013-06-07T14:21Z', true], - ['2013-06-07T14:21+07:00', false], - ['2013-06-07T14:21+07:000', false], - ['2013-06-07T14:21-07:00', true], - ['2013-06-07T14:21Z+7:00', false], - ['2013-06-07', false], - ['2013-06-07T', false], - ['2013-06-07T14:21', false], - ['1-1-2013', false], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of isoDate, min, max, allow, invalid and allow(\'\')', function (done) { - - var rule = Joi.string().isoDate().min(17).max(23).allow('2013-06-07T14:21:46.295+07:00').invalid('2013-06-07T14:21+07:00').allow(''); - Helper.validate(rule, [ - ['2013-06-07T14:21:46.295Z', false], - ['2013-06-07T14:21:46.295Z0', false], - ['2013-06-07T14:21:46.295+07:00', true], - ['2013-06-07T14:21:46.295+07:000', false], - ['2013-06-07T14:21:46.295-07:00', false], - ['2013-06-07T14:21:46Z', true], - ['2013-06-07T14:21:46Z0', false], - ['2013-06-07T14:21:46+07:00', false], - ['2013-06-07T14:21:46-07:00', false], - ['2013-06-07T14:21Z', true], - ['2013-06-07T14:21+07:00', false], - ['2013-06-07T14:21+07:000', false], - ['2013-06-07T14:21-07:00', true], - ['2013-06-07T14:21Z+7:00', false], - ['2013-06-07', false], - ['2013-06-07T', false], - ['2013-06-07T14:21', false], - ['1-1-2013', false], - ['', true], - [null, false] - ], done); - }); - - it('validates combination of isoDate, min, max, allow, invalid and allow(\'\')', function (done) { - - var rule = Joi.string().isoDate().min(17).max(23).allow('2013-06-07T14:21:46.295+07:00').allow(''); - Helper.validate(rule, [ - ['2013-06-07T14:21:46.295Z', false], - ['2013-06-07T14:21:46.295Z0', false], - ['2013-06-07T14:21:46.295+07:00', true], - ['2013-06-07T14:21:46.295+07:000', false], - ['2013-06-07T14:21:46.295-07:00', false], - ['2013-06-07T14:21:46Z', true], - ['2013-06-07T14:21:46Z0', false], - ['2013-06-07T14:21:46+07:00', false], - ['2013-06-07T14:21:46-07:00', false], - ['2013-06-07T14:21Z', true], - ['2013-06-07T14:21+07:00', true], - ['2013-06-07T14:21+07:000', false], - ['2013-06-07T14:21-07:00', true], - ['2013-06-07T14:21Z+7:00', false], - ['2013-06-07', false], - ['2013-06-07T', false], - ['2013-06-07T14:21', false], - ['1-1-2013', false], - ['', true], - [null, false] - ], done); - }); - - it('validates combination of isoDate, min, max, allow, invalid and regex', function (done) { - - var rule = Joi.string().isoDate().min(17).max(23).allow('2013-06-07T14:21:46.295+07:00').invalid('2013-06-07T14:21Z').regex(/Z$/); - Helper.validate(rule, [ - ['2013-06-07T14:21:46.295Z', false], - ['2013-06-07T14:21:46.295Z0', false], - ['2013-06-07T14:21:46.295+07:00', true], - ['2013-06-07T14:21:46.295+07:000', false], - ['2013-06-07T14:21:46.295-07:00', false], - ['2013-06-07T14:21:46Z', true], - ['2013-06-07T14:21:46Z0', false], - ['2013-06-07T14:21:46+07:00', false], - ['2013-06-07T14:21:46-07:00', false], - ['2013-06-07T14:21Z', false], - ['2013-06-07T14:21+07:00', false], - ['2013-06-07T14:21+07:000', false], - ['2013-06-07T14:21-07:00', false], - ['2013-06-07T14:21Z+7:00', false], - ['2013-06-07', false], - ['2013-06-07T', false], - ['2013-06-07T14:21', false], - ['1-1-2013', false], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of isoDate, min, max, allow, invalid, regex and allow(\'\')', function (done) { - - var rule = Joi.string().isoDate().min(17).max(23).allow('2013-06-07T14:21:46.295+07:00').invalid('2013-06-07T14:21Z').regex(/Z$/).allow(''); - Helper.validate(rule, [ - ['2013-06-07T14:21:46.295Z', false], - ['2013-06-07T14:21:46.295Z0', false], - ['2013-06-07T14:21:46.295+07:00', true], - ['2013-06-07T14:21:46.295+07:000', false], - ['2013-06-07T14:21:46.295-07:00', false], - ['2013-06-07T14:21:46Z', true], - ['2013-06-07T14:21:46Z0', false], - ['2013-06-07T14:21:46+07:00', false], - ['2013-06-07T14:21:46-07:00', false], - ['2013-06-07T14:21Z', false], - ['2013-06-07T14:21+07:00', false], - ['2013-06-07T14:21+07:000', false], - ['2013-06-07T14:21-07:00', false], - ['2013-06-07T14:21Z+7:00', false], - ['2013-06-07', false], - ['2013-06-07T', false], - ['2013-06-07T14:21', false], - ['1-1-2013', false], - ['', true], - [null, false] - ], done); - }); - - it('validates combination of isoDate, min, max and allow(\'\')', function (done) { - - var rule = Joi.string().isoDate().min(17).max(23).allow(''); - Helper.validate(rule, [ - ['2013-06-07T14:21:46.295Z', false], - ['2013-06-07T14:21:46.295Z0', false], - ['2013-06-07T14:21:46.295+07:00', false], - ['2013-06-07T14:21:46.295+07:000', false], - ['2013-06-07T14:21:46.295-07:00', false], - ['2013-06-07T14:21:46Z', true], - ['2013-06-07T14:21:46Z0', false], - ['2013-06-07T14:21:46+07:00', false], - ['2013-06-07T14:21:46-07:00', false], - ['2013-06-07T14:21Z', true], - ['2013-06-07T14:21+07:00', true], - ['2013-06-07T14:21+07:000', false], - ['2013-06-07T14:21-07:00', true], - ['2013-06-07T14:21Z+7:00', false], - ['2013-06-07', false], - ['2013-06-07T', false], - ['2013-06-07T14:21', false], - ['1-1-2013', false], - ['', true], - [null, false] - ], done); - }); - - it('validates combination of isoDate, min, max and regex', function (done) { - - var rule = Joi.string().isoDate().min(17).max(23).regex(/Z$/); - Helper.validate(rule, [ - ['2013-06-07T14:21:46.295Z', false], - ['2013-06-07T14:21:46.295Z0', false], - ['2013-06-07T14:21:46.295+07:00', false], - ['2013-06-07T14:21:46.295+07:000', false], - ['2013-06-07T14:21:46.295-07:00', false], - ['2013-06-07T14:21:46Z', true], - ['2013-06-07T14:21:46Z0', false], - ['2013-06-07T14:21:46+07:00', false], - ['2013-06-07T14:21:46-07:00', false], - ['2013-06-07T14:21Z', true], - ['2013-06-07T14:21+07:00', false], - ['2013-06-07T14:21+07:000', false], - ['2013-06-07T14:21-07:00', false], - ['2013-06-07T14:21Z+7:00', false], - ['2013-06-07', false], - ['2013-06-07T', false], - ['2013-06-07T14:21', false], - ['1-1-2013', false], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of isoDate, min, max, regex and allow(\'\')', function (done) { - - var rule = Joi.string().isoDate().min(17).max(23).regex(/Z$/).allow(''); - Helper.validate(rule, [ - ['2013-06-07T14:21:46.295Z', false], - ['2013-06-07T14:21:46.295Z0', false], - ['2013-06-07T14:21:46.295+07:00', false], - ['2013-06-07T14:21:46.295+07:000', false], - ['2013-06-07T14:21:46.295-07:00', false], - ['2013-06-07T14:21:46Z', true], - ['2013-06-07T14:21:46Z0', false], - ['2013-06-07T14:21:46+07:00', false], - ['2013-06-07T14:21:46-07:00', false], - ['2013-06-07T14:21Z', true], - ['2013-06-07T14:21+07:00', false], - ['2013-06-07T14:21+07:000', false], - ['2013-06-07T14:21-07:00', false], - ['2013-06-07T14:21Z+7:00', false], - ['2013-06-07', false], - ['2013-06-07T', false], - ['2013-06-07T14:21', false], - ['1-1-2013', false], - ['', true], - [null, false] - ], done); - }); - - it('validates combination of isoDate, min, max, regex and required', function (done) { - - var rule = Joi.string().isoDate().min(17).max(23).regex(/Z$/).required(); - Helper.validate(rule, [ - ['2013-06-07T14:21:46.295Z', false], - ['2013-06-07T14:21:46.295Z0', false], - ['2013-06-07T14:21:46.295+07:00', false], - ['2013-06-07T14:21:46.295+07:000', false], - ['2013-06-07T14:21:46.295-07:00', false], - ['2013-06-07T14:21:46Z', true], - ['2013-06-07T14:21:46Z0', false], - ['2013-06-07T14:21:46+07:00', false], - ['2013-06-07T14:21:46-07:00', false], - ['2013-06-07T14:21Z', true], - ['2013-06-07T14:21+07:00', false], - ['2013-06-07T14:21+07:000', false], - ['2013-06-07T14:21-07:00', false], - ['2013-06-07T14:21Z+7:00', false], - ['2013-06-07', false], - ['2013-06-07T', false], - ['2013-06-07T14:21', false], - ['1-1-2013', false], - ['', false], - [null, false] - ], done); - }); - - it('validates guid', function (done) { - - Helper.validate(Joi.string().guid(), [ - ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', true], - ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], - ['69593D62-71EA-4548-85E4-04FC71357423', true], - ['677E2553DD4D43B09DA77414DB1EB8EA', true], - ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', true], - ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], - ['0c74f13f-fa83-4c48-9b33-68921dd72463', true], - ['b4b2fb69c6244e5eb0698e0c6ec66618', true], - ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], - ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], - ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false] - ], done); - }); - - it('validates guid with a friendly error message', function (done) { - - var schema = { item: Joi.string().guid() }; - Joi.compile(schema).validate({ item: 'something' }, function (err, value) { - - expect(err.message).to.contain('must be a valid GUID'); - done(); - }); - }); - - it('validates combination of guid and min', function (done) { - - var rule = Joi.string().guid().min(36); - Helper.validate(rule, [ - ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', true], - ['{B59511BD6A5F4DF09ECF562A108D8A2E}', false], - ['69593D62-71EA-4548-85E4-04FC71357423', true], - ['677E2553DD4D43B09DA77414DB1EB8EA', false], - ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', true], - ['{7e9081b59a6d4cc1a8c347f69fb4198d}', false], - ['0c74f13f-fa83-4c48-9b33-68921dd72463', true], - ['b4b2fb69c6244e5eb0698e0c6ec66618', false], - ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], - ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], - ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of guid, min and max', function (done) { - - var rule = Joi.string().guid().min(32).max(34); - Helper.validate(rule, [ - ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], - ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], - ['69593D62-71EA-4548-85E4-04FC71357423', false], - ['677E2553DD4D43B09DA77414DB1EB8EA', true], - ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], - ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], - ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], - ['b4b2fb69c6244e5eb0698e0c6ec66618', true], - ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], - ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], - ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of guid, min, max and invalid', function (done) { - - var rule = Joi.string().guid().min(32).max(34).invalid('b4b2fb69c6244e5eb0698e0c6ec66618'); - Helper.validate(rule, [ - ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], - ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], - ['69593D62-71EA-4548-85E4-04FC71357423', false], - ['677E2553DD4D43B09DA77414DB1EB8EA', true], - ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], - ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], - ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], - ['b4b2fb69c6244e5eb0698e0c6ec66618', false], - ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], - ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], - ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of guid, min, max and allow', function (done) { - - var rule = Joi.string().guid().min(32).max(34).allow('{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D'); - Helper.validate(rule, [ - ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], - ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], - ['69593D62-71EA-4548-85E4-04FC71357423', false], - ['677E2553DD4D43B09DA77414DB1EB8EA', true], - ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], - ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], - ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], - ['b4b2fb69c6244e5eb0698e0c6ec66618', true], - ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], - ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', true], - ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of guid, min, max, allow and invalid', function (done) { - - var rule = Joi.string().guid().min(32).max(34).allow('{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D').invalid('b4b2fb69c6244e5eb0698e0c6ec66618'); - Helper.validate(rule, [ - ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], - ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], - ['69593D62-71EA-4548-85E4-04FC71357423', false], - ['677E2553DD4D43B09DA77414DB1EB8EA', true], - ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], - ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], - ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], - ['b4b2fb69c6244e5eb0698e0c6ec66618', false], - ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], - ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', true], - ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of guid, min, max, allow, invalid and allow(\'\')', function (done) { - - var rule = Joi.string().guid().min(32).max(34).allow('{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D').invalid('b4b2fb69c6244e5eb0698e0c6ec66618').allow(''); - Helper.validate(rule, [ - ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], - ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], - ['69593D62-71EA-4548-85E4-04FC71357423', false], - ['677E2553DD4D43B09DA77414DB1EB8EA', true], - ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], - ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], - ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], - ['b4b2fb69c6244e5eb0698e0c6ec66618', false], - ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], - ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', true], - ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], - ['', true], - [null, false] - ], done); - }); - - it('validates combination of guid, min, max, allow and allow(\'\')', function (done) { - - var rule = Joi.string().guid().min(32).max(34).allow('{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D').allow(''); - Helper.validate(rule, [ - ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], - ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], - ['69593D62-71EA-4548-85E4-04FC71357423', false], - ['677E2553DD4D43B09DA77414DB1EB8EA', true], - ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], - ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], - ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], - ['b4b2fb69c6244e5eb0698e0c6ec66618', true], - ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], - ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', true], - ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], - ['', true], - [null, false] - ], done); - }); - - it('validates combination of guid, min, max, allow, invalid and regex', function (done) { - - var rule = Joi.string().guid().min(32).max(34).allow('{D1A5279D-B27D-4CD4-A05E-EFDD53D08').invalid('b4b2fb69c6244e5eb0698e0c6ec66618').regex(/^{7e908/); - Helper.validate(rule, [ - ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], - ['{B59511BD6A5F4DF09ECF562A108D8A2E}', false], - ['69593D62-71EA-4548-85E4-04FC71357423', false], - ['677E2553DD4D43B09DA77414DB1EB8EA', false], - ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], - ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], - ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], - ['b4b2fb69c6244e5eb0698e0c6ec66618', false], - ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], - ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08', true], - ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of guid, min, max, allow, invalid, regex and allow(\'\')', function (done) { - - var rule = Joi.string().guid().min(32).max(34).allow('{D1A5279D-B27D-4CD4-A05E-EFDD53D08').invalid('b4b2fb69c6244e5eb0698e0c6ec66618').regex(/^{7e908/).allow(''); - Helper.validate(rule, [ - ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], - ['{B59511BD6A5F4DF09ECF562A108D8A2E}', false], - ['69593D62-71EA-4548-85E4-04FC71357423', false], - ['677E2553DD4D43B09DA77414DB1EB8EA', false], - ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], - ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], - ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], - ['b4b2fb69c6244e5eb0698e0c6ec66618', false], - ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], - ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08', true], - ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], - ['', true], - [null, false] - ], done); - }); - - it('validates combination of guid, min, max and allow(\'\')', function (done) { - - var rule = Joi.string().guid().min(32).max(34).allow(''); - Helper.validate(rule, [ - ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], - ['{B59511BD6A5F4DF09ECF562A108D8A2E}', true], - ['69593D62-71EA-4548-85E4-04FC71357423', false], - ['677E2553DD4D43B09DA77414DB1EB8EA', true], - ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], - ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], - ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], - ['b4b2fb69c6244e5eb0698e0c6ec66618', true], - ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], - ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], - ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], - ['', true], - [null, false] - ], done); - }); - - it('validates combination of guid, min, max and regex', function (done) { - - var rule = Joi.string().guid().min(32).max(34).regex(/^{7e9081/i); - Helper.validate(rule, [ - ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], - ['{B59511BD6A5F4DF09ECF562A108D8A2E}', false], - ['69593D62-71EA-4548-85E4-04FC71357423', false], - ['677E2553DD4D43B09DA77414DB1EB8EA', false], - ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], - ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], - ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], - ['b4b2fb69c6244e5eb0698e0c6ec66618', false], - ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], - ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], - ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], - ['', false], - [null, false] - ], done); - }); - - it('validates combination of guid, min, max, regex and allow(\'\')', function (done) { - - var rule = Joi.string().guid().min(32).max(34).regex(/^{7e9081/i).allow(''); - Helper.validate(rule, [ - ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], - ['{B59511BD6A5F4DF09ECF562A108D8A2E}', false], - ['69593D62-71EA-4548-85E4-04FC71357423', false], - ['677E2553DD4D43B09DA77414DB1EB8EA', false], - ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], - ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], - ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], - ['b4b2fb69c6244e5eb0698e0c6ec66618', false], - ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], - ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], - ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], - ['', true], - [null, false] - ], done); - }); - - it('validates combination of guid, min, max, regex and required', function (done) { - - var rule = Joi.string().guid().min(32).max(34).regex(/^{7e9081/i).required(); - Helper.validate(rule, [ - ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], - ['{B59511BD6A5F4DF09ECF562A108D8A2E}', false], - ['69593D62-71EA-4548-85E4-04FC71357423', false], - ['677E2553DD4D43B09DA77414DB1EB8EA', false], - ['{5ba3bba3-729a-4717-88c1-b7c4b7ba80db}', false], - ['{7e9081b59a6d4cc1a8c347f69fb4198d}', true], - ['0c74f13f-fa83-4c48-9b33-68921dd72463', false], - ['b4b2fb69c6244e5eb0698e0c6ec66618', false], - ['{283B67B2-430F-4E6F-97E6-19041992-C1B0}', false], - ['{D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D', false], - ['D1A5279D-B27D-4CD4-A05E-EFDD53D08E8D}', false], - ['', false], - [null, false] - ], done); - }); - }); -}); diff --git a/node_modules/hapi/node_modules/vision/package.json b/node_modules/hapi/node_modules/vision/package.json deleted file mode 100755 index 0e8eab1..0000000 --- a/node_modules/hapi/node_modules/vision/package.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "vision", - "description": "Templates rendering plugin support for hapi.js", - "version": "2.0.0", - "repository": { - "type": "git", - "url": "git://github.com/hapijs/vision" - }, - "main": "index", - "keywords": [ - "view", - "render", - "template", - "hapi" - ], - "engines": { - "node": ">=0.10.32" - }, - "dependencies": { - "boom": "2.x.x", - "hoek": "^2.9.x", - "items": "^1.1.x", - "joi": "5.x.x" - }, - "devDependencies": { - "code": "1.x.x", - "hapi": "8.x.x", - "lab": "5.x.x", - "handlebars": "2.x.x", - "jade": "1.x.x" - }, - "scripts": { - "test": "make test-cov" - }, - "licenses": [ - { - "type": "BSD", - "url": "http://github.com/hapijs/vision/raw/master/LICENSE" - } - ], - "readme": "#vision\n\nTemplates rendering plugin support for hapi.js.\n\n[![Build Status](https://secure.travis-ci.org/hapijs/vision.png)](http://travis-ci.org/hapijs/vision)\n\nLead Maintainer - [Eran Hammer](https://github.com/hueniverse)\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/hapijs/vision/issues" - }, - "_id": "vision@2.0.0", - "dist": { - "shasum": "741e013d6c2376aa1e802bf12871657f3a3d910b" - }, - "_from": "vision@2.0.0", - "_resolved": "https://registry.npmjs.org/vision/-/vision-2.0.0.tgz" -} diff --git a/node_modules/hapi/node_modules/vision/test/index.js b/node_modules/hapi/node_modules/vision/test/index.js deleted file mode 100755 index fff7790..0000000 --- a/node_modules/hapi/node_modules/vision/test/index.js +++ /dev/null @@ -1,586 +0,0 @@ -// Load modules - -var Path = require('path'); -var Code = require('code'); -var Handlebars = require('handlebars'); -var Hapi = require('hapi'); -var Hoek = require('hoek'); -var Jade = require('jade'); -var Lab = require('lab'); -var Vision = require('..'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var describe = lab.describe; -var it = lab.it; -var expect = Code.expect; - - -describe('handler()', function () { - - it('handles routes to views', function (done) { - - var server = new Hapi.Server({ minimal: true }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - engines: { html: require('handlebars') }, - path: __dirname + '/templates' - }); - - server.route({ method: 'GET', path: '/{param}', handler: { view: 'valid/handler' } }); - server.inject({ - method: 'GET', - url: '/hello' - }, function (res) { - - expect(res.result).to.contain('hello'); - done(); - }); - }); - - it('handles custom context', function (done) { - - var server = new Hapi.Server({ minimal: true }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - engines: { jade: Jade }, - path: __dirname + '/templates' - }); - - server.route({ method: 'GET', path: '/', handler: { view: { template: 'valid/index', context: { message: 'heyloo' } } } }); - server.inject('/', function (res) { - - expect(res.result).to.contain('heyloo'); - done(); - }); - }); - - it('handles custom options', function (done) { - - var server = new Hapi.Server({ minimal: true }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - engines: { html: require('handlebars') }, - path: __dirname + '/templates', - layoutPath: __dirname + '/templates/layout' - }); - - server.route({ method: 'GET', path: '/', handler: { view: { template: 'valid/options', options: { layout: 'elsewhere' } } } }); - server.inject('/', function (res) { - - expect(res.result).to.contain('+hello'); - done(); - }); - }); - - it('includes prerequisites in the default view context', function (done) { - - var pre = function (request, reply) { - - reply('PreHello'); - }; - - var server = new Hapi.Server({ minimal: true }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - engines: { html: require('handlebars') }, - path: __dirname + '/templates' - }); - - server.route({ - method: 'GET', - path: '/', - config: { - pre: [ - { method: pre, assign: 'p' } - ], - handler: { - view: 'valid/handler' - } - } - }); - - server.inject('/', function (res) { - - expect(res.result).to.contain('PreHello'); - done(); - }); - }); - - it('handles both custom and default contexts', function (done) { - - var server = new Hapi.Server({ minimal: true }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - engines: { html: require('handlebars') }, - path: __dirname + '/templates' - }); - - server.route({ method: 'GET', path: '/', handler: { view: { template: 'valid/testContext', context: { message: 'heyloo' } } } }); - server.inject('/?test=yes', function (res) { - - expect(res.result).to.contain('heyloo'); - expect(res.result).to.contain('yes'); - done(); - }); - }); - - it('overrides default contexts when provided with context of same name', function (done) { - - var server = new Hapi.Server({ minimal: true }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - engines: { html: require('handlebars') }, - path: __dirname + '/templates' - }); - - server.route({ method: 'GET', path: '/', handler: { view: { template: 'valid/testContext', context: { message: 'heyloo', query: { test: 'no' } } } } }); - server.inject('/?test=yes', function (res) { - - expect(res.result).to.contain('heyloo'); - expect(res.result).to.contain('no'); - done(); - }); - }); - - it('handles a global context', function (done) { - - var server = new Hapi.Server({ minimal: true }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - engines: { html: require('handlebars') }, - path: __dirname + '/templates', - context: { - message: 'default message' - } - }); - - server.route({ method: 'GET', path: '/', handler: { view: { template: 'valid/testContext' } } }); - server.inject('/', function (res) { - - expect(res.result).to.contain('

'); - expect(res.result).to.contain('

default message

'); - done(); - }); - }); - - it('overrides the global context with the default handler context', function (done) { - - var server = new Hapi.Server({ minimal: true }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - engines: { html: require('handlebars') }, - path: __dirname + '/templates', - - context: { - message: 'default message', - query: { - test: 'global' - } - } - }); - - server.route({ method: 'GET', path: '/', handler: { view: { template: 'valid/testContext' } } }); - server.inject('/?test=yes', function (res) { - - expect(res.result).to.contain('

yes

'); - expect(res.result).to.contain('

default message

'); - done(); - }); - }); - - it('overrides the global and default contexts with a custom handler context', function (done) { - - var server = new Hapi.Server({ minimal: true }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - engines: { html: require('handlebars') }, - path: __dirname + '/templates', - - context: { - message: 'default message', - - query: { - test: 'global' - } - } - }); - - server.route({ method: 'GET', path: '/', handler: { view: { template: 'valid/testContext', context: { message: 'override', query: { test: 'no' } } } } }); - server.inject('/?test=yes', function (res) { - - expect(res.result).to.contain('

no

'); - expect(res.result).to.contain('

override

'); - done(); - }); - }); - - it('throws on missing views', function (done) { - - var server = new Hapi.Server({ minimal: true, debug: false }); - server.register(Vision, Hoek.ignore); - server.connection(); - server.route({ path: '/', method: 'GET', handler: function (request, reply) { return reply.view('test', { message: 'steve' }); } }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(500); - done(); - }); - }); -}); - -describe('render()', function () { - - it('renders view (root)', function (done) { - - var server = new Hapi.Server({ minimal: true }); - server.connection(); - server.register(Vision, Hoek.ignore); - - server.views({ - engines: { html: Handlebars }, - path: __dirname + '/templates/valid' - }); - - server.render('test', { title: 'test', message: 'Hapi' }, function (err, rendered, config) { - - expect(rendered).to.exist(); - expect(rendered).to.contain('Hapi'); - done(); - }); - }); - - it('renders view (root with options)', function (done) { - - var server = new Hapi.Server({ minimal: true }); - server.connection(); - server.register(Vision, Hoek.ignore); - - server.views({ - engines: { html: Handlebars } - }); - - server.render('test', { title: 'test', message: 'Hapi' }, { path: Path.join(__dirname, '/templates/valid') }, function (err, rendered, config) { - - expect(rendered).to.exist(); - expect(rendered).to.contain('Hapi'); - done(); - }); - }); - - it('renders view (plugin)', function (done) { - - var test = function (server, options, next) { - - server.views({ - engines: { 'html': Handlebars }, - relativeTo: Path.join(__dirname, '/templates/plugin') - }); - - var view = server.render('test', { message: 'steve' }, function (err, rendered, config) { - - server.route([ - { - path: '/view', method: 'GET', handler: function (request, reply) { - - return reply(rendered); - } - } - ]); - - return next(); - }); - }; - - test.attributes = { - name: 'test' - }; - - var server = new Hapi.Server({ minimal: true }); - server.connection(); - server.register(Vision, Hoek.ignore); - - server.register(test, function (err) { - - expect(err).to.not.exist(); - server.inject('/view', function (res) { - - expect(res.result).to.equal('

steve

'); - done(); - }); - }); - }); - - it('renders view (plugin without views)', function (done) { - - var test = function (server, options, next) { - - var view = server.render('test', { message: 'steve' }, function (err, rendered, config) { - - server.route([ - { - path: '/view', method: 'GET', handler: function (request, reply) { - - return reply(rendered); - } - } - ]); - - return next(); - }); - }; - - test.attributes = { - name: 'test' - }; - - var server = new Hapi.Server({ minimal: true }); - server.connection(); - server.register(Vision, Hoek.ignore); - - server.views({ - engines: { 'html': Handlebars }, - relativeTo: Path.join(__dirname, '/templates/plugin') - }); - - server.register(test, function (err) { - - expect(err).to.not.exist(); - server.inject('/view', function (res) { - - expect(res.result).to.equal('

steve

'); - done(); - }); - }); - }); - - it('renders view (plugin with options)', function (done) { - - var test = function (server, options, next) { - - server.views({ - engines: { 'html': Handlebars } - }); - - var view = server.render('test', { message: 'steve' }, { relativeTo: Path.join(__dirname, '/templates/plugin') }, function (err, rendered, config) { - - server.route([ - { - path: '/view', method: 'GET', handler: function (request, reply) { - - return reply(rendered); - } - } - ]); - - return next(); - }); - }; - - test.attributes = { - name: 'test' - }; - - var server = new Hapi.Server({ minimal: true }); - server.connection(); - server.register(Vision, Hoek.ignore); - - server.register(test, function (err) { - - expect(err).to.not.exist(); - server.inject('/view', function (res) { - - expect(res.result).to.equal('

steve

'); - done(); - }); - }); - }); - - it('throws on missing views', function (done) { - - var server = new Hapi.Server({ minimal: true }); - server.register(Vision, Hoek.ignore); - expect(function () { - - server.render('test'); - }).to.throw('Missing views manager'); - done(); - }); -}); - -describe('views()', function () { - - it('requires plugin with views', function (done) { - - var test = function (server, options, next) { - - server.path(__dirname); - - var views = { - engines: { 'html': Handlebars }, - path: './templates/plugin' - }; - - server.views(views); - if (Object.keys(views).length !== 2) { - return next(new Error('plugin.view() modified options')); - } - - server.route([ - { - path: '/view', method: 'GET', handler: function (request, reply) { - - return reply.view('test', { message: options.message }); - } - } - ]); - - server.ext('onRequest', function (request, reply) { - - if (request.path === '/ext') { - return reply.view('test', { message: 'grabbed' }); - } - - return reply.continue(); - }); - - return next(); - }; - - test.attributes = { - name: 'test' - }; - - var server = new Hapi.Server({ minimal: true }); - server.connection(); - server.register(Vision, Hoek.ignore); - - server.register({ register: test, options: { message: 'viewing it' } }, function (err) { - - expect(err).to.not.exist(); - server.inject('/view', function (res) { - - expect(res.result).to.equal('

viewing it

'); - - server.inject('/ext', function (res) { - - expect(res.result).to.equal('

grabbed

'); - done(); - }); - }); - }); - }); - - it('requires plugin with views with specific relativeTo', function (done) { - - var test = function (server, options, next) { - - server.views({ - engines: { 'html': Handlebars }, - relativeTo: Path.join(__dirname, '/templates/plugin') - }); - - server.route([ - { - path: '/view', method: 'GET', handler: function (request, reply) { - - return reply.view('test', { message: 'steve' }); - } - } - ]); - - return next(); - }; - - test.attributes = { - name: 'test' - }; - - var server = new Hapi.Server({ minimal: true }); - server.connection(); - server.register(Vision, Hoek.ignore); - - server.register(test, function (err) { - - expect(err).to.not.exist(); - server.inject('/view', function (res) { - - expect(res.result).to.equal('

steve

'); - done(); - }); - }); - }); - - it('defaults to server views', function (done) { - - var test = function (server, options, next) { - - server.route({ - path: '/view', - method: 'GET', - handler: function (request, reply) { - - return reply.view('test', { message: options.message }); - } - }); - - return next(); - }; - - test.attributes = { - name: 'test' - }; - - var server = new Hapi.Server({ minimal: true }); - server.connection(); - server.register(Vision, Hoek.ignore); - - server.path(__dirname); - - var views = { - engines: { 'html': Handlebars }, - path: './templates/plugin' - }; - - server.views(views); - - server.register({ register: test, options: { message: 'viewing it' } }, function (err) { - - expect(err).to.not.exist(); - server.inject('/view', function (res) { - - expect(res.result).to.equal('

viewing it

'); - done(); - }); - }); - }); - - it('throws on multiple views', function (done) { - - var server = new Hapi.Server({ minimal: true }); - server.register(Vision, Hoek.ignore); - server.views({ engines: { 'html': Handlebars } }); - expect(function () { - - server.views({ engines: { 'html': Handlebars } }); - }).to.throw('Cannot set views manager more than once'); - done(); - }); -}); diff --git a/node_modules/hapi/node_modules/vision/test/manager.js b/node_modules/hapi/node_modules/vision/test/manager.js deleted file mode 100755 index df39140..0000000 --- a/node_modules/hapi/node_modules/vision/test/manager.js +++ /dev/null @@ -1,1524 +0,0 @@ -// Load modules - -var Fs = require('fs'); -var Code = require('code'); -var Handlebars = require('handlebars'); -var Hapi = require('hapi'); -var Hoek = require('hoek'); -var Jade = require('jade'); -var Lab = require('lab'); -var Vision = require('..'); -var Manager = require('../lib/manager'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var describe = lab.describe; -var it = lab.it; -var expect = Code.expect; - - -describe('Manager', function () { - - it('renders handlebars template', function (done) { - - var server = new Hapi.Server({ minimal: true }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - engines: { - html: { - module: require('handlebars'), - path: __dirname + '/templates/valid' - } - } - }); - - server.route({ method: 'GET', path: '/handlebars', handler: { view: { template: 'test.html', context: { message: 'Hello World!' } } } }); - - server.inject('/handlebars', function (res) { - - expect(res.result).to.exist(); - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('shallow copies global context', function (done) { - - var options = { - engines: { - html: { - module: require('handlebars'), - path: __dirname + '/templates/valid' - } - }, - context: { - a: 1 - } - }; - - var manager = new Manager(options); - - expect(manager._context).to.equal(options.context); - done(); - }); - - it('sets content type', function (done) { - - var server = new Hapi.Server({ minimal: true }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - engines: { - html: { - module: require('handlebars'), - path: __dirname + '/templates/valid', - contentType: 'something/else' - } - } - }); - - server.route({ method: 'GET', path: '/', handler: { view: { template: 'test', context: { message: 'Hello World!' } } } }); - server.inject('/', function (res) { - - expect(res.headers['content-type']).to.equal('something/else'); - expect(res.result).to.exist(); - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('errors on invalid template path', function (done) { - - var server = new Hapi.Server({ minimal: true, debug: false }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - engines: { 'html': require('handlebars') }, - path: __dirname + '/templates/invalid' - }); - - server.route({ method: 'GET', path: '/', handler: { view: { template: 'test', context: { message: 'Hello, World!' } } } }); - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(500); - done(); - }); - }); - - it('returns a compiled Handlebars template reply', function (done) { - - var server = new Hapi.Server({ minimal: true }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - engines: { 'html': require('handlebars') }, - path: __dirname + '/templates/valid' - }); - - server.route({ method: 'GET', path: '/', handler: { view: { template: 'test', context: { message: 'Hello, World!' } } } }); - - server.inject('/', function (res) { - - expect(res.result).to.exist(); - expect(res.result).to.have.string('Hello, World!'); - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('errors absolute path given and allowAbsolutePath is false (by default)', function (done) { - - var server = new Hapi.Server({ minimal: true, debug: false }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - engines: { 'html': require('handlebars') }, - path: __dirname + '/templates/valid' - }); - - server.route({ method: 'GET', path: '/', handler: { view: { template: __dirname + '/templates/valid/test', context: { message: 'Hello, World!' } } } }); - - server.inject('/', function (res) { - - expect(res.result).to.exist(); - expect(res.statusCode).to.equal(500); - done(); - }); - }); - - it('errors if path given includes ../ and allowInsecureAccess is false (by default)', function (done) { - - var server = new Hapi.Server({ minimal: true, debug: false }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - engines: { 'html': require('handlebars') }, - path: __dirname + '/templates/valid' - }); - - server.route({ method: 'GET', path: '/', handler: { view: { template: '../test', context: { message: 'Hello, World!' } } } }); - - server.inject('/', function (res) { - - expect(res.result).to.exist(); - expect(res.statusCode).to.equal(500); - done(); - }); - }); - - it('allows if path given includes ../ and allowInsecureAccess is true', function (done) { - - var server = new Hapi.Server({ minimal: true }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - engines: { 'html': require('handlebars') }, - allowInsecureAccess: true, - path: __dirname + '/templates/valid/helpers' - }); - - server.route({ method: 'GET', path: '/', handler: { view: { template: '../test', context: { message: 'Hello, World!' } } } }); - - server.inject('/', function (res) { - - expect(res.result).to.exist(); - expect(res.result).to.have.string('Hello, World!'); - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('errors if template does not exist()', function (done) { - - var server = new Hapi.Server({ minimal: true, debug: false }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - engines: { 'html': require('handlebars') }, - path: __dirname + '/templates/valid' - }); - - server.route({ method: 'GET', path: '/', handler: { view: { template: 'testNope', context: { message: 'Hello, World!' } } } }); - - server.inject('/', function (res) { - - expect(res.result).to.exist(); - expect(res.statusCode).to.equal(500); - done(); - }); - }); - - it('errors if engine.compile throws', function (done) { - - var server = new Hapi.Server({ minimal: true, debug: false }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - engines: { 'html': require('handlebars') }, - path: __dirname + '/templates/valid' - }); - - server.route({ method: 'GET', path: '/', handler: { view: { template: 'badmustache', context: { message: 'Hello, World!' }, options: { path: __dirname + '/templates/valid/invalid' } } } }); - - server.inject('/', function (res) { - - expect(res.result).to.exist(); - expect(res.statusCode).to.equal(500); - done(); - }); - }); - - it('should not fail if rendered template returns undefined', function (done) { - - var server = new Hapi.Server({ minimal: true }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - engines: { - html: { - module: { - compile: function (template, options) { - - return function (context, options) { - - return undefined; - }; - } - }, - path: __dirname + '/templates/valid' - } - } - }); - - server.route({ method: 'GET', path: '/', handler: { view: { template: 'test.html' } } }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - describe('with layout', function (done) { - - it('returns response', function (done) { - - var server = new Hapi.Server({ minimal: true }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - engines: { 'html': require('handlebars') }, - path: __dirname + '/templates', - layout: true - }); - - server.route({ method: 'GET', path: '/', handler: { view: { template: 'valid/test', context: { title: 'test', message: 'Hapi' } } } }); - - server.inject('/', function (res) { - - expect(res.result).to.exist(); - expect(res.statusCode).to.equal(200); - expect(res.result).to.equal('\n\n \n test\n \n \n
\n

Hapi

\n
\n\n \n\n'); - done(); - }); - }); - - it('returns response with relativeTo and absolute path', function (done) { - - var server = new Hapi.Server({ minimal: true }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - engines: { 'html': require('handlebars') }, - relativeTo: '/none/shall/pass', - path: __dirname + '/templates', - layout: true - }); - - server.route({ method: 'GET', path: '/', handler: { view: { template: 'valid/test', context: { title: 'test', message: 'Hapi' } } } }); - - server.inject('/', function (res) { - - expect(res.result).to.exist(); - expect(res.statusCode).to.equal(200); - expect(res.result).to.equal('\n\n \n test\n \n \n
\n

Hapi

\n
\n\n \n\n'); - done(); - }); - }); - - it('returns response with layout override', function (done) { - - var server = new Hapi.Server({ minimal: true }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - engines: { 'html': require('handlebars') }, - path: __dirname + '/templates', - layout: true - }); - - server.route({ method: 'GET', path: '/', handler: { view: { template: 'valid/test', context: { title: 'test', message: 'Hapi' }, options: { layout: 'otherLayout' } } } }); - - server.inject('/', function (res) { - - expect(res.result).to.exist(); - expect(res.statusCode).to.equal(200); - expect(res.result).to.equal('test:
\n

Hapi

\n
\n'); - done(); - }); - }); - - it('returns response with custom server layout', function (done) { - - var server = new Hapi.Server({ minimal: true }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - engines: { 'html': require('handlebars') }, - path: __dirname + '/templates', - layout: 'otherLayout' - }); - - server.route({ method: 'GET', path: '/', handler: { view: { template: 'valid/test', context: { title: 'test', message: 'Hapi' } } } }); - - server.inject('/', function (res) { - - expect(res.result).to.exist(); - expect(res.statusCode).to.equal(200); - expect(res.result).to.equal('test:
\n

Hapi

\n
\n'); - done(); - }); - }); - - it('returns response with custom server layout and path', function (done) { - - var server = new Hapi.Server({ minimal: true }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - engines: { 'html': require('handlebars') }, - relativeTo: __dirname, - path: 'templates', - layoutPath: 'templates/layout', - layout: 'elsewhere' - }); - - server.route({ method: 'GET', path: '/', handler: { view: { template: 'valid/test', context: { title: 'test', message: 'Hapi' } } } }); - - server.inject('/', function (res) { - - expect(res.result).to.exist(); - expect(res.statusCode).to.equal(200); - expect(res.result).to.equal('test+
\n

Hapi

\n
\n'); - done(); - }); - }); - - it('errors on missing layout', function (done) { - - var server = new Hapi.Server({ minimal: true, debug: false }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - engines: { 'html': require('handlebars') }, - path: __dirname + '/templates', - layout: 'missingLayout' - }); - - server.route({ method: 'GET', path: '/', handler: { view: { template: 'valid/test', context: { title: 'test', message: 'Hapi' } } } }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(500); - done(); - }); - }); - - it('errors on invalid layout', function (done) { - - var server = new Hapi.Server({ minimal: true, debug: false }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - engines: { 'html': require('handlebars') }, - path: __dirname + '/templates', - layout: 'invalidLayout' - }); - - server.route({ method: 'GET', path: '/', handler: { view: { template: 'valid/test', context: { title: 'test', message: 'Hapi' } } } }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(500); - done(); - }); - }); - - it('returns response without layout', function (done) { - - var server = new Hapi.Server({ minimal: true }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - engines: { 'html': require('handlebars') }, - path: __dirname + '/templates', - layout: true - }); - - server.route({ method: 'GET', path: '/', handler: { view: { template: 'valid/test', context: { title: 'test', message: 'Hapi' }, options: { layout: false } } } }); - - server.inject('/', function (res) { - - expect(res.result).to.exist(); - expect(res.statusCode).to.equal(200); - expect(res.result).to.equal('
\n

Hapi

\n
\n'); - done(); - }); - }); - - it('errors on layoutKeyword conflict', function (done) { - - var server = new Hapi.Server({ minimal: true, debug: false }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - engines: { 'html': require('handlebars') }, - path: __dirname + '/templates/valid', - layout: true - }); - - server.route({ method: 'GET', path: '/', handler: { view: { template: 'test', context: { message: 'Hello, World!', content: 'fail' } } } }); - - server.inject('/', function (res) { - - expect(res.result).to.exist(); - expect(res.statusCode).to.equal(500); - done(); - }); - }); - - it('errors absolute path given and allowAbsolutePath is false (by default)', function (done) { - - var server = new Hapi.Server({ minimal: true, debug: false }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - engines: { 'html': require('handlebars') }, - path: __dirname + '/templates/valid', - layout: true - }); - - server.route({ method: 'GET', path: '/', handler: { view: { template: 'test', context: { title: 'test', message: 'Hapi' }, options: { path: __dirname + '/templates/valid/invalid' } } } }); - - server.inject('/', function (res) { - - expect(res.result).to.exist(); - expect(res.statusCode).to.equal(500); - done(); - }); - }); - }); - - describe('with multiple engines', function () { - - it('renders handlebars template', function (done) { - - var server = new Hapi.Server({ minimal: true }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - path: __dirname + '/templates/valid', - engines: { - 'html': require('handlebars'), - 'jade': require('jade'), - 'hbar': { - module: { - compile: function (engine) { return engine.compile; } - } - } - } - }); - - server.route({ method: 'GET', path: '/', handler: { view: { template: 'test.html', context: { message: 'Hello World!' } } } }); - - server.inject('/', function (res) { - - expect(res.result).to.exist(); - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('renders jade template', function (done) { - - var server = new Hapi.Server({ minimal: true }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - path: __dirname + '/templates/valid', - engines: { - 'html': require('handlebars'), - 'jade': require('jade'), - 'hbar': { - module: { - compile: function (engine) { return engine.compile; } - } - } - } - }); - - server.route({ method: 'GET', path: '/', handler: { view: { template: 'testMulti.jade', context: { message: 'Hello World!' } } } }); - - server.inject('/', function (res) { - - expect(res.result).to.exist(); - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('returns 500 on unknown extension', function (done) { - - var server = new Hapi.Server({ minimal: true, debug: false }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - path: __dirname + '/templates/valid', - engines: { - 'html': require('handlebars'), - 'jade': require('jade'), - 'hbar': { - module: { - compile: function (engine) { return engine.compile; } - } - } - } - }); - - server.route({ method: 'GET', path: '/', handler: { view: { template: 'test', context: { message: 'Hello World!' } } } }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(500); - done(); - }); - }); - - it('returns 500 on missing extension engine', function (done) { - - var server = new Hapi.Server({ minimal: true, debug: false }); - server.connection(); - server.register(Vision, Hoek.ignore); - server.views({ - path: __dirname + '/templates/valid', - engines: { - 'html': require('handlebars'), - 'jade': require('jade'), - 'hbar': { - module: { - compile: function (engine) { return engine.compile; } - } - } - } - }); - - server.route({ method: 'GET', path: '/', handler: { view: { template: 'test.xyz', context: { message: 'Hello World!' } } } }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(500); - done(); - }); - }); - }); - - describe('render()', function () { - - it('renders with async compile', function (done) { - - var views = new Manager({ - path: __dirname + '/templates', - engines: { - html: { - compileMode: 'async', - module: { - compile: function (string, options, callback) { - - var compiled = Handlebars.compile(string, options); - var renderer = function (context, opt, next) { - - return next(null, compiled(context, opt)); - }; - - return callback(null, renderer); - } - } - } - } - }); - - views.render('valid/test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { - - expect(rendered).to.exist(); - expect(rendered).to.contain('Hapi'); - done(); - }); - }); - - it('errors on sync compile that throws', function (done) { - - var views = new Manager({ - path: __dirname + '/templates', - engines: { - html: { - compileMode: 'sync', - module: { - compile: function (string, options) { - - throw (new Error('Bad bad view')); - } - } - } - } - }); - - views.render('valid/test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { - - expect(err).to.exist(); - expect(err.message).to.equal('Bad bad view'); - done(); - }); - }); - - it('allows valid (no layouts)', function (done) { - - var testView = new Manager({ - engines: { html: require('handlebars') }, - path: __dirname + '/templates', - layout: false - }); - - testView.render('valid/test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { - - expect(rendered).to.exist(); - expect(rendered).to.contain('Hapi'); - done(); - }); - }); - - it('renders without context', function (done) { - - var testView = new Manager({ - engines: { html: require('handlebars') }, - path: __dirname + '/templates' - }); - - testView.render('valid/test', null, null, function (err, rendered, config) { - - expect(rendered).to.exist(); - expect(rendered).to.equal('
\n

\n
\n'); - done(); - }); - }); - - it('renders without handler/global-context (with layout)', function (done) { - - var testView = new Manager({ - engines: { html: require('handlebars') }, - path: __dirname + '/templates', - layout: true - }); - - testView.render('valid/test', null, null, function (err, rendered, config) { - - expect(rendered).to.exist(); - expect(rendered).to.contain('
\n

\n
\n'); - done(); - }); - }); - - it('renders with a global context object', function (done) { - - var testView = new Manager({ - engines: { html: require('handlebars') }, - path: __dirname + '/templates', - - context: { - message: 'default message', - - query: { - test: 'global' - } - } - }); - - testView.render('valid/testContext', null, null, function (err, rendered, config) { - - expect(rendered).to.exist(); - expect(rendered).to.contain('

global

'); - expect(rendered).to.contain('

default message

'); - done(); - }); - }); - - it('overrides the global context object with local values', function (done) { - - var testView = new Manager({ - engines: { html: require('handlebars') }, - path: __dirname + '/templates', - - context: { - message: 'default message', - - query: { - test: 'global' - } - } - }); - - testView.render('valid/testContext', { message: 'override' }, null, function (err, rendered, config) { - - expect(rendered).to.exist(); - expect(rendered).to.contain('

global

'); - expect(rendered).to.contain('

override

'); - done(); - }); - }); - - it('renders with a global context function', function (done) { - - var testView = new Manager({ - engines: { html: require('handlebars') }, - path: __dirname + '/templates', - - context: function () { - - return { - message: 'default message', - - query: { - test: 'global' - } - }; - } - }); - - testView.render('valid/testContext', null, null, function (err, rendered, config) { - - expect(rendered).to.exist(); - expect(rendered).to.contain('

global

'); - expect(rendered).to.contain('

default message

'); - done(); - }); - }); - - it('overrides the global context function values with local values', function (done) { - - var testView = new Manager({ - engines: { html: require('handlebars') }, - path: __dirname + '/templates', - - context: function () { - - return { - message: 'default message', - - query: { - test: 'global' - } - }; - } - }); - - testView.render('valid/testContext', { message: 'override' }, null, function (err, rendered, config) { - - expect(rendered).to.exist(); - expect(rendered).to.contain('

global

'); - expect(rendered).to.contain('

override

'); - done(); - }); - }); - - it('uses specified default ext', function (done) { - - var testView = new Manager({ - defaultExtension: 'html', - engines: { html: require('handlebars'), jade: Jade }, - path: __dirname + '/templates' - }); - - testView.render('valid/test', null, null, function (err, rendered, config) { - - expect(rendered).to.exist(); - expect(rendered).to.equal('
\n

\n
\n'); - done(); - }); - }); - - it('allows relative path with no base', function (done) { - - var testView = new Manager({ - engines: { html: require('handlebars') }, - path: './test/templates', - layout: false - }); - - testView.render('valid/test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { - - expect(rendered).to.exist(); - expect(rendered).to.equal('
\n

Hapi

\n
\n'); - done(); - }); - }); - - it('allows multiple relative paths with no base', function (done) { - - var testView = new Manager({ - engines: { html: require('handlebars') }, - path: ['./test/templates/layout', './test/templates/valid'], - layout: false - }); - - testView.render('test', { message: 'Hapi' }, null, function (err, rendered, config) { - - expect(rendered).to.exist(); - expect(rendered).to.contain('

Hapi

'); - done(); - }); - }); - - it('allows multiple relative paths with a base', function (done) { - - var testView = new Manager({ - engines: { html: require('handlebars') }, - relativeTo: __dirname + '/templates', - path: ['layout', 'valid'], - layout: false - }); - - testView.render('test', { message: 'Hapi' }, null, function (err, rendered, config) { - - expect(rendered).to.exist(); - expect(rendered).to.contain('

Hapi

'); - done(); - }); - }); - - it('uses the first matching template', function (done) { - - var testView = new Manager({ - engines: { html: require('handlebars') }, - relativeTo: __dirname + '/templates', - path: ['valid', 'invalid'], - layout: false - }); - - testView.render('test', { message: 'Hapi' }, null, function (err, rendered, config) { - - expect(rendered).to.exist(); - expect(rendered).to.contain('

Hapi

'); - done(); - }); - }); - - it('allows multiple absolute paths', function (done) { - - var testView = new Manager({ - engines: { html: require('handlebars') }, - path: [__dirname + '/templates/layout', __dirname + '/templates/valid'], - layout: false - }); - - testView.render('test', { message: 'Hapi' }, null, function (err, rendered, config) { - - expect(rendered).to.exist(); - expect(rendered).to.contain('

Hapi

'); - done(); - }); - }); - - it('allows valid (with layouts)', function (done) { - - var testViewWithLayouts = new Manager({ - engines: { html: require('handlebars') }, - path: __dirname + '/templates', - layout: true - }); - - testViewWithLayouts.render('valid/test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { - - expect(rendered).to.exist(); - expect(rendered).to.contain('Hapi'); - done(); - }); - }); - - it('allows absolute path', function (done) { - - var testViewWithLayouts = new Manager({ - engines: { html: require('handlebars') }, - path: __dirname + '/templates', - layout: __dirname + '/templates/layout', - allowAbsolutePaths: true - }); - - testViewWithLayouts.render('valid/test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { - - expect(rendered).to.exist(); - expect(rendered).to.contain('Hapi'); - done(); - }); - }); - - it('errors on invalid layout', function (done) { - - var views = new Manager({ - engines: { html: require('handlebars') }, - path: __dirname + '/templates', - layout: 'badlayout' - }); - - views.render('valid/test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { - - expect(err).to.exist(); - expect(err.message).to.equal('Parse error on line 1:\n{{}\n--^\nExpecting \'ID\', \'DATA\', got \'INVALID\': Parse error on line 1:\n{{}\n--^\nExpecting \'ID\', \'DATA\', got \'INVALID\''); - done(); - }); - }); - - it('errors on layout compile error', function (done) { - - var views = new Manager({ - engines: { html: require('handlebars') }, - path: __dirname + '/templates', - layout: 'layout' - }); - - var layout = __dirname + '/templates/layout.html'; - var mode = Fs.statSync(layout).mode; - - Fs.chmodSync(layout, '0300'); - views.render('valid/test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { - - try { - expect(err).to.exist(); - expect(err.message).to.contain('Failed to read view file'); - } - finally { - Fs.chmodSync(layout, mode); - } - done(); - }); - }); - - it('errors on invalid layout path', function (done) { - - var views = new Manager({ - engines: { html: require('handlebars') }, - path: __dirname + '/templates', - layout: '/badlayout' - }); - - views.render('valid/test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { - - expect(err).to.exist(); - expect(err.message).to.equal('Absolute paths are not allowed in views'); - done(); - }); - }); - - it('allows multiple layout paths', function (done) { - - var views = new Manager({ - engines: { html: require('handlebars') }, - relativeTo: __dirname + '/templates', - path: 'valid', - layoutPath: ['invalid', 'layout'], - layout: 'elsewhere' - }); - - views.render('test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { - - expect(err).not.to.exist(); - expect(rendered).to.contain('Hapi'); - done(); - }); - }); - - it('uses the first matching layout', function (done) { - - var views = new Manager({ - engines: { html: require('handlebars') }, - relativeTo: __dirname, - path: 'templates/valid', - layoutPath: ['templates', 'templates/invalid'], - layout: true - }); - - views.render('test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { - - expect(err).not.to.exist(); - expect(rendered).to.contain('Hapi'); - done(); - }); - }); - - it('allows valid jade layouts', function (done) { - - var testViewWithJadeLayouts = new Manager({ - engines: { jade: Jade }, - path: __dirname + '/templates' + '/valid/', - layout: true - }); - - testViewWithJadeLayouts.render('index', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { - - expect(rendered).to.contain('Hapi'); - done(); - }); - }); - - it('should work and not throw without jade layouts', function (done) { - - var testViewWithoutJadeLayouts = new Manager({ - engines: { jade: Jade }, - path: __dirname + '/templates' + '/valid/', - layout: false - }); - - testViewWithoutJadeLayouts.render('test', { title: 'test', message: 'Hapi Message' }, null, function (err, rendered, config) { - - expect(rendered).to.contain('Hapi Message'); - done(); - }); - }); - - it('allows relativeTo, template name, and no path', function (done) { - - var views = new Manager({ engines: { html: require('handlebars') } }); - views.render('test', { title: 'test', message: 'Hapi' }, { relativeTo: __dirname + '/templates/valid' }, function (err, rendered, config) { - - expect(rendered).to.exist(); - expect(rendered).to.contain('Hapi'); - done(); - }); - }); - - it('errors when referencing non existant partial (with layouts)', function (done) { - - var testViewWithLayouts = new Manager({ - engines: { html: require('handlebars') }, - path: __dirname + '/templates', - layout: true - }); - - testViewWithLayouts.render('invalid/test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { - - expect(err).to.exist(); - done(); - }); - }); - - it('errors when referencing non existant partial (no layouts)', function (done) { - - var testView = new Manager({ - engines: { html: require('handlebars') }, - path: __dirname + '/templates', - layout: false - }); - - testView.render('invalid/test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { - - expect(err).to.exist(); - done(); - }); - - }); - - it('errors if context uses layoutKeyword as a key', function (done) { - - var testViewWithLayouts = new Manager({ - engines: { html: require('handlebars') }, - path: __dirname + '/templates', - layout: true - }); - - var opts = { title: 'test', message: 'Hapi', content: 1 }; - testViewWithLayouts.render('valid/test', opts, null, function (err, rendered, config) { - - expect(err).to.exist(); - done(); - }); - }); - - it('errors on compile error (invalid template code)', function (done) { - - var testView = new Manager({ - engines: { html: require('handlebars') }, - path: __dirname + '/templates', - layout: false - }); - - testView.render('invalid/badmustache', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { - - expect(err instanceof Error).to.equal(true); - done(); - }); - }); - - it('loads partials and be able to render them', function (done) { - - var tempView = new Manager({ - engines: { html: { module: Handlebars.create() } }, // Clear environment from other tests - path: __dirname + '/templates/valid', - partialsPath: __dirname + '/templates/valid/partials' - }); - - tempView.render('testPartials', {}, null, function (err, rendered, config) { - - expect(rendered).to.equal(' Nav:|'); - done(); - }); - }); - - it('normalizes full partial name (windows)', function (done) { - - var tempView = new Manager({ - engines: { html: { module: Handlebars.create() } }, // Clear environment from other tests - path: __dirname + '/templates/valid', - partialsPath: __dirname + '/templates/valid/partials' - }); - - tempView.render('testPartialsName', {}, null, function (err, rendered, config) { - - expect(rendered).to.equal(' Nav:|'); - done(); - }); - }); - - it('loads partials from relative path without base', function (done) { - - var tempView = new Manager({ - engines: { html: { module: Handlebars.create() } }, // Clear environment from other tests - path: __dirname + '/templates/valid', - partialsPath: './test/templates/valid/partials' - }); - - tempView.render('testPartials', {}, null, function (err, rendered, config) { - - expect(rendered).to.equal(' Nav:|'); - done(); - }); - }); - - it('loads partals from multiple relative paths without base', function (done) { - - var tempView = new Manager({ - engines: { html: { module: Handlebars.create() } }, // Clear environment from other tests - path: __dirname + '/templates/valid', - partialsPath: ['./test/templates/invalid', './test/templates/valid/partials'] - }); - - tempView.render('testPartials', {}, null, function (err, rendered, config) { - - expect(rendered).to.equal(' Nav:|'); - done(); - }); - }); - - it('loads partals from multiple relative paths with base', function (done) { - - var tempView = new Manager({ - engines: { html: { module: Handlebars.create() } }, // Clear environment from other tests - relativeTo: __dirname + '/templates', - path: 'valid', - partialsPath: ['invalid', 'valid/partials'] - }); - - tempView.render('testPartials', {}, null, function (err, rendered, config) { - - expect(rendered).to.equal(' Nav:|'); - done(); - }); - }); - - it('loads partials from multiple absolute paths', function (done) { - - var tempView = new Manager({ - engines: { html: { module: Handlebars.create() } }, // Clear environment from other tests - path: __dirname + '/templates/valid', - partialsPath: [__dirname + '/templates/invalid', __dirname + '/templates/valid/partials'] - }); - - tempView.render('testPartials', {}, null, function (err, rendered, config) { - - expect(rendered).to.equal(' Nav:|'); - done(); - }); - }); - - it('loads partials from relative path without base (no dot)', function (done) { - - var tempView = new Manager({ - engines: { html: { module: Handlebars.create() } }, // Clear environment from other tests - path: __dirname + '/templates/valid', - partialsPath: 'test/templates/valid/partials' - }); - - tempView.render('testPartials', {}, null, function (err, rendered, config) { - - expect(rendered).to.equal(' Nav:|'); - done(); - }); - }); - - it('loads partials and render them EVEN if viewsPath has trailing slash', function (done) { - - var tempView = new Manager({ - engines: { html: { module: Handlebars.create() } }, // Clear environment from other tests - path: __dirname + '/templates/valid', - partialsPath: __dirname + '/templates/valid/partials/' - }); - - tempView.render('testPartials', {}, null, function (err, rendered, config) { - - expect(rendered).to.exist(); - expect(rendered.length).above(1); - done(); - }); - }); - - it('skips loading partials and helpers if engine does not support them', function (done) { - - var tempView = new Manager({ - path: __dirname + '/templates/valid', - partialsPath: __dirname + '/templates/valid/partials', - helpersPath: __dirname + '/templates/valid/helpers', - engines: { html: Jade } - }); - - tempView.render('testPartials', {}, null, function (err, rendered, config) { - - expect(rendered).to.equal('Nav:{{> nav}}|{{> nested/nav}}'); - done(); - }); - }); - - it('loads helpers and render them', function (done) { - - var tempView = new Manager({ - engines: { html: { module: Handlebars.create() } }, // Clear environment from other tests - path: __dirname + '/templates/valid', - helpersPath: __dirname + '/templates/valid/helpers' - }); - - tempView.render('testHelpers', { something: 'uppercase' }, null, function (err, rendered, config) { - - expect(rendered).to.equal('

This is all UPPERCASE and this is how we like it!

'); - done(); - }); - }); - - it('loads helpers and render them when helpersPath ends with a slash', function (done) { - - var tempView = new Manager({ - engines: { html: { module: Handlebars.create() } }, // Clear environment from other tests - path: __dirname + '/templates/valid', - helpersPath: __dirname + '/templates/valid/helpers/' - }); - - tempView.render('testHelpers', { something: 'uppercase' }, null, function (err, rendered, config) { - - expect(rendered).to.equal('

This is all UPPERCASE and this is how we like it!

'); - done(); - }); - }); - - it('loads helpers using relative paths', function (done) { - - var tempView = new Manager({ - engines: { html: { module: Handlebars.create() } }, // Clear environment from other tests - relativeTo: './test/templates', - path: './valid', - helpersPath: './valid/helpers' - }); - - tempView.render('testHelpers', { something: 'uppercase' }, null, function (err, rendered, config) { - - expect(rendered).to.equal('

This is all UPPERCASE and this is how we like it!

'); - done(); - }); - }); - - it('loads helpers from multiple paths without a base', function (done) { - - var tempView = new Manager({ - engines: { html: { module: Handlebars.create() } }, // Clear environment from other tests - path: './test/templates/valid', - helpersPath: ['./test/templates/valid/helpers/tools', './test/templates/valid/helpers'] - }); - - tempView.render('testHelpers', { something: 'uppercase' }, null, function (err, rendered, config) { - - expect(rendered).to.equal('

This is all UPPERCASE and this is how we like it!

'); - done(); - }); - }); - - it('loads helpers from multiple paths with a base', function (done) { - - var tempView = new Manager({ - engines: { html: { module: Handlebars.create() } }, // Clear environment from other tests - relativeTo: './test/templates', - path: './valid', - helpersPath: ['./valid/helpers/tools', './valid/helpers'] - }); - - tempView.render('testHelpers', { something: 'uppercase' }, null, function (err, rendered, config) { - - expect(rendered).to.equal('

This is all UPPERCASE and this is how we like it!

'); - done(); - }); - }); - - it('loads helpers using relative paths (without dots)', function (done) { - - var tempView = new Manager({ - engines: { html: { module: Handlebars.create() } }, // Clear environment from other tests - relativeTo: 'test/templates', - path: 'valid', - helpersPath: 'valid/helpers' - }); - - tempView.render('testHelpers', { something: 'uppercase' }, null, function (err, rendered, config) { - - expect(rendered).to.equal('

This is all UPPERCASE and this is how we like it!

'); - done(); - }); - }); - - it('reuses cached compilation', function (done) { - - var gen = 0; - var views = new Manager({ - path: __dirname + '/templates', - engines: { - html: { - compileMode: 'async', - module: { - compile: function (string, options, callback) { - - ++gen; - var compiled = Handlebars.compile(string, options); - var renderer = function (context, opt, next) { - - return next(null, compiled(context, opt)); - }; - - return callback(null, renderer); - } - } - } - } - }); - - views.render('valid/test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { - - expect(rendered).to.exist(); - expect(rendered).to.contain('Hapi'); - - views.render('valid/test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { - - expect(rendered).to.exist(); - expect(rendered).to.contain('Hapi'); - - expect(gen).to.equal(1); - done(); - }); - }); - }); - - it('disables caching', function (done) { - - var gen = 0; - var views = new Manager({ - path: __dirname + '/templates', - engines: { - html: { - compileMode: 'async', - module: { - compile: function (string, options, callback) { - - ++gen; - var compiled = Handlebars.compile(string, options); - var renderer = function (context, opt, next) { - - return next(null, compiled(context, opt)); - }; - - return callback(null, renderer); - } - } - } - }, - isCached: false - }); - - views.render('valid/test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { - - expect(rendered).to.exist(); - expect(rendered).to.contain('Hapi'); - - views.render('valid/test', { title: 'test', message: 'Hapi' }, null, function (err, rendered, config) { - - expect(rendered).to.exist(); - expect(rendered).to.contain('Hapi'); - - expect(gen).to.equal(2); - done(); - }); - }); - }); - }); - - describe('_response()', function () { - - it('sets Content-Type', function (done) { - - var server = new Hapi.Server({ minimal: true }); - server.register(Vision, Hoek.ignore); - server.connection(); - server.views({ - engines: { html: require('handlebars') }, - path: __dirname + '/templates/valid' - }); - - var handler = function (request, reply) { - - return reply.view('test.html', { message: 'hi' }); - }; - - server.route({ method: 'GET', path: '/', handler: handler }); - server.inject('/', function (res) { - - expect(res.headers['content-type']).to.contain('text/html'); - done(); - }); - }); - - it('does not override Content-Type', function (done) { - - var server = new Hapi.Server({ minimal: true }); - server.register(Vision, Hoek.ignore); - server.connection(); - - server.views({ - engines: { html: require('handlebars') }, - path: __dirname + '/templates/valid' - }); - - var handler = function (request, reply) { - - return reply.view('test.html', { message: 'hi' }).type('text/plain'); - }; - - server.route({ method: 'GET', path: '/', handler: handler }); - server.inject('/', function (res) { - - expect(res.headers['content-type']).to.contain('text/plain'); - done(); - }); - }); - - it('errors on invalid template', function (done) { - - var server = new Hapi.Server({ minimal: true, debug: false }); - server.register(Vision, Hoek.ignore); - server.connection(); - server.views({ - engines: { html: require('handlebars') }, - path: __dirname + '/templates/invalid' - }); - - var handler = function (request, reply) { - - return reply.view('test.html', { message: 'hi' }); - }; - - server.route({ method: 'GET', path: '/', handler: handler }); - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(500); - done(); - }); - }); - }); -}); diff --git a/node_modules/hapi/node_modules/vision/test/templates/badlayout.html b/node_modules/hapi/node_modules/vision/test/templates/badlayout.html deleted file mode 100755 index b9669c0..0000000 --- a/node_modules/hapi/node_modules/vision/test/templates/badlayout.html +++ /dev/null @@ -1 +0,0 @@ -{{} \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/invalid/badmustache.html b/node_modules/hapi/node_modules/vision/test/templates/invalid/badmustache.html deleted file mode 100755 index 5bdc36d..0000000 --- a/node_modules/hapi/node_modules/vision/test/templates/invalid/badmustache.html +++ /dev/null @@ -1,2 +0,0 @@ -}}!} -{{invalid } \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/invalid/layout.html b/node_modules/hapi/node_modules/vision/test/templates/invalid/layout.html deleted file mode 100755 index b9669c0..0000000 --- a/node_modules/hapi/node_modules/vision/test/templates/invalid/layout.html +++ /dev/null @@ -1 +0,0 @@ -{{} \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/invalid/test.html b/node_modules/hapi/node_modules/vision/test/templates/invalid/test.html deleted file mode 100755 index 2c8246f..0000000 --- a/node_modules/hapi/node_modules/vision/test/templates/invalid/test.html +++ /dev/null @@ -1,3 +0,0 @@ -
-

{{> message}}

-
diff --git a/node_modules/hapi/node_modules/vision/test/templates/layout.html b/node_modules/hapi/node_modules/vision/test/templates/layout.html deleted file mode 100755 index b52a914..0000000 --- a/node_modules/hapi/node_modules/vision/test/templates/layout.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - {{title}} - - - {{{ content }}} - - diff --git a/node_modules/hapi/node_modules/vision/test/templates/layout/elsewhere.html b/node_modules/hapi/node_modules/vision/test/templates/layout/elsewhere.html deleted file mode 100755 index 64570f8..0000000 --- a/node_modules/hapi/node_modules/vision/test/templates/layout/elsewhere.html +++ /dev/null @@ -1 +0,0 @@ -{{title}}+{{{ content }}} \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/otherLayout.html b/node_modules/hapi/node_modules/vision/test/templates/otherLayout.html deleted file mode 100755 index 6de1d10..0000000 --- a/node_modules/hapi/node_modules/vision/test/templates/otherLayout.html +++ /dev/null @@ -1 +0,0 @@ -{{title}}:{{{ content }}} \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/plugin/test.html b/node_modules/hapi/node_modules/vision/test/templates/plugin/test.html deleted file mode 100755 index 73d4029..0000000 --- a/node_modules/hapi/node_modules/vision/test/templates/plugin/test.html +++ /dev/null @@ -1 +0,0 @@ -

{{message}}

\ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/handler.html b/node_modules/hapi/node_modules/vision/test/templates/valid/handler.html deleted file mode 100755 index 0c1ed88..0000000 --- a/node_modules/hapi/node_modules/vision/test/templates/valid/handler.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - {{ payload }} - {{ querystring }} - {{ params.param }} - {{ pre.p }} - - \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/helpers/.hidden.js b/node_modules/hapi/node_modules/vision/test/templates/valid/helpers/.hidden.js deleted file mode 100755 index 211b6ec..0000000 --- a/node_modules/hapi/node_modules/vision/test/templates/valid/helpers/.hidden.js +++ /dev/null @@ -1 +0,0 @@ -throw new Error('Do not load me'); diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/helpers/ignore.js b/node_modules/hapi/node_modules/vision/test/templates/valid/helpers/ignore.js deleted file mode 100755 index 5c40913..0000000 --- a/node_modules/hapi/node_modules/vision/test/templates/valid/helpers/ignore.js +++ /dev/null @@ -1 +0,0 @@ -exports = module.exports = 'not a function'; diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/helpers/tools/lowercase.js b/node_modules/hapi/node_modules/vision/test/templates/valid/helpers/tools/lowercase.js deleted file mode 100755 index e64b95e..0000000 --- a/node_modules/hapi/node_modules/vision/test/templates/valid/helpers/tools/lowercase.js +++ /dev/null @@ -1,4 +0,0 @@ -exports = module.exports = function (context) { - - return context.toLowerCase(); -}; diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/helpers/uppercase.js b/node_modules/hapi/node_modules/vision/test/templates/valid/helpers/uppercase.js deleted file mode 100755 index 7d68936..0000000 --- a/node_modules/hapi/node_modules/vision/test/templates/valid/helpers/uppercase.js +++ /dev/null @@ -1,4 +0,0 @@ -exports = module.exports = function (context) { - - return context.toUpperCase(); -}; diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/index.jade b/node_modules/hapi/node_modules/vision/test/templates/valid/index.jade deleted file mode 100644 index 37fa7f0..0000000 --- a/node_modules/hapi/node_modules/vision/test/templates/valid/index.jade +++ /dev/null @@ -1,4 +0,0 @@ -extends layout - -block content - p= message \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/layout.jade b/node_modules/hapi/node_modules/vision/test/templates/valid/layout.jade deleted file mode 100644 index 658a3e3..0000000 --- a/node_modules/hapi/node_modules/vision/test/templates/valid/layout.jade +++ /dev/null @@ -1,4 +0,0 @@ -html - body - block content - =content \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/options.html b/node_modules/hapi/node_modules/vision/test/templates/valid/options.html deleted file mode 100644 index ce01362..0000000 --- a/node_modules/hapi/node_modules/vision/test/templates/valid/options.html +++ /dev/null @@ -1 +0,0 @@ -hello diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/partials/.ignore.html b/node_modules/hapi/node_modules/vision/test/templates/valid/partials/.ignore.html deleted file mode 100644 index e69de29..0000000 diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/partials/nav.html b/node_modules/hapi/node_modules/vision/test/templates/valid/partials/nav.html deleted file mode 100755 index fb91898..0000000 --- a/node_modules/hapi/node_modules/vision/test/templates/valid/partials/nav.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/partials/nested/deep/nav.html b/node_modules/hapi/node_modules/vision/test/templates/valid/partials/nested/deep/nav.html deleted file mode 100755 index f8024d8..0000000 --- a/node_modules/hapi/node_modules/vision/test/templates/valid/partials/nested/deep/nav.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/partials/nested/nav.html b/node_modules/hapi/node_modules/vision/test/templates/valid/partials/nested/nav.html deleted file mode 100755 index f8024d8..0000000 --- a/node_modules/hapi/node_modules/vision/test/templates/valid/partials/nested/nav.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/test.html b/node_modules/hapi/node_modules/vision/test/templates/valid/test.html deleted file mode 100755 index 92257b3..0000000 --- a/node_modules/hapi/node_modules/vision/test/templates/valid/test.html +++ /dev/null @@ -1,3 +0,0 @@ -
-

{{message}}

-
diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/test.jade b/node_modules/hapi/node_modules/vision/test/templates/valid/test.jade deleted file mode 100644 index e8fee38..0000000 --- a/node_modules/hapi/node_modules/vision/test/templates/valid/test.jade +++ /dev/null @@ -1 +0,0 @@ -p= message \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/testContext.html b/node_modules/hapi/node_modules/vision/test/templates/valid/testContext.html deleted file mode 100755 index 2d6b72b..0000000 --- a/node_modules/hapi/node_modules/vision/test/templates/valid/testContext.html +++ /dev/null @@ -1,4 +0,0 @@ -
-

{{query.test}}

-

{{message}}

-
diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/testHelpers.html b/node_modules/hapi/node_modules/vision/test/templates/valid/testHelpers.html deleted file mode 100755 index 916780b..0000000 --- a/node_modules/hapi/node_modules/vision/test/templates/valid/testHelpers.html +++ /dev/null @@ -1 +0,0 @@ -

This is all {{uppercase this.something}} and this is how we like it!

\ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/testMulti.jade b/node_modules/hapi/node_modules/vision/test/templates/valid/testMulti.jade deleted file mode 100755 index 37fa7f0..0000000 --- a/node_modules/hapi/node_modules/vision/test/templates/valid/testMulti.jade +++ /dev/null @@ -1,4 +0,0 @@ -extends layout - -block content - p= message \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/testPartials.html b/node_modules/hapi/node_modules/vision/test/templates/valid/testPartials.html deleted file mode 100755 index 5a56835..0000000 --- a/node_modules/hapi/node_modules/vision/test/templates/valid/testPartials.html +++ /dev/null @@ -1 +0,0 @@ - Nav:{{> nav}}|{{> nested/nav}} \ No newline at end of file diff --git a/node_modules/hapi/node_modules/vision/test/templates/valid/testPartialsName.html b/node_modules/hapi/node_modules/vision/test/templates/valid/testPartialsName.html deleted file mode 100755 index bae016f..0000000 --- a/node_modules/hapi/node_modules/vision/test/templates/valid/testPartialsName.html +++ /dev/null @@ -1 +0,0 @@ - Nav:{{> nav}}|{{> nested/deep/nav}} \ No newline at end of file diff --git a/node_modules/hapi/node_modules/wreck/.npmignore b/node_modules/hapi/node_modules/wreck/.npmignore deleted file mode 100644 index 77ba16c..0000000 --- a/node_modules/hapi/node_modules/wreck/.npmignore +++ /dev/null @@ -1,18 +0,0 @@ -.idea -*.iml -npm-debug.log -dump.rdb -node_modules -results.tap -results.xml -npm-shrinkwrap.json -config.json -.DS_Store -*/.DS_Store -*/*/.DS_Store -._* -*/._* -*/*/._* -coverage.* -lib-cov - diff --git a/node_modules/hapi/node_modules/wreck/.travis.yml b/node_modules/hapi/node_modules/wreck/.travis.yml deleted file mode 100755 index 047f7e3..0000000 --- a/node_modules/hapi/node_modules/wreck/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: node_js - -node_js: - - 0.10 - diff --git a/node_modules/hapi/node_modules/wreck/CONTRIBUTING.md b/node_modules/hapi/node_modules/wreck/CONTRIBUTING.md deleted file mode 100644 index 2fe9f7c..0000000 --- a/node_modules/hapi/node_modules/wreck/CONTRIBUTING.md +++ /dev/null @@ -1,14 +0,0 @@ -# How to contribute -We welcome contributions from the community and are pleased to have them. Please follow this guide when logging issues or making code changes. - -## Logging Issues -All issues should be created using the [new issue form](https://github.com/hapijs/wreck/issues/new). Clearly describe the issue including steps to reproduce if there are any. Also, make sure to indicate the earliest version that has the issue being reported. - -## Patching Code -Code changes are welcome and should follow the guidelines below. - -* Fork the repository on GitHub. -* Fix the issue ensuring that your code follows the [style guide](https://github.com/hapijs/contrib/blob/master/Style.md). -* Add tests for your new code ensuring that you have 100% code coverage (we can help you reach 100% but will not merge without it). - * Run `make test-cov-html` to generate a report of test coverage -* [Pull requests](http://help.github.com/send-pull-requests/) should be made to the [master branch](https://github.com/hapijs/wreck/tree/master). diff --git a/node_modules/hapi/node_modules/wreck/LICENSE b/node_modules/hapi/node_modules/wreck/LICENSE deleted file mode 100755 index 0d67fed..0000000 --- a/node_modules/hapi/node_modules/wreck/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright (c) 2012-2014, Walmart and other contributors. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * The names of any contributors may not be used to endorse or promote - products derived from this software without specific prior written - permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - * * * - -The complete list of contributors can be found at: https://github.com/hapijs/wreck/graphs/contributors diff --git a/node_modules/hapi/node_modules/wreck/Makefile b/node_modules/hapi/node_modules/wreck/Makefile deleted file mode 100755 index 5404b23..0000000 --- a/node_modules/hapi/node_modules/wreck/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -test: - @node node_modules/lab/bin/lab -test-cov: - @node node_modules/lab/bin/lab -t 100 -test-cov-html: - @node node_modules/lab/bin/lab -r html -o coverage.html - -.PHONY: test test-cov test-cov-html - diff --git a/node_modules/hapi/node_modules/wreck/README.md b/node_modules/hapi/node_modules/wreck/README.md deleted file mode 100755 index dd028e3..0000000 --- a/node_modules/hapi/node_modules/wreck/README.md +++ /dev/null @@ -1,197 +0,0 @@ -![wreck Logo](https://raw.github.com/hapijs/wreck/master/images/wreck.png) - -HTTP Client Utilities - -[![Build Status](https://secure.travis-ci.org/hapijs/wreck.png)](http://travis-ci.org/hapijs/wreck) - -Lead Maintainer: [Wyatt Preul](https://github.com/wpreul) - -## Usage -### Basic -```javascript -var Wreck = require('wreck'); - -Wreck.get('https://google.com/', function (err, res, payload) { - /* do stuff */ -}); -``` - -### Advanced -```javascript -var Wreck = require('wreck'); - -var method = 'GET'; // GET, POST, PUT, DELETE -var uri = 'https://google.com/'; -var readableStream = Wreck.toReadableStream('foo=bar'); - -// all attributes are optional -var options = { - payload: readableStream || 'foo=bar' || new Buffer('foo=bar'), - headers: { /* http headers */ }, - redirects: 3, - timeout: 1000, // 1 second, default: unlimited - maxBytes: 1048576, // 1 MB, default: unlimited - rejectUnauthorized: true || false, - downstreamRes: null, - agent: null, // Node Core http.Agent - secureProtocol: 'SSLv3_method' // The SSL method to use -}; - -var optionalCallback = function (err, res) { - - /* handle err if it exists, in which case res will be undefined */ - - // buffer the response stream - Wreck.read(res, null, function (err, body) { - /* do stuff */ - }); -}; - -var req = Wreck.request(method, uri, options, optionalCallback); -``` - - -### `request(method, uri, [options, [callback]])` - -Initiate an HTTP request. -- `method` - A string specifying the HTTP request method, defaulting to 'GET'. -- `uri` - The URI of the requested resource. -- `options` - An optional configuration object. To omit this argument but still - use a callback, pass `null` in this position. The options object supports the - following optional keys: - - `payload` - The request body as string, Buffer, or Readable Stream. - - `headers` - An object containing request headers. - - `rejectUnauthorized` - [TLS](http://nodejs.org/api/tls.html) flag indicating - whether the client should reject a response from a server with invalid certificates. This cannot be set at the - same time as the `agent` option is set. - - `redirects` - The maximum number of redirects to follow. - - `agent` - Node Core [http.Agent](http://nodejs.org/api/http.html#http_class_http_agent). - Defaults to either `wreck.agents.http` or `wreck.agents.https`. Setting to `false` disables agent pooling. - - `timeout` - The number of milliseconds to wait without receiving a response - before aborting the request. Defaults to unlimited. - - `secureProtocol` - [TLS](http://nodejs.org/api/tls.html) flag indicating the SSL method to use, e.g. `SSLv3_method` - to force SSL version 3. The possible values depend on your installation of OpenSSL. Read the official OpenSSL docs - for possible [SSL_METHODS](http://www.openssl.org/docs/ssl/ssl.html#DEALING_WITH_PROTOCOL_METHODS). -- `callback` - The optional callback function using the signature `function (err, response)` where: - - `err` - Any error that may have occurred during the handling of the request. - - `response` - The [HTTP Incoming Message](http://nodejs.org/api/http.html#http_http_incomingmessage) - object, which is also a readable stream. - -Returns an instance of the node.js [ClientRequest](http://nodejs.org/api/http.html#http_class_http_clientrequest) object. - - -### `read(response, options, callback)` -- `response` - An HTTP Incoming Message object. -- `options` - `null` or a configuration object with the following optional keys: - - `timeout` - The number of milliseconds to wait while reading data before - aborting handling of the response. Defaults to unlimited. - - `json` - A value indicating how to try to parse the payload as JSON. Defaults to `undefined` meaning no parse logic. - - `true`, 'smart' - only try `JSON.parse` if the response indicates a JSON content-type. - - `force` - try `JSON.parse` regardless of the content-type header. - - `maxBytes` - The maximum allowed response payload size. Defaults to unlimited. -- `callback` - The callback function using the signature `function (err, payload)` where: - - `err` - Any error that may have occurred while reading the response. - - `payload` - The payload in the form of a Buffer or (optionally) parsed JavaScript object (JSON). - - -### `get(uri, [options], callback)` - -Convenience method for GET operations. -- `uri` - The URI of the requested resource. -- `options` - Optional config object containing settings for both `request` and - `read` operations. -- `callback` - The callback function using the signature `function (err, response, payload)` where: - - `err` - Any error that may have occurred during handling of the request. - - `response` - The [HTTP Incoming Message](http://nodejs.org/api/http.html#http_http_incomingmessage) - object, which is also a readable stream. - - `payload` - The payload in the form of a Buffer or (optionally) parsed JavaScript object (JSON). - -Returns an instance of the node.js [ClientRequest](http://nodejs.org/api/http.html#http_class_http_clientrequest) object. - - -### `post(uri, [options], callback)` - -Convenience method for POST operations. -- `uri` - The URI of the requested resource. -- `options` - Optional config object containing settings for both `request` and - `read` operations. -- `callback` - The callback function using the signature `function (err, response, payload)` where: - - `err` - Any error that may have occurred during handling of the request. - - `response` - The [HTTP Incoming Message](http://nodejs.org/api/http.html#http_http_incomingmessage) - object, which is also a readable stream. - - `payload` - The payload in the form of a Buffer or (optionally) parsed JavaScript object (JSON). - -Returns an instance of the node.js [ClientRequest](http://nodejs.org/api/http.html#http_class_http_clientrequest) object. - - -### `put(uri, [options], callback)` - -Convenience method for PUT operations. -- `uri` - The URI of the requested resource. -- `options` - Optional config object containing settings for both `request` and - `read` operations. -- `callback` - The callback function using the signature `function (err, response, payload)` where: - - `err` - Any error that may have occurred during handling of the request. - - `response` - The [HTTP Incoming Message](http://nodejs.org/api/http.html#http_http_incomingmessage) - object, which is also a readable stream. - - `payload` - The payload in the form of a Buffer or (optionally) parsed JavaScript object (JSON). - -Returns an instance of the node.js [ClientRequest](http://nodejs.org/api/http.html#http_class_http_clientrequest) object. - - -### `delete(uri, [options], callback)` - -Convenience method for DELETE operations. -- `uri` - The URI of the requested resource. -- `options` - Optional config object containing settings for both `request` and - `read` operations. -- `callback` - The callback function using the signature `function (err, response, payload)` where: - - `err` - Any error that may have occurred during handling of the request. - - `response` - The [HTTP Incoming Message](http://nodejs.org/api/http.html#http_http_incomingmessage) - object, which is also a readable stream. - - `payload` - The payload in the form of a Buffer or (optionally) parsed JavaScript object (JSON). - -Returns an instance of the node.js [ClientRequest](http://nodejs.org/api/http.html#http_class_http_clientrequest) object. - - -### `toReadableStream(payload, [encoding])` - -Creates a [readable stream](http://nodejs.org/api/stream.html#stream_class_stream_readable) -for the provided payload and encoding. -- `payload` - The Buffer or string to be wrapped in a readable stream. -- `encoding` - The encoding to use. Must be a valid Buffer encoding, such as 'utf8' or 'ascii'. - -```javascript -var stream = Wreck.toReadableStream(new Buffer('Hello', 'ascii'), 'ascii'); -var read = stream.read(); -// read -> 'Hello' -``` - -### `parseCacheControl(field)` - -Parses the provided *cache-control* request header value into an object containing -a property for each directive and it's value. Boolean directives, such as "private" -or "no-cache" will be set to the boolean `true`. -- `field` - The header cache control value to be parsed. - -```javascript -var result = Wreck.parseCacheControl('private, max-age=0, no-cache'); -// result.private -> true -// result['max-age'] -> 0 -// result['no-cache'] -> true -``` - -### `agents` - -Object that contains the agents for pooling connections for `http` and `https`. The properties are `http`, `https`, and -`httpsAllowUnauthorized` which is an `https` agent with `rejectUnauthorized` set to true. All agents have `maxSockets` -configured to `Infinity`. They are each instances of the node.js [Agent](http://nodejs.org/api/http.html#http_class_http_agent) -and expose the standard properties. - -For example, the following code demonstrates changing `maxSockets` on the `http` agent. - - ```js - var Wreck = require('wreck'); - - Wreck.agents.http.maxSockets = 20; - ``` diff --git a/node_modules/hapi/node_modules/wreck/images/wreck.png b/node_modules/hapi/node_modules/wreck/images/wreck.png deleted file mode 100755 index 2122a10e28dcd80b258a4492a5a851da3fbee7fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30090 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ξqP3x&1C0nTLMyM~6* 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 H5cq!p-1Q?L diff --git a/node_modules/hapi/node_modules/wreck/index.js b/node_modules/hapi/node_modules/wreck/index.js deleted file mode 100755 index 4cc88b3..0000000 --- a/node_modules/hapi/node_modules/wreck/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./lib'); \ No newline at end of file diff --git a/node_modules/hapi/node_modules/wreck/lib/index.js b/node_modules/hapi/node_modules/wreck/lib/index.js deleted file mode 100755 index 8067b6d..0000000 --- a/node_modules/hapi/node_modules/wreck/lib/index.js +++ /dev/null @@ -1,404 +0,0 @@ - -// Load modules - -var Url = require('url'); -var Http = require('http'); -var Https = require('https'); -var Stream = require('stream'); -var Hoek = require('hoek'); -var Boom = require('boom'); -var Payload = require('./payload'); -var Recorder = require('./recorder'); -var Tap = require('./tap'); - - -// Declare internals - -var internals = {}; - - -exports.agents = { - https: new Https.Agent({ maxSockets: Infinity }), - http: new Http.Agent({ maxSockets: Infinity }), - httpsAllowUnauthorized: new Https.Agent({ maxSockets: Infinity, rejectUnauthorized: false }) -}; - - -exports.request = function (method, url, options, callback, _trace) { - - options = options || {}; - - Hoek.assert(options.payload === null || options.payload === undefined || typeof options.payload === 'string' || - options.payload instanceof Stream || Buffer.isBuffer(options.payload), - 'options.payload must be a string, a Buffer, or a Stream'); - - Hoek.assert((options.agent === undefined || options.agent === null) || (typeof options.rejectUnauthorized !== 'boolean'), - 'options.agent cannot be set to an Agent at the same time as options.rejectUnauthorized is set'); - - // Setup request - - var uri = Url.parse(url); - var timeoutId; - uri.method = method.toUpperCase(); - uri.headers = options.headers; - - var payloadSupported = (uri.method !== 'GET' && uri.method !== 'HEAD' && options.payload !== null && options.payload !== undefined); - if (payloadSupported && - (typeof options.payload === 'string' || Buffer.isBuffer(options.payload))) { - - uri.headers = Hoek.clone(uri.headers) || {}; - uri.headers['Content-Length'] = Buffer.isBuffer(options.payload) ? options.payload.length : Buffer.byteLength(options.payload); - } - - var redirects = (options.hasOwnProperty('redirects') ? options.redirects : false); // Needed to allow 0 as valid value when passed recursively - - _trace = (_trace || []); - _trace.push({ method: uri.method, url: url }); - - var client = (uri.protocol === 'https:' ? Https : Http); - - if (options.rejectUnauthorized !== undefined && uri.protocol === 'https:') { - uri.agent = options.rejectUnauthorized ? exports.agents.https : exports.agents.httpsAllowUnauthorized; - } - else if (options.agent || options.agent === false) { - uri.agent = options.agent; - } - else { - uri.agent = uri.protocol === 'https:' ? exports.agents.https : exports.agents.http; - } - - if (options.secureProtocol !== undefined) { - uri.secureProtocol = options.secureProtocol; - } - - var req = client.request(uri); - - var shadow = null; // A copy of the streamed request payload when redirects are enabled - - // Register handlers - - var finish = function (err, res) { - - if (!callback || err) { - if (res) { - res.destroy(); - } - - req.abort(); - } - - req.removeListener('response', onResponse); - req.removeListener('error', onError); - req.on('error', Hoek.ignore); - clearTimeout(timeoutId); - - if (callback) { - return callback(err, res); - } - }; - - finish = Hoek.once(finish); - - var onError = function (err) { - - err.trace = _trace; - return finish(Boom.badGateway('Client request error', err)); - }; - - req.once('error', onError); - - var onResponse = function (res) { - - // Pass-through response - - if (redirects === false || - [301, 302, 307, 308].indexOf(res.statusCode) === -1) { - - return finish(null, res); - } - - // Redirection - - var redirectMethod = (res.statusCode === 301 || res.statusCode === 302 ? 'GET' : uri.method); - var location = res.headers.location; - - res.destroy(); - - if (redirects === 0) { - return finish(Boom.badGateway('Maximum redirections reached', _trace)); - } - - if (!location) { - return finish(Boom.badGateway('Received redirection without location', _trace)); - } - - if (!/^https?:/i.test(location)) { - location = Url.resolve(uri.href, location); - } - - var redirectOptions = { - headers: options.headers, - payload: shadow || options.payload, // shadow must be ready at this point if set - redirects: --redirects - }; - - return exports.request(redirectMethod, location, redirectOptions, finish, _trace); - }; - - req.once('response', onResponse); - - if (options.timeout) { - timeoutId = setTimeout(function () { - - return finish(Boom.gatewayTimeout('Client request timeout')); - }, options.timeout); - } - - // Write payload - - if (payloadSupported) { - if (options.payload instanceof Stream) { - var stream = options.payload; - - if (redirects) { - var collector = new Tap(); - collector.once('finish', function () { - - shadow = collector.collect(); - }); - - stream = options.payload.pipe(collector); - } - - stream.pipe(req); - return; - } - - req.write(options.payload); - } - - // Finalize request - - req.end(); - - return req; -}; - - -// read() - -exports.read = function (res, options, callback) { - - options = options || {}; - - // Set stream timeout - - var clientTimeout = options.timeout; - var clientTimeoutId = null; - - if (clientTimeout && - clientTimeout > 0) { - - clientTimeoutId = setTimeout(function () { - - finish(Boom.clientTimeout()); - }, clientTimeout); - } - - // Finish once - - var finish = function (err, buffer) { - - clearTimeout(clientTimeoutId); - reader.removeListener('error', onReaderError); - reader.removeListener('finish', onReaderFinish); - res.removeListener('error', onResError); - res.removeListener('close', onResClose); - res.on('error', Hoek.ignore); - - if (err || !options.json) { - return callback(err, buffer); - } - - // Parse JSON - - var result; - if (buffer.length === 0) { - return callback(null, null); - } - - if (options.json === 'force') { - result = internals.tryParseBuffer(buffer); - return callback(result.err, result.json); - } - - // mode is "smart" or true - - var contentType = (res.headers && res.headers['content-type']) || ''; - var mime = contentType.split(';')[0].trim().toLowerCase(); - - if (mime !== 'application/json') { - return callback(null, buffer); - } - - result = internals.tryParseBuffer(buffer); - return callback(result.err, result.json); - }; - - finish = Hoek.once(finish); - - // Hander errors - - var onResError = function (err) { - - return finish(Boom.internal('Payload stream error', err)); - }; - - var onResClose = function () { - - return finish(Boom.internal('Payload stream closed prematurely')); - }; - - res.once('error', onResError); - res.once('close', onResClose); - - // Read payload - - var reader = new Recorder({ maxBytes: options.maxBytes }); - - var onReaderError = function (err) { - - res.destroy(); - return finish(err); - }; - - reader.once('error', onReaderError); - - var onReaderFinish = function () { - - return finish(null, reader.collect()); - }; - - reader.once('finish', onReaderFinish); - - res.pipe(reader); -}; - - -// toReadableStream() - -exports.toReadableStream = function (payload, encoding) { - - return new Payload(payload, encoding); -}; - - -// parseCacheControl() - -exports.parseCacheControl = function (field) { - - /* - Cache-Control = 1#cache-directive - cache-directive = token [ "=" ( token / quoted-string ) ] - token = [^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+ - quoted-string = "(?:[^"\\]|\\.)*" - */ - - // 1: directive = 2: token 3: quoted-string - var regex = /(?:^|(?:\s*\,\s*))([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)(?:\=(?:([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)|(?:\"((?:[^"\\]|\\.)*)\")))?/g; - - var header = {}; - var err = field.replace(regex, function ($0, $1, $2, $3) { - - var value = $2 || $3; - header[$1] = value ? value.toLowerCase() : true; - return ''; - }); - - if (header['max-age']) { - try { - var maxAge = parseInt(header['max-age'], 10); - if (isNaN(maxAge)) { - return null; - } - - header['max-age'] = maxAge; - } - catch (err) { } - } - - return (err ? null : header); -}; - - -// Shortcuts - -exports.get = function (uri, options, callback) { - - return internals.shortcutWrap('GET', uri, options, callback); -}; - - -exports.post = function (uri, options, callback) { - - return internals.shortcutWrap('POST', uri, options, callback); -}; - - -exports.put = function (uri, options, callback) { - - return internals.shortcutWrap('PUT', uri, options, callback); -}; - - -exports.delete = function (uri, options, callback) { - - return internals.shortcutWrap('DELETE', uri, options, callback); -}; - - -// Wrapper so that shortcut can be optimized with required params -internals.shortcutWrap = function (method, uri /* [options], callback */) { - - var options = (typeof arguments[2] === 'function' ? {} : arguments[2]); - var callback = (typeof arguments[2] === 'function' ? arguments[2] : arguments[3]); - - return internals.shortcut(method, uri, options, callback); -}; - - -internals.shortcut = function (method, uri, options, callback) { - - return exports.request(method, uri, options, function (err, res) { - - if (err) { - return callback(err); - } - - exports.read(res, options, function (err, payload) { - - if (payload instanceof Buffer) { - payload = payload.toString(); - } - - return callback(err, res, payload); - }); - }); -}; - - -internals.tryParseBuffer = function (buffer) { - - var result = { - json: null, - err: null - }; - try { - var json = JSON.parse(buffer.toString()); - result.json = json; - } - catch (err) { - result.err = err; - } - return result; -}; diff --git a/node_modules/hapi/node_modules/wreck/lib/payload.js b/node_modules/hapi/node_modules/wreck/lib/payload.js deleted file mode 100644 index 59a7196..0000000 --- a/node_modules/hapi/node_modules/wreck/lib/payload.js +++ /dev/null @@ -1,42 +0,0 @@ - -// Load modules - -var Hoek = require('hoek'); -var Stream = require('stream'); - - -// Declare internals - -var internals = {}; - - -module.exports = internals.Payload = function (payload, encoding) { - - Stream.Readable.call(this); - - var data = [].concat(payload || ''); - var size = 0; - for (var i = 0, il = data.length; i < il; ++i) { - var chunk = data[i]; - size += chunk.length; - data[i] = Buffer.isBuffer(chunk) ? chunk : new Buffer(chunk); - } - - this._data = Buffer.concat(data, size); - this._position = 0; - this._encoding = encoding || 'utf8'; -}; - -Hoek.inherits(internals.Payload, Stream.Readable); - - -internals.Payload.prototype._read = function (size) { - - var chunk = this._data.slice(this._position, this._position + size); - this.push(chunk, this._encoding); - this._position += chunk.length; - - if (this._position >= this._data.length) { - this.push(null); - } -}; diff --git a/node_modules/hapi/node_modules/wreck/lib/recorder.js b/node_modules/hapi/node_modules/wreck/lib/recorder.js deleted file mode 100644 index 4acf892..0000000 --- a/node_modules/hapi/node_modules/wreck/lib/recorder.js +++ /dev/null @@ -1,44 +0,0 @@ - -// Load modules - -var Boom = require('boom'); -var Hoek = require('hoek'); -var Stream = require('stream'); - - -// Declare internals - -var internals = {}; - - -module.exports = internals.Recorder = function (options) { - - Stream.Writable.call(this); - - this.settings = options; // No need to clone since called internally with new object - this.buffers = []; - this.length = 0; -}; - -Hoek.inherits(internals.Recorder, Stream.Writable); - - -internals.Recorder.prototype._write = function (chunk, encoding, next) { - - if (this.settings.maxBytes && - this.length + chunk.length > this.settings.maxBytes) { - - return this.emit('error', Boom.badRequest('Payload content length greater than maximum allowed: ' + this.settings.maxBytes)); - } - - this.length += chunk.length; - this.buffers.push(chunk); - next(); -}; - - -internals.Recorder.prototype.collect = function () { - - var buffer = (this.buffers.length === 0 ? new Buffer(0) : (this.buffers.length === 1 ? this.buffers[0] : Buffer.concat(this.buffers, this.length))); - return buffer; -}; diff --git a/node_modules/hapi/node_modules/wreck/lib/tap.js b/node_modules/hapi/node_modules/wreck/lib/tap.js deleted file mode 100644 index 3a7aa9e..0000000 --- a/node_modules/hapi/node_modules/wreck/lib/tap.js +++ /dev/null @@ -1,33 +0,0 @@ - -// Load modules - -var Hoek = require('hoek'); -var Stream = require('stream'); -var Payload = require('./payload'); - - -// Declare internals - -var internals = {}; - - -module.exports = internals.Tap = function () { - - Stream.Transform.call(this); - this.buffers = []; -}; - -Hoek.inherits(internals.Tap, Stream.Transform); - - -internals.Tap.prototype._transform = function (chunk, encoding, next) { - - this.buffers.push(chunk); - next(null, chunk); -}; - - -internals.Tap.prototype.collect = function () { - - return new Payload(this.buffers); -}; diff --git a/node_modules/hapi/node_modules/wreck/package.json b/node_modules/hapi/node_modules/wreck/package.json deleted file mode 100644 index 96d2b4d..0000000 --- a/node_modules/hapi/node_modules/wreck/package.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "wreck", - "description": "HTTP Client Utilities", - "version": "5.2.0", - "repository": { - "type": "git", - "url": "git://github.com/hapijs/wreck" - }, - "main": "index", - "keywords": [ - "utilities", - "http", - "client" - ], - "engines": { - "node": ">=0.10.30" - }, - "dependencies": { - "hoek": "2.x.x", - "boom": "2.x.x" - }, - "devDependencies": { - "lab": "5.x.x", - "code": "1.x.x" - }, - "scripts": { - "test": "make test-cov" - }, - "licenses": [ - { - "type": "BSD", - "url": "http://github.com/hapijs/wreck/raw/master/LICENSE" - } - ], - "readme": "![wreck Logo](https://raw.github.com/hapijs/wreck/master/images/wreck.png)\n\nHTTP Client Utilities\n\n[![Build Status](https://secure.travis-ci.org/hapijs/wreck.png)](http://travis-ci.org/hapijs/wreck)\n\nLead Maintainer: [Wyatt Preul](https://github.com/wpreul)\n\n## Usage\n### Basic\n```javascript\nvar Wreck = require('wreck');\n\nWreck.get('https://google.com/', function (err, res, payload) {\n /* do stuff */\n});\n```\n\n### Advanced\n```javascript\nvar Wreck = require('wreck');\n\nvar method = 'GET'; // GET, POST, PUT, DELETE\nvar uri = 'https://google.com/';\nvar readableStream = Wreck.toReadableStream('foo=bar');\n\n// all attributes are optional\nvar options = {\n payload: readableStream || 'foo=bar' || new Buffer('foo=bar'),\n headers: { /* http headers */ },\n redirects: 3,\n timeout: 1000, // 1 second, default: unlimited\n maxBytes: 1048576, // 1 MB, default: unlimited\n rejectUnauthorized: true || false,\n downstreamRes: null,\n agent: null, // Node Core http.Agent\n secureProtocol: 'SSLv3_method' // The SSL method to use\n};\n\nvar optionalCallback = function (err, res) {\n\n /* handle err if it exists, in which case res will be undefined */\n \n // buffer the response stream\n Wreck.read(res, null, function (err, body) {\n /* do stuff */\n });\n};\n\nvar req = Wreck.request(method, uri, options, optionalCallback);\n```\n\n\n### `request(method, uri, [options, [callback]])`\n\nInitiate an HTTP request.\n- `method` - A string specifying the HTTP request method, defaulting to 'GET'.\n- `uri` - The URI of the requested resource.\n- `options` - An optional configuration object. To omit this argument but still\n use a callback, pass `null` in this position. The options object supports the\n following optional keys:\n - `payload` - The request body as string, Buffer, or Readable Stream.\n - `headers` - An object containing request headers.\n - `rejectUnauthorized` - [TLS](http://nodejs.org/api/tls.html) flag indicating\n whether the client should reject a response from a server with invalid certificates. This cannot be set at the\n same time as the `agent` option is set.\n - `redirects` - The maximum number of redirects to follow.\n - `agent` - Node Core [http.Agent](http://nodejs.org/api/http.html#http_class_http_agent).\n Defaults to either `wreck.agents.http` or `wreck.agents.https`. Setting to `false` disables agent pooling.\n - `timeout` - The number of milliseconds to wait without receiving a response\n before aborting the request. Defaults to unlimited.\n - `secureProtocol` - [TLS](http://nodejs.org/api/tls.html) flag indicating the SSL method to use, e.g. `SSLv3_method`\n to force SSL version 3. The possible values depend on your installation of OpenSSL. Read the official OpenSSL docs\n for possible [SSL_METHODS](http://www.openssl.org/docs/ssl/ssl.html#DEALING_WITH_PROTOCOL_METHODS).\n- `callback` - The optional callback function using the signature `function (err, response)` where:\n - `err` - Any error that may have occurred during the handling of the request.\n - `response` - The [HTTP Incoming Message](http://nodejs.org/api/http.html#http_http_incomingmessage)\n object, which is also a readable stream.\n\nReturns an instance of the node.js [ClientRequest](http://nodejs.org/api/http.html#http_class_http_clientrequest) object.\n\n\n### `read(response, options, callback)`\n- `response` - An HTTP Incoming Message object.\n- `options` - `null` or a configuration object with the following optional keys:\n - `timeout` - The number of milliseconds to wait while reading data before\n aborting handling of the response. Defaults to unlimited.\n - `json` - A value indicating how to try to parse the payload as JSON. Defaults to `undefined` meaning no parse logic.\n - `true`, 'smart' - only try `JSON.parse` if the response indicates a JSON content-type.\n - `force` - try `JSON.parse` regardless of the content-type header.\n - `maxBytes` - The maximum allowed response payload size. Defaults to unlimited.\n- `callback` - The callback function using the signature `function (err, payload)` where:\n - `err` - Any error that may have occurred while reading the response.\n - `payload` - The payload in the form of a Buffer or (optionally) parsed JavaScript object (JSON).\n\n\n### `get(uri, [options], callback)`\n\nConvenience method for GET operations.\n- `uri` - The URI of the requested resource.\n- `options` - Optional config object containing settings for both `request` and\n `read` operations.\n- `callback` - The callback function using the signature `function (err, response, payload)` where:\n - `err` - Any error that may have occurred during handling of the request.\n - `response` - The [HTTP Incoming Message](http://nodejs.org/api/http.html#http_http_incomingmessage)\n object, which is also a readable stream.\n - `payload` - The payload in the form of a Buffer or (optionally) parsed JavaScript object (JSON).\n\nReturns an instance of the node.js [ClientRequest](http://nodejs.org/api/http.html#http_class_http_clientrequest) object.\n\n\n### `post(uri, [options], callback)`\n\nConvenience method for POST operations.\n- `uri` - The URI of the requested resource.\n- `options` - Optional config object containing settings for both `request` and\n `read` operations.\n- `callback` - The callback function using the signature `function (err, response, payload)` where:\n - `err` - Any error that may have occurred during handling of the request.\n - `response` - The [HTTP Incoming Message](http://nodejs.org/api/http.html#http_http_incomingmessage)\n object, which is also a readable stream.\n - `payload` - The payload in the form of a Buffer or (optionally) parsed JavaScript object (JSON).\n\nReturns an instance of the node.js [ClientRequest](http://nodejs.org/api/http.html#http_class_http_clientrequest) object.\n\n\n### `put(uri, [options], callback)`\n\nConvenience method for PUT operations.\n- `uri` - The URI of the requested resource.\n- `options` - Optional config object containing settings for both `request` and\n `read` operations.\n- `callback` - The callback function using the signature `function (err, response, payload)` where:\n - `err` - Any error that may have occurred during handling of the request.\n - `response` - The [HTTP Incoming Message](http://nodejs.org/api/http.html#http_http_incomingmessage)\n object, which is also a readable stream.\n - `payload` - The payload in the form of a Buffer or (optionally) parsed JavaScript object (JSON).\n\nReturns an instance of the node.js [ClientRequest](http://nodejs.org/api/http.html#http_class_http_clientrequest) object.\n\n\n### `delete(uri, [options], callback)`\n\nConvenience method for DELETE operations.\n- `uri` - The URI of the requested resource.\n- `options` - Optional config object containing settings for both `request` and\n `read` operations.\n- `callback` - The callback function using the signature `function (err, response, payload)` where:\n - `err` - Any error that may have occurred during handling of the request.\n - `response` - The [HTTP Incoming Message](http://nodejs.org/api/http.html#http_http_incomingmessage)\n object, which is also a readable stream.\n - `payload` - The payload in the form of a Buffer or (optionally) parsed JavaScript object (JSON).\n\nReturns an instance of the node.js [ClientRequest](http://nodejs.org/api/http.html#http_class_http_clientrequest) object.\n\n\n### `toReadableStream(payload, [encoding])`\n\nCreates a [readable stream](http://nodejs.org/api/stream.html#stream_class_stream_readable)\nfor the provided payload and encoding.\n- `payload` - The Buffer or string to be wrapped in a readable stream.\n- `encoding` - The encoding to use. Must be a valid Buffer encoding, such as 'utf8' or 'ascii'.\n\n```javascript\nvar stream = Wreck.toReadableStream(new Buffer('Hello', 'ascii'), 'ascii');\nvar read = stream.read();\n// read -> 'Hello'\n```\n\n### `parseCacheControl(field)`\n\nParses the provided *cache-control* request header value into an object containing\na property for each directive and it's value. Boolean directives, such as \"private\"\nor \"no-cache\" will be set to the boolean `true`.\n- `field` - The header cache control value to be parsed.\n\n```javascript\nvar result = Wreck.parseCacheControl('private, max-age=0, no-cache');\n// result.private -> true\n// result['max-age'] -> 0\n// result['no-cache'] -> true\n```\n\n### `agents`\n\nObject that contains the agents for pooling connections for `http` and `https`. The properties are `http`, `https`, and\n`httpsAllowUnauthorized` which is an `https` agent with `rejectUnauthorized` set to true. All agents have `maxSockets`\nconfigured to `Infinity`. They are each instances of the node.js [Agent](http://nodejs.org/api/http.html#http_class_http_agent)\nand expose the standard properties.\n\nFor example, the following code demonstrates changing `maxSockets` on the `http` agent.\n\n ```js\n var Wreck = require('wreck');\n\n Wreck.agents.http.maxSockets = 20;\n ```\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/hapijs/wreck/issues" - }, - "_id": "wreck@5.2.0", - "dist": { - "shasum": "7850e2c5f754c4d961cad628a4b2626e5479e890" - }, - "_from": "wreck@5.2.0", - "_resolved": "https://registry.npmjs.org/wreck/-/wreck-5.2.0.tgz" -} diff --git a/node_modules/hapi/node_modules/wreck/test/index.js b/node_modules/hapi/node_modules/wreck/test/index.js deleted file mode 100755 index c9065a6..0000000 --- a/node_modules/hapi/node_modules/wreck/test/index.js +++ /dev/null @@ -1,1499 +0,0 @@ -// Load modules - -var Http = require('http'); -var Https = require('https'); -var Path = require('path'); -var Fs = require('fs'); -var Events = require('events'); -var Stream = require('stream'); -var Code = require('code'); -var Lab = require('lab'); -var Wreck = require('../'); - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var describe = lab.describe; -var it = lab.it; -var expect = Code.expect; - - -var payload = new Array(1640).join('0123456789'); // make sure we have a payload larger than 16384 bytes for chunking coverage - -describe('request()', function () { - - it('requests a resource with callback', function (done) { - - var server = Http.createServer(function (req, res) { - - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.end(payload); - }); - - server.listen(0, function () { - - Wreck.request('get', 'http://localhost:' + server.address().port, {}, function (err, res) { - - expect(err).to.not.exist(); - Wreck.read(res, null, function (err, body) { - - expect(err).to.not.exist(); - expect(body.toString()).to.equal(payload); - server.close(); - done(); - }); - }); - }); - }); - - it('requests a POST resource', function (done) { - - var server = Http.createServer(function (req, res) { - - expect(req.headers['content-length']).to.equal('16390'); - res.writeHead(200, { 'Content-Type': 'text/plain' }); - req.pipe(res); - }); - - server.listen(0, function () { - - Wreck.request('post', 'http://localhost:' + server.address().port, { payload: payload }, function (err, res) { - - expect(err).to.not.exist(); - Wreck.read(res, null, function (err, body) { - - expect(err).to.not.exist(); - expect(body.toString()).to.equal(payload); - server.close(); - done(); - }); - }); - }); - }); - - it('requests a POST resource with unicode characters in payload', function (done) { - - var server = Http.createServer(function (req, res) { - - expect(req.headers['content-length']).to.equal('14'); - res.writeHead(200, { 'Content-Type': 'text/plain' }); - req.pipe(res); - }); - - server.listen(0, function () { - - var unicodePayload = JSON.stringify({ field: 'ć' }); - Wreck.request('post', 'http://localhost:' + server.address().port, { payload: unicodePayload }, function (err, res) { - - expect(err).to.not.exist(); - Wreck.read(res, null, function (err, body) { - - expect(err).to.not.exist(); - expect(body.toString()).to.equal(unicodePayload); - server.close(); - done(); - }); - }); - }); - }); - - it('requests a POST resource with headers', function (done) { - - var server = Http.createServer(function (req, res) { - - res.writeHead(200, { 'Content-Type': 'text/plain' }); - req.pipe(res); - }); - - server.listen(0, function () { - - Wreck.request('post', 'http://localhost:' + server.address().port, { headers: { 'user-agent': 'wreck' }, payload: payload }, function (err, res) { - - expect(err).to.not.exist(); - Wreck.read(res, null, function (err, body) { - - expect(err).to.not.exist(); - expect(body.toString()).to.equal(payload); - server.close(); - done(); - }); - }); - }); - }); - - it('requests a POST resource with stream payload', function (done) { - - var server = Http.createServer(function (req, res) { - - res.writeHead(200, { 'Content-Type': 'text/plain' }); - req.pipe(res); - }); - - server.listen(0, function () { - - Wreck.request('post', 'http://localhost:' + server.address().port, { payload: Wreck.toReadableStream(payload) }, function (err, res) { - - expect(err).to.not.exist(); - Wreck.read(res, null, function (err, body) { - - expect(err).to.not.exist(); - expect(body.toString()).to.equal(payload); - server.close(); - done(); - }); - }); - }); - }); - - it('requests a resource without callback', function (done) { - - var server = Http.createServer(function (req, res) { - - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.end(payload); - server.close(); - done(); - }); - - server.listen(0, function () { - - Wreck.request('get', 'http://localhost:' + server.address().port, {}); - }); - }); - - it('cannot set agent and rejectUnauthorized at the same time', function (done) { - - var fn = function () { - - Wreck.request('get', 'https://google.com', { rejectUnauthorized: true, agent: new Https.Agent() }, function (err, res) {}); - }; - - expect(fn).to.throw(); - done(); - }); - - it('cannot set a false agent and rejectUnauthorized at the same time', function (done) { - - var fn = function () { - - Wreck.request('get', 'https://google.com', { rejectUnauthorized: false, agent: false }, function (err, res) {}); - }; - - expect(fn).to.throw(); - done(); - }); - - it('can set a null agent and rejectUnauthorized at the same time', function (done) { - - var fn = function () { - - Wreck.request('get', 'https://google.com', { rejectUnauthorized: false, agent: null }, function (err, res) {}); - }; - - expect(fn).to.not.throw(); - done(); - }); - - it('requests an https resource', function (done) { - - Wreck.request('get', 'https://google.com', { rejectUnauthorized: true }, function (err, res) { - - expect(err).to.not.exist(); - Wreck.read(res, null, function (err, body) { - - expect(err).to.not.exist(); - expect(body.toString()).to.contain(''); - done(); - }); - }); - }); - - it('requests an https resource with secure protocol set', function (done) { - - Wreck.request('get', 'https://google.com', { rejectUnauthorized: true, secureProtocol: 'SSLv3_method' }, function (err, res) { - - expect(err).to.not.exist(); - Wreck.read(res, null, function (err, body) { - - expect(err).to.not.exist(); - expect(body.toString()).to.contain(''); - done(); - }); - }); - }); - - it('fails when an https resource has invalid certs and the default rejectUnauthorized', function (done) { - - var httpsOptions = { - key: '-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA0UqyXDCqWDKpoNQQK/fdr0OkG4gW6DUafxdufH9GmkX/zoKz\ng/SFLrPipzSGINKWtyMvo7mPjXqqVgE10LDI3VFV8IR6fnART+AF8CW5HMBPGt/s\nfQW4W4puvBHkBxWSW1EvbecgNEIS9hTGvHXkFzm4xJ2e9DHp2xoVAjREC73B7JbF\nhc5ZGGchKw+CFmAiNysU0DmBgQcac0eg2pWoT+YGmTeQj6sRXO67n2xy/hA1DuN6\nA4WBK3wM3O4BnTG0dNbWUEbe7yAbV5gEyq57GhJIeYxRvveVDaX90LoAqM4cUH06\n6rciON0UbDHV2LP/JaH5jzBjUyCnKLLo5snlbwIDAQABAoIBAQDJm7YC3pJJUcxb\nc8x8PlHbUkJUjxzZ5MW4Zb71yLkfRYzsxrTcyQA+g+QzA4KtPY8XrZpnkgm51M8e\n+B16AcIMiBxMC6HgCF503i16LyyJiKrrDYfGy2rTK6AOJQHO3TXWJ3eT3BAGpxuS\n12K2Cq6EvQLCy79iJm7Ks+5G6EggMZPfCVdEhffRm2Epl4T7LpIAqWiUDcDfS05n\nNNfAGxxvALPn+D+kzcSF6hpmCVrFVTf9ouhvnr+0DpIIVPwSK/REAF3Ux5SQvFuL\njPmh3bGwfRtcC5d21QNrHdoBVSN2UBLmbHUpBUcOBI8FyivAWJhRfKnhTvXMFG8L\nwaXB51IZAoGBAP/E3uz6zCyN7l2j09wmbyNOi1AKvr1WSmuBJveITouwblnRSdvc\nsYm4YYE0Vb94AG4n7JIfZLKtTN0xvnCo8tYjrdwMJyGfEfMGCQQ9MpOBXAkVVZvP\ne2k4zHNNsfvSc38UNSt7K0HkVuH5BkRBQeskcsyMeu0qK4wQwdtiCoBDAoGBANF7\nFMppYxSW4ir7Jvkh0P8bP/Z7AtaSmkX7iMmUYT+gMFB5EKqFTQjNQgSJxS/uHVDE\nSC5co8WGHnRk7YH2Pp+Ty1fHfXNWyoOOzNEWvg6CFeMHW2o+/qZd4Z5Fep6qCLaa\nFvzWWC2S5YslEaaP8DQ74aAX4o+/TECrxi0z2lllAoGAdRB6qCSyRsI/k4Rkd6Lv\nw00z3lLMsoRIU6QtXaZ5rN335Awyrfr5F3vYxPZbOOOH7uM/GDJeOJmxUJxv+cia\nPQDflpPJZU4VPRJKFjKcb38JzO6C3Gm+po5kpXGuQQA19LgfDeO2DNaiHZOJFrx3\nm1R3Zr/1k491lwokcHETNVkCgYBPLjrZl6Q/8BhlLrG4kbOx+dbfj/euq5NsyHsX\n1uI7bo1Una5TBjfsD8nYdUr3pwWltcui2pl83Ak+7bdo3G8nWnIOJ/WfVzsNJzj7\n/6CvUzR6sBk5u739nJbfgFutBZBtlSkDQPHrqA7j3Ysibl3ZIJlULjMRKrnj6Ans\npCDwkQKBgQCM7gu3p7veYwCZaxqDMz5/GGFUB1My7sK0hcT7/oH61yw3O8pOekee\nuctI1R3NOudn1cs5TAy/aypgLDYTUGQTiBRILeMiZnOrvQQB9cEf7TFgDoRNCcDs\nV/ZWiegVB/WY7H0BkCekuq5bHwjgtJTpvHGqQ9YD7RhE8RSYOhdQ/Q==\n-----END RSA PRIVATE KEY-----\n', - cert: '-----BEGIN CERTIFICATE-----\nMIIDBjCCAe4CCQDvLNml6smHlTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJV\nUzETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0\ncyBQdHkgTHRkMB4XDTE0MDEyNTIxMjIxOFoXDTE1MDEyNTIxMjIxOFowRTELMAkG\nA1UEBhMCVVMxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0\nIFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nANFKslwwqlgyqaDUECv33a9DpBuIFug1Gn8Xbnx/RppF/86Cs4P0hS6z4qc0hiDS\nlrcjL6O5j416qlYBNdCwyN1RVfCEen5wEU/gBfAluRzATxrf7H0FuFuKbrwR5AcV\nkltRL23nIDRCEvYUxrx15Bc5uMSdnvQx6dsaFQI0RAu9weyWxYXOWRhnISsPghZg\nIjcrFNA5gYEHGnNHoNqVqE/mBpk3kI+rEVzuu59scv4QNQ7jegOFgSt8DNzuAZ0x\ntHTW1lBG3u8gG1eYBMquexoSSHmMUb73lQ2l/dC6AKjOHFB9Ouq3IjjdFGwx1diz\n/yWh+Y8wY1Mgpyiy6ObJ5W8CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAoSc6Skb4\ng1e0ZqPKXBV2qbx7hlqIyYpubCl1rDiEdVzqYYZEwmst36fJRRrVaFuAM/1DYAmT\nWMhU+yTfA+vCS4tql9b9zUhPw/IDHpBDWyR01spoZFBF/hE1MGNpCSXXsAbmCiVf\naxrIgR2DNketbDxkQx671KwF1+1JOMo9ffXp+OhuRo5NaGIxhTsZ+f/MA4y084Aj\nDI39av50sTRTWWShlN+J7PtdQVA5SZD97oYbeUeL7gI18kAJww9eUdmT0nEjcwKs\nxsQT1fyKbo7AlZBY4KSlUMuGnn0VnAsB9b+LxtXlDfnjyM8bVQx1uAfRo0DO8p/5\n3J5DTjAU55deBQ==\n-----END CERTIFICATE-----\n' - }; - - var server = Https.createServer(httpsOptions, function (req, res) { - - res.writeHead(200); - res.end(); - }); - - server.listen(0, function (err) { - - expect(err).to.not.exist(); - - Wreck.request('get', 'https://localhost:' + server.address().port, {}, function (err, res) { - - expect(err).to.exist(); - done(); - }); - }); - }); - - it('succeeds when an https resource has unauthorized certs and rejectUnauthorized is false', function (done) { - - var httpsOptions = { - key: '-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA0UqyXDCqWDKpoNQQK/fdr0OkG4gW6DUafxdufH9GmkX/zoKz\ng/SFLrPipzSGINKWtyMvo7mPjXqqVgE10LDI3VFV8IR6fnART+AF8CW5HMBPGt/s\nfQW4W4puvBHkBxWSW1EvbecgNEIS9hTGvHXkFzm4xJ2e9DHp2xoVAjREC73B7JbF\nhc5ZGGchKw+CFmAiNysU0DmBgQcac0eg2pWoT+YGmTeQj6sRXO67n2xy/hA1DuN6\nA4WBK3wM3O4BnTG0dNbWUEbe7yAbV5gEyq57GhJIeYxRvveVDaX90LoAqM4cUH06\n6rciON0UbDHV2LP/JaH5jzBjUyCnKLLo5snlbwIDAQABAoIBAQDJm7YC3pJJUcxb\nc8x8PlHbUkJUjxzZ5MW4Zb71yLkfRYzsxrTcyQA+g+QzA4KtPY8XrZpnkgm51M8e\n+B16AcIMiBxMC6HgCF503i16LyyJiKrrDYfGy2rTK6AOJQHO3TXWJ3eT3BAGpxuS\n12K2Cq6EvQLCy79iJm7Ks+5G6EggMZPfCVdEhffRm2Epl4T7LpIAqWiUDcDfS05n\nNNfAGxxvALPn+D+kzcSF6hpmCVrFVTf9ouhvnr+0DpIIVPwSK/REAF3Ux5SQvFuL\njPmh3bGwfRtcC5d21QNrHdoBVSN2UBLmbHUpBUcOBI8FyivAWJhRfKnhTvXMFG8L\nwaXB51IZAoGBAP/E3uz6zCyN7l2j09wmbyNOi1AKvr1WSmuBJveITouwblnRSdvc\nsYm4YYE0Vb94AG4n7JIfZLKtTN0xvnCo8tYjrdwMJyGfEfMGCQQ9MpOBXAkVVZvP\ne2k4zHNNsfvSc38UNSt7K0HkVuH5BkRBQeskcsyMeu0qK4wQwdtiCoBDAoGBANF7\nFMppYxSW4ir7Jvkh0P8bP/Z7AtaSmkX7iMmUYT+gMFB5EKqFTQjNQgSJxS/uHVDE\nSC5co8WGHnRk7YH2Pp+Ty1fHfXNWyoOOzNEWvg6CFeMHW2o+/qZd4Z5Fep6qCLaa\nFvzWWC2S5YslEaaP8DQ74aAX4o+/TECrxi0z2lllAoGAdRB6qCSyRsI/k4Rkd6Lv\nw00z3lLMsoRIU6QtXaZ5rN335Awyrfr5F3vYxPZbOOOH7uM/GDJeOJmxUJxv+cia\nPQDflpPJZU4VPRJKFjKcb38JzO6C3Gm+po5kpXGuQQA19LgfDeO2DNaiHZOJFrx3\nm1R3Zr/1k491lwokcHETNVkCgYBPLjrZl6Q/8BhlLrG4kbOx+dbfj/euq5NsyHsX\n1uI7bo1Una5TBjfsD8nYdUr3pwWltcui2pl83Ak+7bdo3G8nWnIOJ/WfVzsNJzj7\n/6CvUzR6sBk5u739nJbfgFutBZBtlSkDQPHrqA7j3Ysibl3ZIJlULjMRKrnj6Ans\npCDwkQKBgQCM7gu3p7veYwCZaxqDMz5/GGFUB1My7sK0hcT7/oH61yw3O8pOekee\nuctI1R3NOudn1cs5TAy/aypgLDYTUGQTiBRILeMiZnOrvQQB9cEf7TFgDoRNCcDs\nV/ZWiegVB/WY7H0BkCekuq5bHwjgtJTpvHGqQ9YD7RhE8RSYOhdQ/Q==\n-----END RSA PRIVATE KEY-----\n', - cert: '-----BEGIN CERTIFICATE-----\nMIIDBjCCAe4CCQDvLNml6smHlTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJV\nUzETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0\ncyBQdHkgTHRkMB4XDTE0MDEyNTIxMjIxOFoXDTE1MDEyNTIxMjIxOFowRTELMAkG\nA1UEBhMCVVMxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0\nIFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nANFKslwwqlgyqaDUECv33a9DpBuIFug1Gn8Xbnx/RppF/86Cs4P0hS6z4qc0hiDS\nlrcjL6O5j416qlYBNdCwyN1RVfCEen5wEU/gBfAluRzATxrf7H0FuFuKbrwR5AcV\nkltRL23nIDRCEvYUxrx15Bc5uMSdnvQx6dsaFQI0RAu9weyWxYXOWRhnISsPghZg\nIjcrFNA5gYEHGnNHoNqVqE/mBpk3kI+rEVzuu59scv4QNQ7jegOFgSt8DNzuAZ0x\ntHTW1lBG3u8gG1eYBMquexoSSHmMUb73lQ2l/dC6AKjOHFB9Ouq3IjjdFGwx1diz\n/yWh+Y8wY1Mgpyiy6ObJ5W8CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAoSc6Skb4\ng1e0ZqPKXBV2qbx7hlqIyYpubCl1rDiEdVzqYYZEwmst36fJRRrVaFuAM/1DYAmT\nWMhU+yTfA+vCS4tql9b9zUhPw/IDHpBDWyR01spoZFBF/hE1MGNpCSXXsAbmCiVf\naxrIgR2DNketbDxkQx671KwF1+1JOMo9ffXp+OhuRo5NaGIxhTsZ+f/MA4y084Aj\nDI39av50sTRTWWShlN+J7PtdQVA5SZD97oYbeUeL7gI18kAJww9eUdmT0nEjcwKs\nxsQT1fyKbo7AlZBY4KSlUMuGnn0VnAsB9b+LxtXlDfnjyM8bVQx1uAfRo0DO8p/5\n3J5DTjAU55deBQ==\n-----END CERTIFICATE-----\n' - }; - - var server = Https.createServer(httpsOptions, function (req, res) { - - res.writeHead(200); - res.end(); - }); - - server.listen(0, function (err) { - - expect(err).to.not.exist(); - - Wreck.request('get', 'https://localhost:' + server.address().port, { rejectUnauthorized: false }, function (err, res) { - - expect(err).to.not.exist(); - done(); - }); - }); - }); - - it('requests a resource with downstream dependency', function (done) { - - var up = Http.createServer(function (req, res) { - - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.end(payload); - }); - - up.listen(0, function () { - - var down = Http.createServer(function (req, res1) { - - res1.writeHead(200, { 'Content-Type': 'text/plain' }); - Wreck.request('get', 'http://localhost:' + up.address().port, { downstreamRes: res1 }, function (err, res2) { - - expect(err).to.not.exist(); - res2.pipe(res1); - }); - }); - - down.listen(0, function () { - - Wreck.request('get', 'http://localhost:' + down.address().port, {}, function (err, res) { - - expect(err).to.not.exist(); - Wreck.read(res, null, function (err, body) { - - expect(err).to.not.exist(); - expect(body.toString()).to.equal(payload); - up.close(); - down.close(); - done(); - }); - }); - }); - }); - }); - - it('does not follow redirections by default', function (done) { - - var gen = 0; - var server = Http.createServer(function (req, res) { - - if (!gen++) { - res.writeHead(301, { 'Location': 'http://localhost:' + server.address().port }); - res.end(); - } - else { - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.end(payload); - } - }); - - server.listen(0, function () { - - Wreck.request('get', 'http://localhost:' + server.address().port, {}, function (err, res) { - - expect(err).to.not.exist(); - Wreck.read(res, null, function (err, body) { - - expect(err).to.not.exist(); - expect(res.statusCode).to.equal(301); - server.close(); - done(); - }); - }); - }); - }); - - it('handles redirections', function (done) { - - var gen = 0; - var server = Http.createServer(function (req, res) { - - if (!gen++) { - res.writeHead(301, { 'Location': 'http://localhost:' + server.address().port }); - res.end(); - } - else { - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.end(payload); - } - }); - - server.listen(0, function () { - - Wreck.request('get', 'http://localhost:' + server.address().port, { redirects: 1 }, function (err, res) { - - expect(err).to.not.exist(); - Wreck.read(res, null, function (err, body) { - - expect(err).to.not.exist(); - expect(body.toString()).to.equal(payload); - server.close(); - done(); - }); - }); - }); - }); - - it('handles redirections with relative location', function (done) { - - var gen = 0; - var server = Http.createServer(function (req, res) { - - if (!gen++) { - res.writeHead(301, { 'Location': '/' }); - res.end(); - } - else { - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.end(payload); - } - }); - - server.listen(0, function () { - - Wreck.request('get', 'http://localhost:' + server.address().port, { redirects: 1 }, function (err, res) { - - expect(err).to.not.exist(); - Wreck.read(res, null, function (err, body) { - - expect(err).to.not.exist(); - expect(body.toString()).to.equal(payload); - server.close(); - done(); - }); - }); - }); - }); - - it('reaches max redirections count', function (done) { - - var gen = 0; - var server = Http.createServer(function (req, res) { - - if (gen++ < 2) { - res.writeHead(301, { 'Location': 'http://localhost:' + server.address().port }); - res.end(); - } - else { - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.end(payload); - } - }); - - server.listen(0, function () { - - Wreck.request('get', 'http://localhost:' + server.address().port, { redirects: 1 }, function (err, res) { - - expect(err.message).to.equal('Maximum redirections reached'); - server.close(); - done(); - }); - }); - }); - - it('handles malformed redirection response', function (done) { - - var server = Http.createServer(function (req, res) { - - res.writeHead(301); - res.end(); - }); - - server.listen(0, function () { - - Wreck.request('get', 'http://localhost:' + server.address().port, { redirects: 1 }, function (err, res) { - - expect(err.message).to.equal('Received redirection without location'); - server.close(); - done(); - }); - }); - }); - - it('handles redirections with POST stream payload', function (done) { - - var gen = 0; - var server = Http.createServer(function (req, res) { - - if (!gen++) { - res.writeHead(307, { 'Location': '/' }); - res.end(); - } - else { - res.writeHead(200, { 'Content-Type': 'text/plain' }); - Wreck.read(req, null, function (err, res2) { - - res.end(res2); - }); - } - }); - - server.listen(0, function () { - - Wreck.request('post', 'http://localhost:' + server.address().port, { redirects: 1, payload: Wreck.toReadableStream(payload) }, function (err, res) { - - expect(err).to.not.exist(); - Wreck.read(res, null, function (err, body) { - - expect(err).to.not.exist(); - expect(body.toString()).to.equal(payload); - server.close(); - done(); - }); - }); - }); - }); - - it('handles request errors with a boom response', function (done) { - - var server = Http.createServer(function (req, res) { - - req.destroy(); - res.end(); - }); - - server.once('listening', function () { - - Wreck.request('get', 'http://127.0.0.1:' + server.address().port, { payload: '' }, function (err) { - - expect(err.code).to.equal('ECONNRESET'); - done(); - }); - }); - - server.listen(0); - }); - - it('handles request errors with a boom response when payload is being sent', function (done) { - - var server = Http.createServer(function (req, res) { - - req.destroy(); - res.end(); - }); - - server.once('listening', function () { - - Wreck.request('get', 'http://127.0.0.1:' + server.address().port, { payload: '' }, function (err) { - - expect(err.code).to.equal('ECONNRESET'); - done(); - }); - }); - - server.listen(0); - }); - - it('handles response errors with a boom response', function (done) { - - var server = Http.createServer(function (req, res) { - - res.destroy(); - }); - - server.once('listening', function () { - - Wreck.request('get', 'http://127.0.0.1:' + server.address().port, { payload: '' }, function (err) { - - expect(err.code).to.equal('ECONNRESET'); - done(); - }); - }); - - server.listen(0); - }); - - it('handles errors when remote server is unavailable', function (done) { - - Wreck.request('get', 'http://127.0.0.1:10', { payload: '' }, function (err) { - - expect(err).to.exist(); - done(); - }); - }); - - it('handles a timeout during a socket close', function (done) { - - var server = Http.createServer(function (req, res) { - - req.once('error', function () { }); - res.once('error', function () { }); - - setTimeout(function () { - - req.destroy(); - }, 5); - }); - - server.once('error', function () { }); - - server.once('listening', function () { - - Wreck.request('get', 'http://127.0.0.1:' + server.address().port, { payload: '', timeout: 5 }, function (err) { - - expect(err).to.exist(); - server.close(); - - setTimeout(done, 5); - }); - }); - - server.listen(0); - }); - - it('handles an error after a timeout', function (done) { - - var server = Http.createServer(function (req, res) { - - req.once('error', function () { }); - res.once('error', function () { }); - - setTimeout(function () { - - res.socket.write('ERROR'); - }, 5); - }); - - server.once('error', function () { }); - - server.once('listening', function () { - - Wreck.request('get', 'http://127.0.0.1:' + server.address().port, { payload: '', timeout: 5 }, function (err) { - - expect(err).to.exist(); - server.close(); - - setTimeout(done, 5); - }); - }); - - server.listen(0); - }); - - it('allows request without a callback', function (done) { - - var server = Http.createServer(function (req, res) { - - res.end('ok'); - }); - - server.once('listening', function () { - - Wreck.request('get', 'http://127.0.0.1:' + server.address().port); - done(); - }); - - server.listen(0); - }); - - it('requests can be aborted', function (done) { - - var server = Http.createServer(function (req, res) { - - res.writeHead(200); - res.end(); - }); - - server.listen(0, function () { - - var req = Wreck.request('get', 'http://localhost:' + server.address().port, {}, function (err) { - - expect(err).to.exist(); - expect(err.code).to.equal('ECONNRESET'); - done(); - }); - - req.abort(); - }); - }); - - it('request shortcuts can be aborted', function (done) { - - var server = Http.createServer(function (req, res) { - - res.writeHead(200); - res.end(); - }); - - server.listen(0, function () { - - var req = Wreck.get('http://localhost:' + server.address().port, function (err) { - - expect(err).to.exist(); - expect(err.code).to.equal('ECONNRESET'); - done(); - }); - - req.abort(); - }); - }); - - it('uses agent option', function (done) { - - var agent = new Http.Agent(); - expect(Object.keys(agent.sockets).length).to.equal(0); - - Wreck.request('get', 'http://localhost/', { agent: agent }, function (err, res) { - - expect(Object.keys(agent.sockets).length).to.equal(1); - done(); - }); - }); - - it('pooling can be disabled by setting agent to false', function (done) { - - var complete; - - var server = Http.createServer(function (req, res) { - - res.writeHead(200); - res.write('foo'); - - complete = complete || function () { - - res.end(); - }; - }); - - server.listen(0, function () { - - - Wreck.request('get', 'http://localhost:' + server.address().port, { agent: false, timeout: 15 }, function (err, res) { - - expect(err).to.not.exist(); - expect(Object.keys(Wreck.agents.http.sockets).length).to.equal(0); - expect(Object.keys(Wreck.agents.http.requests).length).to.equal(0); - - Wreck.request('get', 'http://localhost:' + server.address().port + '/thatone', { agent: false, timeout: 15 }, function (err, innerRes) { - - expect(err).to.not.exist(); - - expect(Object.keys(Wreck.agents.http.sockets).length).to.equal(0); - expect(Object.keys(Wreck.agents.http.requests).length).to.equal(0); - - complete(); - - Wreck.read(res, null, function () { - - setTimeout(function () { - - expect(Object.keys(Wreck.agents.http.sockets).length).to.equal(0); - expect(Object.keys(Wreck.agents.http.requests).length).to.equal(0); - - done(); - }, 100); - }); - }); - }); - }); - }); - - it('requests payload in buffer', function (done) { - - var server = Http.createServer(function (req, res) { - - res.writeHead(200, { 'Content-Type': 'text/plain' }); - req.pipe(res); - }); - - server.listen(0, function () { - - var buf = new Buffer(payload, 'ascii'); - - Wreck.request('post', 'http://localhost:' + server.address().port, { payload: buf }, function (err, res) { - - expect(err).to.not.exist(); - Wreck.read(res, null, function (err, body) { - - expect(err).to.not.exist(); - expect(body.toString()).to.equal(payload); - server.close(); - done(); - }); - }); - }); - }); - - it('requests head method', function (done) { - - var server = Http.createServer(function (req, res) { - - res.writeHead(200); - req.pipe(res); - }); - - server.listen(0, function () { - - var buf = new Buffer(payload, 'ascii'); - - Wreck.request('head', 'http://localhost:' + server.address().port, { payload: null }, function (err, res) { - - expect(err).to.not.exist(); - Wreck.read(res, null, function (err, body) { - - expect(err).to.not.exist(); - expect(body.toString()).to.equal(''); - server.close(); - done(); - }); - }); - }); - }); - - it('post null payload', function (done) { - - var server = Http.createServer(function (req, res) { - res.statusCode = 500; - res.end(); - }); - - server.listen(0, function () { - - Wreck.request('post', 'http://localhost:' + server.address().port, { headers: { connection: 'close' }, payload: null }, function (err, res) { - - expect(err).to.not.exist(); - Wreck.read(res, null, function (err, body) { - - expect(err).to.not.exist(); - expect(body.toString()).to.equal(''); - server.close(); - done(); - }); - }); - }); - }); - - it('handles read timeout', function (done) { - - var server = Http.createServer(function (req, res) { - - setTimeout(function () { - - res.writeHead(200); - res.write(payload); - res.end(); - }, 2000); - }); - - server.listen(0, function () { - - Wreck.request('get', 'http://localhost:' + server.address().port, { timeout: 100 }, function (err, res) { - - expect(err).to.exist(); - expect(err.output.statusCode).to.equal(504); - done(); - }); - }); - }); - - it('cleans socket on agent deferred read timeout', function (done) { - - var complete; - - var server = Http.createServer(function (req, res) { - - res.writeHead(200); - res.write('foo'); - - complete = complete || function () { - - res.end(); - }; - }); - - server.listen(0, function () { - - var agent = new Http.Agent({ maxSockets: 1 }); - expect(Object.keys(agent.sockets).length).to.equal(0); - - Wreck.request('get', 'http://localhost:' + server.address().port, { agent: agent, timeout: 15 }, function (err, res) { - - expect(err).to.not.exist(); - expect(Object.keys(agent.sockets).length).to.equal(1); - expect(Object.keys(agent.requests).length).to.equal(0); - - Wreck.request('get', 'http://localhost:' + server.address().port + '/thatone', { agent: agent, timeout: 15 }, function (err, innerRes) { - - expect(err).to.exist(); - expect(err.output.statusCode).to.equal(504); - - expect(Object.keys(agent.sockets).length).to.equal(1); - expect(Object.keys(agent.requests).length).to.equal(1); - - complete(); - - Wreck.read(res, null, function () { - - setTimeout(function () { - - expect(Object.keys(agent.sockets).length).to.equal(0); - expect(Object.keys(agent.requests).length).to.equal(0); - - done(); - }, 100); - }); - }); - }); - }); - }); - - it('defaults maxSockets to Infinity', function (done) { - - var server = Http.createServer(function (req, res) { - - res.writeHead(200); - res.write(payload); - res.end(); - }); - - server.listen(0, function () { - - Wreck.request('get', 'http://localhost:' + server.address().port, { timeout: 100 }, function (err, res) { - - expect(err).to.not.exist(); - expect(res.statusCode).to.equal(200); - expect(Wreck.agents.http.maxSockets).to.equal(Infinity); - done(); - }); - }); - }); - - it('maxSockets on default agents can be changed', function (done) { - - var complete; - - var server = Http.createServer(function (req, res) { - - res.writeHead(200); - res.write('foo'); - - complete = complete || function () { - - res.end(); - }; - }); - - server.listen(0, function () { - - Wreck.agents.http.maxSockets = 1; - - Wreck.request('get', 'http://localhost:' + server.address().port, { timeout: 15 }, function (err, res) { - - expect(err).to.not.exist(); - - Wreck.request('get', 'http://localhost:' + server.address().port + '/thatone', { timeout: 15 }, function (err, innerRes) { - - expect(err).to.exist(); - expect(err.output.statusCode).to.equal(504); - - complete(); - - Wreck.read(res, null, function () { - - Wreck.agents.http.maxSockets = Infinity; - done(); - }); - }); - }); - }); - }); -}); - -describe('read()', function () { - - it('handles errors with a boom response', function (done) { - - var res = new Events.EventEmitter(); - res.pipe = function () { }; - - Wreck.read(res, null, function (err) { - - expect(err.isBoom).to.equal(true); - done(); - }); - - res.emit('error', new Error('my error')); - }); - - it('handles responses that close early', function (done) { - - var res = new Events.EventEmitter(); - res.pipe = function () { }; - - Wreck.read(res, null, function (err) { - - expect(err.isBoom).to.equal(true); - done(); - }); - - res.emit('close'); - }); - - it('times out when stream read takes too long', function (done) { - - var server = Http.createServer(function (req, res) { - - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.write(payload); - }); - - server.listen(0, function () { - - Wreck.request('get', 'http://localhost:' + server.address().port, {}, function (err, res) { - - expect(err).to.not.exist(); - Wreck.read(res, { timeout: 100 }, function (err, body) { - - expect(err).to.exist(); - expect(err.output.statusCode).to.equal(408); - expect(body).to.not.exist(); - server.close(); - done(); - }); - }); - }); - }); - - it('errors when stream is too big', function (done) { - - var server = Http.createServer(function (req, res) { - - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.write(payload); - res.end(payload); - }); - - server.listen(0, function () { - - Wreck.request('get', 'http://localhost:' + server.address().port, {}, function (err, res) { - - expect(err).to.not.exist(); - Wreck.read(res, { maxBytes: 120 }, function (err, body) { - - expect(err).to.exist(); - expect(err.output.statusCode).to.equal(400); - expect(body).to.not.exist(); - server.close(); - done(); - }); - }); - }); - }); - - it('reads a file streamed via HTTP', function (done) { - - var path = Path.join(__dirname, '../images/wreck.png'); - var stats = Fs.statSync(path); - var fileStream = Fs.createReadStream(path); - - var server = Http.createServer(function (req, res) { - - res.writeHead(200); - fileStream.pipe(res); - }); - - server.listen(0, function () { - - Wreck.request('get', 'http://localhost:' + server.address().port, {}, function (err, res) { - - expect(err).to.not.exist(); - expect(res.statusCode).to.equal(200); - - Wreck.read(res, null, function (err, body) { - - expect(body.length).to.equal(stats.size); - server.close(); - done(); - }); - }); - }); - }); - - it('reads a multiple buffers response', function (done) { - - var path = Path.join(__dirname, '../images/wreck.png'); - var stats = Fs.statSync(path); - var file = Fs.readFileSync(path); - - var server = Http.createServer(function (req, res) { - - res.writeHead(200); - res.write(file); - setTimeout(function () { - - res.write(file); - res.end(); - }, 100); - }); - - server.listen(0, function () { - - Wreck.request('get', 'http://localhost:' + server.address().port, {}, function (err, res) { - - expect(err).to.not.exist(); - expect(res.statusCode).to.equal(200); - - Wreck.read(res, null, function (err, body) { - - expect(body.length).to.equal(stats.size * 2); - server.close(); - done(); - }); - }); - }); - }); - - it('writes a file streamed via HTTP', function (done) { - - var path = Path.join(__dirname, '../images/wreck.png'); - var stats = Fs.statSync(path); - var fileStream = Fs.createReadStream(path); - - var server = Http.createServer(function (req, res) { - - res.writeHead(200); - - Wreck.read(req, null, function (err, body) { - - res.end(body); - }); - }); - - server.listen(0, function () { - - Wreck.request('post', 'http://localhost:' + server.address().port, { payload: fileStream }, function (err, res) { - - expect(err).to.not.exist(); - expect(res.statusCode).to.equal(200); - - Wreck.read(res, null, function (err, body) { - - expect(body.length).to.equal(stats.size); - server.close(); - done(); - }); - }); - }); - }); - - it('handles responses with no headers', function (done) { - - var res = Wreck.toReadableStream(payload); - Wreck.read(res, { json: true }, function (err) { - - expect(err).to.equal(null); - done(); - }); - }); - -}); - -describe('parseCacheControl()', function () { - - it('parses valid header', function (done) { - - var header = Wreck.parseCacheControl('must-revalidate, max-age=3600'); - expect(header).to.exist(); - expect(header['must-revalidate']).to.equal(true); - expect(header['max-age']).to.equal(3600); - done(); - }); - - it('parses valid header with quoted string', function (done) { - - var header = Wreck.parseCacheControl('must-revalidate, max-age="3600"'); - expect(header).to.exist(); - expect(header['must-revalidate']).to.equal(true); - expect(header['max-age']).to.equal(3600); - done(); - }); - - it('errors on invalid header', function (done) { - - var header = Wreck.parseCacheControl('must-revalidate, b =3600'); - expect(header).to.not.exist(); - done(); - }); - - it('errors on invalid max-age', function (done) { - - var header = Wreck.parseCacheControl('must-revalidate, max-age=a3600'); - expect(header).to.not.exist(); - done(); - }); -}); - -describe('Shortcut', function () { - - it('get request', function (done) { - - var server = Http.createServer(function (req, res) { - - res.writeHead(200); - res.end('ok'); - }); - - server.listen(0, function () { - - Wreck.get('http://localhost:' + server.address().port, function (err, res, payload) { - - expect(err).to.not.exist(); - expect(res.statusCode).to.equal(200); - expect(payload).to.equal('ok'); - server.close(); - done(); - }); - }); - }); - - it('post request', function (done) { - - var server = Http.createServer(function (req, res) { - - res.writeHead(200); - res.end('ok'); - }); - - server.listen(0, function () { - - Wreck.post('http://localhost:' + server.address().port, { payload: '123' }, function (err, res, payload) { - - expect(err).to.not.exist(); - expect(res.statusCode).to.equal(200); - expect(payload).to.equal('ok'); - server.close(); - done(); - }); - }); - }); - - it('put request', function (done) { - - var server = Http.createServer(function (req, res) { - - res.writeHead(200); - res.end('ok'); - }); - - server.listen(0, function () { - - Wreck.put('http://localhost:' + server.address().port, function (err, res, payload) { - - expect(err).to.not.exist(); - expect(res.statusCode).to.equal(200); - expect(payload).to.equal('ok'); - server.close(); - done(); - }); - }); - }); - - it('delete request', function (done) { - - var server = Http.createServer(function (req, res) { - - res.writeHead(200); - res.end('ok'); - }); - - server.listen(0, function () { - - Wreck.delete('http://localhost:' + server.address().port, function (err, res, payload) { - - expect(err).to.not.exist(); - expect(res.statusCode).to.equal(200); - expect(payload).to.equal('ok'); - server.close(); - done(); - }); - }); - }); - - it('errors on bad request', function (done) { - - var server = Http.createServer(function (req, res) { - - res.writeHead(200); - res.end('ok'); - }); - - server.listen(0, function () { - - var port = server.address().port; - server.close(); - - Wreck.get('http://localhost:' + port, function (err, res, payload) { - - expect(err).to.exist(); - done(); - }); - }); - }); -}); - -describe('json', function () { - - it('json requested and received', function (done) { - - var server = Http.createServer(function (req, res) { - - res.writeHead(200, { 'Content-Type': 'application/json' }); - res.end(JSON.stringify({ foo: 'bar' })); - }); - - server.listen(0, function () { - - var port = server.address().port; - var options = { - json: true - }; - - Wreck.get('http://localhost:' + port, options, function (err, res, payload) { - - expect(err).to.not.exist(); - expect(res.statusCode).to.equal(200); - expect(payload).to.not.equal(null); - expect(payload.foo).to.exist(); - server.close(); - done(); - }); - }); - }); - - it('json requested but not received - flag is ignored', function (done) { - - var server = Http.createServer(function (req, res) { - - res.writeHead(200); - res.end('ok'); - }); - - server.listen(0, function () { - - var port = server.address().port; - var options = { - json: true - }; - - Wreck.get('http://localhost:' + port, options, function (err, res, payload) { - - expect(err).to.not.exist(); - expect(res.statusCode).to.equal(200); - expect(payload).to.not.equal(null); - server.close(); - done(); - }); - }); - }); - - it('invalid json received', function (done) { - - var server = Http.createServer(function (req, res) { - - res.writeHead(200, { 'Content-Type': 'application/json' }); - res.end('ok'); - }); - - server.listen(0, function () { - - var port = server.address().port; - var options = { - json: true - }; - - Wreck.get('http://localhost:' + port, options, function (err, res, payload) { - - expect(err).to.exist(); - server.close(); - done(); - }); - }); - }); - - it('json not requested but received as string', function (done) { - - var server = Http.createServer(function (req, res) { - - res.writeHead(200, { 'Content-Type': 'application/json' }); - res.end(JSON.stringify({ foo: 'bar' })); - }); - - server.listen(0, function () { - - var port = server.address().port; - var options = { - json: false - }; - - Wreck.get('http://localhost:' + port, options, function (err, res, payload) { - - expect(err).to.not.exist(); - expect(res.statusCode).to.equal(200); - expect(payload).to.not.equal(null); - server.close(); - done(); - }); - }); - }); - - it('should not be parsed on empty buffer', function (done) { - - var server = Http.createServer(function (req, res) { - - res.writeHead(204, { 'Content-Type': 'application/json' }); - res.end(); - }); - - server.listen(0, function () { - - var port = server.address().port; - var options = { - json: 'SMART' - }; - - Wreck.get('http://localhost:' + port, options, function (err, res, payload) { - - expect(err).to.not.exist(); - expect(res.statusCode).to.equal(204); - expect(payload).to.equal(null); - server.close(); - done(); - }); - }); - }); - - it('will try to parse json in "force" mode, regardless of the header', function (done) { - - var server = Http.createServer(function (req, res) { - - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.end(JSON.stringify({ foo: 'bar' })); - }); - - server.listen(0, function () { - - var port = server.address().port; - var options = { - json: 'force' - }; - - Wreck.get('http://localhost:' + port, options, function (err, res, payload) { - - expect(err).to.not.exist(); - expect(res.statusCode).to.equal(200); - expect(payload).to.not.equal(null); - expect(payload).to.deep.equal({ - foo: 'bar' - }); - server.close(); - done(); - }); - }); - }); - - it('will error on invalid json received in "force" mode', function (done) { - - var server = Http.createServer(function (req, res) { - - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.end('ok'); - }); - - server.listen(0, function () { - - var port = server.address().port; - var options = { - json: 'force' - }; - - Wreck.get('http://localhost:' + port, options, function (err, res, payload) { - - expect(err).to.exist(); - server.close(); - done(); - }); - }); - }); -}); - -describe('toReadableStream()', function () { - - it('handle empty payload', function (done) { - - var stream = Wreck.toReadableStream(); - expect(stream instanceof Stream).to.be.true; - var read = stream.read(); // Make sure read has no problems - expect(read).to.be.null; - done(); - }); - - it('handle explicit encoding', function (done) { - - var data = 'Hello'; - var buf = new Buffer(data, 'ascii'); - var stream = Wreck.toReadableStream(data, 'ascii'); - expect(stream instanceof Stream).to.be.true; - var read = stream.read(); - expect(read.toString()).to.equal(data); - done(); - }); - - it('chunks to requested size', function (done) { - var buf; - var data = new Array(101).join('0123456789'); - var stream = Wreck.toReadableStream(data); - - buf = stream.read(100); - expect(buf.length).to.equal(100); - - buf = stream.read(400); - expect(buf.length).to.equal(400); - - buf = stream.read(); - expect(buf.length).to.equal(500); - - buf = stream.read(); - expect(buf).to.equal(null); - - done(); - }); -}); diff --git a/node_modules/hapi/npm-shrinkwrap.json b/node_modules/hapi/npm-shrinkwrap.json deleted file mode 100755 index 71c49d6..0000000 --- a/node_modules/hapi/npm-shrinkwrap.json +++ /dev/null @@ -1,117 +0,0 @@ -{ - "name": "hapi", - "version": "8.4.0", - "dependencies": { - "accept": { - "version": "1.0.0" - }, - "ammo": { - "version": "1.0.0" - }, - "boom": { - "version": "2.6.1" - }, - "call": { - "version": "2.0.1" - }, - "catbox": { - "version": "4.2.2" - }, - "catbox-memory": { - "version": "1.1.1" - }, - "cryptiles": { - "version": "2.0.4" - }, - "h2o2": { - "version": "4.0.0" - }, - "heavy": { - "version": "3.0.0" - }, - "hoek": { - "version": "2.11.1" - }, - "inert": { - "version": "2.1.4", - "dependencies": { - "lru-cache": { - "version": "2.5.0" - } - } - }, - "iron": { - "version": "2.1.2" - }, - "items": { - "version": "1.1.0" - }, - "joi": { - "version": "6.0.8", - "dependencies": { - "isemail": { - "version": "1.1.1" - }, - "moment": { - "version": "2.9.0" - } - } - }, - "kilt": { - "version": "1.1.1" - }, - "mimos": { - "version": "2.0.2", - "dependencies": { - "mime-db": { - "version": "1.7.0" - } - } - }, - "peekaboo": { - "version": "1.0.0" - }, - "qs": { - "version": "2.4.0" - }, - "shot": { - "version": "1.4.2" - }, - "statehood": { - "version": "2.0.0" - }, - "subtext": { - "version": "1.0.2", - "dependencies": { - "content": { - "version": "1.0.1" - }, - "pez": { - "version": "1.0.0", - "dependencies": { - "b64": { - "version": "2.0.0" - }, - "nigel": { - "version": "1.0.1", - "dependencies": { - "vise": { - "version": "1.0.0" - } - } - } - } - } - } - }, - "topo": { - "version": "1.0.2" - }, - "vision": { - "version": "2.0.0" - }, - "wreck": { - "version": "5.2.0" - } - } -} diff --git a/node_modules/hapi/package.json b/node_modules/hapi/package.json deleted file mode 100755 index 7ccc35c..0000000 --- a/node_modules/hapi/package.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "name": "hapi", - "description": "HTTP Server framework", - "homepage": "http://hapijs.com", - "version": "8.4.0", - "repository": { - "type": "git", - "url": "git://github.com/hapijs/hapi" - }, - "main": "index", - "keywords": [ - "framework", - "http", - "api", - "router" - ], - "engines": { - "node": ">=0.10.32" - }, - "dependencies": { - "accept": "1.x.x", - "ammo": "1.x.x", - "boom": "^2.5.x", - "call": "2.x.x", - "catbox": "^4.2.x", - "catbox-memory": "1.x.x", - "cryptiles": "2.x.x", - "h2o2": "4.x.x", - "heavy": "3.x.x", - "hoek": "^2.10.x", - "inert": "2.x.x", - "iron": "2.x.x", - "items": "1.x.x", - "joi": "6.x.x", - "kilt": "^1.1.x", - "mimos": "2.x.x", - "peekaboo": "1.x.x", - "qs": "2.x.x", - "shot": "1.x.x", - "statehood": "2.x.x", - "subtext": "1.x.x", - "topo": "1.x.x", - "vision": "2.x.x" - }, - "devDependencies": { - "bluebird": "2.x.x", - "code": "1.x.x", - "handlebars": "2.x.x", - "lab": "5.x.x", - "wreck": "5.x.x" - }, - "scripts": { - "test": "node node_modules/lab/bin/lab -a code -t 100 -L", - "test-tap": "node node_modules/lab/bin/lab -a code -r tap -o tests.tap" - }, - "licenses": [ - { - "type": "BSD", - "url": "http://github.com/hapijs/hapi/raw/master/LICENSE" - } - ], - "readme": "\n\n### Web and services application framework\n\nLead Maintainer: [Eran Hammer](https://github.com/hueniverse)\n\n**hapi** is a simple to use configuration-centric framework with built-in support for input validation, caching,\nauthentication, and other essential facilities for building web and services applications. **hapi** enables\ndevelopers to focus on writing reusable application in a highly modular and prescriptive approach. \n\nDevelopment version: **8.4.x** ([release notes](https://github.com/hapijs/hapi/issues?labels=release+notes&page=1&state=closed)) \n[![Build Status](https://secure.travis-ci.org/hapijs/hapi.svg)](http://travis-ci.org/hapijs/hapi)\n\nFor the latest updates and release information visit [hapijs.com](http://hapijs.com) and follow [@hapijs](https://twitter.com/hapijs) on twitter. If you have questions, please open an issue in the\n[discussion forum](https://github.com/hapijs/discuss).\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/hapijs/hapi/issues" - }, - "_id": "hapi@8.4.0", - "_from": "hapi@" -} diff --git a/node_modules/hapi/test/.hidden b/node_modules/hapi/test/.hidden deleted file mode 100755 index c889117..0000000 --- a/node_modules/hapi/test/.hidden +++ /dev/null @@ -1 +0,0 @@ -Ssssh! diff --git a/node_modules/hapi/test/auth.js b/node_modules/hapi/test/auth.js deleted file mode 100755 index 1d3250e..0000000 --- a/node_modules/hapi/test/auth.js +++ /dev/null @@ -1,1353 +0,0 @@ -// Load modules - -var Path = require('path'); -var Boom = require('boom'); -var Code = require('code'); -var Handlebars = require('handlebars'); -var Hapi = require('..'); -var Hoek = require('hoek'); -var Lab = require('lab'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var describe = lab.describe; -var it = lab.it; -var expect = Code.expect; - - -describe('authentication', function () { - - it('requires and authenticates a request', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { steve: {} } }); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(request.auth.credentials.user); } }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(401); - - server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - }); - - it('defaults cache to private if request authenticated', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { steve: {} } }); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok').ttl(1000); } }); - - server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.headers['cache-control']).to.equal('max-age=1, must-revalidate, private'); - done(); - }); - }); - - describe('strategy()', function () { - - it('fails when options default to null', function (done) { - - var server = new Hapi.Server({ debug: false }); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(request.auth.credentials.user); } }); - - server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { - - expect(res.statusCode).to.equal(500); - done(); - }); - }); - - it('throws when strategy missing scheme', function (done) { - - var server = new Hapi.Server(); - server.connection(); - expect(function () { - - server.auth.strategy('none'); - }).to.throw('Authentication strategy none missing scheme'); - done(); - }); - - it('adds a route to server', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { steve: {} }, route: true }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(401); - - server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - }); - - it('uses views', function (done) { - - var implementation = function (server, options) { - - server.views({ - engines: { 'html': Handlebars }, - relativeTo: Path.join(__dirname, '/templates/plugin') - }); - - var handler = function (request, reply) { - - return reply.view('test', { message: 'steve' }); - }; - - server.route({ method: 'GET', path: '/view', handler: handler, config: { auth: false } }); - - return { - authenticate: function (request, reply) { - - return reply.view('test', { message: 'xyz' }); - } - }; - }; - - var server = new Hapi.Server(); - server.connection(); - - server.views({ - engines: { 'html': Handlebars }, - relativeTo: Path.join(__dirname, '/no/such/directory') - }); - - server.auth.scheme('custom', implementation); - server.auth.strategy('default', 'custom', true); - - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(); } }); - - server.inject('/view', function (res) { - - expect(res.result).to.equal('

steve

'); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result).to.equal('

xyz

'); - done(); - }); - }); - }); - }); - - describe('default()', function () { - - it('sets default', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', { users: { steve: {} } }); - - server.auth.default('default'); - expect(server.connections[0].auth.settings.default).to.deep.equal({ strategies: ['default'], mode: 'required' }); - - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(request.auth.credentials.user); } }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(401); - - server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - }); - - it('sets default with object', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', { users: { steve: {} } }); - server.auth.default({ strategy: 'default' }); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(request.auth.credentials.user); } }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(401); - - server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - }); - - it('throws when setting default twice', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', { users: { steve: {} } }); - expect(function () { - - server.auth.default('default'); - server.auth.default('default'); - }).to.throw('Cannot set default strategy more than once'); - done(); - }); - - it('throws when setting default without strategy', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', { users: { steve: {} } }); - expect(function () { - - server.auth.default({ mode: 'required' }); - }).to.throw('Default authentication strategy missing strategy name'); - done(); - }); - }); - - describe('_setupRoute()', function () { - - it('throws when route refers to nonexistent strategy', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('a', 'custom', { users: { steve: {} } }); - server.auth.strategy('b', 'custom', { users: { steve: {} } }); - - expect(function () { - - server.route({ - path: '/', - method: 'GET', - config: { - auth: { - strategy: 'c' - }, - handler: function (request, reply) { - - return reply('ok'); - } - } - }); - }).to.throw('Unknown authentication strategy: c in path: /'); - - done(); - }); - }); - - describe('authenticate()', function () { - - it('setups route with optional authentication', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { steve: {} } }); - - var handler = function (request, reply) { - - return reply(!!request.auth.credentials); - }; - server.route({ method: 'GET', path: '/', config: { handler: handler, auth: { mode: 'optional' } } }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.payload).to.equal('false'); - - server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.payload).to.equal('true'); - done(); - }); - }); - }); - - it('exposes mode', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { steve: {} } }); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(request.auth.mode); } }); - - server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result).to.equal('required'); - done(); - }); - }); - - it('authenticates using multiple strategies', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('first', 'custom', { users: { steve: 'skip' } }); - server.auth.strategy('second', 'custom', { users: { steve: {} } }); - server.route({ - method: 'GET', - path: '/', - config: { - handler: function (request, reply) { return reply(request.auth.strategy); }, - auth: { - strategies: ['first', 'second'] - } - } - }); - - server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result).to.equal('second'); - done(); - }); - }); - - it('authenticates using credentials object', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { steve: {} } }); - - var doubleHandler = function (request, reply) { - - var options = { url: '/2', credentials: request.auth.credentials }; - server.inject(options, function (res) { - - return reply(res.result); - }); - }; - - server.route({ method: 'GET', path: '/1', handler: doubleHandler }); - server.route({ method: 'GET', path: '/2', handler: function (request, reply) { return reply(request.auth.credentials.user); } }); - - server.inject({ url: '/1', headers: { authorization: 'Custom steve' } }, function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('authenticates a request with custom auth settings', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { steve: {} } }); - server.route({ - method: 'GET', - path: '/', - config: { - handler: function (request, reply) { return reply(request.auth.credentials.user); }, - auth: { - strategy: 'default' - } - } - }); - - server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('authenticates a request with auth strategy name config', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', { users: { steve: {} } }); - server.route({ - method: 'GET', - path: '/', - config: { - handler: function (request, reply) { return reply(request.auth.credentials.user); }, - auth: 'default' - } - }); - - server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('tries to authenticate a request', function (done) { - - var handler = function (request, reply) { - - return reply({ status: request.auth.isAuthenticated, error: request.auth.error }); - }; - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', 'try', { users: { steve: {} } }); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result.status).to.equal(false); - expect(res.result.error.message).to.equal('Missing authentication'); - - server.inject({ url: '/', headers: { authorization: 'Custom john' } }, function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result.status).to.equal(false); - expect(res.result.error.message).to.equal('Missing credentials'); - - server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result.status).to.equal(true); - expect(res.result.error).to.not.exist(); - done(); - }); - }); - }); - }); - - it('errors on invalid authenticate callback missing both error and credentials', function (done) { - - var server = new Hapi.Server({ debug: false }); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { steve: {} } }); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(request.auth.credentials.user); } }); - - server.inject({ url: '/', headers: { authorization: 'Custom' } }, function (res) { - - expect(res.statusCode).to.equal(500); - done(); - }); - }); - - it('logs error', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { steve: {} } }); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(request.auth.credentials.user); } }); - - server.on('request-internal', function (request, event, tags) { - - if (tags.auth) { - done(); - } - }); - - server.inject({ url: '/', headers: { authorization: 'Custom john' } }, function (res) { - - expect(res.statusCode).to.equal(401); - }); - }); - - it('returns a non Error error response', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { message: 'in a bottle' } }); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(request.auth.credentials.user); } }); - - server.inject({ url: '/', headers: { authorization: 'Custom message' } }, function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result).to.equal('in a bottle'); - done(); - }); - }); - - it('handles errors thrown inside authenticate', function (done) { - - var server = new Hapi.Server({ debug: false }); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { steve: 'throw' } }); - - server.once('request-error', function (request, err) { - - expect(err.message).to.equal('Uncaught error: Boom'); - }); - - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok'); } }); - - server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { - - expect(res.statusCode).to.equal(500); - done(); - }); - }); - - it('passes non Error error response when set to try ', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', 'try', { users: { message: 'in a bottle' } }); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok'); } }); - - server.inject({ url: '/', headers: { authorization: 'Custom message' } }, function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result).to.equal('in a bottle'); - done(); - }); - }); - - it('matches scope (array to single)', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { steve: { scope: ['one'] } } }); - server.route({ - method: 'GET', - path: '/', - config: { - handler: function (request, reply) { return reply(request.auth.credentials.user); }, - auth: { - scope: 'one' - } - } - }); - - server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('matches scope (array to array)', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { steve: { scope: ['one', 'two'] } } }); - server.route({ - method: 'GET', - path: '/', - config: { - handler: function (request, reply) { return reply(request.auth.credentials.user); }, - auth: { - scope: ['one', 'three'] - } - } - }); - - server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('matches scope (single to array)', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { steve: { scope: 'one' } } }); - server.route({ - method: 'GET', - path: '/', - config: { - handler: function (request, reply) { return reply(request.auth.credentials.user); }, - auth: { - scope: ['one', 'three'] - } - } - }); - - server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('matches scope (single to single)', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { steve: { scope: 'one' } } }); - server.route({ - method: 'GET', - path: '/', - config: { - handler: function (request, reply) { return reply(request.auth.credentials.user); }, - auth: { - scope: 'one' - } - } - }); - - server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('does not match scope (single to single)', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { steve: { scope: 'one' } } }); - server.route({ - method: 'GET', - path: '/', - config: { - handler: function (request, reply) { return reply(request.auth.credentials.user); }, - auth: { - scope: 'onex' - } - } - }); - - server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { - - expect(res.statusCode).to.equal(403); - done(); - }); - }); - - it('errors on missing scope', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { steve: { scope: ['a'] } } }); - server.route({ - method: 'GET', - path: '/', - config: { - handler: function (request, reply) { return reply(request.auth.credentials.user); }, - auth: { - scope: 'b' - } - } - }); - - server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { - - expect(res.statusCode).to.equal(403); - done(); - }); - }); - - it('errors on missing scope property', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { steve: {} } }); - server.route({ - method: 'GET', - path: '/', - config: { - handler: function (request, reply) { return reply(request.auth.credentials.user); }, - auth: { - scope: 'b' - } - } - }); - - server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { - - expect(res.statusCode).to.equal(403); - done(); - }); - }); - - it('errors on missing scope using arrays', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { steve: { scope: ['a', 'b'] } } }); - server.route({ - method: 'GET', - path: '/', - config: { - handler: function (request, reply) { return reply(request.auth.credentials.user); }, - auth: { - scope: ['c', 'd'] - } - } - }); - - server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { - - expect(res.statusCode).to.equal(403); - done(); - }); - }); - - it('ignores default scope when override set to null', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', { users: { steve: {} } }); - server.auth.default({ - strategy: 'default', - scope: 'one' - }); - - server.route({ - method: 'GET', - path: '/', - config: { - handler: function (request, reply) { return reply(request.auth.credentials.user); }, - auth: { - scope: false - } - } - }); - - server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('matches user entity', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { steve: { user: 'steve' } } }); - server.route({ - method: 'GET', - path: '/', - config: { - handler: function (request, reply) { return reply(request.auth.credentials.user); }, - auth: { - entity: 'user' - } - } - }); - - server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('errors on missing user entity', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { client: {} } }); - server.route({ - method: 'GET', - path: '/', - config: { - handler: function (request, reply) { return reply(request.auth.credentials.user); }, - auth: { - entity: 'user' - } - } - }); - - server.inject({ url: '/', headers: { authorization: 'Custom client' } }, function (res) { - - expect(res.statusCode).to.equal(403); - done(); - }); - }); - - it('matches app entity', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { client: {} } }); - server.route({ - method: 'GET', - path: '/', - config: { - handler: function (request, reply) { return reply(request.auth.credentials.user); }, - auth: { - entity: 'app' - } - } - }); - - server.inject({ url: '/', headers: { authorization: 'Custom client' } }, function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('errors on missing app entity', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { steve: { user: 'steve' } } }); - server.route({ - method: 'GET', - path: '/', - config: { - handler: function (request, reply) { return reply(request.auth.credentials.user); }, - auth: { - entity: 'app' - } - } - }); - - server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { - - expect(res.statusCode).to.equal(403); - done(); - }); - }); - - it('logs error code when authenticate returns a non-error error', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('test', function (server, options) { - - return { - authenticate: function (request, reply) { - - return reply('Redirecting ...').redirect('/test'); - } - }; - }); - - server.auth.strategy('test', 'test', true, {}); - - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('test'); } }); - - var result; - server.on('request-internal', function (request, event, tags) { - - if (tags.unauthenticated) { - result = event.data; - } - }); - - server.inject('/', function (res) { - - expect(result).to.equal(302); - done(); - }); - }); - }); - - describe('payload()', function () { - - it('authenticates request payload', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { validPayload: { payload: null } } }); - server.route({ - method: 'POST', - path: '/', - config: { - handler: function (request, reply) { return reply(request.auth.credentials.user); }, - auth: { - payload: 'required' - } - } - }); - - server.inject({ method: 'POST', url: '/', headers: { authorization: 'Custom validPayload' } }, function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('skips when scheme does not support it', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { validPayload: { payload: null } }, payload: false }); - server.route({ - method: 'POST', - path: '/', - config: { - handler: function (request, reply) { return reply(request.auth.credentials.user); } - } - }); - - server.inject({ method: 'POST', url: '/', headers: { authorization: 'Custom validPayload' } }, function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('authenticates request payload (required scheme)', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { validPayload: { payload: null } }, options: { payload: true } }); - server.route({ - method: 'POST', - path: '/', - config: { - handler: function (request, reply) { return reply(request.auth.credentials.user); }, - auth: {} - } - }); - - server.inject({ method: 'POST', url: '/', headers: { authorization: 'Custom validPayload' } }, function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('authenticates request payload (required scheme and required route)', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { validPayload: { payload: null } }, options: { payload: true } }); - server.route({ - method: 'POST', - path: '/', - config: { - handler: function (request, reply) { return reply(request.auth.credentials.user); }, - auth: { - payload: true - } - } - }); - - server.inject({ method: 'POST', url: '/', headers: { authorization: 'Custom validPayload' } }, function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('throws when scheme requires payload authentication and route conflicts', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { validPayload: { payload: null } }, options: { payload: true } }); - expect(function () { - - server.route({ - method: 'POST', - path: '/', - config: { - handler: function (request, reply) { return reply(request.auth.credentials.user); }, - auth: { - payload: 'optional' - } - } - }); - }).to.throw('Cannot set authentication payload to optional when a strategy requires payload validation /'); - done(); - }); - - it('throws when strategy does not support payload authentication', function (done) { - - var server = new Hapi.Server(); - server.connection(); - var implementation = function () { return { authenticate: internals.implementation().authenticate }; }; - - server.auth.scheme('custom', implementation); - server.auth.strategy('default', 'custom', true, {}); - expect(function () { - - server.route({ - method: 'POST', - path: '/', - config: { - handler: function (request, reply) { return reply(request.auth.credentials.user); }, - auth: { - payload: 'required' - } - } - }); - }).to.throw('Payload validation can only be required when all strategies support it in path: /'); - done(); - }); - - it('throws when no strategy supports optional payload authentication', function (done) { - - var server = new Hapi.Server(); - server.connection(); - var implementation = function () { return { authenticate: internals.implementation().authenticate }; }; - - server.auth.scheme('custom', implementation); - server.auth.strategy('default', 'custom', true, {}); - expect(function () { - - server.route({ - method: 'POST', - path: '/', - config: { - handler: function (request, reply) { return reply(request.auth.credentials.user); }, - auth: { - payload: 'optional' - } - } - }); - }).to.throw('Payload authentication requires at least one strategy with payload support in path: /'); - done(); - }); - - it('allows one strategy to supports optional payload authentication while another does not', function (done) { - - var server = new Hapi.Server(); - server.connection(); - var implementation = function () { return { authenticate: internals.implementation().authenticate }; }; - - server.auth.scheme('custom1', implementation); - server.auth.scheme('custom2', internals.implementation); - server.auth.strategy('default1', 'custom1', {}); - server.auth.strategy('default2', 'custom2', {}); - expect(function () { - - server.route({ - method: 'POST', - path: '/', - config: { - handler: function (request, reply) { return reply(request.auth.credentials.user); }, - auth: { - strategies: ['default2', 'default1'], - payload: 'optional' - } - } - }); - }).to.not.throw(); - done(); - }); - - it('skips request payload by default', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { skip: {} } }); - server.route({ - method: 'POST', - path: '/', - config: { - handler: function (request, reply) { return reply(request.auth.credentials.user); } - } - }); - - server.inject({ method: 'POST', url: '/', headers: { authorization: 'Custom skip' } }, function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('skips request payload when unauthenticated', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { skip: {} } }); - server.route({ - method: 'POST', - path: '/', - config: { - handler: function (request, reply) { return reply(); }, - auth: { - mode: 'try', - payload: 'required' - } - } - }); - - server.inject({ method: 'POST', url: '/' }, function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('skips optional payload', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { optionalPayload: { payload: Boom.unauthorized(null, 'Custom') } } }); - server.route({ - method: 'POST', - path: '/', - config: { - handler: function (request, reply) { return reply(request.auth.credentials.user); }, - auth: { - payload: 'optional' - } - } - }); - - server.inject({ method: 'POST', url: '/', headers: { authorization: 'Custom optionalPayload' } }, function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('errors on missing payload when required', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { optionalPayload: { payload: Boom.unauthorized(null, 'Custom') } } }); - server.route({ - method: 'POST', - path: '/', - config: { - handler: function (request, reply) { return reply(request.auth.credentials.user); }, - auth: { - payload: 'required' - } - } - }); - - server.inject({ method: 'POST', url: '/', headers: { authorization: 'Custom optionalPayload' } }, function (res) { - - expect(res.statusCode).to.equal(401); - done(); - }); - }); - - it('errors on invalid payload auth when required', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { optionalPayload: { payload: Boom.unauthorized() } } }); - server.route({ - method: 'POST', - path: '/', - config: { - handler: function (request, reply) { return reply(request.auth.credentials.user); }, - auth: { - payload: 'required' - } - } - }); - - server.inject({ method: 'POST', url: '/', headers: { authorization: 'Custom optionalPayload' } }, function (res) { - - expect(res.statusCode).to.equal(401); - done(); - }); - }); - - it('errors on invalid request payload (non error)', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { invalidPayload: { payload: 'Payload is invalid' } } }); - server.route({ - method: 'POST', - path: '/', - config: { - handler: function (request, reply) { return reply(request.auth.credentials.user); }, - auth: { - payload: 'required' - } - } - }); - - server.inject({ method: 'POST', url: '/', headers: { authorization: 'Custom invalidPayload' } }, function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result).to.equal('Payload is invalid'); - done(); - }); - }); - }); - - describe('response()', function () { - - it('fails on response error', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', true, { users: { steve: { response: Boom.internal() } } }); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(request.auth.credentials.user); } }); - - server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { - - expect(res.statusCode).to.equal(500); - done(); - }); - }); - }); - - describe('test()', function () { - - it('tests a request', function (done) { - - var handler = function (request, reply) { - - request.server.auth.test('default', request, function (err, credentials) { - - if (err) { - return reply({ status: false }); - } - - return reply({ status: true, user: credentials.name }); - }); - }; - - var server = new Hapi.Server(); - server.connection(); - server.auth.scheme('custom', internals.implementation); - server.auth.strategy('default', 'custom', { users: { steve: { name: 'steve' } } }); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result.status).to.equal(false); - - server.inject({ url: '/', headers: { authorization: 'Custom steve' } }, function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result.status).to.equal(true); - expect(res.result.user).to.equal('steve'); - done(); - }); - }); - }); - }); -}); - - -internals.implementation = function (server, options) { - - var settings = Hoek.clone(options); - - if (settings && - settings.route) { - - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(request.auth.credentials.user); } }); - } - - var scheme = { - authenticate: function (request, reply) { - - var req = request.raw.req; - var authorization = req.headers.authorization; - if (!authorization) { - return reply(Boom.unauthorized(null, 'Custom')); - } - - var parts = authorization.split(/\s+/); - if (parts.length !== 2) { - return reply.continue(); // Error without error or credentials - } - - var username = parts[1]; - var credentials = settings.users[username]; - - if (!credentials) { - return reply(Boom.unauthorized('Missing credentials', 'Custom')); - } - - if (credentials === 'skip') { - return reply(Boom.unauthorized(null, 'Custom')); - } - - if (credentials === 'throw') { - throw new Error('Boom'); - } - - if (typeof credentials === 'string') { - return reply(credentials); - } - - return reply.continue({ credentials: credentials }); - }, - response: function (request, reply) { - - if (request.auth.credentials.response) { - return reply(request.auth.credentials.response); - } - - return reply.continue(); - } - }; - - if (!settings || - settings.payload !== false) { - - scheme.payload = function (request, reply) { - - if (request.auth.credentials.payload) { - return reply(request.auth.credentials.payload); - } - - return reply.continue(); - }; - } - - if (settings && - settings.options) { - - scheme.options = settings.options; - } - - return scheme; -}; diff --git a/node_modules/hapi/test/connection.js b/node_modules/hapi/test/connection.js deleted file mode 100755 index 2776d61..0000000 --- a/node_modules/hapi/test/connection.js +++ /dev/null @@ -1,1306 +0,0 @@ -// Load modules - -var ChildProcess = require('child_process'); -var Fs = require('fs'); -var Http = require('http'); -var Https = require('https'); -var Net = require('net'); -var Os = require('os'); -var Path = require('path'); -var Boom = require('boom'); -var Code = require('code'); -var Handlebars = require('handlebars'); -var Hapi = require('..'); -var Hoek = require('hoek'); -var Lab = require('lab'); -var Wreck = require('wreck'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var describe = lab.describe; -var it = lab.it; -var expect = Code.expect; - - -describe('Connection', function () { - - it('allows null port and host', function (done) { - - var server = new Hapi.Server(); - expect(function () { - - server.connection({ host: null, port: null }); - }).to.not.throw(); - done(); - }); - - it('removes duplicate labels', function (done) { - - var server = new Hapi.Server(); - server.connection({ labels: ['a', 'b', 'a', 'c', 'b'] }); - expect(server.connections[0].settings.labels).to.deep.equal(['a', 'b', 'c']); - done(); - }); - - it('throws when disabling autoListen and providing a port', function (done) { - - var server = new Hapi.Server(); - expect(function () { - - server.connection({ port: 80, autoListen: false }); - }).to.throw('Cannot specify port when autoListen is false'); - done(); - }); - - it('throws when disabling autoListen and providing special host', function (done) { - - var server = new Hapi.Server(); - var port = Path.join(__dirname, 'hapi-server.socket'); - expect(function () { - - server.connection({ port: port, autoListen: false }); - }).to.throw('Cannot specify port when autoListen is false'); - done(); - }); - - it('defaults address to 0.0.0.0 or :: when no host is provided', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.start(function () { - - var expectedBoundAddress = '0.0.0.0'; - if (Net.isIPv6(server.listener.address().address)) { - expectedBoundAddress = '::'; - } - - expect(server.info.address).to.equal(expectedBoundAddress); - done(); - }); - }); - - it('uses address when present instead of host', function (done) { - - var server = new Hapi.Server(); - server.connection({ host: 'no.such.domain.hapi', address: 'localhost' }); - server.start(function () { - - expect(server.info.host).to.equal('no.such.domain.hapi'); - expect(server.info.address).to.equal('127.0.0.1'); - done(); - }); - }); - - it('uses uri when present instead of host and port', function (done) { - - var server = new Hapi.Server(); - server.connection({ host: 'no.such.domain.hapi', address: 'localhost', uri: 'http://uri.example.com:8080' }); - expect(server.info.uri).to.equal('http://uri.example.com:8080'); - server.start(function () { - - expect(server.info.host).to.equal('no.such.domain.hapi'); - expect(server.info.address).to.equal('127.0.0.1'); - expect(server.info.uri).to.equal('http://uri.example.com:8080'); - done(); - }); - }); - - it('throws on uri ending with /', function (done) { - - var server = new Hapi.Server(); - expect(function () { - - server.connection({ uri: 'http://uri.example.com:8080/' }); - }).to.throw(/Invalid connection options/); - done(); - }); - - it('creates a server listening on a unix domain socket', { skip: process.platform === 'win32' }, function (done) { - - var port = Path.join(__dirname, 'hapi-server.socket'); - var server = new Hapi.Server(); - server.connection({ port: port }); - - expect(server.connections[0].type).to.equal('socket'); - - server.start(function () { - - var absSocketPath = Path.resolve(port); - expect(server.info.port).to.equal(absSocketPath); - server.stop(function () { - - if (Fs.existsSync(port)) { - Fs.unlinkSync(port); - } - done(); - }); - }); - }); - - it('creates a server listening on a windows named pipe', function (done) { - - var port = '\\\\.\\pipe\\6653e55f-26ec-4268-a4f2-882f4089315c'; - var server = new Hapi.Server(); - server.connection({ port: port }); - - expect(server.connections[0].type).to.equal('socket'); - - server.start(function () { - - expect(server.info.port).to.equal(port); - server.stop(function () { - - done(); - }); - }); - }); - - it('creates an https server when passed tls options', function (done) { - - var tlsOptions = { - key: '-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA0UqyXDCqWDKpoNQQK/fdr0OkG4gW6DUafxdufH9GmkX/zoKz\ng/SFLrPipzSGINKWtyMvo7mPjXqqVgE10LDI3VFV8IR6fnART+AF8CW5HMBPGt/s\nfQW4W4puvBHkBxWSW1EvbecgNEIS9hTGvHXkFzm4xJ2e9DHp2xoVAjREC73B7JbF\nhc5ZGGchKw+CFmAiNysU0DmBgQcac0eg2pWoT+YGmTeQj6sRXO67n2xy/hA1DuN6\nA4WBK3wM3O4BnTG0dNbWUEbe7yAbV5gEyq57GhJIeYxRvveVDaX90LoAqM4cUH06\n6rciON0UbDHV2LP/JaH5jzBjUyCnKLLo5snlbwIDAQABAoIBAQDJm7YC3pJJUcxb\nc8x8PlHbUkJUjxzZ5MW4Zb71yLkfRYzsxrTcyQA+g+QzA4KtPY8XrZpnkgm51M8e\n+B16AcIMiBxMC6HgCF503i16LyyJiKrrDYfGy2rTK6AOJQHO3TXWJ3eT3BAGpxuS\n12K2Cq6EvQLCy79iJm7Ks+5G6EggMZPfCVdEhffRm2Epl4T7LpIAqWiUDcDfS05n\nNNfAGxxvALPn+D+kzcSF6hpmCVrFVTf9ouhvnr+0DpIIVPwSK/REAF3Ux5SQvFuL\njPmh3bGwfRtcC5d21QNrHdoBVSN2UBLmbHUpBUcOBI8FyivAWJhRfKnhTvXMFG8L\nwaXB51IZAoGBAP/E3uz6zCyN7l2j09wmbyNOi1AKvr1WSmuBJveITouwblnRSdvc\nsYm4YYE0Vb94AG4n7JIfZLKtTN0xvnCo8tYjrdwMJyGfEfMGCQQ9MpOBXAkVVZvP\ne2k4zHNNsfvSc38UNSt7K0HkVuH5BkRBQeskcsyMeu0qK4wQwdtiCoBDAoGBANF7\nFMppYxSW4ir7Jvkh0P8bP/Z7AtaSmkX7iMmUYT+gMFB5EKqFTQjNQgSJxS/uHVDE\nSC5co8WGHnRk7YH2Pp+Ty1fHfXNWyoOOzNEWvg6CFeMHW2o+/qZd4Z5Fep6qCLaa\nFvzWWC2S5YslEaaP8DQ74aAX4o+/TECrxi0z2lllAoGAdRB6qCSyRsI/k4Rkd6Lv\nw00z3lLMsoRIU6QtXaZ5rN335Awyrfr5F3vYxPZbOOOH7uM/GDJeOJmxUJxv+cia\nPQDflpPJZU4VPRJKFjKcb38JzO6C3Gm+po5kpXGuQQA19LgfDeO2DNaiHZOJFrx3\nm1R3Zr/1k491lwokcHETNVkCgYBPLjrZl6Q/8BhlLrG4kbOx+dbfj/euq5NsyHsX\n1uI7bo1Una5TBjfsD8nYdUr3pwWltcui2pl83Ak+7bdo3G8nWnIOJ/WfVzsNJzj7\n/6CvUzR6sBk5u739nJbfgFutBZBtlSkDQPHrqA7j3Ysibl3ZIJlULjMRKrnj6Ans\npCDwkQKBgQCM7gu3p7veYwCZaxqDMz5/GGFUB1My7sK0hcT7/oH61yw3O8pOekee\nuctI1R3NOudn1cs5TAy/aypgLDYTUGQTiBRILeMiZnOrvQQB9cEf7TFgDoRNCcDs\nV/ZWiegVB/WY7H0BkCekuq5bHwjgtJTpvHGqQ9YD7RhE8RSYOhdQ/Q==\n-----END RSA PRIVATE KEY-----\n', - cert: '-----BEGIN CERTIFICATE-----\nMIIDBjCCAe4CCQDvLNml6smHlTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJV\nUzETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0\ncyBQdHkgTHRkMB4XDTE0MDEyNTIxMjIxOFoXDTE1MDEyNTIxMjIxOFowRTELMAkG\nA1UEBhMCVVMxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0\nIFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nANFKslwwqlgyqaDUECv33a9DpBuIFug1Gn8Xbnx/RppF/86Cs4P0hS6z4qc0hiDS\nlrcjL6O5j416qlYBNdCwyN1RVfCEen5wEU/gBfAluRzATxrf7H0FuFuKbrwR5AcV\nkltRL23nIDRCEvYUxrx15Bc5uMSdnvQx6dsaFQI0RAu9weyWxYXOWRhnISsPghZg\nIjcrFNA5gYEHGnNHoNqVqE/mBpk3kI+rEVzuu59scv4QNQ7jegOFgSt8DNzuAZ0x\ntHTW1lBG3u8gG1eYBMquexoSSHmMUb73lQ2l/dC6AKjOHFB9Ouq3IjjdFGwx1diz\n/yWh+Y8wY1Mgpyiy6ObJ5W8CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAoSc6Skb4\ng1e0ZqPKXBV2qbx7hlqIyYpubCl1rDiEdVzqYYZEwmst36fJRRrVaFuAM/1DYAmT\nWMhU+yTfA+vCS4tql9b9zUhPw/IDHpBDWyR01spoZFBF/hE1MGNpCSXXsAbmCiVf\naxrIgR2DNketbDxkQx671KwF1+1JOMo9ffXp+OhuRo5NaGIxhTsZ+f/MA4y084Aj\nDI39av50sTRTWWShlN+J7PtdQVA5SZD97oYbeUeL7gI18kAJww9eUdmT0nEjcwKs\nxsQT1fyKbo7AlZBY4KSlUMuGnn0VnAsB9b+LxtXlDfnjyM8bVQx1uAfRo0DO8p/5\n3J5DTjAU55deBQ==\n-----END CERTIFICATE-----\n' - }; - - var server = new Hapi.Server(); - server.connection({ tls: tlsOptions }); - expect(server.listener instanceof Https.Server).to.equal(true); - done(); - }); - - it('uses a provided listener', function (done) { - - var listener = Http.createServer(); - var server = new Hapi.Server(); - server.connection({ listener: listener }); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok'); } }); - - server.start(function () { - - Wreck.get('http://localhost:' + server.info.port + '/', {}, function (err, res, body) { - - server.stop(); - expect(err).to.not.exist(); - expect(body.toString()).to.equal('ok'); - done(); - }); - }); - }); - - it('uses a provided listener (TLS)', function (done) { - - var listener = Http.createServer(); - var server = new Hapi.Server(); - server.connection({ listener: listener, tls: true }); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok'); } }); - - server.start(function () { - - expect(server.info.protocol).to.equal('https'); - server.stop(); - done(); - }); - }); - - it('uses a provided listener with manual listen', function (done) { - - var listener = Http.createServer(); - var server = new Hapi.Server(); - server.connection({ listener: listener, autoListen: false }); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok'); } }); - - listener.listen(0, 'localhost', function () { - - server.start(function () { - - Wreck.get('http://localhost:' + server.info.port + '/', {}, function (err, res, body) { - - server.stop(); - expect(err).to.not.exist(); - expect(body.toString()).to.equal('ok'); - done(); - }); - }); - }); - }); - - it('sets info.uri with default localhost when no hostname', { parallel: false }, function (done) { - - var orig = Os.hostname; - Os.hostname = function () { - - Os.hostname = orig; - return ''; - }; - - var server = new Hapi.Server(); - server.connection({ port: 80 }); - expect(server.info.uri).to.equal('http://localhost:80'); - done(); - }); - - it('sets info.uri without port when 0', function (done) { - - var server = new Hapi.Server(); - server.connection({ host: 'example.com' }); - expect(server.info.uri).to.equal('http://example.com'); - done(); - }); - - it('closes connection on socket timeout', { parallel: false }, function (done) { - - var server = new Hapi.Server(); - server.connection({ routes: { timeout: { socket: 50 }, payload: { timeout: 45 } } }); - server.route({ - method: 'GET', path: '/', config: { - handler: function (request, reply) { - - setTimeout(function () { - - return reply('too late'); - }, 70); - } - } - }); - - server.start(function () { - - Wreck.request('GET', 'http://localhost:' + server.info.port + '/', {}, function (err, res) { - - server.stop(); - expect(err).to.exist(); - expect(err.message).to.equal('Client request error: socket hang up'); - done(); - }); - }); - }); - - it('disables node socket timeout', { parallel: false }, function (done) { - - var server = new Hapi.Server(); - server.connection({ routes: { timeout: { socket: false } } }); - server.route({ method: 'GET', path: '/', config: { handler: function (request, reply) { return reply(); } } }); - - server.start(function () { - - var timeout; - var orig = Net.Socket.prototype.setTimeout; - Net.Socket.prototype.setTimeout = function () { - - timeout = 'gotcha'; - Net.Socket.prototype.setTimeout = orig; - return orig.apply(this, arguments); - }; - - Wreck.request('GET', 'http://localhost:' + server.info.port + '/', {}, function (err, res) { - - server.stop(); - expect(err).to.not.exist(); - expect(timeout).to.equal('gotcha'); - done(); - }); - }); - }); - - describe('_start()', function () { - - it('starts connection', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.start(function () { - - var expectedBoundAddress = '0.0.0.0'; - if (Net.isIPv6(server.listener.address().address)) { - expectedBoundAddress = '::'; - } - - expect(server.info.host).to.equal(Os.hostname()); - expect(server.info.address).to.equal(expectedBoundAddress); - expect(server.info.port).to.be.a.number().and.above(1); - server.stop(); - done(); - }); - }); - - it('starts connection (tls)', function (done) { - - var tlsOptions = { - key: '-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA0UqyXDCqWDKpoNQQK/fdr0OkG4gW6DUafxdufH9GmkX/zoKz\ng/SFLrPipzSGINKWtyMvo7mPjXqqVgE10LDI3VFV8IR6fnART+AF8CW5HMBPGt/s\nfQW4W4puvBHkBxWSW1EvbecgNEIS9hTGvHXkFzm4xJ2e9DHp2xoVAjREC73B7JbF\nhc5ZGGchKw+CFmAiNysU0DmBgQcac0eg2pWoT+YGmTeQj6sRXO67n2xy/hA1DuN6\nA4WBK3wM3O4BnTG0dNbWUEbe7yAbV5gEyq57GhJIeYxRvveVDaX90LoAqM4cUH06\n6rciON0UbDHV2LP/JaH5jzBjUyCnKLLo5snlbwIDAQABAoIBAQDJm7YC3pJJUcxb\nc8x8PlHbUkJUjxzZ5MW4Zb71yLkfRYzsxrTcyQA+g+QzA4KtPY8XrZpnkgm51M8e\n+B16AcIMiBxMC6HgCF503i16LyyJiKrrDYfGy2rTK6AOJQHO3TXWJ3eT3BAGpxuS\n12K2Cq6EvQLCy79iJm7Ks+5G6EggMZPfCVdEhffRm2Epl4T7LpIAqWiUDcDfS05n\nNNfAGxxvALPn+D+kzcSF6hpmCVrFVTf9ouhvnr+0DpIIVPwSK/REAF3Ux5SQvFuL\njPmh3bGwfRtcC5d21QNrHdoBVSN2UBLmbHUpBUcOBI8FyivAWJhRfKnhTvXMFG8L\nwaXB51IZAoGBAP/E3uz6zCyN7l2j09wmbyNOi1AKvr1WSmuBJveITouwblnRSdvc\nsYm4YYE0Vb94AG4n7JIfZLKtTN0xvnCo8tYjrdwMJyGfEfMGCQQ9MpOBXAkVVZvP\ne2k4zHNNsfvSc38UNSt7K0HkVuH5BkRBQeskcsyMeu0qK4wQwdtiCoBDAoGBANF7\nFMppYxSW4ir7Jvkh0P8bP/Z7AtaSmkX7iMmUYT+gMFB5EKqFTQjNQgSJxS/uHVDE\nSC5co8WGHnRk7YH2Pp+Ty1fHfXNWyoOOzNEWvg6CFeMHW2o+/qZd4Z5Fep6qCLaa\nFvzWWC2S5YslEaaP8DQ74aAX4o+/TECrxi0z2lllAoGAdRB6qCSyRsI/k4Rkd6Lv\nw00z3lLMsoRIU6QtXaZ5rN335Awyrfr5F3vYxPZbOOOH7uM/GDJeOJmxUJxv+cia\nPQDflpPJZU4VPRJKFjKcb38JzO6C3Gm+po5kpXGuQQA19LgfDeO2DNaiHZOJFrx3\nm1R3Zr/1k491lwokcHETNVkCgYBPLjrZl6Q/8BhlLrG4kbOx+dbfj/euq5NsyHsX\n1uI7bo1Una5TBjfsD8nYdUr3pwWltcui2pl83Ak+7bdo3G8nWnIOJ/WfVzsNJzj7\n/6CvUzR6sBk5u739nJbfgFutBZBtlSkDQPHrqA7j3Ysibl3ZIJlULjMRKrnj6Ans\npCDwkQKBgQCM7gu3p7veYwCZaxqDMz5/GGFUB1My7sK0hcT7/oH61yw3O8pOekee\nuctI1R3NOudn1cs5TAy/aypgLDYTUGQTiBRILeMiZnOrvQQB9cEf7TFgDoRNCcDs\nV/ZWiegVB/WY7H0BkCekuq5bHwjgtJTpvHGqQ9YD7RhE8RSYOhdQ/Q==\n-----END RSA PRIVATE KEY-----\n', - cert: '-----BEGIN CERTIFICATE-----\nMIIDBjCCAe4CCQDvLNml6smHlTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJV\nUzETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0\ncyBQdHkgTHRkMB4XDTE0MDEyNTIxMjIxOFoXDTE1MDEyNTIxMjIxOFowRTELMAkG\nA1UEBhMCVVMxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0\nIFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nANFKslwwqlgyqaDUECv33a9DpBuIFug1Gn8Xbnx/RppF/86Cs4P0hS6z4qc0hiDS\nlrcjL6O5j416qlYBNdCwyN1RVfCEen5wEU/gBfAluRzATxrf7H0FuFuKbrwR5AcV\nkltRL23nIDRCEvYUxrx15Bc5uMSdnvQx6dsaFQI0RAu9weyWxYXOWRhnISsPghZg\nIjcrFNA5gYEHGnNHoNqVqE/mBpk3kI+rEVzuu59scv4QNQ7jegOFgSt8DNzuAZ0x\ntHTW1lBG3u8gG1eYBMquexoSSHmMUb73lQ2l/dC6AKjOHFB9Ouq3IjjdFGwx1diz\n/yWh+Y8wY1Mgpyiy6ObJ5W8CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAoSc6Skb4\ng1e0ZqPKXBV2qbx7hlqIyYpubCl1rDiEdVzqYYZEwmst36fJRRrVaFuAM/1DYAmT\nWMhU+yTfA+vCS4tql9b9zUhPw/IDHpBDWyR01spoZFBF/hE1MGNpCSXXsAbmCiVf\naxrIgR2DNketbDxkQx671KwF1+1JOMo9ffXp+OhuRo5NaGIxhTsZ+f/MA4y084Aj\nDI39av50sTRTWWShlN+J7PtdQVA5SZD97oYbeUeL7gI18kAJww9eUdmT0nEjcwKs\nxsQT1fyKbo7AlZBY4KSlUMuGnn0VnAsB9b+LxtXlDfnjyM8bVQx1uAfRo0DO8p/5\n3J5DTjAU55deBQ==\n-----END CERTIFICATE-----\n' - }; - - var server = new Hapi.Server(); - server.connection({ host: '0.0.0.0', port: 0, tls: tlsOptions }); - server.start(function () { - - expect(server.info.host).to.equal('0.0.0.0'); - expect(server.info.port).to.not.equal(0); - server.stop(); - done(); - }); - }); - - it('sets info with defaults when missing hostname and address', { parallel: false }, function (done) { - - var hostname = Os.hostname; - Os.hostname = function () { - - Os.hostname = hostname; - return ''; - }; - - var server = new Hapi.Server(); - server.connection({ port: '8000' }); - expect(server.info.host).to.equal('localhost'); - expect(server.info.uri).to.equal('http://localhost:8000'); - done(); - }); - - it('ignored repeated calls', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.start(function () { - - server.start(function () { - - server.stop(function () { - - done(); - }); - }); - }); - }); - }); - - describe('_stop()', function () { - - it('waits to stop until all connections are closed', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.start(function () { - - var socket1 = new Net.Socket(); - var socket2 = new Net.Socket(); - socket1.on('error', function () { }); - socket2.on('error', function () { }); - - socket1.connect(server.info.port, '127.0.0.1', function () { - - socket2.connect(server.info.port, '127.0.0.1', function () { - - server.listener.getConnections(function (err, count) { - - expect(count).to.be.greaterThan(0); - - server.stop(function () { - - server.listener.getConnections(function (err, count) { - - expect(count).to.equal(0); - done(); - }); - }); - - socket1.end(); - socket2.end(); - }); - }); - }); - }); - }); - - it('waits to destroy connections until after the timeout', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.start(function () { - - var socket1 = new Net.Socket(); - var socket2 = new Net.Socket(); - - socket1.once('error', function (err) { - - expect(err.errno).to.equal('ECONNRESET'); - }); - - socket2.once('error', function (err) { - - expect(err.errno).to.equal('ECONNRESET'); - }); - - socket1.connect(server.info.port, server.connections[0].settings.host, function () { - - socket2.connect(server.info.port, server.connections[0].settings.host, function () { - - server.listener.getConnections(function (err, count) { - - expect(count).to.be.greaterThan(0); - var timer = new Hoek.Bench(); - - server.stop({ timeout: 20 }, function () { - - expect(timer.elapsed()).to.be.at.least(19); - done(); - }); - }); - }); - }); - }); - }); - - it('waits to destroy connections if they close by themselves', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.start(function () { - - var socket1 = new Net.Socket(); - var socket2 = new Net.Socket(); - - socket1.once('error', function (err) { - - expect(err.errno).to.equal('ECONNRESET'); - }); - - socket2.once('error', function (err) { - - expect(err.errno).to.equal('ECONNRESET'); - }); - - socket1.connect(server.info.port, server.connections[0].settings.host, function () { - - socket2.connect(server.info.port, server.connections[0].settings.host, function () { - - server.listener.getConnections(function (err, count) { - - expect(count).to.be.greaterThan(0); - var timer = new Hoek.Bench(); - - server.stop(function () { - - server.listener.getConnections(function (err, count) { - - expect(count).to.equal(0); - expect(timer.elapsed()).to.be.at.least(9); - done(); - }); - }); - - setTimeout(function () { - - socket1.end(); - socket2.end(); - }, 10); - }); - }); - }); - }); - }); - - it('refuses to handle new incoming requests', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok'); } }); - server.start(function () { - - var agent = new Http.Agent({ keepAlive: true, maxSockets: 1 }); - var err2; - - Wreck.get('http://localhost:' + server.info.port + '/', { agent: agent }, function (err1, res, body) { - - server.stop(function () { - - expect(err1).to.not.exist(); - expect(body.toString()).to.equal('ok'); - expect(server.connections[0]._started).to.equal(false); - expect(err2).to.exist(); - done(); - }); - }); - - Wreck.get('http://localhost:' + server.info.port + '/', { agent: agent }, function (err, res, body) { - - err2 = err; - }); - - }); - }); - - it('removes connection event listeners after it stops', function (done) { - - var server = new Hapi.Server(); - server.connection(); - var initial = server.listener.listeners('connection').length; - server.start(function () { - - expect(server.listener.listeners('connection').length).to.be.greaterThan(initial); - - server.stop(function () { - - server.start(function () { - - server.stop(function () { - - expect(server.listener.listeners('connection').length).to.equal(initial); - done(); - }); - }); - }); - }); - }); - - it('ignores repeated calls', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.stop(); - server.stop(); - done(); - }); - }); - - describe('_dispatch()', function () { - - it('rejects request due to high rss load', { parallel: false }, function (done) { - - var server = new Hapi.Server({ load: { sampleInterval: 5 } }); - server.connection({ load: { maxRssBytes: 1 } }); - - var handler = function (request, reply) { - - var start = Date.now(); - while (Date.now() - start < 10) { } - return reply('ok'); - }; - - var logged = null; - server.once('log', function (event, tags) { - - logged = (event.internal && tags.load && event.data); - }); - - server.route({ method: 'GET', path: '/', handler: handler }); - server.start(function (err) { - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - - setImmediate(function () { - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(503); - expect(logged.rss > 10000).to.equal(true); - server.stop(); - done(); - }); - }); - }); - }); - }); - }); - - describe('inject()', function () { - - it('keeps the options.credentials object untouched', function (done) { - - var handler = function (request, reply) { return reply(); }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', config: { handler: handler } }); - - var options = { - url: '/', - credentials: { foo: 'bar' } - }; - - server.connections[0].inject(options, function (res) { - - expect(res.statusCode).to.equal(200); - expect(options.credentials).to.exist(); - done(); - }); - }); - - it('returns the request object', function (done) { - - var handler = function (request, reply) { - - request.app.key = 'value'; - return reply(); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', config: { handler: handler } }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.request.app.key).to.equal('value'); - done(); - }); - }); - }); - - describe('table()', function () { - - it('returns an array of the current routes', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - server.route({ path: '/test/', method: 'get', handler: function () { } }); - server.route({ path: '/test/{p}/end', method: 'get', handler: function () { } }); - - var routes = server.table()[0].table; - - expect(routes.length).to.equal(2); - expect(routes[0].path).to.equal('/test/'); - done(); - }); - - it('returns the labels for the connections', function (done) { - - var server = new Hapi.Server(); - server.connection({ labels: ['test'] }); - - server.route({ path: '/test/', method: 'get', handler: function () { } }); - server.route({ path: '/test/{p}/end', method: 'get', handler: function () { } }); - - var connection = server.table()[0]; - - expect(connection.labels).to.only.include(['test']); - done(); - }); - - it('returns an array of the current routes (connection)', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - server.route({ path: '/test/', method: 'get', handler: function () { } }); - server.route({ path: '/test/{p}/end', method: 'get', handler: function () { } }); - - var routes = server.connections[0].table(); - - expect(routes.length).to.equal(2); - expect(routes[0].path).to.equal('/test/'); - done(); - }); - - it('combines global and vhost routes', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - server.route({ path: '/test/', method: 'get', handler: function () { } }); - server.route({ path: '/test/', vhost: 'one.example.com', method: 'get', handler: function () { } }); - server.route({ path: '/test/', vhost: 'two.example.com', method: 'get', handler: function () { } }); - server.route({ path: '/test/{p}/end', method: 'get', handler: function () { } }); - - var routes = server.table()[0].table; - - expect(routes.length).to.equal(4); - done(); - }); - - it('combines global and vhost routes and filters based on host', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - server.route({ path: '/test/', method: 'get', handler: function () { } }); - server.route({ path: '/test/', vhost: 'one.example.com', method: 'get', handler: function () { } }); - server.route({ path: '/test/', vhost: 'two.example.com', method: 'get', handler: function () { } }); - server.route({ path: '/test/{p}/end', method: 'get', handler: function () { } }); - - var routes = server.table('one.example.com')[0].table; - - expect(routes.length).to.equal(3); - done(); - }); - - it('accepts a list of hosts', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - server.route({ path: '/test/', method: 'get', handler: function () { } }); - server.route({ path: '/test/', vhost: 'one.example.com', method: 'get', handler: function () { } }); - server.route({ path: '/test/', vhost: 'two.example.com', method: 'get', handler: function () { } }); - server.route({ path: '/test/{p}/end', method: 'get', handler: function () { } }); - - var routes = server.table(['one.example.com', 'two.example.com'])[0].table; - - expect(routes.length).to.equal(4); - done(); - }); - - it('ignores unknown host', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - server.route({ path: '/test/', method: 'get', handler: function () { } }); - server.route({ path: '/test/', vhost: 'one.example.com', method: 'get', handler: function () { } }); - server.route({ path: '/test/', vhost: 'two.example.com', method: 'get', handler: function () { } }); - server.route({ path: '/test/{p}/end', method: 'get', handler: function () { } }); - - var routes = server.table('three.example.com')[0].table; - - expect(routes.length).to.equal(2); - done(); - }); - }); - - describe('ext()', function () { - - it('supports adding an array of methods', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.ext('onPreHandler', [ - function (request, reply) { - - request.app.x = '1'; - return reply.continue(); - }, - function (request, reply) { - - request.app.x += '2'; - return reply.continue(); - } - ]); - - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(request.app.x); } }); - - server.inject('/', function (res) { - - expect(res.result).to.equal('12'); - done(); - }); - }); - - it('sets bind via options', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.ext('onPreHandler', function (request, reply) { - - request.app.x = this.y; - return reply.continue(); - }, { bind: { y: 42 } }); - - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(request.app.x); } }); - - server.inject('/', function (res) { - - expect(res.result).to.equal(42); - done(); - }); - }); - - it('uses server views for ext added via server', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - server.views({ - engines: { html: Handlebars }, - path: __dirname + '/templates' - }); - - server.ext('onPreHandler', function (request, reply) { - - return reply.view('test'); - }); - - var test = function (plugin, options, next) { - - plugin.views({ - engines: { html: Handlebars }, - path: './no_such_directory_found' - }); - - plugin.route({ path: '/view', method: 'GET', handler: function (request, reply) { } }); - return next(); - }; - - test.attributes = { - name: 'test' - }; - - server.register(test, function (err) { - - server.inject('/view', function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - }); - - it('supports reply decorators on empty result', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.ext('onRequest', function (request, reply) { - - return reply().redirect('/elsewhere'); - }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(302); - expect(res.headers.location).to.equal('/elsewhere'); - done(); - }); - }); - - it('supports direct reply decorators', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.ext('onRequest', function (request, reply) { - - return reply.redirect('/elsewhere'); - }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(302); - expect(res.headers.location).to.equal('/elsewhere'); - done(); - }); - }); - - describe('onRequest', function (done) { - - it('replies with custom response', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.ext('onRequest', function (request, reply) { - - return reply(Boom.badRequest('boom')); - }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(400); - expect(res.result.message).to.equal('boom'); - done(); - }); - }); - - it('replies with error using reply(null, result)', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.ext('onRequest', function (request, reply) { - - return reply(null, Boom.badRequest('boom')); - }); - - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok'); } }); - - server.inject('/', function (res) { - - expect(res.result.message).to.equal('boom'); - done(); - }); - }); - - it('replies with a view', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.views({ - engines: { 'html': Handlebars }, - path: __dirname + '/templates' - }); - - server.ext('onRequest', function (request, reply) { - - return reply.view('test', { message: 'hola!' }); - }); - - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok'); } }); - - server.inject('/', function (res) { - - expect(res.result).to.equal('
\n

hola!

\n
\n'); - done(); - }); - }); - }); - - describe('onPreResponse', function (done) { - - it('replies with custom response', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.ext('onPreResponse', function (request, reply) { - - if (typeof request.response.source === 'string') { - return reply(Boom.badRequest('boom')); - } - - return reply.continue(); - }); - - server.route({ method: 'GET', path: '/text', handler: function (request, reply) { return reply('ok'); } }); - server.route({ method: 'GET', path: '/obj', handler: function (request, reply) { return reply({ status: 'ok' }); } }); - - server.inject({ method: 'GET', url: '/text' }, function (res) { - - expect(res.result.message).to.equal('boom'); - server.inject({ method: 'GET', url: '/obj' }, function (res) { - - expect(res.result.status).to.equal('ok'); - done(); - }); - }); - }); - - it('intercepts 404 responses', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.ext('onPreResponse', function (request, reply) { - - return reply(null, request.response.output.statusCode); - }); - - server.inject({ method: 'GET', url: '/missing' }, function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result).to.equal(404); - done(); - }); - }); - - it('intercepts 404 when using directory handler and file is missing', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - server.ext('onPreResponse', function (request, reply) { - - var response = request.response; - return reply({ isBoom: response.isBoom }); - }); - - server.route({ method: 'GET', path: '/{path*}', handler: { directory: { path: './somewhere', listing: false, index: true } } }); - - server.inject('/missing', function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result.isBoom).to.equal(true); - done(); - }); - }); - - it('intercepts 404 when using file handler and file is missing', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - server.ext('onPreResponse', function (request, reply) { - - var response = request.response; - return reply({ isBoom: response.isBoom }); - }); - - server.route({ method: 'GET', path: '/{path*}', handler: { file: './somewhere/something.txt' } }); - - server.inject('/missing', function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result.isBoom).to.equal(true); - done(); - }); - }); - - it('cleans unused file stream when response is overridden', { skip: process.platform === 'win32' }, function (done) { - - var server = new Hapi.Server(); - server.connection(); - - server.ext('onPreResponse', function (request, reply) { - - return reply({ something: 'else' }); - }); - - server.route({ method: 'GET', path: '/{path*}', handler: { directory: { path: './' } } }); - - server.inject('/package.json', function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result.something).to.equal('else'); - - var cmd = ChildProcess.spawn('lsof', ['-p', process.pid]); - var lsof = ''; - cmd.stdout.on('data', function (buffer) { - - lsof += buffer.toString(); - }); - - cmd.stdout.on('end', function () { - - var count = 0; - var lines = lsof.split('\n'); - for (var i = 0, il = lines.length; i < il; ++i) { - count += !!lines[i].match(/package.json/); - } - - expect(count).to.equal(0); - done(); - }); - - cmd.stdin.end(); - }); - }); - - it('executes multiple extensions', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.ext('onPreResponse', function (request, reply) { - - request.response.source = request.response.source + '1'; - return reply.continue(); - }); - - server.ext('onPreResponse', function (request, reply) { - - request.response.source = request.response.source + '2'; - return reply.continue(); - }); - - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('0'); } }); - - server.inject({ method: 'GET', url: '/' }, function (res) { - - expect(res.result).to.equal('012'); - done(); - }); - }); - }); - }); - - describe('route()', function () { - - it('overrides the default notFound handler', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: '*', path: '/{p*}', handler: function (request, reply) { return reply('found'); } }); - server.inject({ method: 'GET', url: '/page' }, function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result).to.equal('found'); - done(); - }); - }); - - it('responds to HEAD requests for a GET route', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok').etag('test').code(205); } }); - server.inject({ method: 'HEAD', url: '/' }, function (res) { - - expect(res.statusCode).to.equal(205); - expect(res.headers['content-type']).to.contain('text/html'); - expect(res.headers['content-length']).to.not.exist(); - expect(res.headers.etag).to.equal('"test"'); - expect(res.result).to.not.exist(); - done(); - }); - }); - - it('returns 404 on HEAD requests for non-GET routes', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'POST', path: '/', handler: function (request, reply) { return reply('ok'); } }); - server.inject({ method: 'HEAD', url: '/' }, function (res) { - - expect(res.statusCode).to.equal(404); - expect(res.result).to.not.exist(); - - server.inject({ method: 'HEAD', url: '/not-there' }, function (res) { - - expect(res.statusCode).to.equal(404); - expect(res.result).to.not.exist(); - done(); - }); - }); - }); - - it('allows methods array', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - var config = { method: ['GET', 'PUT', 'POST', 'DELETE'], path: '/', handler: function (request, reply) { return reply(request.route.method); } }; - server.route(config); - server.inject({ method: 'HEAD', url: '/' }, function (res) { - - expect(res.statusCode).to.equal(200); - - server.inject({ method: 'GET', url: '/' }, function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.payload).to.equal('get'); - - server.inject({ method: 'PUT', url: '/' }, function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.payload).to.equal('put'); - - server.inject({ method: 'POST', url: '/' }, function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.payload).to.equal('post'); - - server.inject({ method: 'DELETE', url: '/' }, function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.payload).to.equal('delete'); - expect(config.method).to.deep.equal(['GET', 'PUT', 'POST', 'DELETE']); - done(); - }); - }); - }); - }); - }); - }); - - it('adds routes using single and array methods', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route([ - { - method: 'GET', - path: '/api/products', - handler: function (request, reply) { return reply(); } - }, - { - method: 'GET', - path: '/api/products/{id}', - handler: function (request, reply) { return reply(); } - }, - { - method: 'POST', - path: '/api/products', - handler: function (request, reply) { return reply(); } - }, - { - method: ['PUT', 'PATCH'], - path: '/api/products/{id}', - handler: function (request, reply) { return reply(); } - }, - { - method: 'DELETE', - path: '/api/products/{id}', - handler: function (request, reply) { return reply(); } - } - ]); - - var table = server.table()[0].table; - var paths = table.map(function (route) { - var obj = { - method: route.method, - path: route.path - }; - return obj; - }); - - expect(table).to.have.length(6); - expect(paths).to.only.deep.include([ - { method: 'get', path: '/api/products' }, - { method: 'get', path: '/api/products/{id}' }, - { method: 'post', path: '/api/products' }, - { method: 'put', path: '/api/products/{id}' }, - { method: 'patch', path: '/api/products/{id}' }, - { method: 'delete', path: '/api/products/{id}' } - ]); - done(); - }); - }); - - describe('_defaultRoutes()', function () { - - it('returns 404 when making a request to a route that does not exist', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.inject({ method: 'GET', url: '/nope' }, function (res) { - - expect(res.statusCode).to.equal(404); - done(); - }); - }); - - it('returns 404 on OPTIONS when cors disabled', function (done) { - - var server = new Hapi.Server(); - server.connection({ routes: { cors: false } }); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(); } }); - - server.inject({ method: 'OPTIONS', url: '/' }, function (res) { - - expect(res.statusCode).to.equal(404); - done(); - }); - }); - - it('returns 400 on bad request', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/a/{p}', handler: function (request, reply) { return reply(); } }); - server.inject('/a/%', function (res) { - - expect(res.statusCode).to.equal(400); - done(); - }); - }); - - it('returns OPTIONS response', function (done) { - - var handler = function (request, reply) { - - return reply(Boom.badRequest()); - }; - - var server = new Hapi.Server(); - server.connection({ routes: { cors: true } }); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject({ method: 'OPTIONS', url: '/' }, function (res) { - - expect(res.headers['access-control-allow-origin']).to.equal('*'); - done(); - }); - }); - }); -}); diff --git a/node_modules/hapi/test/file/image.jpg b/node_modules/hapi/test/file/image.jpg deleted file mode 100755 index 6f7af65c1639bc875d8c6206e6a35324911ed577..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180452 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�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 ugY3YjH1Af6p5;U=+=H`k23{k4u}=vb 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 z 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 M^_5D!lI{Ed2bx`WTmS$7 diff --git a/node_modules/hapi/test/file/image.png.gz b/node_modules/hapi/test/file/image.png.gz deleted file mode 100755 index 6e9183bf98edc9f8689b7f7b268160d1cff2e519..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41936 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'); - done(); - }); - }); - }); - - describe('prerequisites()', function () { - - it('shows the complete prerequisite pipeline in the response', function (done) { - - var pre1 = function (request, reply) { - - return reply('Hello').code(444); - }; - - var pre2 = function (request, reply) { - - return reply(request.pre.m1 + request.pre.m3 + request.pre.m4); - }; - - var pre3 = function (request, reply) { - - process.nextTick(function () { - - return reply(' '); - }); - }; - - var pre4 = function (request, reply) { - - return reply('World'); - }; - - var pre5 = function (request, reply) { - - return reply(request.pre.m2 + '!'); - }; - - var handler = function (request, reply) { - - return reply(request.pre.m5); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ - method: 'GET', - path: '/', - config: { - pre: [ - [ - { method: pre1, assign: 'm1' }, - { method: pre3, assign: 'm3' }, - { method: pre4, assign: 'm4' } - ], - { method: pre2, assign: 'm2' }, - { method: pre5, assign: 'm5' } - ], - handler: handler - } - }); - - server.inject('/', function (res) { - - expect(res.result).to.equal('Hello World!'); - done(); - }); - }); - - it('allows a single prerequisite', function (done) { - - var pre = function (request, reply) { - - return reply('Hello'); - }; - - var handler = function (request, reply) { - - return reply(request.pre.p); - }; - - var server = new Hapi.Server(); - server.connection(); - - server.route({ - method: 'GET', - path: '/', - config: { - pre: [ - { method: pre, assign: 'p' } - ], - handler: handler - } - }); - - server.inject('/', function (res) { - - expect(res.result).to.equal('Hello'); - done(); - }); - }); - - it('allows an empty prerequisite array', function (done) { - - var handler = function (request, reply) { - - return reply('Hello'); - }; - - var server = new Hapi.Server(); - server.connection(); - - server.route({ - method: 'GET', - path: '/', - config: { - pre: [], - handler: handler - } - }); - - server.inject('/', function (res) { - - expect(res.result).to.equal('Hello'); - done(); - }); - }); - - it('takes over response', function (done) { - - var pre1 = function (request, reply) { - - return reply('Hello'); - }; - - var pre2 = function (request, reply) { - - return reply(request.pre.m1 + request.pre.m3 + request.pre.m4); - }; - - var pre3 = function (request, reply) { - - process.nextTick(function () { - - return reply(' ').takeover(); - }); - }; - - var pre4 = function (request, reply) { - - return reply('World'); - }; - - var pre5 = function (request, reply) { - - return reply(request.pre.m2 + '!'); - }; - - var handler = function (request, reply) { - - return reply(request.pre.m5); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ - method: 'GET', - path: '/', - config: { - pre: [ - [ - { method: pre1, assign: 'm1' }, - { method: pre3, assign: 'm3' }, - { method: pre4, assign: 'm4' } - ], - { method: pre2, assign: 'm2' }, - { method: pre5, assign: 'm5' } - ], - handler: handler - } - }); - - server.inject('/', function (res) { - - expect(res.result).to.equal(' '); - done(); - }); - }); - - it('returns error if prerequisite returns error', function (done) { - - var pre1 = function (request, reply) { - - return reply('Hello'); - }; - - var pre2 = function (request, reply) { - - return reply(Boom.internal('boom')); - }; - - var handler = function (request, reply) { - - return reply(request.pre.m1); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ - method: 'GET', - path: '/', - config: { - pre: [ - [{ method: pre1, assign: 'm1' }], - { method: pre2, assign: 'm2' } - ], - handler: handler - } - }); - - server.inject('/', function (res) { - - expect(res.result.statusCode).to.equal(500); - done(); - }); - }); - - it('passes wrapped object', function (done) { - - var pre = function (request, reply) { - - return reply('Hello').code(444); - }; - - var handler = function (request, reply) { - - return reply(request.preResponses.p); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ - method: 'GET', - path: '/', - config: { - pre: [ - { method: pre, assign: 'p' } - ], - handler: handler - } - }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(444); - done(); - }); - }); - - it('returns 500 if prerequisite throws', function (done) { - - var pre1 = function (request, reply) { - - return reply('Hello'); - }; - - var pre2 = function (request, reply) { - - a.b.c = 0; - }; - - var handler = function (request, reply) { - - return reply(request.pre.m1); - }; - - - var server = new Hapi.Server({ debug: false }); - server.connection(); - server.route({ - method: 'GET', - path: '/', - config: { - pre: [ - [{ method: pre1, assign: 'm1' }], - { method: pre2, assign: 'm2' } - ], - handler: handler - } - }); - - server.inject('/', function (res) { - - expect(res.result.statusCode).to.equal(500); - done(); - }); - }); - - it('returns a user record using server method', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - server.method('user', function (id, next) { - - return next(null, { id: id, name: 'Bob' }); - }); - - server.route({ - method: 'GET', - path: '/user/{id}', - config: { - pre: [ - 'user(params.id)' - ], - handler: function (request, reply) { - - return reply(request.pre.user); - } - } - }); - - server.inject('/user/5', function (res) { - - expect(res.result).to.deep.equal({ id: '5', name: 'Bob' }); - done(); - }); - }); - - it('returns a user record using server method in object', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - server.method('user', function (id, next) { - - return next(null, { id: id, name: 'Bob' }); - }); - - server.route({ - method: 'GET', - path: '/user/{id}', - config: { - pre: [ - { - method: 'user(params.id)', - assign: 'steve' - } - ], - handler: function (request, reply) { - - return reply(request.pre.steve); - } - } - }); - - server.inject('/user/5', function (res) { - - expect(res.result).to.deep.equal({ id: '5', name: 'Bob' }); - done(); - }); - }); - - it('returns a user name using multiple server methods', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - server.method('user', function (id, next) { - - return next(null, { id: id, name: 'Bob' }); - }); - - server.method('name', function (user, next) { - - return next(null, user.name); - }); - - server.route({ - method: 'GET', - path: '/user/{id}/name', - config: { - pre: [ - 'user(params.id)', - 'name(pre.user)' - ], - handler: function (request, reply) { - - return reply(request.pre.name); - } - } - }); - - server.inject('/user/5/name', function (res) { - - expect(res.result).to.equal('Bob'); - done(); - }); - }); - - it('returns a user record using server method with trailing space', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - server.method('user', function (id, next) { - - return next(null, { id: id, name: 'Bob' }); - }); - - server.route({ - method: 'GET', - path: '/user/{id}', - config: { - pre: [ - 'user(params.id )' - ], - handler: function (request, reply) { - - return reply(request.pre.user); - } - } - }); - - server.inject('/user/5', function (res) { - - expect(res.result).to.deep.equal({ id: '5', name: 'Bob' }); - done(); - }); - }); - - it('returns a user record using server method with leading space', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - server.method('user', function (id, next) { - - return next(null, { id: id, name: 'Bob' }); - }); - - server.route({ - method: 'GET', - path: '/user/{id}', - config: { - pre: [ - 'user( params.id)' - ], - handler: function (request, reply) { - - return reply(request.pre.user); - } - } - }); - - server.inject('/user/5', function (res) { - - expect(res.result).to.deep.equal({ id: '5', name: 'Bob' }); - done(); - }); - }); - - it('returns a user record using server method with zero args', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - server.method('user', function (next) { - - return next(null, { name: 'Bob' }); - }); - - server.route({ - method: 'GET', - path: '/user', - config: { - pre: [ - 'user()' - ], - handler: function (request, reply) { - - return reply(request.pre.user); - } - } - }); - - server.inject('/user', function (res) { - - expect(res.result).to.deep.equal({ name: 'Bob' }); - done(); - }); - }); - - it('returns a user record using server method with no args', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - server.method('user', function (request, next) { - - return next(null, { id: request.params.id, name: 'Bob' }); - }); - - server.route({ - method: 'GET', - path: '/user/{id}', - config: { - pre: [ - 'user' - ], - handler: function (request, reply) { - - return reply(request.pre.user); - } - } - }); - - server.inject('/user/5', function (res) { - - expect(res.result).to.deep.equal({ id: '5', name: 'Bob' }); - done(); - }); - }); - - it('returns a user record using server method with nested name', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - server.method('user.get', function (next) { - - return next(null, { name: 'Bob' }); - }); - - server.route({ - method: 'GET', - path: '/user', - config: { - pre: [ - 'user.get()' - ], - handler: function (request, reply) { - - return reply(request.pre['user.get']); - } - } - }); - - server.inject('/user', function (res) { - - expect(res.result).to.deep.equal({ name: 'Bob' }); - done(); - }); - }); - - it('fails on bad method name', function (done) { - - var server = new Hapi.Server(); - server.connection(); - var test = function () { - - server.route({ - method: 'GET', - path: '/x/{id}', - config: { - pre: [ - 'xuser(params.id)' - ], - handler: function (request, reply) { - - return reply(request.pre.user); - } - } - }); - }; - - expect(test).to.throw('Unknown server method in string notation: xuser(params.id)'); - done(); - }); - - it('fails on bad method syntax name', function (done) { - - var server = new Hapi.Server(); - server.connection(); - var test = function () { - - server.route({ - method: 'GET', - path: '/x/{id}', - config: { - pre: [ - 'userparams.id)' - ], - handler: function (request, reply) { - - return reply(request.pre.user); - } - } - }); - }; - - expect(test).to.throw('Invalid server method string notation: userparams.id)'); - done(); - }); - - it('sets pre failAction to error', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ - method: 'GET', - path: '/', - config: { - pre: [ - { - method: function (request, reply) { - - return reply(Boom.forbidden()); - }, - failAction: 'error' - } - ], - handler: function (request, reply) { - - return reply('ok'); - } - } - }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(403); - done(); - }); - }); - - it('sets pre failAction to ignore', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ - method: 'GET', - path: '/', - config: { - pre: [ - { - method: function (request, reply) { - - return reply(Boom.forbidden()); - }, - failAction: 'ignore' - } - ], - handler: function (request, reply) { - - return reply('ok'); - } - } - }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('sets pre failAction to log', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ - method: 'GET', - path: '/', - config: { - pre: [ - { - assign: 'before', - method: function (request, reply) { - - return reply(Boom.forbidden()); - }, - failAction: 'log' - } - ], - handler: function (request, reply) { - - return reply('ok'); - } - } - }); - - var log = null; - server.on('request-internal', function (request, event, tags) { - - if (event.internal && - tags.pre && - tags.error) { - - log = event.data.assign; - } - }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - expect(log).to.equal('before'); - done(); - }); - }); - - it('binds pre to route bind object', function (done) { - - var item = { x: 123 }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ - method: 'GET', - path: '/', - config: { - pre: [{ method: function (request, reply) { return reply(this.x); }, assign: 'x' }], - handler: function (request, reply) { return reply(request.pre.x); }, - bind: item - } - }); - - server.inject('/', function (res) { - - expect(res.result).to.equal(item.x); - done(); - }); - }); - - it('logs boom error instance as data if handler returns boom error', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ - method: 'GET', - path: '/', - config: { - handler: function (request, reply) { - - return reply(Boom.forbidden()); - } - } - }); - - var log = null; - server.on('request-internal', function (request, event, tags) { - - if (event.internal && - tags.handler && - tags.error) { - - log = event.data; - } - }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(403); - expect(log.data.isBoom).to.equal(true); - expect(log.data.output.statusCode).to.equal(403); - expect(log.data.message).to.equal('Forbidden'); - done(); - }); - }); - - it('logs server method using string notation when cache enabled', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - server.method('user', function (id, next) { - - return next(null, { id: id, name: 'Bob' }); - }, { cache: { expiresIn: 1000 } }); - - server.route({ - method: 'GET', - path: '/user/{id}', - config: { - pre: [ - 'user(params.id)' - ], - handler: function (request, reply) { - - return reply(request.getLog('method')); - } - } - }); - - server.inject('/user/5', function (res) { - - expect(res.result[0].tags).to.deep.equal(['pre', 'method', 'user']); - expect(res.result[0].internal).to.equal(true); - expect(res.result[0].data.msec).to.exist(); - done(); - }); - }); - - it('uses server method with cache via string notation', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - var gen = 0; - server.method('user', function (id, next) { - - return next(null, { id: id, name: 'Bob', gen: gen++ }); - }, { cache: { expiresIn: 1000 } }); - - server.route({ - method: 'GET', - path: '/user/{id}', - config: { - pre: [ - 'user(params.id)' - ], - handler: function (request, reply) { - - return reply(request.pre.user.gen); - } - } - }); - - server.start(function () { - - server.inject('/user/5', function (res) { - - expect(res.result).to.equal(0); - - server.inject('/user/5', function (res) { - - expect(res.result).to.equal(0); - done(); - }); - }); - }); - }); - }); - - describe('fromString()', function () { - - it('uses string handler', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.method('handler.get', function (request, reply) { - - return reply(null, request.params.x + request.params.y).code(299); - }); - - server.route({ method: 'GET', path: '/{x}/{y}', handler: 'handler.get' }); - server.inject('/a/b', function (res) { - - expect(res.statusCode).to.equal(299); - expect(res.result).to.equal('ab'); - done(); - }); - }); - }); - - describe('defaults()', function () { - - it('returns handler without defaults', function (done) { - - var handler = function (route, options) { - - return function (request, reply) { - - return reply(request.route.settings.app); - }; - }; - - var server = new Hapi.Server(); - server.connection(); - server.handler('test', handler); - server.route({ method: 'get', path: '/', handler: { test: 'value' } }); - server.inject('/', function (res) { - - expect(res.result).to.deep.equal({}); - done(); - }); - }); - - it('returns handler with object defaults', function (done) { - - var handler = function (route, options) { - - return function (request, reply) { - - return reply(request.route.settings.app); - }; - }; - - handler.defaults = { - app: { - x: 1 - } - }; - - var server = new Hapi.Server(); - server.connection(); - server.handler('test', handler); - server.route({ method: 'get', path: '/', handler: { test: 'value' } }); - server.inject('/', function (res) { - - expect(res.result).to.deep.equal({ x: 1 }); - done(); - }); - }); - - it('returns handler with function defaults', function (done) { - - var handler = function (route, options) { - - return function (request, reply) { - - return reply(request.route.settings.app); - }; - }; - - handler.defaults = function (method) { - return { - app: { - x: method - } - }; - }; - - var server = new Hapi.Server(); - server.connection(); - server.handler('test', handler); - server.route({ method: 'get', path: '/', handler: { test: 'value' } }); - server.inject('/', function (res) { - - expect(res.result).to.deep.equal({ x: 'get' }); - done(); - }); - }); - - it('throws on handler with invalid defaults', function (done) { - - var handler = function (route, options) { - - return function (request, reply) { - - return reply(request.route.settings.app); - }; - }; - - handler.defaults = 'invalid'; - - var server = new Hapi.Server(); - server.connection(); - expect(function () { - - server.handler('test', handler); - }).to.throw('Handler defaults property must be an object or function'); - - done(); - }); - }); - - describe('invoke()', function () { - - it('returns 500 on ext method exception (same tick)', function (done) { - - var server = new Hapi.Server({ debug: false }); - server.connection(); - server.ext('onRequest', function (request, next) { - - var x = a.b.c; - }); - - var handler = function (request, reply) { - - return reply('neven gonna happen'); - }; - - server.route({ method: 'GET', path: '/domain', handler: handler }); - - server.inject('/domain', function (res) { - - expect(res.statusCode).to.equal(500); - done(); - }); - }); - }); -}); diff --git a/node_modules/hapi/test/methods.js b/node_modules/hapi/test/methods.js deleted file mode 100755 index 24e9f89..0000000 --- a/node_modules/hapi/test/methods.js +++ /dev/null @@ -1,1044 +0,0 @@ -// Load modules - -var Bluebird = require('bluebird'); -var CatboxMemory = require('catbox-memory'); -var Code = require('code'); -var Hapi = require('..'); -var Lab = require('lab'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var describe = lab.describe; -var it = lab.it; -var expect = Code.expect; - - -describe('Methods', function () { - - it('registers a method', function (done) { - - var add = function (a, b, next) { - - return next(null, a + b); - }; - - var server = new Hapi.Server(); - server.method('add', add); - - server.methods.add(1, 5, function (err, result) { - - expect(result).to.equal(6); - done(); - }); - }); - - it('registers a method with leading _', function (done) { - - var _add = function (a, b, next) { - - return next(null, a + b); - }; - - var server = new Hapi.Server(); - server.method('_add', _add); - - server.methods._add(1, 5, function (err, result) { - - expect(result).to.equal(6); - done(); - }); - }); - - it('registers a method with leading $', function (done) { - - var $add = function (a, b, next) { - - return next(null, a + b); - }; - - var server = new Hapi.Server(); - server.method('$add', $add); - - server.methods.$add(1, 5, function (err, result) { - - expect(result).to.equal(6); - done(); - }); - }); - - it('registers a method with _', function (done) { - - var _add = function (a, b, next) { - - return next(null, a + b); - }; - - var server = new Hapi.Server(); - server.method('add_._that', _add); - - server.methods.add_._that(1, 5, function (err, result) { - - expect(result).to.equal(6); - done(); - }); - }); - - it('registers a method with $', function (done) { - - var $add = function (a, b, next) { - - return next(null, a + b); - }; - - var server = new Hapi.Server(); - server.method('add$.$that', $add); - - server.methods.add$.$that(1, 5, function (err, result) { - - expect(result).to.equal(6); - done(); - }); - }); - - it('registers a method (no callback)', function (done) { - - var add = function (a, b) { - - return a + b; - }; - - var server = new Hapi.Server(); - server.method('add', add, { callback: false }); - - expect(server.methods.add(1, 5)).to.equal(6); - done(); - }); - - it('registers a method (promise)', function (done) { - - var addAsync = function (a, b, next) { - - return next(null, a + b); - }; - - var add = Bluebird.promisify(addAsync); - - var server = new Hapi.Server(); - server.method('add', add, { callback: false }); - - server.methods.add(1, 5).then(function (result) { - - expect(result).to.equal(6); - done(); - }); - }); - - it('registers a method with nested name', function (done) { - - var add = function (a, b, next) { - - return next(null, a + b); - }; - - var server = new Hapi.Server(); - server.connection(); - server.method('tools.add', add); - - server.start(function () { - - server.methods.tools.add(1, 5, function (err, result) { - - expect(result).to.equal(6); - done(); - }); - }); - }); - - it('registers a method with bind and callback', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - var context = { name: 'Bob' }; - server.method('user', function (id, next) { - - return next(null, { id: id, name: this.name }); - }, { bind: context }); - - server.route({ - method: 'GET', - path: '/user/{id}', - config: { - pre: [ - 'user(params.id)' - ], - handler: function (request, reply) { - - return reply(request.pre.user); - } - } - }); - - server.inject('/user/5', function (res) { - - expect(res.result).to.deep.equal({ id: '5', name: 'Bob' }); - done(); - }); - }); - - it('registers two methods with shared nested name', function (done) { - - var add = function (a, b, next) { - - return next(null, a + b); - }; - - var sub = function (a, b, next) { - - return next(null, a - b); - }; - - var server = new Hapi.Server(); - server.connection(); - server.method('tools.add', add); - server.method('tools.sub', sub); - - server.start(function () { - - server.methods.tools.add(1, 5, function (err, result) { - - expect(result).to.equal(6); - server.methods.tools.sub(1, 5, function (err, result) { - - expect(result).to.equal(-4); - done(); - }); - }); - }); - }); - - it('throws when registering a method with nested name twice', function (done) { - - var add = function (a, b, next) { - - return next(null, a + b); - }; - - var server = new Hapi.Server(); - server.method('tools.add', add); - expect(function () { - - server.method('tools.add', add); - }).to.throw('Server method function name already exists'); - - done(); - }); - - it('throws when registering a method with name nested through a function', function (done) { - - var add = function (a, b, next) { - - return next(null, a + b); - }; - - var server = new Hapi.Server(); - server.method('add', add); - expect(function () { - - server.method('add.another', add); - }).to.throw('Invalid segment another in reach path add.another'); - - done(); - }); - - it('calls non cached method multiple times', function (done) { - - var gen = 0; - var method = function (id, next) { - - return next(null, { id: id, gen: gen++ }); - }; - - var server = new Hapi.Server(); - server.connection(); - server.method('test', method); - - server.start(function () { - - server.methods.test(1, function (err, result) { - - expect(result.gen).to.equal(0); - - server.methods.test(1, function (err, result) { - - expect(result.gen).to.equal(1); - done(); - }); - }); - }); - }); - - it('caches method value', function (done) { - - var gen = 0; - var method = function (id, next) { - - return next(null, { id: id, gen: gen++ }); - }; - - var server = new Hapi.Server(); - server.connection(); - server.method('test', method, { cache: { expiresIn: 1000 } }); - - server.start(function () { - - server.methods.test(1, function (err, result) { - - expect(err).to.not.exist(); - expect(result.gen).to.equal(0); - - server.methods.test(1, function (err, result) { - - expect(err).to.not.exist(); - expect(result.gen).to.equal(0); - done(); - }); - }); - }); - }); - - it('caches method value (no callback)', function (done) { - - var gen = 0; - var method = function (id) { - - return { id: id, gen: gen++ }; - }; - - var server = new Hapi.Server(); - server.connection(); - server.method('test', method, { cache: { expiresIn: 1000 }, callback: false }); - - server.start(function () { - - server.methods.test(1, function (err, result) { - - expect(err).to.not.exist(); - expect(result.gen).to.equal(0); - - server.methods.test(1, function (err, result) { - - expect(err).to.not.exist(); - expect(result.gen).to.equal(0); - done(); - }); - }); - }); - }); - - it('caches method value (promise)', function (done) { - - var gen = 0; - var methodAsync = function (id, next) { - - if (id === 2) { - return next(new Error('boom')); - } - - return next(null, { id: id, gen: gen++ }); - }; - - var method = Bluebird.promisify(methodAsync); - - var server = new Hapi.Server(); - server.connection(); - server.method('test', method, { cache: { expiresIn: 1000 }, callback: false }); - - server.start(function () { - - server.methods.test(1, function (err, result) { - - expect(err).to.not.exist(); - expect(result.gen).to.equal(0); - - server.methods.test(1, function (err, result) { - - expect(err).to.not.exist(); - expect(result.gen).to.equal(0); - - server.methods.test(2, function (err, result) { - - expect(err).to.exist(); - expect(err.message).to.equal('boom'); - done(); - }); - }); - }); - }); - }); - - it('reuses cached method value with custom key function', function (done) { - - var gen = 0; - var method = function (id, next) { - - return next(null, { id: id, gen: gen++ }); - }; - - var server = new Hapi.Server(); - server.connection(); - server.method('test', method, { cache: { expiresIn: 1000 }, generateKey: function (id) { return '' + (id + 1); } }); - - server.start(function () { - - server.methods.test(1, function (err, result) { - - expect(result.gen).to.equal(0); - - server.methods.test(1, function (err, result) { - - expect(result.gen).to.equal(0); - done(); - }); - }); - }); - }); - - it('errors when custom key function return null', function (done) { - - var method = function (id, next) { - - return next(null, { id: id }); - }; - - var server = new Hapi.Server(); - server.connection(); - server.method('test', method, { cache: { expiresIn: 1000 }, generateKey: function (id) { return null; } }); - - server.start(function () { - - server.methods.test(1, function (err, result) { - - expect(err).to.exist(); - expect(err.message).to.equal('Invalid method key when invoking: test'); - done(); - }); - }); - }); - - it('does not cache when custom key function returns a non-string', function (done) { - - var method = function (id, next) { - - return next(null, { id: id }); - }; - - var server = new Hapi.Server(); - server.connection(); - server.method('test', method, { cache: { expiresIn: 1000 }, generateKey: function (id) { return 123; } }); - - server.start(function () { - - server.methods.test(1, function (err, result) { - - expect(err).to.exist(); - expect(err.message).to.equal('Invalid method key when invoking: test'); - done(); - }); - }); - }); - - it('does not cache value when ttl is 0', function (done) { - - var gen = 0; - var method = function (id, next) { - - return next(null, { id: id, gen: gen++ }, 0); - }; - - var server = new Hapi.Server(); - server.connection(); - server.method('test', method, { cache: { expiresIn: 1000 } }); - - server.start(function () { - - server.methods.test(1, function (err, result) { - - expect(result.gen).to.equal(0); - - server.methods.test(1, function (err, result) { - - expect(result.gen).to.equal(1); - done(); - }); - }); - }); - }); - - it('generates new value after cache drop', function (done) { - - var gen = 0; - var method = function (id, next) { - - return next(null, { id: id, gen: gen++ }); - }; - - var server = new Hapi.Server(); - server.connection(); - server.method('dropTest', method, { cache: { expiresIn: 1000 } }); - - server.start(function () { - - server.methods.dropTest(2, function (err, result) { - - expect(result.gen).to.equal(0); - server.methods.dropTest.cache.drop(2, function (err) { - - expect(err).to.not.exist(); - - server.methods.dropTest(2, function (err, result) { - - expect(result.gen).to.equal(1); - done(); - }); - }); - }); - }); - }); - - it('errors on invalid drop key', function (done) { - - var gen = 0; - var method = function (id, next) { - - return next(null, { id: id, gen: gen++ }); - }; - - var server = new Hapi.Server(); - server.connection(); - server.method('dropErrTest', method, { cache: { expiresIn: 1000 } }); - - server.start(function () { - - server.methods.dropErrTest.cache.drop(function () { }, function (err) { - - expect(err).to.exist(); - done(); - }); - }); - }); - - it('throws an error when name is not a string', function (done) { - - expect(function () { - - var server = new Hapi.Server(); - server.method(0, function () { }); - }).to.throw('name must be a string'); - done(); - }); - - it('throws an error when name is invalid', function (done) { - - expect(function () { - - var server = new Hapi.Server(); - server.method('0', function () { }); - }).to.throw('Invalid name: 0'); - - expect(function () { - - var server = new Hapi.Server(); - server.method('a..', function () { }); - }).to.throw('Invalid name: a..'); - - expect(function () { - - var server = new Hapi.Server(); - server.method('a.0', function () { }); - }).to.throw('Invalid name: a.0'); - - expect(function () { - - var server = new Hapi.Server(); - server.method('.a', function () { }); - }).to.throw('Invalid name: .a'); - - done(); - }); - - it('throws an error when method is not a function', function (done) { - - expect(function () { - - var server = new Hapi.Server(); - server.method('user', 'function'); - }).to.throw('method must be a function'); - done(); - }); - - it('throws an error when options is not an object', function (done) { - - expect(function () { - - var server = new Hapi.Server(); - server.method('user', function () { }, 'options'); - }).to.throw(/Invalid method options \(user\)/); - done(); - }); - - it('throws an error when options.generateKey is not a function', function (done) { - - expect(function () { - - var server = new Hapi.Server(); - server.method('user', function () { }, { generateKey: 'function' }); - }).to.throw(/Invalid method options \(user\)/); - done(); - }); - - it('throws an error when options.cache is not valid', function (done) { - - expect(function () { - - var server = new Hapi.Server({ cache: CatboxMemory }); - server.method('user', function () { }, { cache: { x: 'y' } }); - }).to.throw(/Invalid cache policy configuration/); - done(); - }); - - it('returns a valid result when calling a method without using the cache', function (done) { - - var server = new Hapi.Server(); - server.method('user', function (id, next) { return next(null, { id: id }); }); - server.methods.user(4, function (err, result) { - - expect(result.id).to.equal(4); - done(); - }); - }); - - it('returns a valid result when calling a method when using the cache', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.start(function () { - - server.method('user', function (id, str, next) { return next(null, { id: id, str: str }); }, { cache: { expiresIn: 1000 } }); - server.methods.user(4, 'something', function (err, result) { - - expect(result.id).to.equal(4); - expect(result.str).to.equal('something'); - done(); - }); - }); - }); - - it('returns an error result when calling a method that returns an error', function (done) { - - var server = new Hapi.Server(); - server.method('user', function (id, next) { return next(new Error()); }); - server.methods.user(4, function (err, result) { - - expect(err).to.exist(); - done(); - }); - }); - - it('returns a different result when calling a method without using the cache', function (done) { - - var server = new Hapi.Server(); - var gen = 0; - server.method('user', function (id, next) { return next(null, { id: id, gen: ++gen }); }); - server.methods.user(4, function (err, result1) { - - expect(result1.id).to.equal(4); - expect(result1.gen).to.equal(1); - server.methods.user(4, function (err, result2) { - - expect(result2.id).to.equal(4); - expect(result2.gen).to.equal(2); - done(); - }); - }); - }); - - it('returns a valid result when calling a method using the cache', function (done) { - - var server = new Hapi.Server({ cache: CatboxMemory }); - server.connection(); - - var gen = 0; - server.method('user', function (id, next) { return next(null, { id: id, gen: ++gen }); }, { cache: { expiresIn: 2000 } }); - - server.start(function () { - - var id = Math.random(); - server.methods.user(id, function (err, result1) { - - expect(result1.id).to.equal(id); - expect(result1.gen).to.equal(1); - server.methods.user(id, function (err, result2) { - - expect(result2.id).to.equal(id); - expect(result2.gen).to.equal(1); - done(); - }); - }); - }); - }); - - it('returns timeout when method taking too long using the cache', function (done) { - - var server = new Hapi.Server({ cache: CatboxMemory }); - server.connection(); - - var gen = 0; - var method = function (id, next) { - - setTimeout(function () { - - return next(null, { id: id, gen: ++gen }); - }, 5); - }; - - server.method('user', method, { cache: { expiresIn: 2000, generateTimeout: 3 } }); - - server.start(function () { - - var id = Math.random(); - server.methods.user(id, function (err, result1) { - - expect(err.output.statusCode).to.equal(503); - - setTimeout(function () { - - server.methods.user(id, function (err, result2) { - - expect(result2.id).to.equal(id); - expect(result2.gen).to.equal(1); - done(); - }); - }, 3); - }); - }); - }); - - it('supports empty key method', function (done) { - - var server = new Hapi.Server({ cache: CatboxMemory }); - server.connection(); - - var gen = 0; - var terms = 'I agree to give my house'; - server.method('tos', function (next) { return next(null, { gen: gen++, terms: terms }); }, { cache: { expiresIn: 2000 } }); - - server.start(function () { - - server.methods.tos(function (err, result1) { - - expect(result1.terms).to.equal(terms); - expect(result1.gen).to.equal(0); - server.methods.tos(function (err, result2) { - - expect(result2.terms).to.equal(terms); - expect(result2.gen).to.equal(0); - done(); - }); - }); - }); - }); - - it('returns valid results when calling a method (with different keys) using the cache', function (done) { - - var server = new Hapi.Server({ cache: CatboxMemory }); - server.connection(); - var gen = 0; - server.method('user', function (id, next) { return next(null, { id: id, gen: ++gen }); }, { cache: { expiresIn: 2000 } }); - server.start(function () { - - var id1 = Math.random(); - server.methods.user(id1, function (err, result1) { - - expect(result1.id).to.equal(id1); - expect(result1.gen).to.equal(1); - var id2 = Math.random(); - server.methods.user(id2, function (err, result2) { - - expect(result2.id).to.equal(id2); - expect(result2.gen).to.equal(2); - done(); - }); - }); - }); - }); - - it('errors when key generation fails', function (done) { - - var server = new Hapi.Server({ cache: CatboxMemory }); - server.connection(); - - var method = function (id, next) { - - return next(null, { id: id }); - }; - - server.method([{ name: 'user', method: method, options: { cache: { expiresIn: 2000 } } }]); - - server.start(function () { - - server.methods.user(1, function (err, result1) { - - expect(result1.id).to.equal(1); - - server.methods.user(function () { }, function (err, result2) { - - expect(err).to.exist(); - expect(err.message).to.equal('Invalid method key when invoking: user'); - done(); - }); - }); - }); - }); - - it('sets method bind without cache', function (done) { - - var method = function (id, next) { - - return next(null, { id: id, gen: this.gen++ }); - }; - - var server = new Hapi.Server(); - server.connection(); - server.method('test', method, { bind: { gen: 7 } }); - - server.start(function () { - - server.methods.test(1, function (err, result) { - - expect(result.gen).to.equal(7); - - server.methods.test(1, function (err, result) { - - expect(result.gen).to.equal(8); - done(); - }); - }); - }); - }); - - it('sets method bind with cache', function (done) { - - var method = function (id, next) { - - return next(null, { id: id, gen: this.gen++ }); - }; - - var server = new Hapi.Server(); - server.connection(); - server.method('test', method, { bind: { gen: 7 }, cache: { expiresIn: 1000 } }); - - server.start(function () { - - server.methods.test(1, function (err, result) { - - expect(result.gen).to.equal(7); - - server.methods.test(1, function (err, result) { - - expect(result.gen).to.equal(7); - done(); - }); - }); - }); - }); - - it('shallow copies bind config', function (done) { - - var bind = { gen: 7 }; - var method = function (id, next) { - - return next(null, { id: id, gen: this.gen++, bound: (this === bind) }); - }; - - var server = new Hapi.Server(); - server.connection(); - server.method('test', method, { bind: bind, cache: { expiresIn: 1000 } }); - - server.start(function () { - - server.methods.test(1, function (err, result) { - - expect(result.gen).to.equal(7); - expect(result.bound).to.equal(true); - - server.methods.test(1, function (err, result) { - - expect(result.gen).to.equal(7); - done(); - }); - }); - }); - }); - - describe('_add()', function () { - - it('normalizes no callback into callback (direct)', function (done) { - - var add = function (a, b) { - - return a + b; - }; - - var server = new Hapi.Server(); - server.method('add', add, { callback: false }); - var result = server.methods.add(1, 5); - expect(result).to.equal(6); - done(); - }); - - it('normalizes no callback into callback (direct error)', function (done) { - - var add = function (a, b) { - - return new Error('boom'); - }; - - var server = new Hapi.Server(); - server.method('add', add, { callback: false }); - var result = server.methods.add(1, 5); - expect(result).to.be.instanceof(Error); - expect(result.message).to.equal('boom'); - done(); - }); - - it('normalizes no callback into callback (direct throw)', function (done) { - - var add = function (a, b) { - - throw new Error('boom'); - }; - - var server = new Hapi.Server(); - server.method('add', add, { callback: false }); - expect(function () { - - server.methods.add(1, 5); - }).to.throw('boom'); - done(); - }); - - it('normalizes no callback into callback (normalized)', function (done) { - - var add = function (a, b) { - - return a + b; - }; - - var server = new Hapi.Server(); - server.method('add', add, { callback: false }); - - server._methods._normalized.add(1, 5, function (err, result) { - - expect(result).to.equal(6); - done(); - }); - }); - - it('normalizes no callback into callback (normalized error)', function (done) { - - var add = function (a, b) { - - return new Error('boom'); - }; - - var server = new Hapi.Server(); - server.method('add', add, { callback: false }); - - server._methods._normalized.add(1, 5, function (err, result) { - - expect(err).to.exist(); - expect(err.message).to.equal('boom'); - done(); - }); - }); - - it('normalizes no callback into callback (normalized throw)', function (done) { - - var add = function (a, b) { - - throw new Error('boom'); - }; - - var server = new Hapi.Server(); - server.method('add', add, { callback: false }); - - server._methods._normalized.add(1, 5, function (err, result) { - - expect(err).to.exist(); - expect(err.message).to.equal('boom'); - done(); - }); - }); - }); - - it('normalizes no callback into callback (cached)', function (done) { - - var add = function (a, b) { - - return a + b; - }; - - var server = new Hapi.Server(); - server.method('add', add, { cache: { expiresIn: 10 }, callback: false }); - - server._methods._normalized.add(1, 5, function (err, result) { - - expect(result).to.equal(6); - done(); - }); - }); - - it('normalizes no callback into callback (cached error)', function (done) { - - var add = function (a, b) { - - return new Error('boom'); - }; - - var server = new Hapi.Server(); - server.method('add', add, { cache: { expiresIn: 10 }, callback: false }); - - server._methods._normalized.add(1, 5, function (err, result) { - - expect(err).to.exist(); - expect(err.message).to.equal('boom'); - done(); - }); - }); - - it('normalizes no callback into callback (cached throw)', function (done) { - - var add = function (a, b) { - - throw new Error('boom'); - }; - - var server = new Hapi.Server(); - server.method('add', add, { cache: { expiresIn: 10 }, callback: false }); - - server._methods._normalized.add(1, 5, function (err, result) { - - expect(err).to.exist(); - expect(err.message).to.equal('boom'); - done(); - }); - }); -}); diff --git a/node_modules/hapi/test/payload.js b/node_modules/hapi/test/payload.js deleted file mode 100755 index f37a8a7..0000000 --- a/node_modules/hapi/test/payload.js +++ /dev/null @@ -1,649 +0,0 @@ -// Load modules - -var Fs = require('fs'); -var Http = require('http'); -var Path = require('path'); -var Zlib = require('zlib'); -var Code = require('code'); -var Hapi = require('..'); -var Hoek = require('hoek'); -var Lab = require('lab'); -var Wreck = require('wreck'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var describe = lab.describe; -var it = lab.it; -var expect = Code.expect; - - -describe('payload', function () { - - it('sets payload', function (done) { - - var payload = '{"x":"1","y":"2","z":"3"}'; - - var handler = function (request, reply) { - - expect(request.payload).to.exist(); - expect(request.payload.z).to.equal('3'); - expect(request.mime).to.equal('application/json'); - return reply(request.payload); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'POST', path: '/', config: { handler: handler } }); - - server.inject({ method: 'POST', url: '/', payload: payload }, function (res) { - - expect(res.result).to.exist(); - expect(res.result.x).to.equal('1'); - done(); - }); - }); - - it('handles request socket error', function (done) { - - var handler = function () { - - throw new Error('never called'); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'POST', path: '/', config: { handler: handler } }); - - server.inject({ method: 'POST', url: '/', payload: 'test', simulate: { error: true, end: false } }, function (res) { - - expect(res.result).to.exist(); - expect(res.result.statusCode).to.equal(500); - done(); - }); - }); - - it('handles request socket close', function (done) { - - var handler = function () { - - throw new Error('never called'); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'POST', path: '/', config: { handler: handler } }); - - server.once('response', function (request) { - - expect(request._isBailed).to.equal(true); - done(); - }); - - server.inject({ method: 'POST', url: '/', payload: 'test', simulate: { close: true, end: false } }, function (res) { }); - }); - - it('handles aborted request', function (done) { - - var handler = function (request, reply) { - - return reply('Success'); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'POST', path: '/', config: { handler: handler, payload: { parse: false } } }); - - server.start(function () { - - var options = { - hostname: 'localhost', - port: server.info.port, - path: '/', - method: 'POST', - headers: { - 'Content-Length': '10' - } - }; - - var req = Http.request(options, function (res) { - - }); - - req.write('Hello\n'); - - req.on('error', function (err) { - - expect(err.code).to.equal('ECONNRESET'); - done(); - }); - - setTimeout(function () { - - req.abort(); - }, 15); - }); - }); - - it('errors when payload too big', function (done) { - - var payload = '{"x":"1","y":"2","z":"3"}'; - - var handler = function (request, reply) { - - expect(request.payload.toString()).to.equal(payload); - return reply(request.payload); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'POST', path: '/', config: { handler: handler, payload: { maxBytes: 10 } } }); - - server.inject({ method: 'POST', url: '/', payload: payload, headers: { 'content-length': payload.length } }, function (res) { - - expect(res.statusCode).to.equal(400); - expect(res.result).to.exist(); - expect(res.result.message).to.equal('Payload content length greater than maximum allowed: 10'); - done(); - }); - }); - - it('returns 400 with response when payload is not consumed', function (done) { - - var payload = new Buffer(10 * 1024 * 1024).toString(); - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'POST', path: '/', config: { handler: function (request, reply) { return reply(); }, payload: { maxBytes: 1024 * 1024 } } }); - - server.start(function () { - - var uri = 'http://localhost:' + server.info.port; - - Wreck.post(uri, { payload: payload }, function (err, res, body) { - - expect(err).to.not.exist(); - expect(res.statusCode).to.equal(400); - expect(body).to.equal('{"statusCode":400,"error":"Bad Request","message":"Payload content length greater than maximum allowed: 1048576"}'); - - done(); - }); - }); - }); - - it('peeks at unparsed data', function (done) { - - var data = null; - var ext = function (request, reply) { - - var chunks = []; - request.on('peek', function (chunk) { - - chunks.push(chunk); - }); - - request.once('finish', function () { - - data = Buffer.concat(chunks); - }); - - return reply.continue(); - }; - - var handler = function (request, reply) { - - return reply(data); - }; - - var server = new Hapi.Server(); - server.connection(); - server.ext('onRequest', ext); - server.route({ method: 'POST', path: '/', config: { handler: handler, payload: { parse: false } } }); - - var payload = '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789'; - server.inject({ method: 'POST', url: '/', payload: payload }, function (res) { - - expect(res.result).to.equal(payload); - done(); - }); - }); - - it('handles gzipped payload', function (done) { - - var message = { 'msg': 'This message is going to be gzipped.' }; - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'POST', path: '/', handler: function (request, reply) { return reply(request.payload); } }); - - Zlib.gzip(JSON.stringify(message), function (err, buf) { - - var request = { - method: 'POST', - url: '/', - headers: { - 'content-type': 'application/json', - 'content-encoding': 'gzip', - 'content-length': buf.length - }, - payload: buf - }; - - server.inject(request, function (res) { - - expect(res.result).to.exist(); - expect(res.result).to.deep.equal(message); - done(); - }); - }); - }); - - it('saves a file after content decoding', function (done) { - - var path = Path.join(__dirname, './file/image.jpg'); - var sourceContents = Fs.readFileSync(path); - var stats = Fs.statSync(path); - - Zlib.gzip(sourceContents, function (err, compressed) { - - var handler = function (request, reply) { - - var receivedContents = Fs.readFileSync(request.payload.path); - Fs.unlinkSync(request.payload.path); - expect(receivedContents).to.deep.equal(sourceContents); - return reply(request.payload.bytes); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'POST', path: '/file', config: { handler: handler, payload: { output: 'file' } } }); - server.inject({ method: 'POST', url: '/file', payload: compressed, headers: { 'content-encoding': 'gzip' } }, function (res) { - - expect(res.result).to.equal(stats.size); - done(); - }); - }); - }); - - it('errors saving a file without parse', function (done) { - - var handler = function (request, reply) { }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'POST', path: '/file', config: { handler: handler, payload: { output: 'file', parse: false, uploads: '/a/b/c/d/not' } } }); - server.inject({ method: 'POST', url: '/file', payload: 'abcde' }, function (res) { - - expect(res.statusCode).to.equal(500); - done(); - }); - }); - - it('sets parse mode when route methos is * and request is POST', function (done) { - - var handler = function (request, reply) { - - return reply(request.payload.key); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: '*', path: '/any', handler: handler }); - - server.inject({ url: '/any', method: 'POST', payload: { key: '09876' } }, function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result).to.equal('09876'); - done(); - }); - }); - - it('returns an error on unsupported mime type', function (done) { - - var handler = function (request, reply) { - - return reply(request.payload.key); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'POST', path: '/', config: { handler: handler } }); - - server.start(function () { - - var options = { - hostname: 'localhost', - port: server.info.port, - path: '/?x=4', - method: 'POST', - headers: { - 'Content-Type': 'application/unknown', - 'Content-Length': '18' - } - }; - - var req = Http.request(options, function (res) { - - expect(res.statusCode).to.equal(415); - done(); - }); - - req.end('{ "key": "value" }'); - }); - }); - - it('ignores unsupported mime type', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'POST', path: '/', config: { handler: function (request, reply) { return reply(request.payload); }, payload: { failAction: 'ignore' } } }); - - server.inject({ method: 'POST', url: '/', payload: 'testing123', headers: { 'content-type': 'application/unknown' } }, function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result).to.deep.equal({}); - done(); - }); - }); - - it('returns 200 on octet mime type', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'POST', path: '/', handler: function (request, reply) { return reply('ok'); } }); - - server.inject({ method: 'POST', url: '/', payload: 'testing123', headers: { 'content-type': 'application/octet-stream' } }, function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result).to.equal('ok'); - done(); - }); - }); - - it('returns 200 on text mime type', function (done) { - - var textHandler = function (request, reply) { - - return reply(request.payload + '+456'); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'POST', path: '/text', config: { handler: textHandler } }); - - server.inject({ method: 'POST', url: '/text', payload: 'testing123', headers: { 'content-type': 'text/plain' } }, function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result).to.equal('testing123+456'); - done(); - }); - }); - - it('returns 200 on override mime type', function (done) { - - var handler = function (request, reply) { - - return reply(request.payload.key); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'POST', path: '/override', config: { handler: handler, payload: { override: 'application/json' } } }); - - server.inject({ method: 'POST', url: '/override', payload: '{"key":"cool"}', headers: { 'content-type': 'text/plain' } }, function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result).to.equal('cool'); - done(); - }); - }); - - it('returns 200 on text mime type when allowed', function (done) { - - var textHandler = function (request, reply) { - - return reply(request.payload + '+456'); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'POST', path: '/textOnly', config: { handler: textHandler, payload: { allow: 'text/plain' } } }); - - server.inject({ method: 'POST', url: '/textOnly', payload: 'testing123', headers: { 'content-type': 'text/plain' } }, function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result).to.equal('testing123+456'); - done(); - }); - }); - - it('returns 415 on non text mime type when disallowed', function (done) { - - var textHandler = function (request, reply) { - - return reply(request.payload + '+456'); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'POST', path: '/textOnly', config: { handler: textHandler, payload: { allow: 'text/plain' } } }); - - server.inject({ method: 'POST', url: '/textOnly', payload: 'testing123', headers: { 'content-type': 'application/octet-stream' } }, function (res) { - - expect(res.statusCode).to.equal(415); - done(); - }); - }); - - it('returns 200 on text mime type when allowed (array)', function (done) { - - var textHandler = function (request, reply) { - - return reply(request.payload + '+456'); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'POST', path: '/textOnlyArray', config: { handler: textHandler, payload: { allow: ['text/plain'] } } }); - - server.inject({ method: 'POST', url: '/textOnlyArray', payload: 'testing123', headers: { 'content-type': 'text/plain' } }, function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result).to.equal('testing123+456'); - done(); - }); - }); - - it('returns 415 on non text mime type when disallowed (array)', function (done) { - - var textHandler = function (request, reply) { - - return reply(request.payload + '+456'); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'POST', path: '/textOnlyArray', config: { handler: textHandler, payload: { allow: ['text/plain'] } } }); - - server.inject({ method: 'POST', url: '/textOnlyArray', payload: 'testing123', headers: { 'content-type': 'application/octet-stream' } }, function (res) { - - expect(res.statusCode).to.equal(415); - done(); - }); - }); - - it('parses application/x-www-form-urlencoded with arrays', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - server.route({ - method: 'POST', - path: '/', - handler: function (request, reply) { - - return reply(request.payload.x.y + request.payload.x.z); - } - }); - - server.inject({ method: 'POST', url: '/', payload: 'x[y]=1&x[z]=2', headers: { 'content-type': 'application/x-www-form-urlencoded' } }, function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result).to.equal('12'); - done(); - }); - }); - - it('returns parsed multipart data', function (done) { - - var multipartPayload = - '--AaB03x\r\n' + - 'content-disposition: form-data; name="x"\r\n' + - '\r\n' + - 'First\r\n' + - '--AaB03x\r\n' + - 'content-disposition: form-data; name="x"\r\n' + - '\r\n' + - 'Second\r\n' + - '--AaB03x\r\n' + - 'content-disposition: form-data; name="x"\r\n' + - '\r\n' + - 'Third\r\n' + - '--AaB03x\r\n' + - 'content-disposition: form-data; name="field1"\r\n' + - '\r\n' + - 'Joe Blow\r\nalmost tricked you!\r\n' + - '--AaB03x\r\n' + - 'content-disposition: form-data; name="field1"\r\n' + - '\r\n' + - 'Repeated name segment\r\n' + - '--AaB03x\r\n' + - 'content-disposition: form-data; name="pics"; filename="file1.txt"\r\n' + - 'Content-Type: text/plain\r\n' + - '\r\n' + - '... contents of file1.txt ...\r\r\n' + - '--AaB03x--\r\n'; - - var handler = function (request, reply) { - - var result = {}; - var keys = Object.keys(request.payload); - for (var i = 0, il = keys.length; i < il; ++i) { - var key = keys[i]; - var value = request.payload[key]; - result[key] = value._readableState ? true : value; - } - - return reply(result); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'POST', path: '/echo', config: { handler: handler } }); - - server.inject({ method: 'POST', url: '/echo', payload: multipartPayload, headers: { 'content-type': 'multipart/form-data; boundary=AaB03x' } }, function (res) { - - expect(Object.keys(res.result).length).to.equal(3); - expect(res.result.field1).to.exist(); - expect(res.result.field1.length).to.equal(2); - expect(res.result.field1[1]).to.equal('Repeated name segment'); - expect(res.result.pics).to.exist(); - done(); - }); - }); - - it('times out when client request taking too long', function (done) { - - var server = new Hapi.Server(); - server.connection({ routes: { payload: { timeout: 50 } } }); - server.route({ method: 'POST', path: '/fast', config: { handler: function (request, reply) { return reply('fast'); } } }); - server.start(function () { - - var timer = new Hoek.Bench(); - var options = { - hostname: '127.0.0.1', - port: server.info.port, - path: '/fast', - method: 'POST' - }; - - var req = Http.request(options, function (res) { - - expect(res.statusCode).to.equal(408); - expect(timer.elapsed()).to.be.at.least(45); - done(); - }); - - req.on('error', function (err) { }); // Will error out, so don't allow error to escape test - - req.write('{}\n'); - var now = Date.now(); - setTimeout(function () { - - req.end(); - }, 100); - }); - }); - - it('times out when client request taking too long (route override)', function (done) { - - var server = new Hapi.Server(); - server.connection({ routes: { payload: { timeout: false } } }); - server.route({ method: 'POST', path: '/fast', config: { payload: { timeout: 50 }, handler: function (request, reply) { return reply('fast'); } } }); - server.start(function () { - - var timer = new Hoek.Bench(); - var options = { - hostname: '127.0.0.1', - port: server.info.port, - path: '/fast', - method: 'POST' - }; - - var req = Http.request(options, function (res) { - - expect(res.statusCode).to.equal(408); - expect(timer.elapsed()).to.be.at.least(45); - done(); - }); - - req.on('error', function (err) { }); // Will error out, so don't allow error to escape test - - req.write('{}\n'); - var now = Date.now(); - setTimeout(function () { - - req.end(); - }, 100); - }); - }); - - it('returns payload when timeout is not triggered', function (done) { - - var server = new Hapi.Server(); - server.connection({ routes: { payload: { timeout: 50 } } }); - server.route({ method: 'POST', path: '/fast', config: { handler: function (request, reply) { return reply('fast'); } } }); - server.start(function () { - - var options = { - hostname: '127.0.0.1', - port: server.info.port, - path: '/fast', - method: 'POST' - }; - - var req = Http.request(options, function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - - req.end(); - }); - }); -}); diff --git a/node_modules/hapi/test/plugin.js b/node_modules/hapi/test/plugin.js deleted file mode 100755 index 44da358..0000000 --- a/node_modules/hapi/test/plugin.js +++ /dev/null @@ -1,2574 +0,0 @@ -// Load modules - -var Os = require('os'); -var Path = require('path'); -var Boom = require('boom'); -var CatboxMemory = require('catbox-memory'); -var Code = require('code'); -var Handlebars = require('handlebars'); -var Hapi = require('..'); -var Hoek = require('hoek'); -var Lab = require('lab'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var describe = lab.describe; -var it = lab.it; -var expect = Code.expect; - - -describe('Plugin', function () { - - describe('select()', function () { - - it('creates a subset of connections for manipulation', function (done) { - - var server = new Hapi.Server(); - server.connection({ labels: ['s1', 'a', 'b'] }); - server.connection({ labels: ['s2', 'a', 'c'] }); - server.connection({ labels: ['s3', 'a', 'b', 'd'] }); - server.connection({ labels: ['s4', 'b', 'x'] }); - - var register = function (server, options, next) { - - var a = server.select('a'); - var ab = a.select('b'); - var memoryx = server.select('x', 's4'); - var sodd = server.select(['s2', 's4']); - - expect(server.connections.length).to.equal(4); - expect(a.connections.length).to.equal(3); - expect(ab.connections.length).to.equal(2); - expect(memoryx.connections.length).to.equal(1); - expect(sodd.connections.length).to.equal(2); - - server.route({ method: 'GET', path: '/all', handler: function (request, reply) { return reply('all'); } }); - a.route({ method: 'GET', path: '/a', handler: function (request, reply) { return reply('a'); } }); - ab.route([{ method: 'GET', path: '/ab', handler: function (request, reply) { return reply('ab'); } }]); - memoryx.route({ method: 'GET', path: '/memoryx', handler: function (request, reply) { return reply('memoryx'); } }); - sodd.route({ method: 'GET', path: '/sodd', handler: function (request, reply) { return reply('sodd'); } }); - - memoryx.state('sid', { encoding: 'base64' }); - server.method({ - name: 'testMethod', method: function (next) { - - return next(null, '123'); - }, options: { cache: { expiresIn: 1000 } } - }); - - server.methods.testMethod(function (err, result) { - - expect(result).to.equal('123'); - - server.methods.testMethod(function (err, result) { - - expect(result).to.equal('123'); - return next(); - }); - }); - }; - - register.attributes = { - name: 'plugin' - }; - - server.register(register, function (err) { - - expect(err).to.not.exist(); - - expect(internals.routesList(server, 's1')).to.deep.equal(['/a', '/ab', '/all']); - expect(internals.routesList(server, 's2')).to.deep.equal(['/a', '/all', '/sodd']); - expect(internals.routesList(server, 's3')).to.deep.equal(['/a', '/ab', '/all']); - expect(internals.routesList(server, 's4')).to.deep.equal(['/all', '/memoryx', '/sodd']); - done(); - }); - }); - - it('registers a plugin on selection inside a plugin', function (done) { - - var server = new Hapi.Server(); - server.connection({ labels: ['a'] }); - server.connection({ labels: ['b'] }); - server.connection({ labels: ['c'] }); - - var server1 = server.connections[0]; - var server2 = server.connections[1]; - var server3 = server.connections[2]; - - var child = function (server, options, next) { - - server.expose('key2', server.connections.length); - return next(); - }; - - child.attributes = { - name: 'child' - }; - - var test = function (server, options, next) { - - server.expose('key1', server.connections.length); - server.select('a').register(child, next); - }; - - test.attributes = { - name: 'test' - }; - - server.register(test, { select: ['a', 'b'] }, function (err) { - - expect(err).to.not.exist(); - expect(server.plugins.test.key1).to.equal(2); - expect(server.plugins.child.key2).to.equal(1); - done(); - }); - }); - }); - - describe('register()', function () { - - it('registers plugin with options', function (done) { - - var server = new Hapi.Server(); - server.connection({ labels: ['a', 'b'] }); - - var test = function (server, options, next) { - - expect(options.something).to.be.true(); - return next(); - }; - - test.attributes = { - name: 'test' - }; - - server.register({ register: test, options: { something: true } }, function (err) { - - expect(err).to.not.exist(); - done(); - }); - }); - - it('registers a required plugin', function (done) { - - var server = new Hapi.Server(); - server.connection({ labels: ['a', 'b'] }); - - var test = { - register: function (server, options, next) { - - expect(options.something).to.be.true(); - return next(); - } - }; - - test.register.attributes = { - name: 'test' - }; - - server.register({ register: test, options: { something: true } }, function (err) { - - expect(err).to.not.exist(); - done(); - }); - }); - - it('throws on bad plugin (missing attributes)', function (done) { - - var server = new Hapi.Server(); - expect(function () { - - server.register({ register: function (server, options, next) { return next(); } }, function (err) { }); - }).to.throw('Invalid plugin object - invalid or missing register function attributes property'); - - done(); - }); - - it('throws on bad plugin (missing name)', function (done) { - - var register = function (server, options, next) { - - return next(); - }; - - register.attributes = {}; - - var server = new Hapi.Server(); - expect(function () { - - server.register(register, function (err) { }); - }).to.throw('Missing plugin name'); - - done(); - }); - - it('throws on bad plugin (empty pkg)', function (done) { - - var register = function (server, options, next) { - - return next(); - }; - - register.attributes = { - pkg: {} - }; - - var server = new Hapi.Server(); - expect(function () { - - server.register(register, function (err) { }); - }).to.throw('Missing plugin name'); - - done(); - }); - - it('throws when register is missing a callback function', function (done) { - - var server = new Hapi.Server(); - server.connection({ labels: ['a', 'b'] }); - - var test = function (server, options, next) { - - expect(options.something).to.be.true(); - return next(); - }; - - test.attributes = { - name: 'test' - }; - - expect(function () { - - server.register(test); - }).to.throw('A callback function is required to register a plugin'); - done(); - }); - - it('returns plugin error', function (done) { - - var test = function (server, options, next) { - - return next(new Error('from plugin')); - }; - - test.attributes = { - name: 'test' - }; - - var server = new Hapi.Server(); - server.connection(); - server.register(test, function (err) { - - expect(err).to.exist(); - expect(err.message).to.equal('from plugin'); - done(); - }); - }); - - it('sets version to 0.0.0 if missing', function (done) { - - var test = function (server, options, next) { - - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(server.version); } }); - return next(); - }; - - test.attributes = { - pkg: { - name: 'steve' - } - }; - - var server = new Hapi.Server(); - server.connection(); - - server.register(test, function (err) { - - expect(err).to.not.exist(); - expect(server.connections[0]._registrations.steve.version).to.equal('0.0.0'); - server.inject('/', function (res) { - - expect(res.result).to.equal(require('../package.json').version); - done(); - }); - }); - }); - - it('prevents plugin from multiple registrations', function (done) { - - var test = function (server, options, next) { - - server.route({ method: 'GET', path: '/a', handler: function (request, reply) { return reply('a'); } }); - return next(); - }; - - test.attributes = { - name: 'test' - }; - - var server = new Hapi.Server(); - server.connection({ host: 'example.com' }); - server.register(test, function (err) { - - expect(err).to.not.exist(); - expect(function () { - - server.register(test, function (err) { }); - }).to.throw('Plugin test already registered in: http://example.com'); - - done(); - }); - }); - - it('allows plugin multiple registrations (attributes)', function (done) { - - var test = function (server, options, next) { - - server.app.x = server.app.x ? server.app.x + 1 : 1; - return next(); - }; - - test.attributes = { - name: 'test', - multiple: true - }; - - var server = new Hapi.Server(); - server.connection(); - server.register(test, function (err) { - - expect(err).to.not.exist(); - server.register(test, function (err) { - - expect(err).to.not.exist(); - expect(server.app.x).to.equal(2); - done(); - }); - }); - }); - - it('registers multiple plugins', function (done) { - - var server = new Hapi.Server(); - server.connection({ labels: 'test' }); - var log = null; - server.once('log', function (event, tags) { - - log = [event, tags]; - }); - - server.register([internals.plugins.test1, internals.plugins.test2], function (err) { - - expect(err).to.not.exist(); - expect(internals.routesList(server)).to.deep.equal(['/test1', '/test2']); - expect(log[1].test).to.equal(true); - expect(log[0].data).to.equal('abc'); - done(); - }); - }); - - it('registers multiple plugins (verbose)', function (done) { - - var server = new Hapi.Server(); - server.connection({ labels: 'test' }); - var log = null; - server.once('log', function (event, tags) { - - log = [event, tags]; - }); - - server.register([{ register: internals.plugins.test1 }, { register: internals.plugins.test2 }], function (err) { - - expect(err).to.not.exist(); - expect(internals.routesList(server)).to.deep.equal(['/test1', '/test2']); - expect(log[1].test).to.equal(true); - expect(log[0].data).to.equal('abc'); - done(); - }); - }); - - it('registers a child plugin', function (done) { - - var server = new Hapi.Server(); - server.connection({ labels: 'test' }); - server.register(internals.plugins.child, function (err) { - - expect(err).to.not.exist(); - server.inject('/test1', function (res) { - - expect(res.result).to.equal('testing123'); - done(); - }); - }); - }); - - it('registers a plugin with routes path prefix', function (done) { - - var server = new Hapi.Server(); - server.connection({ labels: 'test' }); - server.register(internals.plugins.test1, { routes: { prefix: '/xyz' } }, function (err) { - - expect(server.plugins.test1.prefix).to.equal('/xyz'); - expect(err).to.not.exist(); - server.inject('/xyz/test1', function (res) { - - expect(res.result).to.equal('testing123'); - done(); - }); - }); - }); - - it('registers a plugin with routes path prefix and plugin root route', function (done) { - - var test = function (server, options, next) { - - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok'); } }); - return next(); - }; - - test.attributes = { - name: 'test' - }; - - var server = new Hapi.Server(); - server.connection({ labels: 'test' }); - server.register(test, { routes: { prefix: '/xyz' } }, function (err) { - - expect(err).to.not.exist(); - server.inject('/xyz', function (res) { - - expect(res.result).to.equal('ok'); - done(); - }); - }); - }); - - it('ignores the type of the plugin value', function (done) { - - var a = function () { }; - a.register = function (server, options, next) { - - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok'); } }); - return next(); - }; - - a.register.attributes = { name: 'a' }; - - var server = new Hapi.Server(); - server.connection({ labels: 'test' }); - server.register(a, { routes: { prefix: '/xyz' } }, function (err) { - - expect(err).to.not.exist(); - server.inject('/xyz', function (res) { - - expect(res.result).to.equal('ok'); - done(); - }); - }); - }); - - it('registers a child plugin with parent routes path prefix', function (done) { - - var server = new Hapi.Server(); - server.connection({ labels: 'test' }); - server.register(internals.plugins.child, { routes: { prefix: '/xyz' } }, function (err) { - - expect(err).to.not.exist(); - server.inject('/xyz/test1', function (res) { - - expect(res.result).to.equal('testing123'); - done(); - }); - }); - }); - - it('registers a child plugin with parent routes vhost prefix', function (done) { - - var server = new Hapi.Server(); - server.connection({ labels: 'test' }); - server.register(internals.plugins.child, { routes: { vhost: 'example.com' } }, function (err) { - - expect(err).to.not.exist(); - server.inject({ url: '/test1', headers: { host: 'example.com' } }, function (res) { - - expect(res.result).to.equal('testing123'); - done(); - }); - }); - }); - - it('registers a child plugin with parent routes path prefix and inner register prefix', function (done) { - - var server = new Hapi.Server(); - server.connection({ labels: 'test' }); - server.register({ register: internals.plugins.child, options: { routes: { prefix: '/inner' } } }, { routes: { prefix: '/xyz' } }, function (err) { - - expect(err).to.not.exist(); - server.inject('/xyz/inner/test1', function (res) { - - expect(res.result).to.equal('testing123'); - done(); - }); - }); - }); - - it('registers a child plugin with parent routes vhost prefix and inner register vhost', function (done) { - - var server = new Hapi.Server(); - server.connection({ labels: 'test' }); - server.register({ register: internals.plugins.child, options: { routes: { vhost: 'example.net' } } }, { routes: { vhost: 'example.com' } }, function (err) { - - expect(err).to.not.exist(); - server.inject({ url: '/test1', headers: { host: 'example.com' } }, function (res) { - - expect(res.result).to.equal('testing123'); - done(); - }); - }); - }); - - it('registers a plugin with routes vhost', function (done) { - - var server = new Hapi.Server(); - server.connection({ labels: 'test' }); - server.register(internals.plugins.test1, { routes: { vhost: 'example.com' } }, function (err) { - - expect(err).to.not.exist(); - server.inject('/test1', function (res) { - - expect(res.statusCode).to.equal(404); - - server.inject({ url: '/test1', headers: { host: 'example.com' } }, function (res) { - - expect(res.result).to.equal('testing123'); - done(); - }); - }); - }); - }); - - it('registers plugins with pre-selected label', function (done) { - - var server = new Hapi.Server(); - server.connection({ labels: ['a'] }); - server.connection({ labels: ['b'] }); - - var server1 = server.connections[0]; - var server2 = server.connections[1]; - - var test = function (server, options, next) { - - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok'); } }); - return next(); - }; - - test.attributes = { - name: 'test' - }; - - server.register(test, { select: 'a' }, function (err) { - - expect(err).to.not.exist(); - server1.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - server2.inject('/', function (res) { - - expect(res.statusCode).to.equal(404); - done(); - }); - }); - }); - }); - - it('registers plugins with pre-selected labels', function (done) { - - var server = new Hapi.Server(); - server.connection({ labels: ['a'] }); - server.connection({ labels: ['b'] }); - server.connection({ labels: ['c'] }); - - var server1 = server.connections[0]; - var server2 = server.connections[1]; - var server3 = server.connections[2]; - - var test = function (server, options, next) { - - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok'); } }); - server.expose('super', 'trooper'); - return next(); - }; - - test.attributes = { - name: 'test' - }; - - server.register(test, { select: ['a', 'c'] }, function (err) { - - expect(err).to.not.exist(); - expect(server.plugins.test.super).to.equal('trooper'); - - server1.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - server2.inject('/', function (res) { - - expect(res.statusCode).to.equal(404); - server3.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - }); - }); - }); - - it('sets multiple dependencies in one statement', function (done) { - - var a = function (server, options, next) { - - server.dependency(['b', 'c']); - return next(); - }; - - a.attributes = { - name: 'a' - }; - - var b = function (server, options, next) { - - return next(); - }; - - b.attributes = { - name: 'b' - }; - - var c = function (server, options, next) { - - return next(); - }; - - c.attributes = { - name: 'c' - }; - - var server = new Hapi.Server(); - server.connection(); - server.register(b, function (err) { - - server.register(c, function (err) { - - server.register(a, function (err) { - - done(); - }); - }); - }); - }); - - it('sets multiple dependencies in attributes', function (done) { - - var a = function (server, options, next) { - - return next(); - }; - - a.attributes = { - name: 'a', - dependencies: ['b', 'c'] - }; - - var b = function (server, options, next) { - - return next(); - }; - - b.attributes = { - name: 'b' - }; - - var c = function (server, options, next) { - - return next(); - }; - - c.attributes = { - name: 'c' - }; - - var server = new Hapi.Server(); - server.connection(); - server.register(b, function (err) { - - server.register(c, function (err) { - - server.register(a, function (err) { - - done(); - }); - }); - }); - }); - - it('sets multiple dependencies in multiple statements', function (done) { - - var a = function (server, options, next) { - - server.dependency('b'); - server.dependency('c'); - return next(); - }; - - a.attributes = { - name: 'a' - }; - - var b = function (server, options, next) { - - return next(); - }; - - b.attributes = { - name: 'b' - }; - - var c = function (server, options, next) { - - return next(); - }; - - c.attributes = { - name: 'c' - }; - - var server = new Hapi.Server(); - server.connection(); - server.register(b, function (err) { - - server.register(c, function (err) { - - server.register(a, function (err) { - - done(); - }); - }); - }); - }); - - it('sets multiple dependencies in multiple locations', function (done) { - - var a = function (server, options, next) { - - server.dependency('b'); - return next(); - }; - - a.attributes = { - name: 'a', - dependecies: 'c' - }; - - var b = function (server, options, next) { - - return next(); - }; - - b.attributes = { - name: 'b' - }; - - var c = function (server, options, next) { - - return next(); - }; - - c.attributes = { - name: 'c' - }; - - var server = new Hapi.Server(); - server.connection(); - server.register(b, function (err) { - - server.register(c, function (err) { - - server.register(a, function (err) { - - done(); - }); - }); - }); - }); - - it('throws when dependencies is an object', function (done) { - - var a = function (server, options, next) { - - next(); - }; - a.attributes = { - name: 'a', - dependencies: { b: true } - }; - - var server = new Hapi.Server(); - server.connection(); - - expect(function () { - - server.register(a, function () {}); - }).to.throw('Invalid dependencies options (must be a string or an array of strings) {\n \"b\": true,\n \u001b[41m\"0\"\u001b[0m\u001b[31m [1]: -- missing --\u001b[0m\n}\n\u001b[31m\n[1] "0" must be a string\u001b[0m'); - done(); - }); - - it('throws when dependencies contain something else than a string', function (done) { - - var a = function (server, options, next) { - - next(); - }; - a.attributes = { - name: 'a', - dependencies: [true] - }; - - var server = new Hapi.Server(); - server.connection(); - - expect(function () { - - server.register(a, function () {}); - }).to.throw('Invalid dependencies options (must be a string or an array of strings) [\n null\n]\n\u001b[31m\n[1] "0" must be a string\u001b[0m'); - done(); - }); - }); - - describe('after()', function () { - - it('calls method after plugin', function (done) { - - var x = function (server, options, next) { - - server.expose('a', 'b'); - return next(); - }; - - x.attributes = { - name: 'x' - }; - - var server = new Hapi.Server(); - server.connection(); - - expect(server.plugins.x).to.not.exist(); - - var called = false; - server.after(function (server, next) { - - expect(server.plugins.x.a).to.equal('b'); - called = true; - return next(); - }, 'x'); - - server.register(x, function (err) { - - expect(err).to.not.exist(); - server.start(function (err) { - - expect(called).to.be.true(); - done(); - }); - }); - }); - - it('calls method before start', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - var called = false; - server.after(function (server, next) { - - called = true; - return next(); - }); - - server.start(function (err) { - - expect(called).to.be.true(); - done(); - }); - }); - - it('calls method before start even if plugin not registered', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - var called = false; - server.after(function (server, next) { - - called = true; - return next(); - }, 'x'); - - server.start(function (err) { - - expect(called).to.be.true(); - done(); - }); - }); - - it('fails to start server when after method fails', function (done) { - - var test = function (server, options, next) { - - server.after(function (server, finish) { - - return finish(); - }); - - server.after(function (server, finish) { - - return finish(new Error('Not in the mood')); - }); - - return next(); - }; - - test.attributes = { - name: 'test' - }; - - var server = new Hapi.Server(); - server.connection(); - server.register(test, function (err) { - - expect(err).to.not.exist(); - server.start(function (err) { - - expect(err).to.exist(); - done(); - }); - }); - }); - }); - - describe('auth', function () { - - it('adds auth strategy via plugin', function (done) { - - var server = new Hapi.Server(); - server.connection({ labels: 'a' }); - server.connection({ labels: 'b' }); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('authenticated!'); } }); - - server.register(internals.plugins.auth, function (err) { - - expect(err).to.not.exist(); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(401); - server.inject({ method: 'GET', url: '/', headers: { authorization: 'Basic ' + (new Buffer('john:12345', 'utf8')).toString('base64') } }, function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result).to.equal('authenticated!'); - done(); - }); - }); - }); - }); - }); - - describe('bind()', function () { - - it('sets plugin context', function (done) { - - var test = function (server, options, next) { - - var bind = { - value: 'in context', - suffix: ' throughout' - }; - - server.bind(bind); - - server.route({ - method: 'GET', - path: '/', - handler: function (request, reply) { - - return reply(this.value); - } - }); - - server.ext('onPreResponse', function (request, reply) { - - return reply(request.response.source + this.suffix); - }); - - return next(); - }; - - test.attributes = { - name: 'test' - }; - - var server = new Hapi.Server(); - server.connection(); - server.register(test, function (err) { - - expect(err).to.not.exist(); - server.inject('/', function (res) { - - expect(res.result).to.equal('in context throughout'); - done(); - }); - }); - }); - }); - - describe('cache()', function () { - - it('provisions a server cache', function (done) { - - var server = new Hapi.Server(); - server.connection(); - var cache = server.cache({ segment: 'test', expiresIn: 1000 }); - server.start(function () { - - cache.set('a', 'going in', 0, function (err) { - - cache.get('a', function (err, value, cached, report) { - - expect(value).to.equal('going in'); - - server.stop(function () { - - done(); - }); - }); - }); - }); - }); - - it('throws when missing segment', function (done) { - - var server = new Hapi.Server(); - server.connection(); - expect(function () { - - server.cache({ expiresIn: 1000 }); - }).to.throw('Missing cache segment name'); - done(); - }); - - it('provisions a server cache with custom partition', function (done) { - - var server = new Hapi.Server({ cache: { engine: CatboxMemory, partition: 'hapi-test-other' } }); - server.connection(); - var cache = server.cache({ segment: 'test', expiresIn: 1000 }); - server.start(function () { - - cache.set('a', 'going in', 0, function (err) { - - cache.get('a', function (err, value, cached, report) { - - expect(value).to.equal('going in'); - expect(cache._cache.connection.settings.partition).to.equal('hapi-test-other'); - - server.stop(function () { - - done(); - }); - }); - }); - }); - }); - - it('throws when allocating an invalid cache segment', function (done) { - - var server = new Hapi.Server(); - server.connection(); - expect(function () { - - server.cache({ segment: 'a', expiresAt: '12:00', expiresIn: 1000 }); - }).throws(); - - done(); - }); - - it('allows allocating a cache segment with empty options', function (done) { - - var server = new Hapi.Server(); - server.connection(); - expect(function () { - - server.cache({ segment: 'a' }); - }).to.not.throw(); - - done(); - }); - - it('allows reusing the same cache segment (server)', function (done) { - - var server = new Hapi.Server({ cache: { engine: CatboxMemory, shared: true } }); - server.connection(); - expect(function () { - - var a1 = server.cache({ segment: 'a', expiresIn: 1000 }); - var a2 = server.cache({ segment: 'a', expiresIn: 1000 }); - }).to.not.throw(); - done(); - }); - - it('allows reusing the same cache segment (cache)', function (done) { - - var server = new Hapi.Server(); - server.connection(); - expect(function () { - - var a1 = server.cache({ segment: 'a', expiresIn: 1000 }); - var a2 = server.cache({ segment: 'a', expiresIn: 1000, shared: true }); - }).to.not.throw(); - done(); - }); - - it('uses plugin cache interface', function (done) { - - var test = function (server, options, next) { - - var cache = server.cache({ expiresIn: 10 }); - server.expose({ - get: function (key, callback) { - - cache.get(key, function (err, value, cached, report) { - - callback(err, value); - }); - }, - set: function (key, value, callback) { - - cache.set(key, value, 0, callback); - } - }); - - return next(); - }; - - test.attributes = { - name: 'test' - }; - - var server = new Hapi.Server(); - server.connection(); - server.register(test, function (err) { - - expect(err).to.not.exist(); - server.start(function () { - - server.plugins.test.set('a', '1', function (err) { - - expect(err).to.not.exist(); - server.plugins.test.get('a', function (err, value) { - - expect(err).to.not.exist(); - expect(value).to.equal('1'); - setTimeout(function () { - - server.plugins.test.get('a', function (err, value) { - - expect(err).to.not.exist(); - expect(value).to.equal(null); - done(); - }); - }, 11); - }); - }); - }); - }); - }); - }); - - describe('decorate()', function () { - - it('decorates reply', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - server.decorate('reply', 'success', function () { - - return this.response({ status: 'ok' }); - }); - - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply.success(); } }); - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result.status).to.equal('ok'); - done(); - }); - }); - - it('throws on double reply decoration', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - server.decorate('reply', 'success', function () { - - return this.response({ status: 'ok' }); - }); - - expect(function () { - - server.decorate('reply', 'success', function () { }); - }).to.throw('Reply interface decoration already defined: success'); - done(); - }); - - it('throws on internal conflict', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - expect(function () { - - server.decorate('reply', 'redirect', function () { }); - }).to.throw('Cannot override built-in reply interface decoration: redirect'); - done(); - }); - - it('decorates server', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - server.decorate('server', 'ok', function (path) { - - server.route({ method: 'GET', path: path, handler: function (request, reply) { return reply('ok'); } }); - }); - - server.ok('/'); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result).to.equal('ok'); - done(); - }); - }); - - it('throws on double server decoration', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - server.decorate('server', 'ok', function (path) { - - server.route({ method: 'GET', path: path, handler: function (request, reply) { return reply('ok'); } }); - }); - - expect(function () { - - server.decorate('server', 'ok', function () { }); - }).to.throw('Server decoration already defined: ok'); - done(); - }); - - it('throws on server decoration root conflict', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - expect(function () { - - server.decorate('server', 'start', function () { }); - }).to.throw('Cannot override the built-in server interface method: start'); - done(); - }); - - it('throws on server decoration plugin conflict', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - expect(function () { - - server.decorate('server', 'select', function () { }); - }).to.throw('Cannot override the built-in server interface method: select'); - done(); - }); - - it('throws on invalid decoration name', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - expect(function () { - - server.decorate('server', '_special', function () { }); - }).to.throw('Property name cannot begin with an underscore: _special'); - done(); - }); - }); - - describe('dependency()', function () { - - it('fails to register single plugin with dependencies', function (done) { - - var test = function (server, options, next) { - - server.dependency('none'); - return next(); - }; - - test.attributes = { - name: 'test' - }; - - var server = new Hapi.Server(); - server.connection(); - server.register(test, function (err) { - - expect(function () { - - server.start(); - }).to.throw('Plugin test missing dependency none in connection: ' + server.info.uri); - done(); - }); - }); - - it('fails to register single plugin with dependencies (attributes)', function (done) { - - var test = function (server, options, next) { - - return next(); - }; - - test.attributes = { - name: 'test', - dependencies: 'none' - }; - - var server = new Hapi.Server(); - server.connection(); - server.register(test, function (err) { - - expect(function () { - - server.start(); - }).to.throw('Plugin test missing dependency none in connection: ' + server.info.uri); - done(); - }); - }); - - it('fails to register multiple plugins with dependencies', function (done) { - - var server = new Hapi.Server(); - server.connection({ port: 80, host: 'localhost' }); - server.register([internals.plugins.deps1, internals.plugins.deps3], function (err) { - - expect(function () { - - server.start(); - }).to.throw('Plugin deps1 missing dependency deps2 in connection: http://localhost:80'); - done(); - }); - }); - - it('recognizes dependencies from peer plugins', function (done) { - - var a = function (server, options, next) { - - server.register(b, next); - }; - - a.attributes = { - name: 'a' - }; - - var b = function (server, options, next) { - - return next(); - }; - - b.attributes = { - name: 'b' - }; - - var c = function (server, options, next) { - - server.dependency('b'); - return next(); - }; - - c.attributes = { - name: 'c' - }; - - var server = new Hapi.Server(); - server.connection(); - server.register([a, c], function (err) { - - expect(err).to.not.exist(); - done(); - }); - }); - - it('errors when missing inner dependencies', function (done) { - - var a = function (server, options, next) { - - server.register(b, next); - }; - - a.attributes = { - name: 'a' - }; - - var b = function (server, options, next) { - - server.dependency('c'); - return next(); - }; - - b.attributes = { - name: 'b' - }; - - var server = new Hapi.Server(); - server.connection({ port: 80, host: 'localhost' }); - server.register(a, function (err) { - - expect(function () { - - server.start(); - }).to.throw('Plugin b missing dependency c in connection: http://localhost:80'); - done(); - }); - }); - - it('errors when missing inner dependencies (attributes)', function (done) { - - var a = function (server, options, next) { - - server.register(b, next); - }; - - a.attributes = { - name: 'a' - }; - - var b = function (server, options, next) { - - return next(); - }; - - b.attributes = { - name: 'b', - dependencies: 'c' - }; - - var server = new Hapi.Server(); - server.connection({ port: 80, host: 'localhost' }); - server.register(a, function (err) { - - expect(function () { - - server.start(); - }).to.throw('Plugin b missing dependency c in connection: http://localhost:80'); - done(); - }); - }); - }); - - describe('events', function () { - - it('plugin event handlers receive more than 2 arguments when they exist', function (done) { - - var test = function (server, options, next) { - - server.once('request-internal', function () { - - expect(arguments).to.have.length(3); - done(); - }); - - return next(); - }; - - test.attributes = { - name: 'test' - }; - - var server = new Hapi.Server(); - server.connection(); - server.register(test, function (err) { - - expect(err).to.not.exist(); - server.inject({ url: '/' }, function () { }); - }); - }); - - it('listens to events on selected connections', function (done) { - - var server = new Hapi.Server(); - server.connection({ labels: ['a'] }); - server.connection({ labels: ['b'] }); - server.connection({ labels: ['c'] }); - - var server1 = server.connections[0]; - var server2 = server.connections[1]; - var server3 = server.connections[2]; - - var counter = 0; - var test = function (server, options, next) { - - server.select(['a', 'b']).on('test', function () { - - ++counter; - }); - - server.select(['a']).on('start', function () { - - ++counter; - }); - - return next(); - }; - - test.attributes = { - name: 'test' - }; - - server.register(test, function (err) { - - expect(err).to.not.exist(); - server1.emit('test'); - server2.emit('test'); - server3.emit('test'); - - server.start(function () { - - server.stop(function () { - - expect(counter).to.equal(3); - done(); - }); - }); - }); - }); - }); - - describe('expose()', function () { - - it('exposes an api', function (done) { - - var server = new Hapi.Server(); - server.connection({ labels: ['s1', 'a', 'b'] }); - server.connection({ labels: ['s2', 'a', 'test'] }); - server.connection({ labels: ['s3', 'a', 'b', 'd', 'cache'] }); - server.connection({ labels: ['s4', 'b', 'test', 'cache'] }); - - server.register(internals.plugins.test1, function (err) { - - expect(err).to.not.exist(); - - expect(server.connections[0]._router.routes.get).to.not.exist(); - expect(internals.routesList(server, 's2')).to.deep.equal(['/test1']); - expect(server.connections[2]._router.routes.get).to.not.exist(); - expect(internals.routesList(server, 's4')).to.deep.equal(['/test1']); - - expect(server.plugins.test1.add(1, 3)).to.equal(4); - expect(server.plugins.test1.glue('1', '3')).to.equal('13'); - - done(); - }); - }); - }); - - describe('ext()', function () { - - it('extends onRequest point', function (done) { - - var test = function (server, options, next) { - - server.route({ method: 'GET', path: '/b', handler: function (request, reply) { return reply('b'); } }); - server.ext('onRequest', function (request, reply) { - - request.setUrl('/b'); - return reply.continue(); - }); - - return next(); - }; - - test.attributes = { - name: 'test' - }; - - var server = new Hapi.Server(); - server.connection(); - server.register(test, function (err) { - - expect(err).to.not.exist(); - expect(internals.routesList(server)).to.deep.equal(['/b']); - - server.inject('/a', function (res) { - - expect(res.result).to.equal('b'); - done(); - }); - }); - }); - - it('adds multiple ext functions with dependencies', function (done) { - - var server = new Hapi.Server(); - server.connection({ labels: ['a', 'b', '0'] }); - server.connection({ labels: ['a', 'c', '1'] }); - server.connection({ labels: ['c', 'b', '2'] }); - - var handler = function (request, reply) { - - return reply(request.app.deps); - }; - - server.select('0').route({ method: 'GET', path: '/', handler: handler }); - server.select('1').route({ method: 'GET', path: '/', handler: handler }); - server.select('2').route({ method: 'GET', path: '/', handler: handler }); - - server.register([internals.plugins.deps1, internals.plugins.deps2, internals.plugins.deps3], function (err) { - - expect(err).to.not.exist(); - - server.start(function (err) { - - expect(err).to.not.exist(); - expect(server.plugins.deps1.breaking).to.equal('bad'); - - server.connections[0].inject('/', function (res) { - - expect(res.result).to.equal('|2|1|'); - - server.connections[1].inject('/', function (res) { - - expect(res.result).to.equal('|3|1|'); - - server.connections[2].inject('/', function (res) { - - expect(res.result).to.equal('|3|2|'); - done(); - }); - }); - }); - }); - }); - }); - }); - - describe('handler()', function () { - - it('add new handler', function (done) { - - var test = function (server, options, next) { - - server.handler('bar', function (route, options) { - - return function (request, reply) { - - return reply('success'); - }; - }); - - return next(); - }; - - test.attributes = { - name: 'test' - }; - - var server = new Hapi.Server(); - server.connection(); - server.register(test, function (err) { - - expect(err).to.not.exist(); - server.route({ - method: 'GET', - path: '/', - handler: { - bar: {} - } - }); - - server.inject('/', function (res) { - - expect(res.payload).to.equal('success'); - done(); - }); - }); - }); - - it('errors on duplicate handler', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - expect(function () { - - server.handler('proxy', function () { }); - }).to.throw('Handler name already exists: proxy'); - done(); - }); - - it('errors on unknown handler', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - expect(function () { - - server.route({ method: 'GET', path: '/', handler: { test: {} } }); - }).to.throw('Unknown handler: test'); - done(); - }); - - it('errors on non-string name', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - expect(function () { - - server.handler(); - }).to.throw('Invalid handler name'); - done(); - }); - - it('errors on non-function handler', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - expect(function () { - - server.handler('foo', 'bar'); - }).to.throw('Handler must be a function: foo'); - done(); - }); - }); - - describe('log()', { parallel: false }, function () { - - it('emits a log event', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - var count = 0; - server.once('log', function (event) { - - ++count; - expect(event.data).to.equal('log event 1'); - }); - - server.once('log', function (event) { - - ++count; - expect(event.data).to.equal('log event 1'); - }); - - server.log('1', 'log event 1', Date.now()); - - server.once('log', function (event) { - - ++count; - expect(event.data).to.equal('log event 2'); - }); - - server.log(['2'], 'log event 2', new Date(Date.now())); - - expect(count).to.equal(3); - done(); - }); - - it('emits a log event and print to console', { parallel: false }, function (done) { - - var server = new Hapi.Server(); - server.connection(); - - server.once('log', function (event) { - - expect(event.data).to.equal('log event 1'); - }); - - var orig = console.error; - console.error = function () { - - console.error = orig; - expect(arguments[0]).to.equal('Debug:'); - expect(arguments[1]).to.equal('internal, implementation, error'); - - done(); - }; - - server.log(['internal', 'implementation', 'error'], 'log event 1'); - }); - - it('outputs log data to debug console', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - var orig = console.error; - console.error = function () { - - console.error = orig; - expect(arguments[0]).to.equal('Debug:'); - expect(arguments[1]).to.equal('implementation'); - expect(arguments[2]).to.equal('\n {"data":1}'); - done(); - }; - - server.log(['implementation'], { data: 1 }); - }); - - it('outputs log error data to debug console', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - var orig = console.error; - console.error = function () { - - console.error = orig; - expect(arguments[0]).to.equal('Debug:'); - expect(arguments[1]).to.equal('implementation'); - expect(arguments[2]).to.contain('\n Error: test\n at'); - done(); - }; - - server.log(['implementation'], new Error('test')); - }); - - it('outputs log data to debug console without data', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - var orig = console.error; - console.error = function () { - - console.error = orig; - expect(arguments[0]).to.equal('Debug:'); - expect(arguments[1]).to.equal('implementation'); - expect(arguments[2]).to.equal(''); - done(); - }; - - server.log(['implementation']); - }); - - it('does not output events when debug disabled', function (done) { - - var server = new Hapi.Server({ debug: false }); - server.connection(); - - var i = 0; - var orig = console.error; - console.error = function () { - - ++i; - }; - - server.log(['implementation']); - console.error('nothing'); - expect(i).to.equal(1); - console.error = orig; - done(); - }); - - it('does not output events when debug.log disabled', function (done) { - - var server = new Hapi.Server({ debug: { log: false } }); - server.connection(); - - var i = 0; - var orig = console.error; - console.error = function () { - - ++i; - }; - - server.log(['implementation']); - console.error('nothing'); - expect(i).to.equal(1); - console.error = orig; - done(); - }); - - it('does not output non-implementation events by default', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - var i = 0; - var orig = console.error; - console.error = function () { - - ++i; - }; - - server.log(['xyz']); - console.error('nothing'); - expect(i).to.equal(1); - console.error = orig; - done(); - }); - - it('emits server log events once', function (done) { - - var pc = 0; - var test = function (server, options, next) { - - server.on('log', function (event, tags) { - - ++pc; - }); - - next(); - }; - - test.attributes = { - name: 'test' - }; - - var server = new Hapi.Server(); - server.connection(); - - var sc = 0; - server.on('log', function (event, tags) { - - ++sc; - }); - - server.register(test, function (err) { - - expect(err).to.not.exist(); - server.log('test'); - expect(sc).to.equal(1); - expect(pc).to.equal(1); - done(); - }); - }); - }); - - describe('lookup()', function () { - - it('returns route based on id', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', config: { handler: function (request, reply) { return reply(); }, id: 'root', app: { test: 123 } } }); - var root = server.lookup('root'); - expect(root.path).to.equal('/'); - expect(root.settings.app.test).to.equal(123); - done(); - }); - - it('returns null on unknown route', function (done) { - - var server = new Hapi.Server(); - server.connection(); - var root = server.lookup('root'); - expect(root).to.be.null(); - done(); - }); - - it('throws on missing id', function (done) { - - var server = new Hapi.Server(); - server.connection(); - expect(function () { - - server.lookup(); - }).to.throw('Invalid route id: '); - done(); - }); - }); - - describe('match()', function () { - - it('returns route based on path', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', config: { handler: function (request, reply) { return reply(); }, id: 'root' } }); - server.route({ method: 'GET', path: '/abc', config: { handler: function (request, reply) { return reply(); }, id: 'abc' } }); - server.route({ method: 'POST', path: '/abc', config: { handler: function (request, reply) { return reply(); }, id: 'post' } }); - server.route({ method: 'GET', path: '/{p}/{x}', config: { handler: function (request, reply) { return reply(); }, id: 'params' } }); - server.route({ method: 'GET', path: '/abc', vhost: 'example.com', config: { handler: function (request, reply) { return reply(); }, id: 'vhost' } }); - - expect(server.match('GET', '/').settings.id).to.equal('root'); - expect(server.match('GET', '/none')).to.equal(null); - expect(server.match('GET', '/abc').settings.id).to.equal('abc'); - expect(server.match('get', '/').settings.id).to.equal('root'); - expect(server.match('post', '/abc').settings.id).to.equal('post'); - expect(server.match('get', '/a/b').settings.id).to.equal('params'); - expect(server.match('GET', '/abc', 'example.com').settings.id).to.equal('vhost'); - done(); - }); - - it('throws on missing method', function (done) { - - var server = new Hapi.Server(); - server.connection(); - expect(function () { - - server.match(); - }).to.throw('Invalid method: '); - done(); - }); - - it('throws on invalid method', function (done) { - - var server = new Hapi.Server(); - server.connection(); - expect(function () { - - server.match(5); - }).to.throw('Invalid method: 5'); - done(); - }); - - it('throws on missing path', function (done) { - - var server = new Hapi.Server(); - server.connection(); - expect(function () { - - server.match('get'); - }).to.throw('Invalid path: '); - done(); - }); - - it('throws on invalid path type', function (done) { - - var server = new Hapi.Server(); - server.connection(); - expect(function () { - - server.match('get', 5); - }).to.throw('Invalid path: 5'); - done(); - }); - - it('throws on invalid path prefix', function (done) { - - var server = new Hapi.Server(); - server.connection(); - expect(function () { - - server.match('get', '5'); - }).to.throw('Invalid path: 5'); - done(); - }); - - it('throws on invalid path', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/{p}', config: { handler: function (request, reply) { return reply(); } } }); - expect(function () { - - server.match('GET', '/%p'); - }).to.throw('Invalid path: /%p'); - done(); - }); - - it('throws on invalid host type', function (done) { - - var server = new Hapi.Server(); - server.connection(); - expect(function () { - - server.match('get', '/a', 5); - }).to.throw('Invalid host: 5'); - done(); - }); - }); - - describe('method()', function () { - - it('adds server method using arguments', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - var test = function (server, options, next) { - - server.method('log', function (methodNext) { return methodNext(null); }); - return next(); - }; - - test.attributes = { - name: 'test' - }; - - server.register(test, function (err) { - - expect(err).to.not.exist(); - done(); - }); - }); - - it('adds server method with plugin bind', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - var test = function (server, options, next) { - - server.bind({ x: 1 }); - server.method('log', function (methodNext) { return methodNext(null, this.x); }); - return next(); - }; - - test.attributes = { - name: 'test' - }; - - server.register(test, function (err) { - - expect(err).to.not.exist(); - server.methods.log(function (err, result) { - - expect(result).to.equal(1); - done(); - }); - }); - }); - - it('adds server method with method bind', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - var test = function (server, options, next) { - - server.method('log', function (methodNext) { return methodNext(null, this.x); }, { bind: { x: 2 } }); - return next(); - }; - - test.attributes = { - name: 'test' - }; - - server.register(test, function (err) { - - expect(err).to.not.exist(); - server.methods.log(function (err, result) { - - expect(result).to.equal(2); - done(); - }); - }); - }); - - it('adds server method with method and ext bind', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - var test = function (server, options, next) { - - server.bind({ x: 1 }); - server.method('log', function (methodNext) { return methodNext(null, this.x); }, { bind: { x: 2 } }); - return next(); - }; - - test.attributes = { - name: 'test' - }; - - server.register(test, function (err) { - - expect(err).to.not.exist(); - server.methods.log(function (err, result) { - - expect(result).to.equal(2); - done(); - }); - }); - }); - }); - - describe('path()', function () { - - it('sets local path for directory route handler', function (done) { - - var test = function (server, options, next) { - - server.path(Path.join(__dirname, '..')); - - server.route({ - method: 'GET', - path: '/handler/{file*}', - handler: { - directory: { - path: './' - } - } - }); - - return next(); - }; - - test.attributes = { - name: 'test' - }; - - var server = new Hapi.Server(); - server.connection({ routes: { files: { relativeTo: __dirname } } }); - server.register(test, function (err) { - - expect(err).to.not.exist(); - server.inject('/handler/package.json', function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - }); - - it('throws when plugin sets undefined path', function (done) { - - var test = function (server, options, next) { - - server.path(); - return next(); - }; - - test.attributes = { - name: 'test' - }; - - var server = new Hapi.Server(); - server.connection(); - expect(function () { - - server.register(test, function (err) { }); - }).to.throw('relativeTo must be a non-empty string'); - done(); - }); - }); - - describe('render()', function () { - - it('renders view', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.views({ - engines: { html: Handlebars }, - path: __dirname + '/templates' - }); - - server.render('test', { title: 'test', message: 'Hapi' }, function (err, rendered, config) { - - expect(rendered).to.exist(); - expect(rendered).to.contain('Hapi'); - done(); - }); - }); - }); - - describe('views()', function () { - - it('requires plugin with views', function (done) { - - var test = function (server, options, next) { - - server.path(__dirname); - - var views = { - engines: { 'html': Handlebars }, - path: './templates/plugin' - }; - - server.views(views); - if (Object.keys(views).length !== 2) { - return next(new Error('plugin.view() modified options')); - } - - server.route([ - { - path: '/view', method: 'GET', handler: function (request, reply) { - - return reply.view('test', { message: options.message }); - } - }, - { - path: '/file', method: 'GET', handler: { file: './templates/plugin/test.html' } - } - ]); - - server.ext('onRequest', function (request, reply) { - - if (request.path === '/ext') { - return reply.view('test', { message: 'grabbed' }); - } - - return reply.continue(); - }); - - return next(); - }; - - test.attributes = { - name: 'test' - }; - - var server = new Hapi.Server(); - server.connection(); - server.register({ register: test, options: { message: 'viewing it' } }, function (err) { - - expect(err).to.not.exist(); - server.inject('/view', function (res) { - - expect(res.result).to.equal('

viewing it

'); - - server.inject('/file', function (res) { - - expect(res.result).to.equal('

{{message}}

'); - - server.inject('/ext', function (res) { - - expect(res.result).to.equal('

grabbed

'); - done(); - }); - }); - }); - }); - }); - }); -}); - - -internals.routesList = function (server, label) { - - var tables = server.select(label || []).table(); - - var list = []; - for (var c = 0, cl = tables.length; c < cl; ++c) { - var routes = tables[c].table; - for (var i = 0, il = routes.length; i < il; ++i) { - var route = routes[i]; - if (route.method === 'get') { - list.push(route.path); - } - } - } - - return list; -}; - - -internals.plugins = { - auth: function (server, options, next) { - - server.auth.scheme('basic', function (server, options) { - - var settings = Hoek.clone(options); - - var scheme = { - authenticate: function (request, reply) { - - var req = request.raw.req; - var authorization = req.headers.authorization; - if (!authorization) { - return reply(Boom.unauthorized(null, 'Basic')); - } - - var parts = authorization.split(/\s+/); - - if (parts[0] && - parts[0].toLowerCase() !== 'basic') { - - return reply(Boom.unauthorized(null, 'Basic')); - } - - if (parts.length !== 2) { - return reply(Boom.badRequest('Bad HTTP authentication header format', 'Basic')); - } - - var credentialsParts = new Buffer(parts[1], 'base64').toString().split(':'); - if (credentialsParts.length !== 2) { - return reply(Boom.badRequest('Bad header internal syntax', 'Basic')); - } - - var username = credentialsParts[0]; - var password = credentialsParts[1]; - - settings.validateFunc(username, password, function (err, isValid, credentials) { - - if (!isValid) { - return reply(Boom.unauthorized('Bad username or password', 'Basic'), { credentials: credentials }); - } - - return reply.continue({ credentials: credentials }); - }); - } - }; - - return scheme; - }); - - var loadUser = function (username, password, callback) { - - if (username === 'john') { - return callback(null, password === '12345', { user: 'john' }); - } - - return callback(null, false); - }; - - server.auth.strategy('basic', 'basic', 'required', { validateFunc: loadUser }); - - server.auth.scheme('special', function () { return { authenticate: function () { } }; }); - server.auth.strategy('special', 'special', {}); - - return next(); - }, - child: function (server, options, next) { - - if (options.routes) { - return server.register(internals.plugins.test1, options, next); - } - - return server.register(internals.plugins.test1, next); - }, - deps1: function (server, options, next) { - - server.dependency('deps2', function (server, next) { - - server.expose('breaking', server.plugins.deps2.breaking); - return next(); - }); - - server.select('a').ext('onRequest', function (request, reply) { - - request.app.deps = request.app.deps || '|'; - request.app.deps += '1|'; - return reply.continue(); - }, { after: 'deps3' }); - - return next(); - }, - deps2: function (server, options, next) { - - server.select('b').ext('onRequest', function (request, reply) { - - request.app.deps = request.app.deps || '|'; - request.app.deps += '2|'; - return reply.continue(); - }, { after: 'deps3', before: 'deps1' }); - - server.expose('breaking', 'bad'); - - return next(); - }, - deps3: function (server, options, next) { - - server.select('c').ext('onRequest', function (request, reply) { - - request.app.deps = request.app.deps || '|'; - request.app.deps += '3|'; - return reply.continue(); - }); - - return next(); - }, - test1: function (server, options, next) { - - var handler = function (request, reply) { - - return reply('testing123' + ((server.settings.app && server.settings.app.my) || '')); - }; - - server.select('test').route({ path: '/test1', method: 'GET', handler: handler }); - - server.expose({ - add: function (a, b) { - - return a + b; - } - }); - - server.expose('glue', function (a, b) { - - return a + b; - }); - - server.expose('prefix', server.realm.modifiers.route.prefix); - - return next(); - }, - test2: function (server, options, next) { - - server.route({ path: '/test2', method: 'GET', handler: function (request, reply) { return reply('testing123'); } }); - server.log('test', 'abc'); - return next(); - } -}; - - -internals.plugins.auth.attributes = { - name: 'auth' -}; - - -internals.plugins.child.attributes = { - name: 'child' -}; - - -internals.plugins.deps1.attributes = { - name: 'deps1' -}; - - -internals.plugins.deps2.attributes = { - name: 'deps2' -}; - - -internals.plugins.deps3.attributes = { - name: 'deps3' -}; - - -internals.plugins.test1.attributes = { - name: 'test1', - version: '1.0.0' -}; - - -internals.plugins.test2.attributes = { - pkg: { - name: 'test2', - version: '1.0.0' - } -}; diff --git a/node_modules/hapi/test/protect.js b/node_modules/hapi/test/protect.js deleted file mode 100755 index 567e5e8..0000000 --- a/node_modules/hapi/test/protect.js +++ /dev/null @@ -1,156 +0,0 @@ -// Load modules - -var Events = require('events'); -var Code = require('code'); -var Hapi = require('..'); -var Hoek = require('hoek'); -var Lab = require('lab'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var describe = lab.describe; -var it = lab.it; -var expect = Code.expect; - - -describe('Protect', function () { - - it('catches error when handler throws after reply() is called', function (done) { - - var server = new Hapi.Server({ debug: false }); - server.connection(); - - var handler = function (request, reply) { - - reply('ok'); - process.nextTick(function () { - - throw new Error('should not leave domain'); - }); - }; - - server.route({ method: 'GET', path: '/', handler: handler }); - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('catches error when handler throws twice after reply() is called', function (done) { - - var server = new Hapi.Server({ debug: false }); - server.connection(); - - var handler = function (request, reply) { - - reply('ok'); - - process.nextTick(function () { - - throw new Error('should not leave domain 1'); - }); - - process.nextTick(function () { - - throw new Error('should not leave domain 2'); - }); - }; - - server.route({ method: 'GET', path: '/', handler: handler }); - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('catches errors thrown during request handling in non-request domain', function (done) { - - var Client = function () { - - Events.EventEmitter.call(this); - }; - - Hoek.inherits(Client, Events.EventEmitter); - - var test = function (plugin, options, next) { - - plugin.after(function (plugin, afterNext) { - - var client = new Client(); // Created in the global domain - plugin.bind({ client: client }); - afterNext(); - }); - - plugin.route({ - method: 'GET', - path: '/', - handler: function (request, reply) { - - this.client.on('event', request.domain.bind(function () { - - throw new Error('boom'); // Caught by the global domain by default, not request domain - })); - - this.client.emit('event'); - } - }); - - return next(); - }; - - test.attributes = { - name: 'test' - }; - - var server = new Hapi.Server({ debug: false }); - server.connection(); - server.register(test, function (err) { - - expect(err).to.not.exist(); - - server.start(function () { - - server.inject('/', function (res) { - - done(); - }); - }); - }); - }); - - it('logs to console after request completed', function (done) { - - var handler = function (request, reply) { - - reply('ok'); - setTimeout(function () { - - throw new Error('After done'); - }, 10); - }; - - var server = new Hapi.Server({ debug: false }); - server.connection(); - - server.on('log', function (event, tags) { - - expect(tags.implementation).to.exist(); - done(); - }); - - server.route({ method: 'GET', path: '/', handler: handler }); - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - }); - }); -}); diff --git a/node_modules/hapi/test/reply.js b/node_modules/hapi/test/reply.js deleted file mode 100755 index 2c28054..0000000 --- a/node_modules/hapi/test/reply.js +++ /dev/null @@ -1,590 +0,0 @@ -// Load modules - -var Http = require('http'); -var Stream = require('stream'); -var Bluebird = require('bluebird'); -var Boom = require('boom'); -var Code = require('code'); -var Hapi = require('..'); -var Hoek = require('hoek'); -var Lab = require('lab'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var describe = lab.describe; -var it = lab.it; -var expect = Code.expect; - - -describe('Reply', function () { - - it('throws when reply called twice', function (done) { - - var server = new Hapi.Server({ debug: false }); - server.connection(); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { reply('ok'); return reply('not ok'); } }); - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(500); - done(); - }); - }); - - it('redirects from handler', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply.redirect('/elsewhere'); } }); - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(302); - expect(res.headers.location).to.equal('/elsewhere'); - done(); - }); - }); - - describe('_interface()', function () { - - it('uses reply(null, result) for result', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(null, 'steve'); } }); - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result).to.equal('steve'); - done(); - }); - }); - - it('uses reply(null, err) for err', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(null, Boom.badRequest()); } }); - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(400); - done(); - }); - }); - - it('ignores result when err provided in reply(err, result)', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(Boom.badRequest(), 'steve'); } }); - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(400); - done(); - }); - }); - }); - - describe('response()', function () { - - it('returns null', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(null, null); } }); - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result).to.equal(null); - expect(res.payload).to.equal(''); - expect(res.headers['content-type']).to.not.exist(); - done(); - }); - }); - - it('returns a buffer reply', function (done) { - - var handler = function (request, reply) { - - return reply(new Buffer('Tada1')).code(299); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', config: { handler: handler } }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(299); - expect(res.result).to.equal('Tada1'); - expect(res.headers['content-type']).to.equal('application/octet-stream'); - done(); - }); - }); - - it('returns an object response', function (done) { - - var handler = function (request, reply) { - - return reply({ a: 1, b: 2 }); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - expect(res.payload).to.equal('{\"a\":1,\"b\":2}'); - expect(res.headers['content-length']).to.equal(13); - done(); - }); - }); - - it('returns false', function (done) { - - var handler = function (request, reply) { - - return reply(false); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - expect(res.payload).to.equal('false'); - done(); - }); - }); - - it('returns an error reply', function (done) { - - var handler = function (request, reply) { - - return reply(new Error('boom')); - }; - - var server = new Hapi.Server({ debug: false }); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(500); - expect(res.result).to.exist(); - done(); - }); - }); - - it('returns an empty reply', function (done) { - - var handler = function (request, reply) { - - return reply().code(299); - }; - - var server = new Hapi.Server(); - server.connection({ routes: { cors: { credentials: true } } }); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(299); - expect(res.result).to.equal(null); - expect(res.headers['access-control-allow-credentials']).to.equal('true'); - done(); - }); - }); - - it('returns a stream reply', function (done) { - - var TestStream = function () { - - Stream.Readable.call(this); - }; - - Hoek.inherits(TestStream, Stream.Readable); - - TestStream.prototype._read = function (size) { - - if (this.isDone) { - return; - } - this.isDone = true; - - this.push('x'); - this.push('y'); - this.push(null); - }; - - var handler = function (request, reply) { - - return reply(new TestStream()).ttl(2000); - }; - - var server = new Hapi.Server(); - server.connection({ routes: { cors: { origin: ['test.example.com'] } } }); - server.route({ method: 'GET', path: '/stream', config: { handler: handler, cache: { expiresIn: 9999 } } }); - - server.inject('/stream', function (res) { - - expect(res.result).to.equal('xy'); - expect(res.statusCode).to.equal(200); - expect(res.headers['cache-control']).to.equal('max-age=2, must-revalidate'); - expect(res.headers['access-control-allow-origin']).to.equal('test.example.com'); - - server.inject({ method: 'HEAD', url: '/stream' }, function (res) { - - expect(res.result).to.equal(''); - expect(res.statusCode).to.equal(200); - expect(res.headers['cache-control']).to.equal('max-age=2, must-revalidate'); - expect(res.headers['access-control-allow-origin']).to.equal('test.example.com'); - done(); - }); - }); - }); - - it('errors on non-readable stream reply', function (done) { - - var streamHandler = function (request, reply) { - - var stream = new Stream(); - stream.writable = true; - - reply(stream); - }; - - var writableHandler = function (request, reply) { - - var writable = new Stream.Writable(); - writable._write = function () {}; - - reply(writable); - }; - - var server = new Hapi.Server({ debug: false }); - server.connection(); - server.route({ method: 'GET', path: '/stream', handler: streamHandler }); - server.route({ method: 'GET', path: '/writable', handler: writableHandler }); - - var requestError; - server.on('request-error', function (request, err) { - - requestError = err; - }); - - server.start(function () { - - server.inject('/stream', function (res) { - - expect(res.statusCode).to.equal(500); - expect(requestError).to.exist(); - expect(requestError.message).to.equal('Stream must have a streams2 readable interface'); - - requestError = undefined; - server.inject('/writable', function (res) { - - expect(res.statusCode).to.equal(500); - expect(requestError).to.exist(); - expect(requestError.message).to.equal('Stream must have a streams2 readable interface'); - done(); - }); - }); - }); - }); - - it('errors on an http client stream reply', function (done) { - - var handler = function (request, reply) { - - reply('just a string'); - }; - - var streamHandler = function (request, reply) { - - reply(Http.get(request.server.info + '/')); - }; - - var server = new Hapi.Server({ debug: false }); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - server.route({ method: 'GET', path: '/stream', handler: streamHandler }); - - server.start(function () { - - server.inject('/stream', function (res) { - - expect(res.statusCode).to.equal(500); - done(); - }); - }); - }); - - it('errors on objectMode stream reply', function (done) { - - var TestStream = function () { - - Stream.Readable.call(this, { objectMode: true }); - }; - - Hoek.inherits(TestStream, Stream.Readable); - - TestStream.prototype._read = function (size) { - - if (this.isDone) { - return; - } - this.isDone = true; - - this.push({ x: 1 }); - this.push({ y: 1 }); - this.push(null); - }; - - var handler = function (request, reply) { - - return reply(new TestStream()); - }; - - var server = new Hapi.Server({ debug: false }); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(500); - done(); - }); - }); - - describe('promises', function () { - - it('returns a stream', function (done) { - - var TestStream = function () { - - Stream.Readable.call(this); - - this.statusCode = 200; - }; - - Hoek.inherits(TestStream, Stream.Readable); - - TestStream.prototype._read = function (size) { - - if (this.isDone) { - return; - } - this.isDone = true; - - this.push('x'); - this.push('y'); - this.push(null); - }; - - var handler = function (request, reply) { - - return reply(Bluebird.resolve(new TestStream())).ttl(2000).code(299); - }; - - var server = new Hapi.Server({ debug: false }); - server.connection({ routes: { cors: { origin: ['test.example.com'] } } }); - server.route({ method: 'GET', path: '/stream', config: { handler: handler, cache: { expiresIn: 9999 } } }); - - server.inject('/stream', function (res) { - - expect(res.result).to.equal('xy'); - expect(res.statusCode).to.equal(299); - expect(res.headers['cache-control']).to.equal('max-age=2, must-revalidate'); - expect(res.headers['access-control-allow-origin']).to.equal('test.example.com'); - done(); - }); - }); - - it('returns a buffer', function (done) { - - var handler = function (request, reply) { - - return reply(Bluebird.resolve(new Buffer('buffer content'))).code(299).type('something/special'); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(299); - expect(res.result.toString()).to.equal('buffer content'); - expect(res.headers['content-type']).to.equal('something/special'); - done(); - }); - }); - }); - }); - - describe('hold()', function () { - - it('undo scheduled next tick in reply interface', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - var handler = function (request, reply) { - - return reply('123').hold().send(); - }; - - server.route({ method: 'GET', path: '/domain', handler: handler }); - - server.inject('/domain', function (res) { - - expect(res.result).to.equal('123'); - done(); - }); - }); - - it('sends reply after timed handler', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - var handler = function (request, reply) { - - var response = reply('123').hold(); - setTimeout(function () { - response.send(); - }, 10); - }; - - server.route({ method: 'GET', path: '/domain', handler: handler }); - - server.inject('/domain', function (res) { - - expect(res.result).to.equal('123'); - done(); - }); - }); - }); - - describe('close()', function () { - - it('returns a reply with manual end', function (done) { - - var handler = function (request, reply) { - - request.raw.res.end(); - return reply.close({ end: false }); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', config: { handler: handler } }); - - server.inject('/', function (res) { - - expect(res.result).to.equal(''); - done(); - }); - }); - - it('returns a reply with auto end', function (done) { - - var handler = function (request, reply) { - - return reply.close(); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', config: { handler: handler } }); - - server.inject('/', function (res) { - - expect(res.result).to.equal(''); - done(); - }); - }); - }); - - describe('continue()', function () { - - it('sets empty reply on continue in handler', function (done) { - - var handler = function (request, reply) { - - return reply.continue(); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', config: { handler: handler } }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result).to.equal(null); - expect(res.payload).to.equal(''); - done(); - }); - }); - - it('sets empty reply on continue in prerequisite', function (done) { - - var pre1 = function (request, reply) { - - return reply.continue(); - }; - - var pre2 = function (request, reply) { - - return reply.continue(); - }; - - var pre3 = function (request, reply) { - - return reply({ - m1: request.pre.m1, - m2: request.pre.m2 - }); - }; - - var handler = function (request, reply) { - return reply(request.pre.m3); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ - method: 'GET', - path: '/', - config: { - pre: [ - { method: pre1, assign: 'm1' }, - { method: pre2, assign: 'm2' }, - { method: pre3, assign: 'm3' } - ], - handler: handler - } - }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result).to.deep.equal({ - m1: null, - m2: null - }); - expect(res.payload).to.equal('{"m1":null,"m2":null}'); - done(); - }); - }); - }); -}); diff --git a/node_modules/hapi/test/request.js b/node_modules/hapi/test/request.js deleted file mode 100755 index 27b0776..0000000 --- a/node_modules/hapi/test/request.js +++ /dev/null @@ -1,1368 +0,0 @@ -// Load modules - -var Http = require('http'); -var Net = require('net'); -var Stream = require('stream'); -var Boom = require('boom'); -var Code = require('code'); -var Hapi = require('..'); -var Hoek = require('hoek'); -var Lab = require('lab'); -var Wreck = require('wreck'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var describe = lab.describe; -var it = lab.it; -var expect = Code.expect; - - -describe('Request', function () { - - it('sets client address', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - var handler = function (request, reply) { - - var expectedClientAddress = '127.0.0.1'; - if (Net.isIPv6(server.listener.address().address)) { - expectedClientAddress = '::ffff:127.0.0.1'; - } - - expect(request.info.remoteAddress).to.equal(expectedClientAddress); - expect(request.info.remoteAddress).to.equal(request.info.remoteAddress); - return reply('ok'); - }; - - server.route({ method: 'GET', path: '/', handler: handler }); - - server.start(function () { - - Wreck.get('http://localhost:' + server.info.port, function (err, res, body) { - - expect(body).to.equal('ok'); - done(); - }); - }); - }); - - it('sets referrer', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - var handler = function (request, reply) { - - expect(request.info.referrer).to.equal('http://site.com'); - return reply('ok'); - }; - - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject({ url: '/', headers: { referrer: 'http://site.com' } }, function (res) { - - expect(res.result).to.equal('ok'); - done(); - }); - }); - - it('sets referer', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - var handler = function (request, reply) { - - expect(request.info.referrer).to.equal('http://site.com'); - return reply('ok'); - }; - - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject({ url: '/', headers: { referer: 'http://site.com' } }, function (res) { - - expect(res.result).to.equal('ok'); - done(); - }); - }); - - it('sets headers', function (done) { - - var handler = function (request, reply) { - - return reply(request.headers['user-agent']); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - expect(res.payload).to.equal('shot'); - done(); - }); - }); - - it('generates unique request id', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.connections[0]._requestCounter = { value: 10, min: 10, max: 11 }; - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(request.id); } }); - server.inject('/', function (res1) { - - server.inject('/', function (res2) { - - server.inject('/', function (res3) { - - expect(res1.result).to.match(/10$/); - expect(res2.result).to.match(/11$/); - expect(res3.result).to.match(/10$/); - done(); - }); - }); - }); - }); - - describe('_execute()', function () { - - it('returns 400 on invalid path', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.inject('invalid', function (res) { - - expect(res.statusCode).to.equal(400); - done(); - }); - }); - - it('returns error response on ext error', function (done) { - - var handler = function (request, reply) { - - return reply('OK'); - }; - - var server = new Hapi.Server(); - server.connection(); - - var ext = function (request, reply) { - - return reply(Boom.badRequest()); - }; - - server.ext('onPostHandler', ext); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - expect(res.result.statusCode).to.equal(400); - done(); - }); - }); - - it('handles aborted requests', { parallel: false }, function (done) { - - var handler = function (request, reply) { - - var TestStream = function () { - - Stream.Readable.call(this); - }; - - Hoek.inherits(TestStream, Stream.Readable); - - TestStream.prototype._read = function (size) { - - if (this.isDone) { - return; - } - this.isDone = true; - - this.push('success'); - this.emit('data', 'success'); - }; - - var stream = new TestStream(); - return reply(stream); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.start(function () { - - var total = 2; - var createConnection = function () { - - var client = Net.connect(server.info.port, function () { - - client.write('GET / HTTP/1.1\r\n\r\n'); - client.write('GET / HTTP/1.1\r\n\r\n'); - }); - - client.on('data', function () { - - total--; - client.destroy(); - }); - }; - - var check = function () { - - if (total) { - createConnection(); - setTimeout(check, 10); - } - else { - done(); - } - }; - - check(); - }); - }); - - it('returns empty params array when none present', function (done) { - - var handler = function (request, reply) { - - return reply(request.params); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - expect(res.result).to.deep.equal({}); - done(); - }); - }); - - it('does not fail on abort', function (done) { - - var clientRequest; - - var handler = function (request, reply) { - - clientRequest.abort(); - - setTimeout(function () { - - reply(new Error('fail')); - setTimeout(done, 10); - }, 10); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.start(function () { - - clientRequest = Http.request({ - hostname: 'localhost', - port: server.info.port, - method: 'GET' - }); - - clientRequest.on('error', function () { /* NOP */ }); - clientRequest.end(); - }); - }); - - it('does not fail on abort with ext', function (done) { - - var clientRequest; - - var handler = function (request, reply) { - - clientRequest.abort(); - setTimeout(function () { - - return reply(new Error('boom')); - }, 10); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.ext('onPreResponse', function (request, reply) { - - return reply.continue(); - }); - - server.on('tail', function () { - - done(); - }); - - server.start(function () { - - clientRequest = Http.request({ - hostname: 'localhost', - port: server.info.port, - method: 'GET' - }); - - clientRequest.on('error', function () { /* NOP */ }); - clientRequest.end(); - }); - }); - }); - - describe('_finalize()', function (done) { - - it('generate response event', function (done) { - - var handler = function (request, reply) { - - return reply('ok'); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', config: { handler: handler } }); - - server.once('response', function (request) { - - expect(request.info.responded).to.be.min(request.info.received); - done(); - }); - - server.inject('/', function (res) { }); - }); - - it('closes response after server timeout', function (done) { - - var handler = function (request, reply) { - - setTimeout(function () { - - var stream = new Stream.Readable(); - stream._read = function (size) { - - this.push('value'); - this.push(null); - }; - - stream.close = function () { - - done(); - }; - - return reply(stream); - }, 10); - }; - - var server = new Hapi.Server(); - server.connection({ routes: { timeout: { server: 5 } } }); - server.route({ - method: 'GET', - path: '/', - handler: handler - }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(503); - }); - }); - - it('does not attempt to close error response after server timeout', function (done) { - - var handler = function (request, reply) { - - setTimeout(function () { - - return reply(new Error('after')); - }, 10); - }; - - var server = new Hapi.Server(); - server.connection({ routes: { timeout: { server: 5 } } }); - server.route({ - method: 'GET', - path: '/', - handler: handler - }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(503); - done(); - }); - }); - - it('emits request-error once', function (done) { - - var server = new Hapi.Server({ debug: false }); - server.connection(); - - var errs = 0; - var req = null; - server.on('request-error', function (request, err) { - - errs++; - expect(err).to.exist(); - expect(err.message).to.equal('boom2'); - req = request; - }); - - server.ext('onPreResponse', function (request, reply) { - - return reply(new Error('boom2')); - }); - - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(new Error('boom1')); } }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(500); - expect(res.result).to.exist(); - expect(res.result.message).to.equal('An internal server error occurred'); - }); - - server.once('response', function () { - - expect(errs).to.equal(1); - expect(req.getLog('error')[1].tags).to.deep.equal(['internal', 'error']); - done(); - }); - }); - - it('emits request-error on implementation error', function (done) { - - var server = new Hapi.Server({ debug: false }); - server.connection(); - - var errs = 0; - var req = null; - server.on('request-error', function (request, err) { - - errs++; - expect(err).to.exist(); - expect(err.message).to.equal('Uncaught error: boom'); - req = request; - }); - - server.route({ method: 'GET', path: '/', handler: function (request, reply) { throw new Error('boom'); } }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(500); - expect(res.result).to.exist(); - expect(res.result.message).to.equal('An internal server error occurred'); - }); - - server.once('response', function () { - - expect(errs).to.equal(1); - expect(req.getLog('error')[0].tags).to.deep.equal(['internal', 'implementation', 'error']); - done(); - }); - }); - - it('does not emit request-error when error is replaced with valid response', function (done) { - - var server = new Hapi.Server({ debug: false }); - server.connection(); - - var errs = 0; - server.on('request-error', function (request, err) { - - errs++; - }); - - server.ext('onPreResponse', function (request, reply) { - - return reply('ok'); - }); - - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(new Error('boom1')); } }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result).to.equal('ok'); - }); - - server.once('response', function () { - - expect(errs).to.equal(0); - done(); - }); - }); - }); - - describe('tail()', function () { - - it('generates tail event', function (done) { - - var handler = function (request, reply) { - - var t1 = request.addTail('t1'); - var t2 = request.addTail('t2'); - - reply('Done'); - - t1(); - t1(); // Ignored - setTimeout(t2, 10); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - var result = null; - - server.once('tail', function () { - - expect(result).to.equal('Done'); - done(); - }); - - server.inject('/', function (res) { - - result = res.result; - }); - }); - - it('generates tail event without name', function (done) { - - var handler = function (request, reply) { - - var tail = request.tail(); - reply('Done'); - tail(); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - var result = null; - - server.once('tail', function () { - - done(); - }); - - server.inject('/', function (res) { - - }); - }); - }); - - describe('setMethod()', function () { - - it('changes method with a lowercase version of the value passed in', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { } }); - - server.ext('onRequest', function (request, reply) { - - request.setMethod('POST'); - return reply(request.method); - }); - - server.inject('/', function (res) { - - expect(res.payload).to.equal('post'); - done(); - }); - }); - - it('errors on missing method', function (done) { - - var server = new Hapi.Server({ debug: false }); - server.connection(); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { } }); - - server.ext('onRequest', function (request, reply) { - - request.setMethod(); - }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(500); - done(); - }); - }); - - it('errors on invalid method type', function (done) { - - var server = new Hapi.Server({ debug: false }); - server.connection(); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { } }); - - server.ext('onRequest', function (request, reply) { - - request.setMethod(42); - }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(500); - done(); - }); - }); - }); - - describe('setUrl()', function () { - - it('parses nested query string', function (done) { - - var handler = function (request, reply) { - - return reply(request.query); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/?a[b]=5&d[ff]=ok', function (res) { - - expect(res.result).to.deep.equal({ a: { b: '5' }, d: { ff: 'ok' } }); - done(); - }); - }); - - it('sets url, path, and query', function (done) { - - var url = 'http://localhost/page?param1=something'; - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { } }); - - server.ext('onRequest', function (request, reply) { - - request.setUrl(url); - return reply([request.url.href, request.path, request.query.param1].join('|')); - }); - - server.inject('/', function (res) { - - expect(res.payload).to.equal(url + '|/page|something'); - done(); - }); - }); - - it('normalizes a path', function (done) { - - var rawPath = '/%0%1%2%3%4%5%6%7%8%9%a%b%c%d%e%f%10%11%12%13%14%15%16%17%18%19%1a%1b%1c%1d%1e%1f%20%21%22%23%24%25%26%27%28%29%2a%2b%2c%2d%2e%2f%30%31%32%33%34%35%36%37%38%39%3a%3b%3c%3d%3e%3f%40%41%42%43%44%45%46%47%48%49%4a%4b%4c%4d%4e%4f%50%51%52%53%54%55%56%57%58%59%5a%5b%5c%5d%5e%5f%60%61%62%63%64%65%66%67%68%69%6a%6b%6c%6d%6e%6f%70%71%72%73%74%75%76%77%78%79%7a%7b%7c%7d%7e%7f%80%81%82%83%84%85%86%87%88%89%8a%8b%8c%8d%8e%8f%90%91%92%93%94%95%96%97%98%99%9a%9b%9c%9d%9e%9f%a0%a1%a2%a3%a4%a5%a6%a7%a8%a9%aa%ab%ac%ad%ae%af%b0%b1%b2%b3%b4%b5%b6%b7%b8%b9%ba%bb%bc%bd%be%bf%c0%c1%c2%c3%c4%c5%c6%c7%c8%c9%ca%cb%cc%cd%ce%cf%d0%d1%d2%d3%d4%d5%d6%d7%d8%d9%da%db%dc%dd%de%df%e0%e1%e2%e3%e4%e5%e6%e7%e8%e9%ea%eb%ec%ed%ee%ef%f0%f1%f2%f3%f4%f5%f6%f7%f8%f9%fa%fb%fc%fd%fe%ff%0%1%2%3%4%5%6%7%8%9%A%B%C%D%E%F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20%21%22%23%24%25%26%27%28%29%2A%2B%2C%2D%2E%2F%30%31%32%33%34%35%36%37%38%39%3A%3B%3C%3D%3E%3F%40%41%42%43%44%45%46%47%48%49%4A%4B%4C%4D%4E%4F%50%51%52%53%54%55%56%57%58%59%5A%5B%5C%5D%5E%5F%60%61%62%63%64%65%66%67%68%69%6A%6B%6C%6D%6E%6F%70%71%72%73%74%75%76%77%78%79%7A%7B%7C%7D%7E%7F%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF'; - var normPath = '/%0%1%2%3%4%5%6%7%8%9%a%b%c%d%e%f%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20!%22%23$%25&\'()*+,-.%2F0123456789:;%3C=%3E%3F@ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~%7F%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF%0%1%2%3%4%5%6%7%8%9%A%B%C%D%E%F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20!%22%23$%25&\'()*+,-.%2F0123456789:;%3C=%3E%3F@ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~%7F%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF'; - - var url = 'http://localhost' + rawPath + '?param1=something'; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { } }); - - server.ext('onRequest', function (request, reply) { - - request.setUrl(url); - return reply([request.url.href, request.path, request.query.param1].join('|')); - }); - - server.inject('/', function (res) { - - expect(res.payload).to.equal(url + '|' + normPath + '|something'); - done(); - }); - }); - - it('allows missing path', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.ext('onRequest', function (request, reply) { - - request.setUrl(''); - return reply.continue(); - }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(400); - done(); - }); - }); - - it('strips trailing slash', function (done) { - - var server = new Hapi.Server(); - server.connection({ router: { stripTrailingSlash: true } }); - server.route({ method: 'GET', path: '/test', handler: function (request, reply) { return reply(); } }); - server.inject('/test/', function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('does not strip trailing slash on /', function (done) { - - var server = new Hapi.Server(); - server.connection({ router: { stripTrailingSlash: true } }); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(); } }); - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('strips trailing slash with query', function (done) { - - var server = new Hapi.Server(); - server.connection({ router: { stripTrailingSlash: true } }); - server.route({ method: 'GET', path: '/test', handler: function (request, reply) { return reply(); } }); - server.inject('/test/?a=b', function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - }); - - describe('log()', { parallel: false }, function () { - - it('outputs log data to debug console', function (done) { - - var handler = function (request, reply) { - - request.log(['implementation'], 'data'); - return reply(); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - var orig = console.error; - console.error = function () { - - expect(arguments[0]).to.equal('Debug:'); - expect(arguments[1]).to.equal('implementation'); - expect(arguments[2]).to.equal('\n data'); - console.error = orig; - done(); - }; - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - }); - }); - - it('emits a request event', function (done) { - - var handler = function (request, reply) { - - server.on('request', function (request, event, tags) { - - expect(event).to.contain(['request', 'timestamp', 'tags', 'data', 'internal']); - expect(event.data).to.equal('data'); - expect(event.internal).to.be.false(); - expect(tags).to.deep.equal({ test: true }); - return reply(); - }); - - request.log(['test'], 'data'); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('outputs log to debug console without data', function (done) { - - var handler = function (request, reply) { - - request.log(['implementation']); - return reply(); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - var orig = console.error; - console.error = function () { - - expect(arguments[0]).to.equal('Debug:'); - expect(arguments[1]).to.equal('implementation'); - expect(arguments[2]).to.equal(''); - console.error = orig; - done(); - }; - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - }); - }); - - it('outputs log to debug console with error data', function (done) { - - var handler = function (request, reply) { - - request.log(['implementation'], new Error('boom')); - return reply(); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - var orig = console.error; - console.error = function () { - - expect(arguments[0]).to.equal('Debug:'); - expect(arguments[1]).to.equal('implementation'); - expect(arguments[2]).to.contain('Error: boom'); - console.error = orig; - done(); - }; - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - }); - }); - - it('handles invalid log data object stringify', function (done) { - - var handler = function (request, reply) { - - var obj = {}; - obj.a = obj; - - request.log(['implementation'], obj); - return reply(); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - var orig = console.error; - console.error = function () { - - console.error = orig; - expect(arguments[0]).to.equal('Debug:'); - expect(arguments[1]).to.equal('implementation'); - expect(arguments[2]).to.equal('\n [Cannot display object: Converting circular structure to JSON]'); - done(); - }; - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - }); - }); - - it('adds a log event to the request', function (done) { - - var handler = function (request, reply) { - - request.log('1', 'log event 1', Date.now()); - request.log(['2'], 'log event 2', new Date(Date.now())); - request.log(['3', '4']); - request.log(['1', '4']); - request.log(['2', '3']); - request.log(['4']); - request.log('4'); - - return reply([request.getLog('1').length, request.getLog('4').length, request.getLog(['4']).length, request.getLog('0').length, request.getLog(['1', '2', '3', '4']).length, request.getLog().length >= 7].join('|')); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - expect(res.payload).to.equal('2|4|4|0|7|true'); - done(); - }); - }); - - it('does not output events when debug disabled', function (done) { - - var server = new Hapi.Server({ debug: false }); - server.connection(); - - var i = 0; - var orig = console.error; - console.error = function () { - - ++i; - }; - - var handler = function (request, reply) { - - request.log(['implementation']); - return reply(); - }; - - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - console.error('nothing'); - expect(i).to.equal(1); - console.error = orig; - done(); - }); - }); - - it('does not output events when debug.request disabled', function (done) { - - var server = new Hapi.Server({ debug: { request: false } }); - server.connection(); - - var i = 0; - var orig = console.error; - console.error = function () { - - ++i; - }; - - var handler = function (request, reply) { - - request.log(['implementation']); - return reply(); - }; - - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - console.error('nothing'); - expect(i).to.equal(1); - console.error = orig; - done(); - }); - }); - - it('does not output non-implementation events by default', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - var i = 0; - var orig = console.error; - console.error = function () { - - ++i; - }; - - var handler = function (request, reply) { - - request.log(['xyz']); - return reply(); - }; - - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - console.error('nothing'); - expect(i).to.equal(1); - console.error = orig; - done(); - }); - }); - }); - - describe('_log()', { parallel: false }, function () { - - it('emits a request-internal event', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.once('request-internal', function (request, event, tags) { - - expect(tags.received).to.be.true(); - done(); - }); - - server.inject('/', function (res) { }); - }); - }); - - describe('getLog()', function () { - - it('returns the selected logs', function (done) { - - var handler = function (request, reply) { - - request._log('1'); - request.log('1'); - - return reply([request.getLog('1').length, request.getLog('1', true).length, request.getLog('1', false).length, request.getLog(true).length, request.getLog(false).length, request.getLog().length].join('|')); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - expect(res.payload).to.equal('2|1|1|2|1|3'); - done(); - }); - }); - }); - - describe('_setResponse()', function () { - - it('leaves the response open when the same response is set again', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.ext('onPostHandler', function (request, reply) { - - return reply(request.response); - }); - - var handler = function (request, reply) { - - var stream = new Stream.Readable(); - stream._read = function (size) { - - this.push('value'); - this.push(null); - }; - - return reply(stream); - }; - - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - expect(res.result).to.equal('value'); - done(); - }); - }); - - it('leaves the response open when the same response source is set again', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.ext('onPostHandler', function (request, reply) { - - return reply(request.response.source); - }); - - var handler = function (request, reply) { - - var stream = new Stream.Readable(); - stream._read = function (size) { - - this.push('value'); - this.push(null); - }; - - return reply(stream); - }; - - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - expect(res.result).to.equal('value'); - done(); - }); - }); - }); - - describe('timeout', { parallel: false }, function () { - - it('returns server error message when server taking too long', function (done) { - - var timeoutHandler = function (request, reply) { }; - - var server = new Hapi.Server(); - server.connection({ routes: { timeout: { server: 50 } } }); - server.route({ method: 'GET', path: '/timeout', config: { handler: timeoutHandler } }); - - var timer = new Hoek.Bench(); - - server.inject('/timeout', function (res) { - - expect(res.statusCode).to.equal(503); - expect(timer.elapsed()).to.be.at.least(45); - done(); - }); - }); - - it('returns server error message when server timeout happens during request execution (and handler yields)', function (done) { - - var slowHandler = function (request, reply) { - - setTimeout(function () { - - return reply('Slow'); - }, 30); - }; - - var server = new Hapi.Server(); - server.connection({ routes: { timeout: { server: 2 } } }); - server.route({ method: 'GET', path: '/', config: { handler: slowHandler } }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(503); - done(); - }); - }); - - it('returns server error message when server timeout is short and already occurs when request executes', function (done) { - - var server = new Hapi.Server(); - server.connection({ routes: { timeout: { server: 2 } } }); - server.route({ method: 'GET', path: '/', config: { handler: function () { } } }); - server.ext('onRequest', function (request, reply) { - - setTimeout(function () { - - return reply.continue(); - }, 10); - }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(503); - done(); - }); - }); - - it('handles server handler timeout with onPreResponse ext', function (done) { - - var handler = function (request, reply) { - - setTimeout(reply, 20); - }; - - var server = new Hapi.Server(); - server.connection({ routes: { timeout: { server: 10 } } }); - server.route({ method: 'GET', path: '/', config: { handler: handler } }); - server.ext('onPreResponse', function (request, reply) { - - return reply.continue(); - }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(503); - done(); - }); - }); - - it('does not return an error response when server is slow but faster than timeout', function (done) { - - var slowHandler = function (request, reply) { - - setTimeout(function () { - - return reply('Slow'); - }, 30); - }; - - var server = new Hapi.Server(); - server.connection({ routes: { timeout: { server: 50 } } }); - server.route({ method: 'GET', path: '/slow', config: { handler: slowHandler } }); - - var timer = new Hoek.Bench(); - server.inject('/slow', function (res) { - - expect(timer.elapsed()).to.be.at.least(20); - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('does not return an error when server is responding when the timeout occurs', function (done) { - - var respondingHandler = function (request, reply) { - - var s = new Stream.PassThrough(); - reply(s); - - for (var i = 10000; i > 0; --i) { - s.write(i.toString()); - } - - setTimeout(function () { - - s.emit('end'); - }, 40); - }; - - var timer = new Hoek.Bench(); - - var server = new Hapi.Server(); - server.connection({ routes: { timeout: { server: 50 } } }); - server.route({ method: 'GET', path: '/responding', config: { handler: respondingHandler } }); - server.start(function () { - - var options = { - hostname: '127.0.0.1', - port: server.info.port, - path: '/responding', - method: 'GET' - }; - - var req = Http.request(options, function (res) { - - expect(timer.elapsed()).to.be.at.least(60); - expect(res.statusCode).to.equal(200); - done(); - }); - - req.write('\n'); - }); - }); - - it('does not return an error response when server is slower than timeout but response has started', function (done) { - - var streamHandler = function (request, reply) { - - var TestStream = function () { - - Stream.Readable.call(this); - }; - - Hoek.inherits(TestStream, Stream.Readable); - - TestStream.prototype._read = function (size) { - - var self = this; - - if (this.isDone) { - return; - } - this.isDone = true; - - setTimeout(function () { - - self.push('Hello'); - }, 30); - - setTimeout(function () { - - self.push(null); - }, 60); - }; - - return reply(new TestStream()); - }; - - var server = new Hapi.Server(); - server.connection({ routes: { timeout: { server: 50 } } }); - server.route({ method: 'GET', path: '/stream', config: { handler: streamHandler } }); - server.start(function () { - - var options = { - hostname: '127.0.0.1', - port: server.info.port, - path: '/stream', - method: 'GET' - }; - - var req = Http.request(options, function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - req.end(); - }); - }); - - it('does not return an error response when server takes less than timeout to respond', function (done) { - - var fastHandler = function (request, reply) { - - return reply('Fast'); - }; - - var server = new Hapi.Server(); - server.connection({ routes: { timeout: { server: 50 } } }); - server.route({ method: 'GET', path: '/fast', config: { handler: fastHandler } }); - - server.inject('/fast', function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('handles race condition between equal client and server timeouts', function (done) { - - var timeoutHandler = function (request, reply) { }; - - var server = new Hapi.Server(); - server.connection({ routes: { timeout: { server: 50 }, payload: { timeout: 50 } } }); - server.route({ method: 'POST', path: '/timeout', config: { handler: timeoutHandler } }); - - server.start(function () { - - var timer = new Hoek.Bench(); - var options = { - hostname: '127.0.0.1', - port: server.info.port, - path: '/timeout', - method: 'POST' - }; - - var req = Http.request(options, function (res) { - - expect([503, 408]).to.contain(res.statusCode); - expect(timer.elapsed()).to.be.at.least(45); - done(); - }); - - req.on('error', function (err) { - - }); - - req.write('\n'); - setTimeout(function () { - - req.end(); - }, 100); - }); - }); - }); -}); diff --git a/node_modules/hapi/test/response.js b/node_modules/hapi/test/response.js deleted file mode 100755 index 4f80e96..0000000 --- a/node_modules/hapi/test/response.js +++ /dev/null @@ -1,982 +0,0 @@ -// Load modules - -var Stream = require('stream'); -var Bluebird = require('bluebird'); -var Boom = require('boom'); -var Code = require('code'); -var Handlebars = require('handlebars'); -var Hapi = require('..'); -var Hoek = require('hoek'); -var Lab = require('lab'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var describe = lab.describe; -var it = lab.it; -var expect = Code.expect; - - -describe('Response', function () { - - it('returns a reply', function (done) { - - var handler = function (request, reply) { - - return reply('text') - .type('text/plain') - .charset('ISO-8859-1') - .ttl(1000) - .header('set-cookie', 'abc=123') - .state('sid', 'abcdefg123456') - .state('other', 'something', { isSecure: true }) - .unstate('x') - .header('Content-Type', 'text/plain; something=something') - .header('vary', 'x-control') - .header('combo', 'o') - .header('combo', 'k', { append: true, separator: '-' }) - .header('combo', 'bad', { override: false }) - .code(200); - }; - - var server = new Hapi.Server(); - server.connection({ routes: { cors: true } }); - server.route({ method: 'GET', path: '/', config: { handler: handler, cache: { expiresIn: 9999 } } }); - server.state('sid', { encoding: 'base64' }); - server.state('always', { autoValue: 'present' }); - server.ext('onPostHandler', function (request, reply) { - - reply.state('test', '123'); - reply.unstate('empty'); - return reply.continue(); - }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.result).to.exist(); - expect(res.result).to.equal('text'); - expect(res.headers['cache-control']).to.equal('max-age=1, must-revalidate, private'); - expect(res.headers['content-type']).to.equal('text/plain; something=something, charset=ISO-8859-1'); - expect(res.headers['access-control-allow-origin']).to.equal('*'); - expect(res.headers['access-control-allow-credentials']).to.not.exist(); - expect(res.headers['access-control-allow-methods']).to.equal('GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS'); - expect(res.headers['set-cookie']).to.deep.equal(['abc=123', 'sid=YWJjZGVmZzEyMzQ1Ng==', 'other=something; Secure', 'x=; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00 GMT', 'test=123', 'empty=; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00 GMT', 'always=present']); - expect(res.headers.vary).to.equal('x-control,origin'); - expect(res.headers.combo).to.equal('o-k'); - done(); - }); - }); - - describe('header()', function () { - - it('appends to set-cookie header', function (done) { - - var handler = function (request, reply) { - - return reply('ok').header('set-cookie', 'A').header('set-cookie', 'B', { append: true }); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.headers['set-cookie']).to.deep.equal(['A', 'B']); - done(); - }); - }); - }); - - describe('created()', function () { - - it('returns a stream reply (created)', function (done) { - - var handler = function (request, reply) { - - return reply({ a: 1 }).created('/special'); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'POST', path: '/', handler: handler }); - - server.inject({ method: 'POST', url: '/' }, function (res) { - - expect(res.result).to.deep.equal({ a: 1 }); - expect(res.statusCode).to.equal(201); - expect(res.headers.location).to.equal('/special'); - expect(res.headers['cache-control']).to.equal('no-cache'); - done(); - }); - }); - - it('returns error on created with GET', function (done) { - - var handler = function (request, reply) { - - return reply().created('/something'); - }; - - var server = new Hapi.Server({ debug: false }); - server.connection(); - server.route({ method: 'GET', path: '/', config: { handler: handler } }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(500); - done(); - }); - }); - }); - - describe('state()', function () { - - it('returns an error on bad cookie', function (done) { - - var handler = function (request, reply) { - - return reply('text').state(';sid', 'abcdefg123456'); - }; - - var server = new Hapi.Server({ debug: false }); - server.connection(); - server.route({ method: 'GET', path: '/', config: { handler: handler } }); - - server.inject('/', function (res) { - - expect(res.result).to.exist(); - expect(res.statusCode).to.equal(500); - expect(res.result.message).to.equal('An internal server error occurred'); - expect(res.headers['set-cookie']).to.not.exist(); - done(); - }); - }); - }); - - describe('unstate()', function () { - - it('allows options', function (done) { - - var handler = function (request, reply) { - - return reply().unstate('session', { path: '/unset', isSecure: true }); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (unset) { - - expect(unset.statusCode).to.equal(200); - expect(unset.headers['set-cookie']).to.deep.equal(['session=; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; Path=/unset']); - done(); - }); - }); - }); - - describe('vary()', function () { - - it('sets Vary header with single value', function (done) { - - var handler = function (request, reply) { - - return reply('ok').vary('x'); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - expect(res.result).to.equal('ok'); - expect(res.statusCode).to.equal(200); - expect(res.headers.vary).to.equal('x'); - done(); - }); - }); - - it('sets Vary header with multiple values', function (done) { - - var handler = function (request, reply) { - - return reply('ok').vary('x').vary('y'); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - expect(res.result).to.equal('ok'); - expect(res.statusCode).to.equal(200); - expect(res.headers.vary).to.equal('x,y'); - done(); - }); - }); - - it('sets Vary header with *', function (done) { - - var handler = function (request, reply) { - - return reply('ok').vary('*'); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - expect(res.result).to.equal('ok'); - expect(res.statusCode).to.equal(200); - expect(res.headers.vary).to.equal('*'); - done(); - }); - }); - - it('leaves Vary header with * on additional values', function (done) { - - var handler = function (request, reply) { - - return reply('ok').vary('*').vary('x'); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - expect(res.result).to.equal('ok'); - expect(res.statusCode).to.equal(200); - expect(res.headers.vary).to.equal('*'); - done(); - }); - }); - - it('drops other Vary header values when set to *', function (done) { - - var handler = function (request, reply) { - - return reply('ok').vary('x').vary('*'); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - expect(res.result).to.equal('ok'); - expect(res.statusCode).to.equal(200); - expect(res.headers.vary).to.equal('*'); - done(); - }); - }); - }); - - describe('etag()', function () { - - it('sets etag', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok').etag('abc'); } }); - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.headers.etag).to.equal('"abc"'); - done(); - }); - }); - - it('sets weak etag', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok').etag('abc', { weak: true }); } }); - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.headers.etag).to.equal('W/"abc"'); - done(); - }); - }); - - it('ignores varyEtag when etag header is removed', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { var response = reply('ok').etag('abc').vary('x'); delete response.headers.etag; } }); - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.headers.etag).to.not.exist(); - done(); - }); - }); - - it('leaves etag header when varyEtag is false', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('ok').etag('abc', { vary: false }).vary('x'); } }); - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.headers.etag).to.equal('"abc"'); - - server.inject({ url: '/', headers: { 'if-none-match': '"abc-gzip"', 'accept-encoding': 'gzip' } }, function (res) { - - expect(res.statusCode).to.equal(200); - expect(res.headers.etag).to.equal('"abc"'); - done(); - }); - }); - }); - }); - - describe('passThrough()', function () { - - it('passes stream headers and code through', function (done) { - - var TestStream = function () { - - Stream.Readable.call(this); - this.statusCode = 299; - this.headers = { xcustom: 'some value' }; - }; - - Hoek.inherits(TestStream, Stream.Readable); - - TestStream.prototype._read = function (size) { - - if (this.isDone) { - return; - } - this.isDone = true; - - this.push('x'); - this.push(null); - }; - - var handler = function (request, reply) { - - return reply(new TestStream()); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', config: { handler: handler } }); - - server.inject('/', function (res) { - - expect(res.result).to.equal('x'); - expect(res.statusCode).to.equal(299); - expect(res.headers.xcustom).to.equal('some value'); - done(); - }); - }); - - it('excludes stream headers and code when passThrough is false', function (done) { - - var TestStream = function () { - - Stream.Readable.call(this); - this.statusCode = 299; - this.headers = { xcustom: 'some value' }; - }; - - Hoek.inherits(TestStream, Stream.Readable); - - TestStream.prototype._read = function (size) { - - if (this.isDone) { - return; - } - this.isDone = true; - - this.push('x'); - this.push(null); - }; - - var handler = function (request, reply) { - - return reply(new TestStream()).passThrough(false); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', config: { handler: handler } }); - - server.inject('/', function (res) { - - expect(res.result).to.equal('x'); - expect(res.statusCode).to.equal(200); - expect(res.headers.xcustom).to.not.exist(); - done(); - }); - }); - - it('ignores stream headers when empty', function (done) { - - var TestStream = function () { - - Stream.Readable.call(this); - this.statusCode = 299; - this.headers = {}; - }; - - Hoek.inherits(TestStream, Stream.Readable); - - TestStream.prototype._read = function (size) { - - if (this.isDone) { - return; - } - this.isDone = true; - - this.push('x'); - this.push(null); - }; - - var handler = function (request, reply) { - - return reply(new TestStream()); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', config: { handler: handler } }); - - server.inject('/', function (res) { - - expect(res.result).to.equal('x'); - expect(res.statusCode).to.equal(299); - expect(res.headers.xcustom).to.not.exist(); - done(); - }); - }); - - it('retains local headers with stream headers pass-through', function (done) { - - var TestStream = function () { - - Stream.Readable.call(this); - this.headers = { xcustom: 'some value', 'set-cookie': 'a=1' }; - }; - - Hoek.inherits(TestStream, Stream.Readable); - - TestStream.prototype._read = function (size) { - - if (this.isDone) { - return; - } - this.isDone = true; - - this.push('x'); - this.push(null); - }; - - var handler = function (request, reply) { - - return reply(new TestStream()).header('xcustom', 'other value').state('b', '2'); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', config: { handler: handler } }); - - server.inject('/', function (res) { - - expect(res.result).to.equal('x'); - expect(res.headers.xcustom).to.equal('other value'); - expect(res.headers['set-cookie']).to.deep.equal(['a=1', 'b=2']); - done(); - }); - }); - }); - - describe('replacer()', function () { - - it('errors when called on wrong type', function (done) { - - var server = new Hapi.Server({ debug: false }); - server.connection(); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('x').replacer(['x']); } }); - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(500); - done(); - }); - }); - }); - - describe('spaces()', function () { - - it('errors when called on wrong type', function (done) { - - var server = new Hapi.Server({ debug: false }); - server.connection(); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('x').spaces(2); } }); - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(500); - done(); - }); - }); - }); - - describe('suffix()', function () { - - it('errors when called on wrong type', function (done) { - - var server = new Hapi.Server({ debug: false }); - server.connection(); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('x').suffix('x'); } }); - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(500); - done(); - }); - }); - }); - - describe('type()', function () { - - it('returns a file in the response with the correct headers using custom mime type', function (done) { - - var server = new Hapi.Server(); - server.connection({ routes: { files: { relativeTo: __dirname } } }); - var handler = function (request, reply) { - - return reply.file('../Makefile').type('application/example'); - }; - - server.route({ method: 'GET', path: '/file', handler: handler }); - - server.inject('/file', function (res) { - - expect(res.headers['content-type']).to.equal('application/example'); - done(); - }); - }); - }); - - describe('redirect()', function () { - - it('returns a redirection reply', function (done) { - - var handler = function (request, reply) { - - return reply('Please wait while we send your elsewhere').redirect('/example'); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', config: { handler: handler } }); - - server.inject('http://example.org/', function (res) { - - expect(res.result).to.exist(); - expect(res.headers.location).to.equal('/example'); - expect(res.statusCode).to.equal(302); - done(); - }); - }); - - it('returns a redirection reply using verbose call', function (done) { - - var handler = function (request, reply) { - - return reply('We moved!').redirect().location('/examplex'); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', config: { handler: handler } }); - - server.inject('/', function (res) { - - expect(res.result).to.exist(); - expect(res.result).to.equal('We moved!'); - expect(res.headers.location).to.equal('/examplex'); - expect(res.statusCode).to.equal(302); - done(); - }); - }); - - it('returns a 301 redirection reply', function (done) { - - var handler = function (request, reply) { - - return reply().redirect('example').permanent().rewritable(); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', config: { handler: handler } }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(301); - done(); - }); - }); - - it('returns a 302 redirection reply', function (done) { - - var handler = function (request, reply) { - - return reply().redirect('example').temporary().rewritable(); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', config: { handler: handler } }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(302); - done(); - }); - }); - - it('returns a 307 redirection reply', function (done) { - - var handler = function (request, reply) { - - return reply().redirect('example').temporary().rewritable(false); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', config: { handler: handler } }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(307); - done(); - }); - }); - - it('returns a 308 redirection reply', function (done) { - - var handler = function (request, reply) { - - return reply().redirect('example').permanent().rewritable(false); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', config: { handler: handler } }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(308); - done(); - }); - }); - - it('returns a 301 redirection reply (reveresed methods)', function (done) { - - var handler = function (request, reply) { - - return reply().redirect('example').rewritable().permanent(); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', config: { handler: handler } }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(301); - done(); - }); - }); - - it('returns a 302 redirection reply (reveresed methods)', function (done) { - - var handler = function (request, reply) { - - return reply().redirect('example').rewritable().temporary(); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', config: { handler: handler } }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(302); - done(); - }); - }); - - it('returns a 307 redirection reply (reveresed methods)', function (done) { - - var handler = function (request, reply) { - - return reply().redirect('example').rewritable(false).temporary(); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', config: { handler: handler } }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(307); - done(); - }); - }); - - it('returns a 308 redirection reply (reveresed methods)', function (done) { - - var handler = function (request, reply) { - - return reply().redirect('example').rewritable(false).permanent(); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', config: { handler: handler } }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(308); - done(); - }); - }); - - it('returns a 302 redirection reply (flip flop)', function (done) { - - var handler = function (request, reply) { - - return reply().redirect('example').permanent().temporary(); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', config: { handler: handler } }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(302); - done(); - }); - }); - }); - - describe('_prepare()', function () { - - it('handles promises that resolve', function (done) { - - var handler = function (request, reply) { - - return reply(Bluebird.resolve('promised response')).code(201); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - expect(res.result).to.equal('promised response'); - expect(res.statusCode).to.equal(201); - done(); - }); - }); - - it('handles promises that resolve (object)', function (done) { - - var handler = function (request, reply) { - - return reply(Bluebird.resolve({ status: 'ok' })).code(201); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - expect(res.result.status).to.equal('ok'); - expect(res.statusCode).to.equal(201); - done(); - }); - }); - - it('handles promises that reject', function (done) { - - var handler = function (request, reply) { - - var promise = Bluebird.reject(Boom.forbidden('this is not allowed!')); - promise.catch(Hoek.ignore); - - return reply(promise).code(299); // Code ignored - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - expect(res.result.message).to.equal('this is not allowed!'); - expect(res.statusCode).to.equal(403); - done(); - }); - }); - }); - - describe('_marshal()', function () { - - it('emits request-error when view file for handler not found', function (done) { - - var server = new Hapi.Server({ debug: false }); - server.connection(); - - server.views({ - engines: { 'html': Handlebars }, - path: __dirname - }); - - server.once('request-error', function (request, err) { - - expect(err).to.exist(); - expect(err.message).to.contain('View file not found'); - done(); - }); - - server.route({ method: 'GET', path: '/{param}', handler: { view: 'noview' } }); - - server.inject('/hello', function (res) { - - expect(res.statusCode).to.equal(500); - expect(res.result).to.exist(); - expect(res.result.message).to.equal('An internal server error occurred'); - }); - }); - }); - - describe('_streamify()', function () { - - it('returns a formatted response', function (done) { - - var handler = function (request, reply) { - - return reply({ a: 1, b: 2 }); - }; - - var server = new Hapi.Server(); - server.connection({ routes: { json: { replacer: ['a'], space: 4, suffix: '\n' } } }); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - expect(res.payload).to.equal('{\n \"a\": 1\n}\n'); - done(); - }); - }); - - it('returns a response with options', function (done) { - - var handler = function (request, reply) { - - return reply({ a: 1, b: 2 }).type('application/x-test').spaces(2).replacer(['a']).suffix('\n'); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - expect(res.payload).to.equal('{\n \"a\": 1\n}\n'); - expect(res.headers['content-type']).to.equal('application/x-test'); - done(); - }); - }); - - it('returns a response with options (different order)', function (done) { - - var handler = function (request, reply) { - - return reply({ a: 1, b: 2 }).type('application/x-test').replacer(['a']).suffix('\n').spaces(2); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - expect(res.payload).to.equal('{\n \"a\": 1\n}\n'); - expect(res.headers['content-type']).to.equal('application/x-test'); - done(); - }); - }); - - it('captures object which cannot be stringify', function (done) { - - var handler = function (request, reply) { - - var obj = {}; - obj.a = obj; - return reply(obj); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', handler: handler }); - - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(500); - done(); - }); - }); - }); - - describe('_close()', function () { - - it('calls custom close processor', function (done) { - - var closed = false; - var close = function (response) { - - closed = true; - }; - - var handler = function (request, reply) { - - return reply(request.generateResponse(null, { close: close })); - }; - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', config: { handler: handler } }); - - server.inject('/', function (res) { - - expect(closed).to.be.true(); - done(); - }); - }); - }); -}); diff --git a/node_modules/hapi/test/route.js b/node_modules/hapi/test/route.js deleted file mode 100755 index d4d28e2..0000000 --- a/node_modules/hapi/test/route.js +++ /dev/null @@ -1,338 +0,0 @@ -// Load modules - -var Code = require('code'); -var Hapi = require('..'); -var Joi = require('joi'); -var Lab = require('lab'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var describe = lab.describe; -var it = lab.it; -var expect = Code.expect; - - -describe('Route', function () { - - it('throws an error when a route is missing a path', function (done) { - - expect(function () { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', handler: function () { } }); - }).to.throw('Route missing path'); - done(); - }); - - it('throws an error when a route is made without a connection', function (done) { - - expect(function () { - - var server = new Hapi.Server(); - server.route({ method: 'GET', path: '/dork', handler: function () { } }); - }).to.throw('Cannot add a route without any connections'); - done(); - }); - - it('throws an error when a route is missing a method', function (done) { - - expect(function () { - - var server = new Hapi.Server(); - server.connection(); - server.route({ path: '/', handler: function () { } }); - }).to.throw(/"method" is required/); - done(); - }); - - it('throws an error when a route has a malformed method name', function (done) { - - expect(function () { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: '"GET"', path: '/', handler: function () { } }); - }).to.throw(/Invalid method name/); - done(); - }); - - it('throws an error when a route uses the HEAD method', function (done) { - - expect(function () { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'HEAD', path: '/', handler: function () { } }); - }).to.throw(/Method name not allowed/); - done(); - }); - - it('throws an error when a route is missing a handler', function (done) { - - expect(function () { - - var server = new Hapi.Server(); - server.connection(); - server.route({ path: '/test', method: 'put' }); - }).to.throw('Missing or undefined handler: put /test'); - done(); - }); - - it('throws when handler is missing in config', function (done) { - - var server = new Hapi.Server(); - server.connection(); - expect(function () { - server.route({ method: 'GET', path: '/', config: {} }); - }).to.throw('Missing or undefined handler: GET /'); - done(); - }); - - it('throws when path has trailing slash and server set to strip', function (done) { - - var server = new Hapi.Server(); - server.connection({ router: { stripTrailingSlash: true } }); - expect(function () { - - server.route({ method: 'GET', path: '/test/', handler: function () { } }); - }).to.throw('Path cannot end with a trailing slash when connection configured to strip: GET /test/'); - done(); - }); - - it('allows / when path has trailing slash and server set to strip', function (done) { - - var server = new Hapi.Server(); - server.connection({ router: { stripTrailingSlash: true } }); - expect(function () { - - server.route({ method: 'GET', path: '/', handler: function () { } }); - }).to.not.throw(); - done(); - }); - - it('sets route plugins and app settings', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/', config: { handler: function (request, reply) { return reply(request.route.settings.app.x + request.route.settings.plugins.x.y); }, app: { x: 'o' }, plugins: { x: { y: 'k' } } } }); - server.inject('/', function (res) { - - expect(res.result).to.equal('ok'); - done(); - }); - }); - - it('throws when validation is set without payload parsing', function (done) { - - var server = new Hapi.Server(); - server.connection(); - expect(function () { - - server.route({ method: 'POST', path: '/', handler: function () { }, config: { validate: { payload: {} }, payload: { parse: false } } }); - }).to.throw('Route payload must be set to \'parse\' when payload validation enabled: POST /'); - done(); - }); - - it('throws when validation is set on GET', function (done) { - - var server = new Hapi.Server(); - server.connection(); - expect(function () { - - server.route({ method: 'GET', path: '/', handler: function () { }, config: { validate: { payload: {} } } }); - }).to.throw('Cannot validate HEAD or GET requests: /'); - done(); - }); - - it('throws when payload parsing is set on GET', function (done) { - - var server = new Hapi.Server(); - server.connection(); - expect(function () { - - server.route({ method: 'GET', path: '/', handler: function () { }, config: { payload: { parse: true } } }); - }).to.throw('Cannot set payload settings on HEAD or GET request: /'); - done(); - }); - - it('ignores validation on * route when request is GET', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: '*', path: '/', handler: function (request, reply) { return reply(); }, config: { validate: { payload: { a: Joi.required() } } } }); - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('ignores default validation on GET', function (done) { - - var server = new Hapi.Server(); - server.connection({ routes: { validate: { payload: { a: Joi.required() } } } }); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(); } }); - server.inject('/', function (res) { - - expect(res.statusCode).to.equal(200); - done(); - }); - }); - - it('shallow copies route config bind', function (done) { - - var server = new Hapi.Server(); - server.connection(); - var context = { key: 'is ' }; - - var count = 0; - Object.defineProperty(context, 'test', { - enumerable: true, - configurable: true, - get: function () { - - ++count; - } - }); - - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(this.key + (this === context)); }, config: { bind: context } }); - server.inject('/', function (res) { - - expect(res.result).to.equal('is true'); - expect(count).to.equal(0); - done(); - }); - }); - - it('shallow copies route config bind (server.bind())', function (done) { - - var server = new Hapi.Server(); - server.connection(); - var context = { key: 'is ' }; - - var count = 0; - Object.defineProperty(context, 'test', { - enumerable: true, - configurable: true, - get: function () { - - ++count; - } - }); - - server.bind(context); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(this.key + (this === context)); } }); - server.inject('/', function (res) { - - expect(res.result).to.equal('is true'); - expect(count).to.equal(0); - done(); - }); - }); - - it('shallow copies route config bind (connection defaults)', function (done) { - - var server = new Hapi.Server(); - var context = { key: 'is ' }; - - var count = 0; - Object.defineProperty(context, 'test', { - enumerable: true, - configurable: true, - get: function () { - - ++count; - } - }); - - server.connection({ routes: { bind: context } }); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply('' + this.key + (this === context)); } }); - server.inject('/', function (res) { - - expect(res.result).to.equal('is true'); - expect(count).to.equal(0); - done(); - }); - }); - - it('shallow copies route config bind (server defaults)', function (done) { - - var context = { key: 'is ' }; - - var count = 0; - Object.defineProperty(context, 'test', { - enumerable: true, - configurable: true, - get: function () { - - ++count; - } - }); - - var server = new Hapi.Server({ connections: { routes: { bind: context } } }); - server.connection(); - server.route({ method: 'GET', path: '/', handler: function (request, reply) { return reply(this.key + (this === context)); } }); - server.inject('/', function (res) { - - expect(res.result).to.equal('is true'); - expect(count).to.equal(0); - done(); - }); - }); - - it('overrides server relativeTo', function (done) { - - var server = new Hapi.Server(); - server.connection(); - var handler = function (request, reply) { - - return reply.file('../package.json'); - }; - - server.route({ method: 'GET', path: '/file', handler: handler, config: { files: { relativeTo: __dirname } } }); - - server.inject('/file', function (res) { - - expect(res.payload).to.contain('hapi'); - done(); - }); - }); - - it('throws when server timeout is more then socket timeout', function (done) { - - var server = new Hapi.Server(); - expect(function () { - - server.connection({ routes: { timeout: { server: 60000, socket: 12000 } } }); - }).to.throw('Server timeout must be shorter than socket timeout: /{p*}'); - done(); - }); - - it('throws when server timeout is more then socket timeout (node default)', function (done) { - - var server = new Hapi.Server(); - expect(function () { - - server.connection({ routes: { timeout: { server: 6000000 } } }); - }).to.throw('Server timeout must be shorter than socket timeout: /{p*}'); - done(); - }); - - it('ignores large server timeout when socket timeout disabled', function (done) { - - var server = new Hapi.Server(); - expect(function () { - - server.connection({ routes: { timeout: { server: 6000000, socket: false } } }); - }).to.not.throw(); - done(); - }); -}); diff --git a/node_modules/hapi/test/security.js b/node_modules/hapi/test/security.js deleted file mode 100755 index 9ce89ac..0000000 --- a/node_modules/hapi/test/security.js +++ /dev/null @@ -1,281 +0,0 @@ -// Load modules - -var Code = require('code'); -var Hapi = require('..'); -var Joi = require('joi'); -var Lab = require('lab'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var describe = lab.describe; -var it = lab.it; -var expect = Code.expect; - - -describe('security', function () { - - it('blocks response splitting through the request.create method', function (done) { - - var server = new Hapi.Server(); - server.connection(); - - var createItemHandler = function (request, reply) { - - return reply('Moved').created('/item/' + request.payload.name); - }; - - server.route({ method: 'POST', path: '/item', handler: createItemHandler }); - - server.inject({ - method: 'POST', url: '/item', - payload: '{"name": "foobar\r\nContent-Length: \r\n\r\nHTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: 19\r\n\r\nShazam"}', - headers: { 'Content-Type': 'application/json' } - }, function (res) { - - expect(res.statusCode).to.equal(400); - done(); - }); - }); - - it('blocks path traversal to files outside of hosted directory is not allowed with null byte injection', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/{path*}', handler: { directory: { path: './directory' } } }); - - server.inject('/%00/../security.js', function (res) { - - expect(res.statusCode).to.equal(403); - done(); - }); - }); - - it('blocks path traversal to files outside of hosted directory is not allowed', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/{path*}', handler: { directory: { path: './directory' } } }); - - server.inject('/../security.js', function (res) { - - expect(res.statusCode).to.equal(403); - done(); - }); - }); - - it('blocks path traversal to files outside of hosted directory is not allowed with encoded slash', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/{path*}', handler: { directory: { path: './directory' } } }); - - server.inject('/..%2Fsecurity.js', function (res) { - - expect(res.statusCode).to.equal(403); - done(); - }); - }); - - it('blocks path traversal to files outside of hosted directory is not allowed with double encoded slash', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/{path*}', handler: { directory: { path: './directory' } } }); - - server.inject('/..%252Fsecurity.js', function (res) { - - expect(res.statusCode).to.equal(403); - done(); - }); - }); - - it('blocks path traversal to files outside of hosted directory is not allowed with unicode encoded slash', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/{path*}', handler: { directory: { path: './directory' } } }); - - server.inject('/..\u2216security.js', function (res) { - - expect(res.statusCode).to.equal(403); - done(); - }); - }); - - it('blocks null byte injection when serving a file', function (done) { - - var server = new Hapi.Server(); - server.connection(); - server.route({ method: 'GET', path: '/{path*}', handler: { directory: { path: './directory' } } }); - - server.inject('/index%00.html', function (res) { - - expect(res.statusCode).to.equal(404); - done(); - }); - }); - - it('prevents xss with invalid content types', function (done) { - - var handler = function (request, reply) { - - return reply('Success'); - }; - - var server = new Hapi.Server(); - server.connection(); - server.state('encoded', { encoding: 'iron' }); - server.route({ method: 'POST', path: '/', handler: handler }); - - server.inject({ - method: 'POST', - url: '/', - payload: '{"something":"something"}', - headers: { 'content-type': ';' } - }, - function (res) { - - expect(res.result.message).to.not.contain('script'); - done(); - }); - }); - - it('prevents xss with invalid cookie values in the request', function (done) { - - var handler = function (request, reply) { - - return reply('Success'); - }; - - var server = new Hapi.Server(); - server.connection(); - server.state('encoded', { encoding: 'iron' }); - server.route({ method: 'POST', path: '/', handler: handler }); - - server.inject({ - method: 'POST', - url: '/', - payload: '{"something":"something"}', - headers: { cookie: 'encoded="";' } - }, - function (res) { - - expect(res.result.message).to.not.contain('=value;' } - }, - function (res) { - - expect(res.result.message).to.not.contain('":"other"}', - headers: { 'content-type': 'application/json' } - }, - function (res) { - - expect(res.result.message).to.not.contain('=value' - }, - function (res) { - - expect(res.result.message).to.not.contain(''); - expect(encoded).to.equal('\\x3cscript\\x3ealert\\x281\\x29\\x3c\\x2fscript\\x3e'); - done(); - }); - - it('encodes \' characters', function (done) { - - var encoded = Hoek.escapeJavaScript('something(\'param\')'); - expect(encoded).to.equal('something\\x28\\x27param\\x27\\x29'); - done(); - }); - - it('encodes large unicode characters with the correct padding', function (done) { - - var encoded = Hoek.escapeJavaScript(String.fromCharCode(500) + String.fromCharCode(1000)); - expect(encoded).to.equal('\\u0500\\u1000'); - done(); - }); - - it('doesn\'t throw an exception when passed null', function (done) { - - var encoded = Hoek.escapeJavaScript(null); - expect(encoded).to.equal(''); - done(); - }); -}); - -describe('escapeHtml()', function () { - - it('encodes / characters', function (done) { - - var encoded = Hoek.escapeHtml(''); - expect(encoded).to.equal('<script>alert(1)</script>'); - done(); - }); - - it('encodes < and > as named characters', function (done) { - - var encoded = Hoek.escapeHtml('
-
-
- - -
-
- - -
-
-
-